Сбор метрик через WMI с помощью Proto Observability

Настройка прав WMI для агента ProtoOBP на Windows и сбор пользовательских метрик из произвольных WMI-классов.

Сбор метрик через WMI

Агент ProtoOBP использует Windows Management Instrumentation (WMI) для сбора инфраструктурных метрик хоста, метрик отдельных Windows-сервисов и пользовательских метрик по произвольным WMI-классам. Стандартная установка .msi автоматически предоставляет необходимые права WMI локальной служебной учётной записи pobpagentuser, поэтому в типовых сценариях дополнительных действий не требуется.

На этой странице:

Когда требуется ручная настройка WMI

Дополнительная настройка прав WMI необходима, если:

  • агент запускается под GMSA (<ВАШ_ДОМЕН>\ProtoobpGMSA$);
  • агент запускается под произвольной доменной или локальной учётной записью, отличной от pobpagentuser;
  • в домене действуют ограничивающие групповые политики, которые отзывают права у служебных учётных записей после установки;
  • агент собирает WMI-метрики с удалённого хоста.

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

Далее под «служебной учётной записью агента» понимается пользователь, от имени которого запущена служба protoobp-agent (pobpagentuser, <ВАШ_ДОМЕН>\ProtoobpGMSA$ или иная). Текущего пользователя службы можно посмотреть в services.msc в свойствах службы Protoobp Agent на вкладке Log On.

  1. Добавьте служебную учётную запись агента в локальные группы безопасности на машине, где установлен агент.

    Откройте Computer ManagementLocal Users and GroupsGroups и добавьте служебного пользователя в группы:

    • Performance Monitor Users – обязательная;
    • Distributed COM Users – обязательная;
    • Event Log Readers – только при сборе событий Windows Event Log через WMI.

    Альтернатива через PowerShell (запуск от Администратора):

    $svcAccount = "<ВАШ_ДОМЕН>\ProtoobpGMSA$"   # или "pobpagentuser" для локальной установки
    Add-LocalGroupMember -Group "Performance Monitor Users" -Member $svcAccount
    Add-LocalGroupMember -Group "Distributed COM Users"     -Member $svcAccount
    Add-LocalGroupMember -Group "Event Log Readers"         -Member $svcAccount
    
  2. Предоставьте права на WMI пространство имён Root\CIMV2:

    1. Откройте wmimgmt.msc (запуск от Администратора).
    2. Кликните правой кнопкой по WMI Control (Local)Properties.
    3. На вкладке Security разверните Root, выделите CIMV2 и нажмите Security.
    4. Добавьте служебную учётную запись агента и установите разрешения:
      • Execute Methods
      • Enable Account
      • Remote Enable
      • Read Security
    5. В поле Apply to выберите This namespace and subnamespaces и нажмите Apply.
  3. (Только для удалённого сбора) Настройте доступ к DCOM:

    1. Откройте dcomcnfg.exe от Администратора.
    2. Component ServicesComputersMy Computer → правая кнопка → PropertiesCOM Security.
    3. В разделах Access Permissions и Launch and Activation Permissions нажмите Edit Limits и добавьте служебную учётную запись с правами Remote Access, Remote Launch, Remote Activation.
  4. Перезапустите службу агента для применения новых прав:

    Restart-Service protoobp-agent
    

    При использовании GMSA дополнительно очистите Kerberos-тикеты, чтобы изменения членства в группах вступили в силу:

    klist purge
    

Проверка прав WMI

Выполните тест-запрос от имени той же учётной записи, под которой работает агент. Для локальной служебной учётной записи можно воспользоваться PsExec:

PsExec.exe -u pobpagentuser -p <PASSWORD> powershell -Command "Get-WmiObject -Namespace root\CIMV2 -Class Win32_OperatingSystem | Select-Object Caption, Version"

Для GMSA запустите задачу в Task Scheduler, указав <ВАШ_ДОМЕН>\ProtoobpGMSA$ в качестве Run as, и проверьте вывод в лог-файле задачи.

Успешный вывод имени и версии ОС подтверждает, что у служебной учётной записи есть права на чтение WMI. Ошибка Access denied (0x80070005) указывает на отсутствие прав WMI или DCOM – вернитесь к шагам 2–3.

Дополнительно можно проверить корректность WMI с точки зрения самого агента:

& "C:\Program Files\Protoobp\Protoobp Agent\bin\agent.exe" check wmi_check

Сбор пользовательских метрик через WMI

Для сбора метрик из произвольного WMI-класса используется интеграция wmi_check. Файл конфигурации:

ПлатформаПуть и имя файла
Windows%ProgramData%\Protoobp\conf.d\wmi_check.d\conf.yaml

Минимальный пример — количество процессов и активных пользователей из Win32_OperatingSystem:

init_config:

instances:
  - class: Win32_OperatingSystem
    metrics:
      - [NumberOfProcesses, system.proc.count,  gauge]
      - [NumberOfUsers,     system.users.count, gauge]

После каждого изменения файла перезапустите агента и проверьте конфигурацию командой check:

Restart-Service protoobp-agent
& "C:\Program Files\Protoobp\Protoobp Agent\bin\agent.exe" check wmi_check

Параметры конфигурации

Каждый элемент списка instances описывает один WMI-запрос. Параметры:

ПараметрТипНазначение
classstringИмя WMI-класса (Win32_OperatingSystem, Win32_Service, Win32_PerfFormattedData_PerfOS_Memory, …). Обязательный.
metricslistСписок троек [<WMI-свойство>, <имя метрики>, <тип>]. Обязательный. Поддерживаемые типы: gauge, rate, count, monotonic_count.
namespacestringWMI namespace. По умолчанию cimv2 (т.е. Root\CIMV2).
filterslistСписок WQL-фильтров. Поддерживается LIKE через %. Условия внутри одной map объединяются по AND, отдельные элементы списка — по OR.
tag_bystringWMI-свойство, значение которого добавляется как тег к каждой точке. Числовой суффикс инстанса (process#1) автоматически отбрасывается → process.
tag_querieslistДополнительные запросы для обогащения метрик тегами из связанных классов. Формат: [<source_property>, <target_class>, <link_property>, <target_property>].
constant_tagslistСтатические теги, добавляемые ко всем точкам инстанса.
providerstring | intБитность WMI-провайдера: 32 или 64. По умолчанию совпадает с битностью агента.
hoststringИмя удалённого хоста; при пустом значении опрашивается локальная WMI.
username / passwordstringУчётные данные для подключения к WMI на удалённом хосте.

Поиск доступных WMI-классов и namespace

Перечислить доступные WMI namespace:

Get-WmiObject -Namespace Root -Class __Namespace | Select Name

Перечислить классы в выбранном namespace:

Get-WmiObject -List -Namespace Root\CIMV2 | Select Name

Найти класс по подстроке (например, всё, что связано с MSMQ):

Get-WmiObject -List | Where-Object { $_.Name -like "*MSMQ*" }

Посмотреть набор свойств класса и текущие значения:

Get-WmiObject -Class Win32_PerfFormattedData_PerfOS_Memory | Format-List *

Типы метрик

ТипКогда использовать
gaugeСнэпшот текущего значения (использование памяти, длина очереди, температура). Большинство счётчиков Win32_PerfFormattedData_* уже посчитаны как «в секунду» → используйте gauge.
rateКумулятивный счётчик; агент сам вычисляет дельту между интервалами. Подходит для «сырых» счётчиков из Win32_PerfRawData_*.
countКоличество событий, учтённое в текущем интервале.
monotonic_countСтрого возрастающий счётчик (общее число операций с момента старта процесса) — агент отправляет дельту и сбрасывает значение при перезапуске источника.

Примеры конфигурации

Память и paging

init_config:

instances:
  - class: Win32_PerfFormattedData_PerfOS_Memory
    metrics:
      - [PageFaultsPersec, system.mem.page.faults, gauge]
      - [PageReadsPersec,  system.mem.page.reads,  gauge]
      - [PagesInputPersec, system.mem.page.input,  gauge]
      - [AvailableMBytes,  system.mem.avail,       gauge]
      - [CommitLimit,      system.mem.limit,       gauge]
      - [CacheBytes,       system.mem.fs_cache,    gauge]

  - class: Win32_PerfFormattedData_PerfOS_PagingFile
    metrics:
      - [PercentUsage, system.mem.page.pct, gauge]
    tag_by: Name

CPU по ядрам и очередь планировщика

init_config:

instances:
  - class: Win32_PerfFormattedData_PerfOS_Processor
    metrics:
      - [PercentProcessorTime,  system.cpu.pct,           gauge]
      - [PercentPrivilegedTime, system.cpu.priv.pct,      gauge]
      - [PercentDPCTime,        system.cpu.dpc.pct,       gauge]
      - [PercentInterruptTime,  system.cpu.interrupt.pct, gauge]
      - [DPCsQueuedPersec,      system.cpu.dpc.queue,     gauge]
    tag_by: Name   # тег ядра процессора: 0, 1, ..., _Total

  - class: Win32_PerfFormattedData_PerfOS_System
    metrics:
      - [ProcessorQueueLength, system.proc.queue, gauge]

Логические диски

init_config:

instances:
  - class: Win32_PerfFormattedData_PerfDisk_LogicalDisk
    metrics:
      - [PercentFreeSpace,   system.disk.free.pct,  gauge]
      - [PercentIdleTime,    system.disk.idle,      gauge]
      - [AvgDisksecPerRead,  system.disk.read_sec,  gauge]
      - [AvgDisksecPerWrite, system.disk.write_sec, gauge]
      - [DiskWritesPersec,   system.disk.writes,    gauge]
      - [DiskReadsPersec,    system.disk.reads,     gauge]
      - [AvgDiskQueueLength, system.disk.queue,     gauge]
    tag_by: Name   # тег буквы диска: C:, D:, ..., _Total

Сеть (TCPv4)

init_config:

instances:
  - class: Win32_PerfFormattedData_Tcpip_TCPv4
    metrics:
      - [SegmentsRetransmittedPersec, system.net.tcp.retrans_seg, gauge]

Процессы с тегированием по имени и фильтрацией

init_config:

instances:
  - class: Win32_PerfFormattedData_PerfProc_Process
    metrics:
      - [ThreadCount,          proc.threads.count, gauge]
      - [VirtualBytes,         proc.mem.virtual,   gauge]
      - [PercentProcessorTime, proc.cpu_pct,       gauge]
    tag_by: Name
    filters:
      - Name: '%nginx%'   # LIKE-шаблон; собирать только процессы, в имени которых есть "nginx"
      - Name: '%w3wp%'    # отдельный элемент списка = OR

Обогащение метрик тегами через tag_queries

tag_queries связывает значение из исходного WMI-класса со значением из другого класса и добавляет его как тег. Формат записи:

[<source_property>, <target_class>, <link_property>, <target_property>]

эквивалентен запросу:

SELECT <target_property> FROM <target_class> WHERE <link_property> = <source_property>

Пример: к метрикам процессов из Win32_PerfFormattedData_PerfProc_Process добавить тег commandline: из Win32_Process.CommandLine. Связка идёт по PID — IDProcess в перфоманс-классе и Handle в Win32_Process:

init_config:

instances:
  - class: Win32_PerfFormattedData_PerfProc_Process
    metrics:
      - [IOReadBytesPerSec, proc.io.bytes_read, gauge]
    tag_by: Name
    tag_queries:
      - [IDProcess, Win32_Process, Handle, CommandLine]

Контекстные переключения (по всем потокам)

init_config:

instances:
  - class: Win32_PerfFormattedData_PerfProc_Thread
    metrics:
      - [ContextSwitchesPersec, system.proc.context_switches, gauge]
    filters:
      - Name: _total/_total

Очередь печати с константным тегом

init_config:

instances:
  - class: Win32_PerfFormattedData_Spooler_PrintQueue
    metrics:
      - [Jobs,      printer.queue.size,   gauge]
      - [JobErrors, printer.queue.errors, gauge]
    tag_by: Name
    constant_tags:
      - role:print-server

Удалённый сбор WMI

init_config:

instances:
  - class: Win32_OperatingSystem
    host: remote-host.example.com
    username: EXAMPLE\monitoring_user
    password: <PASSWORD>
    metrics:
      - [NumberOfProcesses, system.proc.count,  gauge]
      - [NumberOfUsers,     system.users.count, gauge]
    constant_tags:
      - source:wmi-remote
      - host:remote-host.example.com

При удалённом сборе требуется настроенный DCOM (см. шаг 3 раздела «Предоставление прав WMI») и сетевой доступ по портам RPC (135/TCP + динамический диапазон) к целевому хосту.

Сводный конфиг для типового Windows-сервера

init_config:

instances:
  # Операционная система
  - class: Win32_OperatingSystem
    metrics:
      - [NumberOfProcesses, system.proc.count,  gauge]
      - [NumberOfUsers,     system.users.count, gauge]

  # Память и paging
  - class: Win32_PerfFormattedData_PerfOS_Memory
    metrics:
      - [PageFaultsPersec, system.mem.page.faults, gauge]
      - [PageReadsPersec,  system.mem.page.reads,  gauge]
      - [PagesInputPersec, system.mem.page.input,  gauge]
      - [AvailableMBytes,  system.mem.avail,       gauge]
      - [CommitLimit,      system.mem.limit,       gauge]
      - [CacheBytes,       system.mem.fs_cache,    gauge]

  - class: Win32_PerfFormattedData_PerfOS_PagingFile
    metrics:
      - [PercentUsage, system.mem.page.pct, gauge]
    tag_by: Name

  # Очередь системного планировщика
  - class: Win32_PerfFormattedData_PerfOS_System
    metrics:
      - [ProcessorQueueLength, system.proc.queue, gauge]

  # CPU по ядрам
  - class: Win32_PerfFormattedData_PerfOS_Processor
    metrics:
      - [PercentProcessorTime,  system.cpu.pct,           gauge]
      - [PercentPrivilegedTime, system.cpu.priv.pct,      gauge]
      - [PercentDPCTime,        system.cpu.dpc.pct,       gauge]
      - [PercentInterruptTime,  system.cpu.interrupt.pct, gauge]
      - [DPCsQueuedPersec,      system.cpu.dpc.queue,     gauge]
    tag_by: Name

  # Контекстные переключения
  - class: Win32_PerfFormattedData_PerfProc_Thread
    metrics:
      - [ContextSwitchesPersec, system.proc.context_switches, gauge]
    filters:
      - Name: _total/_total

  # Логические диски
  - class: Win32_PerfFormattedData_PerfDisk_LogicalDisk
    metrics:
      - [PercentFreeSpace,   system.disk.free.pct,  gauge]
      - [PercentIdleTime,    system.disk.idle,      gauge]
      - [AvgDisksecPerRead,  system.disk.read_sec,  gauge]
      - [AvgDisksecPerWrite, system.disk.write_sec, gauge]
      - [DiskWritesPersec,   system.disk.writes,    gauge]
      - [DiskReadsPersec,    system.disk.reads,     gauge]
      - [AvgDiskQueueLength, system.disk.queue,     gauge]
    tag_by: Name

  # Сеть TCPv4
  - class: Win32_PerfFormattedData_Tcpip_TCPv4
    metrics:
      - [SegmentsRetransmittedPersec, system.net.tcp.retrans_seg, gauge]

Часто используемые WMI-классы

КлассНазначение
Win32_OperatingSystemОбщие сведения об ОС (NumberOfProcesses, NumberOfUsers, FreePhysicalMemory, LastBootUpTime)
Win32_ComputerSystemСведения о компьютере (модель, производитель, объём ОЗУ)
Win32_ProcessЗапущенные процессы, командные строки, владельцы (используется как target для tag_queries)
Win32_ServiceWindows-службы и их состояние (для мониторинга предпочтительнее интеграция windows_service)
Win32_NTLogEventСобытия Windows Event Log — только с фильтрами, иначе тяжёлый запрос
Win32_PerfFormattedData_PerfOS_MemoryПамять и paging (PageFaultsPersec, AvailableMBytes, CommitLimit, CacheBytes)
Win32_PerfFormattedData_PerfOS_ProcessorCPU по ядрам (PercentProcessorTime, PercentPrivilegedTime, DPCsQueuedPersec)
Win32_PerfFormattedData_PerfOS_SystemСистемные счётчики (ProcessorQueueLength, SystemUpTime)
Win32_PerfFormattedData_PerfOS_PagingFileФайлы подкачки (PercentUsage, PercentUsagePeak)
Win32_PerfFormattedData_PerfDisk_LogicalDiskЛогические диски (PercentFreeSpace, AvgDisksecPerRead/Write, DiskReadsPersec)
Win32_PerfFormattedData_PerfDisk_PhysicalDiskФизические диски (те же счётчики, но по \PhysicalDisk(N C:))
Win32_PerfFormattedData_PerfProc_ProcessМетрики процессов (ThreadCount, VirtualBytes, WorkingSet, PercentProcessorTime, IO*BytesPerSec)
Win32_PerfFormattedData_PerfProc_ThreadМетрики потоков (ContextSwitchesPersec)
Win32_PerfFormattedData_Tcpip_TCPv4 / _TCPv6TCP-метрики (ConnectionsActive/Passive, ConnectionsEstablished, SegmentsRetransmittedPersec)
Win32_PerfFormattedData_Tcpip_NetworkInterfaceСетевые интерфейсы (BytesTotalPersec, PacketsReceivedErrors, OutputQueueLength)
Win32_PerfFormattedData_Spooler_PrintQueueОчереди печати (Jobs, JobErrors, TotalPagesPrinted)
MSCluster_* (namespace Root\MSCluster)Windows Failover Cluster — состояние узлов, ресурсов и групп

Типовые проблемы WMI

СимптомВероятная причинаРешение
Access is denied. (Exception from HRESULT: 0x80070005)Учётная запись агента не имеет прав на пространство имён Root\CIMV2 или на DCOMВыполните шаги 2–3 раздела «Предоставление прав WMI»
Invalid namespaceНеверно указан namespace или WMI-провайдер отсутствуетПроверьте имя класса через Get-WmiObject -List -Namespace root\CIMV2
Check проходит без ошибок, но метрики отсутствуютWMI-класс не содержит инстансов на этом хосте, либо filters отсекают все строкиУберите filters и убедитесь, что класс возвращает данные через Get-WmiObject
Сбор зависает или периодически таймаутитсяЗапрос к тяжёлому WMI-классуЗамените на Win32_PerfFormattedData_* либо сузьте выборку через filters
Метрики поступают только с части хостов в кластереРазличия прав или конфигурации WMI на разных узлахПроверьте права WMI на проблемном хосте под служебной учётной записью агента
После смены учётной записи службы агент перестал собирать WMIНовая учётная запись не входит в нужные группы / не имеет прав на Root\CIMV2Повторите шаги 1–2 для новой учётной записи и перезапустите службу