Skip to content

Commit 8001e72

Browse files
authored
feat: integration with CloudWatch ServiceLens #88 (#111)
1 parent e05c291 commit 8001e72

File tree

5 files changed

+50
-3
lines changed

5 files changed

+50
-3
lines changed

docs/content/core/logging.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ Key | Type | Example | Description
6969
**functionVersion**| String | "12"
7070
**functionMemorySize**| String | "128"
7171
**functionArn**| String | "arn:aws:lambda:eu-west-1:012345678910:function:example-powertools-HelloWorldFunction-1P1Z6B39FLU73"
72-
72+
**xray_trace_id**| String | "1-5759e988-bd862e3fe1be46a994272793" | X-Ray Trace ID when Lambda function has enabled Tracing
7373

7474
## Capturing context Lambda info
7575

powertools-logging/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,11 @@
8888
<artifactId>mockito-core</artifactId>
8989
<scope>test</scope>
9090
</dependency>
91+
<dependency>
92+
<groupId>org.mockito</groupId>
93+
<artifactId>mockito-inline</artifactId>
94+
<scope>test</scope>
95+
</dependency>
9196
<dependency>
9297
<groupId>org.aspectj</groupId>
9398
<artifactId>aspectjweaver</artifactId>

powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/internal/LambdaLoggingAspect.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.io.InputStreamReader;
2121
import java.io.OutputStreamWriter;
2222
import java.util.Map;
23+
import java.util.Optional;
2324
import java.util.Random;
2425

2526
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -35,6 +36,8 @@
3536
import org.aspectj.lang.annotation.Pointcut;
3637
import software.amazon.lambda.powertools.logging.PowertoolsLogging;
3738

39+
import static java.util.Optional.empty;
40+
import static java.util.Optional.ofNullable;
3841
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.coldStartDone;
3942
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.extractContext;
4043
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.isColdStart;
@@ -44,6 +47,7 @@
4447
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.serviceName;
4548
import static software.amazon.lambda.powertools.logging.PowertoolsLogger.appendKey;
4649
import static software.amazon.lambda.powertools.logging.PowertoolsLogger.appendKeys;
50+
import static software.amazon.lambda.powertools.logging.internal.SystemWrapper.getenv;
4751

4852
@Aspect
4953
public final class LambdaLoggingAspect {
@@ -83,6 +87,7 @@ public Object around(ProceedingJoinPoint pjp,
8387
appendKey("service", serviceName());
8488
});
8589

90+
getXrayTraceId().ifPresent(xRayTraceId -> appendKey("xray_trace_id", xRayTraceId));
8691

8792
if (powertoolsLogging.logEvent()) {
8893
proceedArgs = logEvent(pjp);
@@ -179,4 +184,12 @@ private Object[] logFromInputStream(final ProceedingJoinPoint pjp) {
179184
private Logger logger(final ProceedingJoinPoint pjp) {
180185
return LogManager.getLogger(pjp.getSignature().getDeclaringType());
181186
}
187+
188+
private static Optional<String> getXrayTraceId() {
189+
final String X_AMZN_TRACE_ID = getenv("_X_AMZN_TRACE_ID");
190+
if(X_AMZN_TRACE_ID != null) {
191+
return ofNullable(X_AMZN_TRACE_ID.split(";")[0].replace("Root=", ""));
192+
}
193+
return empty();
194+
}
182195
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package software.amazon.lambda.powertools.logging.internal;
2+
3+
class SystemWrapper {
4+
private SystemWrapper() {
5+
}
6+
7+
public static String getenv(String name) {
8+
return System.getenv(name);
9+
}
10+
}

powertools-logging/src/test/java/software/amazon/lambda/powertools/logging/internal/LambdaLoggingAspectTest.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import org.junit.jupiter.api.BeforeEach;
2929
import org.junit.jupiter.api.Test;
3030
import org.mockito.Mock;
31+
import org.mockito.MockedStatic;
32+
import org.mockito.Mockito;
3133
import software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor;
3234
import software.amazon.lambda.powertools.logging.handlers.PowerLogToolEnabled;
3335
import software.amazon.lambda.powertools.logging.handlers.PowerLogToolEnabledForStream;
@@ -38,8 +40,10 @@
3840

3941
import static org.apache.commons.lang3.reflect.FieldUtils.writeStaticField;
4042
import static org.assertj.core.api.Assertions.assertThat;
43+
import static org.mockito.Mockito.mockStatic;
4144
import static org.mockito.Mockito.when;
42-
import static org.mockito.MockitoAnnotations.initMocks;
45+
import static org.mockito.MockitoAnnotations.openMocks;
46+
import static software.amazon.lambda.powertools.logging.internal.SystemWrapper.getenv;
4347

4448
class LambdaLoggingAspectTest {
4549

@@ -52,7 +56,7 @@ class LambdaLoggingAspectTest {
5256

5357
@BeforeEach
5458
void setUp() throws IllegalAccessException {
55-
initMocks(this);
59+
openMocks(this);
5660
ThreadContext.clearAll();
5761
writeStaticField(LambdaHandlerProcessor.class, "IS_COLD_START", null, true);
5862
setupContext();
@@ -172,6 +176,21 @@ void shouldLogServiceNameWhenEnvVarSet() throws IllegalAccessException {
172176
.containsEntry("service", "testService");
173177
}
174178

179+
@Test
180+
void shouldLogxRayTraceIdEnvVarSet() {
181+
String xRayTraceId = "1-5759e988-bd862e3fe1be46a994272793";
182+
183+
try (MockedStatic<SystemWrapper> mocked = mockStatic(SystemWrapper.class)) {
184+
mocked.when(() -> getenv("_X_AMZN_TRACE_ID")).thenReturn("Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1\"");
185+
186+
requestHandler.handleRequest(new Object(), context);
187+
188+
assertThat(ThreadContext.getImmutableContext())
189+
.hasSize(EXPECTED_CONTEXT_SIZE + 1)
190+
.containsEntry("xray_trace_id", xRayTraceId);
191+
}
192+
}
193+
175194
private void setupContext() {
176195
when(context.getFunctionName()).thenReturn("testFunction");
177196
when(context.getInvokedFunctionArn()).thenReturn("testArn");

0 commit comments

Comments
 (0)