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

quakewang · November 13, 2015 · Last by qianthinking replied at December 03, 2015 · 10781 hits

据我了解社区里面很多人都在用 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,能够支持多台主机和多个应用,进行过滤展示:

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

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

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

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

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

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

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

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

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

You need to Sign in before reply, if you don't have an account, please Sign up first.