github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/util/events.go (about) 1 package util 2 3 import ( 4 "os" 5 6 "github.com/go-kit/log" 7 "go.uber.org/atomic" 8 ) 9 10 // Provide an "event" interface for observability 11 12 // Temporary hack implementation to go via logger to stderr 13 14 var ( 15 // interface{} vars to avoid allocation on every call 16 key interface{} = "level" // masquerade as a level like debug, warn 17 event interface{} = "event" 18 19 eventLogger = log.NewNopLogger() 20 ) 21 22 // Event is the log-like API for event sampling 23 func Event() log.Logger { 24 return eventLogger 25 } 26 27 // InitEvents initializes event sampling, with the given frequency. Zero=off. 28 func InitEvents(freq int) { 29 if freq <= 0 { 30 eventLogger = log.NewNopLogger() 31 } else { 32 eventLogger = newEventLogger(freq) 33 } 34 } 35 36 func newEventLogger(freq int) log.Logger { 37 l := log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr)) 38 l = log.WithPrefix(l, key, event) 39 l = log.With(l, "ts", log.DefaultTimestampUTC) 40 return &samplingFilter{next: l, freq: freq} 41 } 42 43 type samplingFilter struct { 44 next log.Logger 45 freq int 46 count atomic.Int64 47 } 48 49 func (e *samplingFilter) Log(keyvals ...interface{}) error { 50 count := e.count.Inc() 51 if count%int64(e.freq) == 0 { 52 return e.next.Log(keyvals...) 53 } 54 return nil 55 }