Привет, Хабр! Меня зовут Максим, я главный системный администратор. Сегодня мы поговорим о боли, знакомой каждому, кто работает с мониторингом: об усталости от алертов. О том самом звонке в 3 часа ночи из‑за службы, которая упала и сама же поднялась. О сотне писем «Host down» после падения одного магистрального коммутатора. Это не просто раздражает — это прямой путь к выгоранию команды и пропущенным реальным инцидентам.

«Шумные» алерты — это не особенность Zabbix, а симптом его неправильного использования. По умолчанию Zabbix, как и любой мощный инструмент, требует тонкой настройки. Без нее он превращается в генератор информационного мусора, который обесценивает саму идею мониторинга. Проблема в том, что постоянный поток нерелевантных уведомлений притупляет бдительность. Инженеры начинают игнорировать оповещения, что катастрофически увеличивает время реакции на настоящие сбои (MTTA/MTTR) и, как следствие, время восстановления сервиса (RTO). Это уже не операционная проблема, а прямой бизнес‑риск.

В этой статье мы построим многоуровневую систему защиты от «шума» в Zabbix. Мы пройдем путь от базовых, но критически важных техник, до продвинутых сценариев автоматизации. Мы научим Zabbix отличать кратковременный всплеск от реальной проблемы, понимать топологию вашей сети, коррелировать несвязанные на первый взгляд события и даже предсказывать проблемы до их возникновения. Финалом будет настройка надежного канала оповещений в Telegram и пример автоматического «самолечения» системы. Никакой теории — только практика, конфиги и команды, готовые к внедрению в прод.

Проблема: Смерть от тысячи оповещений (Alert Fatigue)

Прежде чем строить защиту, нужно четко определить врага. «Информационный шум» в мониторинге — это не монолитное понятие. Он состоит из нескольких ключевых компонентов, каждый из которых требует своего подхода.

  1. Ложные срабатывания (False Positives). Это самый частый и самый изматывающий тип шума. Триггер срабатывает на событие, которое не является проблемой и не требует вмешательства. Классический пример: место на диске колеблется в районе порогового значения 90% из‑за создания и удаления временных файлов. В результате вы получаете постоянную «гирлянду» из сообщений PROBLEM/OK, хотя реальной угрозы исчерпания места нет.

  2. Избыточные уведомления (Redundant Notifications). Это знаменитый «шторм алертов». Когда выходит из строя корневой элемент инфраструктуры (например, коммутатор агрегации или маршрутизатор), Zabbix регистрирует недоступность не только самого устройства, но и всех зависимых от него хостов. В итоге на одну реальную проблему (отказ коммутатора) вы получаете десятки или сотни уведомлений о недоступности серверов, которые на самом деле в полном порядке.

  3. Сверхчувствительные триггеры (Over‑sensitive Triggers). Это алерты на легитимные, но не требующие немедленной реакции события. Самый яркий пример — уведомления о перезапуске служб после плановой перезагрузки сервера. Да, служба была перезапущена, но это ожидаемое поведение, а не инцидент. Такие алерты забивают почту и мессенджеры, отвлекая от действительно важных событий.

Борьба с этими тремя «всадниками апокалипсиса» — это не просто улучшение качества жизни инженера. Это переход от реактивной модели мониторинга («что‑то сломалось») к проактивной («что‑то может сломаться») и, в конечном итоге, к созданию интеллектуальной системы, которая сообщает только о реальных, требующих внимания инцидентах.

Арсенал Zabbix для борьбы с шумом: Обзор стратегий

Чтобы победить шум, мы применим комплексный подход, выстраивая эшелонированную оборону. Каждый следующий уровень будет решать более сложную задачу, превращая наш Zabbix из «сигнализации» в «аналитический центр». Эту структуру можно рассматривать как своего рода модель зрелости системы мониторинга:

  • Уровень 1: Гистерезис. Наш первый и главный инструмент против «дребезга» (flapping). Мы научим триггеры иметь два порога: один для фиксации проблемы, другой — для ее решения. Это базовый фильтр, отсекающий кратковременные колебания метрик.

  • Уровень 2: Зависимости триггеров. Здесь мы научим Zabbix понимать причинно‑следственные связи в нашей инфраструктуре. Вместо того чтобы видеть плоский список хостов, Zabbix начнет воспринимать логическую топологию. Это позволит подавлять симптомы и фокусироваться на первопричине.

  • Уровень 3: Глобальная корреляция событий. Это переход к сложной логике. Мы сможем связывать события от совершенно разных триггеров, основываясь на тегах. Это позволит нам реализовать сценарии, недоступные для простых зависимостей, например, подавлять алерты о службах во время перезагрузки хоста.

  • Уровень 4: Проактивное реагирование и автоматизация. Высший пилотаж. Мы будем не просто реагировать на проблемы, а предсказывать их с помощью функции timeleft и автоматически устранять некоторые из них с помощью удаленных команд, реализуя концепцию «самовосстанавливающейся» инфраструктуры.

Пройдя все четыре уровня, мы получим систему мониторинга, которая уважает наше время и внимание.

Уровень 1: Триггеры, которые не "флапают" — Гистерезис на практике

Что такое "дребезг" (flapping) и почему он опасен

«Дребезг» или «флаппинг» — это быстрое, многократное переключение триггера между состояниями PROBLEM и OK. Рассмотрим канонический пример: мониторинг свободного места на диске.

Допустим, у нас есть триггер, который срабатывает, когда занятое место превышает 90%. last(/MyServer/vfs.fs.size[/,pused]) > 90

Теперь представим ситуацию: некий процесс создает временные файлы, из‑за чего использование диска подскакивает до 91%. Zabbix отправляет алерт «PROBLEM». Через минуту процесс удаляет файлы, использование падает до 89%. Zabbix отправляет алерт «OK». Этот цикл может повторяться десятки раз в час. В результате дежурный инженер получает шквал бесполезных уведомлений, и когда место на диске действительно начнет заканчиваться, он может проигнорировать критически важное сообщение, приняв его за очередной «флап».

Решение "в лоб" (и почему оно плохое)

Первая мысль, которая приходит в голову — «усреднить» значение за период. Например, использовать функцию min():

min(/MyServer/vfs.fs.size[/,pused],5m) > 90

Этот триггер сработает, только если занятое место стабильно держалось выше 90% в течение 5 минут. Это действительно отсечет кратковременные всплески и отложит алерт. Но проблему «дребезга» при восстановлении это не решает. Как только значение хотя бы раз опустится ниже 90, триггер перейдет в состояние OK, и при следующем всплеске снова сгенерирует PROBLEM. Мы лишь сделали «флапы» более редкими, но не избавились от них.

Внедряем гистерезис: два порога для ума

Правильное решение — гистерезис. Это принцип, при котором у системы есть два разных порога для перехода в состояние «проблема» и для возврата в «норму». В Zabbix это можно реализовать двумя способами.

Современный способ: Recovery expression

Начиная с Zabbix 3.2, появился специальный, элегантный способ настройки гистерезиса. В конфигурации триггера мы задаем два выражения:

  • Problem expression: Условие, при котором возникает проблема. last(/MyServer/vfs.fs.size[/,pused]) > 90

  • Recovery expression: Условие, при котором проблема считается решенной. last(/MyServer/vfs.fs.size[/,pused]) < 85

Теперь логика работы триггера выглядит так:

  1. Проблема возникает, когда занятое место превышает 90%.

  2. Проблема считается решенной, только когда занятое место опускается ниже 85%.

Если значение колеблется между 86% и 89%, триггер будет оставаться в состоянии PROBLEM, не генерируя лишних уведомлений. Это и есть правильная борьба с «дребезгом».

Классический способ: макрос {TRIGGER.VALUE}

В старых версиях Zabbix или для понимания «подкапотной» механики можно использовать более сложную конструкцию в одном поле Expression. Она использует макрос {TRIGGER.VALUE}, который равен 0 для состояния OK и 1 для PROBLEM.

({TRIGGER.VALUE}=0 and last(/MyServer/vfs.fs.size[/,pused])>90) or ({TRIGGER.VALUE}=1 and last(/MyServer/vfs.fs.size[/,pused])>85)

Разберем эту логику:

  • ({TRIGGER.VALUE}=0 and last(...)>90): Если триггер сейчас в состоянии OK ({TRIGGER.VALUE}=0), он перейдет в PROBLEM, как только значение превысит 90.

  • or ({TRIGGER.VALUE}=1 and last(...)>85): Если триггер уже в состоянии PROBLEM ({TRIGGER.VALUE}=1), он останется в этом состоянии до тех пор, пока значение не опустится до 85 или ниже.

Хотя этот метод работает, он менее читабелен и сложнее в поддержке, чем современный Recovery expression.  

Тип триггера

Выражение

Поведение при 91%

Поведение при 89%

Недостатки

Наивный

last(...) > 90

PROBLEM

OK

Сильный "дребезг" (flapping)

С задержкой

min(..., 5m) > 90

PROBLEM (с задержкой)

OK

Не решает проблему "дребезга" при восстановлении

С гистерезисом

Problem: last(...) > 90 Recovery: last(...) < 85

PROBLEM

PROBLEM (до <85%)

Отсутствуют, является лучшей практикой

Уровень 2: Поиск первопричины с помощью зависимостей триггеров

Мы научились бороться с шумом на уровне одной метрики. Теперь поднимемся на уровень инфраструктуры. Зависимости триггеров — это механизм, который позволяет Zabbix понимать топологию вашей сети и сервисов, превращая его из простого сборщика метрик в инструмент для базового анализа первопричин (root cause analysis).

Классический сценарий "сервер за роутером"

Представим типичную архитектуру: есть центральный маршрутизатор (Router1), за ним находится коммутатор филиала (Switch1), к которому подключен сервер (Server1).  

Zabbix -> Router1 -> Switch1 -> Server1

Если Router1 становится недоступен, Zabbix перестанет получать ответы по ICMP от всех трех устройств. Без настроенных зависимостей вы получите три алерта:

  1. PROBLEM: Router1 is unreachable

  2. PROBLEM: Switch1 is unreachable

  3. PROBLEM: Server1 is unreachable

Это классический пример «шторма алертов». Реальная проблема одна, а уведомлений — три. Зависимости позволяют нам задать логическую цепочку: доступность Server1 зависит от Switch1, а доступность Switch1 — от Router1.

Пошаговая настройка в Zabbix

Настройка интуитивно понятна. Рассмотрим на примере Server1 и Switch1.

  1. Перейдите в Configuration -> Hosts, выберите Server1 и откройте его триггеры.

  2. Откройте триггер, отвечающий за недоступность сервера (например, "Unavailable by ICMP ping").

  3. Перейдите на вкладку Dependencies.

  4. Нажмите Add и выберите триггер, от которого он зависит — в нашем случае, "Unavailable by ICMP ping" для хоста Switch1.

  5. Сохраните изменения.

Теперь, если триггер для Switch1 перейдет в состояние PROBLEM, Zabbix не будет менять состояние зависимого триггера для Server1 и, соответственно, не будет отправлять по нему уведомление. В списке проблем вы увидите только первопричину, а у зависимых проблем появится иконка, указывающая на подавление.  

Продвинутый паттерн: борьба со "штормом восстановления"

Зависимости отлично работают при падении, но могут создать проблему при восстановлении. Представим, что Router1 снова онлайн. Zabbix получает от него успешный ICMP‑ответ, и триггер «Router1 is unreachable» тут же переходит в состояние OK. В этот самый момент зависимость снимается. Но Zabbix еще не успел опросить Switch1 и Server1! Их триггеры все еще считают, что хосты недоступны. В результате, на короткий промежуток времени, Zabbix генерирует алерты для Switch1 и Server1, и только при следующем цикле опроса закрывает их. Мы получаем «шторм восстановления».

Решение — добавить гистерезис на родительский триггер, чтобы он не так быстро переходил в состояние OK.

Для триггера «Router1 is unreachable» настроим:

  • Problem expression: max(/Router1/icmpping,#3)=0 (проблема, если 3 пинга подряд неудачны)

  • Recovery expression: min(/Router1/icmpping,#2)=1 (восстановление, если 2 пинга подряд удачны)

Такая конфигурация заставит Zabbix убедиться, что связь с Router1 действительно стабильна, прежде чем снимать зависимость. Этой небольшой задержки обычно хватает, чтобы зависимые хосты успели «молча» восстановиться, не генерируя лишних алертов.

Уровень 3: Глобальная корреляция для сложных сценариев

Зависимости отлично подходят для статических, иерархических связей «устройство‑за‑устройством». Но что, если связь между событиями не топологическая, а логическая? Например, как связать событие из лога с падением производительности? Для этого в Zabbix существует более мощный, но и более сложный механизм — глобальная корреляция событий. Она работает на основе тегов, позволяя создавать правила для событий от любых триггеров в системе.

Практический кейс: подавление алертов о перезапуске служб после перезагрузки сервера

Это одна из самых частых причин «шума» в Windows‑инфраструктурах. Сервер планово перезагружается, и Zabbix засыпает нас алертами «Service X has been restarted» для десятков служб. С помощью глобальной корреляции мы можем научить Zabbix понимать контекст этих перезапусков.

Шаг 1: Тегирование события перезагрузки

Сначала нам нужно идентифицировать сам факт перезагрузки. Для этого используем стандартный триггер из шаблона «Windows by Zabbix agent» — System uptime is less than 10 minutes.

  1. Откройте этот триггер (или его прототип в правиле обнаружения).

  2. Перейдите на вкладку Tags.

  3. Создайте новый тег:

    • Tag: Scope

    • Value: Reboot

Теперь каждое событие, сгенерированное этим триггером, будет помечено как произошедшее в контексте перезагрузки.

Шаг 2: Создание правила корреляции

Теперь создадим правило, которое будет использовать этот тег.

  1. Перейдите в Data collection -> Event correlation.

  2. Нажмите Create event correlation.

  3. Задайте имя, например, "Suppress service alerts on reboot".

  4. В блоке Conditions создайте два условия с типом вычисления And:

    • New event condition: Trigger name contains service has been restarted

    • New event condition: New event has tag Scope with value Reboot

  5. В блоке Operations выберите Close new event.

  6. Сохраните правило.

Настройка правила глобальной корреляции в Zabbix
Настройка правила глобальной корреляции в Zabbix

Как это работает: Теперь, когда возникает новое событие «service has been restarted», Zabbix проверяет его по этому правилу. Если у этого события есть тег Scope:Reboot (который оно «унаследует» от активного в данный момент события о перезагрузке), то условие срабатывает, и Zabbix немедленно закрывает это новое событие, не давая ему дойти до отправки уведомлений.

Этот подход превращает Zabbix в систему, способную понимать состояние. Он выходит за рамки простой логики «если‑то» и позволяет создавать сложные сценарии, основанные на контексте происходящего. Этот же паттерн можно применить для множества других задач: например, связать ошибку в логе приложения с ростом загрузки CPU или падением числа транзакций в базе данных.

Уровень 4: Проактивное реагирование и автоматическое восстановление

Мы научили Zabbix быть умным и не беспокоить нас по пустякам. Теперь сделаем его проактивным и научим решать некоторые проблемы самостоятельно.

Предсказание проблем с функцией timeleft

Стандартный триггер на нехватку места на диске срабатывает, когда проблема уже наступила. Но Zabbix умеет предсказывать будущее. Функция timeleft анализирует динамику изменения метрики и вычисляет, через какое время она достигнет заданного порога.  

Создадим триггер, который сработает, если свободное место на диске закончится менее чем через 24 часа.

  • Expression: timeleft(/MyServer/vfs.fs.size[/,free],1d,0) < 1d

Разберем выражение:

  • timeleft(...): Название функции.

  • /MyServer/vfs.fs.size[/,free]: Элемент данных, который мы анализируем (свободное место).

  • 1d: Период истории для анализа (последние сутки). Zabbix построит тренд на основе этих данных.

  • 0: Пороговое значение, которого мы ожидаем достичь (0 байт свободного места).

  • < 1d: Условие срабатывания. Триггер сработает, если вычисленное время до достижения порога меньше 1 дня (86400 секунд).

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

Автоматическое восстановление служб (Auto-remediation)

Некоторые проблемы не требуют сложного анализа и могут быть решены автоматически. Классический пример — упавшая служба, которую достаточно просто перезапустить. Zabbix может сделать это за нас.

Шаг 1: Разрешение удаленных команд на агенте

На целевом Windows-хосте, где нужно перезапускать службу, откройте конфигурационный файл Zabbix агента (zabbix_agentd.conf или zabbix_agent2.conf) и добавьте или раскомментируйте строку:

AllowKey=system.run[*]

Внимание: Этот параметр разрешает Zabbix серверу выполнять любые команды на агенте. Используйте его с осторожностью и только в доверенных сетях.

После изменения не забудьте перезапустить службу Zabbix Agent.

Шаг 2: Тегирование триггера службы

Нам нужно передать имя упавшей службы в скрипт восстановления. Для этого мы снова используем теги.

  1. В шаблоне «Windows by Zabbix agent» перейдите к прототипам триггеров в правиле обнаружения "Windows service discovery".

  2. Откройте прототип триггера {#SERVICE.NAME} ({#SERVICE.DISPLAYNAME}): service is not running.

  3. На вкладке Tags добавьте новый тег:

Это действие автоматически добавит тег с системным именем службы ко всем триггерам, созданным этим прототипом.

Шаг 3: Создание скрипта восстановления

  1. В интерфейсе Zabbix перейдите в Alerts -> Scripts.

  2. Нажмите Create script.

  3. Заполните поля:

    • Name: Restart Windows Service

    • Execute on: Zabbix agent

    • Commands: net start "{EVENT.TAGS.servicename}"

Макрос {EVENT.TAGS.servicename} будет автоматически заменен на системное имя службы из тега события.

Шаг 4: Создание действия (Action)

  1. Перейдите в Alerts -> Actions -> Trigger actions.

  2. Нажмите Create action.

  3. Задайте имя, например, "Auto-restart Windows services".

  4. На вкладке Conditions задайте условие, по которому будет срабатывать действие, например:

    • Trigger name contains service is not running

  5. Перейдите на вкладку Operations.

  6. В блоке Operations нажмите Add.

  7. В поле Operation выберите созданный нами скрипт Restart Windows Service.

  8. В поле Target list выберите Current host. Это критически важно, чтобы команда выполнялась только на том хосте, где произошла проблема.

  9. Сохраните операцию и действие.

Теперь, как только Zabbix зафиксирует остановку службы, он автоматически выполнит на целевом хосте команду net start "имя_службы", пытаясь восстановить ее работу.  

Канал доставки: Настраиваем Telegram Webhook по-взрослому

Когда алерты стали умными и редкими, каждый из них заслуживает внимания. Доставим их в удобный и надежный канал — Telegram. Мы будем использовать официальный, интегрированный в Zabbix механизм Webhook, который проще и надежнее старых внешних скриптов.  

Шаг 1: Создание бота и получение учетных данных

  1. Получаем токен бота:

    • Откройте Telegram и найдите бота @BotFather.

    • Отправьте ему команду /newbot.

    • Следуйте инструкциям, чтобы задать имя и username для вашего бота.

    • В конце @BotFather выдаст вам токен вида 1234567890:ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789. Сохраните его, это секрет.

  2. Получаем ID чата:

    • Чтобы отправлять сообщения себе, найдите в Telegram бота @myidbot и отправьте ему команду /getid. Он вернет ваш числовой Chat ID.

    • Чтобы отправлять в групповой чат, добавьте @myidbot в группу и отправьте команду /getgroupid@myidbot.

    • Важно: После создания бота, найдите его в поиске и отправьте ему команду /start. Без этого бот не сможет вам писать.  

Шаг 2: Импорт и настройка Media Type в Zabbix

  1. Скачайте официальный шаблон media_telegram.yaml с Git-репозитория Zabbix или со страницы интеграций на официальном сайте. Убедитесь, что версия шаблона соответствует вашей версии Zabbix.  

  2. В интерфейсе Zabbix перейдите в Alerts -> Media types.

  3. Нажмите Import и загрузите скачанный файл.

  4. В списке появится новый Media Type "Telegram". Откройте его для редактирования.

  5. На вкладке Parameters вам нужно установить два ключевых параметра:

    • api_token: Вставьте сюда токен, который вы получили от @BotFather.

    • api_parse_mode: Установите значение Markdown или HTML, чтобы использовать форматирование в сообщениях. Markdown обычно удобнее.

  6. Убедитесь, что Media Type включен (галочка Enabled) и сохраните изменения.  

Шаг 3: Назначение способа оповещения пользователю

  1. Перейдите в Users -> Users, откройте своего пользователя (или создайте специального пользователя-бота).

  2. Перейдите на вкладку Media.

  3. Нажмите Add.

    • Type: Выберите Telegram.

    • Send to: Вставьте сюда Chat ID, полученный от @myidbot.

    • Настройте расписание и уровни серьезности, для которых будут приходить уведомления.

  4. Сохраните изменения.

Шаг 4: Кастомизация сообщений

Чтобы сообщения были информативными, настроим шаблоны. Перейдите в Alerts -> Media types, откройте Telegram и перейдите на вкладку Message templates.

Создайте шаблоны для разных типов событий. Вот хороший стартовый набор:

Problem:

*Problem:* {EVENT.NAME}

*Host:* {HOST.NAME}
*Severity:* {EVENT.SEVERITY}
*Time:* {EVENT.TIME} on {EVENT.DATE}

*Details:*
{ITEM.NAME}: {ITEM.VALUE}

*Event ID:* {EVENT.ID}

Problem recovery:

*Resolved:* {EVENT.NAME}

*Host:* {HOST.NAME}
*Severity:* {EVENT.SEVERITY}
*Recovery Time:* {EVENT.RECOVERY.TIME} on {EVENT.RECOVERY.DATE}
*Duration:* {EVENT.DURATION}

*Event ID:* {EVENT.ID}

Теперь ваши уведомления в Telegram будут структурированными и легко читаемыми.

Практика: Как безопасно тестировать триггеры в своей песочнице

Внедрение сложной логики триггеров, зависимостей и корреляций в продакшн без тестирования — плохая идея. Нам нужен способ безопасно симулировать любые условия и проверять, как система на них реагирует. Этот подход можно рассматривать как своего рода «юнит‑тестирование» для конфигурации мониторинга.

Шаг 1: Создание "виртуального" сенсора с помощью Zabbix Trapper

Zabbix Trapper — это тип элемента данных, который не опрашивается сервером активно, а пассивно ждет, пока ему пришлют данные извне. Это идеальный инструмент для наших тестов.  

  1. Создайте новый хост с именем Test.Triggers.Sandbox. Интерфейс ему не нужен.

  2. На этом хосте создайте новый элемент данных (Item):

    • Name: Test Trigger Value

    • Type: Zabbix trapper

    • Key: test.trigger.value

    • Type of information: Numeric (unsigned)

  3. Создайте на этом же хосте триггер для тестирования:

    • Name: Test Trigger

    • Severity: High

    • Expression: last(/Test.Triggers.Sandbox/test.trigger.value)=1

    • Recovery expression: last(/Test.Triggers.Sandbox/test.trigger.value)=0

Шаг 2: Использование zabbix_sender для симуляции любых условий

zabbix_sender — это консольная утилита, которая позволяет отправлять данные в элементы типа Zabbix Trapper. Она входит в стандартный пакет zabbix-agent или может быть установлена отдельно (zabbix-sender).  

Теперь мы можем управлять состоянием нашего тестового триггера из командной строки.

Чтобы перевести триггер в состояние PROBLEM: Выполните на любом сервере, где установлен zabbix_sender:

Bash

zabbix_sender -z <IP_ВАШЕГО_ZABBIX_СЕРВЕРА> -s "Test.Triggers.Sandbox" -k "test.trigger.value" -o 1

Через несколько секунд триггер сработает, и вы должны увидеть проблему в интерфейсе и получить уведомление (если настроили действие для этого триггера).

Чтобы перевести триггер в состояние OK:

Bash

zabbix_sender -z <IP_ВАШЕГО_ZABBIX_СЕРВЕРА> -s "Test.Triggers.Sandbox" -k "test.trigger.value" -o 0

Проблема закроется.

С помощью этого простого механизма вы можете тестировать любые сценарии:

  • Проверка зависимостей: Сделайте ваш основной триггер зависимым от тестового. Активируйте тестовый триггер и убедитесь, что основной не срабатывает.

  • Тестирование корреляции: Отправьте 1 в test.trigger.value, чтобы симулировать перезагрузку (если вы настроили тегирование на тестовом триггере), а затем симулируйте алерт от службы и проверьте, что он корректно закрывается.

  • Отладка оповещений: Проверяйте, как выглядят сообщения в Telegram, меняя шаблоны и отправляя тестовые алерты.

Этот подход позволяет вам отладить самые сложные цепочки логики в безопасной "песочнице", не затрагивая реальные хосты и не создавая мусора в истории их метрик.  

Заключение

Мы прошли большой путь: от хаоса «шумных» алертов до выстраивания интеллектуальной, многоуровневой системы мониторинга. Мы вооружили Zabbix гистерезисом для борьбы с «дребезгом», научили его понимать топологию сети через зависимости, внедрили сложную логику с помощью глобальной корреляции и даже сделали первые шаги к проактивному и самовосстанавливающемуся мониторингу.

Ключевая мысль, которую стоит вынести из этой статьи: Zabbix — это не просто «смотрелка» за графиками, а мощный фреймворк для автоматизации реакции на инциденты. Правильная его настройка — это инвестиция, которая многократно окупается за счет сэкономленного времени инженеров, снижения риска человеческой ошибки и, в конечном счете, повышения стабильности всей IT‑инфраструктуры.

Надеюсь, представленные здесь практические рецепты помогут вам укротить ваш собственный шторм алертов и сделать Zabbix настоящим помощником, а не источником стресса.

А теперь вопросы к вам, коллеги:

  • Какие еще нетривиальные сценарии корреляции событий вы используете в своем Zabbix?

  • Сталкивались ли вы с другими «слепыми зонами» в стандартных шаблонах и как их решали?

  • Какие кастомные скрипты или webhook'и для оповещений (кроме Telegram) вы считаете незаменимыми в своей работе?

Делитесь своим опытом в комментариях! Возможно, в следующей статье разберем продвинутую настройку производительности Zabbix или построение сложных дашбордов для визуальной корреляции данных.

Комментарии (0)


  1. Nem427
    17.09.2025 17:01

    Давайте сделаем несколько дополнений, чтобы начинающие мониторинговоды сразу делали хорошо

    0 Если у вас ещё нет zabbix, то ставьте свежую версию. Не надо слушать старших "товарищей", про то что в 4й версии есть группы элементов, это удобно.

    1 скачивать медиа агент телеграмма не надо, он есть в комплекте начиная с 6.0 версии

    2 Захардкоженные значения в триггерах плохо аукнуться. Причём скоро. Все захардкоженные значения хорошо бы заменить на макросы (тем, кто не знаком с zabbix поясним, что макрос - это переменная, которой можно задать и перезадать значение). А в некоторых случаях, таких как диски, нужны не просто макросы, а аж контекстные макросы.
    Ваш пример из статьи
    min(/MyServer/vfs.fs.size[/,pused],5m) > 90
    в идеальном zabbix должен выглядеть как

    min(/MyServer/vfs.fs.size[/,pused],{$VFS.FS.PUSED.MAX.CRIT.TIME:"{#FSNAME}"}) > {$VFS.FS.PUSED.MAX.CRIT:"{#FSNAME}"}

    Хотя на самом деле нет. Такие триггеры необходимо делать в шаболонах, и ни в коем случае не на узлах, поэтому

    min(/MyTemplate/vfs.fs.size[/,pused],{$VFS.FS.PUSED.MAX.CRIT.TIME:"{#FSNAME}"}) > {$VFS.FS.PUSED.MAX.CRIT:"{#FSNAME}"}

    с выражением восстановления

    max(/MyTemplate/vfs.fs.size[/,pused],{$VFS.FS.PUSED.MAX.CRIT.RECOVERY.TIME:"{#FSNAME}"}) < {$VFS.FS.PUSED.MAX.CRIT.RECOVERY:"{#FSNAME}"}

    Хотя на самом деле нет ) В триггере с диском хорошо бы учесть не только процентное заполнение, но и абсолютное.

    Хотя на самом деле нет )) В триггере с диском хорошо бы учесть ещё и прогноз по времени окончания места на диске. На человеческом языке триггер будет звучать как

    места меньше 90% или меньше 15GB или место закончится менее чем через сутки

    Это сильно усложняет читабельность и написание выражений, но такой подход позволит информировать администратора о разных порогах на разных дисках/разделах, например при 90% занятого места на системном разделе и при 99% на стотеррабайтном разделе бэкап хранилки.

    3 При настройке корреляции следует быть бдительным и внимательным. Внимательным и бдительным. А так же проявлять особую внимательность и бдительность. Некорректная настрока корреляции приведет к автоматическому закрытию событий, которые закрывать не следовало бы.
    Пример в статье не совпадает со скриншотом, но скриншот тоже представляет интерес (не удаляйте). На скриншоте пример с тегом Application=ABC работает когда у вас один единственный сервер с таким тегом. А если их несколько, то перезагрузка одного сервера с тегом Application=ABC приведёт к тому, что корреляция закроет события на другом сервере с тегом Application=ABC. Например штатно и планово перезагружая один веб сервер с тегом Application=Apache вы не узнаете, что у вас упал apache на другом веб сервере.

    4

    Зависимости триггеров — это механизм, который позволяет Zabbix понимать топологию вашей сети и сервисов

    Не должно быть иллюзии, что Zabbix за вас сделает root cause. Наоборот, это вы, проведя анализ зависимостей в своей инфраструктуре, верно настраиваете зависимости в мониторинге

    6 По сути Вы верно рассказываете про ложные сработки, дребезг, шторм сообщений. Это и есть одна из базовых задач мониторинга. Спасибо огромное вам за статью


  1. mumische
    17.09.2025 17:01

    Я насколько помню, с зависимыми триггерами есть тонкость, связанная с таймингами - надо постараться делать так, чтобы зависимые триггеры не срабатывали раньше того, от которого они зависят. Вообще имхо это было прекрасно реализовано в нагиосе - зависимости хостов, а не триггеров (которые дискавери сотни генерирует, попробуй тут настрой зависимости), проверка родительского триггера перед сменой состояния дочернего...


  1. D34DM0R0Z
    17.09.2025 17:01

    Большое спасибо за статью!

    Есть ещё одна, на мой взгляд, хорошая практика из личного опыта: слать алерты от разных триггеров в разные чаты (например, в подгруппы в чате мониторинга), разделив их тегами. Я сетевик, поэтому расскажу со своей точки зрения. Типов алертов у сетевого оборудования выделено несколько:

    1) Доступность. Сюда отправляются алерты про недоступность сетевых (и не только) железок по ICMP/SNMP.

    2) Состояние. Сюда отправляются алерты про превышение нормы по температурным показателям, утилизации ЦП/ОЗУ, изменение состояния блоков питания, изменение состояния OSPF- и BGP-соседей у маршрутизаторов и прочее, не связанное с доступностью.

    3) Сетевые интерфейсы. Сюда приходят алерты про падение интерфейсов, росте счётчика ошибок на них, затуханиях на оптических линках или повышенной утилизации в плане скорости. Эта подгруппа замьючена, так как триггеры там могут быть частыми. И в ней, в моём случае, полезно видеть и флапы. В то же время, позволяет увидеть, почему именно пришли алерты из других подгрупп (какие именно линки упали).

    4) Аутентификация. Сюда сообщения пишутся уже не заббиксом (так сложилось). Фиксируются попытки входа в интерфейс управления: удачные (беззвучно) и неудачные (со звуком) на основании журналов сетевого оборудования и других систем.

    Также, можно выведены в отдельные подгруппы, триггеры от ИБП и БРП, систем климатического контроля, серверов, гипервизоров и прочего.

    В итоге чат с мониторингом один, но в него могут смотреть разные подразделения, отвечающие за разные вещи: инфраструктурщики замьютили для себя все чаты, связанные с состоянием сетевого железа, но всё равно могут увидеть, что их сервак перестал отвечать из-за того, что недоступен коммутатор. Мы же, в свою очередь, не слышим алертов о перезапуске серверов и виртуальных машин, но также, в случае чего, можем увидеть, что сайт недоступен именно из-за перезапуска сервера, а не из-за падения сетевой связности.