Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions java/src/main/java/com/newrelic/java/HandlerSetup.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.newrelic.java;

import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import com.newrelic.opentracing.LambdaTracer;
import io.opentracing.Tracer;
import io.opentracing.util.GlobalTracer;

public class HandlerSetup {

public static final String HANDLER_ENV_VAR = "NEW_RELIC_LAMBDA_HANDLER";

public static RequestHandler<Object, Object> requestHandler;
public static RequestStreamHandler requestStreamHandler;

static {
// Obtain an instance of the OpenTracing Tracer of your choice
Tracer tracer = LambdaTracer.INSTANCE;
// Register your tracer as the Global Tracer
GlobalTracer.registerIfAbsent(tracer);

// Set up handlers
setupHandlers();
}

static void setupHandlers() {
String handler = System.getenv(HANDLER_ENV_VAR);
String[] parts = handler.split("::");
String handlerClass = parts[0];
String handlerMethod = parts.length == 2 ? parts[1] : "handleRequest";

try {
Class<?> loadedClass = JavaClassLoader.class.getClassLoader().loadClass(handlerClass);

boolean isRequestStreamHandler = RequestStreamHandler.class.isAssignableFrom(loadedClass);
requestHandler = isRequestStreamHandler
? (input, context) -> {
throw new IllegalStateException("" + handlerClass + " is RequestStreamHandler, use handleStreamsRequest instead");
}
: JavaClassLoader.initializeRequestHandler(loadedClass, handlerMethod);
requestStreamHandler = isRequestStreamHandler
? (RequestStreamHandler) loadedClass.getDeclaredConstructor().newInstance()
: (input, output, context) -> {
throw new IllegalStateException("" + handlerClass + " is not RequestStreamHandler, use handleRequest instead");
};

} catch (ReflectiveOperationException e) {
throw new RuntimeException("Error occurred during initialization of javaClassLoader:", e);
}
}

}
18 changes: 18 additions & 0 deletions java/src/main/java/com/newrelic/java/RequestHandlerWrapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.newrelic.java;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.newrelic.opentracing.aws.LambdaTracing;


public class RequestHandlerWrapper implements RequestHandler<Object, Object> {

@Override
public Object handleRequest(Object input, Context context) {
return LambdaTracing.instrument(
input,
context,
HandlerSetup.requestHandler::handleRequest
);
}
}
22 changes: 22 additions & 0 deletions java/src/main/java/com/newrelic/java/StreamHandlerWrapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.newrelic.java;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import com.newrelic.opentracing.aws.StreamLambdaTracing;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class StreamHandlerWrapper implements RequestStreamHandler {

@Override
public void handleRequest(InputStream input, OutputStream output, Context context) throws IOException {
StreamLambdaTracing.instrument(
input,
output,
context,
HandlerSetup.requestStreamHandler
);
}
}