main.go: Move marker metric registering into types/types.go

Instead of registering marker metrics inside of
cmd/alertmanager/main.go, register them in types/types.go, encapsulating
marker specific logic in its module, not in main.go. In addition it
paves the path for removing the usage of the global metric registry in
the future, by taking a local metric registerer.

Signed-off-by: Max Leonard Inden <IndenML@gmail.com>
This commit is contained in:
Max Leonard Inden 2019-02-05 14:18:21 +01:00
parent 083639e31e
commit 09a7370572
No known key found for this signature in database
GPG Key ID: 5403C5464810BC26
6 changed files with 67 additions and 36 deletions

View File

@ -67,9 +67,7 @@ var (
Name: "alertmanager_config_last_reload_success_timestamp_seconds",
Help: "Timestamp of the last successful configuration reload.",
})
alertsActive prometheus.GaugeFunc
alertsSuppressed prometheus.GaugeFunc
requestDuration = prometheus.NewHistogramVec(
requestDuration = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "alertmanager_http_request_duration_seconds",
Help: "Histogram of latencies for HTTP requests.",
@ -107,27 +105,6 @@ func instrumentHandler(handlerName string, handler http.HandlerFunc) http.Handle
)
}
func newAlertMetricByState(marker types.Marker, st types.AlertState) prometheus.GaugeFunc {
return prometheus.NewGaugeFunc(
prometheus.GaugeOpts{
Name: "alertmanager_alerts",
Help: "How many alerts by state.",
ConstLabels: prometheus.Labels{"state": string(st)},
},
func() float64 {
return float64(marker.Count(st))
},
)
}
func newMarkerMetrics(marker types.Marker) {
alertsActive = newAlertMetricByState(marker, types.AlertStateActive)
alertsSuppressed = newAlertMetricByState(marker, types.AlertStateSuppressed)
prometheus.MustRegister(alertsActive)
prometheus.MustRegister(alertsSuppressed)
}
const defaultClusterAddr = "0.0.0.0:9094"
func main() {
@ -225,8 +202,7 @@ func run() int {
notificationLog.SetBroadcast(c.Broadcast)
}
marker := types.NewMarker()
newMarkerMetrics(marker)
marker := types.NewMarker(prometheus.DefaultRegisterer)
silenceOpts := silence.Options{
SnapshotFile: filepath.Join(*dataDir, "silences"),

View File

@ -18,6 +18,7 @@ import (
"time"
"github.com/go-kit/kit/log"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/model"
"github.com/prometheus/alertmanager/config"
@ -145,7 +146,7 @@ func TestInhibitRuleMatches(t *testing.T) {
TargetMatch: map[string]string{"t": "1"},
Equal: model.LabelNames{"e"},
}
m := types.NewMarker()
m := types.NewMarker(prometheus.NewRegistry())
ih := NewInhibitor(nil, []*config.InhibitRule{&cr}, m, nopLogger)
ir := ih.rules[0]
now := time.Now()
@ -320,7 +321,7 @@ func TestInhibit(t *testing.T) {
},
} {
ap := newFakeAlerts(tc.alerts)
mk := types.NewMarker()
mk := types.NewMarker(prometheus.NewRegistry())
inhibitor := NewInhibitor(ap, []*config.InhibitRule{inhibitRule()}, mk, nopLogger)
go func() {

View File

@ -22,6 +22,7 @@ import (
"time"
"github.com/go-kit/kit/log"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/model"
"github.com/stretchr/testify/require"
@ -586,7 +587,7 @@ func TestSilenceStage(t *testing.T) {
t.Fatal(err)
}
marker := types.NewMarker()
marker := types.NewMarker(prometheus.NewRegistry())
silencer := NewSilenceStage(silences, marker)
in := []model.LabelSet{

View File

@ -27,6 +27,7 @@ import (
"github.com/kylelemons/godebug/pretty"
"github.com/prometheus/alertmanager/store"
"github.com/prometheus/alertmanager/types"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/model"
"github.com/stretchr/testify/require"
)
@ -83,7 +84,7 @@ func init() {
// If the channel of a listener is at its limit, `alerts.Lock` is blocked, whereby
// a listener can not unsubscribe as the lock is hold by `alerts.Lock`.
func TestAlertsSubscribePutStarvation(t *testing.T) {
marker := types.NewMarker()
marker := types.NewMarker(prometheus.NewRegistry())
alerts, err := NewAlerts(context.Background(), marker, 30*time.Minute, log.NewNopLogger())
if err != nil {
t.Fatal(err)
@ -134,7 +135,7 @@ func TestAlertsSubscribePutStarvation(t *testing.T) {
}
func TestAlertsPut(t *testing.T) {
marker := types.NewMarker()
marker := types.NewMarker(prometheus.NewRegistry())
alerts, err := NewAlerts(context.Background(), marker, 30*time.Minute, log.NewNopLogger())
if err != nil {
t.Fatal(err)
@ -159,7 +160,7 @@ func TestAlertsPut(t *testing.T) {
}
func TestAlertsSubscribe(t *testing.T) {
marker := types.NewMarker()
marker := types.NewMarker(prometheus.NewRegistry())
alerts, err := NewAlerts(context.Background(), marker, 30*time.Minute, log.NewNopLogger())
if err != nil {
t.Fatal(err)
@ -248,7 +249,7 @@ func TestAlertsSubscribe(t *testing.T) {
}
func TestAlertsGetPending(t *testing.T) {
marker := types.NewMarker()
marker := types.NewMarker(prometheus.NewRegistry())
alerts, err := NewAlerts(context.Background(), marker, 30*time.Minute, log.NewNopLogger())
if err != nil {
t.Fatal(err)
@ -291,7 +292,7 @@ func TestAlertsGetPending(t *testing.T) {
}
func TestAlertsGC(t *testing.T) {
marker := types.NewMarker()
marker := types.NewMarker(prometheus.NewRegistry())
alerts, err := NewAlerts(context.Background(), marker, 200*time.Millisecond, log.NewNopLogger())
if err != nil {
t.Fatal(err)

View File

@ -18,6 +18,7 @@ import (
"sync"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/model"
)
@ -55,10 +56,14 @@ type Marker interface {
}
// NewMarker returns an instance of a Marker implementation.
func NewMarker() Marker {
return &memMarker{
func NewMarker(r prometheus.Registerer) Marker {
m := &memMarker{
m: map[model.Fingerprint]*AlertStatus{},
}
m.registerMetrics(r)
return m
}
type memMarker struct {
@ -67,6 +72,27 @@ type memMarker struct {
mtx sync.RWMutex
}
func (m *memMarker) registerMetrics(r prometheus.Registerer) {
newAlertMetricByState := func(st AlertState) prometheus.GaugeFunc {
return prometheus.NewGaugeFunc(
prometheus.GaugeOpts{
Name: "alertmanager_alerts",
Help: "How many alerts by state.",
ConstLabels: prometheus.Labels{"state": string(st)},
},
func() float64 {
return float64(m.Count(st))
},
)
}
alertsActive := newAlertMetricByState(AlertStateActive)
alertsSuppressed := newAlertMetricByState(AlertStateSuppressed)
r.MustRegister(alertsActive)
r.MustRegister(alertsSuppressed)
}
// Count alerts of a given state.
func (m *memMarker) Count(states ...AlertState) int {
count := 0

View File

@ -20,6 +20,7 @@ import (
"testing"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/model"
"github.com/stretchr/testify/require"
)
@ -366,3 +367,28 @@ func TestAlertSliceSort(t *testing.T) {
}
}
}
type fakeRegisterer struct {
registeredCollectors []prometheus.Collector
}
func (r *fakeRegisterer) Register(prometheus.Collector) error {
return nil
}
func (r *fakeRegisterer) MustRegister(c ...prometheus.Collector) {
r.registeredCollectors = append(r.registeredCollectors, c...)
}
func (r *fakeRegisterer) Unregister(prometheus.Collector) bool {
return false
}
func TestNewMarkerRegistersMetrics(t *testing.T) {
fr := fakeRegisterer{}
NewMarker(&fr)
if len(fr.registeredCollectors) == 0 {
t.Error("expected NewMarker to register metrics on the given registerer")
}
}