ratelimit.go 903 B

12345678910111213141516171819202122232425262728293031
  1. package logging
  2. import "log/slog"
  3. // RateLimiter is what RateLimited needs from a rate limiter, such as a *ratelimit.Limiter.
  4. // Allow reports whether this call may proceed, and how many calls were denied since the last one that did.
  5. type RateLimiter interface {
  6. Allow() (denied uint64, ok bool)
  7. }
  8. // RateLimited checks lim before anything is built.
  9. // When allowed it returns l, with a "suppressed" count attached if lim denied calls since its last allowed one.
  10. // A nil lim allows everything.
  11. //
  12. // if l, ok := logging.RateLimited(f.l, f.udpTxErrLimiter); ok {
  13. // hostinfo.logger(l).Error("Failed to write outgoing packet", "error", err)
  14. // }
  15. func RateLimited(l *slog.Logger, lim RateLimiter) (*slog.Logger, bool) {
  16. if lim == nil {
  17. return l, true
  18. }
  19. denied, ok := lim.Allow()
  20. if !ok {
  21. return nil, false
  22. }
  23. if denied > 0 {
  24. return l.With("suppressed", denied), true
  25. }
  26. return l, true
  27. }