~xenrox/ntfy-alertmanager

c1011cd77595b7bb5ba1c33c798e8a88fa8bbbcf — Thorben Günther 1 year, 9 months ago ee9dfe2 alert-mode
cache: Take alert status (firing, resolved) into account

Otherwise a resolved alert would not trigger a notification, since its
fingerprint - which is a generated hash from the labels - remains the
same.
2 files changed, 13 insertions(+), 6 deletions(-)

M cache.go
M main.go
M cache.go => cache.go +11 -4
@@ 6,9 6,11 @@ import (
)

type fingerprint string
type status string

type cachedAlert struct {
	expires time.Time
	status  status
}

type cache struct {


@@ 39,18 41,23 @@ func (c *cache) cleanup() {
	}
}

func (c *cache) set(f fingerprint) {
func (c *cache) set(f fingerprint, s status) {
	c.mu.Lock()
	defer c.mu.Unlock()
	alert := new(cachedAlert)
	alert.expires = time.Now().Add(c.duration)
	alert.status = s

	c.alerts[f] = alert
}

func (c *cache) contains(f fingerprint) bool {
func (c *cache) contains(f fingerprint, s status) bool {
	c.mu.Lock()
	defer c.mu.Unlock()
	_, ok := c.alerts[f]
	return ok
	alert, ok := c.alerts[f]
	if ok {
		return alert.status == s
	}

	return false
}

M main.go => main.go +2 -2
@@ 54,11 54,11 @@ type notification struct {
func (rcv *receiver) singleAlertNotifications(p *payload) []*notification {
	var notifications []*notification
	for _, alert := range p.Alerts {
		if rcv.cache.contains(alert.Fingerprint) {
		if rcv.cache.contains(alert.Fingerprint, status(alert.Status)) {
			rcv.logger.Debugf("Alert %s skipped: Still in cache", alert.Fingerprint)
			continue
		}
		rcv.cache.set(alert.Fingerprint)
		rcv.cache.set(alert.Fingerprint, status(alert.Status))

		n := new(notification)