предисловие
Высокая доступность сервисов неотделима от стабильного мониторинга.Если есть проблема с сервисом, как разработчик, вы можете найти проблему в кратчайшие сроки.Исправление и выход в интернет - лучший способ остановить потерю бизнеса. С быстрым развитием бизнеса это повлияет на стабильность системы.Для удовлетворения более высоких требований традиционный дизайн основных индикаторов сигналов тревоги и триггеров имеет много ограничений в использовании.Конфигурация правил сигналов тревоги зависит от субъективного опыта разработчиков. Настройка правила высокой доступности требует многократных практик, пока система или внешние зависимости не изменятся., и настроить правила в соответствии с новыми данными, не только разработка исчерпана, но и ложная тревога и пропуск тревоги очень серьезны. Перед лицом этих проблем мы спроектировали и разработали интеллектуальную систему сигнализации.Самая большая разница между ней и традиционной сигнализацией заключается в том, что она интегрируетАлгоритмы машинного обучения, с функцией самообучения, в соответствии с эволюцией системыАвтоматическая настройкаПорог, который может значительно уменьшить количество ложных срабатываний и ложных отрицательных результатов.
анализ данных
Построив вероятность ошибки в отчетных данных проекта в виде линейного графика, можно найти некоторые правила ошибок (вот статистика вероятности):
С точки зрения времени, временной ряд вероятности ошибки имеет две различные характеристики (как показано на рисунке выше):
- периодический. Тенденция изменения количества ошибок примерно одинакова каждый день, количество отсчетов в дневной пик и вечерний пик велико, вероятность ошибки стабильна на определенном значении, а значение вероятности нестабильно с утра до 8: 00 утра.
- независимость. На вероятность возникновения ошибки влияет только внутренняя система, и она не будет меняться при колебаниях потока, то есть при достаточной выборке изменение вероятности может соответствовать один к одному внутренним проблемам системы. .
В самом начале мы попытались настроить правила оповещений с помощью традиционных решений (как показано на следующем рисунке):
Но если просто настроить сигнализацию по количеству ошибок, бизнес упадет в тупик.противоречие: Предполагая, что установлено 100 исключений в соответствии с пиковым расходом, сигнализация не будет срабатывать в течение периода низкой пиковой нагрузки.В противном случае, если в течение периода низкой пиковой нагрузки установлено 10 исключений, тревога будет продолжаться в течение периода пиковой нагрузки.
Чтобы решить эту задачу, мы сравниваем значения последовательности в текущий момент и в предыдущий момент, и используем алгоритм для отслеживания скорости роста, но этот метод не исключает влияние периодичности на данные, и ложные положительная скорость и ложноотрицательная скорость относительно велики. Позже выяснилось, что на платформе есть сервисы, которые предоставляют услуги базовой модели данных.Базовая модель данных учитывает периодические характеристики временных рядов, поэтому мы попытались загрузить бизнес-данные на платформу управления услугами Meituan Dianping.После теста , было обнаружено, что базовая модель игнорировала характеристики в реальном времени. , что привело к несвоевременной проверке данных, и по-прежнему существует большое количество ложных срабатываний и ложных отрицаний. Поэтому срочно необходима новая модель обнаружения аномалий для повышения точности сигнализации.
Поскольку данные представляют собой модель временного ряда с сильной периодичностью, мы выбираем альтернативный алгоритм для скользящего среднего,Тройное экспоненциальное сглаживание.Алгоритм тройного экспоненциального сглаживанияможет содержать обатренда такжесезонныйПрогнозируется временной ряд, и алгоритм основан на первом алгоритме экспоненциального сглаживания и втором алгоритме экспоненциального сглаживания.
предсказатель
Один алгоритм экспоненциального сглаживанияНа основе следующего рекуррентного соотношения:
si=αxi+(1-α)si-1
где αпараметр сглаживания,Даi- сглаженное значение предыдущих данных i. Значение равно [0,1]. Чем ближе α к 1, тем ближе сглаженное значение к значению данных в текущий момент времени и тем менее гладкими являются данные. чем ближе α к 0, тем ближе сглаженное значение.Близко к значению сглаживания первых данных i, чем более сглажены данные, значение α обычно можно попробовать несколько раз для достижения наилучшего эффекта.
а такжеТройное экспоненциальное сглаживаниеимеютнакапливатьа такжеумножитьДва метода, следующее кумулятивное три экспоненциального сглаживания
si=α(xi-pi-k)+(1-α)(si-1+ti-1)
ti=ß(si-si-1)+(1-ß)ti-1
pi=γ(xi-si)+(1-γ)pi-kГде k — период, а формула прогноза для трехкратного накопления экспоненциального сглаживания: xi+h=si+hti+pi-k+(h mod k)
Следующая формулаКумулятивное тройное экспоненциальное сглаживание:
si=αxi/pi-k+(1-α)(si-1+ti-1)
ti=ß(si-si-1)+(1-ß)ti-1
pi=γxi/si+(1-γ)pi-kГде k — период, а формула прогноза для трехкратного умножения экспоненциального сглаживания: xi+h=(si+hti)pя-к+(ч по модулю к),Значения α, β и γ находятся между [0, 1], и вы можете поэкспериментировать несколько раз, чтобы добиться наилучшего эффекта.
нижеприведенныйалгоритмЧасть реализации (основная часть):
function calcHoltWinters
(data, st1, bt1, alpha, beta, gamma, seasonal, period, m) {
var len = data.length
var st = Array(len)
var bt = Array(len)
var it = Array(len)
var ft = Array(len)
var i
st[1] = st1
bt[1] = bt1
for (i = 0; i < len; i++) {
ft[i] = 0.0
}
for (i = 0; i < period; i++) {
it[i] = seasonal[i]
}
for (i = 2; i < len; i++) {
if (i - period >= 0) {
st[i] = ((alpha * data[i]) / it[i - period]) +
((1.0 - alpha) * (st[i - 1] + bt[i - 1]))
} else {
st[i] = (alpha * data[i]) + ((1.0 - alpha) *
(st[i - 1] + bt[i - 1]))
}
bt[i] = (gamma * (st[i] - st[i - 1])) +
((1 - gamma) * bt[i - 1])
if (i - period >= 0) {
it[i] = ((beta * data[i]) / st[i]) +
((1.0 - beta) * it[i - period])
}
if (i + m >= period) {
ft[i + m] = (st[i] + (m * bt[i])) *
it[i - period + m]
}
}
return ft
}
function getForecast (data, alpha, beta, gamma, period, m) {
var seasons, seasonal, st1, bt1
if (!validArgs(data, alpha, beta, gamma, period, m)) {
return
}
seasons = Math.floor(data.length / period)
st1 = data[0]
bt1 = initialTrend(data, period)
seasonal = seasonalIndices(data, period, seasons)
return calcHoltWinters(
data,
st1,
bt1,
alpha,
beta,
gamma,
seasonal,
period,
m
)
}
function seasonalIndices (data, period, seasons) {
var savg, obsavg, si, i, j
savg = Array(seasons)
obsavg = Array(data.length)
si = Array(period)
for (i = 0; i < seasons; i++) {
savg[i] = 0.0
}
for (i = 0; i < period; i++) {
si[i] = 0.0
}
for (i = 0; i < seasons; i++) {
for (j = 0; j < period; j++) {
savg[i] += data[(i * period) + j]
}
savg[i] /= period
}
for (i = 0; i < seasons; i++) {
for (j = 0; j < period; j++) {
obsavg[(i * period) + j] = data[(i * period) + j] / savg[i]
}
}
for (i = 0; i < period; i++) {
for (j = 0; j < seasons; j++) {
si[i] += obsavg[(j * period) + i]
}
si[i] /= seasons
}
return si
}
Мы также внедрилиАлгоритм перебора грубой силы, и неоднократно подбирайте параметры, которые лучше всего соответствуют бизнес-данным:[0,2, 0,1, 0,45]
Часть предиктора в основном завершена, а следующая — дизайн, связанный с триггером:
вызывать
Связь между триггерами и детекторами показана на следующем рисунке:
После того, как предиктор предсказывает идеальное значение дня посредством анализа данных и обработки предыдущих нескольких дней, триггер получает данные с 0:00 до текущей точки времени триггера каждый временной интервал, а также идеальное значение и фактическое значение обрабатывается компаратором, чтобы определить, соответствует ли фактическое значение ожидаемому, и следует ли соответствующим образом инициировать сигнал тревоги.
Конструкция триггера показана на следующем рисунке:
По сути, триггер делает следующее: фактическое значение сравнивается с прогнозируемым значением, и тревога не срабатывает. Чтобы повысить точность сигнала тревоги, дисперсия данных прогноза рассчитывается по временным сегментам.Чем больше дисперсия, тем больше флуктуация кривой данных. Когда степень флуктуации велика, пороговое значение, установленное в соответствующий период времени, должно быть установлено шире, чтобы избежать большего количества ложных срабатываний. Затем, когда средняя разница между спрогнозированной кривой и реальной кривой в тот же период времени превышает определенное значение, кратное спрогнозированной кривой, триггер вызовет тревогу Это относительно динамический порог, полученный дисперсией и спрогнозированным значение. В настоящее время мы находимся на текущем этапе.
Однако этот кратный различается при обнаружении разных типов данных, и для разных типов ошибок нужно устанавливать разные кратные значения. Искусственно установленное значение кратности по-прежнему недостаточно точно, и легко вызвать упущение (кратность слишком велика) или ложную тревогу (кратность слишком мала). Поэтому для нас более разумным динамическим порогом является изучение динамического кратного значения из исторических данных.Это цель следующего этапа, чтобы область порога колебаний была как можно более компактной. Как показано на рисунке ниже, внешняя область охвата кривой равна:
Суммировать
После того, как наша система мониторинга сообщит данные, мы можем подавать интеллектуальные сигналы тревоги на основе сообщенных данных, вместо того, чтобы слишком полагаться на ручное эмпирическое суждение с помощью большого количества ручных настроек целевых порогов сегментации, таких как обычная система сигналов тревоги. Умные будильники на основе машинного обучения будут более точными и эффективными. Конечно, с данными можно не только сделать интеллектуальную сигнализацию, но и эта система также имеет больше функций, которые можно глубоко копать и обнаруживать.Интеллектуальная сигнализация - это только предварительный результат комбинации искусственного интеллекта и мониторинга.