Throttling a ochrana před falešnými alerty pomocí min/max/avg

Pokud používáte Throttling u stavových položek můžete se potkat s falešně pozitivními alerty. Throttling vám totiž neumožňuje použít funkce min, max nebo avg pro vyhodnocení více hodnot. Je to proto, že Zabbix stejné, po sobě jdoucí stavy zahazuje.

Popis problematiky

U stavových položek, jako jsou stavy Windows služeb nejspíše používáte filtrování stejných hodnot v řadě (tzv. Throttling). Jistě jste si tedy všimli, že Throttling nemůžete použít, protože se pak neaktivuje trigger, který je standardně nastaven na 3 po sobě jdoucí hodnoty. Nicméně existuje řešení, jak tuto situaci změnit. Toto řešení vám umožní v rozsáhlých systémech ušetřit významné množství zdrojů tím, že nebudete ukládat nerelavantní data. Návod vychází ze standardní šablony pro Windows služby a slouží jako obecný příklad. Pokud například máte 1000 Windows serverů, na každém běží 100 služeb a kontrola probíhá každou minutu, pak bez tohoto vylepšení se průměrně každou sekundu načte 1 660 hodnot. S touto malou změnou v konfiguraci se situace změní na odhadem 0-100 hodnot za minutu, v závislosti na četnosti změn stavu služeb. Uvedená čísla jsou orientační a ve vašem prostředí se mohou lišit.

Snadné řešení

Pro vyřešení tohoto problému můžete použít preprocessing. Ten provede manipulaci s chybovou hodnotou (přidá časovou značku) tak, aby byla chybová hodnota pokaždé jiná. Chybová hodnota tedy projde skrz throttling (discard unchanged). Hodnota indikující správný stav se opakuje a je pomocí throttlingu (discard unchanged) zahazována. Nastavení můžete v preprocessingu provést následovně:

  • První krok přidává časovou značku k chybové hodnotě
  • Druhý krok zahazuje nezměněné hodnoty
  • Třetí krok z časové značky vytáhne původní chybovou hodnotu

Přidání časové značky je jednoduché:

if (value == 0 ) {
  return value;
} else {
  return (Math.floor(Date.now() / 1000) - 1707000000 )*1000 + value;
}

Po průchodu throttlingem získáte zpět původní hodnotu pomocí výrazu:

return value % 1000;

Výše uvedený příklad funguje pro chybové stavy od 1 – 999 a pro stav s hodnotou 0, kdy je stav OK.

S výše uvedeným preprocessingem můžete stále používat definici triggeru s funkcemi min/max/avg a bude to fungovat dle očekávání. Je to proto, že chybové hodnoty máte v klasickém intervalu:

min(//service.info["{#SERVICE.NAME}",state],#3)<>0