Skip to content

Commit 5a4f6b6

Browse files
committed
Merge branch '1.9.x' into 1.10.x
2 parents 8a976dc + 4f7fbc3 commit 5a4f6b6

File tree

6 files changed

+92
-15
lines changed

6 files changed

+92
-15
lines changed

benchmarks/benchmarks-core/build.gradle

+3
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,15 @@ dependencies {
1414

1515
jmh 'org.openjdk.jmh:jmh-core:latest.release'
1616

17+
jmh 'ch.qos.logback:logback-classic'
18+
1719
// Nebula doesn't like having jmhAnnotationProcessor without jmh so we just add it twice.
1820
jmh 'org.openjdk.jmh:jmh-generator-annprocess:latest.release'
1921
jmhAnnotationProcessor 'org.openjdk.jmh:jmh-generator-annprocess:latest.release'
2022
}
2123

2224
jmh {
25+
jmhVersion = '1.36'
2326
fork = 1
2427
warmupIterations = 1
2528
iterations = 1

benchmarks/benchmarks-core/gradle.lockfile

+7-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* Copyright 2023 VMware, Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.micrometer.benchmark.core;
17+
18+
import io.micrometer.core.instrument.MeterRegistry;
19+
import io.micrometer.core.instrument.binder.logging.LogbackMetrics;
20+
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
21+
import org.openjdk.jmh.annotations.*;
22+
import org.slf4j.Logger;
23+
import org.slf4j.LoggerFactory;
24+
25+
import java.util.concurrent.TimeUnit;
26+
27+
@Fork(1)
28+
@Measurement(iterations = 2)
29+
@Warmup(iterations = 2)
30+
@BenchmarkMode(Mode.SampleTime)
31+
@OutputTimeUnit(TimeUnit.MICROSECONDS)
32+
@State(Scope.Benchmark)
33+
public class LogbackMetricsBenchmark {
34+
35+
Logger logger;
36+
37+
@Param({ "false", "true" })
38+
boolean registerLogbackMetrics;
39+
40+
MeterRegistry meterRegistry;
41+
42+
LogbackMetrics logbackMetrics;
43+
44+
@Setup
45+
public void setup() {
46+
meterRegistry = new SimpleMeterRegistry();
47+
if (registerLogbackMetrics) {
48+
logbackMetrics = new LogbackMetrics();
49+
logbackMetrics.bindTo(meterRegistry);
50+
}
51+
52+
logger = LoggerFactory.getLogger(LogbackMetricsBenchmark.class);
53+
}
54+
55+
@TearDown
56+
public void teardown() throws Exception {
57+
if (logbackMetrics != null) {
58+
logbackMetrics.close();
59+
}
60+
}
61+
62+
@Benchmark
63+
public void logSomething() {
64+
logger.info("benchmark logging");
65+
}
66+
67+
}

config/checkstyle/checkstyle-suppressions.xml

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
<suppress checks="JavadocPackageCheck" files="[\\/]src[\\/]test[\\/].*" />
1717

1818
<suppress id="SLF4JIllegalImportCheck" files="implementations[\\/].+" />
19+
<suppress id="SLF4JIllegalImportCheck" files="benchmarks[\\/].+" />
1920

2021
<suppress id="sysout" files="ClearCustomMetricDescriptors.java"/>
2122
<suppress id="sysout" files="HttpSender.java"/>

micrometer-core/src/main/java/io/micrometer/core/instrument/binder/logging/LogbackMetrics.java

+9-3
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,14 @@ public FilterReply decide(Marker marker, Logger logger, Level level, String form
185185
return FilterReply.NEUTRAL;
186186
}
187187

188-
// cannot use logger.isEnabledFor(level), as it would cause a StackOverflowError
189-
// by calling this filter again!
188+
LogbackMetrics.ignoreMetrics(() -> recordMetrics(logger, level));
189+
190+
return FilterReply.NEUTRAL;
191+
}
192+
193+
private void recordMetrics(Logger logger, Level level) {
194+
// Calling logger.isEnabledFor(level) might be sub-optimal since it cals this
195+
// filter again. This behavior caused a StackOverflowError in the past.
190196
if (level.isGreaterOrEqual(logger.getEffectiveLevel())) {
191197
switch (level.toInt()) {
192198
case Level.ERROR_INT:
@@ -205,9 +211,9 @@ public FilterReply decide(Marker marker, Logger logger, Level level, String form
205211
traceCounter.increment();
206212
break;
207213
}
214+
208215
}
209216

210-
return FilterReply.NEUTRAL;
211217
}
212218

213219
}

micrometer-core/src/test/java/io/micrometer/core/instrument/binder/logging/LogbackMetricsTest.java

+5-7
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,15 @@ void isLevelEnabledDoesntContributeToCounts() {
7878
assertThat(registry.get("logback.events").tags("level", "error").counter().count()).isEqualTo(0.0);
7979
}
8080

81-
@Issue("#411")
81+
@Issue("#411, #3623")
8282
@Test
8383
void ignoringLogMetricsInsideCounters() {
8484
registry = new LoggingCounterMeterRegistry();
8585
try (LogbackMetrics logbackMetrics = new LogbackMetrics()) {
8686
logbackMetrics.bindTo(registry);
87-
registry.counter("my.counter").increment();
87+
LoggerFactory.getLogger("test").info("This should be counted once");
8888
}
89-
assertThat(registry.get("logback.events").tags("level", "info").counter().count()).isZero();
89+
assertThat(registry.get("logback.events").tags("level", "info").counter().count()).isOne();
9090
}
9191

9292
@Issue("#421")
@@ -153,10 +153,8 @@ private static class LoggingCounter extends CumulativeCounter {
153153

154154
@Override
155155
public void increment() {
156-
LogbackMetrics.ignoreMetrics(() -> {
157-
logger.info("beep");
158-
super.increment();
159-
});
156+
logger.info("beep"); // this is necessary to test gh-3623
157+
super.increment();
160158
}
161159

162160
}

0 commit comments

Comments
 (0)