最近用 ELK 解析 Ceph 的性能状态,metricbeat 6.x 版本里放出了测试中的 ceph 模块,但是居然没有读写速度参数。所以我们就改用 logstash 的 http_poller 模块,定时去查 ceph api,解析出需要的数据并绘出图形(我们将在第二章里讲到如何建立 kibana 看板)。

首先是 input 部分里,我们使用 http_poller 来抓取。请把 IP 和端口按实际情况修改。http_poller 是个超好玩的模块,按照官方的举例,你可以用它来定时抓取亚马逊的商品页面,再通过一番解析后,可以得到某些商品的价格/销量等走势~~~

input {
  http_poller {
    urls => {
      cephPgStat => "http://192.168.1.1:5000/api/v0.1/pg/stat"
    }
    request_timeout => 60
    schedule => { every => "15s" }
    tags => ["ceph-pg-stat","ceph"]
  }
}

schedule 里我设置了每 15 秒查询一次,这个可以根据你的实际需求调整数据的粒度。

获取出来的信息是类似这样的

v32768479: 8000 pgs: 8000 active+clean; 8526 GB data, 29741 GB used, 152 TB / 181 TB avail; 347 kB/s rd, 8705 kB/s wr, 2246 op/s

然后我们用 filter 来处理。需要提前说明的是,我们这个 logstash filter 还不是完善的,有坑。在下一篇里我会解释原因并给出解决方法。

filter {
  if "ceph" in [tags] {
    grok {
      match => {
        "message" => [
          "%{GREEDYDATA}avail; %{INT:[ceph][cluster][read]} kB\/s rd, %{INT:[ceph][cluster][write]} kB\/s wr, %{INT:[ceph][cluster][op]} op\/s"
        ]
      }
      remove_field => "message"
    }
    mutate {
      convert => { "[ceph][cluster][read]" => "integer" }
      convert => { "[ceph][cluster][write]" => "integer" }
      convert => { "[ceph][cluster][op]" => "integer" }
    }
  }
}

output 里,我们给它一个独立的 index,方便以后的 index 清理维护。

output {
 if "ceph" in [tags] {
    elasticsearch {
      hosts => ["127.0.0.1"]
      index => "ceph-%{+YYYY.MM.dd}"
    }
  } else {
    elasticsearch {
      hosts => ["127.0.0.1"]
      index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
    }
  }
}

于是我们在 kibana 里就看到了所需的数据了,这里就不敷述如何建立 search,看图里的参数吧。
Screenshot-from-2017-12-28-22-25-40

下一篇里,我们将会讲解如何通过这些数据,创建一个 Kibana Dashboard,图形化查看 Ceph 集群读写状态。
Screenshot-2017-12-22-Ceph-Dashboard