From 46e09e2b2cbeefe51e873cafb61ca7a59f4e7a72 Mon Sep 17 00:00:00 2001 From: Fabian Reinartz Date: Thu, 1 Oct 2015 17:50:15 +0200 Subject: [PATCH] Switch to model.Silence --- api.go | 7 ++- provider/mem.go | 10 ++-- provider/provider.go | 4 +- types/types.go | 107 +++++++++++-------------------------------- 4 files changed, 38 insertions(+), 90 deletions(-) diff --git a/api.go b/api.go index e7a6bdb7..e5a5670d 100644 --- a/api.go +++ b/api.go @@ -7,7 +7,6 @@ import ( "strconv" "time" - "github.com/prometheus/common/model" "github.com/prometheus/common/route" "golang.org/x/net/context" @@ -133,7 +132,7 @@ func (api *API) getSilence(w http.ResponseWriter, r *http.Request) { }, nil) } - sil, err := api.silences.Get(model.Fingerprint(sid)) + sil, err := api.silences.Get(sid) if err != nil { http.Error(w, fmt.Sprint("Error getting silence: ", err), http.StatusNotFound) return @@ -157,7 +156,7 @@ func (api *API) setSilence(w http.ResponseWriter, r *http.Request) { err: err, }, nil) } - sil.ID = model.Fingerprint(sid) + sil.ID = sid if err := api.silences.Set(&sil); err != nil { respondError(w, apiError{ @@ -179,7 +178,7 @@ func (api *API) delSilence(w http.ResponseWriter, r *http.Request) { }, nil) } - if err := api.silences.Del(model.Fingerprint(sid)); err != nil { + if err := api.silences.Del(sid); err != nil { respondError(w, apiError{ typ: errorBadData, err: err, diff --git a/provider/mem.go b/provider/mem.go index d6402fbb..16a5e76b 100644 --- a/provider/mem.go +++ b/provider/mem.go @@ -239,12 +239,12 @@ func (n *MemNotifies) Get(dest string, fps ...model.Fingerprint) ([]*types.Notif type MemSilences struct { mtx sync.RWMutex - silences map[model.Fingerprint]*types.Silence + silences map[uint64]*types.Silence } func NewMemSilences() *MemSilences { return &MemSilences{ - silences: map[model.Fingerprint]*types.Silence{}, + silences: map[uint64]*types.Silence{}, } } @@ -276,14 +276,14 @@ func (s *MemSilences) Set(sil *types.Silence) error { defer s.mtx.Unlock() if sil.ID == 0 { - sil.ID = model.Fingerprint(len(s.silences) + 1) + sil.ID = uint64(len(s.silences) + 1) } s.silences[sil.ID] = sil return nil } -func (s *MemSilences) Del(id model.Fingerprint) error { +func (s *MemSilences) Del(id uint64) error { s.mtx.Lock() defer s.mtx.Unlock() @@ -291,7 +291,7 @@ func (s *MemSilences) Del(id model.Fingerprint) error { return nil } -func (s *MemSilences) Get(id model.Fingerprint) (*types.Silence, error) { +func (s *MemSilences) Get(id uint64) (*types.Silence, error) { s.mtx.RLock() defer s.mtx.RUnlock() diff --git a/provider/provider.go b/provider/provider.go index ef9324a4..2bc67cdb 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -56,9 +56,9 @@ type Silences interface { // Set a new silence. Set(*types.Silence) error // Del removes a silence. - Del(model.Fingerprint) error + Del(uint64) error // Get a silence associated with a fingerprint. - Get(model.Fingerprint) (*types.Silence, error) + Get(uint64) (*types.Silence, error) } // Notifies provides information about pending and successful diff --git a/types/types.go b/types/types.go index f9d301c9..f20ca302 100644 --- a/types/types.go +++ b/types/types.go @@ -1,7 +1,6 @@ package types import ( - "encoding/json" "fmt" "hash/fnv" "time" @@ -25,8 +24,8 @@ type Alert struct { model.Alert // The authoritative timestamp. - UpdatedAt time.Time - Timeout bool + UpdatedAt time.Time `json:"-"` + Timeout bool `json:"-"` } // Alerts turns a sequence of internal alerts into a list of @@ -74,22 +73,39 @@ func (f MuteFunc) Mutes(lset model.LabelSet) bool { return f(lset) } // A Silence determines whether a given label set is muted // at the current time. type Silence struct { - ID model.Fingerprint + model.Silence // A set of matchers determining if an alert is affected // by the silence. - Matchers Matchers - // The activity interval of the silence. - StartsAt, EndsAt time.Time - - // Additional creation information. - CreateBy, Comment string + Matchers Matchers `json:"-"` // timeFunc provides the time against which to evaluate // the silence. timeFunc func() time.Time } +// NewSilence creates a new internal Silence from a public silence +// object. +func NewSilence(s *model.Silence) *Silence { + sil := &Silence{ + Silence: *s, + timeFunc: time.Now, + } + for _, m := range s.Matchers { + if !m.IsRegex { + sil.Matchers = append(sil.Matchers, NewMatcher(m.Name, m.Value)) + continue + } + rem, err := NewRegexMatcher(m.Name, m.Value) + if err != nil { + // Must have been sanitized beforehand. + panic(err) + } + sil.Matchers = append(sil.Matchers, rem) + } + return sil +} + func (sil *Silence) Mutes(lset model.LabelSet) bool { t := sil.timeFunc() @@ -100,75 +116,8 @@ func (sil *Silence) Mutes(lset model.LabelSet) bool { return sil.Matchers.Match(lset) } -func (sil *Silence) UnmarshalJSON(b []byte) error { - var v = struct { - ID model.Fingerprint - Matchers []struct { - Name model.LabelName `json:"name"` - Value string `json:"value"` - IsRegex bool `json:"isRegex"` - } `json:"matchers"` - StartsAt time.Time `json:"startsAt"` - EndsAt time.Time `json:"endsAt"` - CreatedBy string `json:"createdBy"` - Comment string `json:"comment,omitempty"` - }{} - - if err := json.Unmarshal(b, &v); err != nil { - return err - } - - sil.ID = v.ID - sil.CreateBy = v.CreatedBy - sil.Comment = v.Comment - sil.StartsAt = v.StartsAt - sil.EndsAt = v.EndsAt - - for _, m := range v.Matchers { - if !m.IsRegex { - sil.Matchers = append(sil.Matchers, NewMatcher(m.Name, m.Value)) - continue - } - rem, err := NewRegexMatcher(m.Name, m.Value) - if err != nil { - return err - } - sil.Matchers = append(sil.Matchers, rem) - } - return nil -} - -func (sil *Silence) MarshalJSON() ([]byte, error) { - type matcher struct { - Name model.LabelName `json:"name"` - Value string `json:"value"` - IsRegex bool `json:"isRegex"` - } - var v = struct { - ID model.Fingerprint - Matchers []matcher `json:"matchers"` - StartsAt time.Time `json:"startsAt"` - EndsAt time.Time `json:"endsAt"` - CreatedBy string `json:"createdBy"` - Comment string `json:"comment,omitempty"` - }{ - ID: sil.ID, - StartsAt: sil.StartsAt, - EndsAt: sil.EndsAt, - CreatedBy: sil.CreateBy, - Comment: sil.Comment, - } - - for _, m := range sil.Matchers { - v.Matchers = append(v.Matchers, matcher{ - Name: m.Name, - Value: m.Value, - IsRegex: m.isRegex, - }) - } - return json.Marshal(v) -} - +// Notify holds information about the last notification state +// of an Alert. type Notify struct { Alert model.Fingerprint SendTo string