开发工具 InfluxDB + Grafana 快速搭建自己的 NewRelic,分析应用运行情况
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 好)。
2016 更新,用了 Grafana 3.0.0
收集系统数据用 Telegraf
这果断是造福帖啊
加精吧
果断收藏~
吊!
https://www.skylight.io/ 免费额度很适合小网站。
把 NewRelic 的 APM client 后端改成 InfluxDB 就强大了..
顺便说一句,据我目前的使用来看 influxdb-ruby 这个库还有问题,我们在 Rails + Unicorn 部署的时候,async 模式没法提交数据,write_point 动作一直没写,一直到 Unicorn 重启或停止,数据才一下写进去
异步的代码在这里,https://github.com/influxdb/influxdb-ruby/blob/master/lib/influxdb/worker.rb
:plus1:
马上试一下
+1
这个方案好! 小巧玲珑~
InfluxDB有潜力,关注~
强大的
Time series => 时间序列 数学中一般这么翻译。
好东西
即刻试试
新的更新,我们没用 influxdb-ruby 来直接写性能统计数据,而是先用 Logger 写成 rpm.log,内部是 JSON 格式,然后用 Fluentd 来收集,最后再用 fluent-plugin-influxdb 写到 InfluxDB 里面。
这样一来可以尽可能的避免打点的网络请求影响正常的应用,比如耗时、超时异常等
@liudangyi 时间序列分析 => Time Series Analysis
mark as data
其实你还要自己处理阈值,报警
@Rei 试了下,不错
好东西,学习,慢慢看
InfluxDB的cluster还不太成熟啊,先观望下,还是继续MongoDB顶着吧
谢谢 lz推荐, 我采用influxDB Fluentd(td-agent) Grafana这个方案,自己弄着玩。 rails使用logstash-logger 格式化输出json log。
好东西
好東西
果断收藏
好东西,谢谢楼主。
我觉得这个有做成 rack middleware 的潜力。
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 里面。
#39楼 @hz_qiuyuanxin 每分钟 1000 个请求的日志写进去
good
这个放Rails后端获取数据,应该是没有浏览器整体时间消耗的数据的吧?
非常赞。。。我也用起来了
这个是不是可以替代 logstash 的?
最后的结果数据是在界面上查询sql(select * from process_action.action_controller;)查看吗?
#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,这里面是一个超级大坑呀。
#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一下
楼主,想问一下,influxdb数据量起来的时候,读取数据有什么好方法,我现在用python或者shell读取数据的时候都非常慢,差不多就是卡主了