Frozen dataclass covering sustained CPU load, bursts above a baseline, and starvation dips.

  • Ceilingmax_percent caps sustained CPU usage across duration. Breach: severity error.
  • Spikespike_ratio + min_spike_delta detect relative growth over the baseline. Severity warning.
  • Dropdrop_ratio + min_drop_delta catch abrupt starvation (off by default). Severity warning.

max_percent is measured in 0–100 percent units. Defaults match the source verbatim.

Fields

NameTypeDescriptionDefault
durationstr | intShort evaluation window."2m"
baseline_durationstr | intBaseline window for the comparison."20m"
max_percentfloat | NoneCeiling in CPU%, range (0, 100]. None disables ceiling mode.90.0
spike_ratiofloat | NoneGrowth factor vs. baseline.2.5
min_spike_deltafloat | NoneAbsolute CPU% delta floor for a spike.30.0
drop_ratiofloat | NoneDecline factor in (0, 1).None
min_drop_deltafloat | NoneAbsolute CPU% delta floor for a drop.None

Computed properties: duration_sec, baseline_duration_sec.

Example

import snitchbot
from snitchbot import AnomalyConfig, CpuAnomalyConfig

snitchbot.init(
    "ingest-worker",
    anomaly=AnomalyConfig(
        cpu=CpuAnomalyConfig(
            max_percent=85.0,
            spike_ratio=3.0,
            min_spike_delta=40.0,
        ),
    ),
)

Telegram shows:

🟠 anomaly · ingest-worker · c82b14
CPU spike: 72% (baseline 18%, ×4.0)
Details
  time      11:21:02 UTC
  pid       1550
  type      cpu_spike
  window    2m
  baseline  18%
  current   72%

Ceiling variant:

🔴 anomaly · ingest-worker · d9f0b2
CPU ceiling: 94% (limit 90%)
Details
  time      11:22:15 UTC
  pid       1550
  type      cpu_ceiling
  window    2m
  baseline  60%
  current   94%

Notes

Construction-time validation raises InvalidAnomalyConfigError on max_percent outside (0, 100], spike_ratio outside (0, 100], or drop_ratio outside (0, 1).