Как грамотно распарсить JSON в Zabbix?

Ссылка скопирована
1 ответ

По вводным: в Zabbix получаю json вида:

Spoiler

{ "ipv6nat": { "type": "info", "container": "ipv6nat", "state": "running", "started_at": "2025-09-09T02:25:48.597063398Z", "image": "robbertkl/ipv6nat" }, "watchdog": { "type": "info", "container": "watchdog", "state": "running", "started_at": "2025-09-09T02:25:49.034715898Z", "image": "ghcr.io/watchdog:2.08" }, "acme": { "type": "info", "container": "acme", "state": "running", "started_at": "2025-09-09T02:25:49.410248064Z", "image": "ghcr.io/acme:1.93" }, "nginx": { "type": "info", "container": "nginx", "state": "running", "started_at": "2025-09-09T02:25:49.325908002Z", "image": "ghcr.io/nginx:1.03" }, "rspamd": { "type": "info", "container": "rspamd", "state": "running", "started_at": "2025-09-09T02:43:16.428571722Z", "image": "ghcr.io/rspamd:2.2" }, "ofelia": { "type": "info", "container": "ofelia", "state": "running", "started_at": "2025-09-09T02:25:49.047098625Z", "image": "mcuadros/ofelia:latest" }, "dovecot": { "type": "info", "container": "dovecot", "state": "running", "started_at": "2025-09-09T02:25:49.397769582Z", "image": "ghcr.io/dovecot:2.34" }, "php-fpm": { "type": "info", "container": "php-fpm", "state": "running", "started_at": "2025-09-09T02:25:49.207584334Z", "image": "ghcr.io/phpfpm:1.93" }, "postfix": { "type": "info", "container": "postfix", "state": "running", "started_at": "2025-09-09T02:25:49.203080147Z", "image": "ghcr.io/postfix:1.80" }, "clamd": { "type": "info", "container": "clamd", "state": "running", "started_at": "2025-09-09T02:25:49.014354072Z", "image": "ghcr.io/clamd:1.70" }, "redis": { "type": "info", "container": "redis", "state": "running", "started_at": "2025-09-09T02:25:49.228263805Z", "image": "redis:7.4.2-alpine" }, "mysql": { "type": "info", "container": "mysql", "state": "running", "started_at": "2025-09-09T02:25:48.915980879Z", "image": "mariadb:10.11" }, "memcached": { "type": "info", "container": "memcached", "state": "running", "started_at": "2025-09-09T02:25:49.279423323Z", "image": "memcached:alpine" }, "unbound": { "type": "info", "container": "unbound", "state": "running", "started_at": "2025-09-09T02:25:49.07675022Z", "image": "ghcr.io/unbound:1.24" }, "olefy": { "type": "info", "container": "olefy", "state": "running", "started_at": "2025-09-09T02:25:49.269785294Z", "image": "ghcr.io/olefy:1.15" }, "netfilter": { "type": "info", "container": "netfilter", "state": "running", "started_at": "2025-09-09T02:25:48.593228646Z", "image": "ghcr.io/netfilter:1.61" }, "sogo": { "type": "info", "container": "sogo", "state": "running", "started_at": "2025-09-09T02:25:49.011224165Z", "image": "ghcr.io/sogo:1.133" }, "dockerapi": { "type": "info", "container": "dockerapi", "state": "running", "started_at": "2025-09-09T02:25:49.082004656Z", "image": "ghcr.io/dockerapi:2.11" } }

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Мария Код Ответ

В Zabbix JSON обычно парсят через preprocessing item: JSONPath, JavaScript preprocessing или dependent items. Правильный подход зависит от того, что приходит в master item. Сначала сохраните сырой JSON как master item, а уже из него делайте dependent items для отдельных полей. Так вы не будете дергать API много раз.

Пример: master item получает JSON:

{"status":"ok","metrics":{"cpu":42,"memory":71},"items":[{"name":"web","value":1}]}

{"status":"ok","metrics":{"cpu":42,"memory":71},"items":[{"name":"web","value":1}]}

Для поля CPU в preprocessing используйте JSONPath:

$.metrics.cpu

$.metrics.cpu

Для первого элемента массива:

$.items[0].value

$.items[0].value

Если структура сложная или нужно найти объект по имени, иногда проще JavaScript preprocessing:

const data = JSON.parse(value);
const item = data.items.find(x => x.name === 'web');
return item ? item.value : 0;

const data = JSON.parse(value); const item = data.items.find(x => x.name === 'web'); return item ? item.value : 0;

  • master item должен хранить сырой ответ API;
  • dependent items вытаскивают конкретные значения;
  • для массивов используйте JSONPath или JS;
  • для динамического набора объектов используйте LLD discovery;
  • всегда проверяйте preprocessing через Test, а не сразу на проде.

Если Zabbix пишет, что JSONPath ничего не нашел, проверьте реальный JSON: иногда API возвращает строку с JSON внутри строки, другой root-объект или HTML-ошибку вместо JSON. В таком случае сначала добавьте шаг проверки/JavaScript, который выбросит понятную ошибку.

Для discovery нужен отдельный LLD item, который возвращает массив объектов с макросами. Например, {#NAME} и {#ID}. Потом item prototypes используют эти макросы. Не пытайтесь создать сотни отдельных items вручную, если JSON содержит список однотипных сущностей.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно