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)