Ранее было рассмотрено как записать данные о текущих показателях производительности системы в базу данных на SQL Server (статья «Запись показателей монитора производительности Windows в базу данных SQL Server»). В текущей статье разберемся что за данные мы пишем и как их можно использовать.
Информация о получаемых данных
В результате подключения механизма записи показателей счетчиков в базу данных SQL Server, в базе данных были созданы 3 таблицы:
- DisplayToID
- CounterDetails
- CounterData
Таблица «DisplayToID»
Данная таблица содержит информацию о сборщике данных:
- GUID — идентификатор сборщика данных
- DisplayString — имя сборщика данных, как он задан в системном мониторе (perfmon)
- LogStartTime, LogStopTime — информация о времени старта и остановки сборщика данных
- NumberOfRecords — количество записей (моментов записей, т.е. последний номер итерации получения показателей и их запись в базу данных)
- MinutesToUTC, TimeZoneName — смещение времени по отношению к UTC и часовой пояс
В общем, не особо интересная информация, особенно если сборщик данных только один.
Таблица «CounterDetails»
Эта таблица содержит информацию о логируемых счетчиках, что нам потребуется для идентификации логируемых значений:
- CounterID — идентификатор счетчика
- MachineName — имя компьютера/сервера
- ObjectName — имя объекта, к которому относится счетчик (как задано в системном мониторе)
- CounterName — имя счетчика
- InstanceName — имя экземпляра счетчика (как задано в системном мониторе)
- CounterType, DefaultScale, InstanceIndex, ParentName, ParentObjectID, TimeBaseA, TimeBaseB — не особо интересные поля, поэтому я опущу их рассмотрение
Таблица «CounterData»
Самая важная таблица, ради которой все и затевалось — содержит значения счетчиков в конкретные моменты времени.
- GUID — идентификатор сборщика данных из таблицы «DisplayToID»
- CounterID — идентификатор счетчика из таблицы «CounterDetails»
- RecordIndex — порядковый номер записи (номер итерации получения данных по соответствующему сборщику данных, т.е. если в момент сбора данных в сборщике было 5 счетчиков — у них всех будет единый номер)
- CounterDateTime — дата и время значения показателя (строка в канонической форме ODBC с миллисекундами)
- CounterValue — абсолютное значение показателя
- FirstValueA, FirstValueB, SecondValueA, SecondValueB, MultiCount — не особо интересные поля, поэтому я опущу их рассмотрение
Примеры работы с данными счетчиков
Плюсом «сырых» данных является то что ими можно манипулировать любыми способами. В самых продвинутых случаях, эти данные можно обрабатывать сторонними фреймворками, подключить оповещения, строить графики, в общем, все что в голову взбредет!
В данном разделе приведу несколько простых запросов работы с «сырыми» данными в SQL Server.
Получение данных с отбором по счетчику
Приведенный ниже запрос возвращает все значения показателя с отбором по имени сервера, имени объекта, имени счетчика, экземпляру счетчика за выбранный диапазон времени.
Первым важным моментом является то что имя объекта и имя счетчика не стандартизированы и различаются, как минимум, в зависимости от языка системы.
Вторым важным моментом является то что время является строкой, тем не менее отборы по ней работают без проблем, главное — сохранять формат.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
SELECT cdet.MachineName, cdet.CounterName, cdet.InstanceName, cdata.CounterValue, cdata.CounterDateTime, d.DisplayString FROM dbo.CounterDetails as cdet LEFT JOIN dbo.CounterData as cdata ON cdet.CounterID = cdata.CounterID LEFT JOIN DisplayToID as d ON d.GUID = cdata.GUID WHERE cdet.MachineName = '\\AUSEVICH' AND cdet.ObjectName = 'Процессор' AND cdet.CounterName = '% загруженности процессора' AND cdet.InstanceName = '_Total' AND cdata.CounterDateTime >= '2017-10-23 17:30:30' AND cdata.CounterDateTime <= '2017-10-23 17:31:00' ORDER BY CounterDateTime DESC |
Получение средних значений показателей за период
Нижеприведенный запрос отражает минимальное, максимальное и среднее значение счетчиков за период
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
SELECT cdet.MachineName, cdet.CounterName, cdet.InstanceName, MIN(cdata.CounterValue) AS minValue, MAX(cdata.CounterValue) AS maxValue, AVG(cdata.CounterValue) AS avgValue, d.DisplayString FROM dbo.CounterDetails as cdet INNER JOIN dbo.CounterData as cdata ON cdet.CounterID = cdata.CounterID INNER JOIN dbo.DisplayToID as d ON d.GUID = cdata.GUID WHERE cdata.CounterDateTime >= '2017-10-23 17:30:00' AND cdata.CounterDateTime <= '2017-10-23 17:35:00' GROUP BY MachineName, CounterName, InstanceName, DisplayString |
Срез последних значение показателей
Следующий запрос отражает последние значения счетчиков
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
SELECT cdet.CounterID, cdet.MachineName, cdet.CounterName, cdet.InstanceName, cdet.ObjectName, cdata.CounterDateTime, cdata.CounterValue, d.DisplayString FROM ( SELECT cd_lr.CounterID, cd_lr.CounterDateTime, cd_lr.GUID, cd.CounterValue FROM ( SELECT GUID, CounterID, MAX(CounterDateTime) as CounterDateTime FROM CounterData GROUP BY CounterID, GUID ) as cd_lr LEFT JOIN CounterData as cd ON cd_lr.CounterID = cd.CounterID AND cd_lr.CounterDateTime = cd.CounterDateTime AND cd_lr.GUID = cd.GUID ) as cdata LEFT JOIN CounterDetails as cdet ON cdet.CounterID = cdata.CounterID LEFT JOIN dbo.DisplayToID d ON d.GUID = cdata.GUID |