Skip to content

Commit 1e51206

Browse files
authored
Merge pull request quarkusio#47600 from brunobat/metrics-docs
Disable logger exporter metrics if metrics disabled
2 parents 641829f + a6a7d03 commit 1e51206

File tree

11 files changed

+335
-16
lines changed

11 files changed

+335
-16
lines changed

extensions/opentelemetry/deployment/src/main/java/io/quarkus/opentelemetry/deployment/OpenTelemetryProcessor.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.quarkus.opentelemetry.deployment;
22

3+
import static io.quarkus.bootstrap.classloading.QuarkusClassLoader.isClassPresentAtRuntime;
34
import static io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem.SPI_ROOT;
45
import static io.quarkus.opentelemetry.runtime.OpenTelemetryRecorder.OPEN_TELEMETRY_DRIVER;
56
import static java.util.stream.Collectors.toList;
@@ -60,11 +61,13 @@
6061
import io.quarkus.deployment.builditem.RemovedResourceBuildItem;
6162
import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
6263
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
64+
import io.quarkus.deployment.builditem.nativeimage.ReflectiveMethodBuildItem;
6365
import io.quarkus.deployment.builditem.nativeimage.RuntimeReinitializedClassBuildItem;
6466
import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem;
6567
import io.quarkus.deployment.util.ServiceUtil;
6668
import io.quarkus.maven.dependency.ArtifactKey;
6769
import io.quarkus.opentelemetry.OpenTelemetryDestroyer;
70+
import io.quarkus.opentelemetry.deployment.metric.MetricProcessor;
6871
import io.quarkus.opentelemetry.runtime.AutoConfiguredOpenTelemetrySdkBuilderCustomizer;
6972
import io.quarkus.opentelemetry.runtime.DelayedAttributes;
7073
import io.quarkus.opentelemetry.runtime.OpenTelemetryRecorder;
@@ -94,6 +97,18 @@ public boolean test(AnnotationInstance annotationInstance) {
9497
private static final DotName ADD_SPAN_ATTRIBUTES_INTERCEPTOR = DotName
9598
.createSimple(AddingSpanAttributesInterceptor.class.getName());
9699

100+
@BuildStep(onlyIfNot = MetricProcessor.MetricEnabled.class)
101+
void registerForReflection(BuildProducer<ReflectiveMethodBuildItem> reflectiveItem) {
102+
if (isClassPresentAtRuntime(
103+
"io.opentelemetry.exporter.logging.LoggingMetricExporter")) {
104+
reflectiveItem.produce(new ReflectiveMethodBuildItem(
105+
"Used by OpenTelemetry Export Logging",
106+
false,
107+
"io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil",
108+
"addMeterConfiguratorCondition"));
109+
}
110+
}
111+
97112
@BuildStep
98113
AdditionalBeanBuildItem ensureProducerIsRetained() {
99114
return AdditionalBeanBuildItem.builder()

extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/AutoConfiguredOpenTelemetrySdkBuilderCustomizer.java

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.quarkus.opentelemetry.runtime;
22

3+
import static io.opentelemetry.sdk.internal.ScopeConfiguratorBuilder.nameEquals;
34
import static java.lang.Boolean.TRUE;
45
import static java.util.Collections.emptyList;
56

@@ -25,6 +26,8 @@
2526
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
2627
import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessor;
2728
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
29+
import io.opentelemetry.sdk.metrics.internal.MeterConfig;
30+
import io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil;
2831
import io.opentelemetry.sdk.resources.Resource;
2932
import io.opentelemetry.sdk.trace.IdGenerator;
3033
import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
@@ -258,20 +261,34 @@ public MetricProviderCustomizer(OTelBuildConfig oTelBuildConfig,
258261

259262
@Override
260263
public void customize(AutoConfiguredOpenTelemetrySdkBuilder builder) {
261-
if (oTelBuildConfig.metrics().enabled().orElse(TRUE)) {
262-
builder.addMeterProviderCustomizer(
263-
new BiFunction<SdkMeterProviderBuilder, ConfigProperties, SdkMeterProviderBuilder>() {
264-
@Override
265-
public SdkMeterProviderBuilder apply(SdkMeterProviderBuilder metricProvider,
266-
ConfigProperties configProperties) {
264+
builder.addMeterProviderCustomizer(
265+
new BiFunction<SdkMeterProviderBuilder, ConfigProperties, SdkMeterProviderBuilder>() {
266+
@Override
267+
public SdkMeterProviderBuilder apply(SdkMeterProviderBuilder meterProviderBuilder,
268+
ConfigProperties configProperties) {
269+
270+
if (oTelBuildConfig.metrics().enabled().orElse(TRUE)) {
271+
267272
if (clock.isUnsatisfied()) {
268273
throw new IllegalStateException("No Clock bean found");
269274
}
270-
metricProvider.setClock(clock.get());
271-
return metricProvider;
275+
meterProviderBuilder.setClock(clock.get());
276+
} else {
277+
// disable batch exporter metrics if metrics disabled
278+
// In the future we can inject scopes here.
279+
Set<String> dropInstrumentationScopes = Set.of(
280+
"io.opentelemetry.sdk.trace",
281+
"io.opentelemetry.sdk.logs");
282+
for (String target : dropInstrumentationScopes) {
283+
SdkMeterProviderUtil.addMeterConfiguratorCondition(
284+
meterProviderBuilder,
285+
nameEquals(target),
286+
MeterConfig.disabled());
287+
}
272288
}
273-
});
274-
}
289+
return meterProviderBuilder;
290+
}
291+
});
275292
}
276293
}
277294

extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/config/build/LogsBuildConfig.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ public interface LogsBuildConfig {
1313
* <p>
1414
* This property is not available in the Open Telemetry SDK. It's Quarkus specific.
1515
* <p>
16-
* Support for logs will be enabled if OpenTelemetry support is enabled
17-
* and either this value is true, or this value is unset.
16+
* Support for OpenTelemetry Logs will be enabled if this value is true.
17+
* The OpenTelemetry SDK ( {@link io.quarkus.opentelemetry.runtime.config.build.OTelBuildConfig#enabled()} )
18+
* is enabled by default and if disabled, OpenTelemetry Logs will also be disabled.
1819
*/
1920
@WithDefault("false")
2021
Optional<Boolean> enabled();

extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/config/build/MetricsBuildConfig.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ public interface MetricsBuildConfig {
1414
* <p>
1515
* This property is not available in the Open Telemetry SDK. It's Quarkus specific.
1616
* <p>
17-
* Support for metrics will be enabled if OpenTelemetry support is enabled
18-
* and either this value is true, or this value is unset.
17+
* Support for OpenTelemetry Metrics will be enabled if this value is true.
18+
* The OpenTelemetry SDK ( {@link io.quarkus.opentelemetry.runtime.config.build.OTelBuildConfig#enabled()} )
19+
* is enabled by default and if disabled, OpenTelemetry Metrics will also be disabled.
1920
*/
2021
@WithDefault("false")
2122
Optional<Boolean> enabled();

extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/config/build/TracesBuildConfig.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ public interface TracesBuildConfig {
2020
* <p>
2121
* This property is not available in the Open Telemetry SDK. It's Quarkus specific.
2222
* <p>
23-
* Support for tracing will be enabled if OpenTelemetry support is enabled
24-
* and either this value is true, or this value is unset.
23+
* Support for OpenTelemetry Tracing will be enabled if this value is true.
24+
* The OpenTelemetry SDK ( {@link io.quarkus.opentelemetry.runtime.config.build.OTelBuildConfig#enabled()} )
25+
* is enabled by default and if disabled, OpenTelemetry Tracing will also be disabled.
2526
*/
2627
@Deprecated
2728
@WithDefault("true")
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<parent>
8+
<groupId>io.quarkus</groupId>
9+
<artifactId>quarkus-integration-tests-parent</artifactId>
10+
<version>999-SNAPSHOT</version>
11+
</parent>
12+
13+
<artifactId>quarkus-integration-test-opentelemetry-exporter-logging</artifactId>
14+
<name>Quarkus - Integration Tests - OpenTelemetry exporter logging</name>
15+
16+
<dependencies>
17+
<dependency>
18+
<groupId>io.quarkus</groupId>
19+
<artifactId>quarkus-rest-jackson</artifactId>
20+
</dependency>
21+
<dependency>
22+
<groupId>io.quarkus</groupId>
23+
<artifactId>quarkus-opentelemetry</artifactId>
24+
</dependency>
25+
<dependency>
26+
<groupId>io.opentelemetry</groupId>
27+
<artifactId>opentelemetry-exporter-logging</artifactId>
28+
</dependency>
29+
<dependency>
30+
<groupId>io.quarkus</groupId>
31+
<artifactId>quarkus-arc</artifactId>
32+
</dependency>
33+
<dependency>
34+
<groupId>io.quarkus</groupId>
35+
<artifactId>quarkus-junit5</artifactId>
36+
<scope>test</scope>
37+
</dependency>
38+
<dependency>
39+
<groupId>org.assertj</groupId>
40+
<artifactId>assertj-core</artifactId>
41+
<scope>test</scope>
42+
</dependency>
43+
<dependency>
44+
<groupId>org.awaitility</groupId>
45+
<artifactId>awaitility</artifactId>
46+
<scope>test</scope>
47+
</dependency>
48+
<dependency>
49+
<groupId>io.rest-assured</groupId>
50+
<artifactId>rest-assured</artifactId>
51+
<scope>test</scope>
52+
</dependency>
53+
<!-- Minimal test dependencies to *-deployment artifacts for consistent build order -->
54+
<dependency>
55+
<groupId>io.quarkus</groupId>
56+
<artifactId>quarkus-arc-deployment</artifactId>
57+
<version>${project.version}</version>
58+
<type>pom</type>
59+
<scope>test</scope>
60+
<exclusions>
61+
<exclusion>
62+
<groupId>*</groupId>
63+
<artifactId>*</artifactId>
64+
</exclusion>
65+
</exclusions>
66+
</dependency>
67+
<dependency>
68+
<groupId>io.quarkus</groupId>
69+
<artifactId>quarkus-opentelemetry-deployment</artifactId>
70+
<version>${project.version}</version>
71+
<type>pom</type>
72+
<scope>test</scope>
73+
<exclusions>
74+
<exclusion>
75+
<groupId>*</groupId>
76+
<artifactId>*</artifactId>
77+
</exclusion>
78+
</exclusions>
79+
</dependency>
80+
<dependency>
81+
<groupId>io.quarkus</groupId>
82+
<artifactId>quarkus-rest-jackson-deployment</artifactId>
83+
<version>${project.version}</version>
84+
<type>pom</type>
85+
<scope>test</scope>
86+
<exclusions>
87+
<exclusion>
88+
<groupId>*</groupId>
89+
<artifactId>*</artifactId>
90+
</exclusion>
91+
</exclusions>
92+
</dependency>
93+
94+
</dependencies>
95+
96+
<build>
97+
<plugins>
98+
<plugin>
99+
<groupId>io.quarkus</groupId>
100+
<artifactId>quarkus-maven-plugin</artifactId>
101+
<executions>
102+
<execution>
103+
<goals>
104+
<goal>build</goal>
105+
</goals>
106+
</execution>
107+
</executions>
108+
</plugin>
109+
<plugin>
110+
<groupId>org.apache.maven.plugins</groupId>
111+
<artifactId>maven-surefire-plugin</artifactId>
112+
<configuration>
113+
<systemPropertyVariables>
114+
<vertx.disableWebsockets>false</vertx.disableWebsockets>
115+
</systemPropertyVariables>
116+
</configuration>
117+
</plugin>
118+
</plugins>
119+
</build>
120+
121+
<profiles>
122+
<profile>
123+
<id>native-image</id>
124+
<activation>
125+
<property>
126+
<name>native</name>
127+
</property>
128+
</activation>
129+
130+
<properties>
131+
<quarkus.native.enabled>true</quarkus.native.enabled>
132+
</properties>
133+
134+
<build>
135+
<plugins>
136+
<plugin>
137+
<groupId>org.apache.maven.plugins</groupId>
138+
<artifactId>maven-surefire-plugin</artifactId>
139+
<configuration>
140+
<skipTests>${native.surefire.skip}</skipTests>
141+
<systemPropertyVariables>
142+
<vertx.disableWebsockets>false</vertx.disableWebsockets>
143+
</systemPropertyVariables>
144+
</configuration>
145+
</plugin>
146+
147+
<plugin>
148+
<artifactId>maven-failsafe-plugin</artifactId>
149+
<executions>
150+
<execution>
151+
<goals>
152+
<goal>integration-test</goal>
153+
<goal>verify</goal>
154+
</goals>
155+
<configuration>
156+
<systemPropertyVariables>
157+
<vertx.disableWebsockets>false</vertx.disableWebsockets>
158+
<native.image.path>
159+
${project.build.directory}/${project.build.finalName}-runner
160+
</native.image.path>
161+
</systemPropertyVariables>
162+
</configuration>
163+
</execution>
164+
</executions>
165+
</plugin>
166+
</plugins>
167+
</build>
168+
</profile>
169+
</profiles>
170+
</project>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.acme;
2+
3+
import jakarta.ws.rs.GET;
4+
import jakarta.ws.rs.Path;
5+
import jakarta.ws.rs.Produces;
6+
import jakarta.ws.rs.core.MediaType;
7+
8+
import io.quarkus.logging.Log;
9+
10+
@Path("/hello")
11+
public class GreetingResource {
12+
13+
@GET
14+
@Produces(MediaType.TEXT_PLAIN)
15+
public String hello() {
16+
Log.info("request received");
17+
return "Hello from Quarkus REST";
18+
}
19+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
quarkus.application.name=myservice
2+
quarkus.otel.metrics.exporter=logging
3+
# Force quick output of metrics to increase test reliability.
4+
quarkus.otel.metric.export.interval=100ms
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.acme;
2+
3+
import org.junit.jupiter.api.Disabled;
4+
5+
import io.quarkus.test.junit.QuarkusIntegrationTest;
6+
7+
@Disabled("Manual only")
8+
@QuarkusIntegrationTest
9+
class LoggingMetricsNotPresentIT extends LoggingMetricsNotPresentTest {
10+
// Execute the same tests but in packaged mode.
11+
}

0 commit comments

Comments
 (0)