add label to the metrics

Signed-off-by: Honglin Feng <tifayuki@gmail.com>
This commit is contained in:
Honglin Feng 2018-10-11 21:39:02 +08:00
parent 8b70616846
commit 76da6290b0
4 changed files with 17 additions and 15 deletions

View file

@ -58,7 +58,7 @@ func NewEndpoint(name, url string, config EndpointConfig) *Endpoint {
endpoint.url = url endpoint.url = url
endpoint.EndpointConfig = config endpoint.EndpointConfig = config
endpoint.defaults() endpoint.defaults()
endpoint.metrics = newSafeMetrics() endpoint.metrics = newSafeMetrics(name)
// Configures the inmemory queue, retry, http pipeline. // Configures the inmemory queue, retry, http pipeline.
endpoint.Sink = newHTTPSink( endpoint.Sink = newHTTPSink(

View file

@ -63,7 +63,7 @@ func TestHTTPSink(t *testing.T) {
}) })
server := httptest.NewTLSServer(serverHandler) server := httptest.NewTLSServer(serverHandler)
metrics := newSafeMetrics() metrics := newSafeMetrics("")
sink := newHTTPSink(server.URL, 0, nil, nil, sink := newHTTPSink(server.URL, 0, nil, nil,
&endpointMetricsHTTPStatusListener{safeMetrics: metrics}) &endpointMetricsHTTPStatusListener{safeMetrics: metrics})

View file

@ -12,11 +12,11 @@ import (
var ( var (
// eventsCounter counts total events of incoming, success, failure, and errors // eventsCounter counts total events of incoming, success, failure, and errors
eventsCounter = prometheus.NotificationsNamespace.NewLabeledCounter("events", "The number of total events", "type") eventsCounter = prometheus.NotificationsNamespace.NewLabeledCounter("events", "The number of total events", "type", "to")
// pendingGauge measures the pending queue size // pendingGauge measures the pending queue size
pendingGauge = prometheus.NotificationsNamespace.NewGauge("pending", "The gauge of pending events in queue", metrics.Total) pendingGauge = prometheus.NotificationsNamespace.NewLabeledGauge("pending", "The gauge of pending events in queue", metrics.Total, "to")
// statusCounter counts the total notification call per each status code // statusCounter counts the total notification call per each status code
statusCounter = prometheus.NotificationsNamespace.NewLabeledCounter("status", "The number of status code", "code") statusCounter = prometheus.NotificationsNamespace.NewLabeledCounter("status", "The number of status code", "code", "to")
) )
// EndpointMetrics track various actions taken by the endpoint, typically by // EndpointMetrics track various actions taken by the endpoint, typically by
@ -34,14 +34,16 @@ type EndpointMetrics struct {
// safeMetrics guards the metrics implementation with a lock and provides a // safeMetrics guards the metrics implementation with a lock and provides a
// safe update function. // safe update function.
type safeMetrics struct { type safeMetrics struct {
EndpointName string
EndpointMetrics EndpointMetrics
sync.Mutex // protects statuses map sync.Mutex // protects statuses map
} }
// newSafeMetrics returns safeMetrics with map allocated. // newSafeMetrics returns safeMetrics with map allocated.
func newSafeMetrics() *safeMetrics { func newSafeMetrics(name string) *safeMetrics {
var sm safeMetrics var sm safeMetrics
sm.Statuses = make(map[string]int) sm.Statuses = make(map[string]int)
sm.EndpointName = name
return &sm return &sm
} }
@ -74,8 +76,8 @@ func (emsl *endpointMetricsHTTPStatusListener) success(status int, events ...Eve
emsl.Statuses[fmt.Sprintf("%d %s", status, http.StatusText(status))] += len(events) emsl.Statuses[fmt.Sprintf("%d %s", status, http.StatusText(status))] += len(events)
emsl.Successes += len(events) emsl.Successes += len(events)
statusCounter.WithValues(fmt.Sprintf("%d %s", status, http.StatusText(status))).Inc(1) statusCounter.WithValues(fmt.Sprintf("%d %s", status, http.StatusText(status)), emsl.EndpointName).Inc(1)
eventsCounter.WithValues("Successes").Inc(1) eventsCounter.WithValues("Successes", emsl.EndpointName).Inc(1)
} }
func (emsl *endpointMetricsHTTPStatusListener) failure(status int, events ...Event) { func (emsl *endpointMetricsHTTPStatusListener) failure(status int, events ...Event) {
@ -84,8 +86,8 @@ func (emsl *endpointMetricsHTTPStatusListener) failure(status int, events ...Eve
emsl.Statuses[fmt.Sprintf("%d %s", status, http.StatusText(status))] += len(events) emsl.Statuses[fmt.Sprintf("%d %s", status, http.StatusText(status))] += len(events)
emsl.Failures += len(events) emsl.Failures += len(events)
statusCounter.WithValues(fmt.Sprintf("%d %s", status, http.StatusText(status))).Inc(1) statusCounter.WithValues(fmt.Sprintf("%d %s", status, http.StatusText(status)), emsl.EndpointName).Inc(1)
eventsCounter.WithValues("Failures").Inc(1) eventsCounter.WithValues("Failures", emsl.EndpointName).Inc(1)
} }
func (emsl *endpointMetricsHTTPStatusListener) err(err error, events ...Event) { func (emsl *endpointMetricsHTTPStatusListener) err(err error, events ...Event) {
@ -93,7 +95,7 @@ func (emsl *endpointMetricsHTTPStatusListener) err(err error, events ...Event) {
defer emsl.safeMetrics.Unlock() defer emsl.safeMetrics.Unlock()
emsl.Errors += len(events) emsl.Errors += len(events)
eventsCounter.WithValues("Errors").Inc(1) eventsCounter.WithValues("Errors", emsl.EndpointName).Inc(1)
} }
// endpointMetricsEventQueueListener maintains the incoming events counter and // endpointMetricsEventQueueListener maintains the incoming events counter and
@ -108,8 +110,8 @@ func (eqc *endpointMetricsEventQueueListener) ingress(events ...Event) {
eqc.Events += len(events) eqc.Events += len(events)
eqc.Pending += len(events) eqc.Pending += len(events)
eventsCounter.WithValues("Events").Inc() eventsCounter.WithValues("Events", eqc.EndpointName).Inc()
pendingGauge.Inc(1) pendingGauge.WithValues(eqc.EndpointName).Inc(1)
} }
func (eqc *endpointMetricsEventQueueListener) egress(events ...Event) { func (eqc *endpointMetricsEventQueueListener) egress(events ...Event) {
@ -117,7 +119,7 @@ func (eqc *endpointMetricsEventQueueListener) egress(events ...Event) {
defer eqc.Unlock() defer eqc.Unlock()
eqc.Pending -= len(events) eqc.Pending -= len(events)
pendingGauge.Dec(1) pendingGauge.WithValues(eqc.EndpointName).Dec(1)
} }
// endpoints is global registry of endpoints used to report metrics to expvar // endpoints is global registry of endpoints used to report metrics to expvar

View file

@ -66,7 +66,7 @@ func TestBroadcaster(t *testing.T) {
func TestEventQueue(t *testing.T) { func TestEventQueue(t *testing.T) {
const nevents = 1000 const nevents = 1000
var ts testSink var ts testSink
metrics := newSafeMetrics() metrics := newSafeMetrics("")
eq := newEventQueue( eq := newEventQueue(
// delayed sync simulates destination slower than channel comms // delayed sync simulates destination slower than channel comms
&delayedSink{ &delayedSink{