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 }