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{}