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

huacnlee · 发布于 2014年12月30日 · 最后由 dgsfor 回复于 2017年07月10日 · 55702 次阅读
De6df3
本帖已被设为精华帖!

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

共收到 65 条回复
4755

这果断是造福帖啊

983

加精吧

1680

果断收藏~

1

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

8

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

De6df3

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

De6df3

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

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

96

:plus1:

3872

马上试一下

2443

这个方案好! 小巧玲珑~

14楼 已删除
4499

InfluxDB有潜力,关注~

6224

强大的

7318

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

3454

好东西

96

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

8528

即刻试试

De6df3

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

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

7318

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

2376

mark as data

122

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

756

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

2990

@Rei 试了下,不错

28楼 已删除
96

好东西,学习,慢慢看

1411

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

15018

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

4328

好东西

96

果断收藏

4552

好东西,谢谢楼主。

1

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

De6df3

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

De6df3

#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 里面。

2099

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

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

De6df3

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

2511

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

De6df3

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

96

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

96

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

96

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

13837

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

13837

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

De6df3

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

145

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

18464

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

De6df3

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

18464

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

18464

终于搞定了,看这篇文章,讲了如何将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,这里面是一个超级大坑呀。

13837

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

13837

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

96

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

13837

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

18464

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

Eda824

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

96

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

96

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

96

果断收藏

2973

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

6812

mark一下

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

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

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