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  }