Сбор метрик через WMI с помощью Proto Observability
Сбор метрик через WMI
Агент ProtoOBP использует Windows Management Instrumentation (WMI) для сбора инфраструктурных метрик хоста, метрик отдельных Windows-сервисов и пользовательских метрик по произвольным WMI-классам. Стандартная установка .msi автоматически предоставляет необходимые права WMI локальной служебной учётной записи pobpagentuser, поэтому в типовых сценариях дополнительных действий не требуется.
На этой странице:
- Когда требуется ручная настройка WMI
- Предоставление прав WMI служебной учётной записи агента
- Проверка прав WMI
- Сбор пользовательских метрик через WMI
- Параметры конфигурации
- Поиск доступных WMI-классов и namespace
- Типы метрик
- Примеры конфигурации
- Часто используемые WMI-классы
- Типовые проблемы WMI
Когда требуется ручная настройка WMI
Дополнительная настройка прав WMI необходима, если:
- агент запускается под GMSA (
<ВАШ_ДОМЕН>\ProtoobpGMSA$); - агент запускается под произвольной доменной или локальной учётной записью, отличной от
pobpagentuser; - в домене действуют ограничивающие групповые политики, которые отзывают права у служебных учётных записей после установки;
- агент собирает WMI-метрики с удалённого хоста.
Предоставление прав WMI служебной учётной записи агента
Далее под «служебной учётной записью агента» понимается пользователь, от имени которого запущена служба protoobp-agent (pobpagentuser, <ВАШ_ДОМЕН>\ProtoobpGMSA$ или иная). Текущего пользователя службы можно посмотреть в services.msc в свойствах службы Protoobp Agent на вкладке Log On.
Добавьте служебную учётную запись агента в локальные группы безопасности на машине, где установлен агент.
Откройте
Computer Management→Local Users and Groups→Groupsи добавьте служебного пользователя в группы: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Предоставьте права на WMI пространство имён
Root\CIMV2:- Откройте
wmimgmt.msc(запуск от Администратора). - Кликните правой кнопкой по
WMI Control (Local)→Properties. - На вкладке
SecurityразвернитеRoot, выделитеCIMV2и нажмитеSecurity. - Добавьте служебную учётную запись агента и установите разрешения:
Execute MethodsEnable AccountRemote EnableRead Security
- В поле
Apply toвыберитеThis namespace and subnamespacesи нажмитеApply.
- Откройте
(Только для удалённого сбора) Настройте доступ к DCOM:
- Откройте
dcomcnfg.exeот Администратора. Component Services→Computers→My Computer→ правая кнопка →Properties→COM Security.- В разделах
Access PermissionsиLaunch and Activation PermissionsнажмитеEdit Limitsи добавьте служебную учётную запись с правамиRemote Access,Remote Launch,Remote Activation.
- Откройте
Перезапустите службу агента для применения новых прав:
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-запрос. Параметры:
| Параметр | Тип | Назначение |
|---|---|---|
class | string | Имя WMI-класса (Win32_OperatingSystem, Win32_Service, Win32_PerfFormattedData_PerfOS_Memory, …). Обязательный. |
metrics | list | Список троек [<WMI-свойство>, <имя метрики>, <тип>]. Обязательный. Поддерживаемые типы: gauge, rate, count, monotonic_count. |
namespace | string | WMI namespace. По умолчанию cimv2 (т.е. Root\CIMV2). |
filters | list | Список WQL-фильтров. Поддерживается LIKE через %. Условия внутри одной map объединяются по AND, отдельные элементы списка — по OR. |
tag_by | string | WMI-свойство, значение которого добавляется как тег к каждой точке. Числовой суффикс инстанса (process#1) автоматически отбрасывается → process. |
tag_queries | list | Дополнительные запросы для обогащения метрик тегами из связанных классов. Формат: [<source_property>, <target_class>, <link_property>, <target_property>]. |
constant_tags | list | Статические теги, добавляемые ко всем точкам инстанса. |
provider | string | int | Битность WMI-провайдера: 32 или 64. По умолчанию совпадает с битностью агента. |
host | string | Имя удалённого хоста; при пустом значении опрашивается локальная WMI. |
username / password | string | Учётные данные для подключения к 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]
Обратите внимание
СвойствоWin32_Process.CommandLine возвращается только если служба агента запущена под учётной записью с административными правами. Без этого tag_queries отработает, но тег будет пустым.Контекстные переключения (по всем потокам)
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_Service | Windows-службы и их состояние (для мониторинга предпочтительнее интеграция windows_service) |
Win32_NTLogEvent | События Windows Event Log — только с фильтрами, иначе тяжёлый запрос |
Win32_PerfFormattedData_PerfOS_Memory | Память и paging (PageFaultsPersec, AvailableMBytes, CommitLimit, CacheBytes) |
Win32_PerfFormattedData_PerfOS_Processor | CPU по ядрам (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 / _TCPv6 | TCP-метрики (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-классы (Win32_Product, Win32_UserAccount, Win32_NTLogEvent без фильтров) могут существенно замедлять опрос и приводить к таймаутам агента. Везде, где это возможно, используйте performance-counter аналоги Win32_PerfFormattedData_* и ограничивайте выборку через filters.Типовые проблемы 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 для новой учётной записи и перезапустите службу |