Skip to content

Commit

Permalink
EndUserSpanProcessor integration
Browse files Browse the repository at this point in the history
  • Loading branch information
A.Moscatelli authored and amoscatelli committed Jul 26, 2023
1 parent 02d2e43 commit 6fe7e1a
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,14 @@
import io.opentelemetry.sdk.trace.SpanProcessor;
import io.opentelemetry.sdk.trace.export.SpanExporter;
import io.quarkus.arc.deployment.SyntheticBeanBuildItem;
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.BuildSteps;
import io.quarkus.deployment.annotations.ExecutionTime;
import io.quarkus.deployment.annotations.Record;
import io.quarkus.opentelemetry.runtime.config.build.OTelBuildConfig;
import io.quarkus.opentelemetry.runtime.config.build.exporter.OtlpExporterBuildConfig;
import io.quarkus.opentelemetry.runtime.exporter.otlp.EndUserSpanProcessor;
import io.quarkus.opentelemetry.runtime.config.runtime.OTelRuntimeConfig;
import io.quarkus.opentelemetry.runtime.config.runtime.exporter.OtlpExporterRuntimeConfig;
import io.quarkus.opentelemetry.runtime.exporter.otlp.LateBoundBatchSpanProcessor;
Expand All @@ -41,6 +43,17 @@ public boolean getAsBoolean() {
exportBuildConfig.enabled();
}
}

@BuildStep
void createEndUserSpanProcessor(
BuildProducer<AdditionalBeanBuildItem> buildProducer,
OTelBuildConfig otelBuildConfig) {
if (otelBuildConfig.traces().eusp().enabled().orElse(Boolean.FALSE)) {
buildProducer.produce(
AdditionalBeanBuildItem.unremovableOf(
EndUserSpanProcessor.class));
}
}

@SuppressWarnings("deprecation")
@BuildStep
Expand All @@ -62,4 +75,4 @@ SyntheticBeanBuildItem createBatchSpanProcessor(OtlpRecorder recorder,
.done();

}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package io.quarkus.opentelemetry.runtime.config.build;

import java.util.Optional;

import io.quarkus.runtime.annotations.ConfigGroup;
import io.smallrye.config.WithDefault;

/**
* Tracing build time configuration
*/
@ConfigGroup
public interface EndUserSpanProcessorConfig {

/**
* Enable tracing with OpenTelemetry.
* <p>
* This property is not available in the Open Telemetry SDK. It's Quarkus specific.
* <p>
* Support for tracing will be enabled if OpenTelemetry support is enabled
* and either this value is true, or this value is unset.
*/
@WithDefault("false")
Optional<Boolean> enabled();

}
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,9 @@ public interface TracesBuildConfig {
*/
@WithDefault(SamplerType.Constants.PARENT_BASED_ALWAYS_ON)
String sampler();

/**
* EndUser SpanProcessor configurations.
*/
EndUserSpanProcessorConfig eusp();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package io.quarkus.opentelemetry.runtime.exporter.otlp;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.context.control.ActivateRequestContext;
import jakarta.inject.Inject;

import org.eclipse.microprofile.context.ManagedExecutor;

import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.context.Context;
import io.opentelemetry.sdk.trace.ReadWriteSpan;
import io.opentelemetry.sdk.trace.ReadableSpan;
import io.opentelemetry.sdk.trace.SpanProcessor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import io.quarkus.security.identity.SecurityIdentity;

@ApplicationScoped
public class EndUserSpanProcessor implements SpanProcessor {

@Inject
protected SecurityIdentity securityIdentity;

@Inject
protected ManagedExecutor managedExecutor;

@Override
@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())));
}

@Override
public boolean isStartRequired() {
return Boolean.TRUE;
}

@Override
public void onEnd(ReadableSpan span) {
}

@Override
public boolean isEndRequired() {
return Boolean.FALSE;
}

}

0 comments on commit 6fe7e1a

Please sign in to comment.