日志系统的搭建(collectd + logstash + influxdb)

来源:互联网 发布:赵公明 知乎 编辑:程序博客网 时间:2024/04/28 15:21

背景

要提供一套新的服务,正好借这个机会把所有日志都整合起来:squid,collectd等等。同时存入influxdb中,用influxdb的原因是:

  • 需要的查询大多是随机查询,而它提供sql-like的查询语言,并且有一个简单的UI
  • go写的。。。。(老大喜欢)
  • elasticsearch没有一个好的dashboard

概述

  • squid:缓存数据的代理服务器。通过缓存和复用频繁访问的页面来减小带宽和提升响应速度。
  • collectd:定时收集系统性能的统计信息并提供了一个存储机制的守护进程。主要用它来收集cpu,内存,带宽的数据。
  • logstash:管理事件(event)和日志(log)的工具。可以通过插件的形式收集各种日志,并通过filter和output的插件来处理和输出到合适的后端。官方是对Elasticsearch默认进行无节操的支持的。。文档里面简直不忍直视。。
  • influxdb:分布式的,time series的db
  • elasticsearch:它自己说是一个全文检索和分析的引擎。
  • 另外对redis这种内存数据库也有了一些了解,以前只是会用,并没有深入去了解。因为对它的持久化比较感兴趣,了解过后发现主要是两点:不persist,只replicate;还有合理的数据淘汰机制。

logstash的influxdb output plugin

用的是这个:plugin
自己在测试的时候,用这样的一个conf:

input {  stdin { }}filter {  grok {      match => ["message", '%{NUMBER:time} %{HTTPDATE} %{NUMBER:duration} %{IP:ip} .... "%{DATA:user_agent}"']    }  ruby {      code => 'event["start_time"] = event["time"].to_f - event["duration"].to_f'    }}output {  influxdb {    db => "test01"    host => "localhost"    port => "8086"    user => "*****"    password => "*****"    series => "kobe"    allow_time_override => true    coerce_values => {      "time" => "float"      "start_time" => "float"      "duration" => "integer"      "transfer_size" => "integer"    }    data_points => {      "time" => "%{time}"      "start_time" => "%{start_time}"      "duration" => "%{duration}"      "ip" => "%{ip}"      ...      "user_agent" => "%{user_agent}"    }  }  stdout { codec => rubydebug }}

一开始没有注意到coerce_values,所以总是time不能是string的错,又不细心。。

还有一个问题是时间格式,Unix time指从1970年1月1日0点0分0秒UTC起到现在经过了多少秒,写到influxdb里的time必须是这种格式的。在ruby里可以require ‘date’后,用DateTime.strptime(str, regx).to_time.to_f 来获取,其中str是可读的日期类型,如:”05/Feb/2015:06:26:54 +0800”, regx来做匹配,如上面这个就用”%d/%b/%Y:%H:%M:%S %z”。

可以在filter里的grok后面来用一个ruby的filter做转换就好了。不过后来决定还是把squid传过来的日志里加一项好了,不然在filter里写require还是有点奇怪的。。

collectd -> logstash -> influxdb

这种文档毫无节操的东西。。。搞起来真是头大,不过总算是做出来了。
功能:通过collectd收集cpu,memory,带宽的信息,通过logstash,存入influxdb里。下面分成两块:collectd->logstash 和 logstash->influxdb

collectd的配置以及logstash中collectd插件的配置

先看collectd的配置(/etc/collectd/collectd.conf):

Hostname "localhost"Interval 10Timeout 4ReportStats true    LogLevel infoLoadPlugin interfaceLoadPlugin loadLoadPlugin cpuLoadPlugin memoryLoadPlugin network#LoadPlugin "logfile"<Plugin interface>    Interface "eth0"    IgnoreSelected false</Plugin>#<Plugin "logfile">#    LogLevel "info"#    File "/var/log/collectd.log"#    Timestamp true#</Plugin><Plugin network>    Server "127.0.0.1" "5999"    # if no port number is mentioned, it will take the default port number (25826)</Plugin>

TODO 用默认的25826端口logstash会报listener died的错,查了一下只发现在用syslog的514端口有这个问题,大概是说1024下的端口需要root权限来打开?没有深究,以后有时间在来看

这个基本上没什么问题,唯一需要注意的是,它会把每!项!数!据!split!开!就是说比如memory就有这么多项:

{         "@version" => "1",       "@timestamp" => "2015-03-03T04:13:39.501Z",             "host" => "localhost",           "plugin" => "memory",    "collectd_type" => "memory",    "type_instance" => "used",            "value" => 3034607616.0}{         "@version" => "1",       "@timestamp" => "2015-03-03T04:13:39.501Z",             "host" => "localhost",           "plugin" => "memory",    "collectd_type" => "memory",    "type_instance" => "buffered",            "value" => 200491008.0}{         "@version" => "1",       "@timestamp" => "2015-03-03T04:13:39.501Z",             "host" => "localhost",           "plugin" => "memory",    "collectd_type" => "memory",    "type_instance" => "cached",            "value" => 667705344.0}{         "@version" => "1",       "@timestamp" => "2015-03-03T04:13:39.501Z",             "host" => "localhost",           "plugin" => "memory",    "collectd_type" => "memory",    "type_instance" => "free",            "value" => 241139712.0}

官方的解释就是。。。为了向后兼容。

logstash中的input是这样配置的:

input {  collectd {    host => "localhost"    port => 5999    codec => json    add_field => {      "type" => "collectd"    }  }}

logstash -> influxdb

依然是influxdb的plugin,多了一些控制语句来把不同的监控数据写到不同的series里,logstash中output的配置:

if [type] == "collectd" {    if [plugin] == "cpu" {      influxdb {        db => "test01"        host => "localhost"        port => "8086"        user => "*****"        password => "*****"        series => "cpu"        coerce_values => {          "value" => "float"        }        data_points => {          "plugin_instance" => "%{plugin_instance}"          "collectd_type" => "%{collectd_type}"          "type_instance" => "%{type_instance}"          "value" => "%{value}"        }      }    } else if [plugin] == "memory" {      influxdb {        db => "test01"        host => "localhost"        port => "8086"        user => "*****"        password => "*****"        series => "memory"        coerce_values => {          "value" => "float"        }        data_points => {          "collectd_type" => "%{collectd_type}"          "type_instance" => "%{type_instance}"          "value" => "%{value}"        }      }    } else if [plugin] == "interface" {      influxdb {        db => "test01"        host => "localhost"        port => "8086"        user => "*****"        password => "*****"        series => "interface"        coerce_values => {          "tx" => "float"          "rx" => "float"        }        data_points => {          "plugin_instance" => "%{plugin_instance}"          "collectd_type" => "%{collectd_type}"          "rx" => "%{rx}"          "tx" => "%{tx}"        }      }    }

写成这样我也快疯了。。不知道有没有更好的写法。

0 0
原创粉丝点击