Дошли руки до мониторинга MS SQL 2019 в Zabbix. Некоторые читатели жаловались, что у них 2019 SQL не работал со старым шаблоном для 2014 сервера. Очень странно, я попробовал, почти всё поднялось. Почти, но не всё. Пришлось, как обычно, немного переделать. Потом ещё немного переделать. Потом вообще всё переделать.
Получился шаблон для мониторинга Microsoft SQL Server 2012 - 2019 в Zabbix 5. Проверял на 2019 сервере, но теоретически должно работать и на более ранних версиях. В процессе работы были объединены два шаблона: мониторинг основных показателей MSSQL и мониторинг Jobs.
Исходные шаблоны:
Zabbix шаблон для мониторинга Microsoft SQL Server 2014
Zabbix шаблон для мониторинга Jobs у Microsoft SQL Server 2014
В шаблоне 8 приложений, 72 элемента данных и 23 триггера. Плюс 32 прототипа элементов данных и 15 прототипов триггеров.
В пятом заббиксе есть уже встроенный шаблон для мониторинга MSSQL. Но он требует установки Microsoft ODBC driver. Ещё в нём придётся светить логин-пароль от MSSQL. В моём случае для получения данных используются скрипты PowerShell, пароль указывается в скриптах. В этом случае можно не светить пароль в сервере Zabbix.
ВНИМАНИЕ: шаблон для английской версии MSSQL, там названия счётчиков производительности по-английски. Если у вас русская версия, то вам нужно или установить английский вариант счётчиков, или перевести мой шаблон.
Установка и модификация шаблона
Скачиваем zbx5-mssql.zip.
Папку со скриптами PowerShell копируем в C:\zabbix\scripts. Папку с файлом пользовательских переменных копируем в C:\zabbix\zabbix_agent2.conf.d. Папку подключаем в конфигурационном файле агента Zabbix. Вы можете использовать и другие пути, но тогда вам нужно будет отредактировать файл конфигурации.
Импортируем шаблон zbx5-mssql.xml.
Модифицируем файлы mssql_basename.ps1 и mssql_jobs.ps1. Прописываем пользователя и пароль для доступа к базе данных.
Если используется интегрированная проверка подлинности, то можно тоже отредактировать скрипт. Скрипт мониторит инстанс по умолчанию, если нужно мониторить именованный инстанс, то следует модифицировать строку подключения. Также скрипт не рассчитан на мониторинг нескольких инстансов на одном сервере, но если очень хочется, то можно создать копии скриптов, добавить новые пользовательские переменные и продублировать шаблон, мне лень писать динамический поиск всех инстансов.
Проверяем, работают ли PowerShell скрипты. По умолчанию они не будут работать.
Разрешаем запуск неподписанных PowerShell скриптов на сервере:
Разрешить запуск скриптов PowerShell
Я разрешаю запуск скриптов через реестр.
Теперь скрипты заработали. Список баз вывелся.
Версия определилась.
Джобы тоже выводятся.
Перезапускаем zabbix agent. Добавляем шаблон хосту с БД.
Модифицируем макросы для тонкой настройки. Макросы можно переопределить для каждого хоста.
Параметры автообнаружения :
- {$SQL_DB_DISCOVERY_PERIOD} — 300. Периодичность автообнаружения баз.
- {$SQL_JOBS_DISCOVERY_PERIOD} — 1h. Периодичность автообнаружения джобов.
- {$SQL_DB_DISCOVERY_REGEXP}. Регулярное выражение со списком баз, которые не нужно обнаруживать.
-
^(master|model|msdb|ReportServer|ReportServerTempDB|tempdb)$
-
- {$SQL_HISTORY_PERIOD} — 30d. Срок хранения истории.
- {$SQL_HOT_REQUEST_PERIOD} — Периодичность опроса. Часто.
- {$SQL_SHORT_REQUEST_PERIOD} — Периодичность опроса. Не очень часто.
- {$SQL_MEDIUM_REQUEST_PERIOD} — Периодичность опроса. Средняя.
- {$SQL_LONG_REQUEST_PERIOD} — Периодичность опроса. Очень редко.
- {$SQL_TREND_PERIOD} — 180d. Срок хранения трендов.
- {$SQL_THROTTLING_HB_PERIOD} — 6h. Троттлинг для списка инстансов, чтобы не хранить много лишнего в базе. Можно увеличить.
Параметры сервера:
- {$SQL_SERVICE_REQUEST_PERIOD} — Периодичность опроса служб.
- {$SQL_TCP_PORT} — 1433. Порт MSSQL, для триггера.
Параметры Buffer Manager:
- {$SQL_BUFFER_HIT_RATIO_HIGH} — 2. Процент Buffer Manager: Buffer cache hit ratio для триггера HIGH.
- {$SQL_BUFFER_HIT_RATIO_WARNING} — 4. Процент Buffer Manager: Buffer cache hit ratio для триггера WARNING.
- {$SQL_BUFFER_LAZY_WR_SEC_MAX} — 2000. Максимальное значение Buffer Manager: Lazy writes/sec для триггера.
- {$SQL_BUFFER_PAGE_R_SEC_MAX} — 25000. Максимальное значение Buffer Manager: Page reads/sec для триггера.
- {$SQL_BUFFER_PAGE_WR_SEC_MAX} — 25000. Максимальное значение Buffer Manager: Page writes/sec для триггера.
- {$SQL_BUFFER_STALL_SEC_MAX} — 100. Максимальное значение Buffer Manager: Free list stalls/sec для триггера.
Параметры Databases:
- {$SQL_DB_LOG_FWT_MAX} — 3000. Максимальное время (мс) SQLServer:Databases: Log Flush Wait Time для триггера.
- {$SQL_DB_LOG_FW_SEC_MAX} — 3000. Максимальное количество SQLServer:Databases: Log Flush Waits/sec для триггера.
Параметры статистики:
- {$SQL_STAT_LOCKS_AWT_MAX} — 20000. Максимальное среднее время ожидания блокировок Locks: Average Wait Time (Total) для триггера.
- {$SQL_STAT_LOCKS_REQUESTS_SEC_MAX} — 900000. Максимальное количество блокировок в секунду Locks: Lock Requests/sec (Total) для триггера.
- {$SQL_STAT_LOCKS_TIMEOUTS_SEC_MAX} — 3000. Максимальный таймаут блокировок Locks: Lock Timeouts/sec (Total) для триггера.
- {$SQL_STAT_WORK_FILES_MAX} — 3000. Максимальное количество новых рабочих файлов в секунду Access Methods: Work files created/sec для триггера.
- {$SQL_STAT_WORK_TABLES_MAX} — 1000. Максимальное количество новых рабочих таблиц в секунду Access Methods: Work tables created/sec для триггера.
Свои элементы данных
Есть возможность добавлять свои элементы данных. Данный шаблон использует виндовые счётчики производительности, которые ставятся вместе с MSSQL сервером. Но не все. Вы можете добавлять свои, из списка имеющихся. Список счётчиков производительности и объектов можно увидеть здесь: https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/use-sql-server-objects.
К примеру, прототип элемента данных perf_counter["\SQLServer:Databases({#DBNAME})\Active Transactions"] использует счётчик Active Transactions объекта Databases.
Клонируете текущий элемент данных и вписываете из списка требуемый счётчик.
Джобы и триггеры
Система расписания в SQL Server написана индусами и работает по-индусьи. Поэтому насписать универсальное решение для всех вариантов расписаний у меня не поднялась рука. Я написал триггеры для своих конкретных случаев.
- Job {#JOBNAME} Is NOT Enabled
Триггер срабатывает если джоб DISABLED. - Job {#JOBNAME} Is NOT Scheduled
Триггер срабатывает если у джоба нет расписания. - Job {#JOBNAME} Last Run Status NOT Succeeded
Самый полезный триггер, срабатывает когда джоб не выполнился. Есть дополнение, если отредактировать Maintenance Plans, то соответствующие джобы пересоздадутся и триггер сработает, потому как если джоб ни разу не запускался, то и последний запуск у него не succeeded. - Job {#JOBNAME} Last Run was more than a 1 HOUR ago
Для джобов, которые запускаются точно раз в час. - Job {#JOBNAME} Last Run was more than a 2 HOURS ago
Для джобов, которые запускаются точно раз в два часа. - Job {#JOBNAME} Last Run was more than a MONTH ago
Для джобов, которые запускаются точно раз в месяц. Работает также если стоит настройка типа "в последний/первый день месяца". Триггер сработает если джоб не выполнялся 31 день. - Job {#JOBNAME} Last Run was more than a WEEK ago
Для джобов, которые запускаются точно раз в неделю. - Job {#JOBNAME} Last Run was more than ONE DAY ago
Для джобов, которые запускаются точно раз в день.
Для себя вы можете запилить свои триггеры.
Спецсимволы
В названиях джобов у вас могут быть спецсимволы, к примеру, восклицательный знак. В этом случае вы получите ошибку:
Special characters ", ', ", `, *, ?, [, ], {, }, ~, $, !, &, ;, (, ), <, >, |, #, @, 0x0a" are not allowed in the parameters.
В конфиге агента включите параметр UnsafeUserParameters=1.
### Option: UnsafeUserParameters
# Allow all characters to be passed in arguments to user-defined parameters.
# 0 - do not allow
# 1 - allow
#
# Mandatory: no
# Range: 0-1
# Default:
# UnsafeUserParameters=0
UnsafeUserParameters=1
Версии
v.1
Поддержка MSSQL 2014.
v.2
Версия для MSSQL 2019.
v.3
Новое приложение MS SQL DB:
- статус БД
- модель восстановления БД
v.4
Дошли руки добавить поддержку Джобов с пробелами в названии.
v.5
Поддержка Джобов с несколькими шагами. Теперь возвращаются данные не первого шага, а последнего, если этих шагов несколько.
v.6
Поддержка Джобов с несколькими расписаниями. Теперь будет использоваться расписание, дата выполнения которого ближе.
v.7
Исправление для Джобов. Теперь возвращаются данные не последнего шага, а последнего по времени шага. Т.е. того, который либо выполнился последним, либо завершился с ошибкой последним.
Добавлен элемент данных и скрипт к нему, который просто выводит список инстансов на сервере. Элемент информационного характера.
- К нему макрос {$SQL_THROTTLING_HB_PERIOD}
- И скрипт: instances_info.ps1
Добавлены элементы данных и триггеры, которые отслеживают статус зеркалирования. Добавлено в качестве расширения автообнаружения Database Discovery.
v.7.1
Исправление косячных косяков в Джобах, которые я накосячил в версии 7.
v.7.2
Исправление кракозябр при выводе данных на кириллице.