Skip to content

Commit 989220b

Browse files
feat: add TenantId to default logger properties (#1113)
Co-authored-by: Henrique Graca <999396+hjgraca@users.noreply.github.com>
1 parent e99abe4 commit 989220b

7 files changed

Lines changed: 95 additions & 4 deletions

File tree

libraries/src/AWS.Lambda.Powertools.Logging/Internal/LoggingConstants.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,9 @@ internal static class LoggingConstants
111111
/// Constant for key exception
112112
/// </summary>
113113
internal const string KeyException = "Exception";
114+
115+
/// <summary>
116+
/// Constant for key tenant id
117+
/// </summary>
118+
public const string KeyFunctionTenantId = "TenantId";
114119
}

libraries/src/AWS.Lambda.Powertools.Logging/Internal/LoggingLambdaContext.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ internal class LoggingLambdaContext
5353
/// </summary>
5454
internal int MemoryLimitInMB { get; private set; }
5555

56+
/// <summary>
57+
/// The tenant ID associated with the Lambda invocation.
58+
/// </summary>
59+
internal string TenantId { get; private set; }
60+
5661
/// <summary>
5762
/// The instance
5863
/// </summary>
@@ -86,7 +91,8 @@ public static bool Extract(AspectEventArgs args)
8691
InvokedFunctionArn = x.InvokedFunctionArn,
8792
LogGroupName = x.LogGroupName,
8893
LogStreamName = x.LogStreamName,
89-
MemoryLimitInMB = x.MemoryLimitInMB
94+
MemoryLimitInMB = x.MemoryLimitInMB,
95+
TenantId = x.TenantId,
9096
};
9197
return true;
9298
}

libraries/src/AWS.Lambda.Powertools.Logging/Internal/PowertoolsLogger.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,9 @@ private void AddLambdaContextKeys(Dictionary<string, object> logEntry)
457457
logEntry.TryAdd(LoggingConstants.KeyFunctionArn, context.InvokedFunctionArn);
458458
logEntry.TryAdd(LoggingConstants.KeyFunctionRequestId, context.AwsRequestId);
459459
logEntry.TryAdd(LoggingConstants.KeyFunctionVersion, context.FunctionVersion);
460+
461+
if(!string.IsNullOrEmpty(context.TenantId))
462+
logEntry.TryAdd(LoggingConstants.KeyFunctionTenantId, context.TenantId);
460463
}
461464

462465
/// <summary>
@@ -474,6 +477,7 @@ private LogEntryLambdaContext CreateLambdaContext()
474477
MemoryLimitInMB = context.MemoryLimitInMB,
475478
InvokedFunctionArn = context.InvokedFunctionArn,
476479
AwsRequestId = context.AwsRequestId,
480+
TenantId = context.TenantId
477481
};
478482
}
479483

libraries/src/AWS.Lambda.Powertools.Logging/LogEntryLambdaContext.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,9 @@ public class LogEntryLambdaContext
5353
/// CloudWatch actions.
5454
/// </summary>
5555
public string InvokedFunctionArn { get; internal set; }
56+
57+
/// <summary>
58+
/// Tenancy ID associated with the Lambda invocation.
59+
/// </summary>
60+
public string TenantId { get; set; }
5661
}

libraries/tests/AWS.Lambda.Powertools.Logging.Tests/Attributes/LoggingAttributeTest.cs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,72 @@ public void OnEntry_WhenEventArgExist_LogEvent()
119119
);
120120
}
121121

122+
[Fact]
123+
public void OnEntry_When_TenantId_Exist_Log()
124+
{
125+
// Arrange
126+
var consoleOut = GetConsoleOutput();
127+
var correlationId = Guid.NewGuid().ToString();
128+
Logger.Configure(options =>
129+
{
130+
options.LogOutput = consoleOut;
131+
});
132+
133+
var context = new TestLambdaContext()
134+
{
135+
TenantId = "Tenant-12345",
136+
};
137+
138+
var testObj = new TestObject
139+
{
140+
Headers = new Header
141+
{
142+
MyRequestIdHeader = correlationId
143+
}
144+
};
145+
146+
// Act
147+
_testHandlers.LogEvent(testObj, context);
148+
149+
consoleOut.Received(1).WriteLine(
150+
Arg.Is<string>(i => i.Contains("TenantId\":\"Tenant-12345"))
151+
);
152+
}
153+
154+
[Theory]
155+
[InlineData("")]
156+
[InlineData(null)]
157+
public void OnEntry_When_TenantId_Does_Not_Exist_Dont_Log(string tenantId)
158+
{
159+
// Arrange
160+
var consoleOut = GetConsoleOutput();
161+
var correlationId = Guid.NewGuid().ToString();
162+
Logger.Configure(options =>
163+
{
164+
options.LogOutput = consoleOut;
165+
});
166+
167+
var context = new TestLambdaContext()
168+
{
169+
TenantId = tenantId,
170+
};
171+
172+
var testObj = new TestObject
173+
{
174+
Headers = new Header
175+
{
176+
MyRequestIdHeader = correlationId
177+
}
178+
};
179+
180+
// Act
181+
_testHandlers.LogEvent(testObj, context);
182+
183+
consoleOut.DidNotReceive().WriteLine(
184+
Arg.Is<string>(i => i.Contains("\"TenantId\""))
185+
);
186+
}
187+
122188
[Fact]
123189
public void OnEntry_WhenEventArgExist_LogEvent_False_Should_Not_Log()
124190
{

libraries/tests/AWS.Lambda.Powertools.Logging.Tests/Context/LambdaContextTest.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ public void Extract_WhenHasLambdaContextArgument_InitializesLambdaContextInfo()
2323
InvokedFunctionArn = Guid.NewGuid().ToString(),
2424
LogGroupName = Guid.NewGuid().ToString(),
2525
LogStreamName = Guid.NewGuid().ToString(),
26-
MemoryLimitInMB = new Random().Next()
26+
MemoryLimitInMB = new Random().Next(),
27+
TenantId = Guid.NewGuid().ToString()
2728
};
2829

2930
var args = Substitute.For<AspectEventArgs>();
@@ -52,6 +53,7 @@ public void Extract_WhenHasLambdaContextArgument_InitializesLambdaContextInfo()
5253
Assert.Equal(LoggingLambdaContext.Instance.LogGroupName, lambdaContext.LogGroupName);
5354
Assert.Equal(LoggingLambdaContext.Instance.LogStreamName, lambdaContext.LogStreamName);
5455
Assert.Equal(LoggingLambdaContext.Instance.MemoryLimitInMB, lambdaContext.MemoryLimitInMB);
56+
Assert.Equal(LoggingLambdaContext.Instance.TenantId, lambdaContext.TenantId);
5557
LoggingLambdaContext.Clear();
5658
Assert.Null(LoggingLambdaContext.Instance);
5759
}
@@ -120,7 +122,8 @@ public void Extract_WhenInstance_Already_Created_Returns_False()
120122
InvokedFunctionArn = Guid.NewGuid().ToString(),
121123
LogGroupName = Guid.NewGuid().ToString(),
122124
LogStreamName = Guid.NewGuid().ToString(),
123-
MemoryLimitInMB = new Random().Next()
125+
MemoryLimitInMB = new Random().Next(),
126+
TenantId = Guid.NewGuid().ToString()
124127
};
125128

126129
var args = Substitute.For<AspectEventArgs>();

libraries/tests/AWS.Lambda.Powertools.Logging.Tests/Handlers/HandlerTests.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ public void TestMethod()
107107
FunctionName = "test-function",
108108
FunctionVersion = "1",
109109
AwsRequestId = "123",
110-
InvokedFunctionArn = "arn:aws:lambda:us-east-1:123456789012:function:test-function"
110+
InvokedFunctionArn = "arn:aws:lambda:us-east-1:123456789012:function:test-function",
111+
TenantId = "tenant-123"
111112
});
112113

113114
handler.TestMethodCorrelation(new ExampleClass
@@ -131,6 +132,7 @@ public void TestMethod()
131132
Assert.Contains("\"Custom-key\": \"custom-value\"", logOutput);
132133
Assert.Contains("\"FunctionName\": \"test-function\"", logOutput);
133134
Assert.Contains("\"SamplingRate\": 0.002", logOutput);
135+
Assert.Contains("\"TenantId\": \"tenant-123\"", logOutput);
134136
}
135137

136138
[Fact]

0 commit comments

Comments
 (0)