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