github.com/cilium/statedb@v0.3.2/reconciler/metrics.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // Copyright Authors of Cilium
     3  
     4  package reconciler
     5  
     6  import (
     7  	"expvar"
     8  	"time"
     9  
    10  	"github.com/cilium/hive/cell"
    11  )
    12  
    13  type Metrics interface {
    14  	ReconciliationDuration(moduleID cell.FullModuleID, operation string, duration time.Duration)
    15  	ReconciliationErrors(moduleID cell.FullModuleID, new, current int)
    16  
    17  	PruneError(moduleID cell.FullModuleID, err error)
    18  	PruneDuration(moduleID cell.FullModuleID, duration time.Duration)
    19  }
    20  
    21  const (
    22  	OpUpdate = "update"
    23  	OpDelete = "delete"
    24  )
    25  
    26  type ExpVarMetrics struct {
    27  	root *expvar.Map
    28  
    29  	ReconciliationCountVar         *expvar.Map
    30  	ReconciliationDurationVar      *expvar.Map
    31  	ReconciliationTotalErrorsVar   *expvar.Map
    32  	ReconciliationCurrentErrorsVar *expvar.Map
    33  
    34  	PruneCountVar         *expvar.Map
    35  	PruneDurationVar      *expvar.Map
    36  	PruneTotalErrorsVar   *expvar.Map
    37  	PruneCurrentErrorsVar *expvar.Map
    38  }
    39  
    40  func (m *ExpVarMetrics) PruneDuration(moduleID cell.FullModuleID, duration time.Duration) {
    41  	m.PruneDurationVar.AddFloat(moduleID.String(), duration.Seconds())
    42  }
    43  
    44  func (m *ExpVarMetrics) PruneError(moduleID cell.FullModuleID, err error) {
    45  	m.PruneCountVar.Add(moduleID.String(), 1)
    46  
    47  	var intVar expvar.Int
    48  	if err != nil {
    49  		m.PruneTotalErrorsVar.Add(moduleID.String(), 1)
    50  		intVar.Set(1)
    51  	}
    52  	m.PruneCurrentErrorsVar.Set(moduleID.String(), &intVar)
    53  }
    54  
    55  func (m *ExpVarMetrics) ReconciliationDuration(moduleID cell.FullModuleID, operation string, duration time.Duration) {
    56  	m.ReconciliationDurationVar.AddFloat(moduleID.String()+"/"+operation, duration.Seconds())
    57  }
    58  
    59  func (m *ExpVarMetrics) ReconciliationErrors(moduleID cell.FullModuleID, new, current int) {
    60  	m.ReconciliationCountVar.Add(moduleID.String(), 1)
    61  	m.ReconciliationTotalErrorsVar.Add(moduleID.String(), int64(new))
    62  
    63  	var intVar expvar.Int
    64  	intVar.Set(int64(current))
    65  	m.ReconciliationCurrentErrorsVar.Set(moduleID.String(), &intVar)
    66  }
    67  
    68  var _ Metrics = &ExpVarMetrics{}
    69  
    70  func NewExpVarMetrics() *ExpVarMetrics {
    71  	return newExpVarMetrics(true)
    72  }
    73  
    74  func NewUnpublishedExpVarMetrics() *ExpVarMetrics {
    75  	return newExpVarMetrics(false)
    76  }
    77  
    78  func (m *ExpVarMetrics) Map() *expvar.Map {
    79  	return m.root
    80  }
    81  
    82  func newExpVarMetrics(publish bool) *ExpVarMetrics {
    83  	root := new(expvar.Map).Init()
    84  	newMap := func(name string) *expvar.Map {
    85  		if publish {
    86  			return expvar.NewMap(name)
    87  		}
    88  		m := new(expvar.Map).Init()
    89  		root.Set(name, m)
    90  		return m
    91  	}
    92  	return &ExpVarMetrics{
    93  		root:                           root,
    94  		ReconciliationCountVar:         newMap("reconciliation_count"),
    95  		ReconciliationDurationVar:      newMap("reconciliation_duration"),
    96  		ReconciliationTotalErrorsVar:   newMap("reconciliation_total_errors"),
    97  		ReconciliationCurrentErrorsVar: newMap("reconciliation_current_errors"),
    98  		PruneCountVar:                  newMap("prune_count"),
    99  		PruneDurationVar:               newMap("prune_duration"),
   100  		PruneTotalErrorsVar:            newMap("prune_total_errors"),
   101  		PruneCurrentErrorsVar:          newMap("prune_current_errors"),
   102  	}
   103  }