Мониторинг MS SQL с помощью Proto Observability

Обновлено 19.08.2026
Сбор метрик и логов экземпляра, баз данных, файлов, индексов, транзакций и запросов 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_*, активные сессии, планы выполнения

Конфигурация 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_filesGRANT 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)
odbcWindows и Linuxдрайвер указывается в driver (ODBC Driver 18 for SQL Server, FreeTDS, …)

На Windows-хосте имя драйвера должно совпадать с тем, что зарегистрировано в системе: драйвера по умолчанию у диспетчера ODBC нет.

  1. Выведите список установленных 64-разрядных ODBC-драйверов:

    Get-OdbcDriver -Platform 64-bit | Select-Object -ExpandProperty Name
    

    Если командлет недоступен, тот же список хранится в реестре:

    Get-ItemProperty 'HKLM:\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers'
    
  2. Перенесите имя из вывода в параметр driver посимвольно — например ODBC Driver 18 for SQL Server, ODBC Driver 17 for SQL Server, ODBC Driver 11 for SQL Server или SQL Server. Подходит любой из уже установленных драйверов, ставить новый нужно только если в системе нет ни одного.

  3. Если драйвер требуется установить, выберите версию по версии ОС и обязательно 64-разрядную — 32-разрядные драйверы агент не видит:

    Версия Windows ServerМаксимальная версия Microsoft ODBC Driver for SQL Server
    2016 и новее18
    2012 R217

На Linux-хосте нужны дополнительные шаги:

  1. Установите ODBC-драйвер для SQL Server — например, Microsoft ODBC Driver for SQL Server или FreeTDS.
  2. Скопируйте файлы odbc.ini и odbcinst.ini в каталог /opt/protoobp-agent/embedded/etc.
  3. В conf.yaml укажите connector: odbc и имя драйвера ровно так, как оно записано в odbcinst.ini.

Конфигурация ProtoOBP агента

Если агент запускается в виде службы на хосте

  1. Создайте файл конфигурации проверки:

    • 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"
    

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

  2. Перезапустите ProtoOBP агента:

    • Linux — systemctl restart protoobp-agent
    • Windows — перезапустите службу ProtoOBP Agent
  3. Выполните проверку работы агента и убедитесь, что в разделе sqlserver нет ошибок.

Если агент запускается в виде Docker контейнера

  1. Добавьте autodiscovery-лейблы к Docker контейнеру с MS SQL.

    • в docker-compose.yaml

      labels:
        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": [".*"]}]'
      
    • или в Dockerfile

      LABEL "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": [".*"]}]'
      
  2. Примените изменения лейблов для контейнера с MS SQL (перезапуском контейнера), а также перезапустите контейнер с агентом ProtoOBP.

  3. Выполните проверку работы агента и убедитесь, что в разделе sqlserver нет ошибок.

Проверка

Убедитесь, что проверка запустилась и собирает метрики:

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_namesqlserver_files_* (логическое имя файла)demo_log
file_locationsqlserver_files_*, sqlserver_database_files_*/var/opt/mssql/data/…
file_typesqlserver_database_files_*ROWS / LOG
database_state_descsqlserver_database_state и связанныеONLINE
database_recovery_model_descsqlserver_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_namesqlserver_fci_*, sqlserver_ao_member_*
scheduler_id, parent_node_idsqlserver_scheduler_*, sqlserver_task_*0
session_namesqlserver_xe_*protoobp
query_signatureметрики запросов sqlserver_queries_* (при dbm: true)4f2d…
procedure_nameметрики процедур sqlserver_procedures_* (при dbm: true)usp_create_order
user, app, statusметрики активности и соединений при dbm: trueprotoobp / .Net SqlClient

Экземпляр: доступ к данным и буферный кэш

Метрики уровня экземпляра, без лейбла db. Источник — счётчики производительности (instance_metrics).

Имя метрикиТипЕдиницаОписание
sqlserver_buffer_cache_hit_ratiogaugefractionДоля страниц данных, найденных в буферном кэше, от всех запросов страниц
sqlserver_buffer_page_life_expectancygaugesecondСколько секунд страница живёт в буферном пуле
sqlserver_buffer_page_readsgaugepage/secondФизических чтений страниц в секунду по всем базам
sqlserver_buffer_page_writesgaugepage/secondФизических записей страниц в секунду
sqlserver_buffer_checkpoint_pagesgaugepage/secondСтраниц, сброшенных на диск контрольной точкой
sqlserver_access_full_scansgaugeoperation/secondПолных сканирований (таблицы или индекса) в секунду
sqlserver_access_range_scansgaugeoperation/secondДиапазонных сканирований по индексам в секунду
sqlserver_access_probe_scansgaugeoperation/secondТочечных сканирований (поиск не более одной строки) в секунду
sqlserver_access_index_searchesgaugeoperation/secondПоисков по индексу в секунду
sqlserver_access_page_splitsgaugeoperation/secondРазделений страниц в секунду
sqlserver_cache_object_countsgaugeobjectЧисло объектов в кэше планов
sqlserver_cache_pagesgaugeobjectЧисло 8-КБ страниц, занятых объектами кэша планов

Память

Имя метрикиТипЕдиницаОписание
sqlserver_memory_total_server_memorygaugekibibyteПамять, выделенная менеджером памяти сервера
sqlserver_memory_database_cachegaugekibibyteПамять под кэш страниц баз данных
sqlserver_memory_stolengaugekibibyteПамять, используемая не под страницы БД
sqlserver_memory_connectiongaugekibibyteПамять под обслуживание соединений
sqlserver_memory_lockgaugekibibyteПамять под блокировки
sqlserver_memory_optimizergaugekibibyteПамять под оптимизацию запросов
sqlserver_memory_sql_cachegaugekibibyteПамять под кэш динамического SQL
sqlserver_memory_log_pool_memorygaugekibibyteПамять под Log Pool
sqlserver_memory_granted_workspacegaugekibibyteПамять, выданная выполняющимся операциям (сортировки, хэши, bulk)
sqlserver_memory_grants_outstandinggaugeПроцессов, получивших грант рабочей памяти
sqlserver_memory_memory_grants_pendinggaugeПроцессов, ожидающих грант рабочей памяти

Статистика SQL

Имя метрикиТипЕдиницаОписание
sqlserver_stats_connectionsgaugeconnectionЧисло пользовательских соединений. При dbm: true дополнительно размечается лейблами status, db, user
sqlserver_stats_batch_requestsgaugerequest/secondПакетных запросов в секунду — основной показатель нагрузки
sqlserver_stats_sql_compilationsgaugeoperation/secondКомпиляций SQL в секунду
sqlserver_stats_sql_recompilationsgaugeoperation/secondПерекомпиляций SQL в секунду
sqlserver_stats_auto_param_attemptsgaugeattemptПопыток автопараметризации в секунду
sqlserver_stats_safe_auto_param_attemptsgaugeattemptБезопасных попыток автопараметризации в секунду
sqlserver_stats_failed_auto_param_attemptsgaugeattemptНеудачных попыток автопараметризации в секунду
sqlserver_stats_procs_blockedgaugeprocessЧисло заблокированных процессов
sqlserver_stats_lock_waitsgaugelock/secondСколько раз в секунду блокировка не была выдана сразу

Блокировки и защёлки

Имя метрикиТипЕдиницаОписание
sqlserver_locks_deadlocksgaugerequest/secondЗапросов блокировок в секунду, приведших к взаимоблокировке
sqlserver_latches_latch_waitsgaugerequest/secondЗапросов защёлок, не выданных немедленно
sqlserver_latches_latch_wait_timegaugemillisecondСреднее время ожидания защёлки

Транзакции и хранилище версий

Имя метрикиТипЕдиницаОписание
sqlserver_transactions_longest_transaction_running_timegaugesecondДлительность самой старой активной транзакции (только при уровне изоляции read committed snapshot)
sqlserver_transactions_version_store_sizegaugekibibyteРазмер хранилища версий строк в tempdb
sqlserver_transactions_version_generation_rategaugekibibyte/secondСкорость наполнения хранилища версий
sqlserver_transactions_version_cleanup_rategaugekibibyte/secondСкорость очистки хранилища версий

tempdb

Требует tempdb_file_space_usage_metrics (включён по умолчанию). Несут лейбл db. На управляемых облачных СУБД эти метрики не публикуются.

Имя метрикиТипЕдиницаОписание
sqlserver_tempdb_file_space_usage_free_spacegaugemebibyteСвободное пространство в файле tempdb
sqlserver_tempdb_file_space_usage_user_object_spacegaugemebibyteЗанято пользовательскими объектами
sqlserver_tempdb_file_space_usage_internal_object_spacegaugemebibyteЗанято внутренними объектами (сортировки, хэши, курсоры)
sqlserver_tempdb_file_space_usage_version_store_spacegaugemebibyteЗанято хранилищем версий строк
sqlserver_tempdb_file_space_usage_mixed_extent_spacegaugemebibyteЗанято смешанными экстентами

Сервер и планировщик

sqlserver_server_* требуют server_state_metrics (включён по умолчанию), sqlserver_scheduler_* и sqlserver_task_*task_scheduler_metrics (выключен по умолчанию).

Имя метрикиТипЕдиницаОписание
sqlserver_server_uptimegaugesecondВремя с последнего перезапуска
sqlserver_server_cpu_countgaugeЧисло логических CPU / vCPU на сервере
sqlserver_server_physical_memorygaugebyteОбщий объём физической памяти машины
sqlserver_server_virtual_memorygaugebyteВиртуальная память, доступная процессу в пользовательском режиме
sqlserver_server_committed_memorygaugebyteПамять, зафиксированная менеджером памяти
sqlserver_server_target_memorygaugebyteЦелевой объём памяти менеджера памяти
sqlserver_scheduler_current_tasks_countgaugetaskТекущих задач на планировщике (лейблы scheduler_id, parent_node_id)
sqlserver_scheduler_runnable_tasks_countgaugetaskЗадач в очереди готовых к выполнению
sqlserver_scheduler_work_queue_countgaugeЗадач в очереди ожидания свободного worker’а
sqlserver_scheduler_active_workers_countgaugeworkerАктивных worker’ов
sqlserver_scheduler_current_workers_countgaugeworkerВсего worker’ов на планировщике
sqlserver_task_context_switches_countgaugeПереключений контекста, выполненных задачей
sqlserver_task_pending_io_countgaugeФизических операций ввода-вывода задачи
sqlserver_task_pending_io_byte_countgaugebyteСуммарный объём ввода-вывода задачи
sqlserver_task_pending_io_byte_averagegaugebyteСредний размер операции ввода-вывода задачи

Базы данных

Несут лейбл db. Счётчики транзакций и журнала берутся из объекта производительности Databases, состояние — из sys.databases (db_stats_metrics).

Имя метрикиТипЕдиницаОписание
sqlserver_database_transactionsgaugetransactionТранзакций в секунду по базе
sqlserver_database_write_transactionsgaugetransactionПишущих зафиксированных транзакций за последнюю секунду
sqlserver_database_active_transactionsgaugetransactionАктивных транзакций
sqlserver_database_log_flushesgaugeflushСбросов журнала в секунду
sqlserver_database_log_bytes_flushedgaugebyteБайт журнала сброшено
sqlserver_database_log_flush_waitgaugemillisecondСуммарное ожидание сброса журнала
sqlserver_database_backup_countgaugeЧисло успешных резервных копий базы (db_backup_metrics)
sqlserver_database_backup_restore_throughputgaugeПропускная способность операций резервного копирования и восстановления
sqlserver_database_stategaugeСостояние базы: 0 = Online, 1 = Restoring, 2 = Recovering, 3 = Recovery_Pending, 4 = Suspect, 5 = Emergency, 6 = Offline, 7 = Copying, 10 = Offline_Secondary
sqlserver_database_is_read_onlygauge1, если база помечена READ_ONLY
sqlserver_database_is_in_standbygauge1, если база доступна только на чтение для восстановления журнала
sqlserver_database_is_sync_with_backupgauge1, если база помечена для синхронизации репликации с резервной копией
sqlserver_database_user_accessgaugeРежим доступа пользователей к базе (MULTI_USER / SINGLE_USER / RESTRICTED_USER)
sqlserver_database_replica_transaction_delaygaugemillisecondЗадержка подтверждения фиксации транзакций для реплики базы
sqlserver_replica_transaction_delaygaugemillisecondТо же на уровне экземпляра
sqlserver_replica_flow_control_secgaugeЧисло срабатываний 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_sizegaugekibibyteТекущий размер файла базы
sqlserver_database_files_space_usedgaugekibibyteЗанятое место внутри файла базы
sqlserver_database_files_stategaugeСостояние файла: 0 = Online, 1 = Restoring, 2 = Recovering, 3 = Recovery_Pending, 4 = Suspect, 5 = Unknown, 6 = Offline, 7 = Defunct
sqlserver_database_master_files_sizegaugekibibyteРазмер файла по sys.master_files (требует VIEW ANY DEFINITION)
sqlserver_database_master_files_stategaugeСостояние файла по sys.master_files

Ввод-вывод по файлам

Из sys.dm_io_virtual_file_stats (file_stats_metrics, включён по умолчанию). Тип count — кумулятивные счётчики, применяйте rate(). Лейблы logical_name, file_location, db, state.

Имя метрикиТипЕдиницаОписание
sqlserver_files_readscountreadЧисло операций чтения из файла
sqlserver_files_writescountwriteЧисло операций записи в файл
sqlserver_files_read_bytescountbyteПрочитано байт из файла
sqlserver_files_written_bytescountbyteЗаписано байт в файл
sqlserver_files_io_stallcountmillisecondСуммарное ожидание ввода-вывода по файлу
sqlserver_files_read_io_stallcountmillisecondСуммарное ожидание чтений по файлу
sqlserver_files_write_io_stallcountmillisecondСуммарное ожидание записей по файлу
sqlserver_files_read_io_stall_queuedcountmillisecondЗадержка чтений из-за управления вводом-выводом (IO governance)
sqlserver_files_write_io_stall_queuedcountmillisecondЗадержка записей из-за управления вводом-выводом
sqlserver_files_size_on_diskgaugebyteЗанято на диске под этот файл

Индексы и фрагментация

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_seekscountПоисков по индексу пользовательскими запросами
sqlserver_index_user_scanscountscanСканирований без предиката seek
sqlserver_index_user_lookupscountПоисков по закладке (bookmark lookup)
sqlserver_index_user_updatescountupdateОпераций изменения индекса (insert / update / delete)
sqlserver_database_avg_fragmentation_in_percentgaugepercentЛогическая фрагментация индекса (или экстентная — для кучи)
sqlserver_database_fragment_countgaugeЧисло фрагментов на листовом уровне
sqlserver_database_avg_fragment_size_in_pagesgaugepageСреднее число страниц в одном фрагменте
sqlserver_database_index_page_countgaugepageОбщее число страниц индекса или данных

Размеры таблиц (table_size_metrics)

Выключено по умолчанию; tempdb не собирается. Лейблы db, schema, table.

Имя метрикиТипЕдиницаОписание
sqlserver_table_row_countgaugerowЧисло строк в таблице
sqlserver_table_total_sizegaugekibibyteПолный размер таблицы (данные + индексы)
sqlserver_table_used_sizegaugekibibyteЗанятое место
sqlserver_table_data_sizegaugekibibyteРазмер собственно данных

AlwaysOn и отказоустойчивый кластер

Требуют ao_metrics / fci_metrics и права VIEW ANY DEFINITION.

Имя метрикиТипЕдиницаОписание
sqlserver_ao_ag_sync_healthgaugeЗдоровье синхронизации группы доступности: 0 = не здорова, 1 = частично, 2 = здорова
sqlserver_ao_replica_sync_stategaugeСостояние синхронизации реплики: 0 = не синхронизируется, 1 = синхронизируется, 2 = синхронизирована, 3 = откат, 4 = инициализация
sqlserver_ao_replica_statusgaugeСтатус реплики группы доступности
sqlserver_ao_is_primary_replicagauge1 — первичная реплика, 0 — вторичная
sqlserver_ao_primary_replica_healthgaugeЗдоровье восстановления первичной реплики: 0 = в процессе, 1 = online
sqlserver_ao_secondary_replica_healthgaugeЗдоровье восстановления вторичной реплики
sqlserver_ao_secondary_lag_secondsgaugesecondОтставание вторичной реплики от первичной
sqlserver_ao_log_send_queue_sizegaugebyteОбъём журнала первичной базы, не отправленный на вторичные
sqlserver_ao_log_send_rategaugebyte/secondСредняя скорость отправки данных первичной репликой
sqlserver_ao_redo_queue_sizegaugebyteОбъём журнала на вторичной реплике, ещё не применённый
sqlserver_ao_redo_rategaugebyte/secondСкорость применения журнала на вторичной реплике
sqlserver_ao_filestream_send_rategaugebyte/secondСкорость отправки файлов FILESTREAM на вторичную реплику
sqlserver_ao_low_water_mark_for_ghostsgaugeНижняя граница для очистки «призрачных» записей
sqlserver_ao_replica_failover_modegaugeРежим отработки отказа: 0 = автоматический, 1 = ручной
sqlserver_ao_replica_failover_readinessgaugeГотовность к отработке отказа: 0 = не готова, 1 = готова
sqlserver_ao_quorum_state / sqlserver_ao_quorum_typegaugeСостояние и тип кворума кластера WSFC
sqlserver_ao_member_state / sqlserver_ao_member_type / sqlserver_ao_member_number_of_quorum_votesgaugeСостояние, тип и число голосов участника кворума
sqlserver_fci_statusgaugeСтатус узла в отказоустойчивом кластере (лейблы node_name, status, failover_cluster)
sqlserver_fci_is_current_ownergauge1, если узел — текущий владелец экземпляра

Log shipping

Требуют primary_log_shipping_metrics / secondary_log_shipping_metrics и пользователя в msdb с ролью db_datareader.

Имя метрикиТипЕдиницаОписание
sqlserver_log_shipping_primary_time_since_backupgaugesecondСекунд с последнего резервного копирования журнала на первичном сервере
sqlserver_log_shipping_primary_backup_thresholdgaugesecondПорог, после которого формируется оповещение задания
sqlserver_log_shipping_secondary_time_since_copygaugesecondСекунд с последнего копирования на вторичный сервер
sqlserver_log_shipping_secondary_time_since_restoregaugesecondСекунд с последнего восстановления на вторичном сервере
sqlserver_log_shipping_secondary_last_restored_latencygaugesecondЗадержка между созданием копии журнала и её восстановлением
sqlserver_log_shipping_secondary_restore_thresholdgaugesecondПорог между операциями восстановления

Extended events

Требуют xe_metrics. Лейбл session_name.

Имя метрикиТипЕдиницаОписание
sqlserver_xe_session_statusgaugeСтатус сессии extended events
sqlserver_xe_events_not_in_xmlgaugeeventСобытия, отсутствующие в XML-представлении кольцевого буфера

Метрики уровня запросов (dbm)

Доступны только при dbm: true. Тип count (кумулятивные), несут лейбл query_signature (нормализованный запрос), а duration.*user, db, app.

Имя метрикиЕдиницаОписание
sqlserver_queries_countqueryВсего выполнений запроса
sqlserver_queries_timenanosecondСуммарное время выполнения
sqlserver_queries_worker_timenanosecondСуммарное потребление CPU
sqlserver_queries_clr_timenanosecondВремя внутри объектов CLR
sqlserver_queries_rowsrowВсего строк возвращено
sqlserver_queries_logical_reads / _logical_writesread / writeЛогических чтений / записей
sqlserver_queries_physical_readsreadФизических чтений
sqlserver_queries_spillspageСтраниц, «пролитых» на диск при выполнении
sqlserver_queries_memory_grant / _used_memory_grant / _ideal_memory_grantbyteВыданная / использованная / идеальная память гранта
sqlserver_queries_dopСуммарная степень параллелизма выполнений
sqlserver_queries_reserved_threads / _used_threadsthreadЗарезервированных / использованных параллельных потоков
sqlserver_queries_columnstore_segment_reads / _columnstore_segment_skipssegmentПрочитанных / пропущенных сегментов columnstore
sqlserver_queries_duration_max / _duration_sumnanosecondВозраст самого долгого / сумма возрастов выполняющихся запросов

Метрики хранимых процедур (лейблы db, procedure_name):

Имя метрикиЕдиницаОписание
sqlserver_procedures_countqueryВсего выполнений процедуры
sqlserver_procedures_timenanosecondСуммарное время выполнения
sqlserver_procedures_worker_timenanosecondСуммарное потребление CPU
sqlserver_procedures_logical_reads / _logical_writesread / writeЛогических чтений / записей
sqlserver_procedures_physical_readsreadФизических чтений
sqlserver_procedures_spillspageСтраниц, «пролитых» на диск

Помимо метрик, при 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_durationgaugesecondДлительность выполняющихся заданий
sqlserver_agent_active_jobs_step_infogaugeНаличие последнего завершённого шага у выполняющегося задания
sqlserver_agent_completed_jobs_durationgaugesecondДлительность завершённых заданий
sqlserver_agent_completed_jobs_executionsgaugeexecutionЧисло выполнений завершённых заданий

Сервисные проверки

ИмяОписание
sqlserver.can_connectCRITICAL, если агент не может подключиться к экземпляру MS SQL; иначе OK
sqlserver.database.can_connectCRITICAL, если агент не может подключиться к автообнаруженной базе; иначе 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]) per query_signature — самые «дорогие» по CPU нормализованные запросы.
  • rate(sqlserver_queries_spills[5m]) > 0 — запрос регулярно сбрасывает промежуточные результаты в tempdb.
  • sqlserver_queries_duration_max per user/db большое — конкретный пользователь или приложение крутит долгий запрос.

Сбор логов MS SQL

Логи MS SQL собираются ProtoOBP агентом и отправляются в бэкенд ProtoOBP. Здесь — только специфичные для MS SQL настройки. Включение логов на стороне агента (logs_enabled, logs_pobp_url) описано в Получение данных логов.

Конфигурация 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}"}]}]'

Проверка

В выводе 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.