0

そのため、環境や機能ごとのグループと比較して、非常に多くの例外をスローするマシンを見つけようとしています。直観的には、負荷とタスクのタイプはグループ全体でかなり類似している必要があるため、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
}
4

1 に答える 1