5.2.1 什么是 Elastic APM?

Elastic APM 是 Elastic 公司开源的一款 APM 工具,目前还处于 Beta 阶段,它有以下几个优势:

  1. 开源。我们可以免费使用,像使用 ELK 一样。
  2. 功能完善。API 比较完善,有 Agent、Transaction 和 Trace,默认创建响应时间和每分钟请求数两种图表,且可以使用 Kibana 的 Filter 过滤生成关心的数据的图表。
  3. 监控与日志统一。Elastic APM 依赖 ElasticSearch + Kibana,所以可以结合 ELK 使用,可在 Kibana 中查看监控,然后直接查询日志。

Elastic APM 架构如下:

Elastic APM - 图1

APM Agent(即在应用端引入的探针)将收集的日志发送到 APM Server(Go 写的 HTTP 服务),APM Server 将数据存储到 ElasticSearch 中,然后通过 Kibana 展示。

Kibana 展示如下:

Elastic APM - 图2

5.2.2 启动 ELK

我们使用 Docker 安装并启动 ELK,运行如下命令:

  1. $ docker run -p 5601:5601 \
  2. -p 9200:9200 \
  3. -p 5044:5044 \
  4. -it --name elk sebp/elk

5.2.3 启动 APM Server

首先,下载 APM Server 解压。然后运行以下命令:

  1. $ ./apm-server setup # 导入 APM 仪表盘到 Kibana
  2. $ ./apm-server -e # 启动 APM Server,默认监听 8200 端口

浏览器打开 localhost:5601,进入 Dashboard 页,如下所示:

Elastic APM - 图3

5.2.4 使用 Elastic APM

测试代码如下:

  1. const apm = require('elastic-apm-node').start({
  2. appName: 'test'
  3. })
  4. const Paloma = require('paloma')
  5. const app = new Paloma()
  6. app.route({ method: 'GET', path: '/', controller (ctx) {
  7. apm.setTransactionName(`${ctx.method} ${ctx._matchedRoute}`)
  8. ctx.status = 200
  9. }})
  10. app.route({ method: 'GET', path: '/:name', controller (ctx) {
  11. apm.setTransactionName(`${ctx.method} ${ctx._matchedRoute}`)
  12. ctx.status = 200
  13. }})
  14. app.listen(3000)

运行该程序,发起两个请求:

  1. $ curl localhost:3000/
  2. $ curl localhost:3000/nswbmw

等待一会,Kibana 展示如下:

Elastic APM - 图4

在 Elastic APM 中,有两个术语:

  • transaction:一组 traces 的集合,例如:一个 HTTP 请求。
  • trace:一个事件及持续时间,例如:一个 SQL 查询。

5.2.5 错误日志

现在,我们来测试下 Elastic APM 的错误收集功能。修改测试代码为:

  1. const apm = require('elastic-apm-node').start({
  2. appName: 'test'
  3. })
  4. const Paloma = require('paloma')
  5. const app = new Paloma()
  6. app.use(async (ctx, next) => {
  7. try {
  8. await next()
  9. } catch (e) {
  10. apm.captureError(e)
  11. ctx.status = 500
  12. ctx.message = e.message
  13. }
  14. })
  15. app.route({ method: 'GET', path: '/', controller: function indexRouter (ctx) {
  16. apm.setTransactionName(`${ctx.method} ${ctx._matchedRoute}`)
  17. throw new Error('error!!!')
  18. }})
  19. app.listen(3000)

重启测试程序,并发起一次请求。回到 Kibana,单击 Dashboard -> [APM] Errors 可以看到错误日志记录(自动聚合)和图表,如下所示:

Elastic APM - 图5

单击 View Error Details 进入错误详情页,如下所示:

Elastic APM - 图6

可以看出:在错误日志中展示了错误代码及行数、上下几行代码、父级函数名和所在文件等信息。

5.2.6 参考链接

上一节:5.1 NewRelic

下一节:6.1 koa-await-breakpoint