NewRelic 估计很多人都用过,但是这货非常贵,贵的一般人买不起,尤其是个人项目。
可咱也要性能指标分析啊!那来自己搭建一个
InfluxDB 安装非常简单
Homebrew 就可以安装
$ brew update
$ brew install influxdb
# 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 是存静态的,你只需要下载源代码解压,将它部署在 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 好)。
收集系统数据用 Telegraf
顺便说一句,据我目前的使用来看 influxdb-ruby 这个库还有问题,我们在 Rails + Unicorn 部署的时候,async 模式没法提交数据,write_point 动作一直没写,一直到 Unicorn 重启或停止,数据才一下写进去
异步的代码在这里,https://github.com/influxdb/influxdb-ruby/blob/master/lib/influxdb/worker.rb
新的更新,我们没用 influxdb-ruby 来直接写性能统计数据,而是先用 Logger 写成 rpm.log,内部是 JSON 格式,然后用 Fluentd 来收集,最后再用 fluent-plugin-influxdb 写到 InfluxDB 里面。
这样一来可以尽可能的避免打点的网络请求影响正常的应用,比如耗时、超时异常等
谢谢 lz 推荐,我采用 influxDB Fluentd(td-agent) Grafana 这个方案,自己弄着玩。rails 使用logstash-logger 格式化输出 json log。
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 里面。
@huacnlee 前面全部搞定,数据埋点也能在 influxdb 上面查询看到,grafana 上已经配置了 datasource,为啥 grafana 上看不到数据图呢?官方网上的教程没有讲怎么讲 i?
@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 挂掉最多就是统计数据损失,对业务没有影响
楼主,想问一下,influxdb 数据量起来的时候,读取数据有什么好方法,我现在用 python 或者 shell 读取数据的时候都非常慢,差不多就是卡主了