From e02c361ba740249313a9268e123f2efeadddeab6 Mon Sep 17 00:00:00 2001 From: Volodymyr Masliy Date: Thu, 10 Dec 2020 19:53:59 +0200 Subject: [PATCH] feat: custom segment names * add segmentName attribute to Trace annotation * if segmentName is provided, use it as subsegment name intead of traced method's name --- docs/content/core/tracing.mdx | 2 ++ .../lambda/powertools/tracing/Tracing.java | 1 + .../tracing/internal/LambdaTracingAspect.java | 10 +++++++- .../internal/LambdaTracingAspectTest.java | 23 ++++++++++++++++++- .../nonhandler/PowerToolNonHandler.java | 14 +++++++++++ 5 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 powertools-tracing/src/test/java/software/amazon/lambda/powertools/tracing/nonhandler/PowerToolNonHandler.java diff --git a/docs/content/core/tracing.mdx b/docs/content/core/tracing.mdx index 0e17bbc16..863092dd3 100644 --- a/docs/content/core/tracing.mdx +++ b/docs/content/core/tracing.mdx @@ -62,6 +62,8 @@ public class App implements RequestHandler Returning sensitive information from your Lambda handler or functions, where Tracer is used? diff --git a/powertools-tracing/src/main/java/software/amazon/lambda/powertools/tracing/Tracing.java b/powertools-tracing/src/main/java/software/amazon/lambda/powertools/tracing/Tracing.java index d5817e638..7b7928135 100644 --- a/powertools-tracing/src/main/java/software/amazon/lambda/powertools/tracing/Tracing.java +++ b/powertools-tracing/src/main/java/software/amazon/lambda/powertools/tracing/Tracing.java @@ -50,4 +50,5 @@ String namespace() default ""; boolean captureResponse() default true; boolean captureError() default true; + String segmentName() default ""; } diff --git a/powertools-tracing/src/main/java/software/amazon/lambda/powertools/tracing/internal/LambdaTracingAspect.java b/powertools-tracing/src/main/java/software/amazon/lambda/powertools/tracing/internal/LambdaTracingAspect.java index ebc2829d7..972983b18 100644 --- a/powertools-tracing/src/main/java/software/amazon/lambda/powertools/tracing/internal/LambdaTracingAspect.java +++ b/powertools-tracing/src/main/java/software/amazon/lambda/powertools/tracing/internal/LambdaTracingAspect.java @@ -15,6 +15,7 @@ import com.amazonaws.xray.AWSXRay; import com.amazonaws.xray.entities.Subsegment; +import java.util.function.Supplier; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; @@ -42,7 +43,9 @@ public Object around(ProceedingJoinPoint pjp, Tracing tracing) throws Throwable { Object[] proceedArgs = pjp.getArgs(); - Subsegment segment = AWSXRay.beginSubsegment("## " + pjp.getSignature().getName()); + Subsegment segment = AWSXRay.beginSubsegment( + customSegmentNameOrDefault(tracing, + () -> "## " + pjp.getSignature().getName())); segment.setNamespace(namespace(tracing)); if (placedOnHandlerMethod(pjp)) { @@ -69,6 +72,11 @@ public Object around(ProceedingJoinPoint pjp, } } + private String customSegmentNameOrDefault(Tracing powerToolsTracing, Supplier defaultSegmentName) { + String segmentName = powerToolsTracing.segmentName(); + return segmentName.isEmpty() ? defaultSegmentName.get() : segmentName; + } + private String namespace(Tracing powerToolsTracing) { return powerToolsTracing.namespace().isEmpty() ? serviceName() : powerToolsTracing.namespace(); } diff --git a/powertools-tracing/src/test/java/software/amazon/lambda/powertools/tracing/internal/LambdaTracingAspectTest.java b/powertools-tracing/src/test/java/software/amazon/lambda/powertools/tracing/internal/LambdaTracingAspectTest.java index 58a9af4f2..175b6f4ce 100644 --- a/powertools-tracing/src/test/java/software/amazon/lambda/powertools/tracing/internal/LambdaTracingAspectTest.java +++ b/powertools-tracing/src/test/java/software/amazon/lambda/powertools/tracing/internal/LambdaTracingAspectTest.java @@ -26,6 +26,7 @@ import org.junit.jupiter.api.Test; import org.mockito.Mock; import software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor; +import software.amazon.lambda.powertools.tracing.nonhandler.PowerToolNonHandler; import software.amazon.lambda.powertools.tracing.handlers.PowerToolDisabled; import software.amazon.lambda.powertools.tracing.handlers.PowerToolDisabledForStream; import software.amazon.lambda.powertools.tracing.handlers.PowerTracerToolEnabled; @@ -43,6 +44,7 @@ class LambdaTracingAspectTest { private RequestHandler requestHandler; private RequestStreamHandler streamHandler; + private PowerToolNonHandler nonHandlerMethod; @Mock private Context context; @@ -54,6 +56,7 @@ void setUp() throws IllegalAccessException { setupContext(); requestHandler = new PowerTracerToolEnabled(); streamHandler = new PowerTracerToolEnabledForStream(); + nonHandlerMethod = new PowerToolNonHandler(); AWSXRay.beginSegment(LambdaTracingAspectTest.class.getName()); } @@ -63,6 +66,24 @@ void tearDown() { } @Test + void shouldCaptureNonHandlerMethod() { + nonHandlerMethod.doSomething(); + assertThat(AWSXRay.getTraceEntity().getSubsegments()) + .hasSize(1) + .anySatisfy(segment -> + assertThat(segment.getName()).isEqualTo("## doSomething")); + } + + @Test + void shouldCaptureNonHandlerMethodWithCustomSegmentName() { + nonHandlerMethod.doSomethingCustomName(); + assertThat(AWSXRay.getTraceEntity().getSubsegments()) + .hasSize(1) + .anySatisfy(segment -> + assertThat(segment.getName()).isEqualTo("custom")); + } + + @Test void shouldCaptureTraces() { requestHandler.handleRequest(new Object(), context); @@ -177,4 +198,4 @@ private void setupContext() { when(context.getFunctionVersion()).thenReturn("1"); when(context.getMemoryLimitInMB()).thenReturn(10); } -} \ No newline at end of file +} diff --git a/powertools-tracing/src/test/java/software/amazon/lambda/powertools/tracing/nonhandler/PowerToolNonHandler.java b/powertools-tracing/src/test/java/software/amazon/lambda/powertools/tracing/nonhandler/PowerToolNonHandler.java new file mode 100644 index 000000000..309eb5598 --- /dev/null +++ b/powertools-tracing/src/test/java/software/amazon/lambda/powertools/tracing/nonhandler/PowerToolNonHandler.java @@ -0,0 +1,14 @@ +package software.amazon.lambda.powertools.tracing.nonhandler; + +import software.amazon.lambda.powertools.tracing.Tracing; + +public class PowerToolNonHandler { + + @Tracing + public void doSomething() { + } + + @Tracing(segmentName = "custom") + public void doSomethingCustomName() { + } +}