七夕小子 2019-06-27
今天收到Opbeat即将关闭的邮件。APM服务众多,Opbeat有什么优势呢?
后来Opbeat被Elastic收购了,做成了Elastic APM,过了快一年终于迎来关服,下面看看Elastic APM表现如何。
官方文档的一张图,架构上Elastic APM和ES、Kibana还是相对独立的,集成也不难。
下面用Docker部署一个用于本地开发的环境,可以快速上手而不用纠结运维和性能优化,这里用了带X-Pack的版本,因为有APM UI,不然就只有Dashboard。
启动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
,都用默认配置。
完成之后,打开Kibana,就能看到APM增加的Dashboard和APM UI。
NodeJS集成使用elastic-apm-node
包,集成代码必须加在代码的最前面:
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也是值得一试的,集成非常方便。