github.com/safing/portbase@v0.19.5/runtime/trace_provider.go (about)

     1  package runtime
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/safing/portbase/database/record"
     7  	"github.com/safing/portbase/log"
     8  )
     9  
    10  // traceValueProvider can be used to wrap an
    11  // existing value provider to trace an calls to
    12  // their Set and Get methods.
    13  type traceValueProvider struct {
    14  	ValueProvider
    15  }
    16  
    17  // TraceProvider returns a new ValueProvider that wraps
    18  // vp but traces all Set and Get methods calls.
    19  func TraceProvider(vp ValueProvider) ValueProvider {
    20  	return &traceValueProvider{vp}
    21  }
    22  
    23  func (tvp *traceValueProvider) Set(r record.Record) (res record.Record, err error) {
    24  	defer func(start time.Time) {
    25  		log.Tracef("runtime: setting record %q: duration=%s err=%v", r.Key(), time.Since(start), err)
    26  	}(time.Now())
    27  
    28  	return tvp.ValueProvider.Set(r)
    29  }
    30  
    31  func (tvp *traceValueProvider) Get(keyOrPrefix string) (records []record.Record, err error) {
    32  	defer func(start time.Time) {
    33  		log.Tracef("runtime: loading records %q: duration=%s err=%v #records=%d", keyOrPrefix, time.Since(start), err, len(records))
    34  	}(time.Now())
    35  
    36  	return tvp.ValueProvider.Get(keyOrPrefix)
    37  }