From 0895b7f41159fcfc7866a4c352927f995f3440c0 Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin <valyala@gmail.com>
Date: Wed, 18 Nov 2020 03:40:12 +0200
Subject: [PATCH] lib/logger: add `-loggerWarnsPerSecondLimit` command-line
 flag for rate limiting of WARN log messages

Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/905
---
 lib/logger/logger.go | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/lib/logger/logger.go b/lib/logger/logger.go
index aa8eba81de..2dd6579230 100644
--- a/lib/logger/logger.go
+++ b/lib/logger/logger.go
@@ -25,6 +25,8 @@ var (
 
 	errorsPerSecondLimit = flag.Int("loggerErrorsPerSecondLimit", 10, "Per-second limit on the number of ERROR messages. If more than the given number of errors "+
 		"are emitted per second, then the remaining errors are suppressed. Zero value disables the rate limit")
+	warnsPerSecondLimit = flag.Int("loggerWarnsPerSecondLimit", 10, "Per-second limit on the number of WARN messages. If more than the given number of warns "+
+		"are emitted per second, then the remaining warns are suppressed. Zero value disables the rate limit")
 )
 
 // Init initializes the logger.
@@ -36,7 +38,7 @@ func Init() {
 	setLoggerOutput()
 	validateLoggerLevel()
 	validateLoggerFormat()
-	go errorsLoggedCleaner()
+	go errorsAndWarnsLoggedCleaner()
 	logAllFlags()
 }
 
@@ -125,14 +127,18 @@ func logLevelSkipframes(skipframes int, level, format string, args ...interface{
 	logMessage(level, msg, 3+skipframes)
 }
 
-func errorsLoggedCleaner() {
+func errorsAndWarnsLoggedCleaner() {
 	for {
 		time.Sleep(time.Second)
 		atomic.StoreUint64(&errorsLogged, 0)
+		atomic.StoreUint64(&warnsLogged, 0)
 	}
 }
 
-var errorsLogged uint64
+var (
+	errorsLogged uint64
+	warnsLogged  uint64
+)
 
 type logWriter struct {
 }
@@ -149,6 +155,11 @@ func logMessage(level, msg string, skipframes int) {
 			return
 		}
 	}
+	if level == "WARN" {
+		if n := atomic.AddUint64(&warnsLogged, 1); *warnsPerSecondLimit > 0 && n > uint64(*warnsPerSecondLimit) {
+			return
+		}
+	}
 
 	timestamp := ""
 	if !*disableTimestamps {