そのため、環境や機能ごとのグループと比較して、非常に多くの例外をスローするマシンを見つけようとしています。直観的には、負荷とタスクのタイプはグループ全体でかなり類似している必要があるため、1 台のマシンがより多くの例外をスローする場合、そのマシンは何らかの形で悪い状態にある可能性があり、サービスを提供する必要があります。
これはマシンの大きなグループではかなりうまく機能しますが、小さなグループでは問題があります。マシンが非常に少なく、そのうちの 1 つだけが多くの例外をスローしている場合、検出されない可能性があります。その理由は、そのデータポイントがグループの一般的な 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
}