zabbix 自动发现并监控ceph osd

ceph的运维离不开完善的监控,特别是对osd的监控,虽然自L版本以后,ceph自带的zabbix模块,但是L和M版本还不能自动化发现osd,这时候,我们需要自定义自动发现模板。

编写自动发现脚本

#!/bin/sh
OSDS=(`ceph osd tree| egrep -v 'ID|host|root|default|rack' | awk '{print $1}'`)
LENGTH=${#OSDS[*]}

printf "{\n"
printf  '\t'"\"data\":["
for ((i=0;i<$LENGTH;i++))
do
        printf '\n\t\t{'
        printf "\"{#OSD_ID}\":\"${OSDS[$i]}\"}"
        if [ $i -lt $[$LENGTH-1] ];then
                printf ','
        fi
done
printf  "\n\t]\n"
printf "}\n"

脚本执行内容如下:

{
        "data":[
                {"{#OSD_ID}":"0"},
                {"{#OSD_ID}":"1"},
                {"{#OSD_ID}":"3"},
                {"{#OSD_ID}":"4"},
                {"{#OSD_ID}":"5"},
                {"{#OSD_ID}":"11"},
                {"{#OSD_ID}":"2"},
                {"{#OSD_ID}":"6"},
                {"{#OSD_ID}":"7"},
                {"{#OSD_ID}":"8"},
                {"{#OSD_ID}":"9"},
                {"{#OSD_ID}":"10"},
                {"{#OSD_ID}":"12"},
                {"{#OSD_ID}":"13"},
                {"{#OSD_ID}":"14"},
                {"{#OSD_ID}":"15"},
                {"{#OSD_ID}":"16"},
                {"{#OSD_ID}":"17"},
                {"{#OSD_ID}":"18"},
                {"{#OSD_ID}":"19"},
                {"{#OSD_ID}":"20"},
                {"{#OSD_ID}":"21"},
                {"{#OSD_ID}":"22"},
                {"{#OSD_ID}":"23"}
        ]
}

我们将上面的脚本,找个适当的位置存放,比如我们放在如下位置:

/etc/zabbix/

配置自动发现k和监控osd状态的key

我们在/etc/zabbix/zabbix_agentd.d目录下创建userparameter_ceph.conf配置文件,并添加如下内容:

UserParameter=ceph.osddiscovery,/etc/zabbix/ceph_osd_discover.sh
UserParameter=ceph.osdstatus[*], ceph osd tree | grep -w 'osd.$1' | awk '{print $$5}'
  • ceph.osddiscovery:是用来发现osd的key
  • ceph.osdstatus[*]:用来获取osd状态的key

测试

我们可以通过zabbix_agent来测试配置的key是否正常。上面定义的两个key我们能够测试ceph.osddiscovery。第二个发因为要依据第一个发现的值,所以不太号测试。

重启一下zabbix_agent让配置生效,我们通过如下命令测试:

zabbix_agentd -t ceph.osddiscovery

输出结果如下:

ceph.osddiscovery                             [t|{
        "data":[
                {"{#OSD_ID}":"0"},
                {"{#OSD_ID}":"1"},
                {"{#OSD_ID}":"3"},
                {"{#OSD_ID}":"4"},
                {"{#OSD_ID}":"5"},
                {"{#OSD_ID}":"11"},
                {"{#OSD_ID}":"2"},
                {"{#OSD_ID}":"6"},
                {"{#OSD_ID}":"7"},
                {"{#OSD_ID}":"8"},
                {"{#OSD_ID}":"9"},
                {"{#OSD_ID}":"10"},
                {"{#OSD_ID}":"12"},
                {"{#OSD_ID}":"13"},
                {"{#OSD_ID}":"14"},
                {"{#OSD_ID}":"15"},
                {"{#OSD_ID}":"16"},
                {"{#OSD_ID}":"17"},
                {"{#OSD_ID}":"18"},
                {"{#OSD_ID}":"19"},
                {"{#OSD_ID}":"20"},
                {"{#OSD_ID}":"21"},
                {"{#OSD_ID}":"22"},
                {"{#OSD_ID}":"23"}
        ]
}]

说明,我们的配置已经生效

配置zabbix自动发现模板

设置正则表达式

正则表达式有助于我们更好的筛选需要监控的项目,当然,如果没有必要,也可以不设置。在管理–>一般界面,将右侧下拉列表,改成正则表达式,选择新建正则表达式,如下创建《OSD for discover》的设置:
image
我们表达式设置成^[0-9],这样能匹配所有整数,我们的的osd的id都为整数。也可以在测试选项卡测试一下。

配置模板

创建名为ceph osd discovery的自动发现模板
image

进入刚才创建的《ceph osd discovery》自动发现模板,点击自动发现规则,选择创建创建规则:
image

创建名称为《discover ceph osd》的自动发现规则
image

  • 名称:自定义,我们设置为discover ceph osd
  • 类型:选择zabbix 客户端
  • 键值:ceph.osddiscovery,与刚开始创建的脚本执行的键值一致
  • 更新时间:每隔多久采集一次数据,根据实际情况定。由于osd变化的速度可能没那块,可以设置是时间长一些。

    在过滤器选项卡下,创建如下的过滤规则:
    image
  • 宏:自动发现脚本中命名的键名
  • 表达式:上面我们设置的正则表达式名称,前面加上@符号

    点击更新,保存自动发现规则。

    此时只能自动发现osd,但是我们还没有针对发现的osd创建监控项。我们点击监控项原型,选择创建监控项原型,创建名为《osd {#OSD_ID} status》的监控项:
    iamge
  • 名称:自定义,我们是指为:osd {#OSD_ID} status
  • 类型:选择zabbix客户端
  • 键值:选择ceph.osdstatus[{#OSD_ID}],其中ceph.osdstatus为userparameter_ceph.conf定义的获取osd状态的键值。
  • 信息类型:数字(无正负),虽然采集回来的是文本,我们将会在下一步进行转换。
  • 更新时间:采集频率,根据实际情况更改
  • 历史数据保留:根据实际情况填写,一般保留一个月即可
  • 趋势:趋势占的数据量小,可以相对保存长些


由于采集回来的值为up或者down,对图表展示不太友好,我们可以通过进程选项卡,的JavaScript对值进行转换如下:
image
javascrpit内容如下

if(value=="up"){
    return 1;
}else{
    return 0;
}

设置完成以后点击更新,保存设置。

下面我们可以设置触发器原型。点击触发器类型,选择创建创建触发器原型,设置如下触发器:
image

  • 名称:自定义,我们设置为osd {#OSD_ID} down
  • 严重性:自定义,我们选择严重
  • 表达式:我们想在最近采集的值不为1的时候,触发报警

    设置完成以后,保存。

链接模板

为任何一台能够正常执行ceph命令的服务器链接模板。在一定时间以后,会正常采集到的数据。
image

可能问题

cannot parse as a valid JSON object和unable to find a keyring

为服务器链接模板以后,不能正常发现osd,并有如下报错:,
image
具体内容如下:

Invalid discovery rule value: cannot parse as a valid JSON object: invalid object format, expected opening character ‘{’ or ‘[’ at: '2020-09-08 14:27:58.892 7f29f0312700 -1 auth: unable to find a keyring on /etc/ceph/ceph.client.admin.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,

该问题可能有两个原因:

  1. 自动发现脚本输出的json字符串不对,经过检查json字符串是对的。
  2. 脚本权限和ceph的认证密钥权限不一致。我们的ceph是以root身份搭建的,默认情况下,zabbix-agent是以zabbix用户执行的,zabbix-agent在运行脚本的时候,需要使用/etc/ceph/ceph.client.admin.keyring认证文件。经过肩擦,我们发现/etc/ceph/ceph.client.admin.keyring为如下权限:
-rw------- 1 root root 151 5月  24 23:44 /etc/ceph/ceph.client.admin.keyring

全root权限,其他用户无任何权限。方法有两种:

  • 为认证文件赋予其他用户读权限,不过不知道该权限是否会对ceph有影响,所以不建议这么干:
chmod 644 /etc/ceph/ceph.client.admin.keyring
  • 将zabbix-agent设置为root运行。修改zabbix-agent.conf配置文件中的AllowRoot为1,重启zabbix-agent。

猜你喜欢

转载自blog.csdn.net/zxycyj1989/article/details/108468515