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

huacnlee · 发布于 2014年12月30日 · 最后由 zouchaoge 回复于 2016年11月08日 · 40664 次阅读
2
本帖已被设为精华帖!

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

共收到 64 条回复
4755
martin91 · #1 · 2014年12月30日

这果断是造福帖啊

983
chucai · #2 · 2014年12月30日

加精吧

1680
justin · #3 · 2014年12月30日

果断收藏~

7614
michael_roshen · #4 · 2014年12月30日

吊!

1
Rei · #5 · 2014年12月30日 3 个赞

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

8
hooopo · #6 · 2014年12月30日

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

2
huacnlee · #7 · 2014年12月30日

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

8
hooopo · #8 · 2014年12月30日
2
huacnlee · #9 · 2014年12月30日 1 个赞

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

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

96
johny · #10 · 2014年12月30日

:plus1:

3872
chankaward · #11 · 2014年12月30日

马上试一下

4584
imlcl · #12 · 2014年12月30日 1 个赞

+1

2443
wppurking · #13 · 2014年12月30日

这个方案好! 小巧玲珑~

14楼 已删除
4499
chrisloong · #15 · 2014年12月30日

InfluxDB有潜力,关注~

6224
swachian · #16 · 2014年12月30日

强大的

7318
appell · #17 · 2014年12月30日 1 个赞

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

3454
xwf286 · #18 · 2014年12月31日

好东西

96
liudangyi · #19 · 2014年12月31日

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

8528
louisliu813 · #20 · 2014年12月31日

即刻试试

8528
louisliu813 · #21 · 2014年12月31日
2
huacnlee · #22 · 2015年1月01日 1 个赞

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

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

7318
appell · #23 · 2015年1月02日

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

2376
killyfreedom · #24 · 2015年1月02日

mark as data

122
lidashuang · #25 · 2015年1月02日

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

756
psvr · #26 · 2015年1月02日

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

2990
ailen · #27 · 2015年1月04日

@Rei 试了下,不错

28楼 已删除
96
oscar_tra · #29 · 2015年1月04日

好东西,学习,慢慢看

1411
zeeler · #30 · 2015年1月04日

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

15018
schwinn · #31 · 2015年1月05日

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

4328
tianqingbo · #32 · 2015年1月06日

好东西

96
forsevent · #33 · 2015年1月08日 1 个赞

好東西

96
wilask · #34 · 2015年1月09日

果断收藏

4552
zhulinpinyu · #35 · 2015年1月09日

好东西,谢谢楼主。

1
Rei · #36 · 2015年1月19日

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

2
huacnlee · #37 · 2015年1月19日

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

2
huacnlee · #38 · 2015年1月19日 1 个赞

#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
hz_qiuyuanxin · #39 · 2015年1月19日

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

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

2
huacnlee · #40 · 2015年1月20日

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

2926
fisherboat · #41 · 2015年1月30日

good

2511
as181920 · #42 · 2015年2月26日

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

2
huacnlee · #43 · 2015年2月26日

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

96
ruohanc · #44 · 2015年3月05日

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

96
yandy · #45 · 2015年3月05日

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

96
ruohanc · #46 · 2015年3月06日

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

13837
string2020 · #47 · 2015年4月08日

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

2
huacnlee · #48 · 2015年4月08日
13837
string2020 · #49 · 2015年4月08日

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

2
huacnlee · #50 · 2015年4月20日

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

145
suupic · #51 · 2015年4月29日

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

18464
jasontang168 · #52 · 2015年5月02日

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

2
huacnlee · #53 · 2015年5月02日

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

18464
jasontang168 · #54 · 2015年5月02日

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

18464
jasontang168 · #55 · 2015年5月02日

终于搞定了,看这篇文章,讲了如何将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
string2020 · #56 · 2015年5月05日

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

13837
string2020 · #57 · 2015年5月05日

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

96
ruohanc · #58 · 2015年5月06日

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

13837
string2020 · #59 · 2015年5月08日

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

18464
jasontang168 · #60 · 2015年5月08日

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

1665
ericguo · #61 · 2016年3月06日

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

96
lrgoodboy · #62 · 2016年7月20日

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

96
lrgoodboy · #63 · 2016年7月20日

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

96
u1445052173 · #64 · 2016年8月03日

果断收藏

2973
small_fish__ · #66 · 2016年9月14日

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

6812
zouchaoge · #67 · 2016年11月08日

mark一下

2 huacnlee 请教 Fluentd 的 Rails 日志配置 中提及了此贴 11月18日 14:19
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册