forked from TrueCloudLab/distribution
add label to the metrics
Signed-off-by: Honglin Feng <tifayuki@gmail.com>
This commit is contained in:
parent
8b70616846
commit
76da6290b0
4 changed files with 17 additions and 15 deletions
|
@ -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(
|
||||||
|
|
|
@ -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})
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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{
|
||||||
|
|
Loading…
Reference in a new issue