开发工具 InfluxDB + Grafana 快速搭建自己的 NewRelic,分析应用运行情况

huacnlee · 2014年12月30日 · 最后由 dgsfor 回复于 2017年07月10日 · 85534 次阅读
本帖已被管理员设置为精华贴

NewRelic 估计很多人都用过,但是这货非常贵,贵的一般人买不起,尤其是个人项目。

可咱也要性能指标分析啊!那来自己搭建一个

你需要三个工具:

  • InfluxDB - Go 写的一个 Time series (不知道怎么翻译) 数据库,用于存储指标、事件、分析等数据;
  • Grafana - 一个纯静态的项目,用于访问 InfluxDB,自定义报表,也就是上面那个图的内容,可以自由编辑;
  • influxdb-ruby - InfluxDB 的 Ruby 客户端库,用来写数据

安装 InfluxDB

InfluxDB 安装非常简单

Mac

Homebrew 就可以安装

$ brew update
$ brew install influxdb

Ubuntu

# for 64-bit systems
wget http://s3.amazonaws.com/influxdb/influxdb_latest_amd64.deb
sudo dpkg -i influxdb_latest_amd64.deb

# for 32-bit systems
wget http://s3.amazonaws.com/influxdb/influxdb_latest_i386.deb
sudo dpkg -i influxdb_latest_i386.deb

然后启动就可以了,帐号默认 root 密码 root 你可以打开它的 Web Admin 界面:http://127.0.0.1:8083/ 并创建一个数据库 rails_app

Grafana 安装

由于 Grafana 是存静态的,你只需要下载源代码解压,将它部署在 Nginx 上面就可以了,或者可以用 Python 的 SimpleHTTPServer 来跑

$ wget http://grafanarel.s3.amazonaws.com/grafana-1.9.1.tar.gz
$ tar zxf grafana-1.9.1.tar.gz
$ cd grafana-1.9.1
$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

然后打开 http://127.0.0.1:8000 就可以看到 Grafana 的界面了,剩下的事情自己摸索。

数据埋点

gem install influxdb

或 Gemfile 加入 influxdb

Rails 项目 config/initializers/influxdb.rb

require 'influxdb'
influx_config  = YAML.load_file("#{Rails.root}/config/influxdb.yml")[Rails.env]
$influxdb = InfluxDB::Client.new("rails_app", hosts: ["127.0.0.1"], port: 8086, username: "root", password: "root")

# 关注 ActionController 的 process_action 通知,会收到所有的请求
ActiveSupport::Notifications.subscribe('process_action.action_controller') do |*args|
  event = ActiveSupport::Notifications::Event.new(*args)

  info = {
    action: "#{event.payload[:controller]}##{event.payload[:action]}", 
    runtime: event.duration,
    db_runtime: event.payload[:db_runtime],
    server: Socket.gethostname,
    status: event.payload[:status] 
  }

  $influxdb.write_point("process_action.action_controller", info)
end

然后数据就会慢慢的写入到 InfluxDB 的 rails_app 会有新表 process_action.action_controller 你可以回到 InfluxDb Admin 里面查询看看

select * from process_action.action_controller;

或者用 list series 查看所有的表

list series;

其它的选择

除了用 Grafana 来展示统计的数据外,你还可以用 facette,它也是支持 InfluxDB 的,也是一个 Go 写的 Web Server,包含 Web 界面,可以自由配置(目前看起来可用性没有 Grafana 好)。

http://facette.io


2016 更新,用了 Grafana 3.0.0

收集系统数据用 Telegraf

这果断是造福帖啊

果断收藏~

https://www.skylight.io/ 免费额度很适合小网站。

把 NewRelic 的 APM client 后端改成 InfluxDB 就强大了..

#6 楼 @hooopo NewRelic 的那个客户端代码一坨坨的,好复杂

顺便说一句,据我目前的使用来看 influxdb-ruby 这个库还有问题,我们在 Rails + Unicorn 部署的时候,async 模式没法提交数据,write_point 动作一直没写,一直到 Unicorn 重启或停止,数据才一下写进去

异步的代码在这里,https://github.com/influxdb/influxdb-ruby/blob/master/lib/influxdb/worker.rb

马上试一下

这个方案好!小巧玲珑~

14 楼 已删除

InfluxDB 有潜力,关注~

Time series => 时间序列 数学中一般这么翻译。

好东西

#17 楼 @appell 时间序列分析……

新的更新,我们没用 influxdb-ruby 来直接写性能统计数据,而是先用 Logger 写成 rpm.log,内部是 JSON 格式,然后用 Fluentd 来收集,最后再用 fluent-plugin-influxdb 写到 InfluxDB 里面。

这样一来可以尽可能的避免打点的网络请求影响正常的应用,比如耗时、超时异常等

@liudangyi 时间序列分析 => Time Series Analysis

其实你还要自己处理阈值,报警

#17 楼 @appell 数学中的话应该是时间级数

@Rei 试了下,不错

28 楼 已删除

好东西,学习,慢慢看

InfluxDB 的 cluster 还不太成熟啊,先观望下,还是继续 MongoDB 顶着吧

谢谢 lz 推荐,我采用 influxDB Fluentd(td-agent) Grafana 这个方案,自己弄着玩。rails 使用logstash-logger 格式化输出 json log。

果断收藏

好东西,谢谢楼主。

我觉得这个有做成 rack middleware 的潜力。

#36 楼 @Rei 我们在 RPM 有 1000+ 的产品上面用,InfluxDB 要挂,似乎还有挺多问题的

#36 楼 @Rei 我们的做法

config/initializes/rpm.rb

$rpm_logger = Logger.new(Rails.root.join("log/rpm.log"))
$rpm_logger.formatter = proc do |severity, datetime, progname, msg|
  msg << "\n"
  msg
end

$rpm_server_ip = Socket.gethostname

ActiveSupport::Notifications.subscribe('process_action.grape') do |*args|
  event = ActiveSupport::Notifications::Event.new(*args)

  info = {
    time: Time.now.to_i.to_s,
    server: $rpm_server_ip,
    path: event.payload[:path], 
    runtime: event.duration,
    status: event.payload[:status]
  }

  info[:db_runtime] = event.payload[:db_runtime] if event.payload[:db_runtime]

  info[:faraday_runtime] = event.payload[:faraday_runtime] if event.payload[:faraday_runtime]
  Thread.current[:faraday_runtime] = nil

  $rpm_logger.info(info.to_json)
end

ActiveSupport::Notifications.subscribe('request.faraday') do |name, start, ending, transaction_id, payload|
  event = ActiveSupport::Notifications::Event.new(name, start, ending, transaction_id, payload)
  Rails.logger.info "  Faraday #{event.payload[:method]} #{event.payload[:url]} (#{event.duration}ms)"
  Thread.current[:faraday_runtime] ||= 0
  Thread.current[:faraday_runtime] += event.duration
  payload[:faraday_runtime] = event.duration
end

所有的请求日志会以 JSON 格式写到 log/rpm.log 里面,然后用 Fluentd 去关注 rpm.log 最后用 fluent-plugin-influxdb 写到 InfluxDB 里面。

#36 楼 @Rei 我们在 RPM 有 1000+ 的产品上面用,InfluxDB 要挂,似乎还有挺多问题的

@huacnlee 我想问问,这里说的 InfluxDB 要挂具体是一个什么样的情况?

#39 楼 @hz_qiuyuanxin 每分钟 1000 个请求的日志写进去

这个放 Rails 后端获取数据,应该是没有浏览器整体时间消耗的数据的吧?

#42 楼 @as181920 浏览器耗时,如果不考虑网络情况,自己电脑上面的速度已经有参考依据了

非常赞。。。我也用起来了

这个是不是可以替代 logstash 的?

#45 楼 @yandy logstash 和 fluentd 是相互替代的关系。。

最后的结果数据是在界面上查询 sql(select * from process_action.action_controller;)查看吗?

#49 楼 @huacnlee 你好 如果我想要做到和 NewRelic 一样,可以监控 CPU,内存,磁盘,SQL。请问,是不是还要自己写代码统计数据

#50 楼 @string2020 用 Fluentd,写个插件读取系统信息,最后写入 InfluxDB

这个有意思,很多场景都可以应用

@huacnlee 前面全部搞定,数据埋点也能在 influxdb 上面查询看到,grafana 上已经配置了 datasource,为啥 grafana 上看不到数据图呢?官方网上的教程没有讲怎么讲 i?

#53 楼 @jasontang168 得在 Grafana 上面写查询语句

@huacnlee 这个有例子吗?我在添加了面板里面只在 template 的菜单里面的 add 的地方看到了了有写 query 的地方,写 select 的时候报 influxdb 404,恳求教程,官网上没有相关的教程,看了官方上,只有 datasource 的那个地方讲了 influxdb 的 0.8 和 0.9 的相关解释说明。

终于搞定了,看这篇文章,讲了如何将 influxdb 的数据配置进 grafana,非常详细http://www.rittmanmead.com/2015/02/obiee-monitoring-and-diagnostics-with-influxdb-and-grafana/ ,另外在 grafana 里面配置 datasource 时配置的 api 端口是 8086,不是 influxdb 的监听端口 8083,否则在 grafana 写查询语句永远是 404 influxdb error,这里面是一个超级大坑呀。

#37 楼 @huacnlee 请问,这样整合,如何保证高可用

#56 楼 @jasontang168 链接打不开,influxdb 的数据配置进 grafana 这个哪里有资料。官网就只有一个配置 influxdb 数据源。

#57 楼 @string2020 把直接写 db 的方式改成写 log 然后用 fluentd 写入 influxdb 的方式,不必保证高可用,influxdb 或者 fluentd 挂掉最多就是统计数据损失,对业务没有影响

存储和展示都很容易,关键是数据从哪里来?

#58 楼 @string2020 可以打开的,我联通的

在这个帖子基础上,quakewang做了一个 rpm selfhost

@huacnlee 监控报警,有什么好的推荐吗

#25 楼 @lidashuang 能结合什么报警方案吗

结合 https://prometheus.io/ 如何?提供 alert 和告警功能,常见的数据收集都有,自己写也很方便

mark 一下

huacnlee 请教 Fluentd 的 Rails 日志配置 提及了此话题。 11月18日 14:19
quakewang 自制监控服务接收 NewRelic RPM 数据 提及了此话题。 04月06日 11:11

楼主,想问一下,influxdb 数据量起来的时候,读取数据有什么好方法,我现在用 python 或者 shell 读取数据的时候都非常慢,差不多就是卡主了

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