@Galdar
Web, JS, PHP, NGINX, Linux

Zabbix.Как вывести данные из JSON по ключу?

Есть ключ ( Trunk ) в нём хранится JSON вывод:
JSON
{
	"data": [{
		"{#TRUNKNAME}": "name1",
		"{#LINESNOW}": "15",
		"{#LINESMAX}": "32"
	}, {
		"{#TRUNKNAME}": "name2",
		"{#LINESNOW}": "10",
		"{#LINESMAX}": "32"
	}, {
		"{#TRUNKNAME}": "name3",
		"{#LINESNOW}": "25",
		"{#LINESMAX}": "100"
	}]
}


В выводе сразу были указанны макросы ( {#TRUNKNAME} {#LINESNOW} {#LINESMAX} ), так же макросы были указаны в "ШАБЛОНЕ" в котором находится ( Элемент данных - Trunk ).

Хотел чтобы при написание макроса выводились значения:
Вкладка "ПОСЛЕДНИЕ ДАННЫЕ" - trunk[{#TRUNKNAME}{#LINESNOW}{#LINESMAX}] = Вывод - name1 15 32.

Я понял что это так не работает, т.к. мне нужно выводить данные в поле "ПОСЛЕДНЕЕ ЗНАЧЕНИЕ". Так вот товарищи, помогите, не могу сообразить, прочитал уже кучу ответов на форуме, капался в документации Zabbix. Не могу понять как правильно сформировать скрипт так, чтобы получился вот такой запрос в "ЭЛЕМЕНТАХ ДАННЫХ" с таким ответом в поле "ПОСЛЕДНЕЕ ЗНАЧЕНИЕ" (пример на картинки с iostat) :
ZABBIX - последние данные
5c20cf3f712ba596625804.png


Как я пытаюсь сделать:
Элемент данных - trunk[name1,linesnow,linesmax]
Последнее значение - name1 15 32
...

Вот как мне сформировать JSON запрос для такого "ЭЛЕМЕНТА ДАННЫХ" или может дело в другом, вдруг я не то читаю или решение совершенно другое...

Если не сложно, опишите в подробностях.
Заранее спасибо!
  • Вопрос задан
  • 379 просмотров
Решения вопроса 1
@Galdar Автор вопроса
Web, JS, PHP, NGINX, Linux
Свой же вопрос и решил...


Всё оказалось проще чем я думал.
Создал на Zabbix agent`e ключ trunk c JSON кодом:
JSON
$array = [
 "data" => 
 [
  "name1" => [
   "linesnow" => "15",
   "linesmax" => "32"
  ]
 ]
];


Создал "ШАБЛОН" для удобства, в котором создал "ЭЛЕМЕНТЫ ДАННЫХ"
Элементы данных
5c20f50190a09525210711.png

Дал им уникальные имена и ключи.
Далее зашёл в "ЭЛЕМЕНТ ДАННЫХ" => "ПРЕДОБРАБОТКА". Выбрал "Шаг предобработки" JSON и выполнил инструкцию JSON Path в документации Zabbix:

Инструкция JSON Path

Извлечение значения или фрагмента с JSON данных с использованием простейшего наблора функций JSONPath функционала.
Примеры:
$.document.item.value извлечёт 10 с {"document":{"item":{"value": 10}}}
$.document.item извлечёт {"value": 10} с {"document":{"item":{"value": 10}}}
$['a document'].item.value извлечёт 10 с {"a document":{"item":{"value": 10}}}
$.document.items[1].value извлечёт 20 с {"document":{"items":[{"value": 10}, {"value": 20}]}}
Обратите внимание, что поддерживаются только прямые пути к одиночным объектам в обозначении точкой или квадратной скобкой.
В JSONPath обозначении точкой ($.a.b.c) можно использовать только буквенно-цифровые символы + символ подчёркивания . Если имя объекта JSON содержит другие символы, необходимо использовать обозначение квадратной скобкой ($['a']['b']['c']). Допускается смешивание обозначений ($.a['b'].c)
Извлечение нескольких значений не поддерживается.
Поддерживается начиная с 3.4.0.
Предобработка
5c20f847ed346290058332.png
Надеюсь благодаря этому ответу, кто-то сэкономит своё время!
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
vesper-bot
@vesper-bot
Любитель файрволлов
Вообще, заббикс оптимизирован под числовые данные, хотя может работать и со строками. Этот JSON больше похож на оптимизированный для обнаружения, макросы {#MACRO} предназначены для заполнения прототипов элементов данных, а не для данных как таковых. Рекомендую поискать в вашем АПИ возможность вытащить требуемые linesnow и linesmax по имени или ID транка, и создать на основе макроса прототипы элементов, в именах и ключах которых будут значения linesnow в одном и linesmax в другом, а потом отдельным постпроцессингом (хз кстати как, в самом деле - не умеет заббикс конкатенировать строки! https://support.zabbix.com/browse/ZBXNEXT-1911 девелоперы, похоже, не поняли запрос, потом кто-то предложил юзкейс, который вообще касался алертов, и идея заглохла - можете попробовать подпихнуть) собирать из элементов желаемую строку.

Разобрать JSON на составные можно, запихав данные в элемент типа текст сторонним скриптом (либо в 4.0 появился HTTP agent, позволяющий распарсить JSON из ответа по HTTP), потом из него создать несколько зависимых элементов с помощью сцепления операций препроцессинга результата этого JSON, указывая вначале JSON Path, а дальше писать триггеры и прочее.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы