据我了解社区里面很多人都在用 NewRelic,最近空闲时间在折腾自制监控服务来接收 NewRelic rpm 数据,写篇短文分享一下。
首先我们需要一个服务能够处理 rpm 发出的数据,通过 rpm 的源代码,测试案例和相关资料,可以一个个 api 地逆向工程出服务器端的代码: https://github.com/quake/rpm_selfhost/blob/master/rpm_selfhost.rb
目前粗糙地实现了 3 个接口:analytic_event_data / metric_data / error_data,通过 rackup 命令来启动这个服务。
然后我们需要这个服务能接收到 rpm 上报的数据,通过查看 rpm 的源代码,有 2 种可能的实现方式: 1.修改配置文件:config/newrelic.yml,让原本发给 NewRelic 服务器的数据,直接发给自己的服务
host: localhost
port: 9292
api_host: localhost
api_port: 9292
ssl: false
这个方法的好处是实现简单,方便在测试环境调试,缺点是 NewRelic 本身无法再收到应用的数据。
2.修改配置文件:config/newrelic.yml,记录上报数据的日志:
audit_log:
enabled: true
通过日志处理脚本将日志导入: https://github.com/quake/rpm_selfhost/blob/master/log_import.rb 这个方法的好处是 NewRelic 也可以收到数据,缺点是非实时
这个服务存储用的 InfluxDB,按官方文档安装,然后创建一个名叫 collector 的数据库即可。
在数据接收完毕以后,我们可以通过 Grafana 这个工具来做展示,按官方文档安装以后,开始制作自己的 Dashboard,比如说 Throughput,我们写这样的查询:
SELECT count("duration") AS "duration" FROM "analytic_event_data" WHERE "type" = 'Transaction' and "name" !~ /^Controller\/Middleware\// AND $timeFilter GROUP BY time($interval)
然后设置相关的参数,比如说 Group by time interval >60s
再比如说请求的响应时间:
SELECT 1000 * mean("duration") FROM "analytic_event_data" WHERE $timeFilter and type = 'Transaction' and "name" !~ /^Controller\/Middleware\// GROUP BY time($interval)
这样就可以看到还不错的图表了:
以上这 2 个图表可以导入 Grafana 的 Dashboard json 文件直接看到: https://github.com/quake/rpm_selfhost/blob/master/grafana.json
目前这个项目只实现了几个最简陋的图表,还只是一个玩具,欢迎有兴趣的同学们来 fork 这个项目( https://github.com/quake/rpm_selfhost ),有几个点可以玩: (已完成)1. 实现更多的 api,比如说 connect 这个 api,需要记录上报数据的 host 信息,返回给 rpm agent 一个 agent_run_id(目前是写死 123),建立 host 和 agent_run_id mapping 关系,这样才能实现多台主机的情况下按主机来分开统计。
参考资料 https://mic-kul.com/2015/10/24/garage-made-self-hosted-newrelic-collector-using-ruby-sinatra-grafana-and-influxdb/ https://ruby-china.org/topics/23470
=================12 月 1 号更新的分割线================================== 完成了 connect api,能够支持多台主机和多个应用,进行过滤展示: