Fluentd + InfluxDB + Grafana 日志收集的实践

栏目: 服务器 · 发布时间: 4年前

内容简介:本文是基于ruby-china上提出的开源日志收集方案所作的实践方案的提出在这篇:

本文是基于ruby-china上提出的开源日志收集方案所作的实践

方案的提出在这篇:

李华顺: InfluxDB + Grafana 快速搭建自己的 NewRelic,分析应用运行情况

安装

InfluxDB

用HomeBrew

$ brew update
$ brew install influxdb

Grafana

$ 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 ...

Fluentd

因为我们依赖于 Fluentd 做日志收集,我们后台用的ruby,所以直接用gem安装就好了

$ gem install fluentd

收集打点

huacnLee的方案中,主要是对Rails提供的web服务的监控,所以只需要用到 ActiveSupport::Notifications.subscribe 订阅Controller::Action就好

在我们的后台主要是Grape提供API服务,所以我们需要利用Rack和Grape的中间件机制,插入到API运行的过程中,获取运行数据

如果是直接让Service把数据导入到influxdb在高并发下可能会有效率问题,所以采用各个Service先写log文件,Fluentd采集数据,上传数据库的方式

日志记录我们用最简单的 Ruby 自带的Logger就行了,当然还有其他方案,只要最后输出JSON就行了

Rack

在这一层面上,我们不需要自己统计运行时间,我们只需要拿到 ResponseHeader 中的 X-Runtime 就行了

equire 'logger'
require 'json'
require 'time'
module WhosvPerformance
  module Rack
    class WhosvRackDebugger
      def initialize(app)
        @app = app
      end

      def call(env)
        @env = env
        before_log
        status, headers, body = @app.call env
        log_runtime headers
        [status, headers, body]
      end
      private
      def before_log
        @whosv_performance_logger = Logger.new('rpm.log')
        original_formatter = Logger::Formatter.new
        @whosv_performance_logger.formatter = proc { |severity, datetime, progname, msg|
          {:severity => severity,:datetime => datetime.strftime("%Y-%m-%d %H:%M:%S")}.merge(msg).to_json << "\n"
        }
      end
      def log_runtime headers
        @whosv_performance_logger.info ({:method => @env['REQUEST_METHOD'],:path => @env['REQUEST_PATH'],:runtime => headers['X-Runtime'].to_f,:component=>"Rack"})
      end
    end
  end
end

当然你需要把你的中间件插入到Rails的RackStack里面,注意顺序,由于RackMiddlewares的结构是栈,FILO,需要插到Runtime插件之上

config.middleware.insert_before Rack::Runtime,WhosvPerformance::Rack::WhosvRackDebugger

Grape

require 'logger'
require 'json'
require 'time'
module API
  module Middleware
    class WhosvPerformance < Grape::Middleware::Base
      def before
        @whosv_performance_logger = Logger.new('rpm.log')
        original_formatter = Logger::Formatter.new
        @whosv_performance_logger.formatter = proc { |severity, datetime, progname, msg|
          {:severity => severity,:datetime => datetime.strftime("%Y-%m-%d %H:%M:%S")}.merge(msg).to_json << "\n"
        }
        @whosv_start_time = Time.now
        puts @app
        nil
      end
      def after
        puts "End Grape"
        @whosv_end_time = Time.now
        whosv_api_runtime = @whosv_end_time - @whosv_start_time
        @whosv_performance_logger.info result_runtime(whosv_api_runtime)
        nil
      end

      private
      def result_runtime runtime
        {
            :method => @env['REQUEST_METHOD'],
            :path => @env['REQUEST_PATH'],
            :runtime => runtime,
            :component => 'Grape'
        }
      end
    end
  end
end

这里有一点需要注意,可能你发现有时候Rack记到了点,但是Grape没有记录到,因为如果你需要在Grape中在半路不显示return,但需要结束整个api调用

所以你用了 error!(hash,status) 方法

该方法是 Grape::DSL 提供的内置方法,他会抛出一个 :error ,所以你的收集代码运行,就被catch住了

订阅日志

我们用Fluentd内置的input插件来收集,输出需要安装 fluent-plugin-influxdb 的插件

安装:

$ fluent-gem install fluent-plugin-influxdb

注意最后可能你的安装版本略旧,怎么也没法上传,这时候用源码替换一下

配置

我们用tail方式监听文件变动,该插件是一个基于buffered的fluentd插件,默认flush时间是60秒,所以结果并非是实时的

## File input
## read apache logs with tag=apache.access
<source>
  @type tail
  format json
  time_key datetime
  time_format %Y-%m-%d %H:%M:%S
  path /Users/megrez/Code/whosv/whosv-rails/rpm.log
  pos_file /Users/megrez/Code/whosv/whosv-rails/rpm.log.pos
  tag api.performance
</source>
<match api.performance>
  @type influxdb
  host localhost
  port 8086
  dbname whosv_rails_dev
  user root
  password root
  time_precision s
</match>

Grafana

按之前的帖子配置一下Grafana

就能看到界面,里面的图按照自己的需求画就行了,这块就比较简单了

总结

整个方案比较轻量级,比之 Flume-ng + Apache-Avro + MQ + Kafka + Storm/Hadoop + Kibana 要容易很多

我觉得比较适合后端是Ruby的项目,在收集器这方面我只是做了一些尝试,具体可以参考

newrelic/rpm

Measuring Performance in Grape APIs With NewRelic RPM

xinminlabs/newrelic-grape

stevebartholomew/newrelic_moped

以上包括了Grape层面的记录,数据库查询等的记录等

数据有了,分析的方法可能还比较局限,包括InfluxDB本身还不完善,主要还是适用于时间序列的分析

方案离实践还比较远,还需要做很多工作,本文权当抛砖引玉


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

DIV+CSS网站布局从入门到精通

DIV+CSS网站布局从入门到精通

2011-1 / 58.00元

《DIV+CSS网站布局从入门到精通》介绍了商业类型的网页设计,以及目前流行的div+CSS标准布局方法和实战技法。通过十个经典案例,分别从不同类型网站的布局风格以及实现方法来讲解div+CSS网页布局和制作方法。全书系统地讲解了CSS样式的基础理论和实际运用技术,并结合实例来讲解层叠样式表与层布局相结合制作网页的方法。在实例制作过程中除了介绍CSS样式设计各方面的知识外,还结合实际网页制作中可能......一起来看看 《DIV+CSS网站布局从入门到精通》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具