github.com/cilium/cilium@v1.16.2/pkg/hive/reconciler_metrics.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Cilium 3 4 package hive 5 6 import ( 7 "time" 8 9 "github.com/cilium/hive/cell" 10 "github.com/cilium/statedb/reconciler" 11 12 "github.com/cilium/cilium/pkg/metrics" 13 "github.com/cilium/cilium/pkg/metrics/metric" 14 ) 15 16 type ReconcilerMetrics struct { 17 ReconciliationCount metric.Vec[metric.Counter] 18 ReconciliationDuration metric.Vec[metric.Observer] 19 ReconciliationTotalErrors metric.Vec[metric.Counter] 20 ReconciliationCurrentErrors metric.Vec[metric.Gauge] 21 22 PruneCount metric.Vec[metric.Counter] 23 PruneTotalErrors metric.Vec[metric.Counter] 24 PruneDuration metric.Vec[metric.Observer] 25 } 26 27 const ( 28 LabelModuleId = "module_id" 29 LabelOperation = "op" 30 ) 31 32 func NewStateDBReconcilerMetrics() (ReconcilerMetrics, reconciler.Metrics) { 33 m := ReconcilerMetrics{ 34 ReconciliationCount: metric.NewCounterVec(metric.CounterOpts{ 35 ConfigName: metrics.Namespace + "_count", 36 Disabled: true, 37 Namespace: metrics.Namespace, 38 Subsystem: "reconciler", 39 Name: "count", 40 Help: "Number of reconciliation rounds performed", 41 }, []string{LabelModuleId}), 42 43 ReconciliationDuration: metric.NewHistogramVec(metric.HistogramOpts{ 44 ConfigName: metrics.Namespace + "_reconciler_duration_seconds", 45 Disabled: true, 46 Namespace: metrics.Namespace, 47 Subsystem: "reconciler", 48 Name: "duration_seconds", 49 Help: "Histogram of per-operation duration during reconciliation", 50 }, []string{LabelModuleId, LabelOperation}), 51 52 ReconciliationTotalErrors: metric.NewCounterVec(metric.CounterOpts{ 53 ConfigName: metrics.Namespace + "_reconciler_errors_total", 54 Disabled: true, 55 Namespace: metrics.Namespace, 56 Subsystem: "reconciler", 57 Name: "errors_total", 58 Help: "Total number of errors encountered during reconciliation", 59 }, []string{LabelModuleId}), 60 61 ReconciliationCurrentErrors: metric.NewGaugeVec(metric.GaugeOpts{ 62 ConfigName: metrics.Namespace + "_reconciler_errors_current", 63 Disabled: true, 64 Namespace: metrics.Namespace, 65 Subsystem: "reconciler", 66 Name: "errors_current", 67 Help: "The number of objects currently failing to be reconciled", 68 }, []string{LabelModuleId}), 69 70 PruneCount: metric.NewCounterVec(metric.CounterOpts{ 71 ConfigName: metrics.Namespace + "_reconciler_prune_count", 72 Disabled: true, 73 Namespace: metrics.Namespace, 74 Subsystem: "reconciler", 75 Name: "prune_count", 76 Help: "Number of prunes performed", 77 }, []string{LabelModuleId}), 78 79 PruneTotalErrors: metric.NewCounterVec(metric.CounterOpts{ 80 ConfigName: metrics.Namespace + "_reconciler_prune_errors_total", 81 Disabled: true, 82 Namespace: metrics.Namespace, 83 Subsystem: "reconciler", 84 Name: "full_errors_total", 85 Help: "Total number of errors encountered during full reconciliation", 86 }, []string{LabelModuleId}), 87 88 PruneDuration: metric.NewHistogramVec(metric.HistogramOpts{ 89 ConfigName: metrics.Namespace + "_reconciler_prune_duration_seconds", 90 Disabled: true, 91 Namespace: metrics.Namespace, 92 Subsystem: "reconciler", 93 Name: "full_duration_seconds", 94 Help: "Histogram of per-operation duration during full reconciliation", 95 }, []string{LabelModuleId, LabelOperation}), 96 } 97 return m, &reconcilerMetricsImpl{m} 98 } 99 100 type reconcilerMetricsImpl struct { 101 m ReconcilerMetrics 102 } 103 104 // PruneDuration implements reconciler.Metrics. 105 func (m *reconcilerMetricsImpl) PruneDuration(moduleID cell.FullModuleID, duration time.Duration) { 106 if m.m.PruneDuration.IsEnabled() { 107 m.m.PruneDuration.WithLabelValues(LabelModuleId, moduleID.String()). 108 Observe(duration.Seconds()) 109 } 110 } 111 112 // FullReconciliationErrors implements reconciler.Metrics. 113 func (m *reconcilerMetricsImpl) PruneError(moduleID cell.FullModuleID, err error) { 114 if m.m.PruneCount.IsEnabled() { 115 m.m.PruneCount.WithLabelValues(LabelModuleId, moduleID.String()) 116 } 117 if m.m.PruneTotalErrors.IsEnabled() { 118 m.m.PruneTotalErrors.WithLabelValues(moduleID.String()).Add(1) 119 } 120 } 121 122 // ReconciliationDuration implements reconciler.Metrics. 123 func (m *reconcilerMetricsImpl) ReconciliationDuration(moduleID cell.FullModuleID, operation string, duration time.Duration) { 124 if m.m.ReconciliationCount.IsEnabled() { 125 m.m.ReconciliationCount.WithLabelValues(LabelModuleId, moduleID.String()).Inc() 126 } 127 if m.m.ReconciliationDuration.IsEnabled() { 128 m.m.ReconciliationDuration.WithLabelValues(LabelModuleId, moduleID.String(), LabelOperation, operation). 129 Observe(duration.Seconds()) 130 } 131 } 132 133 // ReconciliationErrors implements reconciler.Metrics. 134 func (m *reconcilerMetricsImpl) ReconciliationErrors(moduleID cell.FullModuleID, new, current int) { 135 if m.m.ReconciliationCurrentErrors.IsEnabled() { 136 m.m.ReconciliationCurrentErrors.WithLabelValues(LabelModuleId, moduleID.String()).Set(float64(current)) 137 } 138 if m.m.ReconciliationTotalErrors.IsEnabled() { 139 m.m.ReconciliationCurrentErrors.WithLabelValues(LabelModuleId, moduleID.String()).Add(float64(new)) 140 } 141 } 142 143 var _ reconciler.Metrics = &reconcilerMetricsImpl{}