From a1f4fab40f6e359d77335e5613275b43abdcec9d Mon Sep 17 00:00:00 2001 From: brunobat Date: Tue, 26 Mar 2024 16:02:41 +0000 Subject: [PATCH] Backport hide EndUserSpanProcessor integration --- docs/src/main/asciidoc/opentelemetry.adoc | 4 -- .../exporter/otlp/OtlpExporterProcessor.java | 5 +++ .../build/EndUserSpanProcessorConfig.java | 2 + .../exporter/otlp/EndUserSpanProcessor.java | 38 +++++++++++++++---- 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/docs/src/main/asciidoc/opentelemetry.adoc b/docs/src/main/asciidoc/opentelemetry.adoc index 2a621b0c5c14f..9e565536d89f8 100644 --- a/docs/src/main/asciidoc/opentelemetry.adoc +++ b/docs/src/main/asciidoc/opentelemetry.adoc @@ -382,10 +382,6 @@ public class CustomConfiguration { } ---- -==== User data - -By setting `quarkus.otel.traces.eusp.enabled=true` you can add information about the user related to each span. The user's ID and roles will be added to the span attributes, if available. - [[sampler]] === Sampler A https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/sdk.md#sampling[sampler] decides whether a trace should be discarded or forwarded, effectively managing noise and reducing overhead by limiting the number of collected traces sent to the collector. diff --git a/extensions/opentelemetry/deployment/src/main/java/io/quarkus/opentelemetry/deployment/exporter/otlp/OtlpExporterProcessor.java b/extensions/opentelemetry/deployment/src/main/java/io/quarkus/opentelemetry/deployment/exporter/otlp/OtlpExporterProcessor.java index 8d2d594d3ca44..d224e04db3a27 100644 --- a/extensions/opentelemetry/deployment/src/main/java/io/quarkus/opentelemetry/deployment/exporter/otlp/OtlpExporterProcessor.java +++ b/extensions/opentelemetry/deployment/src/main/java/io/quarkus/opentelemetry/deployment/exporter/otlp/OtlpExporterProcessor.java @@ -12,6 +12,7 @@ import org.jboss.jandex.DotName; import org.jboss.jandex.ParameterizedType; import org.jboss.jandex.Type; +import org.jboss.logging.Logger; import io.opentelemetry.sdk.trace.SpanProcessor; import io.opentelemetry.sdk.trace.export.SpanExporter; @@ -35,6 +36,8 @@ @BuildSteps(onlyIf = OtlpExporterProcessor.OtlpExporterEnabled.class) public class OtlpExporterProcessor { + private static final Logger LOG = Logger.getLogger(OtlpExporterProcessor.class); + static class OtlpExporterEnabled implements BooleanSupplier { OtlpExporterBuildConfig exportBuildConfig; OTelBuildConfig otelBuildConfig; @@ -55,6 +58,8 @@ void createEndUserSpanProcessor( buildProducer.produce( AdditionalBeanBuildItem.unremovableOf( EndUserSpanProcessor.class)); + LOG.warn("End User Span tracking has been enabled by setting quarkus.otel.traces.eusp.enabled=true. Please " + + "AVOID using this feature in production with the current Quarkus version."); } } diff --git a/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/config/build/EndUserSpanProcessorConfig.java b/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/config/build/EndUserSpanProcessorConfig.java index 2e261c0d3e89b..de94bc2fa1c11 100644 --- a/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/config/build/EndUserSpanProcessorConfig.java +++ b/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/config/build/EndUserSpanProcessorConfig.java @@ -2,6 +2,7 @@ import java.util.Optional; +import io.quarkus.runtime.annotations.ConfigDocIgnore; import io.quarkus.runtime.annotations.ConfigGroup; import io.smallrye.config.WithDefault; @@ -18,6 +19,7 @@ public interface EndUserSpanProcessorConfig { * the {@link io.opentelemetry.semconv.SemanticAttributes.ENDUSER_ID} * and {@link io.opentelemetry.semconv.SemanticAttributes.ENDUSER_ROLE} to the Span. */ + @ConfigDocIgnore @WithDefault("false") Optional enabled(); diff --git a/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/exporter/otlp/EndUserSpanProcessor.java b/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/exporter/otlp/EndUserSpanProcessor.java index a17cff566afd3..16f1335562115 100644 --- a/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/exporter/otlp/EndUserSpanProcessor.java +++ b/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/exporter/otlp/EndUserSpanProcessor.java @@ -5,6 +5,7 @@ import jakarta.inject.Inject; import org.eclipse.microprofile.context.ManagedExecutor; +import org.jboss.logging.Logger; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.context.Context; @@ -12,11 +13,15 @@ import io.opentelemetry.sdk.trace.ReadableSpan; import io.opentelemetry.sdk.trace.SpanProcessor; import io.opentelemetry.semconv.SemanticAttributes; +import io.quarkus.arc.Arc; +import io.quarkus.arc.ManagedContext; import io.quarkus.security.identity.SecurityIdentity; @ApplicationScoped public class EndUserSpanProcessor implements SpanProcessor { + private static final Logger LOG = Logger.getLogger(EndUserSpanProcessor.class); + @Inject protected SecurityIdentity securityIdentity; @@ -27,14 +32,31 @@ public class EndUserSpanProcessor implements SpanProcessor { @ActivateRequestContext public void onStart(Context parentContext, ReadWriteSpan span) { managedExecutor.execute( - () -> span.setAllAttributes( - securityIdentity.isAnonymous() - ? Attributes.empty() - : Attributes.of( - SemanticAttributes.ENDUSER_ID, - securityIdentity.getPrincipal().getName(), - SemanticAttributes.ENDUSER_ROLE, - securityIdentity.getRoles().toString()))); + () -> { + try { + if (!span.isRecording()) { + LOG.debug("Failed to set end user attributes on spanId:" + + span.getSpanContext().getSpanId() + " Span not recording"); + return; + } + ManagedContext managedContext = Arc.container().requestContext(); + if (!managedContext.isActive()) { + LOG.debug("Failed to set end user attributes on span.spanId:" + + span.getSpanContext().getSpanId() + " Request Context not active"); + return; + } + span.setAllAttributes( + securityIdentity.isAnonymous() + ? Attributes.empty() + : Attributes.of( + SemanticAttributes.ENDUSER_ID, + securityIdentity.getPrincipal().getName(), + SemanticAttributes.ENDUSER_ROLE, + securityIdentity.getRoles().toString())); + } catch (Exception e) { + LOG.debug("Failed to set end user attributes on span", e); + } + }); } @Override