据我了解社区里面很多人都在用NewRelic,最近空闲时间在折腾自制监控服务来接收NewRelic rpm数据,写篇短文分享一下。
首先我们需要一个服务能够处理rpm发出的数据,通过rpm的源代码,测试案例和相关资料,可以一个个api地逆向工程出服务器端的代码: github.com/quake/rpm_s…
目前粗糙地实现了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
通过日志处理脚本将日志导入: github.com/quake/rpm_s… 这个方法的好处是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文件直接看到: github.com/quake/rpm_s…
目前这个项目只实现了几个最简陋的图表,还只是一个玩具,欢迎有兴趣的同学们来fork这个项目 ( github.com/quake/rpm_s… ),有几个点可以玩: (已完成)1. 实现更多的api,比如说connect这个api,需要记录上报数据的host信息,返回给rpm agent一个agent_run_id(目前是写死123),建立host和agent_run_id mapping关系,这样才能实现多台主机的情况下按主机来分开统计。
- 查看rpm客户端源码,理解上报数据的逻辑关系,通过Grafana展现更多的图表
- 实现代理模式,将上报NewRelic的数据在本地同时保存一份
- 将项目gem化,数据库信息、端口信息配置化,通过一个命令即可启动服务
参考资料 mic-kul.com/2015/10/24/… ruby-china.org/topics/2347…
=================12月1号更新的分割线================================== 完成了connect api,能够支持多台主机和多个应用,进行过滤展示: