В используемой мной системе мониторинга Zabbix, начиная с версии 2.0, появилась такая любопытная штука, как низкоуровневое обнаружение
Я не буду пересказывать содержимое документации, расскажу лучше о том, как я писал свой тип обнаружения для мониторинга очередей RabbitMQ.
Проблема в том, что очередей в RabbitMQ может быть много, и, по мере развития веб-проекта, они меняются. Так что я решил обнаруживать их автоматически, и написал для этого свой провайдер данных для обнаружения заббикса.
Порядок действий прост:
- Получаем список vhostов командой
rabbitmqctl -q list_vhosts name
- Получаем для каждого vhost список очередей командой
rabbitmqctl -q list_queues -p %vhost name
- Отдаем полученные пары vhost:queue в формате JSON
- Используем полученные данные в шаблонах заббикса, в разделе обнаружение
- PROFIT!
На выходе должны получить что-то вроде этого:
:::json
{
"data": [
{"{#RABBITMQ_VHOST_NAME}": "/", "{#RABBITMQ_QUEUE_NAME}": "hello"},
{"{#RABBITMQ_VHOST_NAME}": "/", "{#RABBITMQ_QUEUE_NAME}": "world"}
]
}
Реализовано все на Python, код предельно прост, в комментариях не нуждается.
rabbitmq_discovery.py
:::python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess
import sys
import json
def _run(cmd):
# returns (rc, stdout, stderr) from shell command
process = subprocess.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=True)
stdout, stderr = process.communicate()
return (process.returncode, stdout, stderr)
def parse_vhosts(data):
vhosts = []
for line in data.splitlines():
vhosts.append(line.strip())
return vhosts
def parse_stat(data, vhost):
stat = []
for line in data.splitlines():
stat.append({
'{#RABBITMQ_VHOST_NAME}': vhost,
'{#RABBITMQ_QUEUE_NAME}': line.strip(),
})
return stat
def _fail(msg):
print(msg)
sys.exit(1)
def main():
rc, raw_data, err = _run("rabbitmqctl -q list_vhosts name")
if rc != 0:
_fail("rabbitmqctl command failed with %s "%err)
vhosts = parse_vhosts(raw_data)
raw_stats = []
for vhost_name in vhosts:
rc, raw_data, err = _run("rabbitmqctl -q list_queues -p %s name"%vhost_name)
if rc != 0:
_fail("rabbitmqctl command failed with %s "%err)
raw_stats = raw_stats + parse_stat(raw_data, vhost_name)
data = {
'data': raw_stats
}
print json.dumps(data)
if __name__ == "__main__":
main()
Еще нужно создать ключ, по которому заббикс будет всю эту красоту получать.
В конфиге заббикса добавляем что-либо вида
UserParameter=rabbitmq.discovery,sudo /opt/rabbitmq_discovery.py
В моем случае, нужно беспарольное sudo на эту команду для пользователя Zabbix.
Ну а в самом заббиксе уже создаем в шаблоне обнаружение, в котором используем ключ
rabbitmq.discovery
и макросы {#RABBITMQ_VHOST_NAME} и {#RABBITMQ_QUEUE_NAME}.
Это подробно описано в документации,
так что я этого описывать не буду.
Исходники доступны в моем репозитории, в папке zabbix/data_collectors
.