pkg/metrics/prometheus.go (59 lines of code) (raw):
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
// Package metrics provides a metrics collector that stores metrics in Prometheus.
package metrics
import (
"github.com/prometheus/client_golang/prometheus"
)
// promMetrics is a metrics collector that stores metrics in Prometheus.
type promMetrics struct {
name string
requestDuration *prometheus.HistogramVec
peerDiscoveryDuration *prometheus.HistogramVec
peerResponseSpeed *prometheus.HistogramVec
upstreamResponseSpeed *prometheus.HistogramVec
}
var _ Metrics = &promMetrics{}
// RecordPeerDiscovery records the duration of peer discovery for a given IP address.
func (m *promMetrics) RecordPeerDiscovery(ip string, duration float64) {
m.peerDiscoveryDuration.WithLabelValues(m.name, ip).Observe(duration)
}
// RecordPeerResponse records the response time and count of a peer's operation.
// It calculates the speed (count/duration) and updates the Prometheus metric.
func (m *promMetrics) RecordPeerResponse(ip string, key string, op string, duration float64, count int64) {
bps := float64(count) / duration
m.peerResponseSpeed.WithLabelValues(m.name, ip, op).Observe(bps / float64(1024*1024))
}
// RecordRequest records the duration of a request for a specific method and handler.
// It updates the Prometheus metric for request duration.
func (m *promMetrics) RecordRequest(method string, handler string, duration float64) {
m.requestDuration.WithLabelValues(m.name, method, handler).Observe(duration)
}
// RecordUpstreamResponse records the duration and count of an upstream response.
// It calculates the speed of the response and updates the corresponding Prometheus metric.
func (m *promMetrics) RecordUpstreamResponse(hostname string, key string, op string, duration float64, count int64) {
bps := float64(count) / duration
m.upstreamResponseSpeed.WithLabelValues(m.name, hostname, op).Observe(bps / float64(1024*1024))
}
// NewPromMetrics creates a new instance of promMetrics.
func NewPromMetrics(reg prometheus.Registerer, name, prefix string) *promMetrics {
requestDurationHist := prometheus.NewHistogramVec(prometheus.HistogramOpts{
Name: prefix + "_request_duration_seconds",
Help: "Duration of requests in seconds.",
Buckets: prometheus.LinearBuckets(0.005, 0.025, 200),
}, []string{"self", "method", "handler"})
reg.MustRegister(requestDurationHist)
peerDiscoveryDurationHist := prometheus.NewHistogramVec(prometheus.HistogramOpts{
Name: prefix + "_peer_discovery_duration_seconds",
Help: "Duration of peer discovery in seconds.",
Buckets: prometheus.LinearBuckets(0.001, 0.002, 200),
}, []string{"self", "ip"})
reg.MustRegister(peerDiscoveryDurationHist)
peerResponseDurationHist := prometheus.NewHistogramVec(prometheus.HistogramOpts{
Name: prefix + "_peer_response_speed_mib_per_second",
Help: "Speed of peer response in Mib per second.",
Buckets: prometheus.LinearBuckets(1, 15, 200),
}, []string{"self", "ip", "op"})
reg.MustRegister(peerResponseDurationHist)
upstreamResponseDurationHist := prometheus.NewHistogramVec(prometheus.HistogramOpts{
Name: prefix + "_upstream_response_speed_mib_per_second",
Help: "Speed of upstream response in Mib per second.",
Buckets: prometheus.LinearBuckets(1, 15, 200),
}, []string{"self", "hostname", "op"})
reg.MustRegister(upstreamResponseDurationHist)
return &promMetrics{
name: name,
requestDuration: requestDurationHist,
peerDiscoveryDuration: peerDiscoveryDurationHist,
peerResponseSpeed: peerResponseDurationHist,
upstreamResponseSpeed: upstreamResponseDurationHist,
}
}