3. Что такое {$USER_MACROS}?
Макрос — это символьное имя в шаблонах, заменяемое при
обработке препроцессором на последовательность символов
Это – переменные, которые способны хранить различную
информацию
• пороги срабатывания для триггеров
• различные фильтры
• учетные данные
• …..
Макросы определяются на нескольких уровнях, более локальный
перекрывает предыдущий
ГЛОБАЛЬНЫЙ МАКРОС
{$PROC_NUM} = 200
МАКРОС УРОВНЯ
ШАБЛОНА
{$PROC_NUM} = 300
МАКРОС УРОВНЯ УЗЛА
СЕТИ
{$PROC_NUM} = 500
4. Фиксированные пороговые значения в
шаблонах
{Template OS: system.cpu.load[percpu,avg1].avg(5m)}>5
{Template OS: vm.memory.size[available].last(0)}<20M
{Template OS: proc.num[].avg(5m)}>300
Разные серверы могут иметь разные пороговые значения для таких
элементов, как загрузка процессора, объем свободной памяти,
количество процессов и т.д.
5. Динамические пороги в шаблонах
Используйте {$USER_MACROS} в качестве порогового
значения для таких элементов данных как загрузка CPU,
размер свободной памяти, количества процессов и т.д.
{Template OS: system.cpu.load[percpu,avg1].avg(5m)}>{$CPU_LOAD}
{Template OS: vm.memory.size[available].last(0)}<{$MEMORY_FREE}
{Template OS: proc.num[].avg(5m)}>{$PROC_NUM}
6. {$PROC_NUM} = 300
{$PROC_NUM} = 300
Обычный узел сети
Сильно нагруженный узел сети
Менее загруженный узел сети
МАКРОС УРОВНЯ ШАБЛОНА
{$PROC_NUM} = 300
{$PROC_NUM} = 500
{$PROC_NUM} = 300
{$PROC_NUM} = 200
МАКРОС УРОВНЯ УЗЛА СЕТИ
Динамические пороги в шаблонах
7. Фиксированные номера портов в
шаблонах
Одинаковые сервисы могут использовать
различные номера портов tcp
{Template OS: net.tcp.service[ssh,22]
{Template OS: net.tcp.service[http,80]
{Template OS: net.tcp.service[https,443]
8. Динамические номера портов в шаблонах
Используйте {$USER_MACROS} как номер порта для tcp/udp соединений ssh,
http, https и других служб
{Template OS: net.tcp.service[ssh,{$SSH_PORT}]
{Template OS: net.tcp.service[http,{$HTTP_PORT}]
{Template OS: net.tcp.service[https,{$HTTPS_PORT}]
9. {$HTTP_PORT} = 80
{$HTTP_PORT} = 80
Обычный узел сети
Нестандартный узел сети 1
Нестандартный узел сети 2
{$HTTP_PORT} = 80
{$HTTP_PORT} = 8080
{$HTTP_PORT} = 80
{$HTTP_PORT} = 8000
МАКРОС УРОВНЯ ШАБЛОНА МАКРОС УРОВНЯ УЗЛА СЕТИ
Динамические номера портов в шаблонах
10. Фиксированные пороги для элементов данных LLD
(Правил Низкоуровневого Обнаружения)
Разные точки монтирования имеют различный размер, и следовательно
пороговые значения для предупреждения о их заполненности отличаются
• /boot малый размер 100M
• / средний размер 10G
• /data большой размер 1TB
11. Используйте контекст для макросов в пороговых
значениях для элементов данных LLD
Разные точки монтирования имеют различный размер, поэтому используйте
контекст макросов в выражениях триггеров
• /boot малый размер {$LOW_SPACE:”/boot”}
• / средний размер {$LOW_SPACE:”/”}
• /data большой размер {$LOW_SPACE:”/data”}
{host:vfs.fs.size[{#FSNAME},free].last()} < {$LOW_SPACE:"{#FSNAME}"}
Может также использоваться для имен дисков Windows
13. Разный набор служб на разных серверах
Разные серверы имеют разные сервисы, которые необходимо отслеживать
• Сервер 1 DHCP client, Windows defender
• Сервер 2 DHCP client, Windows defender, MS Exchange
• Сервер 3 DHCP client, RDP Service, RPC
Использовать только @Global regular expressions неудобно и сложно,
ведь возможных комбинаций очень много
14. {$SERVICES} = none
{$SERVICES} = none
Обычный узел сети
Узел сети со службами exchange
Узел сети со службами Tomcat и WSUS
{$SERVICES} = none
{$SERVICES}= (exchange)
{$SERVICES} =none
{$SERVICES}=
(Tomcat|WSUS)
@SERVICES = (DNS Client|DHCP
Client)
ГЛОБАЛЬНОЕ
РЕГУЛЯРНОЕ
ВЫРАЖЕНИЕ
OR
OR
OR
@SERVICE
S
@SERVICE
S
@SERVICE
S
МАКРОС УРОВНЯ ШАБЛОНА
МАКРОС УРОВНЯ УЗЛА
СЕТИ
Используйте комбинацию {$USER_MACROS} и
@global regular expressions
16. Разные клиенты используют разные
учетные данные
• Разные клиенты используют разные учетные данные
• для пароля SNMPv2
• для SNMPv3 логина и пароля
• для учетных данных SSH
• для учетных данных веб-сайта
Теоретически, вы можете просто клонировать шаблон для каждого клиента, но
потом вам придется управлять этим множеством шаблонов
17. {$SNMP_COMMUNITY} =
public
{$SNMP_COMMUNITY} =
public
{$SNMP_COMMUNITY} =
secret1
Узел сети клиента 1
Шаблон Клиент 1
{$SNMP_COMMUNITY} =
secret2
Шаблон Клиент 2
Шаблон SNMP
Узел сети клиента 2
ШАБЛОНЫ
{$SNMP_COMMUNITY} =
secret2
{$SNMP_COMMUNITY} =
secret1
{$SNMP_COMMUNITY} =
public
Разные клиенты используют разные
учетные данные
20. Нужно делить или умножать значения
• Конвертация Байтов в Биты
• Конвертация Битов в Байты
• Конвертация миллисекунд в секунды
• ….
Вы можете задать единицы измерения для удобного отображения информации, но что если
вы хотите хранить преобразованные данные?
21. Используйте шаг предварительной обработки –
пользовательский множитель
Конвертируйте байты в биты используя множитель 8
Конвертируйте биты в байты используя множитель 0.125
В последних версиях Zabbix для этого используется новая вкладка
«Предобработка»
22. Вам нужно извлечь числовые данные из
отчёта
• Память в Linux
• Отчет о свободном пространстве Linux
• Любой отчет, содержащий числовые данные
23. Извлекаем число из текста
Извлекайте данные при помощи шаблонов PCRE REGEX
Полученные данные могут быть обработаны на следующих шагах
24. Необходимо преобразовать двоичные текстовые
данные в десятичные
• systemctl возвращает состояние служб как enabled или disabled
• Мы хотим хранить состояние в виде 1 или 0 для простых триггерных функций
или для визуализации в графиках
25. Используйте регулярные выражения
systemctl list-unit-files | grep postfix
База данных Zabbix
Совпадение по шаблону regex
postfix.service
Преобразование логического
значения в десятичное
enabled disabled
true false
y n
yes no
On off
up down
1 01 0
28. Требуется извлечь всю числовую информацию
из текста
• Использование памяти в Linux, отчет о свободном пространстве или любой
другой отчет, который содержит числовые данные
• Используя обычные элементы данных нам потребуется 9(!) проверок чтобы
собрать всю информацию
• Это дополнительный сетевой трафик и использование процессора на узле
сети.
29. Используйте зависимые элементы данных
system.run[free]
База данных Zabbix
used free shared buffertotal available
Основной элемент
данных собирающий
текстовый тип
информации
Зависимые элементы
данных с числовым
типом информации
Исходные данные
30. Соберите все информацию с помощью обычного текстового элемента данных:
Используйте зависимые элементы данных
Создайте зависимые элементы данных для каждого значения используя
предварительную обработку регулярными выражениями:
32. Мониторинг репликации MySQL базы данных
Использование ODBC элементов данных означает сбор данных в несколько
подходов, а это значит дополнительный трафик, использование CPU и
несколько подключений к базе данных.
MariaDB [(none)]> show slave status G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master2-bin.000001
Read_Master_Log_Pos: 926945751
Relay_Log_File: master1-relay-bin.000002
Relay_Log_Pos: 207526
Relay_Master_Log_File: master2-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
33. Используйте запросы SQL и зависимые
элементы данных
MySQL: show slave status;
возвращено несколько метрик
SLAVE STATUS
Relay log pos
Seconds behind
master
Relay log file
База данных Zabbix
35. Необходимо собрать погодные данные для
вашего местоположения
• Хотите получить данные о температуре, влажности, скорости ветра
• Можно использовать собственный curl скрипт, но в итоге его логика может
заметно усложниться
36. Используйте OpenWeatherMap API и
предобработку JSON
Запрос get с параметрами
Ответ в виде JSON от API
HTTP Agent
JSON Data
Предобработка
Путь JSON
Температура
Влажность
Скорость ветра
Зависимые элементы
данных
База данных
Zabbix
OpenWeatherMap
41. Необходимо настроить обнаружение
пользовательских SNMP метрик
• Многообразие моделей принтеров
• Хотите узнать все параметры принтера
• Расходники
• Лотки для бумаги
• Количество отпечатанных страниц
• Уровень чернил
42. Используйте обнаружение SNMP
правилах LLD
Описание
.1.3.6.1.2.1.43.11.1.1.6.{#SNMPINDEX}
Объем картриджа .1.3.6.1.2.1.43.8.2.1.8
Описание картриджа .1.3.6.1.2.1.43.11.1.1.6
Объем картриджа
.1.3.6.1.2.1.43.11.1.1.8.{#SNMPINDEX}
Уровень картриджа
.1.3.6.1.2.1.43.11.1.1.9.{#SNMPINDEX}
Уровень картриджа .1.3.6.1.2.1.43.8.2.1.9
Картриджи
discovery[{#SNMPVALUE},.1.3.6.1.2.1.43.11.1.1
.6]
ПРОТОТИП ЭЛЕМЕНТА ДАННЫХПРАВИЛО ОБНАРУЖЕНИЯ
44. Проверка доступности удаленного порта на других узлах сети
Server 1 Port 1111
Server 2 Port 2222
Server 3 Port 3333
Server 4 Port 4444
Server 5 Port 5555
• Используется ключ net.tcp.port
• Множество серверов и портов
• Каждый агент имеет свой список
серверов для проверки
45. Используйте собственный скрипт для LLD
• Простой bash скрипт будет работать из коробки на большинстве платформ
• Использует {$USER_MACRO} во входных данных, возвращает JSON объект
47. Все данные точек доступа собираются на контроллере
Точка доступа 1
Точка доступа 2
Точка доступа 3
Точка доступа 4
• WLAN контроллер возвращает все SNMP данные по каждой точке доступа
• Точки доступа используются разными клиентами
50. Данные все еще собираются из WLC и
фильтруются по актуальной точке
Используйте фильтры LLD чтобы отфильтровать данные только по конкретной точке доступа
51. Результат – узлы сети, автоматически
созданные для каждой точки доступа
52. Преимущества использования
прототипов узла сети
• Управляются Zabbix внутренним механизмом LLD
• Добавляются по необходимости
• Автоматически удаляются или изменяются
• Шаблоны и группы назначаются автоматически
• Группы узлов сети могут генерироваться динамически из макросов LLD
• Можно ограничить доступ только к части данных с использованием групп узлов и
групп пользователей.
53. Работа объемных LLD правил
в нестабильных средах
• Мы хотим обнаруживать и мониторить лог файлы
• Набор логов изменяется каждые сутки, но момент времени изменения
нам не известен
• Список логов большой и обработка полученного JSON накладна по
ресурсам – мы не можем запускать правило часто
Можно написать скрипт, определяющий изменения конфигурации и если
таковые есть он отправит готовый JSON при помощи zabbix_sender.
Запускать скрипт по расписанию.
Но что, если у нас нет возможности использовать локальный планировщик?
54. Троттлинг
Мы будем обрабатывать значение только в случае его изменения
Основные элементы данных
Это уменьшит объем входных
данных, если они в основном
статичны
Элемент данных правила LLD
Это позволит уменьшить
интервал опроса для LLD правила
и позволит быстрее реагировать
на изменения в конфигурации не
нагружая при этом сервер
56. JSON в LLD правилах
• RAID контроллер возвращает данные обо всех массивах и дисках
• На разных контроллерах используется разное количество дисков
• Мы хотим отслеживать состояние и производительность всех дисков
60. Предобработка в правилах LLD
• Используйте Путь Json или регулярное выражение чтобы без пользовательских скриптов привести
правило к JSON для LLD. LLD макросы завершат эту задачу
• Если нужна логика сложнее, например условные проверки или циклы – вы можете написать
JavaScript для предобработки правила
• Проверьте на ошибки – совпадает ли с шаблоном регулярного выражения и нет ли ошибок в JSON
объекте
• Троттлинг
62. Подавление оповещений
• Конечные устройства подключены через разные коммутаторы
• Можно использовать Зависимость триггеров, но это может оказаться что
устройств за каждым коммутатором множество
• Если устройство будет перемещено за другой коммутатор, придется
изменить и связи триггеров
63. Используйте глобальную корреляцию
событий на основе тегов
Макрос {$SWITCH.IP} генерируется API скриптом на основе ARP таблиц,
которые собираются Zabbix с коммутатора
Тэг SWITCH_IP= {HOST.IP}
Тэг DEVICE_TYPE = SWITCH
Тэг SWITCH_IP = {$SWITCH.IP}
Тэг DEVICE_TYPE = END_DEVICE
Тэг SWITCH_IP = {$SWITCH.IP}
Тэг DEVICE_TYPE = END_DEVICE
Тэг SWITCH_IP = {$SWITCH.IP}
Тэг DEVICE_TYPE = END_DEVICE
Тэг SWITCH_IP = {$SWITCH.IP}
Тэг DEVICE_TYPE = END_DEVICE
Зависимость
триггеров
Корреляция
событий
Тэг SWITCH_IP = {$SWITCH.IP}
Тэг DEVICE_TYPE = END_DEVICE
Тэг SWITCH_IP= {HOST.IP}
Тэг DEVICE_TYPE = SWITCH