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 }