@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 запрос для такого "ЭЛЕМЕНТА ДАННЫХ" или может дело в другом, вдруг я не то читаю или решение совершенно другое...

Если не сложно, опишите в подробностях.
Заранее спасибо!
  • Вопрос задан
  • 153 просмотра
Решения вопроса 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, а дальше писать триггеры и прочее.
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
АЛЬФАСАТКОМ Калуга
от 40 000 до 60 000 руб.
Blogman Оренбург
от 15 000 руб.
Blogman Оренбург
от 20 000 до 110 000 руб.
22 янв. 2019, в 23:42
500 руб./за проект
22 янв. 2019, в 21:11
800 руб./в час
22 янв. 2019, в 20:53
6006 руб./за проект