Skip to content

Commit 1803ccb

Browse files
committed
Updated README to include Java
1 parent 22250aa commit 1803ccb

File tree

4 files changed

+38
-51
lines changed

4 files changed

+38
-51
lines changed

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ cd nodejs;
3131
cd ..
3232
```
3333

34+
```
35+
cd java;
36+
./publish-layers.sh
37+
cd ..
38+
```
39+
3440
## Attaching Custom Lambda Layer ARNs
3541

3642
The layers published to your account may be used directly within SAM, Cloudformation Templates, Serverless.yml, or other configuration methods that allow specifying the use of layers by ARN.
@@ -56,6 +62,9 @@ These steps will help you configure the layers correctly:
5662
3. Update your functions handler to point to the newly attached layer in the console for your function:
5763
* Python: newrelic_lambda_wrapper.handler
5864
* Node: newrelic-lambda-wrapper.handler
65+
* Java:
66+
* RequestHandler implementation: com.newrelic.java.HandlerWrapper::handleRequest
67+
* RequestStreamHandlerWrapper implementation: RequestHandler implementation: com.newrelic.java.HandlerWrapper::handleStreamsRequest
5968
4. Add these environment variables to your Lambda console:
6069
* NEW_RELIC_ACCOUNT_ID: Your New Relic account ID
6170
* NEW_RELIC_LAMBDA_HANDLER: Path to your initial handler.

java/src/main/java/com/newrelic/java/RequestHandlerWrapper.java renamed to java/src/main/java/com/newrelic/java/HandlerWrapper.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,19 @@
22

33
import com.amazonaws.services.lambda.runtime.Context;
44
import com.amazonaws.services.lambda.runtime.RequestHandler;
5+
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
56
import com.newrelic.opentracing.LambdaTracer;
67
import com.newrelic.opentracing.aws.LambdaTracing;
8+
import com.newrelic.opentracing.aws.StreamLambdaTracing;
79
import io.opentracing.Tracer;
810
import io.opentracing.util.GlobalTracer;
911

10-
public class RequestHandlerWrapper implements RequestHandler<Object, Object> {
12+
import java.io.IOException;
13+
import java.io.InputStream;
14+
import java.io.OutputStream;
15+
16+
public class HandlerWrapper {
17+
1118
static JavaClassLoader javaClassLoader;
1219
static {
1320
// Obtain an instance of the OpenTracing Tracer of your choice
@@ -21,19 +28,26 @@ public class RequestHandlerWrapper implements RequestHandler<Object, Object> {
2128
String handlerMethod = parts.length == 2 ? parts[1] : "handleRequest";
2229

2330
try {
24-
javaClassLoader = JavaClassLoader.initializeClassLoader(handlerClass, handlerMethod);
31+
javaClassLoader = JavaClassLoader.initializeClass(handlerClass, handlerMethod);
2532
} catch (ReflectiveOperationException e) {
2633
throw new RuntimeException("Error occurred during initialization of javaClassLoader: " + e);
2734
}
2835
}
2936

30-
// Instrumentation for RequestHandler
31-
@Override
3237
public Object handleRequest(Object input, Context context) {
3338
return LambdaTracing.instrument(
3439
input,
3540
context,
3641
(event, ctx) -> javaClassLoader.invokeClassMethod(input, context)
3742
);
3843
}
44+
45+
public void handleStreamsRequest(InputStream input, OutputStream output, Context context) throws IOException {
46+
StreamLambdaTracing.instrument(
47+
input,
48+
output,
49+
context,
50+
javaClassLoader.getClassInstance()
51+
);
52+
}
3953
}

java/src/main/java/com/newrelic/java/JavaClassLoader.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.newrelic.java;
22

33
import com.amazonaws.services.lambda.runtime.Context;
4+
import com.amazonaws.services.lambda.runtime.RequestHandler;
45
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
56
import com.amazonaws.services.lambda.runtime.serialization.PojoSerializer;
67
import com.amazonaws.services.lambda.runtime.serialization.events.LambdaEventSerializers;
@@ -29,14 +30,21 @@ public class JavaClassLoader {
2930
private static MethodHandle methodHandle;
3031
private static RequestStreamHandler classInstance;
3132

33+
static JavaClassLoader initializeClass(String className, String methodName) throws ReflectiveOperationException {
34+
Class loadedClass = classLoader.loadClass(className);
35+
if (RequestStreamHandler.class.isAssignableFrom(loadedClass)) {
36+
return initializeRequestStreamHandler(className, loadedClass);
37+
}
38+
return initializeRequestHandler(className, methodName, loadedClass);
39+
}
40+
3241
// RequestStreamHandler implementation constructor
3342
private JavaClassLoader(RequestStreamHandler classInstance) {
3443
this.classInstance = classInstance;
3544
}
3645

3746
// RequestStreamHandler initializeClassLoader
38-
static JavaClassLoader initializeClassLoader(String className) throws ReflectiveOperationException {
39-
Class loadedClass = classLoader.loadClass(className);
47+
static JavaClassLoader initializeRequestStreamHandler(String className, Class loadedClass) throws ReflectiveOperationException {
4048
RequestStreamHandler classInstance = (RequestStreamHandler) loadedClass.getDeclaredConstructor().newInstance();
4149
return new JavaClassLoader(classInstance);
4250
}
@@ -52,8 +60,7 @@ private JavaClassLoader(Class inputType, MethodHandle methodHandle) {
5260
}
5361

5462
// RequestHandler initializeClassLoader
55-
static JavaClassLoader initializeClassLoader(String className, String methodName) throws ReflectiveOperationException {
56-
Class loadedClass = classLoader.loadClass(className);
63+
static JavaClassLoader initializeRequestHandler(String className, String methodName, Class loadedClass) throws ReflectiveOperationException {
5764
Class methodInputType = null;
5865
for (Method method : loadedClass.getMethods()) {
5966
if (isUserHandlerMethod(method, className, methodName) == true) {

java/src/main/java/com/newrelic/java/RequestStreamHandlerWrapper.java

Lines changed: 0 additions & 43 deletions
This file was deleted.

0 commit comments

Comments
 (0)