from i7lib.client import run from i7lib.timeutils import now, to_datetime ID_LOAD_INDEX = 49 ID_JOB_HEARTBEAT = 50 ID_HIGH_CPU_PULSE = 51 ID_HIGH_CPU_ALARM = 52 THRESHOLD_SIGNAL = "deb13kde-high-cpu-threshold" prev_over_threshold = None def log(msg): dt = to_datetime(now()).strftime("%Y-%m-%d %H:%M:%S") print(f"[{dt}] {msg}") def logic(plant): global prev_over_threshold cpu = plant.state.get("deb13kde-cpu", 0.0) ram = plant.state.get("deb13kde-ram", 0.0) load_index = (cpu + ram) / 2.0 batch = plant.new_write_batch() batch.add(ID_LOAD_INDEX, load_index, "deb13kde-load-index") batch.add(ID_JOB_HEARTBEAT, now(), "deb13kde-job-heartbeat") if THRESHOLD_SIGNAL not in plant.state: log(f"WARNING: {THRESHOLD_SIGNAL} not present in plant.state - skipping alarm evaluation") plant.send(batch) return threshold = plant.state[THRESHOLD_SIGNAL] over_threshold = cpu > threshold batch.add(ID_HIGH_CPU_ALARM, 1.0 if over_threshold else 0.0, "deb13kde-high-cpu-alarm") if prev_over_threshold is not None and over_threshold and not prev_over_threshold: log(f"CPU {cpu:.1f}% crossed threshold {threshold:.1f}% - firing pulse") batch.add(ID_HIGH_CPU_PULSE, 1.0, "deb13kde-high-cpu-pulse") plant.send(batch) if prev_over_threshold is None: log(f"first tick: cpu={cpu:.1f} ram={ram:.1f} threshold={threshold:.1f}") prev_over_threshold = over_threshold if __name__ == "__main__": run(logic, interval_ms=1000, offset_ms=200)