Use instance field for wrapped lambda instead of static. (#2579)

This commit is contained in:
Anuraag Agrawal 2021-03-16 18:24:23 +09:00 committed by GitHub
parent 150b52ca19
commit f3bc02f2e7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 25 additions and 29 deletions

View File

@ -21,7 +21,7 @@ public class TracingRequestApiGatewayWrapper
} }
// Visible for testing // Visible for testing
TracingRequestApiGatewayWrapper(OpenTelemetrySdk openTelemetrySdk) { TracingRequestApiGatewayWrapper(OpenTelemetrySdk openTelemetrySdk, WrappedLambda wrappedLambda) {
super(openTelemetrySdk); super(openTelemetrySdk, wrappedLambda);
} }
} }

View File

@ -21,29 +21,28 @@ import java.io.OutputStream;
*/ */
public class TracingRequestStreamWrapper extends TracingRequestStreamHandler { public class TracingRequestStreamWrapper extends TracingRequestStreamHandler {
// visible for testing private final WrappedLambda wrappedLambda;
static WrappedLambda WRAPPED_LAMBDA = WrappedLambda.fromConfiguration();
public TracingRequestStreamWrapper() { public TracingRequestStreamWrapper() {
this(OpenTelemetrySdkAutoConfiguration.initialize()); this(OpenTelemetrySdkAutoConfiguration.initialize(), WrappedLambda.fromConfiguration());
} }
// Visible for testing // Visible for testing
TracingRequestStreamWrapper(OpenTelemetrySdk openTelemetrySdk) { TracingRequestStreamWrapper(OpenTelemetrySdk openTelemetrySdk, WrappedLambda wrappedLambda) {
super(openTelemetrySdk, WrapperConfiguration.flushTimeout()); super(openTelemetrySdk, WrapperConfiguration.flushTimeout());
this.wrappedLambda = wrappedLambda;
} }
@Override @Override
protected void doHandleRequest(InputStream inputStream, OutputStream output, Context context) protected void doHandleRequest(InputStream inputStream, OutputStream output, Context context)
throws IOException { throws IOException {
if (!(WRAPPED_LAMBDA.getTargetObject() instanceof RequestStreamHandler)) { if (!(wrappedLambda.getTargetObject() instanceof RequestStreamHandler)) {
throw new RuntimeException( throw new RuntimeException(
WRAPPED_LAMBDA.getTargetClass().getName() wrappedLambda.getTargetClass().getName() + " is not an instance of RequestStreamHandler");
+ " is not an instance of RequestStreamHandler");
} }
((RequestStreamHandler) WRAPPED_LAMBDA.getTargetObject()) ((RequestStreamHandler) wrappedLambda.getTargetObject())
.handleRequest(inputStream, output, context); .handleRequest(inputStream, output, context);
} }
} }

View File

@ -17,7 +17,7 @@ public class TracingRequestWrapper extends TracingRequestWrapperBase<Object, Obj
} }
// Visible for testing // Visible for testing
TracingRequestWrapper(OpenTelemetrySdk openTelemetrySdk) { TracingRequestWrapper(OpenTelemetrySdk openTelemetrySdk, WrappedLambda wrappedLambda) {
super(openTelemetrySdk); super(openTelemetrySdk, wrappedLambda);
} }
} }

View File

@ -17,18 +17,18 @@ import java.lang.reflect.Method;
*/ */
abstract class TracingRequestWrapperBase<I, O> extends TracingRequestHandler<I, O> { abstract class TracingRequestWrapperBase<I, O> extends TracingRequestHandler<I, O> {
private final WrappedLambda wrappedLambda;
protected TracingRequestWrapperBase() { protected TracingRequestWrapperBase() {
this(OpenTelemetrySdkAutoConfiguration.initialize()); this(OpenTelemetrySdkAutoConfiguration.initialize(), WrappedLambda.fromConfiguration());
} }
// Visible for testing // Visible for testing
TracingRequestWrapperBase(OpenTelemetrySdk openTelemetrySdk) { TracingRequestWrapperBase(OpenTelemetrySdk openTelemetrySdk, WrappedLambda wrappedLambda) {
super(openTelemetrySdk, WrapperConfiguration.flushTimeout()); super(openTelemetrySdk, WrapperConfiguration.flushTimeout());
this.wrappedLambda = wrappedLambda;
} }
// visible for testing
static WrappedLambda WRAPPED_LAMBDA = WrappedLambda.fromConfiguration();
private Object[] createParametersArray(Method targetMethod, I input, Context context) { private Object[] createParametersArray(Method targetMethod, I input, Context context) {
Class<?>[] parameterTypes = targetMethod.getParameterTypes(); Class<?>[] parameterTypes = targetMethod.getParameterTypes();
Object[] parameters = new Object[parameterTypes.length]; Object[] parameters = new Object[parameterTypes.length];
@ -51,12 +51,12 @@ abstract class TracingRequestWrapperBase<I, O> extends TracingRequestHandler<I,
@Override @Override
protected O doHandleRequest(I input, Context context) { protected O doHandleRequest(I input, Context context) {
Method targetMethod = WRAPPED_LAMBDA.getRequestTargetMethod(); Method targetMethod = wrappedLambda.getRequestTargetMethod();
Object[] parameters = createParametersArray(targetMethod, input, context); Object[] parameters = createParametersArray(targetMethod, input, context);
O result; O result;
try { try {
result = (O) targetMethod.invoke(WRAPPED_LAMBDA.getTargetObject(), parameters); result = (O) targetMethod.invoke(wrappedLambda.getTargetObject(), parameters);
} catch (IllegalAccessException e) { } catch (IllegalAccessException e) {
throw new RuntimeException("Method is inaccessible", e); throw new RuntimeException("Method is inaccessible", e);
} catch (InvocationTargetException e) { } catch (InvocationTargetException e) {

View File

@ -38,7 +38,7 @@ class TracingRequestApiGatewayWrapperTest extends TracingRequestWrapperTestBase
def "handler traced with trace propagation"() { def "handler traced with trace propagation"() {
given: given:
setLambda(TestApiGatewayHandler.getName() + "::handleRequest", { new TracingRequestApiGatewayWrapper(it) }) setLambda(TestApiGatewayHandler.getName() + "::handleRequest", TracingRequestApiGatewayWrapper.metaClass.&invokeConstructor)
def headers = ImmutableMap.builder() def headers = ImmutableMap.builder()
.putAll(propagationHeaders()) .putAll(propagationHeaders())
@ -83,7 +83,7 @@ class TracingRequestApiGatewayWrapperTest extends TracingRequestWrapperTestBase
def "test empty request & response"() { def "test empty request & response"() {
given: given:
setLambda(TestApiGatewayHandler.getName() + "::handleRequest", { new TracingRequestApiGatewayWrapper(it) }) setLambda(TestApiGatewayHandler.getName() + "::handleRequest", TracingRequestApiGatewayWrapper.metaClass.&invokeConstructor)
def input = new APIGatewayProxyRequestEvent() def input = new APIGatewayProxyRequestEvent()
.withBody("empty") .withBody("empty")

View File

@ -49,8 +49,7 @@ class TracingRequestStreamWrapperPropagationTest extends LibraryInstrumentationS
def setup() { def setup() {
environmentVariables.set(WrappedLambda.OTEL_LAMBDA_HANDLER_ENV_KEY, "io.opentelemetry.instrumentation.awslambda.v1_0.TracingRequestStreamWrapperPropagationTest\$TestRequestHandler::handleRequest") environmentVariables.set(WrappedLambda.OTEL_LAMBDA_HANDLER_ENV_KEY, "io.opentelemetry.instrumentation.awslambda.v1_0.TracingRequestStreamWrapperPropagationTest\$TestRequestHandler::handleRequest")
TracingRequestStreamWrapper.WRAPPED_LAMBDA = WrappedLambda.fromConfiguration() wrapper = new TracingRequestStreamWrapper(testRunner().openTelemetrySdk, WrappedLambda.fromConfiguration())
wrapper = new TracingRequestStreamWrapper(testRunner().openTelemetrySdk)
} }
def cleanup() { def cleanup() {

View File

@ -45,8 +45,7 @@ class TracingRequestStreamWrapperTest extends LibraryInstrumentationSpecificatio
def setup() { def setup() {
environmentVariables.set(WrappedLambda.OTEL_LAMBDA_HANDLER_ENV_KEY, "io.opentelemetry.instrumentation.awslambda.v1_0.TracingRequestStreamWrapperTest\$TestRequestHandler::handleRequest") environmentVariables.set(WrappedLambda.OTEL_LAMBDA_HANDLER_ENV_KEY, "io.opentelemetry.instrumentation.awslambda.v1_0.TracingRequestStreamWrapperTest\$TestRequestHandler::handleRequest")
TracingRequestStreamWrapper.WRAPPED_LAMBDA = WrappedLambda.fromConfiguration() wrapper = new TracingRequestStreamWrapper(testRunner().openTelemetrySdk, WrappedLambda.fromConfiguration())
wrapper = new TracingRequestStreamWrapper(testRunner().openTelemetrySdk)
} }
def cleanup() { def cleanup() {

View File

@ -27,7 +27,7 @@ class TracingRequestWrapperTest extends TracingRequestWrapperTestBase {
def "handler string traced"() { def "handler string traced"() {
given: given:
setLambda(TestRequestHandlerString.getName() + "::handleRequest", { new TracingRequestWrapper(it) }) setLambda(TestRequestHandlerString.getName() + "::handleRequest", TracingRequestWrapper.metaClass.&invokeConstructor)
when: when:
def result = wrapper.handleRequest("hello", context) def result = wrapper.handleRequest("hello", context)
@ -51,7 +51,7 @@ class TracingRequestWrapperTest extends TracingRequestWrapperTestBase {
def "handler with exception"() { def "handler with exception"() {
given: given:
setLambda(TestRequestHandlerString.getName() + "::handleRequest", { new TracingRequestWrapper(it) }) setLambda(TestRequestHandlerString.getName() + "::handleRequest", TracingRequestWrapper.metaClass.&invokeConstructor)
when: when:
def thrown def thrown

View File

@ -31,7 +31,6 @@ class TracingRequestWrapperTestBase extends LibraryInstrumentationSpecification
def setLambda(handler, Closure<TracingRequestWrapperBase> wrapperConstructor) { def setLambda(handler, Closure<TracingRequestWrapperBase> wrapperConstructor) {
environmentVariables.set(WrappedLambda.OTEL_LAMBDA_HANDLER_ENV_KEY, handler) environmentVariables.set(WrappedLambda.OTEL_LAMBDA_HANDLER_ENV_KEY, handler)
TracingRequestWrapper.WRAPPED_LAMBDA = WrappedLambda.fromConfiguration() wrapper = wrapperConstructor.call(testRunner().openTelemetrySdk, WrappedLambda.fromConfiguration())
wrapper = wrapperConstructor.call(testRunner().openTelemetrySdk)
} }
} }