github.com/cilium/statedb@v0.3.2/metrics.go (about) 1 package statedb 2 3 import ( 4 "expvar" 5 "fmt" 6 "strings" 7 "time" 8 ) 9 10 type Metrics interface { 11 WriteTxnTableAcquisition(handle string, tableName string, acquire time.Duration) 12 WriteTxnTotalAcquisition(handle string, tables []string, acquire time.Duration) 13 WriteTxnDuration(handle string, tables []string, acquire time.Duration) 14 15 GraveyardLowWatermark(tableName string, lowWatermark Revision) 16 GraveyardCleaningDuration(tableName string, duration time.Duration) 17 GraveyardObjectCount(tableName string, numDeletedObjects int) 18 ObjectCount(tableName string, numObjects int) 19 20 DeleteTrackerCount(tableName string, numTrackers int) 21 Revision(tableName string, revision Revision) 22 } 23 24 // ExpVarMetrics is a simple implementation for the metrics. 25 type ExpVarMetrics struct { 26 LockContentionVar *expvar.Map 27 GraveyardCleaningDurationVar *expvar.Map 28 GraveyardLowWatermarkVar *expvar.Map 29 GraveyardObjectCountVar *expvar.Map 30 ObjectCountVar *expvar.Map 31 WriteTxnAcquisitionVar *expvar.Map 32 WriteTxnDurationVar *expvar.Map 33 DeleteTrackerCountVar *expvar.Map 34 RevisionVar *expvar.Map 35 } 36 37 func (m *ExpVarMetrics) String() (out string) { 38 var b strings.Builder 39 m.LockContentionVar.Do(func(kv expvar.KeyValue) { 40 fmt.Fprintf(&b, "lock_contention[%s]: %s\n", kv.Key, kv.Value.String()) 41 }) 42 m.GraveyardCleaningDurationVar.Do(func(kv expvar.KeyValue) { 43 fmt.Fprintf(&b, "graveyard_cleaning_duration[%s]: %s\n", kv.Key, kv.Value.String()) 44 }) 45 m.GraveyardLowWatermarkVar.Do(func(kv expvar.KeyValue) { 46 fmt.Fprintf(&b, "graveyard_low_watermark[%s]: %s\n", kv.Key, kv.Value.String()) 47 }) 48 m.GraveyardObjectCountVar.Do(func(kv expvar.KeyValue) { 49 fmt.Fprintf(&b, "graveyard_object_count[%s]: %s\n", kv.Key, kv.Value.String()) 50 }) 51 m.ObjectCountVar.Do(func(kv expvar.KeyValue) { 52 fmt.Fprintf(&b, "object_count[%s]: %s\n", kv.Key, kv.Value.String()) 53 }) 54 m.WriteTxnAcquisitionVar.Do(func(kv expvar.KeyValue) { 55 fmt.Fprintf(&b, "write_txn_acquisition[%s]: %s\n", kv.Key, kv.Value.String()) 56 }) 57 m.WriteTxnDurationVar.Do(func(kv expvar.KeyValue) { 58 fmt.Fprintf(&b, "write_txn_duration[%s]: %s\n", kv.Key, kv.Value.String()) 59 }) 60 m.DeleteTrackerCountVar.Do(func(kv expvar.KeyValue) { 61 fmt.Fprintf(&b, "delete_tracker_count[%s]: %s\n", kv.Key, kv.Value.String()) 62 }) 63 m.RevisionVar.Do(func(kv expvar.KeyValue) { 64 fmt.Fprintf(&b, "revision[%s]: %s\n", kv.Key, kv.Value.String()) 65 }) 66 67 return b.String() 68 } 69 70 func NewExpVarMetrics(publish bool) *ExpVarMetrics { 71 newMap := func(name string) *expvar.Map { 72 if publish { 73 return expvar.NewMap(name) 74 } 75 return new(expvar.Map).Init() 76 } 77 return &ExpVarMetrics{ 78 LockContentionVar: newMap("lock_contention"), 79 GraveyardCleaningDurationVar: newMap("graveyard_cleaning_duration"), 80 GraveyardLowWatermarkVar: newMap("graveyard_low_watermark"), 81 GraveyardObjectCountVar: newMap("graveyard_object_count"), 82 ObjectCountVar: newMap("object_count"), 83 WriteTxnAcquisitionVar: newMap("write_txn_acquisition"), 84 WriteTxnDurationVar: newMap("write_txn_duration"), 85 DeleteTrackerCountVar: newMap("delete_tracker_count"), 86 RevisionVar: newMap("revision"), 87 } 88 } 89 90 func (m *ExpVarMetrics) DeleteTrackerCount(name string, numTrackers int) { 91 var intVar expvar.Int 92 intVar.Set(int64(numTrackers)) 93 m.DeleteTrackerCountVar.Set(name, &intVar) 94 } 95 96 func (m *ExpVarMetrics) Revision(name string, revision uint64) { 97 var intVar expvar.Int 98 intVar.Set(int64(revision)) 99 m.RevisionVar.Set(name, &intVar) 100 } 101 102 func (m *ExpVarMetrics) GraveyardCleaningDuration(name string, duration time.Duration) { 103 m.GraveyardCleaningDurationVar.AddFloat(name, duration.Seconds()) 104 } 105 106 func (m *ExpVarMetrics) GraveyardLowWatermark(name string, lowWatermark Revision) { 107 var intVar expvar.Int 108 intVar.Set(int64(lowWatermark)) // unfortunately overflows at 2^63 109 m.GraveyardLowWatermarkVar.Set(name, &intVar) 110 } 111 112 func (m *ExpVarMetrics) GraveyardObjectCount(name string, numDeletedObjects int) { 113 var intVar expvar.Int 114 intVar.Set(int64(numDeletedObjects)) 115 m.GraveyardObjectCountVar.Set(name, &intVar) 116 } 117 118 func (m *ExpVarMetrics) ObjectCount(name string, numObjects int) { 119 var intVar expvar.Int 120 intVar.Set(int64(numObjects)) 121 m.ObjectCountVar.Set(name, &intVar) 122 } 123 124 func (m *ExpVarMetrics) WriteTxnDuration(handle string, tables []string, acquire time.Duration) { 125 m.WriteTxnDurationVar.AddFloat(handle+"/"+strings.Join(tables, "+"), acquire.Seconds()) 126 } 127 128 func (m *ExpVarMetrics) WriteTxnTotalAcquisition(handle string, tables []string, acquire time.Duration) { 129 m.WriteTxnAcquisitionVar.AddFloat(handle+"/"+strings.Join(tables, "+"), acquire.Seconds()) 130 } 131 132 func (m *ExpVarMetrics) WriteTxnTableAcquisition(handle string, tableName string, acquire time.Duration) { 133 m.LockContentionVar.AddFloat(handle+"/"+tableName, acquire.Seconds()) 134 } 135 136 var _ Metrics = &ExpVarMetrics{} 137 138 type NopMetrics struct{} 139 140 // DeleteTrackerCount implements Metrics. 141 func (*NopMetrics) DeleteTrackerCount(tableName string, numTrackers int) { 142 } 143 144 // GraveyardCleaningDuration implements Metrics. 145 func (*NopMetrics) GraveyardCleaningDuration(tableName string, duration time.Duration) { 146 } 147 148 // GraveyardLowWatermark implements Metrics. 149 func (*NopMetrics) GraveyardLowWatermark(tableName string, lowWatermark uint64) { 150 } 151 152 // GraveyardObjectCount implements Metrics. 153 func (*NopMetrics) GraveyardObjectCount(tableName string, numDeletedObjects int) { 154 } 155 156 // ObjectCount implements Metrics. 157 func (*NopMetrics) ObjectCount(tableName string, numObjects int) { 158 } 159 160 // Revision implements Metrics. 161 func (*NopMetrics) Revision(tableName string, revision uint64) { 162 } 163 164 // WriteTxnDuration implements Metrics. 165 func (*NopMetrics) WriteTxnDuration(handle string, tables []string, acquire time.Duration) { 166 } 167 168 // WriteTxnTableAcquisition implements Metrics. 169 func (*NopMetrics) WriteTxnTableAcquisition(handle string, tableName string, acquire time.Duration) { 170 } 171 172 // WriteTxnTotalAcquisition implements Metrics. 173 func (*NopMetrics) WriteTxnTotalAcquisition(handle string, tables []string, acquire time.Duration) { 174 } 175 176 var _ Metrics = &NopMetrics{}