1515import io .opentelemetry .sdk .common .Clock ;
1616import io .opentelemetry .sdk .testing .time .TestClock ;
1717import java .time .Duration ;
18+ import java .util .concurrent .TimeUnit ;
1819import java .util .logging .Level ;
1920import java .util .logging .Logger ;
2021import org .junit .jupiter .api .Test ;
@@ -76,7 +77,26 @@ void fiveInAMinuteTriggersLimiting() {
7677 assertThat (logs .getEvents ()).hasSize (7 );
7778 logs .assertDoesNotContain ("oh no I should be suppressed!" );
7879 logs .assertContains (
79- "Too many log messages detected. Will only log once per minute from now on." );
80+ "Too many log messages detected. Will only log 1 time(s) per minute from now on." );
81+ logs .assertContains ("oh no I should trigger suppression!" );
82+ }
83+
84+ @ Test
85+ void tenInAnHourTriggersLimiting () {
86+ Clock clock = TestClock .create ();
87+ ThrottlingLogger logger = new ThrottlingLogger (realLogger , clock , 10 , 2 , TimeUnit .HOURS );
88+
89+ for (int i = 0 ; i < 10 ; i ++) {
90+ logger .log (Level .WARNING , "oh no!" );
91+ }
92+
93+ logger .log (Level .WARNING , "oh no I should trigger suppression!" );
94+ logger .log (Level .WARNING , "oh no I should be suppressed!" );
95+
96+ assertThat (logs .getEvents ()).hasSize (12 );
97+ logs .assertDoesNotContain ("oh no I should be suppressed!" );
98+ logs .assertContains (
99+ "Too many log messages detected. Will only log 2 time(s) per hour from now on." );
80100 logs .assertContains ("oh no I should trigger suppression!" );
81101 }
82102
@@ -130,7 +150,7 @@ void afterAMinuteLetOneThrough() {
130150 logs .assertDoesNotContain ("oh no I should be suppressed!" );
131151 logs .assertContains ("oh no I should trigger suppression!" );
132152 logs .assertContains (
133- "Too many log messages detected. Will only log once per minute from now on." );
153+ "Too many log messages detected. Will only log 1 time(s) per minute from now on." );
134154
135155 clock .advance (Duration .ofMillis (60_001 ));
136156 logger .log (Level .WARNING , "oh no!" );
@@ -145,6 +165,41 @@ void afterAMinuteLetOneThrough() {
145165 assertThat (logs .getEvents ().get (8 ).getMessage ()).isEqualTo ("oh no!" );
146166 }
147167
168+ @ Test
169+ void afterAnHourLetTwoThrough () {
170+ TestClock clock = TestClock .create ();
171+ ThrottlingLogger logger = new ThrottlingLogger (realLogger , clock , 10 , 2 , TimeUnit .HOURS );
172+
173+ for (int i = 0 ; i < 10 ; i ++) {
174+ logger .log (Level .WARNING , "oh no!" );
175+ }
176+
177+ logger .log (Level .WARNING , "oh no I should trigger suppression!" );
178+ logger .log (Level .WARNING , "oh no I should be suppressed!" );
179+
180+ assertThat (logs .getEvents ()).hasSize (12 );
181+ logs .assertDoesNotContain ("oh no I should be suppressed!" );
182+ logs .assertContains ("oh no I should trigger suppression!" );
183+ logs .assertContains (
184+ "Too many log messages detected. Will only log 2 time(s) per hour from now on." );
185+
186+ clock .advance (Duration .ofMinutes (61 ));
187+ logger .log (Level .WARNING , "oh no!" );
188+ logger .log (Level .WARNING , "oh no!" );
189+ logger .log (Level .WARNING , "oh no I should be suppressed!" );
190+ assertThat (logs .getEvents ()).hasSize (14 );
191+ assertThat (logs .getEvents ().get (13 ).getMessage ()).isEqualTo ("oh no!" );
192+
193+ clock .advance (Duration .ofMinutes (61 ));
194+ logger .log (Level .WARNING , "oh no!" );
195+ logger .log (Level .WARNING , "oh no!" );
196+ logger .log (Level .WARNING , "oh no I should be suppressed!" );
197+ assertThat (logs .getEvents ()).hasSize (16 );
198+ assertThat (logs .getEvents ().get (15 ).getMessage ()).isEqualTo ("oh no!" );
199+
200+ logs .assertDoesNotContain ("oh no I should be suppressed!" );
201+ }
202+
148203 @ Test
149204 void allowOnlyOneLogPerMinuteAfterSuppression () {
150205 TestClock clock = TestClock .create ();
@@ -181,4 +236,45 @@ void allowOnlyOneLogPerMinuteAfterSuppression() {
181236 assertThat (logs .getEvents ()).hasSize (8 );
182237 assertThat (logs .getEvents ().get (7 ).getMessage ()).isEqualTo ("allowed 1" );
183238 }
239+
240+ @ Test
241+ void allowOnlyTwoLogPerHourAfterSuppression () {
242+ TestClock clock = TestClock .create ();
243+ ThrottlingLogger logger = new ThrottlingLogger (realLogger , clock , 10 , 2 , TimeUnit .HOURS );
244+
245+ for (int i = 0 ; i < 10 ; i ++) {
246+ logger .log (Level .WARNING , "oh no!" );
247+ }
248+
249+ logger .log (Level .WARNING , "oh no I should trigger suppression!" );
250+ logger .log (Level .WARNING , "oh no I should be suppressed!" );
251+
252+ assertThat (logs .getEvents ()).hasSize (12 );
253+
254+ clock .advance (Duration .ofMinutes (10 ));
255+ logger .log (Level .WARNING , "suppression 1" );
256+ clock .advance (Duration .ofMinutes (10 ));
257+ logger .log (Level .WARNING , "suppression 2" );
258+ clock .advance (Duration .ofMinutes (10 ));
259+ clock .advance (Duration .ofSeconds (1 ));
260+ logger .log (Level .WARNING , "allowed 1" );
261+ clock .advance (Duration .ofMinutes (10 ));
262+ logger .log (Level .WARNING , "suppression 3" );
263+ clock .advance (Duration .ofMinutes (10 ));
264+ logger .log (Level .WARNING , "suppression 4" );
265+ clock .advance (Duration .ofMinutes (10 ));
266+ clock .advance (Duration .ofSeconds (1 ));
267+ logger .log (Level .WARNING , "allowed 2" );
268+
269+ logs .assertDoesNotContain ("suppression 1" );
270+ logs .assertDoesNotContain ("suppression 2" );
271+ logs .assertDoesNotContain ("suppression 3" );
272+ logs .assertDoesNotContain ("suppression 4" );
273+ logs .assertContains ("allowed 1" );
274+ logs .assertContains ("allowed 2" );
275+
276+ assertThat (logs .getEvents ()).hasSize (14 );
277+ assertThat (logs .getEvents ().get (12 ).getMessage ()).isEqualTo ("allowed 1" );
278+ assertThat (logs .getEvents ().get (13 ).getMessage ()).isEqualTo ("allowed 2" );
279+ }
184280}
0 commit comments