Inject context into AWS SDK 2.2 HTTP request from interceptor. (#1763)

This commit is contained in:
Anuraag Agrawal 2020-11-25 17:37:16 +09:00 committed by GitHub
parent c202c9c9e6
commit 737f78acfa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 41 additions and 3 deletions

View File

@ -0,0 +1,19 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.instrumentation.awssdk.v2_2;
import io.opentelemetry.context.propagation.TextMapPropagator;
import software.amazon.awssdk.http.SdkHttpRequest;
final class AwsSdkInjectAdapter implements TextMapPropagator.Setter<SdkHttpRequest.Builder> {
static final AwsSdkInjectAdapter INSTANCE = new AwsSdkInjectAdapter();
@Override
public void set(SdkHttpRequest.Builder builder, String name, String value) {
builder.appendHeader(name, value);
}
}

View File

@ -9,6 +9,7 @@ import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdk.getSpanFromAtt
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkHttpClientTracer.tracer; import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkHttpClientTracer.tracer;
import static io.opentelemetry.instrumentation.awssdk.v2_2.RequestType.ofSdkRequest; import static io.opentelemetry.instrumentation.awssdk.v2_2.RequestType.ofSdkRequest;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Span.Kind; import io.opentelemetry.api.trace.Span.Kind;
import java.util.EnumMap; import java.util.EnumMap;
@ -23,6 +24,7 @@ import software.amazon.awssdk.core.interceptor.ExecutionAttribute;
import software.amazon.awssdk.core.interceptor.ExecutionAttributes; import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
import software.amazon.awssdk.core.interceptor.ExecutionInterceptor; import software.amazon.awssdk.core.interceptor.ExecutionInterceptor;
import software.amazon.awssdk.core.interceptor.SdkExecutionAttribute; import software.amazon.awssdk.core.interceptor.SdkExecutionAttribute;
import software.amazon.awssdk.http.SdkHttpRequest;
/** AWS request execution interceptor. */ /** AWS request execution interceptor. */
final class TracingExecutionInterceptor implements ExecutionInterceptor { final class TracingExecutionInterceptor implements ExecutionInterceptor {
@ -86,6 +88,23 @@ final class TracingExecutionInterceptor implements ExecutionInterceptor {
} }
} }
@Override
public SdkHttpRequest modifyHttpRequest(
Context.ModifyHttpRequest context, ExecutionAttributes executionAttributes) {
io.opentelemetry.context.Context otelContext =
executionAttributes.getAttribute(CONTEXT_ATTRIBUTE);
// Never null in practice unless another interceptor cleared out the attribute, which
// is theoretically possible.
if (otelContext == null) {
return context.httpRequest();
}
SdkHttpRequest.Builder builder = context.httpRequest().toBuilder();
OpenTelemetry.getGlobalPropagators()
.getTextMapPropagator()
.inject(otelContext, builder, AwsSdkInjectAdapter.INSTANCE);
return builder.build();
}
@Override @Override
public void afterMarshalling( public void afterMarshalling(
Context.AfterMarshalling context, ExecutionAttributes executionAttributes) { Context.AfterMarshalling context, ExecutionAttributes executionAttributes) {

View File

@ -148,7 +148,7 @@ abstract class AbstractAws2ClientTest extends InstrumentationSpecification {
} }
} }
} }
server.lastRequest.headers.get("traceparent") == null server.lastRequest.headers.get("traceparent") != null
} }
static dynamoDbRequestDataTable(client) { static dynamoDbRequestDataTable(client) {
@ -226,7 +226,7 @@ abstract class AbstractAws2ClientTest extends InstrumentationSpecification {
} }
} }
} }
server.lastRequest.headers.get("traceparent") == null server.lastRequest.headers.get("traceparent") != null
where: where:
service | operation | method | path | requestId | builder | call | body service | operation | method | path | requestId | builder | call | body
@ -314,7 +314,7 @@ abstract class AbstractAws2ClientTest extends InstrumentationSpecification {
} }
} }
} }
server.lastRequest.headers.get("traceparent") == null server.lastRequest.headers.get("traceparent") != null
where: where:
service | operation | method | path | requestId | builder | call | body service | operation | method | path | requestId | builder | call | body