From 0843cb55d817cfc750d9f9d399069500e3ccf445 Mon Sep 17 00:00:00 2001 From: rldyourmnd Date: Thu, 27 Aug 2026 21:28:38 +0500 Subject: [PATCH] fix(alerts): keep ticket recovery outcomes fresh --- internal/observabilityrules/openobserve.go | 5 ++++- internal/observabilityrules/rules_test.go | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/internal/observabilityrules/openobserve.go b/internal/observabilityrules/openobserve.go index 1a27763..15cfc92 100644 --- a/internal/observabilityrules/openobserve.go +++ b/internal/observabilityrules/openobserve.go @@ -71,7 +71,10 @@ func RenderOpenObserve(bundle Bundle, destination string, enable bool) (OpenObse } for _, rule := range bundle.Rules { priority := 3 - silence := 60 + // OpenObserve v0.92 pauses outcome evaluation during silence rather + // than suppressing notification delivery alone. Keep ticket recovery + // fresh enough to trust while still spacing repeat notifications. + silence := 15 if rule.Severity == "page" { priority = 1 silence = 10 diff --git a/internal/observabilityrules/rules_test.go b/internal/observabilityrules/rules_test.go index 8f1e462..8ce3b7c 100644 --- a/internal/observabilityrules/rules_test.go +++ b/internal/observabilityrules/rules_test.go @@ -160,3 +160,23 @@ func TestRenderOpenObserveConvertsSecondsToMinuteSchedule(t *testing.T) { }) } } + +func TestRenderOpenObserveBoundsStaleRecoveryDuringSilence(t *testing.T) { + bundle, err := Load("../../config/observability-rules.yaml") + if err != nil { + t.Fatal(err) + } + rendered, err := RenderOpenObserve(bundle, "fleet_oncall", true) + if err != nil { + t.Fatal(err) + } + for index, alert := range rendered.Alerts { + want := 15 + if bundle.Rules[index].Severity == "page" { + want = 10 + } + if alert.TriggerCondition.Silence != want { + t.Fatalf("alert %s silence=%d, want %d", alert.Name, alert.TriggerCondition.Silence, want) + } + } +}