使用logstash和kibana4的新功能metric开发数据聚合

这次把kibana3升级到kibana4,现在我们底层部门的日志都用elk方案了(logstash elasticsearch kibana)   说实话,一开始用kibana4的时候,差点屁了,跟kibana3不同的路数,以前熟悉的前端的操作,在kibana4里都是行不通的,用我们产经经理仕华的话来书,这你妈很said .  

这里还是需要标记下我的原文的链接,我怕以后文章被转来转去都没影了….

http://xiaorui.cc

http://xiaorui.cc/?p=1272

kibana4现在是正式版了,在群里看到新浪也已经用了kibana4。 听饶陈琳说 4还是很不错的…  但对于我们来说,最大的功能是他支持metric聚合,别问我啥是metric…   

大家都知道kibana是个前端的应用,在4里面加强了不少语句,比如聚合….   有了metric的功能,我们就可以用graphite、influxdb那样,做数据的聚合,可以得到count max min average sum的功能…. 


这个时候还需要什么?  我们先拿求平均值说话, 既然做针对数据的平均值,那么你提供的数据就要是数字,而不是string字符串。。。

首先我们先看下我的logstash agent的配置文件,我们首先要用grok把整条的日志拆解下,然后就是把拆解的数字转换成float,也就是数字类型。   

input {

#文章的原文,http://xiaorui.cc/?p=1272
    file {
                type => “producer”
                path => “/data/buzzMaster/spider.log”
        }
}
filter  {
    grok    {
#        match => [“message”,”\[(?<datetime>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2},\d{3})\]\s(?<level>\w*) (?<source>\w*)\s\”Crawl\surl:(?<url>(.*)) (?<httpcode>[0-9]{2,3})\stakes (?<
costbuzz>\d.\d\d).*”]
        match => [“message”,”\[(?<datetime>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2},\d{3})\]\s(?<level>\w*) (?<source>\w*)\s\”Crawl\surl:(?<url>(.*)) (?<httpcode>[0-9]{2,3})\stakes %{NUMBER:buzzcost:float}.*”]
        }
    }
output  {
    redis   {
               host => “123.123.123.123”
               port => 6388
               data_type =>”list”
               key => “buzz_count”
    }
    stdout { codec => rubydebug}
}

下面是标准输出的日志,我们注意到httpcode和buzzcost看起来都是数字,httpcode其实是字符串,有引号的。  buzzcost就是数字。  这个很重要,如果你的字段里面没有数字类型的,那么你在kibana4的各种用field字段来计算平均值等。   还有一定要注意,你一个字段以前是字符串,后期就算推送的是数字,这样在elk里面是有问题的,在es里面我倒是没有测试过。

{
       “message” => “[2015-04-15 15:16:20,057] INFO spider \”Crawl url:http://bbs.yule.com.cn/searcher.php?keyword=%C5%B7%C0%B3%D1%C5&type=thread&threadrange=1&username=&starttime=&endtime=&fid=&sortby=postdate&page=1 200 takes 5.497 seconds, refer:, depth:2\””,
      “@version” => “1”,
    “@timestamp” => “2015-04-15T15:16:20.482Z”,
          “type” => “producer”,
          “host” => “bj-buzz-docker01”,
          “path” => “/data/buzzMaster/spider.log”,
      “datetime” => “2015-04-15 15:16:20,057”,
         “level” => “INFO”,
        “source” => “spider”,
           “url” => “http://bbs.yule.com.cn/searcher.php?keyword=%C5%B7%C0%B3%D1%C5&type=thread&threadrange=1&username=&starttime=&endtime=&fid=&sortby=postdate&page=1”,
      “httpcode” => “200”,
      “costbuzz” => 5.49
}
{
       “message” => “[2015-04-15 15:16:20,108] INFO spider \”Crawl url:http://sh.58.com/sou/pn1/?key=moony&cmcskey=moony&final=1&jump=2&specialtype=gls&sourcetype=4 200 takes 0.345 seconds, refer:, depth:2\””,
      “@version” => “1”,
    “@timestamp” => “2015-04-15T15:16:20.482Z”,
          “type” => “producer”,
          “host” => “bj-buzz-docker01”,
          “path” => “/data/buzzMaster/spider.log”,
      “datetime” => “2015-04-15 15:16:20,108”,
         “level” => “INFO”,
        “source” => “spider”,
           “url” => “http://sh.58.com/sou/pn1/?key=moony&cmcskey=moony&final=1&jump=2&specialtype=gls&sourcetype=4”,
      “httpcode” => “200”,
      “costbuzz” => 0.34
}

另外提一下,logstash本身也是可以做metrics服务的数据源的,他还是可以拆解字符串,得到数字,然后加上timestamp 。  主流的metric监控他都是支持的,graphite、influxbd、opentsdb 甚至可以配合statsd做预先的数据汇聚 聚合,用来达到rrdtool的效果。 


output { 
 statsd { 
    type => “web”
    increment => “apache.response.%{response}”
    count => [ “apache.bytes”, “%{bytes}” ]
  }
}

output {
   ganglia{
    metric => “apache.bytes”
    value => “%{bytes}”
  }
}

output {
   graphite{
    metrics => [ 
      “apache.bytes”, “%{bytes}” 
    ]
  }
}

output {
   opentsdb{
    metrics => [ 
      “apache.bytes”, “%{bytes}” 
    ]
  }
}

有个logstash输出到graphite的文章, 写得不错…   另外调用了command组件,来实现类似监控的东西,调用命令sar、uptime啥的。 这人用的有些邪乎,感觉不干正经事,有兴趣的朋友可以look look !

https://developer.rackspace.com/blog/using-logstash-to-push-metrics-to-graphite/

有时间我会写一篇,logstash做metric输出的文章…         



大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

2 Responses

  1. 在北京 2015年4月16日 / 上午8:30

    你有些跑题了吧

发表评论

邮箱地址不会被公开。 必填项已用*标注