diamond是与graphite配合使用的一个数据收集的软件,关于这个配置的资料很多,使用起来也比较简单,详细的安装和配置会在后面的关于整套监控系统的文章里面写到,本篇是专门讲解怎么自定义这个数据收集的插件
diamond的结构比较简单:
- Collector 数据采集的模块
- handlers 数据发送的模块
这里主要讲解的是Collector部分的插件的编写,diamond自身带了非常丰富的插件,可以很方便的使用自带的插件进行监控,包括ceph和cephstats这两个可以用来监控ceph的插件,弄清楚怎么去写插件会方便很多,并且能扩展原来插件所没有的数据,calamari里面的数据的收集就是通过的diamond的
本例将讲解怎么写一个监控ceph的健康状态的插件
1、diamond软件的安装
通过github上下载代码然后安装在服务器上即可
2、收集数据的py的编写
收集数据的collect的路径:
/usr/share/diamond/collectors/
2.1 创建一个目录
mkdir /usr/share/diamond/collectors/cephhealth/
2.2 创建采集的py文件
vim /usr/share/diamond/collectors/cephhealth/cephhealth.py
添加下面的内容:
# coding=utf-8
"""
本插件用于采集ceph的健康状态
"""
import diamond.collector
import json
import os
class cephhealthCollector(diamond.collector.Collector):
def get_default_config_help(self):
config_help = super(cephhealthCollector, self).get_default_config_help()
config_help.update({
})
return config_help
def get_default_config(self):
"""
Returns the default collector settings
"""
config = super(cephhealth, self).get_default_config()
config.update({
'path': 'ceph'
})
return config
def collect(self):
"""
Overrides the Collector.collect method
"""
# Set Metric Name
metric_name = "my.cephhealth.metric"
data = os.popen('ceph health -f json').read()
ddata = json.loads(data)
status = ddata['overall_status']
if status == 'HEALTH_ERR':
statuscode = 10
else:
statuscode = 0
# Set Metric Value
metric_value = statuscode
# Publish Metric
self.publish(metric_name, metric_value)
以上插件注意:
cephhealthCollector 为这个插件的名称,也是diamond.conf里面设置的时候设置的值
'path': 'ceph' 这个是在最后输出结果中会显示这个名称
其他部分就是注意输出一个名称 metric_name,和最后的 metric_value 即可
中间的部分可以自己去用python去获取数值即可
3、修改diamond配置文件
vim /etc/diamond/diamond.conf
在[collectors]下面插件配置的区域添加
[[cephhealthCollector]]
enabled = true
4、重启diamond进程
/etc/init.d/diamond restart
5、检查输出的数值
可以把其他插件全部关闭,然后查看文件
/var/log/diamond/archive.log的内容
上面的插件的输出为:
servers.grafana.ceph.my.cephhealth.metric 10 1456057146
这个结果的格式为:
- path_prefix = servers (diamond.conf中配置)
- hostname = grafana (diamond.conf中配置)
- get_default_config(self): path = ceph (插件py中配置)
- metric_name = "my.cephhealth.metric" (插件py中配置)
到这来插件就完成了,写起来还是比较简单方便的,上面的地方因为ceph里面的输出的是字符串,而grafana里面的显示状态的地方使用的是数字的,所以在这里可以通过字符串转数字,然后在web界面上使用数字字符的匹配来显示这个状态
diamond的性能是很牛的,1000 台服务器每分钟总共300万个监控数值的压力也能扛下来,对于我们普通级别的使用时绰绰有余的,关于这个规模的有人写了文章,优化的时候可以参考(1000台监控)