From 6f0fd8e63179f123a19388e8a07a4e1a97eb3724 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Tue, 10 Oct 2023 10:21:30 +0300 Subject: [PATCH] Suppress nested http client spans in aws2 instrumentation (#9634) --- .../aws-sdk-2.2/javaagent/build.gradle.kts | 5 ++- ...pClientSuppressionAttributesExtractor.java | 45 +++++++++++++++++++ .../v2_2/AwsSdkInstrumenterFactory.java | 12 ++++- 3 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkHttpClientSuppressionAttributesExtractor.java diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts index edbb8cc7d2..c9e9af1782 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts +++ b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts @@ -72,8 +72,9 @@ dependencies { testImplementation(project(":instrumentation:aws-sdk:aws-sdk-2.2:testing")) // Make sure these don't add HTTP headers - testImplementation(project(":instrumentation:apache-httpclient:apache-httpclient-4.0:javaagent")) - testImplementation(project(":instrumentation:netty:netty-4.1:javaagent")) + testInstrumentation(project(":instrumentation:apache-httpclient:apache-httpclient-4.0:javaagent")) + testInstrumentation(project(":instrumentation:apache-httpclient:apache-httpclient-5.0:javaagent")) + testInstrumentation(project(":instrumentation:netty:netty-4.1:javaagent")) testLibrary("software.amazon.awssdk:dynamodb:2.2.0") testLibrary("software.amazon.awssdk:ec2:2.2.0") diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkHttpClientSuppressionAttributesExtractor.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkHttpClientSuppressionAttributesExtractor.java new file mode 100644 index 0000000000..f285cc7a7d --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkHttpClientSuppressionAttributesExtractor.java @@ -0,0 +1,45 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.awssdk.v2_2; + +import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor; +import io.opentelemetry.instrumentation.api.internal.SpanKey; +import io.opentelemetry.instrumentation.api.internal.SpanKeyProvider; +import javax.annotation.Nullable; +import software.amazon.awssdk.core.interceptor.ExecutionAttributes; +import software.amazon.awssdk.http.SdkHttpResponse; + +/** + * An attribute extractor that reports implementing HTTP client semantic conventions. Adding this + * extractor suppresses nested HTTP client instrumentations similarly to how using {@link + * HttpClientAttributesExtractor} would. + */ +class AwsSdkHttpClientSuppressionAttributesExtractor + implements AttributesExtractor, SpanKeyProvider { + + @Override + public void onStart( + AttributesBuilder attributes, + Context parentContext, + ExecutionAttributes executionAttributes) {} + + @Override + public void onEnd( + AttributesBuilder attributes, + Context context, + ExecutionAttributes executionAttributes, + @Nullable SdkHttpResponse sdkHttpResponse, + @Nullable Throwable error) {} + + @Nullable + @Override + public SpanKey internalGetSpanKey() { + return SpanKey.HTTP_CLIENT; + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkInstrumenterFactory.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkInstrumenterFactory.java index aab3335170..3a96df2eac 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkInstrumenterFactory.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkInstrumenterFactory.java @@ -29,14 +29,22 @@ final class AwsSdkInstrumenterFactory { static final AttributesExtractor httpAttributesExtractor = HttpClientAttributesExtractor.create(httpAttributesGetter); + private static final AttributesExtractor + httpClientSuppressionAttributesExtractor = + new AwsSdkHttpClientSuppressionAttributesExtractor(); + private static final AwsSdkSpanKindExtractor spanKindExtractor = new AwsSdkSpanKindExtractor(); private static final List> - defaultAttributesExtractors = Arrays.asList(rpcAttributesExtractor); + defaultAttributesExtractors = + Arrays.asList(rpcAttributesExtractor, httpClientSuppressionAttributesExtractor); private static final List> extendedAttributesExtractors = - Arrays.asList(rpcAttributesExtractor, experimentalAttributesExtractor); + Arrays.asList( + rpcAttributesExtractor, + experimentalAttributesExtractor, + httpClientSuppressionAttributesExtractor); private static final List> defaultConsumerAttributesExtractors =