今天收到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也是值得一试的,集成很是方便。