phraser: name the service that is down (V-444)
Stub and LLM paths both read loop.DownServices, so the message can never name a service the predicate did not fire on. Two down at once are both named — he needs the blast radius.
This commit is contained in:
@@ -78,12 +78,14 @@ func TestPhraseNudgeBreakDeskDuration(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestPhraseNudgeServiceDownNamedService(t *testing.T) {
|
||||
// a service_down fact whose Key is the specific service name → the phrase
|
||||
// names the service, not just "service down".
|
||||
// one fact per kuma monitor → the phrase names the monitor that is down.
|
||||
now := time.Now().UTC()
|
||||
st := loop.State{
|
||||
Now: now,
|
||||
Facts: map[string]store.Fact{"service_down": {Key: "nginx", Ts: now, Source: "poll:healthcheck", Value: `"down"`}},
|
||||
Now: now,
|
||||
Facts: map[string]store.Fact{
|
||||
"service_down:nginx": {Key: "service_down:nginx", Ts: now, Source: loop.ServiceDownSource, Value: `"down"`},
|
||||
"service_down:db": {Key: "service_down:db", Ts: now, Source: loop.ServiceDownSource, Value: `"up"`},
|
||||
},
|
||||
}
|
||||
c := loop.Candidate{Rule: loop.ServiceDownRule(), Severity: loop.Sev4, State: st}
|
||||
pn, _ := NewStub().PhraseNudge(context.Background(), c)
|
||||
@@ -96,12 +98,12 @@ func TestPhraseNudgeServiceDownNamedService(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestPhraseNudgeServiceDownGenericKey(t *testing.T) {
|
||||
// the rule key itself ("service_down") rather than a specific service →
|
||||
// the generic phrase, not a phantom "service_down down on homesrv".
|
||||
// the old aggregate key, still in the store from before the per-monitor
|
||||
// facts landed → the generic phrase, never a phantom "service_down down".
|
||||
now := time.Now().UTC()
|
||||
st := loop.State{
|
||||
Now: now,
|
||||
Facts: map[string]store.Fact{"service_down": {Key: "service_down", Ts: now, Source: "poll:healthcheck", Value: `"down"`}},
|
||||
Facts: map[string]store.Fact{"service_down": {Key: "service_down", Ts: now, Source: loop.ServiceDownSource, Value: `"down"`}},
|
||||
}
|
||||
c := loop.Candidate{Rule: loop.ServiceDownRule(), Severity: loop.Sev4, State: st}
|
||||
pn, _ := NewStub().PhraseNudge(context.Background(), c)
|
||||
@@ -110,6 +112,26 @@ func TestPhraseNudgeServiceDownGenericKey(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// Two monitors down at once must both be named — he needs to know the blast
|
||||
// radius, and "a service is down" was the whole defect being fixed here.
|
||||
func TestPhraseNudgeServiceDownNamesEveryDownMonitor(t *testing.T) {
|
||||
now := time.Now().UTC()
|
||||
st := loop.State{
|
||||
Now: now,
|
||||
Facts: map[string]store.Fact{
|
||||
"service_down:nginx": {Key: "service_down:nginx", Ts: now, Source: loop.ServiceDownSource, Value: `"down"`},
|
||||
"service_down:db": {Key: "service_down:db", Ts: now, Source: loop.ServiceDownSource, Value: `"down"`},
|
||||
},
|
||||
}
|
||||
c := loop.Candidate{Rule: loop.ServiceDownRule(), Severity: loop.Sev4, State: st}
|
||||
pn, _ := NewStub().PhraseNudge(context.Background(), c)
|
||||
for _, want := range []string{"nginx", "db"} {
|
||||
if !strings.Contains(pn.Body, want) {
|
||||
t.Fatalf("body should name %q, got %q", want, pn.Body)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestPhraseNudgeUnknownRuleFallsBack(t *testing.T) {
|
||||
// a rule without a dedicated template — generic fallback names the rule +
|
||||
// severity gist. never empty.
|
||||
|
||||
Reference in New Issue
Block a user