Skip to content

Commit 49fa4b9

Browse files
committed
SmallRye Fault Tolerance: add support for OpenTelemetry Metrics
This requires propagating the "metrics enabled at build time" information through the `OpenTelemetrySdkBuildItem`. I took the liberty to also add the tracing and logging build time enablement information, even though I have no use for it at the moment. One TCK test remains excluded, because it has a bug [1][2]. [1] microprofile/microprofile-fault-tolerance#656 [2] microprofile/microprofile-fault-tolerance#655
1 parent 9847bba commit 49fa4b9

File tree

4 files changed

+83
-18
lines changed

4 files changed

+83
-18
lines changed

extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/OpenTelemetrySdkBuildItem.java

+31-2
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,39 @@
77

88
public final class OpenTelemetrySdkBuildItem extends SimpleBuildItem {
99

10+
private final boolean tracingBuildTimeEnabled;
11+
private final boolean metricsBuildTimeEnabled;
12+
private final boolean loggingBuildTimeEnabled;
13+
1014
private final RuntimeValue<Boolean> runtimeEnabled;
1115

12-
public OpenTelemetrySdkBuildItem(RuntimeValue<Boolean> sdkEnabled) {
13-
this.runtimeEnabled = sdkEnabled;
16+
public OpenTelemetrySdkBuildItem(boolean tracingBuildTimeEnabled, boolean metricsBuildTimeEnabled,
17+
boolean loggingBuildTimeEnabled, RuntimeValue<Boolean> runtimeEnabled) {
18+
this.tracingBuildTimeEnabled = tracingBuildTimeEnabled;
19+
this.metricsBuildTimeEnabled = metricsBuildTimeEnabled;
20+
this.loggingBuildTimeEnabled = loggingBuildTimeEnabled;
21+
this.runtimeEnabled = runtimeEnabled;
22+
}
23+
24+
/**
25+
* @return {@code true} if OpenTelemetry Tracing is enabled at build time
26+
*/
27+
public boolean isTracingBuildTimeEnabled() {
28+
return tracingBuildTimeEnabled;
29+
}
30+
31+
/**
32+
* @return {@code true} if OpenTelemetry Metrics is enabled at build time
33+
*/
34+
public boolean isMetricsBuildTimeEnabled() {
35+
return metricsBuildTimeEnabled;
36+
}
37+
38+
/**
39+
* @return {@code true} if OpenTelemetry Logging is enabled at build time
40+
*/
41+
public boolean isLoggingBuildTimeEnabled() {
42+
return loggingBuildTimeEnabled;
1443
}
1544

1645
/**

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

+16-2
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ AdditionalBeanBuildItem ensureProducerIsRetained() {
108108
@Record(ExecutionTime.RUNTIME_INIT)
109109
void openTelemetryBean(OpenTelemetryRecorder recorder,
110110
OTelRuntimeConfig oTelRuntimeConfig,
111+
OTelBuildConfig oTelBuildConfig,
111112
BuildProducer<SyntheticBeanBuildItem> syntheticProducer,
112113
BuildProducer<OpenTelemetrySdkBuildItem> openTelemetrySdkBuildItemBuildProducer) {
113114
syntheticProducer.produce(SyntheticBeanBuildItem.configure(OpenTelemetry.class)
@@ -126,8 +127,21 @@ void openTelemetryBean(OpenTelemetryRecorder recorder,
126127
.destroyer(OpenTelemetryDestroyer.class)
127128
.done());
128129

129-
openTelemetrySdkBuildItemBuildProducer.produce(
130-
new OpenTelemetrySdkBuildItem(recorder.isOtelSdkEnabled(oTelRuntimeConfig)));
130+
// same as `TracerEnabled`
131+
boolean tracingEnabled = oTelBuildConfig.traces().enabled()
132+
.map(it -> it && oTelBuildConfig.enabled())
133+
.orElseGet(oTelBuildConfig::enabled);
134+
// same as `MetricProcessor.MetricEnabled`
135+
boolean metricsEnabled = oTelBuildConfig.metrics().enabled()
136+
.map(it -> it && oTelBuildConfig.enabled())
137+
.orElseGet(oTelBuildConfig::enabled);
138+
// same as `LogHandlerProcessor.LogsEnabled`
139+
boolean loggingEnabled = oTelBuildConfig.logs().enabled()
140+
.map(it -> it && oTelBuildConfig.enabled())
141+
.orElseGet(oTelBuildConfig::enabled);
142+
143+
openTelemetrySdkBuildItemBuildProducer.produce(new OpenTelemetrySdkBuildItem(
144+
tracingEnabled, metricsEnabled, loggingEnabled, recorder.isOtelSdkEnabled(oTelRuntimeConfig)));
131145
}
132146

133147
@BuildStep

extensions/smallrye-fault-tolerance/deployment/src/main/java/io/quarkus/smallrye/faulttolerance/deployment/SmallRyeFaultToleranceProcessor.java

+17-5
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import io.quarkus.arc.deployment.AnnotationsTransformerBuildItem;
2727
import io.quarkus.arc.deployment.BeanArchiveIndexBuildItem;
2828
import io.quarkus.arc.deployment.BeanDefiningAnnotationBuildItem;
29+
import io.quarkus.arc.deployment.OpenTelemetrySdkBuildItem;
2930
import io.quarkus.arc.deployment.ValidationPhaseBuildItem;
3031
import io.quarkus.arc.processor.AnnotationStore;
3132
import io.quarkus.arc.processor.AnnotationsTransformer;
@@ -85,6 +86,7 @@ public void build(BuildProducer<AnnotationsTransformerBuildItem> annotationsTran
8586
BuildProducer<ServiceProviderBuildItem> serviceProvider,
8687
BuildProducer<BeanDefiningAnnotationBuildItem> additionalBda,
8788
Optional<MetricsCapabilityBuildItem> metricsCapability,
89+
Optional<OpenTelemetrySdkBuildItem> openTelemetrySdk,
8890
BuildProducer<SystemPropertyBuildItem> systemProperty,
8991
CombinedIndexBuildItem combinedIndexBuildItem,
9092
BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
@@ -177,14 +179,24 @@ public void transform(TransformationContext context) {
177179
SpecCompatibility.class,
178180
Enablement.class);
179181

180-
if (metricsCapability.isEmpty()) {
181-
builder.addBeanClass("io.smallrye.faulttolerance.metrics.NoopProvider");
182-
} else if (metricsCapability.get().metricsSupported(MetricsFactory.MP_METRICS)) {
182+
int metricsProviders = 0;
183+
if (metricsCapability.isPresent() && metricsCapability.get().metricsSupported(MetricsFactory.MP_METRICS)) {
183184
builder.addBeanClass("io.smallrye.faulttolerance.metrics.MicroProfileMetricsProvider");
184-
} else if (metricsCapability.get().metricsSupported(MetricsFactory.MICROMETER)) {
185+
metricsProviders++;
186+
} else if (metricsCapability.isPresent() && metricsCapability.get().metricsSupported(MetricsFactory.MICROMETER)) {
185187
builder.addBeanClass("io.smallrye.faulttolerance.metrics.MicrometerProvider");
188+
metricsProviders++;
189+
}
190+
if (openTelemetrySdk.map(OpenTelemetrySdkBuildItem::isMetricsBuildTimeEnabled).orElse(false)) {
191+
builder.addBeanClass("io.smallrye.faulttolerance.metrics.OpenTelemetryProvider");
192+
metricsProviders++;
193+
}
194+
195+
if (metricsProviders == 0) {
196+
builder.addBeanClass("io.smallrye.faulttolerance.metrics.NoopProvider");
197+
} else if (metricsProviders > 1) {
198+
builder.addBeanClass("io.smallrye.faulttolerance.metrics.CompoundMetricsProvider");
186199
}
187-
// TODO support for OpenTelemetry Metrics -- not present in Quarkus yet
188200

189201
beans.produce(builder.build());
190202

tcks/microprofile-fault-tolerance/pom.xml

+19-9
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
<!-- Disable quarkus optimization -->
2727
<quarkus.arc.remove-unused-beans>false</quarkus.arc.remove-unused-beans>
2828
<smallrye.faulttolerance.mp-compatibility>true</smallrye.faulttolerance.mp-compatibility>
29+
<quarkus.otel.metrics.enabled>true</quarkus.otel.metrics.enabled>
2930
</systemPropertyVariables>
3031
<!-- This workaround allows us to run a single test using
3132
the "test" system property -->
@@ -35,16 +36,8 @@
3536
</dependenciesToScan>
3637
<reuseForks>false</reuseForks>
3738
<excludes>
38-
<!-- Quarkus doesn't implement OpenTelemetry Metrics yet -->
39-
<exclude>org.eclipse.microprofile.fault.tolerance.tck.telemetryMetrics.AllAnnotationTelemetryTest</exclude>
40-
<exclude>org.eclipse.microprofile.fault.tolerance.tck.telemetryMetrics.BulkheadTelemetryTest</exclude>
39+
<!-- https://github.com/microprofile/microprofile-fault-tolerance/pull/655 -->
4140
<exclude>org.eclipse.microprofile.fault.tolerance.tck.telemetryMetrics.CircuitBreakerTelemetryTest</exclude>
42-
<exclude>org.eclipse.microprofile.fault.tolerance.tck.telemetryMetrics.ClashingNameTelemetryTest</exclude>
43-
<exclude>org.eclipse.microprofile.fault.tolerance.tck.telemetryMetrics.ClassLevelTelemetryTest</exclude>
44-
<exclude>org.eclipse.microprofile.fault.tolerance.tck.telemetryMetrics.FallbackTelemetryTest</exclude>
45-
<exclude>org.eclipse.microprofile.fault.tolerance.tck.telemetryMetrics.FaultToleranceDisabledTelemetryTest</exclude>
46-
<exclude>org.eclipse.microprofile.fault.tolerance.tck.telemetryMetrics.RetryTelemetryTest</exclude>
47-
<exclude>org.eclipse.microprofile.fault.tolerance.tck.telemetryMetrics.TimeoutTelemetryTest</exclude>
4841
<!-- We do not support enablement via beans.xml -->
4942
<exclude>org.eclipse.microprofile.fault.tolerance.tck.interceptor.xmlInterceptorEnabling.FaultToleranceInterceptorEnableByXmlTest</exclude>
5043
</excludes>
@@ -65,6 +58,10 @@
6558
<groupId>io.quarkus</groupId>
6659
<artifactId>quarkus-smallrye-metrics</artifactId>
6760
</dependency>
61+
<dependency>
62+
<groupId>io.quarkus</groupId>
63+
<artifactId>quarkus-opentelemetry</artifactId>
64+
</dependency>
6865
<dependency>
6966
<groupId>org.eclipse.microprofile.fault-tolerance</groupId>
7067
<artifactId>microprofile-fault-tolerance-tck</artifactId>
@@ -98,6 +95,19 @@
9895
</exclusion>
9996
</exclusions>
10097
</dependency>
98+
<dependency>
99+
<groupId>io.quarkus</groupId>
100+
<artifactId>quarkus-opentelemetry-deployment</artifactId>
101+
<version>${project.version}</version>
102+
<type>pom</type>
103+
<scope>test</scope>
104+
<exclusions>
105+
<exclusion>
106+
<groupId>*</groupId>
107+
<artifactId>*</artifactId>
108+
</exclusion>
109+
</exclusions>
110+
</dependency>
101111
</dependencies>
102112

103113
</project>

0 commit comments

Comments
 (0)