今天收到Opbeat即将关闭的邮件。APM服务众多,Opbeat有什么优势呢?
- 简单,UI简洁
- 可以和Git集成,方便看版本发布后性能变化
- 类似sentry的错误收集功能
后来Opbeat被Elastic收购了,做成了Elastic APM,过了快一年终于迎来关服,下面看看Elastic APM表现如何。
Docker快速部署
官方文档的一张图,架构上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集成
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也是值得一试的,集成非常方便。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。