Zabbix

Мониторинг Postfix в Zabbix 7.4: очередь, deferred, SMTP и systemd

Нормальный мониторинг Postfix в Zabbix должен показывать не только «процесс запущен», но и реальную доставку: размер очереди, deferred/hold, возраст самого старого письма, доступность SMTP и состояние диска. Ниже — рабочий вариант для Zabbix Agent 2 и Postfix 3.1+ с postqueue -j.

1. Проверяем Postfix и Agent 2

postconf mail_version
postqueue -j | head
systemctl status postfix zabbix-agent2 --no-pager
zabbix_agent2 -V

Если postqueue -j не поддерживается, у вас старый Postfix — для него нужен другой парсер. JSON-вывод доступен начиная с Postfix 3.1.

2. Устанавливаем jq для разбора JSON

# Debian/Ubuntu
apt update && apt install jq

# RHEL/Alma/Rocky
dnf install jq

3. Создаём скрипт метрик Postfix

Создайте /usr/local/bin/postfix-zabbix-metrics:

#!/bin/bash
set -euo pipefail

metric="${1:-}"

case "$metric" in
  total)
    postqueue -j 2>/dev/null | wc -l
    ;;
  deferred)
    postqueue -j 2>/dev/null | jq -s '[.[] | select(.queue_name == "deferred")] | length'
    ;;
  hold)
    postqueue -j 2>/dev/null | jq -s '[.[] | select(.queue_name == "hold")] | length'
    ;;
  oldest)
    postqueue -j 2>/dev/null | jq -s 'if length == 0 then 0 else (now - ([.[].arrival_time] | min) | floor) end'
    ;;
  *)
    echo "Usage: $0 {total|deferred|hold|oldest}" >&2
    exit 1
    ;;
esac
chmod 755 /usr/local/bin/postfix-zabbix-metrics
/usr/local/bin/postfix-zabbix-metrics total
/usr/local/bin/postfix-zabbix-metrics deferred
/usr/local/bin/postfix-zabbix-metrics oldest

oldest возвращает возраст самого старого сообщения в секундах. Пустая очередь возвращает 0.

4. Проверяем скрипт от пользователя zabbix

sudo -u zabbix /usr/local/bin/postfix-zabbix-metrics total
sudo -u zabbix /usr/local/bin/postfix-zabbix-metrics deferred

Если обычный пользователь не может выполнить postqueue, сначала проверьте права и пакет Postfix. Не запускайте весь Zabbix Agent 2 от root только ради этой метрики.

5. Добавляем UserParameter

Создайте /etc/zabbix/zabbix_agent2.d/postfix.conf:

UserParameter=postfix.queue.total,/usr/local/bin/postfix-zabbix-metrics total
UserParameter=postfix.queue.deferred,/usr/local/bin/postfix-zabbix-metrics deferred
UserParameter=postfix.queue.hold,/usr/local/bin/postfix-zabbix-metrics hold
UserParameter=postfix.queue.oldest,/usr/local/bin/postfix-zabbix-metrics oldest

6. Перезагружаем Agent 2 и тестируем ключи

systemctl restart zabbix-agent2
systemctl status zabbix-agent2 --no-pager

zabbix_agent2 -t postfix.queue.total
zabbix_agent2 -t postfix.queue.deferred
zabbix_agent2 -t postfix.queue.hold
zabbix_agent2 -t postfix.queue.oldest

Каждый тест должен возвращать числовое значение без ZBX_NOTSUPPORTED.

7. Создаём items в Zabbix

  • postfix.queue.total — Numeric unsigned, интервал 60 секунд;
  • postfix.queue.deferred — Numeric unsigned, 60 секунд;
  • postfix.queue.hold — Numeric unsigned, 60–300 секунд;
  • postfix.queue.oldest — Numeric unsigned, units s, 60 секунд.

Для больших relay интервал и пороги увеличьте под реальную нагрузку.

8. Состояние postfix.service без собственного скрипта

Zabbix Agent 2 умеет читать systemd. Создайте item:

systemd.unit.info[postfix.service,ActiveState]

Нормальное значение — active. Также можно использовать systemd discovery, если хотите обнаруживать сервисы автоматически.

9. Проверяем SMTP с Zabbix server/proxy

На хосте создайте simple check:

net.tcp.service[smtp,,25]

Он возвращает 1, если SMTP отвечает, и 0 при недоступности. Это полезнее локального systemctl, потому что проверка идёт со стороны Zabbix server/proxy и замечает сетевые проблемы.

10. Проверяем submission-порт

Для TCP-доступности 587:

net.tcp.service[tcp,,587]

Такая проверка подтверждает, что порт доступен, но не проверяет SMTP AUTH. Для полноценного end-to-end теста лучше отдельный внешний скрипт/сценарий с тестовой учёткой.

11. Проверяем spool и inode

postconf queue_directory
df -h /var/spool/postfix
df -i /var/spool/postfix

В Zabbix используйте стандартные filesystem items для раздела, где находится queue_directory. Не привязывайтесь к /var/spool/postfix, если postconf queue_directory показывает другой путь.

12. Практичные triggers

  • Postfix ActiveState не active — High;
  • net.tcp.service[smtp,,25]=0 — High;
  • deferred выше обычного уровня 10–15 минут — Warning;
  • возраст старейшего письма выше SLA, например 3600 секунд — High;
  • queue total резко выше baseline — Warning;
  • свободное место менее 15% — Warning, менее 5% — High.

13. Ручная диагностика при срабатывании

postqueue -p
postqueue -j | jq -s 'group_by(.queue_name) | map({queue:.[0].queue_name,count:length})'
journalctl -u postfix --since '30 min ago' --no-pager | tail -n 300
df -h
df -i

Критерий хорошего мониторинга: Zabbix замечает остановку сервиса, недоступность SMTP, рост deferred и старение писем до того, как пользователи начинают спрашивать, куда пропала почта.

Добавить комментарий

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