mirror of
https://github.com/hanzoai/traces.git
synced 2026-10-30 18:20:41 +00:00
* rate limit max trace logs and drop too many live traces Signed-off-by: Joe Elliott <[email protected]> * changelog Signed-off-by: Joe Elliott <[email protected]> --------- Signed-off-by: Joe Elliott <[email protected]>
40 lines
1018 B
Go
40 lines
1018 B
Go
package log
|
|
|
|
import (
|
|
"time"
|
|
|
|
gkLog "github.com/go-kit/log"
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
"github.com/prometheus/client_golang/prometheus/promauto"
|
|
"golang.org/x/time/rate"
|
|
)
|
|
|
|
type RateLimitedLogger struct {
|
|
limiter *rate.Limiter
|
|
logger gkLog.Logger
|
|
}
|
|
|
|
var metricDropedLines = promauto.NewCounter(prometheus.CounterOpts{
|
|
Namespace: "tempo",
|
|
Name: "dropped_log_lines_total",
|
|
Help: "The total number of log lines dropped by the rate limited logger.",
|
|
})
|
|
|
|
// NewRateLimitedLogger returns a new RateLimitedLogger that logs at most logsPerSecond messages per second.
|
|
// TODO: migrate to the dskit rate limited logger
|
|
func NewRateLimitedLogger(logsPerSecond int, logger gkLog.Logger) *RateLimitedLogger {
|
|
return &RateLimitedLogger{
|
|
limiter: rate.NewLimiter(rate.Limit(logsPerSecond), 1),
|
|
logger: logger,
|
|
}
|
|
}
|
|
|
|
func (l *RateLimitedLogger) Log(keyvals ...interface{}) {
|
|
if !l.limiter.AllowN(time.Now(), 1) {
|
|
metricDropedLines.Inc()
|
|
return
|
|
}
|
|
|
|
_ = l.logger.Log(keyvals...)
|
|
}
|