diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaSingletons.java b/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaSingletons.java index 5cef0f369635..20a1498ed181 100644 --- a/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaSingletons.java +++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaSingletons.java @@ -5,23 +5,29 @@ package io.opentelemetry.javaagent.instrumentation.awslambdacore.v1_0; +import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; + import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.incubator.ExtendedOpenTelemetry; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.AwsLambdaFunctionInstrumenter; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.AwsLambdaFunctionInstrumenterFactory; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.WrapperConfiguration; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import java.time.Duration; public final class AwsLambdaSingletons { - private static final AwsLambdaFunctionInstrumenter FUNCTION_INSTRUMENTER = - AwsLambdaFunctionInstrumenterFactory.createInstrumenter(GlobalOpenTelemetry.get()); - private static final Duration FLUSH_TIMEOUT = - Duration.ofMillis( - AgentInstrumentationConfig.get() - .getLong( - "otel.instrumentation.aws-lambda.flush-timeout", - WrapperConfiguration.OTEL_LAMBDA_FLUSH_TIMEOUT_DEFAULT.toMillis())); + private static final AwsLambdaFunctionInstrumenter FUNCTION_INSTRUMENTER; + private static final Duration FLUSH_TIMEOUT; + + static { + Configuration config = new Configuration(GlobalOpenTelemetry.get()); + + FLUSH_TIMEOUT = Duration.ofMillis(config.flushTimeout); + FUNCTION_INSTRUMENTER = + AwsLambdaFunctionInstrumenterFactory.createInstrumenter(GlobalOpenTelemetry.get()); + } public static AwsLambdaFunctionInstrumenter functionInstrumenter() { return FUNCTION_INSTRUMENTER; @@ -31,5 +37,31 @@ public static Duration flushTimeout() { return FLUSH_TIMEOUT; } + // instrumentation/development: + // java: + // aws_lambda: + // flush_timeout: 10000 + private static final class Configuration { + + private final long flushTimeout; + + Configuration(OpenTelemetry openTelemetry) { + DeclarativeConfigProperties javaConfig = empty(); + if (openTelemetry instanceof ExtendedOpenTelemetry) { + ExtendedOpenTelemetry extendedOpenTelemetry = (ExtendedOpenTelemetry) openTelemetry; + DeclarativeConfigProperties instrumentationConfig = + extendedOpenTelemetry.getConfigProvider().getInstrumentationConfig(); + if (instrumentationConfig != null) { + javaConfig = instrumentationConfig.getStructured("java", empty()); + } + } + DeclarativeConfigProperties awsLambdaConfig = javaConfig.getStructured("aws_lambda", empty()); + + this.flushTimeout = + awsLambdaConfig.getLong( + "flush_timeout", WrapperConfiguration.OTEL_LAMBDA_FLUSH_TIMEOUT_DEFAULT.toMillis()); + } + } + private AwsLambdaSingletons() {} } diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaSingletons.java b/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaSingletons.java index 8ffd8f7a10bd..268a319cca9d 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaSingletons.java +++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaSingletons.java @@ -5,32 +5,37 @@ package io.opentelemetry.javaagent.instrumentation.awslambdaevents.v2_2; +import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; + import com.amazonaws.services.lambda.runtime.events.SQSEvent; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.incubator.ExtendedOpenTelemetry; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.AwsLambdaFunctionInstrumenter; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.WrapperConfiguration; import io.opentelemetry.instrumentation.awslambdaevents.common.v2_2.internal.AwsLambdaEventsInstrumenterFactory; import io.opentelemetry.instrumentation.awslambdaevents.common.v2_2.internal.AwsLambdaSqsInstrumenterFactory; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import java.time.Duration; public final class AwsLambdaSingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.aws-lambda-events-2.2"; - private static final AwsLambdaFunctionInstrumenter FUNCTION_INSTRUMENTER = - AwsLambdaEventsInstrumenterFactory.createInstrumenter( - GlobalOpenTelemetry.get(), - INSTRUMENTATION_NAME, - AgentCommonConfig.get().getKnownHttpRequestMethods()); - private static final Instrumenter MESSAGE_TRACER = - AwsLambdaSqsInstrumenterFactory.forEvent(GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME); - private static final Duration FLUSH_TIMEOUT = - Duration.ofMillis( - AgentInstrumentationConfig.get() - .getLong( - "otel.instrumentation.aws-lambda.flush-timeout", - WrapperConfiguration.OTEL_LAMBDA_FLUSH_TIMEOUT_DEFAULT.toMillis())); + + private static final AwsLambdaFunctionInstrumenter FUNCTION_INSTRUMENTER; + private static final Instrumenter MESSAGE_TRACER; + private static final Duration FLUSH_TIMEOUT; + + static { + Configuration config = new Configuration(GlobalOpenTelemetry.get()); + + FUNCTION_INSTRUMENTER = + AwsLambdaEventsInstrumenterFactory.createInstrumenter( + GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME); + MESSAGE_TRACER = + AwsLambdaSqsInstrumenterFactory.forEvent(GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME); + FLUSH_TIMEOUT = Duration.ofMillis(config.flushTimeout); + } public static AwsLambdaFunctionInstrumenter functionInstrumenter() { return FUNCTION_INSTRUMENTER; @@ -44,5 +49,44 @@ public static Duration flushTimeout() { return FLUSH_TIMEOUT; } + // instrumentation/development: + // java: + // aws_lambda: + // flush_timeout: 10000 + // http: + // known_methods: + // - CONNECT + // - DELETE + // - GET + // - HEAD + // - OPTIONS + // - PATCH + // - POST + // - PUT + // - TRACE + private static final class Configuration { + + private final long flushTimeout; + + Configuration(OpenTelemetry openTelemetry) { + DeclarativeConfigProperties javaConfig = empty(); + if (openTelemetry instanceof ExtendedOpenTelemetry) { + ExtendedOpenTelemetry extendedOpenTelemetry = (ExtendedOpenTelemetry) openTelemetry; + DeclarativeConfigProperties instrumentationConfig = + extendedOpenTelemetry.getConfigProvider().getInstrumentationConfig(); + if (instrumentationConfig != null) { + javaConfig = instrumentationConfig.getStructured("java", empty()); + } + } + + this.flushTimeout = + javaConfig + .getStructured("aws_lambda", empty()) + .getLong( + "flush_timeout", + WrapperConfiguration.OTEL_LAMBDA_FLUSH_TIMEOUT_DEFAULT.toMillis()); + } + } + private AwsLambdaSingletons() {} } diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/TracingRequestWrapperBase.java b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/TracingRequestWrapperBase.java index a34faa73f4eb..92f9b61bd770 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/TracingRequestWrapperBase.java +++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/TracingRequestWrapperBase.java @@ -7,7 +7,6 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; -import io.opentelemetry.instrumentation.api.internal.HttpConstants; import io.opentelemetry.instrumentation.awslambdacore.v1_0.TracingRequestHandler; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.MapUtils; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.WrappedLambda; @@ -49,7 +48,7 @@ protected TracingRequestWrapperBase(BiFunction, Object> parameterMap openTelemetrySdk, WrapperConfiguration.flushTimeout(), AwsLambdaEventsInstrumenterFactory.createInstrumenter( - openTelemetrySdk, INSTRUMENTATION_NAME, HttpConstants.KNOWN_METHODS)); + openTelemetrySdk, INSTRUMENTATION_NAME)); this.wrappedLambda = wrappedLambda; this.targetMethod = wrappedLambda.getRequestTargetMethod(); this.parameterMapper = parameterMapper; diff --git a/instrumentation/aws-lambda/aws-lambda-events-3.11/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v3_11/TracingRequestWrapperBase.java b/instrumentation/aws-lambda/aws-lambda-events-3.11/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v3_11/TracingRequestWrapperBase.java index 5b72ded55821..46d8aaad6e41 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-3.11/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v3_11/TracingRequestWrapperBase.java +++ b/instrumentation/aws-lambda/aws-lambda-events-3.11/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v3_11/TracingRequestWrapperBase.java @@ -7,7 +7,6 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; -import io.opentelemetry.instrumentation.api.internal.HttpConstants; import io.opentelemetry.instrumentation.awslambdacore.v1_0.TracingRequestHandler; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.MapUtils; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.WrappedLambda; @@ -49,7 +48,7 @@ protected TracingRequestWrapperBase(BiFunction, Object> parameterMap openTelemetrySdk, WrapperConfiguration.flushTimeout(), AwsLambdaEventsInstrumenterFactory.createInstrumenter( - openTelemetrySdk, INSTRUMENTATION_NAME, HttpConstants.KNOWN_METHODS)); + openTelemetrySdk, INSTRUMENTATION_NAME)); this.wrappedLambda = wrappedLambda; this.targetMethod = wrappedLambda.getRequestTargetMethod(); this.parameterMapper = parameterMapper; diff --git a/instrumentation/aws-lambda/aws-lambda-events-common-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/common/v2_2/internal/AwsLambdaEventsInstrumenterFactory.java b/instrumentation/aws-lambda/aws-lambda-events-common-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/common/v2_2/internal/AwsLambdaEventsInstrumenterFactory.java index e5d615113253..fa226771bb45 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-common-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/common/v2_2/internal/AwsLambdaEventsInstrumenterFactory.java +++ b/instrumentation/aws-lambda/aws-lambda-events-common-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/common/v2_2/internal/AwsLambdaEventsInstrumenterFactory.java @@ -5,13 +5,20 @@ package io.opentelemetry.instrumentation.awslambdaevents.common.v2_2.internal; +import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; + import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.incubator.ExtendedOpenTelemetry; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; +import io.opentelemetry.instrumentation.api.internal.HttpConstants; import io.opentelemetry.instrumentation.awslambdacore.v1_0.AwsLambdaRequest; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.AwsLambdaFunctionAttributesExtractor; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.AwsLambdaFunctionInstrumenter; +import java.util.ArrayList; +import java.util.HashSet; import java.util.Set; /** @@ -21,13 +28,14 @@ public final class AwsLambdaEventsInstrumenterFactory { public static AwsLambdaFunctionInstrumenter createInstrumenter( - OpenTelemetry openTelemetry, String instrumentationName, Set knownMethods) { + OpenTelemetry openTelemetry, String instrumentationName) { + Configuration config = new Configuration(openTelemetry); return new AwsLambdaFunctionInstrumenter( openTelemetry, Instrumenter.builder( openTelemetry, instrumentationName, AwsLambdaEventsInstrumenterFactory::spanName) .addAttributesExtractor(new AwsLambdaFunctionAttributesExtractor()) - .addAttributesExtractor(new ApiGatewayProxyAttributesExtractor(knownMethods)) + .addAttributesExtractor(new ApiGatewayProxyAttributesExtractor(config.knownHttpMethods)) .buildInstrumenter(SpanKindExtractor.alwaysServer())); } @@ -43,5 +51,41 @@ private static String spanName(AwsLambdaRequest input) { return input.getAwsContext().getFunctionName(); } + // instrumentation/development: + // java: + // http: + // known_methods: + // - CONNECT + // - DELETE + // - GET + // - HEAD + // - OPTIONS + // - PATCH + // - POST + // - PUT + // - TRACE + private static final class Configuration { + + private final Set knownHttpMethods; + + Configuration(OpenTelemetry openTelemetry) { + DeclarativeConfigProperties javaConfig = empty(); + if (openTelemetry instanceof ExtendedOpenTelemetry) { + ExtendedOpenTelemetry extendedOpenTelemetry = (ExtendedOpenTelemetry) openTelemetry; + DeclarativeConfigProperties instrumentationConfig = + extendedOpenTelemetry.getConfigProvider().getInstrumentationConfig(); + if (instrumentationConfig != null) { + javaConfig = instrumentationConfig.getStructured("java", empty()); + } + } + DeclarativeConfigProperties httpConfig = javaConfig.getStructured("http", empty()); + + this.knownHttpMethods = + new HashSet<>( + httpConfig.getScalarList( + "known_methods", String.class, new ArrayList<>(HttpConstants.KNOWN_METHODS))); + } + } + private AwsLambdaEventsInstrumenterFactory() {} } diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/TracingRequestHandler.java b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/TracingRequestHandler.java index 872c7303507a..2bf6f51ef590 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/TracingRequestHandler.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/TracingRequestHandler.java @@ -5,17 +5,22 @@ package io.opentelemetry.javaagent.instrumentation.awssdk.v1_11; +import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; + import com.amazonaws.AmazonWebServiceRequest; import com.amazonaws.Request; import com.amazonaws.Response; import com.amazonaws.handlers.HandlerContextKey; import com.amazonaws.handlers.RequestHandler2; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.incubator.ExtendedOpenTelemetry; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.awssdk.v1_11.AwsSdkTelemetry; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; +import java.util.Collections; +import java.util.List; /** * A {@link RequestHandler2} for use in the agent. Unlike library instrumentation, the agent will @@ -33,16 +38,19 @@ public class TracingRequestHandler extends RequestHandler2 { public static final HandlerContextKey SCOPE = new HandlerContextKey<>(Scope.class.getName()); - public static final RequestHandler2 tracingHandler = - AwsSdkTelemetry.builder(GlobalOpenTelemetry.get()) - .setCaptureExperimentalSpanAttributes( - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.aws-sdk.experimental-span-attributes", false)) - .setMessagingReceiveInstrumentationEnabled( - ExperimentalConfig.get().messagingReceiveInstrumentationEnabled()) - .setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders()) - .build() - .newRequestHandler(); + public static final RequestHandler2 tracingHandler; + + static { + Configuration config = new Configuration(GlobalOpenTelemetry.get()); + + tracingHandler = + AwsSdkTelemetry.builder(GlobalOpenTelemetry.get()) + .setCaptureExperimentalSpanAttributes(config.experimentalSpanAttributes) + .setMessagingReceiveTelemetryEnabled(config.messagingReceiveTelemetryEnabled) + .setCapturedHeaders(config.messagingCapturedHeaders) + .build() + .newRequestHandler(); + } @Override public void beforeRequest(Request request) { @@ -79,4 +87,43 @@ private static void finish(Request request) { scope.close(); request.addHandlerContext(SCOPE, null); } + + // instrumentation/development: + // java: + // aws_sdk: + // experimental_span_attributes: false + // messaging: + // receive_telemetry/development: + // enabled: false + // capture_headers/development: [] + private static final class Configuration { + + private final boolean experimentalSpanAttributes; + private final boolean messagingReceiveTelemetryEnabled; + private final List messagingCapturedHeaders; + + Configuration(OpenTelemetry openTelemetry) { + DeclarativeConfigProperties javaConfig = empty(); + if (openTelemetry instanceof ExtendedOpenTelemetry) { + ExtendedOpenTelemetry extendedOpenTelemetry = (ExtendedOpenTelemetry) openTelemetry; + DeclarativeConfigProperties instrumentationConfig = + extendedOpenTelemetry.getConfigProvider().getInstrumentationConfig(); + if (instrumentationConfig != null) { + javaConfig = instrumentationConfig.getStructured("java", empty()); + } + } + DeclarativeConfigProperties awsSdkConfig = javaConfig.getStructured("aws_sdk", empty()); + DeclarativeConfigProperties messagingConfig = javaConfig.getStructured("messaging", empty()); + + this.experimentalSpanAttributes = + awsSdkConfig.getBoolean("experimental_span_attributes", false); + this.messagingReceiveTelemetryEnabled = + messagingConfig + .getStructured("receive_telemetry/development", empty()) + .getBoolean("enabled", false); + this.messagingCapturedHeaders = + messagingConfig.getScalarList( + "capture_headers/development", String.class, Collections.emptyList()); + } + } } diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java index 2d92c041c0be..a68b240b1b0d 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java @@ -25,7 +25,7 @@ public class TracingRequestHandler extends RequestHandler2 { .setCaptureExperimentalSpanAttributes( ConfigPropertiesUtil.getBoolean( "otel.instrumentation.aws-sdk.experimental-span-attributes", false)) - .setMessagingReceiveInstrumentationEnabled( + .setMessagingReceiveTelemetryEnabled( ConfigPropertiesUtil.getBoolean( "otel.instrumentation.messaging.experimental.receive-telemetry.enabled", false)) .setCapturedHeaders( diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkTelemetryBuilder.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkTelemetryBuilder.java index 91c26d59df75..6785aea26934 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkTelemetryBuilder.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkTelemetryBuilder.java @@ -20,7 +20,7 @@ public class AwsSdkTelemetryBuilder { private List capturedHeaders = emptyList(); private boolean captureExperimentalSpanAttributes; - private boolean messagingReceiveInstrumentationEnabled; + private boolean messagingReceiveTelemetryEnabled; AwsSdkTelemetryBuilder(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; @@ -54,11 +54,26 @@ public AwsSdkTelemetryBuilder setCaptureExperimentalSpanAttributes( * *

Note that this will cause the consumer side to start a new trace, with only a span link * connecting it to the producer trace. + * + * @deprecated Use {@link #setMessagingReceiveTelemetryEnabled(boolean)} instead. */ + @Deprecated @CanIgnoreReturnValue public AwsSdkTelemetryBuilder setMessagingReceiveInstrumentationEnabled( boolean messagingReceiveInstrumentationEnabled) { - this.messagingReceiveInstrumentationEnabled = messagingReceiveInstrumentationEnabled; + return setMessagingReceiveTelemetryEnabled(messagingReceiveInstrumentationEnabled); + } + + /** + * Set whether to capture the consumer message receive telemetry in messaging instrumentation. + * + *

Note that this will cause the consumer side to start a new trace, with only a span link + * connecting it to the producer trace. + */ + @CanIgnoreReturnValue + public AwsSdkTelemetryBuilder setMessagingReceiveTelemetryEnabled( + boolean messagingReceiveTelemetryEnabled) { + this.messagingReceiveTelemetryEnabled = messagingReceiveTelemetryEnabled; return this; } @@ -70,6 +85,6 @@ public AwsSdkTelemetry build() { openTelemetry, capturedHeaders, captureExperimentalSpanAttributes, - messagingReceiveInstrumentationEnabled); + messagingReceiveTelemetryEnabled); } } diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/SqsTracingTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/SqsTracingTest.java index 41c47c9fc507..71b2906bf764 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/SqsTracingTest.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/SqsTracingTest.java @@ -27,7 +27,7 @@ public AmazonSQSAsyncClientBuilder configureClient(AmazonSQSAsyncClientBuilder c return client.withRequestHandlers( AwsSdkTelemetry.builder(testing().getOpenTelemetry()) .setCaptureExperimentalSpanAttributes(true) - .setMessagingReceiveInstrumentationEnabled(true) + .setMessagingReceiveTelemetryEnabled(true) .setCapturedHeaders(singletonList("Test-Message-Header")) .build() .newRequestHandler()); diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkSingletons.java b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkSingletons.java index f84cd5590e99..a6be4afd3d6f 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkSingletons.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkSingletons.java @@ -5,10 +5,15 @@ package io.opentelemetry.javaagent.instrumentation.awssdk.v2_2; +import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; + +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.incubator.ExtendedOpenTelemetry; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkTelemetry; import io.opentelemetry.instrumentation.awssdk.v2_2.internal.AbstractAwsSdkTelemetryFactory; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; +import java.util.Collections; import java.util.List; public final class AwsSdkSingletons { @@ -21,19 +26,89 @@ public static AwsSdkTelemetry telemetry() { private static class AwsSdkTelemetryFactory extends AbstractAwsSdkTelemetryFactory { + private final Configuration config = new Configuration(GlobalOpenTelemetry.get()); + @Override protected List getCapturedHeaders() { - return ExperimentalConfig.get().getMessagingHeaders(); + return config.capturedHeaders; + } + + @Override + protected boolean messagingReceiveTelemetryEnabled() { + return config.messagingReceiveTelemetryEnabled; + } + + @Override + protected boolean captureExperimentalSpanAttributes() { + return config.captureExperimentalSpanAttributes; } @Override - protected boolean messagingReceiveInstrumentationEnabled() { - return ExperimentalConfig.get().messagingReceiveInstrumentationEnabled(); + protected boolean useMessagingPropagator() { + return config.useMessagingPropagator; } @Override - protected boolean getBoolean(String name, boolean defaultValue) { - return AgentInstrumentationConfig.get().getBoolean(name, defaultValue); + protected boolean recordIndividualHttpError() { + return config.recordIndividualHttpError; + } + + @Override + protected boolean genaiCaptureMessageContent() { + return config.genaiCaptureMessageContent; + } + + // instrumentation/development: + // java: + // aws_sdk: + // experimental_span_attributes: false + // experimental_use_propagator_for_messaging: false + // experimental_record_individual_http_error: false + // genai: + // capture_message_content: false + // messaging: + // receive_telemetry/development: + // enabled: false + // capture_headers/development: [] + private static final class Configuration { + + private final List capturedHeaders; + private final boolean messagingReceiveTelemetryEnabled; + private final boolean captureExperimentalSpanAttributes; + private final boolean useMessagingPropagator; + private final boolean recordIndividualHttpError; + private final boolean genaiCaptureMessageContent; + + Configuration(OpenTelemetry openTelemetry) { + DeclarativeConfigProperties javaConfig = empty(); + if (openTelemetry instanceof ExtendedOpenTelemetry) { + ExtendedOpenTelemetry extendedOpenTelemetry = (ExtendedOpenTelemetry) openTelemetry; + DeclarativeConfigProperties instrumentationConfig = + extendedOpenTelemetry.getConfigProvider().getInstrumentationConfig(); + if (instrumentationConfig != null) { + javaConfig = instrumentationConfig.getStructured("java", empty()); + } + } + DeclarativeConfigProperties awsSdkConfig = javaConfig.getStructured("aws_sdk", empty()); + DeclarativeConfigProperties genaiConfig = javaConfig.getStructured("genai", empty()); + DeclarativeConfigProperties messagingConfig = + javaConfig.getStructured("messaging", empty()); + + this.capturedHeaders = + messagingConfig.getScalarList( + "capture_headers/development", String.class, Collections.emptyList()); + this.messagingReceiveTelemetryEnabled = + messagingConfig + .getStructured("receive_telemetry/development", empty()) + .getBoolean("enabled", false); + this.captureExperimentalSpanAttributes = + awsSdkConfig.getBoolean("experimental_span_attributes", false); + this.useMessagingPropagator = + awsSdkConfig.getBoolean("experimental_use_propagator_for_messaging", false); + this.recordIndividualHttpError = + awsSdkConfig.getBoolean("experimental_record_individual_http_error", false); + this.genaiCaptureMessageContent = genaiConfig.getBoolean("capture_message_content", false); + } } } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java b/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java index 089757bea505..e16cb4da2002 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java @@ -29,14 +29,33 @@ protected List getCapturedHeaders() { } @Override - protected boolean messagingReceiveInstrumentationEnabled() { + protected boolean messagingReceiveTelemetryEnabled() { return ConfigPropertiesUtil.getBoolean( "otel.instrumentation.messaging.experimental.receive-telemetry.enabled", false); } @Override - protected boolean getBoolean(String name, boolean defaultValue) { - return ConfigPropertiesUtil.getBoolean(name, defaultValue); + protected boolean captureExperimentalSpanAttributes() { + return ConfigPropertiesUtil.getBoolean( + "otel.instrumentation.aws-sdk.experimental-span-attributes", false); + } + + @Override + protected boolean useMessagingPropagator() { + return ConfigPropertiesUtil.getBoolean( + "otel.instrumentation.aws-sdk.experimental-use-propagator-for-messaging", false); + } + + @Override + protected boolean recordIndividualHttpError() { + return ConfigPropertiesUtil.getBoolean( + "otel.instrumentation.aws-sdk.experimental-record-individual-http-error", false); + } + + @Override + protected boolean genaiCaptureMessageContent() { + return ConfigPropertiesUtil.getBoolean( + "otel.instrumentation.genai.capture-message-content", false); } } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkTelemetryBuilder.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkTelemetryBuilder.java index 176d0a894a39..2ce48b5c2fce 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkTelemetryBuilder.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkTelemetryBuilder.java @@ -23,7 +23,7 @@ public final class AwsSdkTelemetryBuilder { private boolean useMessagingPropagator; private boolean recordIndividualHttpError; private boolean useXrayPropagator = true; - private boolean messagingReceiveInstrumentationEnabled; + private boolean messagingReceiveTelemetryEnabled; private boolean genaiCaptureMessageContent; AwsSdkTelemetryBuilder(OpenTelemetry openTelemetry) { @@ -108,11 +108,26 @@ AwsSdkTelemetryBuilder setUseXrayPropagator(boolean useMessagingPropagator) { * *

Note that this will cause the consumer side to start a new trace, with only a span link * connecting it to the producer trace. + * + * @deprecated Use {@link #setMessagingReceiveTelemetryEnabled(boolean)} instead. */ + @Deprecated @CanIgnoreReturnValue public AwsSdkTelemetryBuilder setMessagingReceiveInstrumentationEnabled( boolean messagingReceiveInstrumentationEnabled) { - this.messagingReceiveInstrumentationEnabled = messagingReceiveInstrumentationEnabled; + return setMessagingReceiveTelemetryEnabled(messagingReceiveInstrumentationEnabled); + } + + /** + * Set whether to capture the consumer message receive telemetry in messaging instrumentation. + * + *

Note that this will cause the consumer side to start a new trace, with only a span link + * connecting it to the producer trace. + */ + @CanIgnoreReturnValue + public AwsSdkTelemetryBuilder setMessagingReceiveTelemetryEnabled( + boolean messagingReceiveTelemetryEnabled) { + this.messagingReceiveTelemetryEnabled = messagingReceiveTelemetryEnabled; return this; } @@ -139,7 +154,7 @@ public AwsSdkTelemetry build() { useMessagingPropagator, useXrayPropagator, recordIndividualHttpError, - messagingReceiveInstrumentationEnabled, + messagingReceiveTelemetryEnabled, genaiCaptureMessageContent); } } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AbstractAwsSdkTelemetryFactory.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AbstractAwsSdkTelemetryFactory.java index 574c8e214ef9..c40d58439563 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AbstractAwsSdkTelemetryFactory.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AbstractAwsSdkTelemetryFactory.java @@ -16,33 +16,21 @@ public abstract class AbstractAwsSdkTelemetryFactory { protected abstract List getCapturedHeaders(); - private boolean captureExperimentalSpanAttributes() { - return getBoolean("otel.instrumentation.aws-sdk.experimental-span-attributes", false); - } + protected abstract boolean captureExperimentalSpanAttributes(); - protected abstract boolean messagingReceiveInstrumentationEnabled(); + protected abstract boolean messagingReceiveTelemetryEnabled(); - private boolean useMessagingPropagator() { - return getBoolean( - "otel.instrumentation.aws-sdk.experimental-use-propagator-for-messaging", false); - } + protected abstract boolean useMessagingPropagator(); - private boolean recordIndividualHttpError() { - return getBoolean( - "otel.instrumentation.aws-sdk.experimental-record-individual-http-error", false); - } - - private boolean genaiCaptureMessageContent() { - return getBoolean("otel.instrumentation.genai.capture-message-content", false); - } + protected abstract boolean recordIndividualHttpError(); - protected abstract boolean getBoolean(String name, boolean defaultValue); + protected abstract boolean genaiCaptureMessageContent(); public AwsSdkTelemetry telemetry() { return AwsSdkTelemetry.builder(GlobalOpenTelemetry.get()) .setCapturedHeaders(getCapturedHeaders()) .setCaptureExperimentalSpanAttributes(captureExperimentalSpanAttributes()) - .setMessagingReceiveInstrumentationEnabled(messagingReceiveInstrumentationEnabled()) + .setMessagingReceiveTelemetryEnabled(messagingReceiveTelemetryEnabled()) .setUseConfiguredPropagatorForMessaging(useMessagingPropagator()) .setRecordIndividualHttpError(recordIndividualHttpError()) .setGenaiCaptureMessageContent(genaiCaptureMessageContent()) diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v2_2/Aws2SqsTracingTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v2_2/Aws2SqsTracingTest.java index 540ef500de26..03f1c7ff8fb2 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v2_2/Aws2SqsTracingTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v2_2/Aws2SqsTracingTest.java @@ -32,7 +32,7 @@ void setup() { AwsSdkTelemetryBuilder telemetryBuilder = AwsSdkTelemetry.builder(getTesting().getOpenTelemetry()) .setCaptureExperimentalSpanAttributes(true) - .setMessagingReceiveInstrumentationEnabled(true) + .setMessagingReceiveTelemetryEnabled(true) .setCapturedHeaders(singletonList("Test-Message-Header")); configure(telemetryBuilder);