今天收到Opbeat即將關閉的郵件。APM服務衆多,Opbeat有什麼優點呢?node
後來Opbeat被Elastic收購了,作成了Elastic APM,過了快一年終於迎來關服,下面看看Elastic APM表現如何。linux
官方文檔的一張圖,架構上Elastic APM和ES、Kibana仍是相對獨立的,集成也不難。redis
下面用Docker部署一個用於本地開發的環境,能夠快速上手而不用糾結運維和性能優化,這裏用了帶X-Pack的版本,由於有APM UI,否則就只有Dashboard。docker
啓動Elasticsearch性能優化
docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:6.2.4
啓動Kibana,注意須要經過ELASTICSEARCH_URL設置ES的URL,IP要用網卡的IP,不能用localhost、127.0.0.1,否則會被docker隔離:架構
docker run -d -e ELASTICSEARCH_URL=http://192.168.0.102:9200 -p 5601:5601 docker.elastic.co/kibana/kibana:6.2.4
最後安裝APM Server:併發
wget https://artifacts.elastic.co/downloads/apm-server/apm-server-6.2.4-linux-x86_64.tar.gz tar xf apm-server-6.2.4-linux-x86_64.tar.gz cd apm-server-6.2.4-linux-x86_64 ./apm-server setup ./apm-server -e
配置文件在apm-server.yml
,都用默認配置。app
完成以後,打開Kibana,就能看到APM增長的Dashboard和APM UI。運維
NodeJS集成使用elastic-apm-node
包,集成代碼必須加在代碼的最前面:koa
var apm = require('elastic-apm-node').start({ serviceName: 'Demo API', serverUrl: 'http://localhost:8200' })
寫了一個簡單的Koa應用看一下效果:
require('elastic-apm-node').start({ serviceName: 'Demo API', secretToken: '', serverUrl: 'http://localhost:8200' }) import Koa from 'koa'; import KoaRouter from 'koa-router'; import Redis from 'redis'; import {promisify} from 'util' let app = new Koa() let router = new KoaRouter(); let redis = Redis.createClient(); router.get("/", async (ctx, next) => { ctx.body = "OK"; }); router.get("/incr", async (ctx, next) => { let incr = promisify(redis.incr).bind(redis) let count = await incr("count") ctx.body = count; }); app.use(router.routes()); app.listen(3000);
而後直接用siege分別10併發壓測兩個接口.
APM UI裏能夠看到響應時間、每分鐘請求數
錯誤信息也有記錄:
下面是每一個路由請求的狀況:
點擊路由能看請求的詳細信息:
Redis、MySQL、外部服務請求的耗時也會被自動被記錄(這裏只有一個Redis incr命令)。
Elastic APM功能基本和Opbeat一致,只缺了Git集成。
若是你是Opbeat的用戶,又沒找到替代品,Elastic APM仍是值得一試的,畢竟幾乎一致的用戶體驗,接口可沒變化。
若是你是ELK的用戶,可是沒作APM,Elastic APM也是值得一試的,集成很是方便。