Мониторинг MS SQL с помощью Proto Observability
На этой странице:
- Сбор метрик MS SQL
- Конфигурация MS SQL
- Драйвер подключения
- Конфигурация ProtoOBP агента
- Проверка
- Собираемые метрики
- Лейблы
- Экземпляр: доступ к данным и буферный кэш
- Память
- Статистика SQL
- Блокировки и защёлки
- Транзакции и хранилище версий
- tempdb
- Сервер и планировщик
- Базы данных
- Файлы баз данных
- Ввод-вывод по файлам
- Индексы и фрагментация
- Размеры таблиц (table_size_metrics)
- AlwaysOn и отказоустойчивый кластер
- Log shipping
- Extended events
- Метрики уровня запросов (dbm)
- Задания SQL Server Agent (dbm)
- Сервисные проверки
- Ключевые метрики для дашбордов и алертов
- Сбор логов MS SQL
Сбор метрик MS SQL
Интеграция sqlserver подключается к MS SQL по обычному wire-протоколу (порт
1433), а не через JMX — поэтому образ агента используется обычный, без
суффикса -jmx. Проверка читает системные представления и DMV
(sys.dm_os_performance_counters, sys.dm_io_virtual_file_stats,
sys.databases, sys.master_files, sys.dm_db_index_usage_stats,
sys.dm_exec_query_stats и др.), поэтому пользователю агента достаточно прав
read-only.
Поддерживаются MS SQL 2012, 2014, 2016, 2017, 2019, 2022 и 2025 (для 2025 требуется агент версии 7.79 и выше).
Часть семейств метрик включается отдельными флагами в блоке database_metrics:
внутри instances::
| Флаг | По умолчанию | Что добавляет |
|---|---|---|
instance_metrics | включён | метрики уровня экземпляра из sys.dm_os_performance_counters (sqlserver_buffer_*, sqlserver_memory_*, sqlserver_stats_* и т.п.) |
db_stats_metrics | включён | состояние и свойства баз данных (sqlserver_database_state, sqlserver_database_is_read_only, …) |
db_files_metrics | включён | размер и состояние файлов БД из sys.database_files |
file_stats_metrics | включён | ввод-вывод по файлам из sys.dm_io_virtual_file_stats (sqlserver_files_*) |
index_usage_metrics | включён | использование индексов из sys.dm_db_index_usage_stats (sqlserver_index_*) |
tempdb_file_space_usage_metrics | включён | использование пространства в tempdb (sqlserver_tempdb_file_space_usage_*) |
db_backup_metrics | включён | sqlserver_database_backup_count |
server_state_metrics | включён | sqlserver_server_* (память, CPU, uptime) |
master_files_metrics | выключен | sqlserver_database_master_files_* из sys.master_files |
db_fragmentation_metrics | выключен | фрагментация индексов из sys.dm_db_index_physical_stats |
table_size_metrics | выключен | размеры и число строк таблиц (sqlserver_table_*) |
ao_metrics | выключен | метрики групп доступности AlwaysOn (sqlserver_ao_*) |
fci_metrics | выключен | метрики отказоустойчивого кластера (sqlserver_fci_*) |
primary_log_shipping_metrics | выключен | sqlserver_log_shipping_primary_* |
secondary_log_shipping_metrics | выключен | sqlserver_log_shipping_secondary_* |
task_scheduler_metrics | выключен | sqlserver_scheduler_*, sqlserver_task_* |
xe_metrics | выключен | метрики сессий extended events (sqlserver_xe_*) |
dbm: true (вне database_metrics) | выключен | сбор метрик уровня SQL-запросов: sqlserver_queries_*, sqlserver_procedures_*, активные сессии, планы выполнения |
Ресурсоёмкие семейства
db_fragmentation_metrics и table_size_metrics выполняют тяжёлые запросы к
sys.dm_db_index_physical_stats и системным представлениям размеров. На больших
базах ограничивайте их через db_fragmentation_object_names, автообнаружение баз
(autodiscovery_include) или увеличенный collection_interval.Конфигурация MS SQL
Режим аутентификации
Убедитесь, что экземпляр MS SQL допускает аутентификацию средствами SQL Server:
Свойства сервера → Безопасность → Проверка подлинности SQL Server и Windows
На Windows-хосте можно вместо логина/пароля использовать доменную
аутентификацию — см. connection_string ниже.
Пользователь для мониторинга
Создайте логин с правами read-only для агента ProtoOBP в базе master:
CREATE LOGIN protoobp WITH PASSWORD = '<PASSWORD>';
USE master;
CREATE USER protoobp FOR LOGIN protoobp;
GRANT SELECT on sys.dm_os_performance_counters to protoobp;
GRANT VIEW SERVER STATE to protoobp;
GRANT CONNECT ANY DATABASE to protoobp;
GRANT CONNECT ANY DATABASE нужен для метрик уровня баз данных (размеры файлов,
состояние, индексы). Для MS SQL 2012 команда GRANT CONNECT ANY DATABASE
недоступна — вместо неё создайте пользователя protoobp в каждой прикладной базе:
USE [<DB_NAME>];
CREATE USER protoobp FOR LOGIN protoobp;
Обратите внимание
Не используйте в пароле специальные символы% @ : ; # & ? = / { } " — это может привести к ошибкам подключения.Дополнительные права
| Что собираем | Требуемое право |
|---|---|
AlwaysOn (ao_metrics) и sys.master_files | GRANT VIEW ANY DEFINITION to protoobp; |
Метрики уровня запросов (dbm: true) | GRANT VIEW SERVER STATE, GRANT VIEW ANY DEFINITION, GRANT CONNECT ANY DATABASE |
| Log shipping и задания SQL Server Agent | пользователь в msdb с ролью db_datareader |
GRANT VIEW ANY DEFINITION to protoobp;
-- Только для log shipping и заданий SQL Server Agent:
USE msdb;
CREATE USER protoobp FOR LOGIN protoobp;
GRANT SELECT to protoobp;
Драйвер подключения
Способ подключения задаётся параметром connector:
connector | Где работает | Дополнительно |
|---|---|---|
adodbapi | только Windows | провайдер выбирается через adoprovider (MSOLEDBSQL19, для версий 18 и ниже — MSOLEDBSQL) |
odbc | Windows и Linux | драйвер указывается в driver (ODBC Driver 18 for SQL Server, FreeTDS, …) |
На Windows-хосте имя драйвера должно совпадать с тем, что зарегистрировано в системе: драйвера по умолчанию у диспетчера ODBC нет.
Выведите список установленных 64-разрядных ODBC-драйверов:
Get-OdbcDriver -Platform 64-bit | Select-Object -ExpandProperty NameЕсли командлет недоступен, тот же список хранится в реестре:
Get-ItemProperty 'HKLM:\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers'Перенесите имя из вывода в параметр
driverпосимвольно — напримерODBC Driver 18 for SQL Server,ODBC Driver 17 for SQL Server,ODBC Driver 11 for SQL ServerилиSQL Server. Подходит любой из уже установленных драйверов, ставить новый нужно только если в системе нет ни одного.Если драйвер требуется установить, выберите версию по версии ОС и обязательно 64-разрядную — 32-разрядные драйверы агент не видит:
Версия Windows Server Максимальная версия Microsoft ODBC Driver for SQL Server 2016 и новее 18 2012 R2 17
Шифрование в ODBC Driver 18
Начиная с версии 18 драйвер по умолчанию требует шифрования соединения и доверенного сертификата сервера. Если сертификат MS SQL самоподписанный, добавьте в конфигурациюconnection_string: "TrustServerCertificate=yes;"
либо используйте драйвер версии 17.На Linux-хосте нужны дополнительные шаги:
- Установите ODBC-драйвер для SQL Server — например, Microsoft ODBC Driver for SQL Server или FreeTDS.
- Скопируйте файлы
odbc.iniиodbcinst.iniв каталог/opt/protoobp-agent/embedded/etc. - В
conf.yamlукажитеconnector: odbcи имя драйвера ровно так, как оно записано вodbcinst.ini.
Провайдер SQLOLEDB
Устаревший провайдерSQLOLEDB (значение adoprovider по умолчанию в старых
версиях) выведен из поддержки Microsoft. Используйте MSOLEDBSQL19 —
предварительно скачав и установив провайдер на хосте с агентом.Конфигурация ProtoOBP агента
Если агент запускается в виде службы на хосте
Создайте файл конфигурации проверки:
- Linux —
/etc/protoobp-agent/conf.d/sqlserver.d/conf.yaml - Windows —
C:\ProgramData\ProtoOBP\conf.d\sqlserver.d\conf.yaml
init_config: instances: - host: "<SQL_HOST>,<SQL_PORT>" username: protoobp password: "<PASSWORD>" # На Linux — только odbc; на Windows доступен также adodbapi. connector: odbc driver: "ODBC Driver 18 for SQL Server" # По умолчанию проверка подключается к master. database: master # Автообнаружение прикладных баз: метрики индексов, файлов и размеров # собираются по каждой найденной базе. database_autodiscovery: true autodiscovery_include: - ".*" database_metrics: master_files_metrics: enabled: true db_fragmentation_metrics: enabled: false table_size_metrics: enabled: false ao_metrics: enabled: false # Включите для метрик уровня SQL-запросов sqlserver_queries_*: # dbm: trueЕсли используется автообнаружение порта, укажите
0в качестве<SQL_PORT>.Для доменной аутентификации на Windows логин и пароль не указываются:
instances: - host: "<SQL_HOST>,<SQL_PORT>" connection_string: "Trusted_Connection=yes"В этом случае подключение выполняется от имени пользователя, под которым работает служба агента.
- Linux —
Перезапустите ProtoOBP агента:
- Linux —
systemctl restart protoobp-agent - Windows — перезапустите службу
ProtoOBP Agent
- Linux —
Выполните проверку работы агента и убедитесь, что в разделе
sqlserverнет ошибок.
Обратите внимание
Для отображения нового хоста СУБД следует обновить страницу браузера целиком (кнопкаОбновить в правом верхнем углу веб-консоли обновляет только значения
метрик на дашборде, но не список серверов).Если агент запускается в виде Docker контейнера
Добавьте autodiscovery-лейблы к Docker контейнеру с MS SQL.
в
docker-compose.yamllabels: com.protoobp.ad.check_names: '["sqlserver"]' com.protoobp.ad.init_configs: "[{}]" com.protoobp.ad.instances: '[{"host": "%%host%%,%%port%%", "username": "protoobp", "password": "<PASSWORD>", "connector": "odbc", "driver": "FreeTDS", "database_autodiscovery": true, "autodiscovery_include": [".*"]}]'или в
DockerfileLABEL "com.protoobp.ad.check_names"='["sqlserver"]' LABEL "com.protoobp.ad.init_configs"='[{}]' LABEL "com.protoobp.ad.instances"='[{"host": "%%host%%,%%port%%", "username": "protoobp", "password": "<PASSWORD>", "connector": "odbc", "driver": "FreeTDS", "database_autodiscovery": true, "autodiscovery_include": [".*"]}]'
Примените изменения лейблов для контейнера с MS SQL (перезапуском контейнера), а также перезапустите контейнер с агентом ProtoOBP.
Выполните проверку работы агента и убедитесь, что в разделе
sqlserverнет ошибок.
Контейнер агента
Контейнер агента должен находиться в той же docker network, что и MS SQL. Также агенту нужен смонтированный/var/run/docker.sock:/var/run/docker.sock:ro
для autodiscovery контейнеров. Образ агента — обычный, без суффикса -jmx.Обратите внимание
Для отображения нового хоста СУБД следует обновить страницу браузера целиком (кнопкаОбновить в правом верхнем углу веб-консоли обновляет только значения
метрик на дашборде, но не список серверов).Проверка
Убедитесь, что проверка запустилась и собирает метрики:
docker exec protoobp-agent agent status | grep -A 12 "sqlserver ("
Для агента, установленного службой на Linux-хосте:
protoobp-agent status | grep -A 12 "sqlserver ("
Ожидаемый вывод — instance со статусом [OK] и ненулевыми Metric Samples:
sqlserver (<ВЕРСИЯ ПРОВЕРКИ>)
-----------------------------
Instance ID: sqlserver:<хеш> [OK]
Configuration Source: file:/etc/protoobp-agent/conf.d/sqlserver.d/conf.yaml
Total Runs: 32
Metric Samples: Last Run: 118, Total: 3,776
Events: Last Run: 0, Total: 0
Service Checks: Last Run: 2, Total: 64
Average Execution Time : 145ms
Полный список собранных серий с тегами:
docker exec protoobp-agent agent check sqlserver
Если в выводе есть строка Instance ID: ... [ERROR], разверните её целиком —
типовые причины: не установлен ODBC-драйвер, не выдан VIEW SERVER STATE,
закрыт порт 1433, отключена аутентификация SQL Server.
Строка Last Successful Execution Date : Never означает, что проверка ни разу
не подключилась к СУБД: метрик не будет, пока ошибка подключения не устранена.
Текст в строке Error | Причина и решение |
|---|---|
IM002 ... Источник данных не найден и не указан драйвер, используемый по умолчанию | Драйвера с указанным в driver именем нет в системе либо он 32-разрядный. Сверьте имя с выводом Get-OdbcDriver — см. Драйвер подключения. |
TCP-connection(ERROR: getaddrinfo failed) | Порт в host отделён двоеточием вместо запятой (localhost:1433 вместо localhost,1433) либо имя узла не разрешается в адрес. |
Login failed for user | Неверные учётные данные либо на экземпляре отключена аутентификация SQL Server. |
Ошибки SSL Provider и шифрования | ODBC Driver 18 for SQL Server требует доверенного сертификата: добавьте connection_string: "TrustServerCertificate=yes;" либо используйте драйвер версии 17. |
Собираемые метрики
Большинство метрик MS SQL имеют тип gauge (мгновенное значение на момент
сбора): счётчики производительности sys.dm_os_performance_counters уже приходят
как «в секунду» или как текущее значение, агент не пересчитывает их. Метрики
типа count (sqlserver_files_*, sqlserver_index_*, sqlserver_queries_*,
sqlserver_procedures_*) — кумулятивные счётчики, монотонно растущие от старта
экземпляра; для дашбордов применяйте PromQL rate(... [5m]).
Лейблы
Общие (на всех метриках)
Добавляются агентом и ProtoOBP backend’ом:
| Лейбл | Значение |
|---|---|
host | Хост, на котором работает агент |
port | Порт MS SQL (1433) |
service | Тег service (через com.protoobp.tags.service или POBP_TAGS) |
env | Тег env |
docker_image | Полный ref образа контейнера |
image_name | Имя образа без тега |
image_tag | Тег образа |
short_image | Короткое имя образа |
Специфичные для MS SQL
| Лейбл | Где появляется | Пример |
|---|---|---|
db | метрики уровня базы данных, файлов, индексов, таблиц | demo |
schema | метрики индексов и фрагментации | dbo |
table | метрики использования индексов | orders |
index_name / index_id | метрики индексов и фрагментации | IX_orders_created_at |
object_name | метрики фрагментации | orders |
logical_name | sqlserver_files_* (логическое имя файла) | demo_log |
file_location | sqlserver_files_*, sqlserver_database_files_* | /var/opt/mssql/data/… |
file_type | sqlserver_database_files_* | ROWS / LOG |
database_state_desc | sqlserver_database_state и связанные | ONLINE |
database_recovery_model_desc | sqlserver_database_state и связанные | FULL |
availability_group, availability_group_name, replica_server_name, replica_role, synchronization_state, failover_mode, availability_mode | метрики AlwaysOn sqlserver_ao_* | — |
failover_cluster, node_name, member_name | sqlserver_fci_*, sqlserver_ao_member_* | — |
scheduler_id, parent_node_id | sqlserver_scheduler_*, sqlserver_task_* | 0 |
session_name | sqlserver_xe_* | protoobp |
query_signature | метрики запросов sqlserver_queries_* (при dbm: true) | 4f2d… |
procedure_name | метрики процедур sqlserver_procedures_* (при dbm: true) | usp_create_order |
user, app, status | метрики активности и соединений при dbm: true | protoobp / .Net SqlClient |
Экземпляр: доступ к данным и буферный кэш
Метрики уровня экземпляра, без лейбла db. Источник — счётчики
производительности (instance_metrics).
| Имя метрики | Тип | Единица | Описание |
|---|---|---|---|
sqlserver_buffer_cache_hit_ratio | gauge | fraction | Доля страниц данных, найденных в буферном кэше, от всех запросов страниц |
sqlserver_buffer_page_life_expectancy | gauge | second | Сколько секунд страница живёт в буферном пуле |
sqlserver_buffer_page_reads | gauge | page/second | Физических чтений страниц в секунду по всем базам |
sqlserver_buffer_page_writes | gauge | page/second | Физических записей страниц в секунду |
sqlserver_buffer_checkpoint_pages | gauge | page/second | Страниц, сброшенных на диск контрольной точкой |
sqlserver_access_full_scans | gauge | operation/second | Полных сканирований (таблицы или индекса) в секунду |
sqlserver_access_range_scans | gauge | operation/second | Диапазонных сканирований по индексам в секунду |
sqlserver_access_probe_scans | gauge | operation/second | Точечных сканирований (поиск не более одной строки) в секунду |
sqlserver_access_index_searches | gauge | operation/second | Поисков по индексу в секунду |
sqlserver_access_page_splits | gauge | operation/second | Разделений страниц в секунду |
sqlserver_cache_object_counts | gauge | object | Число объектов в кэше планов |
sqlserver_cache_pages | gauge | object | Число 8-КБ страниц, занятых объектами кэша планов |
Память
| Имя метрики | Тип | Единица | Описание |
|---|---|---|---|
sqlserver_memory_total_server_memory | gauge | kibibyte | Память, выделенная менеджером памяти сервера |
sqlserver_memory_database_cache | gauge | kibibyte | Память под кэш страниц баз данных |
sqlserver_memory_stolen | gauge | kibibyte | Память, используемая не под страницы БД |
sqlserver_memory_connection | gauge | kibibyte | Память под обслуживание соединений |
sqlserver_memory_lock | gauge | kibibyte | Память под блокировки |
sqlserver_memory_optimizer | gauge | kibibyte | Память под оптимизацию запросов |
sqlserver_memory_sql_cache | gauge | kibibyte | Память под кэш динамического SQL |
sqlserver_memory_log_pool_memory | gauge | kibibyte | Память под Log Pool |
sqlserver_memory_granted_workspace | gauge | kibibyte | Память, выданная выполняющимся операциям (сортировки, хэши, bulk) |
sqlserver_memory_grants_outstanding | gauge | Процессов, получивших грант рабочей памяти | |
sqlserver_memory_memory_grants_pending | gauge | Процессов, ожидающих грант рабочей памяти |
Статистика SQL
| Имя метрики | Тип | Единица | Описание |
|---|---|---|---|
sqlserver_stats_connections | gauge | connection | Число пользовательских соединений. При dbm: true дополнительно размечается лейблами status, db, user |
sqlserver_stats_batch_requests | gauge | request/second | Пакетных запросов в секунду — основной показатель нагрузки |
sqlserver_stats_sql_compilations | gauge | operation/second | Компиляций SQL в секунду |
sqlserver_stats_sql_recompilations | gauge | operation/second | Перекомпиляций SQL в секунду |
sqlserver_stats_auto_param_attempts | gauge | attempt | Попыток автопараметризации в секунду |
sqlserver_stats_safe_auto_param_attempts | gauge | attempt | Безопасных попыток автопараметризации в секунду |
sqlserver_stats_failed_auto_param_attempts | gauge | attempt | Неудачных попыток автопараметризации в секунду |
sqlserver_stats_procs_blocked | gauge | process | Число заблокированных процессов |
sqlserver_stats_lock_waits | gauge | lock/second | Сколько раз в секунду блокировка не была выдана сразу |
Блокировки и защёлки
| Имя метрики | Тип | Единица | Описание |
|---|---|---|---|
sqlserver_locks_deadlocks | gauge | request/second | Запросов блокировок в секунду, приведших к взаимоблокировке |
sqlserver_latches_latch_waits | gauge | request/second | Запросов защёлок, не выданных немедленно |
sqlserver_latches_latch_wait_time | gauge | millisecond | Среднее время ожидания защёлки |
Транзакции и хранилище версий
| Имя метрики | Тип | Единица | Описание |
|---|---|---|---|
sqlserver_transactions_longest_transaction_running_time | gauge | second | Длительность самой старой активной транзакции (только при уровне изоляции read committed snapshot) |
sqlserver_transactions_version_store_size | gauge | kibibyte | Размер хранилища версий строк в tempdb |
sqlserver_transactions_version_generation_rate | gauge | kibibyte/second | Скорость наполнения хранилища версий |
sqlserver_transactions_version_cleanup_rate | gauge | kibibyte/second | Скорость очистки хранилища версий |
tempdb
Требует tempdb_file_space_usage_metrics (включён по умолчанию). Несут лейбл db.
На управляемых облачных СУБД эти метрики не публикуются.
| Имя метрики | Тип | Единица | Описание |
|---|---|---|---|
sqlserver_tempdb_file_space_usage_free_space | gauge | mebibyte | Свободное пространство в файле tempdb |
sqlserver_tempdb_file_space_usage_user_object_space | gauge | mebibyte | Занято пользовательскими объектами |
sqlserver_tempdb_file_space_usage_internal_object_space | gauge | mebibyte | Занято внутренними объектами (сортировки, хэши, курсоры) |
sqlserver_tempdb_file_space_usage_version_store_space | gauge | mebibyte | Занято хранилищем версий строк |
sqlserver_tempdb_file_space_usage_mixed_extent_space | gauge | mebibyte | Занято смешанными экстентами |
Сервер и планировщик
sqlserver_server_* требуют server_state_metrics (включён по умолчанию),
sqlserver_scheduler_* и sqlserver_task_* — task_scheduler_metrics
(выключен по умолчанию).
| Имя метрики | Тип | Единица | Описание |
|---|---|---|---|
sqlserver_server_uptime | gauge | second | Время с последнего перезапуска |
sqlserver_server_cpu_count | gauge | Число логических CPU / vCPU на сервере | |
sqlserver_server_physical_memory | gauge | byte | Общий объём физической памяти машины |
sqlserver_server_virtual_memory | gauge | byte | Виртуальная память, доступная процессу в пользовательском режиме |
sqlserver_server_committed_memory | gauge | byte | Память, зафиксированная менеджером памяти |
sqlserver_server_target_memory | gauge | byte | Целевой объём памяти менеджера памяти |
sqlserver_scheduler_current_tasks_count | gauge | task | Текущих задач на планировщике (лейблы scheduler_id, parent_node_id) |
sqlserver_scheduler_runnable_tasks_count | gauge | task | Задач в очереди готовых к выполнению |
sqlserver_scheduler_work_queue_count | gauge | Задач в очереди ожидания свободного worker’а | |
sqlserver_scheduler_active_workers_count | gauge | worker | Активных worker’ов |
sqlserver_scheduler_current_workers_count | gauge | worker | Всего worker’ов на планировщике |
sqlserver_task_context_switches_count | gauge | Переключений контекста, выполненных задачей | |
sqlserver_task_pending_io_count | gauge | Физических операций ввода-вывода задачи | |
sqlserver_task_pending_io_byte_count | gauge | byte | Суммарный объём ввода-вывода задачи |
sqlserver_task_pending_io_byte_average | gauge | byte | Средний размер операции ввода-вывода задачи |
Базы данных
Несут лейбл db. Счётчики транзакций и журнала берутся из объекта
производительности Databases, состояние — из sys.databases
(db_stats_metrics).
| Имя метрики | Тип | Единица | Описание |
|---|---|---|---|
sqlserver_database_transactions | gauge | transaction | Транзакций в секунду по базе |
sqlserver_database_write_transactions | gauge | transaction | Пишущих зафиксированных транзакций за последнюю секунду |
sqlserver_database_active_transactions | gauge | transaction | Активных транзакций |
sqlserver_database_log_flushes | gauge | flush | Сбросов журнала в секунду |
sqlserver_database_log_bytes_flushed | gauge | byte | Байт журнала сброшено |
sqlserver_database_log_flush_wait | gauge | millisecond | Суммарное ожидание сброса журнала |
sqlserver_database_backup_count | gauge | Число успешных резервных копий базы (db_backup_metrics) | |
sqlserver_database_backup_restore_throughput | gauge | Пропускная способность операций резервного копирования и восстановления | |
sqlserver_database_state | gauge | Состояние базы: 0 = Online, 1 = Restoring, 2 = Recovering, 3 = Recovery_Pending, 4 = Suspect, 5 = Emergency, 6 = Offline, 7 = Copying, 10 = Offline_Secondary | |
sqlserver_database_is_read_only | gauge | 1, если база помечена READ_ONLY | |
sqlserver_database_is_in_standby | gauge | 1, если база доступна только на чтение для восстановления журнала | |
sqlserver_database_is_sync_with_backup | gauge | 1, если база помечена для синхронизации репликации с резервной копией | |
sqlserver_database_user_access | gauge | Режим доступа пользователей к базе (MULTI_USER / SINGLE_USER / RESTRICTED_USER) | |
sqlserver_database_replica_transaction_delay | gauge | millisecond | Задержка подтверждения фиксации транзакций для реплики базы |
sqlserver_replica_transaction_delay | gauge | millisecond | То же на уровне экземпляра |
sqlserver_replica_flow_control_sec | gauge | Число срабатываний flow control за последнюю секунду |
Файлы баз данных
Из sys.database_files (db_files_metrics, включён по умолчанию) и
sys.master_files (master_files_metrics, выключен по умолчанию). Несут лейблы
db, file_id, file_type, file_location, database_files_state_desc.
| Имя метрики | Тип | Единица | Описание |
|---|---|---|---|
sqlserver_database_files_size | gauge | kibibyte | Текущий размер файла базы |
sqlserver_database_files_space_used | gauge | kibibyte | Занятое место внутри файла базы |
sqlserver_database_files_state | gauge | Состояние файла: 0 = Online, 1 = Restoring, 2 = Recovering, 3 = Recovery_Pending, 4 = Suspect, 5 = Unknown, 6 = Offline, 7 = Defunct | |
sqlserver_database_master_files_size | gauge | kibibyte | Размер файла по sys.master_files (требует VIEW ANY DEFINITION) |
sqlserver_database_master_files_state | gauge | Состояние файла по sys.master_files |
Ввод-вывод по файлам
Из sys.dm_io_virtual_file_stats (file_stats_metrics, включён по умолчанию).
Тип count — кумулятивные счётчики, применяйте rate(). Лейблы logical_name,
file_location, db, state.
| Имя метрики | Тип | Единица | Описание |
|---|---|---|---|
sqlserver_files_reads | count | read | Число операций чтения из файла |
sqlserver_files_writes | count | write | Число операций записи в файл |
sqlserver_files_read_bytes | count | byte | Прочитано байт из файла |
sqlserver_files_written_bytes | count | byte | Записано байт в файл |
sqlserver_files_io_stall | count | millisecond | Суммарное ожидание ввода-вывода по файлу |
sqlserver_files_read_io_stall | count | millisecond | Суммарное ожидание чтений по файлу |
sqlserver_files_write_io_stall | count | millisecond | Суммарное ожидание записей по файлу |
sqlserver_files_read_io_stall_queued | count | millisecond | Задержка чтений из-за управления вводом-выводом (IO governance) |
sqlserver_files_write_io_stall_queued | count | millisecond | Задержка записей из-за управления вводом-выводом |
sqlserver_files_size_on_disk | gauge | byte | Занято на диске под этот файл |
Индексы и фрагментация
sqlserver_index_* — из sys.dm_db_index_usage_stats (index_usage_metrics,
включён по умолчанию), тип count. Метрики фрагментации — из
sys.dm_db_index_physical_stats (db_fragmentation_metrics, выключен по
умолчанию). Представление sys.dm_db_index_usage_stats ограничено текущей базой,
поэтому включите database_autodiscovery или задайте database.
| Имя метрики | Тип | Единица | Описание |
|---|---|---|---|
sqlserver_index_user_seeks | count | Поисков по индексу пользовательскими запросами | |
sqlserver_index_user_scans | count | scan | Сканирований без предиката seek |
sqlserver_index_user_lookups | count | Поисков по закладке (bookmark lookup) | |
sqlserver_index_user_updates | count | update | Операций изменения индекса (insert / update / delete) |
sqlserver_database_avg_fragmentation_in_percent | gauge | percent | Логическая фрагментация индекса (или экстентная — для кучи) |
sqlserver_database_fragment_count | gauge | Число фрагментов на листовом уровне | |
sqlserver_database_avg_fragment_size_in_pages | gauge | page | Среднее число страниц в одном фрагменте |
sqlserver_database_index_page_count | gauge | page | Общее число страниц индекса или данных |
Размеры таблиц (table_size_metrics)
Выключено по умолчанию; tempdb не собирается. Лейблы db, schema, table.
| Имя метрики | Тип | Единица | Описание |
|---|---|---|---|
sqlserver_table_row_count | gauge | row | Число строк в таблице |
sqlserver_table_total_size | gauge | kibibyte | Полный размер таблицы (данные + индексы) |
sqlserver_table_used_size | gauge | kibibyte | Занятое место |
sqlserver_table_data_size | gauge | kibibyte | Размер собственно данных |
AlwaysOn и отказоустойчивый кластер
Требуют ao_metrics / fci_metrics и права VIEW ANY DEFINITION.
| Имя метрики | Тип | Единица | Описание |
|---|---|---|---|
sqlserver_ao_ag_sync_health | gauge | Здоровье синхронизации группы доступности: 0 = не здорова, 1 = частично, 2 = здорова | |
sqlserver_ao_replica_sync_state | gauge | Состояние синхронизации реплики: 0 = не синхронизируется, 1 = синхронизируется, 2 = синхронизирована, 3 = откат, 4 = инициализация | |
sqlserver_ao_replica_status | gauge | Статус реплики группы доступности | |
sqlserver_ao_is_primary_replica | gauge | 1 — первичная реплика, 0 — вторичная | |
sqlserver_ao_primary_replica_health | gauge | Здоровье восстановления первичной реплики: 0 = в процессе, 1 = online | |
sqlserver_ao_secondary_replica_health | gauge | Здоровье восстановления вторичной реплики | |
sqlserver_ao_secondary_lag_seconds | gauge | second | Отставание вторичной реплики от первичной |
sqlserver_ao_log_send_queue_size | gauge | byte | Объём журнала первичной базы, не отправленный на вторичные |
sqlserver_ao_log_send_rate | gauge | byte/second | Средняя скорость отправки данных первичной репликой |
sqlserver_ao_redo_queue_size | gauge | byte | Объём журнала на вторичной реплике, ещё не применённый |
sqlserver_ao_redo_rate | gauge | byte/second | Скорость применения журнала на вторичной реплике |
sqlserver_ao_filestream_send_rate | gauge | byte/second | Скорость отправки файлов FILESTREAM на вторичную реплику |
sqlserver_ao_low_water_mark_for_ghosts | gauge | Нижняя граница для очистки «призрачных» записей | |
sqlserver_ao_replica_failover_mode | gauge | Режим отработки отказа: 0 = автоматический, 1 = ручной | |
sqlserver_ao_replica_failover_readiness | gauge | Готовность к отработке отказа: 0 = не готова, 1 = готова | |
sqlserver_ao_quorum_state / sqlserver_ao_quorum_type | gauge | Состояние и тип кворума кластера WSFC | |
sqlserver_ao_member_state / sqlserver_ao_member_type / sqlserver_ao_member_number_of_quorum_votes | gauge | Состояние, тип и число голосов участника кворума | |
sqlserver_fci_status | gauge | Статус узла в отказоустойчивом кластере (лейблы node_name, status, failover_cluster) | |
sqlserver_fci_is_current_owner | gauge | 1, если узел — текущий владелец экземпляра |
Log shipping
Требуют primary_log_shipping_metrics / secondary_log_shipping_metrics и
пользователя в msdb с ролью db_datareader.
| Имя метрики | Тип | Единица | Описание |
|---|---|---|---|
sqlserver_log_shipping_primary_time_since_backup | gauge | second | Секунд с последнего резервного копирования журнала на первичном сервере |
sqlserver_log_shipping_primary_backup_threshold | gauge | second | Порог, после которого формируется оповещение задания |
sqlserver_log_shipping_secondary_time_since_copy | gauge | second | Секунд с последнего копирования на вторичный сервер |
sqlserver_log_shipping_secondary_time_since_restore | gauge | second | Секунд с последнего восстановления на вторичном сервере |
sqlserver_log_shipping_secondary_last_restored_latency | gauge | second | Задержка между созданием копии журнала и её восстановлением |
sqlserver_log_shipping_secondary_restore_threshold | gauge | second | Порог между операциями восстановления |
Extended events
Требуют xe_metrics. Лейбл session_name.
| Имя метрики | Тип | Единица | Описание |
|---|---|---|---|
sqlserver_xe_session_status | gauge | Статус сессии extended events | |
sqlserver_xe_events_not_in_xml | gauge | event | События, отсутствующие в XML-представлении кольцевого буфера |
Метрики уровня запросов (dbm)
Доступны только при dbm: true. Тип count (кумулятивные), несут лейбл
query_signature (нормализованный запрос), а duration.* — user, db, app.
| Имя метрики | Единица | Описание |
|---|---|---|
sqlserver_queries_count | query | Всего выполнений запроса |
sqlserver_queries_time | nanosecond | Суммарное время выполнения |
sqlserver_queries_worker_time | nanosecond | Суммарное потребление CPU |
sqlserver_queries_clr_time | nanosecond | Время внутри объектов CLR |
sqlserver_queries_rows | row | Всего строк возвращено |
sqlserver_queries_logical_reads / _logical_writes | read / write | Логических чтений / записей |
sqlserver_queries_physical_reads | read | Физических чтений |
sqlserver_queries_spills | page | Страниц, «пролитых» на диск при выполнении |
sqlserver_queries_memory_grant / _used_memory_grant / _ideal_memory_grant | byte | Выданная / использованная / идеальная память гранта |
sqlserver_queries_dop | Суммарная степень параллелизма выполнений | |
sqlserver_queries_reserved_threads / _used_threads | thread | Зарезервированных / использованных параллельных потоков |
sqlserver_queries_columnstore_segment_reads / _columnstore_segment_skips | segment | Прочитанных / пропущенных сегментов columnstore |
sqlserver_queries_duration_max / _duration_sum | nanosecond | Возраст самого долгого / сумма возрастов выполняющихся запросов |
Метрики хранимых процедур (лейблы db, procedure_name):
| Имя метрики | Единица | Описание |
|---|---|---|
sqlserver_procedures_count | query | Всего выполнений процедуры |
sqlserver_procedures_time | nanosecond | Суммарное время выполнения |
sqlserver_procedures_worker_time | nanosecond | Суммарное потребление CPU |
sqlserver_procedures_logical_reads / _logical_writes | read / write | Логических чтений / записей |
sqlserver_procedures_physical_reads | read | Физических чтений |
sqlserver_procedures_spills | page | Страниц, «пролитых» на диск |
Помимо метрик, при dbm: true собираются активные сессии, тексты
нормализованных запросов и планы выполнения. Тонкая настройка — параметрами
query_metrics, procedure_metrics, query_activity, collect_settings и
stored_procedure_characters_limit.
Задания SQL Server Agent (dbm)
Требуют dbm: true, agent_jobs.enabled: true и доступа к msdb.
| Имя метрики | Тип | Единица | Описание |
|---|---|---|---|
sqlserver_agent_active_jobs_duration | gauge | second | Длительность выполняющихся заданий |
sqlserver_agent_active_jobs_step_info | gauge | Наличие последнего завершённого шага у выполняющегося задания | |
sqlserver_agent_completed_jobs_duration | gauge | second | Длительность завершённых заданий |
sqlserver_agent_completed_jobs_executions | gauge | execution | Число выполнений завершённых заданий |
Сервисные проверки
| Имя | Описание |
|---|---|
sqlserver.can_connect | CRITICAL, если агент не может подключиться к экземпляру MS SQL; иначе OK |
sqlserver.database.can_connect | CRITICAL, если агент не может подключиться к автообнаруженной базе; иначе OK |
Ключевые метрики для дашбордов и алертов
Доступность экземпляра
- Сервисная проверка
sqlserver.can_connectв состоянииCRITICALлибо отсутствие свежих серий поhost/port— алерт: MS SQL недоступен или агент не может подключиться. sqlserver_database_state != 0по конкретной базе — база не в состоянии Online (Suspect, Recovery_Pending, Offline).sqlserver_server_uptimeрезко уменьшился — экземпляр был перезапущен.
Нагрузка и компиляция
sqlserver_stats_batch_requests— базовая метрика нагрузки; сопоставляйте с временем отклика приложения.sqlserver_stats_sql_compilations / sqlserver_stats_batch_requestsустойчиво выше0.1— много ad-hoc SQL, план не переиспользуется.sqlserver_stats_sql_recompilationsрастёт — перекомпиляции съедают CPU (устаревшая статистика,RECOMPILE, изменения схемы).sqlserver_stats_connectionsблизко к лимиту пула приложения — новые клиенты начнут получать отказы.
Память и кэш
sqlserver_buffer_cache_hit_ratioустойчиво ниже0.95–0.99на OLTP-нагрузке — данные не помещаются в буферный пул.sqlserver_buffer_page_life_expectancyрезко падает (типовой ориентир — 300 секунд на 4 ГБ буферного пула) — вытеснение страниц, нехватка памяти.sqlserver_memory_memory_grants_pending > 0— запросы стоят в очереди за рабочей памятью.sqlserver_memory_total_server_memoryблизко кsqlserver_server_target_memory— менеджер памяти упёрся вmax server memory.
Блокировки
sqlserver_locks_deadlocks > 0— алерт: взаимоблокировки.sqlserver_stats_procs_blockedстабильно> 0— цепочки блокировок.sqlserver_stats_lock_waitsрастёт вместе с временем отклика — конкуренция за строки и страницы.sqlserver_latches_latch_wait_timeвысок — конкуренция за внутренние структуры (часто симптом узкого места вtempdbили в вводе-выводе).
Ввод-вывод
- Средняя задержка файла =
rate(sqlserver_files_io_stall[5m]) / (rate(sqlserver_files_reads[5m]) + rate(sqlserver_files_writes[5m]))— выше 20 мс для файлов данных и выше 5 мс для журнала = узкое место в дисках. rate(sqlserver_files_read_io_stall_queued[5m])заметно больше нуля — срабатывает ограничение ввода-вывода на уровне пула ресурсов.sqlserver_buffer_checkpoint_pagesвсплесками — массовые сбросы страниц.
Журнал транзакций и tempdb
sqlserver_database_log_flush_waitрастёт — узкое место в записи журнала (обычно диск подLOG-файлом).sqlserver_database_files_space_used / sqlserver_database_files_sizeпоfile_type=LOGприближается к1— журнал не усекается (проверьте модель восстановления и резервное копирование журнала).sqlserver_tempdb_file_space_usage_free_spaceпадает, аsqlserver_transactions_version_store_sizeрастёт — долгая транзакция удерживает версии строк.
Транзакции
sqlserver_transactions_longest_transaction_running_timeбольшое — «висящая» транзакция держит блокировки и мешает очистке хранилища версий.sqlserver_database_active_transactionsпо базе аномально высок — всплеск незакрытых транзакций.
Индексы и рост данных
sqlserver_index_user_scansдоминирует надsqlserver_index_user_seeks— запросы идут в сканирование, не хватает подходящих индексов.sqlserver_index_user_updatesвысок при нулевыхuser_seeks/user_scans— индекс только обслуживается, но не используется.sqlserver_database_avg_fragmentation_in_percent > 30 %при большомindex_page_count— кандидат наREBUILD/REORGANIZE.sqlserver_database_files_size,sqlserver_table_total_size— тренд роста для планирования ёмкости.
Резервные копии и AlwaysOn
sqlserver_database_backup_countне растёт по прикладной базе — резервное копирование не выполняется.sqlserver_ao_ag_sync_health < 2илиsqlserver_ao_replica_sync_state != 2— группа доступности рассинхронизирована.sqlserver_ao_secondary_lag_secondsвыше SLA либо растущаяsqlserver_ao_redo_queue_size— вторичная реплика не успевает применять журнал.sqlserver_log_shipping_secondary_time_since_restoreбольшеsqlserver_log_shipping_secondary_restore_threshold— отставание доставки журналов.
Запросы (при dbm: true)
topkпоrate(sqlserver_queries_worker_time[5m])perquery_signature— самые «дорогие» по CPU нормализованные запросы.rate(sqlserver_queries_spills[5m]) > 0— запрос регулярно сбрасывает промежуточные результаты вtempdb.sqlserver_queries_duration_maxperuser/dbбольшое — конкретный пользователь или приложение крутит долгий запрос.
Сбор логов MS SQL
Логи MS SQL собираются ProtoOBP агентом и отправляются в бэкенд ProtoOBP.
Здесь — только специфичные для MS SQL настройки. Включение логов на стороне
агента (logs_enabled, logs_pobp_url) описано в
Получение данных логов.
Куда MS SQL пишет логи
Основной журнал экземпляра — файл ERRORLOG (без расширения), рядом лежат
ротированные ERRORLOG.1, ERRORLOG.2 и т.д.
- Windows —
C:\Program Files\Microsoft SQL Server\MSSQL<версия>.<экземпляр>\MSSQL\Log\ERRORLOG - Linux —
/var/opt/mssql/log/errorlog - Контейнер
mssql/server— тот же/var/opt/mssql/log/errorlog, а также stdout контейнера
На Windows файл ERRORLOG записывается в кодировке UTF-16 LE, поэтому
параметр encoding обязателен — без него записи попадут в ProtoOBP нечитаемыми.
На Linux журнал пишется в UTF-8, encoding не нужен.
Конфигурация ProtoOBP агента
Если агент запускается в виде службы на хосте
Дополните уже существующий файл конфигурации проверки (тот же, в котором лежит
instances: для метрик) блоком logs::
logs:
- type: file
encoding: utf-16-le
path: 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Log\ERRORLOG'
source: sqlserver
service: sqlserver
log_processing_rules:
- type: multi_line
name: log_start_with_date
pattern: \d{4}-\d{2}-\d{2}
На Linux-хосте — без encoding и с другим путём:
logs:
- type: file
path: /var/opt/mssql/log/errorlog
source: sqlserver
service: sqlserver
log_processing_rules:
- type: multi_line
name: log_start_with_date
pattern: \d{4}-\d{2}-\d{2}
Перезапустите агента (systemctl restart protoobp-agent либо перезапуск службы
ProtoOBP Agent на Windows).
Если агент запускается в виде Docker контейнера
Шаг 1 — включите сбор логов в самом агенте через переменные окружения и смонтируйте директорию JSON-логов docker-демона:
services:
protoobp-agent:
environment:
POBP_LOGS_ENABLED: "true"
POBP_LOGS_CONFIG_USE_HTTP: "true"
POBP_LOGS_CONFIG_LOGS_POBP_URL: <protoobp-backend>:<port>
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
# Прямое чтение JSON-лог файлов docker-демона быстрее,
# чем тянуть их через Docker socket API.
- /var/lib/docker/containers:/var/lib/docker/containers:ro
Шаг 2 — добавьте лейбл com.protoobp.ad.logs к контейнеру MS SQL. Агент
подхватит stdout/stderr контейнера и пометит записи указанными source и
service:
services:
mssql:
labels:
com.protoobp.ad.logs: '[{"source": "sqlserver", "service": "sqlserver", "log_processing_rules": [{"type": "multi_line", "name": "log_start_with_date", "pattern": "\\d{4}-\\d{2}-\\d{2}"}]}]'
Только нужные контейнеры
Если в агенте не задана переменнаяPOBP_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true,
агент собирает логи только тех контейнеров, на которых есть лейбл
com.protoobp.ad.logs.Multi-line
Каждая запись журнала MS SQL начинается с метки времени вида2026-05-12 10:00:00.12 spid51s. Правило log_processing_rules с
type: multi_line склеивает следующие за ней строки (стек-трейсы, многострочные
сообщения о взаимоблокировках, отчёты о восстановлении) в одну логическую
запись. Без этого правила каждая строка попала бы в ProtoOBP как отдельная
запись.Проверка
В выводе agent status в разделе Logs Agent должен быть источник с
Source: sqlserver, Status: OK и ненулевым BytesRead:
docker exec protoobp-agent agent status | grep -A 60 'Logs Agent'
Ненулевые Lines Combined / MultiLine matches подтверждают, что правило
multi_line склеивает многострочные записи в одну. У источника типа «JSON-файл
docker-контейнера» поле Status обычно OK, но даже если оно отображается как
Pending — ориентируйтесь на BytesRead и LogsProcessed.