Skip to content

Commit 07e3041

Browse files
authored
Merge pull request #47057 from brunobat/47031-fix-UnsatisfiedResolutionException
Make OTel resource attributes signal independent
2 parents 7410179 + 6bc5d93 commit 07e3041

File tree

7 files changed

+101
-81
lines changed

7 files changed

+101
-81
lines changed

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.jboss.jandex.Type;
2424

2525
import io.opentelemetry.api.OpenTelemetry;
26+
import io.opentelemetry.api.common.Attributes;
2627
import io.opentelemetry.exporter.otlp.internal.OtlpLogRecordExporterProvider;
2728
import io.opentelemetry.exporter.otlp.internal.OtlpMetricExporterProvider;
2829
import io.opentelemetry.exporter.otlp.internal.OtlpSpanExporterProvider;
@@ -45,6 +46,7 @@
4546
import io.quarkus.arc.deployment.ValidationPhaseBuildItem.ValidationErrorBuildItem;
4647
import io.quarkus.arc.processor.InterceptorBindingRegistrar;
4748
import io.quarkus.arc.processor.Transformation;
49+
import io.quarkus.builder.Version;
4850
import io.quarkus.datasource.common.runtime.DataSourceUtil;
4951
import io.quarkus.deployment.Capabilities;
5052
import io.quarkus.deployment.Capability;
@@ -53,6 +55,7 @@
5355
import io.quarkus.deployment.annotations.BuildSteps;
5456
import io.quarkus.deployment.annotations.ExecutionTime;
5557
import io.quarkus.deployment.annotations.Record;
58+
import io.quarkus.deployment.builditem.ApplicationInfoBuildItem;
5659
import io.quarkus.deployment.builditem.LaunchModeBuildItem;
5760
import io.quarkus.deployment.builditem.RemovedResourceBuildItem;
5861
import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
@@ -63,6 +66,7 @@
6366
import io.quarkus.maven.dependency.ArtifactKey;
6467
import io.quarkus.opentelemetry.OpenTelemetryDestroyer;
6568
import io.quarkus.opentelemetry.runtime.AutoConfiguredOpenTelemetrySdkBuilderCustomizer;
69+
import io.quarkus.opentelemetry.runtime.DelayedAttributes;
6670
import io.quarkus.opentelemetry.runtime.OpenTelemetryRecorder;
6771
import io.quarkus.opentelemetry.runtime.QuarkusContextStorage;
6872
import io.quarkus.opentelemetry.runtime.config.build.ExporterType;
@@ -96,14 +100,26 @@ AdditionalBeanBuildItem ensureProducerIsRetained() {
96100
.setUnremovable()
97101
.addBeanClasses(
98102
AutoConfiguredOpenTelemetrySdkBuilderCustomizer.SimpleLogRecordProcessorCustomizer.class,
99-
AutoConfiguredOpenTelemetrySdkBuilderCustomizer.TracingResourceCustomizer.class,
103+
AutoConfiguredOpenTelemetrySdkBuilderCustomizer.ResourceCustomizer.class,
100104
AutoConfiguredOpenTelemetrySdkBuilderCustomizer.SamplerCustomizer.class,
101105
AutoConfiguredOpenTelemetrySdkBuilderCustomizer.TracerProviderCustomizer.class,
102106
AutoConfiguredOpenTelemetrySdkBuilderCustomizer.MetricProviderCustomizer.class,
103107
AutoConfiguredOpenTelemetrySdkBuilderCustomizer.TextMapPropagatorCustomizers.class)
104108
.build();
105109
}
106110

111+
// Signal independent resource attributes
112+
@BuildStep
113+
@Record(ExecutionTime.STATIC_INIT)
114+
SyntheticBeanBuildItem setupDelayedAttribute(OpenTelemetryRecorder recorder, ApplicationInfoBuildItem appInfo) {
115+
return SyntheticBeanBuildItem.configure(DelayedAttributes.class).types(Attributes.class)
116+
.supplier(recorder.delayedAttributes(Version.getVersion(),
117+
appInfo.getName(), appInfo.getVersion()))
118+
.scope(Singleton.class)
119+
.setRuntimeInit()
120+
.done();
121+
}
122+
107123
@BuildStep
108124
@Record(ExecutionTime.RUNTIME_INIT)
109125
void openTelemetryBean(OpenTelemetryRecorder recorder,

extensions/opentelemetry/deployment/src/main/java/io/quarkus/opentelemetry/deployment/tracing/TracerProcessor.java

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import java.util.function.BooleanSupplier;
1616

1717
import jakarta.enterprise.inject.spi.EventContext;
18-
import jakarta.inject.Singleton;
1918

2019
import org.jboss.jandex.AnnotationInstance;
2120
import org.jboss.jandex.AnnotationTarget;
@@ -25,7 +24,6 @@
2524
import org.jboss.jandex.MethodInfo;
2625
import org.jboss.logging.Logger;
2726

28-
import io.opentelemetry.api.common.Attributes;
2927
import io.opentelemetry.context.propagation.TextMapPropagator;
3028
import io.opentelemetry.sdk.resources.Resource;
3129
import io.opentelemetry.sdk.trace.IdGenerator;
@@ -35,24 +33,20 @@
3533
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
3634
import io.quarkus.arc.deployment.ObserverRegistrationPhaseBuildItem;
3735
import io.quarkus.arc.deployment.ObserverRegistrationPhaseBuildItem.ObserverConfiguratorBuildItem;
38-
import io.quarkus.arc.deployment.SyntheticBeanBuildItem;
3936
import io.quarkus.arc.deployment.UnremovableBeanBuildItem;
4037
import io.quarkus.arc.processor.DotNames;
41-
import io.quarkus.builder.Version;
4238
import io.quarkus.deployment.Capabilities;
4339
import io.quarkus.deployment.Capability;
4440
import io.quarkus.deployment.annotations.BuildProducer;
4541
import io.quarkus.deployment.annotations.BuildStep;
4642
import io.quarkus.deployment.annotations.BuildSteps;
4743
import io.quarkus.deployment.annotations.ExecutionTime;
4844
import io.quarkus.deployment.annotations.Record;
49-
import io.quarkus.deployment.builditem.ApplicationInfoBuildItem;
5045
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
5146
import io.quarkus.gizmo.MethodDescriptor;
5247
import io.quarkus.gizmo.ResultHandle;
5348
import io.quarkus.opentelemetry.runtime.config.build.OTelBuildConfig;
5449
import io.quarkus.opentelemetry.runtime.config.build.OTelBuildConfig.SecurityEvents.SecurityEventType;
55-
import io.quarkus.opentelemetry.runtime.tracing.DelayedAttributes;
5650
import io.quarkus.opentelemetry.runtime.tracing.TracerRecorder;
5751
import io.quarkus.opentelemetry.runtime.tracing.cdi.TracerProducer;
5852
import io.quarkus.opentelemetry.runtime.tracing.security.EndUserSpanProcessor;
@@ -172,17 +166,6 @@ void dropNames(
172166
dropStaticResources.produce(new DropStaticResourcesBuildItem(resources));
173167
}
174168

175-
@BuildStep
176-
@Record(ExecutionTime.STATIC_INIT)
177-
SyntheticBeanBuildItem setupDelayedAttribute(TracerRecorder recorder, ApplicationInfoBuildItem appInfo) {
178-
return SyntheticBeanBuildItem.configure(DelayedAttributes.class).types(Attributes.class)
179-
.supplier(recorder.delayedAttributes(Version.getVersion(),
180-
appInfo.getName(), appInfo.getVersion()))
181-
.scope(Singleton.class)
182-
.setRuntimeInit()
183-
.done();
184-
}
185-
186169
@BuildStep
187170
@Record(ExecutionTime.STATIC_INIT)
188171
void setupSampler(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.quarkus.opentelemetry.deployment.traces;
2+
3+
import jakarta.inject.Inject;
4+
5+
import org.junit.jupiter.api.Assertions;
6+
import org.junit.jupiter.api.Test;
7+
import org.junit.jupiter.api.extension.RegisterExtension;
8+
9+
import io.opentelemetry.api.OpenTelemetry;
10+
import io.quarkus.test.QuarkusUnitTest;
11+
12+
public class OpenTelemetryTracingDisabledTest {
13+
14+
@RegisterExtension
15+
static final QuarkusUnitTest config = new QuarkusUnitTest()
16+
.withEmptyApplication()
17+
.overrideConfigKey("quarkus.otel.traces.enabled", "false")
18+
.overrideConfigKey("quarkus.otel.metrics.enabled", "true")
19+
.overrideConfigKey("quarkus.otel.logs.enabled", "true");
20+
21+
@Inject
22+
OpenTelemetry openTelemetry;
23+
24+
@Test
25+
void testNoOpenTelemetry() {
26+
Assertions.assertNotNull(openTelemetry, "A OpenTelemetry instance must be available");
27+
}
28+
}

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

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import io.quarkus.opentelemetry.runtime.config.runtime.OTelRuntimeConfig;
3636
import io.quarkus.opentelemetry.runtime.exporter.otlp.tracing.RemoveableLateBoundSpanProcessor;
3737
import io.quarkus.opentelemetry.runtime.propagation.TextMapPropagatorCustomizer;
38-
import io.quarkus.opentelemetry.runtime.tracing.DelayedAttributes;
3938
import io.quarkus.opentelemetry.runtime.tracing.DropTargetsSampler;
4039
import io.quarkus.opentelemetry.runtime.tracing.TracerRecorder;
4140
import io.quarkus.opentelemetry.runtime.tracing.TracerUtil;
@@ -87,15 +86,15 @@ public LogRecordProcessor apply(LogRecordProcessor lrp, ConfigProperties cp) {
8786
}
8887

8988
@Singleton
90-
final class TracingResourceCustomizer implements AutoConfiguredOpenTelemetrySdkBuilderCustomizer {
89+
final class ResourceCustomizer implements AutoConfiguredOpenTelemetrySdkBuilderCustomizer {
9190

9291
private final ApplicationConfig appConfig;
9392
private final OTelBuildConfig oTelBuildConfig;
9493
private final OTelRuntimeConfig oTelRuntimeConfig;
9594
private final Instance<DelayedAttributes> delayedAttributes;
9695
private final List<Resource> resources;
9796

98-
public TracingResourceCustomizer(ApplicationConfig appConfig,
97+
public ResourceCustomizer(ApplicationConfig appConfig,
9998
OTelBuildConfig oTelBuildConfig,
10099
OTelRuntimeConfig oTelRuntimeConfig,
101100
@Any Instance<DelayedAttributes> delayedAttributes,
@@ -112,36 +111,31 @@ public void customize(AutoConfiguredOpenTelemetrySdkBuilder builder) {
112111
builder.addResourceCustomizer(new BiFunction<>() {
113112
@Override
114113
public Resource apply(Resource existingResource, ConfigProperties configProperties) {
115-
if (oTelBuildConfig.traces().enabled().orElse(TRUE) ||
116-
oTelBuildConfig.metrics().enabled().orElse(TRUE)) {
117-
Resource consolidatedResource = existingResource.merge(
118-
Resource.create(delayedAttributes.get()));
119-
120-
// if user explicitly set 'otel.service.name', make sure we don't override it with defaults
121-
// inside resource customizer
122-
String serviceName = oTelRuntimeConfig
123-
.serviceName()
124-
.filter(new Predicate<String>() {
125-
@Override
126-
public boolean test(String sn) {
127-
return !sn.equals(appConfig.name().orElse("unset"));
128-
}
129-
})
130-
.orElse(null);
131-
132-
String hostname = getHostname();
133-
134-
// Merge resource instances with env attributes
135-
Resource resource = resources.stream()
136-
.reduce(Resource.empty(), Resource::merge)
137-
.merge(TracerUtil.mapResourceAttributes(
138-
oTelRuntimeConfig.resourceAttributes().orElse(emptyList()),
139-
serviceName, // from properties
140-
hostname));
141-
return consolidatedResource.merge(resource);
142-
} else {
143-
return Resource.builder().build();
144-
}
114+
Resource consolidatedResource = existingResource.merge(
115+
Resource.create(delayedAttributes.get()));
116+
117+
// if user explicitly set 'otel.service.name', make sure we don't override it with defaults
118+
// inside resource customizer
119+
String serviceName = oTelRuntimeConfig
120+
.serviceName()
121+
.filter(new Predicate<String>() {
122+
@Override
123+
public boolean test(String sn) {
124+
return !sn.equals(appConfig.name().orElse("unset"));
125+
}
126+
})
127+
.orElse(null);
128+
129+
String hostname = getHostname();
130+
131+
// Merge resource instances with env attributes
132+
Resource resource = resources.stream()
133+
.reduce(Resource.empty(), Resource::merge)
134+
.merge(TracerUtil.mapResourceAttributes(
135+
oTelRuntimeConfig.resourceAttributes().orElse(emptyList()),
136+
serviceName, // from properties
137+
hostname));
138+
return consolidatedResource.merge(resource);
145139
}
146140
});
147141
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.quarkus.opentelemetry.runtime.tracing;
1+
package io.quarkus.opentelemetry.runtime;
22

33
import java.util.Collections;
44
import java.util.Map;

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

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

3+
import static io.opentelemetry.semconv.ServiceAttributes.SERVICE_NAME;
4+
import static io.opentelemetry.semconv.ServiceAttributes.SERVICE_VERSION;
5+
import static io.opentelemetry.semconv.incubating.WebengineIncubatingAttributes.WEBENGINE_NAME;
6+
import static io.opentelemetry.semconv.incubating.WebengineIncubatingAttributes.WEBENGINE_VERSION;
7+
38
import java.time.Duration;
49
import java.util.HashMap;
510
import java.util.Map;
@@ -14,9 +19,11 @@
1419

1520
import io.opentelemetry.api.GlobalOpenTelemetry;
1621
import io.opentelemetry.api.OpenTelemetry;
22+
import io.opentelemetry.api.common.Attributes;
1723
import io.opentelemetry.api.incubator.events.GlobalEventLoggerProvider;
1824
import io.opentelemetry.context.ContextStorage;
1925
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
26+
import io.opentelemetry.sdk.resources.Resource;
2027
import io.quarkus.arc.SyntheticCreationalContext;
2128
import io.quarkus.opentelemetry.runtime.config.runtime.OTelRuntimeConfig;
2229
import io.quarkus.runtime.RuntimeValue;
@@ -39,6 +46,27 @@ public void resetGlobalOpenTelemetryForDevMode() {
3946
GlobalEventLoggerProvider.resetForTest();
4047
}
4148

49+
@StaticInit
50+
public Supplier<DelayedAttributes> delayedAttributes(String quarkusVersion,
51+
String serviceName,
52+
String serviceVersion) {
53+
return new Supplier<>() {
54+
@Override
55+
public DelayedAttributes get() {
56+
var result = new DelayedAttributes();
57+
result.setAttributesDelegate(Resource.getDefault()
58+
.merge(Resource.create(
59+
Attributes.of(
60+
SERVICE_NAME, serviceName,
61+
SERVICE_VERSION, serviceVersion,
62+
WEBENGINE_NAME, "Quarkus",
63+
WEBENGINE_VERSION, quarkusVersion)))
64+
.getAttributes());
65+
return result;
66+
}
67+
};
68+
}
69+
4270
@RuntimeInit
4371
public RuntimeValue<Boolean> isOtelSdkEnabled(OTelRuntimeConfig oTelRuntimeConfig) {
4472
return new RuntimeValue<>(!oTelRuntimeConfig.sdkDisabled());

extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/tracing/TracerRecorder.java

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,9 @@
11
package io.quarkus.opentelemetry.runtime.tracing;
22

3-
import static io.opentelemetry.semconv.ServiceAttributes.SERVICE_NAME;
4-
import static io.opentelemetry.semconv.ServiceAttributes.SERVICE_VERSION;
5-
import static io.opentelemetry.semconv.incubating.WebengineIncubatingAttributes.WEBENGINE_NAME;
6-
import static io.opentelemetry.semconv.incubating.WebengineIncubatingAttributes.WEBENGINE_VERSION;
7-
83
import java.util.HashSet;
94
import java.util.List;
105
import java.util.Set;
11-
import java.util.function.Supplier;
126

13-
import io.opentelemetry.api.common.Attributes;
14-
import io.opentelemetry.sdk.resources.Resource;
157
import io.quarkus.runtime.annotations.Recorder;
168
import io.quarkus.runtime.annotations.StaticInit;
179

@@ -21,27 +13,6 @@ public class TracerRecorder {
2113
public static final Set<String> dropNonApplicationUriTargets = new HashSet<>();
2214
public static final Set<String> dropStaticResourceTargets = new HashSet<>();
2315

24-
@StaticInit
25-
public Supplier<DelayedAttributes> delayedAttributes(String quarkusVersion,
26-
String serviceName,
27-
String serviceVersion) {
28-
return new Supplier<>() {
29-
@Override
30-
public DelayedAttributes get() {
31-
var result = new DelayedAttributes();
32-
result.setAttributesDelegate(Resource.getDefault()
33-
.merge(Resource.create(
34-
Attributes.of(
35-
SERVICE_NAME, serviceName,
36-
SERVICE_VERSION, serviceVersion,
37-
WEBENGINE_NAME, "Quarkus",
38-
WEBENGINE_VERSION, quarkusVersion)))
39-
.getAttributes());
40-
return result;
41-
}
42-
};
43-
}
44-
4516
@StaticInit
4617
public void setupSampler(
4718
List<String> dropNonApplicationUris,

0 commit comments

Comments
 (0)