Skip to content

Commit b8bdc00

Browse files
committed
events ignore silences - fix
1 parent 03967b5 commit b8bdc00

2 files changed

Lines changed: 97 additions & 2 deletions

File tree

backend/eventd/eventd.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -765,6 +765,15 @@ func (e *Eventd) handleFailure(ctx context.Context, event *corev2.Event) error {
765765
if err != nil {
766766
return err
767767
}
768+
769+
// Apply silenced entries to the TTL failure event, just as handleMessage
770+
// does for normal check events, so that the not_silenced filter can
771+
// correctly suppress alerts during maintenance windows.
772+
getSilenced(ctx, failedCheckEvent, e.silencedCache)
773+
if len(failedCheckEvent.Check.Silenced) > 0 {
774+
failedCheckEvent.Check.IsSilenced = true
775+
}
776+
768777
updatedEvent, _, err := e.eventStore.UpdateEvent(ctx, failedCheckEvent)
769778
if err != nil {
770779
if _, ok := err.(*store.ErrInternal); ok {

backend/eventd/eventd_test.go

Lines changed: 88 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"github.com/sensu/sensu-go/backend/store/cache"
2323
storev2 "github.com/sensu/sensu-go/backend/store/v2"
2424
"github.com/sensu/sensu-go/backend/store/v2/storetest"
25+
"github.com/sensu/sensu-go/testing/mockbus"
2526
"github.com/sensu/sensu-go/testing/mockstore"
2627
)
2728

@@ -304,8 +305,8 @@ func TestCheckTTL(t *testing.T) {
304305
func TestCreateFailedCheckEventWithTTLStatus(t *testing.T) {
305306
// Test that TTL status is properly handled when creating failed check events
306307
tests := []struct {
307-
name string
308-
ttlStatus int32
308+
name string
309+
ttlStatus int32
309310
expectedStatus uint32
310311
description string
311312
}{
@@ -365,6 +366,91 @@ func TestCreateFailedCheckEventWithTTLStatus(t *testing.T) {
365366
}
366367
}
367368

369+
func TestHandleFailureSilencing(t *testing.T) {
370+
tests := []struct {
371+
name string
372+
silencedEntries []corev2.Resource
373+
expectSilenced bool
374+
expectedIDs []string
375+
}{
376+
{
377+
name: "TTL failure event is not silenced when no matching silence entries",
378+
expectSilenced: false,
379+
},
380+
{
381+
name: "TTL failure event is silenced by entity subscription",
382+
silencedEntries: []corev2.Resource{
383+
corev2.FixtureSilenced("entity:foo:*"),
384+
},
385+
expectSilenced: true,
386+
expectedIDs: []string{"entity:foo:*"},
387+
},
388+
{
389+
name: "TTL failure event is silenced by check name",
390+
silencedEntries: []corev2.Resource{
391+
corev2.FixtureSilenced("*:check_cpu"),
392+
},
393+
expectSilenced: true,
394+
expectedIDs: []string{"*:check_cpu"},
395+
},
396+
{
397+
name: "TTL failure event is silenced by entity+check",
398+
silencedEntries: []corev2.Resource{
399+
corev2.FixtureSilenced("entity:foo:check_cpu"),
400+
},
401+
expectSilenced: true,
402+
expectedIDs: []string{"entity:foo:check_cpu"},
403+
},
404+
}
405+
for _, tt := range tests {
406+
t.Run(tt.name, func(t *testing.T) {
407+
event := corev2.FixtureEvent("foo", "check_cpu")
408+
event.Check.Ttl = 60
409+
event.Check.Executed = time.Now().Add(-120 * time.Second).Unix()
410+
411+
eventStore := &mockstore.MockStore{}
412+
eventStore.On("GetEventByEntityCheck", mock.Anything, "foo", "check_cpu").Return(event, nil)
413+
eventStore.On("UpdateEvent", mock.Anything).Return(event, (*corev2.Event)(nil), nil)
414+
415+
bus := &mockbus.MockBus{}
416+
bus.On("Publish", messaging.TopicEvent, mock.Anything).Return(nil)
417+
418+
silencedCache := cache.NewFromResources(tt.silencedEntries, false)
419+
420+
ctx := context.WithValue(context.Background(), corev2.NamespaceKey, "default")
421+
e := &Eventd{
422+
eventStore: eventStore,
423+
bus: bus,
424+
silencedCache: silencedCache,
425+
ctx: ctx,
426+
errChan: make(chan error, 1),
427+
Logger: NoopLogger{},
428+
}
429+
430+
err := e.handleFailure(ctx, event)
431+
require.NoError(t, err)
432+
433+
// Verify the event was published
434+
bus.AssertCalled(t, "Publish", messaging.TopicEvent, mock.Anything)
435+
436+
// Get the event that was passed to UpdateEvent
437+
calls := eventStore.Calls
438+
for _, call := range calls {
439+
if call.Method == "UpdateEvent" {
440+
publishedEvent := call.Arguments[0].(*corev2.Event)
441+
if tt.expectSilenced {
442+
assert.True(t, publishedEvent.Check.IsSilenced, "event should be silenced")
443+
assert.Equal(t, tt.expectedIDs, publishedEvent.Check.Silenced)
444+
} else {
445+
assert.False(t, publishedEvent.Check.IsSilenced, "event should not be silenced")
446+
assert.Empty(t, publishedEvent.Check.Silenced)
447+
}
448+
}
449+
}
450+
})
451+
}
452+
}
453+
368454
func TestBuryConditions(t *testing.T) {
369455
tests := []struct {
370456
name string

0 commit comments

Comments
 (0)