internal/gitaly/storage/raftmgr/metrics.go (103 lines of code) (raw):
package raftmgr
import (
"github.com/prometheus/client_golang/prometheus"
)
// Metrics contains the unscoped collected by Raft activities.
type Metrics struct {
snapSaveSec *prometheus.HistogramVec
proposalDurationSec *prometheus.HistogramVec
proposalsTotal *prometheus.CounterVec
logEntriesProcessed *prometheus.CounterVec
proposalQueueDepth *prometheus.GaugeVec
eventLoopCrashes *prometheus.CounterVec
membershipChanges *prometheus.CounterVec
membershipErrors *prometheus.CounterVec
}
// NewMetrics returns a new Metrics instance.
func NewMetrics() *Metrics {
storageLabels := []string{"storage"}
proposalLabels := []string{"storage", "result"}
operationLabels := []string{"storage", "operation", "entry_type"}
return &Metrics{
snapSaveSec: prometheus.NewHistogramVec(prometheus.HistogramOpts{
Name: "gitaly_raft_snapshot_duration_seconds",
Help: "The total duration of a snapshot operation performed for Raft.",
// lowest bucket start of upper bound 0.001 sec (1 ms) with factor 2
// highest bucket start of 0.001 sec * 2^13 == 8.192 sec
Buckets: prometheus.ExponentialBuckets(0.001, 2, 14),
}, storageLabels),
proposalDurationSec: prometheus.NewHistogramVec(prometheus.HistogramOpts{
Name: "gitaly_raft_proposal_duration_seconds",
Help: "Time to commit proposals (sampled).",
// Using same bucket distribution as snapshot duration
Buckets: prometheus.ExponentialBuckets(0.001, 2, 14),
}, storageLabels),
proposalsTotal: prometheus.NewCounterVec(prometheus.CounterOpts{
Name: "gitaly_raft_proposals_total",
Help: "Counter of all Raft proposals.",
}, proposalLabels),
logEntriesProcessed: prometheus.NewCounterVec(prometheus.CounterOpts{
Name: "gitaly_raft_log_entries_processed",
Help: "Rate of log entries processed.",
}, operationLabels),
proposalQueueDepth: prometheus.NewGaugeVec(prometheus.GaugeOpts{
Name: "gitaly_raft_proposal_queue_depth",
Help: "Depth of proposal queue.",
}, storageLabels),
eventLoopCrashes: prometheus.NewCounterVec(prometheus.CounterOpts{
Name: "gitaly_raft_event_loop_crashes_total",
Help: "Counter of Raft event loop crashes",
}, storageLabels),
membershipChanges: prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "gitaly_raft_membership_changes_total",
Help: "Counter of Raft membership changes by type",
},
[]string{"change_type"},
),
membershipErrors: prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "gitaly_raft_membership_errors_total",
Help: "Counter of Raft membership operation errors",
},
[]string{"change_type", "reason"},
),
}
}
// Describe is used to describe Prometheus metrics.
func (m *Metrics) Describe(metrics chan<- *prometheus.Desc) {
prometheus.DescribeByCollect(m, metrics)
}
// Collect is used to collect Prometheus metrics.
func (m *Metrics) Collect(metrics chan<- prometheus.Metric) {
m.snapSaveSec.Collect(metrics)
m.proposalDurationSec.Collect(metrics)
m.proposalsTotal.Collect(metrics)
m.logEntriesProcessed.Collect(metrics)
m.proposalQueueDepth.Collect(metrics)
m.eventLoopCrashes.Collect(metrics)
m.membershipChanges.Collect(metrics)
m.membershipErrors.Collect(metrics)
}
// RaftMetrics are metrics scoped for a specific storage
type RaftMetrics struct {
snapSaveSec prometheus.Observer
proposalDurationSec prometheus.Observer
proposalsTotal *prometheus.CounterVec
logEntriesProcessed *prometheus.CounterVec
proposalQueueDepth prometheus.Gauge
eventLoopCrashes prometheus.Counter
membershipChanges *prometheus.CounterVec
membershipErrors *prometheus.CounterVec
}
// Scope returns Raft metrics scoped for a specific storage.
func (m *Metrics) Scope(storage string) RaftMetrics {
labels := prometheus.Labels{"storage": storage}
return RaftMetrics{
snapSaveSec: m.snapSaveSec.With(labels),
proposalDurationSec: m.proposalDurationSec.With(labels),
proposalsTotal: m.proposalsTotal.MustCurryWith(labels),
logEntriesProcessed: m.logEntriesProcessed.MustCurryWith(labels),
proposalQueueDepth: m.proposalQueueDepth.With(labels),
eventLoopCrashes: m.eventLoopCrashes.With(labels),
membershipChanges: m.membershipChanges,
membershipErrors: m.membershipErrors,
}
}
// IncMembershipChange increments the membership change counter for the given type
func (m RaftMetrics) IncMembershipChange(changeType string) {
m.membershipChanges.WithLabelValues(changeType).Inc()
}
// IncMembershipError increments the membership error counter for the given operation
func (m RaftMetrics) IncMembershipError(changeType string, reason string) {
m.membershipErrors.WithLabelValues(changeType, reason).Inc()
}