Elastic APM 应用性能监控方案
APM 的探针可以部署在代码运行时里面,可收集到更加接近应用程序的性能数据,大部分 APM sdk 还可以监控到 SQL 请求,Redis 请求,对外 HTTP 请求,模板渲染细节等数据。
概述
Elastic APM 是基于 Elastic Stack 构建的应用性能监控系统。通过 Elastic APM 可以监控应用程序,收集有关请求的响应时间、数据库查询、高速缓存调用、外部 HTTP 请求等的详细性能信息,这样可以更快地查明并修复性能问题。
Elastic APM 还会自动收集未处理的错误和异常,错误主要基于堆栈跟踪进行分组,因此可以识别出现的新错误,并密切关注特定错误发生的次数。
APM 组件
Elastic APM 包含四个组件:
APM agent
APM agent 是使用与服务相同的语言编写的开源库,可以像安装其他库一样将它们安装到服务中,agent 将检测服务的代码并在运行时收集性能数据和错误,这些数据缓冲一小段时间并发送到 APM server。
APM server
APM Server 是用 Go 编写的开源应用程序,通常运行在专用服务器上,默认监听端口 8200 ,并通过 JSON HTTP API 从 agent 接收数据,然后根据该数据创建文档并将其存储在 Elasticsearch 中。
Elasticsearch
Elasticsearch 是高可扩展的开源全文搜索和分析引擎,用于快速、近实时地存储、搜索和分析大量数据。此处用于存储 APM 性能指标并利用其聚合。
Kibana
Kibana 是开源的分析和可视化平台,旨在与 Elasticsearch 协同工作,可以通过 Kibana 搜索、查看 Elasticsearch 中存储的数据,此处用于可视化 Elasticsearch 中存储的 APM 数据。
Elastic APM 通过探针可以收集到常用类库的运行信息,目前的 Ruby elastic-apm gem 可以支持 Active Record,Sequel SQL,Redis,Mongo,NET::HTTP,tilt::Template,json 等等。
通过使用 Elastic APM,我们发现了友好速搭官网首页执行了 89 次 SQL 查询,看代码发现是前端渲染模板的时候在循环里调用了两次 SQL 请求。通过优化,整个页面现在只需要 2 个 SQL 请求,目前 99% 的 response time 在 40ms 以内。
Elastic APM 还会记录应用内的异常,可以简单使用现有的 Grafana,通过增加 Elasticsearch 数据源,可以直观看到对应服务的异常数量,Grafana 可以设置告警发到 Slack 或者 Bearychat。