LINUX.ORG.RU
решено ФорумAdmin

Вопрос к гуру мониторинга по zabbix lld

 , , ,


0

1

В чём нужна помощь, описано в конце поста. Возможно DRVTiny сможет помочь. Постарался описать подробно и учесть рекомендации по описанию в посте разясните низкоуровневое обнаружение в zabbix (комментарий)

Кейс

Написать zabbix lld discovery для результата выполнения sql запроса.

sql запрос выводит следующие данные:

Last_Name Age  Child  tabel_id
Lebedev   35     2       47
Fedorov   40     3       55
Sidorova  30     1       63

Создать заббикс шаблон с discovery rule и item prototype's.

  • Выбирать значения Age и Child для каждого элемента Last_Name.
  • Собирать все данные, но создать item prototype только для Age и Child.

С помощью скрипта json-employer_group.py данные sql запроса преобразуются в следующий json:

{
	"data": [
	{
		"{#PARENTITEMNAME}": "table_id",
		"{#PARENTITEMVALUE}": 47,
		"{#ROOTITEM}": "Lebedev"
	}, {
		"{#PARENTITEMNAME}": "Child",
		"{#PARENTITEMVALUE}": 2,
		"{#ROOTITEM}": "Lebedev"
	}, {
		"{#PARENTITEMNAME}": "Age",
		"{#PARENTITEMVALUE}": 35,
		"{#ROOTITEM}": "Lebedev"
	},
		{
		"{#PARENTITEMNAME}": "table_id",
		"{#PARENTITEMVALUE}": 55,
		"{#ROOTITEM}": "Fedorov"
	}, {
		"{#PARENTITEMNAME}": "Child",
		"{#PARENTITEMVALUE}": 3,
		"{#ROOTITEM}": "Fedorov"
	}, {
		"{#PARENTITEMNAME}": "Age",
		"{#PARENTITEMVALUE}": 63,
		"{#ROOTITEM}": "Sidorova"
	}, {
		"{#PARENTITEMNAME}": "Child",
		"{#PARENTITEMVALUE}": 1,
		"{#ROOTITEM}": "Sidorova"
	}, {
		"{#PARENTITEMNAME}": "Age",
		"{#PARENTITEMVALUE}": 40,
		"{#ROOTITEM}": "Sidorova"
	}


	]
}

Скрипт json-employer_group.py возвращает json, если задан без параметров.

Так же скрипт може принимать 2 параметра,- {#ROOTITEM} и {#PARENTITEMNAME}. Если заданы параметры, то скрипт возвращает значение {#PARENTITEMVALUE}.

Например: json-employer_group.py Sidorova Age возвращает 40.

Далее я создаю пользовательские параметры заббикс для discovery rule и item prototype rule

UserParameter=discovery.employer, /usr/lib/zabbix/externalscripts/json-employer_group.py
UserParameter=employer.item[*], /usr/lib/zabbix/externalscripts/json-employer_group.py $1 $2

Далее я создаю шаблон заббикс:


discovery rule-discovery.employer

item-prototype Age

Name-{#ROOTITEM} parametr "Age"
type=zabbix-agent
Key=employer.item[{#ROOTITEM}, Age]


item-prototype Child

Name-{#ROOTITEM} parametr "Child"
type=zabbix-agent
Key=employer.item[{#ROOTITEM}, Child]

Вопросы|проблемы|В чём нужна помощь

Вопросы:

Если я создаю по указанному алгоритму, то discovery rule отрабатывает, но возвращает ошибку

Cannot create item, item already exist 
Lebedev Age
Lebedev Age
Lebedev Age

Как поправить эту ошибку?

Как работает с возвращаемым json заббикс сервер для item-prototype Age?

Что делает заббикс по шагам? Для каждого кортежа

    {
		"{#PARENTITEMNAME}": "Age",
		"{#PARENTITEMVALUE}": 35,
		"{#ROOTITEM}": "Lebedev"
	}

Создаётся item prototype Age? item prototype Age,- это число сочетаний {#ROOTITEM}, Child для каждого {#ROOTITEM}?

Может другой json нужно формировать? Какой? Может другой item prototype сделать? Какой?

item protoype key должен быть уникальным? Как его сделать уникальным, если item prototype нужно передавать параметры Lebedev Age?

Пробовал сделать его уникальным. Diskovery rule отрабатывает без ошибок, но возникает другая проблема. Не знаю, как создать итем, который выводит отдельный элеметнт, а не все

Для каждого кортежа добавил

    {
		"{#PARENTITEMNAME}": "Age",
		"{#PARENTITEMVALUE}": 35,
		"{#ROOTITEM}": "Lebedev",
		"{#ROOTPARENT}": "Lebedev_Age"
	}
 
item prototype один.

UserParameter=employer.item[*], /usr/lib/zabbix/externalscripts/json-employer_group.py $1

item prototype all

Name-{#ROOTITEM} parametr "Child"
type=zabbix-agent
Key=employer.item[{#ROOTPARENT}]

Идеология LLD в Zabbix не такая:

{
	"data": [
	{
		"{#PARENTITEMNAME}": "table_id",
		"{#PARENTITEMVALUE}": 47,
		"{#ROOTITEM}": "Lebedev"
	}, {
		"{#PARENTITEMNAME}": "Child",
		"{#PARENTITEMVALUE}": 2,
		"{#ROOTITEM}": "Lebedev"
	}, {
		"{#PARENTITEMNAME}": "Age",
		"{#PARENTITEMVALUE}": 35,
		"{#ROOTITEM}": "Lebedev"
	},
...

А такая:

{
	"data": [
	{
		"{#PARENT_SN}": "Lebedev",
		"{#PARENT_ID}": 47,
		"{#PARENT_AGE}": 35,
		"{#PARENT_CHILD}": 2
	}, {
...

Примите это как данность и отталкивайтесь от этого.

Если нужно возраст запихать в метрику, можно попробовать сделать calсulated item и запихать в качестве выражения {#PARENT_AGE}.

Но в общем с таким же успехом можно и отправлять {#PARENT_ID} в скрипт на стороне агента, который получит по ID значение возраста соотв. товарища из таблицы.

DRVTiny ★★★★★ ()
Последнее исправление: DRVTiny (всего исправлений: 1)

Если я создаю по указанному алгоритму, то discovery rule отрабатывает, но возвращает ошибку

Cannot create item, item already exist 
Lebedev Age
Lebedev Age
Lebedev Age

Name-{#ROOTITEM} parametr "Age"
Key=employer.item[{#ROOTITEM}, Age]

Ты следал максимально криво и неправильно

В результате у тебя по одной строке выборки zabbix пытается создать дублирующие друг друга ключи

Как уже советовал DRVTiny, исправь скрипт, поторый возвращает discovery

Но если тебе вдруг позарез нужно именно так, используй lld по нескольким параметрам

Name-{#ROOTITEM} parametr "{#PARENTITEMNAME}"
Key=employer.item[{#ROOTITEM}, {#PARENTITEMNAME}]
router ★★★★★ ()
Ответ на: комментарий от router

Но по-хорошему тебе нужно исправить скрипт, который возвращает json. Бред пихать в lld каждую ячейку таблицы отдельно, отправляй в одном элементе lld всю строку, т.е. объект

router ★★★★★ ()
Ответ на: комментарий от router

З.Ы. а в чём сакральный смысл мониторить возраст и количество детей?

«Аларм, Сидоровой уже 60, пинками гнать на пенсию»?

«Аларм, у Федорова уже 9 ребёнок, гнать пока всех баб в декрет не отправил»?

router ★★★★★ ()
Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от DRVTiny

Спасибо

Спасибо. В этом так же был вопрос. Правильный формат json для zabbix lld.

sky_leo ()
Ответ на: комментарий от router

по нескольким параметрам

Согласен, сделал криво. Но поэтому и обращаюсь, чтобы сденлать лучше и правильнее.

lld по нескольким параметрам

Такой вариант не подходит. Нужно, чтобы обязательно было имя в key поле:

Name-{#ROOTITEM} parametr "Age"
Key=employer.item[{#ROOTITEM}, Age]
sky_leo ()
Ответ на: комментарий от router

это пример

Это только пример. Реальные данные и параметры некорректно оповещать на форумах. Поэтому я написал пример, который показывает структуру и формат задачи.

sky_leo ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.