Введение

Одной из задач систем ИТ-мониторинга является сбор, хранение и анализ различных метрик, характеризующих как состояние различных элементов ИТ-инфраструктуры (загруженность CPU, объем свободной оперативной памяти, объем свободного дискового пространства и т.п.), так и состояние различных бизнес-процессов. Для того чтобы применять обширный математический аппарат статистического анализа, эти данные часто удобнее представлять в виде упорядоченных временных рядов соответствующих переменных. Хорошим инструментом для обработки временных рядов в языке Python является комбинация трёх модулей: pandas, scipy и statsmodels (pandas.pydata.org, scipy.stats, statsmodels.org), которые предоставляют широкий набор классов и функций для построения временных рядов, для оценки множества различных статистических моделей, а также для проведения статистических тестов и исследования статистических данных. Из всего содержащегося в этих модулях математического паноптикума, конкретно в данной статье, будет описаны алгоритмы, в частности корреляционный анализ временных рядов метрик ИТ-инфраструктуры, которые мы применяем для root cause анализа в AIOps платформе monq.

Математически, корреляционная зависимость – это согласованные изменения значений двух и более переменных, когда при изменении одной переменной происходит соотносительное изменение (уменьшение или увеличение) другой переменной, а коэффициент корреляции – количественная мера совместной изменчивости двух переменных. Корреляционный анализ – один из методов математической статистики, позволяющий путём вычисления коэффициентов корреляции между переменными определить, существует ли корреляционная зависимость между ними и насколько она сильна. Следует учитывать, что коэффициент корреляции является описательной статистикой и из наличия корреляционной связи между переменными не обязательно вытекает наличие причинно-следственных отношений между ними, то есть положительная или отрицательная корреляция не обязательно означает, что изменение одной переменной вызывает изменение другой (“correlation does not imply causation”).

Если в корреляционном анализе рассматриваются временные ряды трёх и более переменных, то из попарных коэффициентов корреляции строится корреляционная матрица - матрица, в которой на пересечении соответствующих строки и столбца находится коэффициент корреляции между соответствующими переменными. Применительно к системам мониторинга ИТ-инфраструктуры корреляционная матрица временных рядов различных метрик может использоваться в двух основных сценариях (юзкейсах): в поисках первопричин инцидентов в системе (root cause analysis) и в поисках скрытых инфраструктурных связей между элементами системы (в некотором роде, “дорисовка” ресурсно-сервисной модели). В конечном итоге временные корреляции между метриками могут быть введены в различные алгоритмы дальнейшего анализа данных, такие как инструменты прогнозирования или моделирования.

Построение временных рядов метрик

Первым действием в процедуре корреляционного анализа является представление наборов значений метрик, описывающих состояние элементов ИТ-инфраструктуры в виде регулярных (интервальных) временных рядов, т.е. рядов, характеризующих значение показателя в каждый определенный период времени (каждые 5 минут, каждые полчаса и т.д.). В общем случае измерения значений метрик и их запись в хранилище данных происходят асинхронно, с разной периодичностью и с разной частотой, поскольку очень часто эти метрики приходят из внешних источников  и система мониторинга ими не управляет: бывают ситуации, когда за 5 минут в систему поступает несколько значений метрики, а потом за полчаса - ни одного. В связи с этим, нужна процедура регуляризации временных рядов различных метрик, для которой необходимо использовать методы интерполяции и экстраполяции данных для разных временных отрезков. Процедура регуляризации временного ряда проиллюстрирована на рисунке 1, причём в модуле pandas это делается одной строкой - в нижеследующем примере кода это последняя строка, где метод resample('5min').mean усредняет измерения внутри каждого 5-минутного временного отрезка, а метод fillna(method='ffill') экстраполирует предыдущее значение метрики на пустые (без измерений) временные отрезки:

import pandas as pd

data=pd.read_csv('TimeSeriesExample.txt',parsedates=[0])

timeSeries=pd.Series(data['KEHealth'].values, index=data['Timestamp'])

timeSeriesReg=timeSeries.resample('5min').mean().fillna(method='ffill')

tsCollection.append(timeSeriesReg) 

Рисунок 1. Регуляризация временного ряда значений метрики.  

Monq рассчитывает метрики “здоровья” оборудования и приложений на основе состояния связанных триггеров и взаимного влияния сторонних систем и компонентов на данную конфигурационную единицу по ресурсно-сервисной модели. В приведённом выше примере использовались данные по конкретной метрике здоровья, которая рассчитывается для каждого элемента системы мониторинга по некоторым правилам. В системах с несколькими тысячами конфигурационных единиц, типичный вид временных рядов метрики здоровья для некоторых из этих КЕ на интервале времени около полугода показан на рисунке 2.

Рисунок 2. Временные ряды метрики “Здоровье КЕ” для разных элементов системы мониторинга.  

Расчёт корреляционной матрицы

После получения регуляризированных временных рядов метрик расчёт их корреляционной матрицы представляет собой достаточно прямолинейную задачу. В модуле pandas это проще всего сделать, объединив временные ряды в одну таблицу (dataframe) и применив к ней метод corr(), который считает коэффициент корреляции Пирсона для каждой пары метрик, причём только во временной области их совместного определения (не обязательно непрерывной):

import matplotlib.pyplot as plt

allKeDF=pd.concat(tsCollection, axis=1)

corrMatrix=allKeDF.corr()

pallet=plt.getcmap('jet')

img=plt.imshow(corrMatrix, cmap=pallet, vmin=-1, vmax=1, aspect='auto')

plt.colorbar(img)

Рисунок 3. Корреляционная матрица временных рядов метрики здоровья для 150 самых изменчивых КЕ в системе. 

На рисунке 3 представлена матрица корреляций для временных рядов метрики здоровья 150 конфигурационных единиц из системы мониторинга, у которых значения этой метрики меняются наиболее часто. Как видно, в основном эта матрица представляет собой “зелёное поле“, что означает отсутствие или наличие очень слабых корреляций между подавляющим большинством КЕ. Белые пиксели на картинке появились для тех пар КЕ, у которых не получилось посчитать коэффициент корреляции - их временные ряды не пересекаются во времени (для удобства дальнейшей обработки все значения nan зануляются). Такое вполне возможно, поскольку система мониторинга живая - в ней могут появляться новые конфигурационные элементы и исчезать старые. Красные и синие пиксели на картинке соответствуют тем парам КЕ, временные ряды которых коррелируют и, соответственно, антикоррелируют. Таких пар КЕ набралось совсем не много: коррелирующих пар, с  коэффициентом корреляции r>0.7, всего 65 (0.29% от общего числа пар), а антикоррелирующих пар с r<-0.7 всего 4 (0.02%). Это характеризует систему мониторинга с хорошей стороны: нет множества дублирующих элементов, следящих за одним и тем же параметром, все заняты своим делом. Конфигурационные единицы, дублирующие функции друг друга, как раз должны попадать в группу сильно коррелирующих пар с коэффициентом корреляции r>0.95.

Рисунок 4. Матрицы корреляций для разных реперных отрезков регуляризации временных рядов метрик - 5-минутных и 10-минутных. 

На рисунке 4 показаны матрицы корреляций, рассчитанные для набора одних и тех же КЕ, но с использованием разных реперных отрезков для регуляризации временных рядов метрик - 5-минутных и 10-минутных. На первый взгляд обе картинки выглядят довольно похожими, но если посчитать разницу между ними, получится гистограмма, приведенная на рисунке 5, у которой среднее значение близко к нулю ?=0, а среднеквадратическое отклонение ?=0.11. Такая же гистограмма для разницы корреляций 5-минутных и 20-минутных временных рядов имеет среднеквадратическое отклонение ?=0.16, из чего следует, что при изменении регуляризации заметное количество пар КЕ могут перейти из группы коррелирующих в группу некоррелирующих, и наоборот. Как видим, выбор реперного отрезка для регуляризации временных рядов может оказать существенное влияние на значения корреляционной матрицы и выбирается он как некоторый компромисс между желаемой точностью расчёта корреляций, требуемыми компьютерными ресурсами и временем вычислений.

Рисунок 5. Гистограмма разницы значений одних и тех же коэффициентов корреляции для 5-минутных и 10-минутных регуляризированных временных рядов.

Рисунок 6. Типичный вид коррелирующих временных рядов метрики здоровья КЕ.

Общий вид нескольких пар коррелирующих временных рядов метрики здоровья КЕ приведён на рисунке 6, а антикоррелирующих рядов - на рисунке 7. На последнем рисунке хорошо видно, что высокие по модулю значения коэффициента корреляции, могут быть обусловлены весьма специфическим поведением временных рядов, характерным пересечением временных интервалов их совместной изменчивости. В подобных ситуациях для проверки значимости вычисленного коэффициента корреляции можно использовать (с некоторыми натяжками) t-критерий Стьюдента, для чего по формуле t=|r|v(n-2)/(1-r2), рассчитывается t-статистика tнабл и сравнивается с табличным значением tкрит(?,k) для заданных уровня значимости и числа степеней свободы k=n-2, где n - число совместных наблюдений метрик. В качестве n следует брать минимальное (из пары КЕ) число смены значений временного ряда метрики на интервале их совместного определения. Для пар временных рядов на рисунке 7 результаты расчёта t-критерия Стьюдента с ?=0.05 приведены в красных квадратах. Поскольку для первых двух пар tнабл<tкрит, то измеренные значения коэффициентов корреляции не считаются значимыми и могут являться результатом случайных совпадений. Для последней пары tнабл>tкрит, что означает статистическую существенность измеренного значения антикорреляций. Значения tкрит очень легко получить в модуле scipy:

import scipy as sp
tCrit=sp.stats.t.ppf(1-alpha/2, ndf)

Рисунок 7. Типичный вид антикоррелирующих временных рядов метрики здоровья КЕ.

Применение корреляционной матрицы

Как было сказано во введении, существует несколько сценариев использования корреляционной матрицы временных рядов метрик в системе мониторинга ИТ-инфраструктуры, два из которых представляются основными: 1) поиск первопричин инцидентов в ИТ-системе (root cause analysis) и 2) поиск скрытых инфраструктурных связей между элементами системы, отсутствующих в ресурсно-сервисной модели. Следует учитывать, что информативность и полезность корреляционного анализа в обоих сценариях напрямую зависит от качества и полноты имеющейся для данной ИТ-системы ресурсно-сервисной модели (РСМ): если все связи и степени влияния, существующие между конфигурационными единицами системы, отображены на графе РСМ, то матрица корреляций вряд ли будет содержать какую-то дополнительную информацию к той, что уже прописана в РСМ. Понятно, что полная РСМ даёт полную картину всех причинно-следственных связей в системе и в этом случае корреляционная матрица - это лишь некоторое редуцированное представление графа РСМ. Тем не менее, построение полной ресурсно-сервисной модели системы весьма трудоёмкий процесс и не всегда осуществимо на практике, поэтому анализ корреляций в поведении элементов системы может помочь выявить какие-то скрытые (отсутствующие в РСМ) связи между ними или установить количественное выражение степени влияния одного элемента на другой, то есть, в какой-то степени, дополнить граф РСМ. В ситуации, когда для системы отсутствует какая-либо РСМ, корреляционная матрица может найти ещё одно применение: 3) иерархический кластерный анализ корреляций для объединения элементов системы в группы и визуализации её структуры в виде дендрограммы. 

Поиск первопричин инцидентов

В общем случае, инцидентом в ИТ-системе считается любое событие, которое вызывает, или потенциально может вызвать, сбой в стандартном процессе работы сервиса, с прерыванием обслуживания или снижением его качества. При этом многие инциденты являются лишь симптомами какой-то более глубокой проблемы, лежащей на уровне инфраструктуры, причём довольно часто одна проблема (первопричина) порождает целую группу инцидентов. Поиск подобных первопричин инцидентов является одной из самых важных функций систем  ИТ-мониторинга. 

В принципе, при наличии полноценной и достоверной ресурсно-сервисной модели системы, первопричину сбоя в  работе конкретной КЕ можно отследить по графу РСМ, последовательно проверяя наличие проблемных КЕ по всем цепочкам связей и влияния на исходную КЕ. Отсутствие полноценного графа РСМ при поиске первопричин инцидентов можно, в какой-то мере, компенсировать анализом матрицы корреляций между временными рядами состояний КЕ.  Также возможна ситуация, когда определить первопричину инцидента по матрице корреляций можно быстрее чем по графу РСМ из-за различия в типах запросов к базе данных.

В monq функционал корреляционного анализа временных рядов метрики здоровья КЕ выделен в отдельный микросервис, который в фоновом режиме постоянно обновляет матрицу корреляций. Обновления происходят не сразу для всей матрицы, а по частям (в силу ограничений по вычислительным ресурсам), причём для более изменчивых временных рядов расчёт коэффициентов корреляции проводиться чаще, чем для мало изменчивых. Таким образом, текущая корреляционная матрица содержит коэффициенты корреляции, вычисленные в разные моменты времени, но в силу описанной выше методики её обновления, все значения в ней являются актуальными. 

При возникновении инцидента с каким-то КЕ, после получения соответствующего запроса, микросервис выдаёт отсортированный список тех КЕ, для которых значения коэффициента корреляции с исходным КЕ выше некоторого порога (обычно r>0.7), как показано на рисунке 8. Эта информация может использоваться напрямую на фронтенде для проверки статуса коррелирующих КЕ, а также передаваться дальше в комбинированный алгоритм поиска первопричин, который помимо временных корреляций ещё использует семантическую кластеризацию инцидентов. 

Рисунок 8. Список КЕ, коррелирующих с КЕ-38374, который выдаёт микросервис расчёта матрицы корреляций.

Поиск скрытых инфраструктурных связей

Как говорилось выше, корреляционный анализ временных рядов состояний КЕ может выявить новые связи между элементами ИТ-системы, не учтённые в её ресурсно-сервисной модели. Это могут быть какие-то скрытые инфраструктурные связи в самой системе (например, использование общих цепей электропитания, общей системы охлаждения и т.п.) или общая зависимость от какого-то внешнего сервиса. Поскольку в данном сценарии ищутся довольно жесткие связи между элементами системы, то пороговое значение коэффициента корреляции для отбора пар КЕ следует брать достаточно высоким: r>0.95

На рисунке 9 показана корреляционная матрица временных рядов метрик здоровья КЕ для ИТ-системы нашего основного заказчика, состоящей из 3200 конфигурационных единиц. Число пар КЕ с коэффициентом корреляции выше 0.95 составляет 7470, из которых после проверки на наличие связи между элементами пары по графу РСМ остаётся 2310. Типичный вид временных рядов для некоторых из оставшихся пар КЕ приведены на рисунке 10, где в красных квадратах даны результаты t-критерия Стьюдента (c ?=0.001 для большей достоверности). Как видно из рисунка, для большинства пар значение t-статистики меньше критического, так что в итоге этот t-критерий проходят только 3 пары коррелирующих КЕ. Для t-критерия со значением параметра ?=0.01 число оставшихся пар КЕ равно 27. Что делать дальше с обнаруженными новыми связями между элементами ИТ-системы, вносить ли их в РСМ, решает её оператор, хотя, в принципе, возможно и автоматическое добавление. 

Рисунок 9. Полная корреляционная матрица временных рядов метрик здоровья КЕ для ИТ-системы нашего основного заказчика. 

Рисунок 10. Типичный вид временных рядов для некоторых сильно коррелирующих пар КЕ, не связанных по графу РСМ. 

Иерархический кластерный анализ корреляций

Иерархическая кластеризация используется для выявления относительно однородных групп в совокупности переменных при помощи алгоритма, который вначале рассматривает каждую переменную как отдельный кластер, а затем последовательно, на основании некоторой количественной меры сходства (близости) между переменными, объединяет эти кластеры друг с другом в более крупные, пока не останется только один. На выходе процедуры получается дендрограмма - древовидный граф, построенный по матрице мер сходства (различия), который визуализирует взаимные расстояния между переменными из заданной совокупности. В случае корреляций, матрицей различия обычно берётся Mdist=||1||-Mcorr , где ||1|| - матрица единиц того же размера, что и корреляционная матрица Mcorr. В модуле scipy построить дендрограмму по матрице корреляций можно в несколько строк:

import scipy.cluster.hierarchy as hac

z = hac.linkage(1-corrMatrix, method='complete')

hac.dendrogram(z, colorthreshold=3, leaf_rotation=90., labels=allKeDF.columns)

plt.title('Дендрограмма иерархического кластерного анализа по матрице корреляций KE', fontsize=12)

plt.ylabel('Мера различия',fontsize=10)

plt.xlabel('KE',fontsize=10)

plt.show()

На рисунке 11 приведена дендрограмма, полученная из матрицы корреляций временных рядов метрики здоровья 150 конфигурационных единиц из рисунка 3, на которой алгоритм иерархической кластеризации разными цветами выделил кластеры КЕ с коррелирующим поведением метрик, по сути, разбил всю совокупность КЕ системы на связанные группы (подсистемы).  В отсутствие РСМ системы, такое разбиение уже выявляет какую-то структуру системы и может быть полезно, например, при поиске первопричин инцидентов.

Рисунок 11. Дендрограмма из корреляционной матрицы временных рядов метрики здоровья для 150 самых изменчивых КЕ в системе.