Так что я пытаюсь найти машины, которые выдают исключительно много исключений по сравнению с их группой по среде и функциям.Интуиция заключается в том, что тип нагрузки и задачи должен быть примерно одинаковым во всей группе, поэтому, если один компьютер генерирует намного больше исключений, он, вероятно, каким-то образом находится в плохом состоянии и должен обслуживаться.
Это работает довольно хорошо длябольшие группы машин, но для небольших групп есть проблема: если машин очень мало, и только одна из них выдает много исключений, она может не обнаружиться.Причина состоит в том, что, поскольку этот datapoint является парой общего вычисления stddev и среднего значения для группы, среднее значение и stddev смещены в сторону этого выброса.
Решение состоит в том, чтобы либо каким-либо образом вычесть эту точку данных из вычисленногоstddev и среднее значение для всей группы или для вычисления стандартного значения stddev и среднего значения для каждой комбинации машина / среда / функция (исключая рассматриваемую машину из расчета stddev / среднее) вместо просто по среде / группе функций.
Вот текущий код, который делает это с помощью среды / функции.Есть ли элегантное решение расширить его, чтобы сделать машину / среду / функцию?
// Find sick machines
let SickMachinesAt = (AtTime:datetime , TimeWindow:timespan = 1h, Sigmas:double = 3.0, MinimumExceptionsToTrigger:int = 10) {
// These are the exceptions we are looking at (time window constrained)
let Exceptions = exception
| where EventInfo_Time between((AtTime - TimeWindow ) .. AtTime);
// Calculate mean and stddev for each bin of environmentName + machineFunction
let MeanAndStdDev = Exceptions
| summarize count() by environmentName, machineFunction, machineName
| summarize avg(count_), stdev(count_) by environmentName, machineFunction
| order by environmentName, machineFunction;
let MachinesWithMeanAndStdDev = Exceptions
| summarize count() by environmentName, machineFunction, machineName
| join kind=fullouter MeanAndStdDev on environmentName, machineFunction;
let SickMachines = MachinesWithMeanAndStdDev |
project machineName,
machineFunction,
environmentName,
totalExceptionCount = count_,
cutoff = avg_count_ + Sigmas * stdev_count_,
signalStrength = ((count_ - avg_count_) / stdev_count_)
| where totalExceptionCount > cutoff and totalExceptionCount > MinimumExceptionsToTrigger
| order by signalStrength desc;
SickMachines
}