运维 自制监控服务接收 NewRelic RPM 数据

quakewang · 发布于 2015年11月13日 · 最后由 qianthinking 回复于 2015年12月03日 · 2214 次阅读
162

据我了解社区里面很多人都在用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关系,这样才能实现多台主机的情况下按主机来分开统计。

  1. 查看rpm客户端源码,理解上报数据的逻辑关系,通过Grafana展现更多的图表
  2. 实现代理模式,将上报NewRelic的数据在本地同时保存一份
  3. 将项目gem化,数据库信息、端口信息配置化,通过一个命令即可启动服务

参考资料 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,能够支持多台主机和多个应用,进行过滤展示:

共收到 10 条回复
De6df3

应该写成 Gem,调用以后直接覆盖 Newrelic 的功能自制服务区上面发

162

#1楼 @huacnlee 嗯,就是参考你的帖子,这个方案不同点在于不需要自己埋点,直接用NewRelic的rpm gem

De6df3

我之前是基于 Rails Instrument log 来埋点的,不知道 Newrelic 这个库来搞会不会有更详细的数据,比如:GC 时间

162

#4楼 @huacnlee 有的,在metric_data这个api里面,会提交一堆数据,包括GC的所有信息,CPU的使用率等等, 理论上Newrelic报表有的数据,它都会上报

130

:plus1:

1638

这个项目很有意思,哈哈。👍

756

这个思路不错,相比@huacnlee 的少了一半的工作量。楼主要不要做个开源版的new relic出来?

162

完成了connect api,能够支持多台主机和多个应用,进行过滤展示

下一步是查看newrelic rpm源代码,理解metric_data里面的数据,实现更多的图表

208

赞,如果没有版权问题,这个做出来说不定就有各种对应的host服务出来,也不一定要自己host,价格便宜点就好了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册