From 88fdaa35f67b016120d34ff809333ce31ca4319c Mon Sep 17 00:00:00 2001 From: Henrique Graca <999396+hjgraca@users.noreply.github.com> Date: Mon, 21 Jul 2025 10:54:26 +0100 Subject: [PATCH 1/9] feat: update environment variable references to use AWS_SDK_UA_APP_ID --- .../Core/Constants.cs | 9 ++++ .../Core/IPowertoolsConfigurations.cs | 2 +- .../Core/IPowertoolsEnvironment.cs | 2 +- .../Core/PowertoolsEnvironment.cs | 2 +- .../Internal/BatchProcessingInternalTests.cs | 6 +-- .../Core/PowertoolsEnvironmentTest.cs | 42 +++++++++---------- .../Internal/IdempotentAspectTests.cs | 2 +- .../PowertoolsLoggerTest.cs | 8 ++-- .../MetricsTests.cs | 2 +- .../XRayRecorderTests.cs | 2 +- 10 files changed, 43 insertions(+), 34 deletions(-) diff --git a/libraries/src/AWS.Lambda.Powertools.Common/Core/Constants.cs b/libraries/src/AWS.Lambda.Powertools.Common/Core/Constants.cs index 456a5092..c48e9b11 100644 --- a/libraries/src/AWS.Lambda.Powertools.Common/Core/Constants.cs +++ b/libraries/src/AWS.Lambda.Powertools.Common/Core/Constants.cs @@ -13,6 +13,7 @@ * permissions and limitations under the License. */ +// ReSharper disable InconsistentNaming namespace AWS.Lambda.Powertools.Common; /// @@ -143,4 +144,12 @@ internal static class Constants /// Constant for POWERTOOLS_METRICS_DISABLED environment variable /// internal const string PowertoolsMetricsDisabledEnv = "POWERTOOLS_METRICS_DISABLED"; + + /// + /// A unique and opaque application ID that is appended to the + /// User-Agent header as app/sdk_ua_app_id. It should have a + /// maximum length of 50. This variable is sourced from environment + /// variable AWS_SDK_UA_APP_ID + /// + internal const string AWSSdkUAAppId = "AWS_SDK_UA_APP_ID"; } \ No newline at end of file diff --git a/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsConfigurations.cs b/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsConfigurations.cs index 755d33ef..ea25e980 100644 --- a/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsConfigurations.cs +++ b/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsConfigurations.cs @@ -128,7 +128,7 @@ public interface IPowertoolsConfigurations bool GetEnvironmentVariableOrDefault(string variable, bool defaultValue); /// - /// Sets the execution Environment Variable (AWS_EXECUTION_ENV) + /// Sets the execution Environment Variable (AWS_SDK_UA_APP_ID) /// /// void SetExecutionEnvironment(T type); diff --git a/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsEnvironment.cs b/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsEnvironment.cs index 6f57aabb..0c642813 100644 --- a/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsEnvironment.cs +++ b/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsEnvironment.cs @@ -36,7 +36,7 @@ public interface IPowertoolsEnvironment string GetAssemblyVersion(T type); /// - /// Sets the execution Environment Variable (AWS_EXECUTION_ENV) + /// Sets the execution Environment Variable (AWS_SDK_UA_APP_ID) /// /// void SetExecutionEnvironment(T type); diff --git a/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsEnvironment.cs b/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsEnvironment.cs index afc796b6..ea758258 100644 --- a/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsEnvironment.cs +++ b/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsEnvironment.cs @@ -71,7 +71,7 @@ public string GetAssemblyVersion(T type) /// public void SetExecutionEnvironment(T type) { - const string envName = Constants.AwsExecutionEnvironmentVariableName; + const string envName = Constants.AWSSdkUAAppId; var currentEnvValue = GetEnvironmentVariable(envName); var assemblyName = ParseAssemblyName(GetAssemblyName(type)); diff --git a/libraries/tests/AWS.Lambda.Powertools.BatchProcessing.Tests/Internal/BatchProcessingInternalTests.cs b/libraries/tests/AWS.Lambda.Powertools.BatchProcessing.Tests/Internal/BatchProcessingInternalTests.cs index ed12994a..8010af86 100644 --- a/libraries/tests/AWS.Lambda.Powertools.BatchProcessing.Tests/Internal/BatchProcessingInternalTests.cs +++ b/libraries/tests/AWS.Lambda.Powertools.BatchProcessing.Tests/Internal/BatchProcessingInternalTests.cs @@ -21,7 +21,7 @@ public void BatchProcessing_Set_Execution_Environment_Context_SQS() // Assert Assert.Contains($"{Constants.FeatureContextIdentifier}/BatchProcessing/", - env.GetEnvironmentVariable("AWS_EXECUTION_ENV")); + env.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); Assert.NotNull(sqsBatchProcessor); } @@ -38,7 +38,7 @@ public void BatchProcessing_Set_Execution_Environment_Context_Kinesis() // Assert Assert.Contains($"{Constants.FeatureContextIdentifier}/BatchProcessing/", - env.GetEnvironmentVariable("AWS_EXECUTION_ENV")); + env.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); Assert.NotNull(KinesisEventBatchProcessor); } @@ -55,7 +55,7 @@ public void BatchProcessing_Set_Execution_Environment_Context_DynamoDB() // Assert Assert.Contains($"{Constants.FeatureContextIdentifier}/BatchProcessing/", - env.GetEnvironmentVariable("AWS_EXECUTION_ENV")); + env.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); Assert.NotNull(dynamoDbStreamBatchProcessor); } diff --git a/libraries/tests/AWS.Lambda.Powertools.Common.Tests/Core/PowertoolsEnvironmentTest.cs b/libraries/tests/AWS.Lambda.Powertools.Common.Tests/Core/PowertoolsEnvironmentTest.cs index 9f9e153c..f571179f 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Common.Tests/Core/PowertoolsEnvironmentTest.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Common.Tests/Core/PowertoolsEnvironmentTest.cs @@ -20,7 +20,7 @@ public void Set_Execution_Environment() powertoolsEnv.SetExecutionEnvironment(this); // Assert - Assert.Equal($"{Constants.FeatureContextIdentifier}/Tests/1.0.0 PTENV/AWS_LAMBDA_DOTNET{Environment.Version.Major}", powertoolsEnv.GetEnvironmentVariable("AWS_EXECUTION_ENV")); + Assert.Equal($"{Constants.FeatureContextIdentifier}/Tests/1.0.0 PTENV/AWS_LAMBDA_DOTNET{Environment.Version.Major}", powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); } [Fact] @@ -29,13 +29,13 @@ public void Set_Execution_Environment_WhenEnvironmentHasValue() // Arrange var powertoolsEnv = new PowertoolsEnvironment(); - powertoolsEnv.SetEnvironmentVariable("AWS_EXECUTION_ENV", "ExistingValuesInUserAgent"); + powertoolsEnv.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", "ExistingValuesInUserAgent"); // Act powertoolsEnv.SetExecutionEnvironment(this); // Assert - Assert.Equal($"ExistingValuesInUserAgent {Constants.FeatureContextIdentifier}/Tests/1.0.0 PTENV/AWS_LAMBDA_DOTNET{Environment.Version.Major}", powertoolsEnv.GetEnvironmentVariable("AWS_EXECUTION_ENV")); + Assert.Equal($"ExistingValuesInUserAgent {Constants.FeatureContextIdentifier}/Tests/1.0.0 PTENV/AWS_LAMBDA_DOTNET{Environment.Version.Major}", powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); } [Fact] @@ -49,7 +49,7 @@ public void Set_Same_Execution_Environment_Multiple_Times_Should_Only_Set_Once() powertoolsEnv.SetExecutionEnvironment(this); // Assert - Assert.Equal($"{Constants.FeatureContextIdentifier}/Tests/1.0.0 PTENV/AWS_LAMBDA_DOTNET{Environment.Version.Major}", powertoolsEnv.GetEnvironmentVariable("AWS_EXECUTION_ENV")); + Assert.Equal($"{Constants.FeatureContextIdentifier}/Tests/1.0.0 PTENV/AWS_LAMBDA_DOTNET{Environment.Version.Major}", powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); } [Fact] @@ -64,7 +64,7 @@ public void Set_Multiple_Execution_Environment() // Assert Assert.Equal($"{Constants.FeatureContextIdentifier}/Tests/1.0.0 PTENV/AWS_LAMBDA_DOTNET{Environment.Version.Major} {Constants.FeatureContextIdentifier}/Common/1.0.0", - powertoolsEnv.GetEnvironmentVariable("AWS_EXECUTION_ENV")); + powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); } [Fact] @@ -95,7 +95,7 @@ public void SetExecutionEnvironment_Should_Format_Strings_Correctly_With_Mocked_ // Mock the dependencies to return controlled values mockEnvironment.GetAssemblyName(Arg.Any()).Returns("AWS.Lambda.Powertools.Common.Tests"); mockEnvironment.GetAssemblyVersion(Arg.Any()).Returns("1.2.3"); - mockEnvironment.GetEnvironmentVariable("AWS_EXECUTION_ENV").Returns((string)null); + mockEnvironment.GetEnvironmentVariable("AWS_SDK_UA_APP_ID").Returns((string)null); // Setup the actual method call to use real implementation logic mockEnvironment.When(x => x.SetExecutionEnvironment(Arg.Any())) @@ -106,14 +106,14 @@ public void SetExecutionEnvironment_Should_Format_Strings_Correctly_With_Mocked_ var runtimeEnv = "PTENV/AWS_LAMBDA_DOTNET8"; // Assuming .NET 8 var expectedValue = $"{assemblyName}/{assemblyVersion} {runtimeEnv}"; - mockEnvironment.SetEnvironmentVariable("AWS_EXECUTION_ENV", expectedValue); + mockEnvironment.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", expectedValue); }); // Act mockEnvironment.SetExecutionEnvironment(this); // Assert - mockEnvironment.Received(1).SetEnvironmentVariable("AWS_EXECUTION_ENV", "PT/Tests/1.2.3 PTENV/AWS_LAMBDA_DOTNET8"); + mockEnvironment.Received(1).SetEnvironmentVariable("AWS_SDK_UA_APP_ID", "PT/Tests/1.2.3 PTENV/AWS_LAMBDA_DOTNET8"); } [Fact] @@ -123,7 +123,7 @@ public void SetExecutionEnvironment_Should_Append_To_Existing_Environment_With_M var mockEnvironment = Substitute.For(); // Mock existing environment value - mockEnvironment.GetEnvironmentVariable("AWS_EXECUTION_ENV").Returns("ExistingValue"); + mockEnvironment.GetEnvironmentVariable("AWS_SDK_UA_APP_ID").Returns("ExistingValue"); mockEnvironment.GetAssemblyName(Arg.Any()).Returns("AWS.Lambda.Powertools.Logging"); mockEnvironment.GetAssemblyVersion(Arg.Any()).Returns("2.1.0"); @@ -137,14 +137,14 @@ public void SetExecutionEnvironment_Should_Append_To_Existing_Environment_With_M var runtimeEnv = "PTENV/AWS_LAMBDA_DOTNET8"; var expectedValue = $"{currentEnv} {assemblyName}/{assemblyVersion} {runtimeEnv}"; - mockEnvironment.SetEnvironmentVariable("AWS_EXECUTION_ENV", expectedValue); + mockEnvironment.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", expectedValue); }); // Act mockEnvironment.SetExecutionEnvironment(this); // Assert - mockEnvironment.Received(1).SetEnvironmentVariable("AWS_EXECUTION_ENV", "ExistingValue PT/Logging/2.1.0 PTENV/AWS_LAMBDA_DOTNET8"); + mockEnvironment.Received(1).SetEnvironmentVariable("AWS_SDK_UA_APP_ID", "ExistingValue PT/Logging/2.1.0 PTENV/AWS_LAMBDA_DOTNET8"); } [Fact] @@ -154,7 +154,7 @@ public void SetExecutionEnvironment_Should_Not_Add_PTENV_Twice_With_Mocked_Value var mockEnvironment = Substitute.For(); // Mock existing environment value that already contains PTENV - mockEnvironment.GetEnvironmentVariable("AWS_EXECUTION_ENV").Returns("PT/Metrics/1.0.0 PTENV/AWS_LAMBDA_DOTNET8"); + mockEnvironment.GetEnvironmentVariable("AWS_SDK_UA_APP_ID").Returns("PT/Metrics/1.0.0 PTENV/AWS_LAMBDA_DOTNET8"); mockEnvironment.GetAssemblyName(Arg.Any()).Returns("AWS.Lambda.Powertools.Tracing"); mockEnvironment.GetAssemblyVersion(Arg.Any()).Returns("1.5.0"); @@ -168,14 +168,14 @@ public void SetExecutionEnvironment_Should_Not_Add_PTENV_Twice_With_Mocked_Value // No PTENV added since it already exists var expectedValue = $"{currentEnv} {assemblyName}/{assemblyVersion}"; - mockEnvironment.SetEnvironmentVariable("AWS_EXECUTION_ENV", expectedValue); + mockEnvironment.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", expectedValue); }); // Act mockEnvironment.SetExecutionEnvironment(this); // Assert - mockEnvironment.Received(1).SetEnvironmentVariable("AWS_EXECUTION_ENV", "PT/Metrics/1.0.0 PTENV/AWS_LAMBDA_DOTNET8 PT/Tracing/1.5.0"); + mockEnvironment.Received(1).SetEnvironmentVariable("AWS_SDK_UA_APP_ID", "PT/Metrics/1.0.0 PTENV/AWS_LAMBDA_DOTNET8 PT/Tracing/1.5.0"); } [Fact] @@ -279,13 +279,13 @@ public void SetExecutionEnvironment_Should_Handle_Empty_Current_Environment() { // Arrange var powertoolsEnv = new PowertoolsEnvironment(); - Environment.SetEnvironmentVariable("AWS_EXECUTION_ENV", ""); + Environment.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", ""); // Act powertoolsEnv.SetExecutionEnvironment(this); // Assert - var result = powertoolsEnv.GetEnvironmentVariable("AWS_EXECUTION_ENV"); + var result = powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID"); Assert.Contains($"{Constants.FeatureContextIdentifier}/Tests/", result); Assert.Contains("PTENV/AWS_LAMBDA_DOTNET", result); } @@ -295,13 +295,13 @@ public void SetExecutionEnvironment_Should_Add_PTENV_When_Not_Present() { // Arrange var powertoolsEnv = new PowertoolsEnvironment(); - powertoolsEnv.SetEnvironmentVariable("AWS_EXECUTION_ENV", "SomeExistingValue"); + powertoolsEnv.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", "SomeExistingValue"); // Act powertoolsEnv.SetExecutionEnvironment(this); // Assert - var result = powertoolsEnv.GetEnvironmentVariable("AWS_EXECUTION_ENV"); + var result = powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID"); Assert.StartsWith("SomeExistingValue", result); Assert.Contains("PTENV/AWS_LAMBDA_DOTNET", result); } @@ -312,13 +312,13 @@ public void SetExecutionEnvironment_Should_Not_Add_PTENV_When_Already_Present() // Arrange var powertoolsEnv = new PowertoolsEnvironment(); var existingValue = $"ExistingValue PTENV/AWS_LAMBDA_DOTNET{Environment.Version.Major}"; - powertoolsEnv.SetEnvironmentVariable("AWS_EXECUTION_ENV", existingValue); + powertoolsEnv.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", existingValue); // Act powertoolsEnv.SetExecutionEnvironment(this); // Assert - var result = powertoolsEnv.GetEnvironmentVariable("AWS_EXECUTION_ENV"); + var result = powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID"); var ptenvCount = result.Split("PTENV/").Length - 1; Assert.Equal(1, ptenvCount); // Should only have one PTENV entry } @@ -326,7 +326,7 @@ public void SetExecutionEnvironment_Should_Not_Add_PTENV_When_Already_Present() public void Dispose() { //Do cleanup actions here - Environment.SetEnvironmentVariable("AWS_EXECUTION_ENV", null); + Environment.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", null); // Clear the singleton instance to ensure fresh state for each test var instanceField = typeof(PowertoolsEnvironment).GetField("_instance", diff --git a/libraries/tests/AWS.Lambda.Powertools.Idempotency.Tests/Internal/IdempotentAspectTests.cs b/libraries/tests/AWS.Lambda.Powertools.Idempotency.Tests/Internal/IdempotentAspectTests.cs index 324ccd5c..e2aaec27 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Idempotency.Tests/Internal/IdempotentAspectTests.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Idempotency.Tests/Internal/IdempotentAspectTests.cs @@ -258,7 +258,7 @@ public void Idempotency_Set_Execution_Environment_Context() // Assert Assert.Contains($"{Constants.FeatureContextIdentifier}/Idempotency/", - env.GetEnvironmentVariable("AWS_EXECUTION_ENV")); + env.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); Assert.NotNull(xRayRecorder); } diff --git a/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/PowertoolsLoggerTest.cs b/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/PowertoolsLoggerTest.cs index 81546c3d..37f4f2a9 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/PowertoolsLoggerTest.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/PowertoolsLoggerTest.cs @@ -1355,7 +1355,7 @@ public void Log_Set_Execution_Environment_Context() // Assert Assert.Contains($"{Constants.FeatureContextIdentifier}/Logging/", - env.GetEnvironmentVariable("AWS_EXECUTION_ENV")); + env.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); } [Fact] @@ -1365,7 +1365,7 @@ public void Log_Skip_If_Exists_Execution_Environment_Context() var loggerName = Guid.NewGuid().ToString(); var env = new PowertoolsEnvironment(); - env.SetEnvironmentVariable("AWS_EXECUTION_ENV", + env.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", $"{Constants.FeatureContextIdentifier}/Logging/AlreadyThere"); // Act @@ -1383,8 +1383,8 @@ public void Log_Skip_If_Exists_Execution_Environment_Context() // Assert Assert.Equal($"{Constants.FeatureContextIdentifier}/Logging/AlreadyThere", - env.GetEnvironmentVariable("AWS_EXECUTION_ENV")); - env.SetEnvironmentVariable("AWS_EXECUTION_ENV", null); + env.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); + env.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", null); } [Fact] diff --git a/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/MetricsTests.cs b/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/MetricsTests.cs index b710236a..deefbad5 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/MetricsTests.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/MetricsTests.cs @@ -25,7 +25,7 @@ public void Metrics_Set_Execution_Environment_Context() // Assert Assert.Contains($"{Constants.FeatureContextIdentifier}/Metrics/", - env.GetEnvironmentVariable("AWS_EXECUTION_ENV")); + env.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); } [Fact] diff --git a/libraries/tests/AWS.Lambda.Powertools.Tracing.Tests/XRayRecorderTests.cs b/libraries/tests/AWS.Lambda.Powertools.Tracing.Tests/XRayRecorderTests.cs index c40f4400..acc8b546 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Tracing.Tests/XRayRecorderTests.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Tracing.Tests/XRayRecorderTests.cs @@ -26,7 +26,7 @@ public void Tracing_Set_Execution_Environment_Context() // Assert Assert.Contains($"{Constants.FeatureContextIdentifier}/Tracing/", - env.GetEnvironmentVariable("AWS_EXECUTION_ENV")); + env.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); Assert.NotNull(xRayRecorder); } From d593cbbc197a9a3c638076996bf268389eab355b Mon Sep 17 00:00:00 2001 From: Henrique Graca <999396+hjgraca@users.noreply.github.com> Date: Mon, 28 Jul 2025 15:37:51 +0100 Subject: [PATCH 2/9] on sourcegenerator per project --- .../SourceGenerators/UASourceGenerator.cs | 31 ++++++++++++++ .../AWS.Lambda.Powertools.Common.csproj | 17 ++++---- .../Core/IPowertoolsEnvironment.cs | 7 ++++ .../Core/PowertoolsEnvironment.cs | 42 +++++++++++++++++++ .../SourceGenerators/UASourceGenerator.cs | 31 ++++++++++++++ .../SourceGenerators/UASourceGenerator.cs | 31 ++++++++++++++ .../AWS.Lambda.Powertools.Kafka.csproj | 4 ++ .../Internal/PowertoolsLoggerProvider.cs | 4 +- .../SourceGenerators/UASourceGenerator.cs | 30 +++++++++++++ .../SourceGenerators/UASourceGenerator.cs | 31 ++++++++++++++ .../SourceGenerators/UASourceGenerator.cs | 31 ++++++++++++++ .../SourceGenerators/UASourceGenerator.cs | 31 ++++++++++++++ libraries/src/Directory.Build.props | 1 + libraries/src/Directory.Packages.props | 2 + 14 files changed, 284 insertions(+), 9 deletions(-) create mode 100644 libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs create mode 100644 libraries/src/AWS.Lambda.Powertools.EventHandler/SourceGenerators/UASourceGenerator.cs create mode 100644 libraries/src/AWS.Lambda.Powertools.Idempotency/SourceGenerators/UASourceGenerator.cs create mode 100644 libraries/src/AWS.Lambda.Powertools.Logging/SourceGenerators/UASourceGenerator.cs create mode 100644 libraries/src/AWS.Lambda.Powertools.Metrics/SourceGenerators/UASourceGenerator.cs create mode 100644 libraries/src/AWS.Lambda.Powertools.Parameters/SourceGenerators/UASourceGenerator.cs create mode 100644 libraries/src/AWS.Lambda.Powertools.Tracing/SourceGenerators/UASourceGenerator.cs diff --git a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs new file mode 100644 index 00000000..c157aab6 --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs @@ -0,0 +1,31 @@ +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Text; + +[Generator] +public class UASourceGenerator : IIncrementalGenerator +{ + public void Initialize(IncrementalGeneratorInitializationContext context) + { + context.RegisterPostInitializationOutput(ctx => + { + var source = @"// +using System.Runtime.CompilerServices; +using AWS.Lambda.Powertools.Common; + +namespace PowertoolsGenerated +{ + internal static class UAModuleInitializerBatchProcessing + { + [ModuleInitializer] + internal static void Initialize() + { + PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.BatchProcessing.BatchProcessor)); + } + } +}"; + ctx.AddSource("UAModuleInitializerBatchProcessing.g.cs", SourceText.From(source, Encoding.UTF8)); + }); + } +} + diff --git a/libraries/src/AWS.Lambda.Powertools.Common/AWS.Lambda.Powertools.Common.csproj b/libraries/src/AWS.Lambda.Powertools.Common/AWS.Lambda.Powertools.Common.csproj index 9d3e6682..83e02c1f 100644 --- a/libraries/src/AWS.Lambda.Powertools.Common/AWS.Lambda.Powertools.Common.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Common/AWS.Lambda.Powertools.Common.csproj @@ -2,17 +2,20 @@ - AWS.Lambda.Powertools.Common - Powertools for AWS Lambda (.NET) - Core package. - AWS.Lambda.Powertools.Common - AWS.Lambda.Powertools.Common - false + AWS.Lambda.Powertools.Common + Powertools for AWS Lambda (.NET) - Core package. + AWS.Lambda.Powertools.Common + AWS.Lambda.Powertools.Common + false - - + + + + + \ No newline at end of file diff --git a/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsEnvironment.cs b/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsEnvironment.cs index 0c642813..f5b36449 100644 --- a/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsEnvironment.cs +++ b/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsEnvironment.cs @@ -40,4 +40,11 @@ public interface IPowertoolsEnvironment /// /// void SetExecutionEnvironment(T type); + + /// + /// Sets the execution environment using assembly name and version strings directly + /// + /// The assembly name + /// The assembly version + void SetExecutionEnvironment(string assemblyName, string assemblyVersion); } \ No newline at end of file diff --git a/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsEnvironment.cs b/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsEnvironment.cs index ea758258..e55133a0 100644 --- a/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsEnvironment.cs +++ b/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsEnvironment.cs @@ -110,6 +110,48 @@ public void SetExecutionEnvironment(T type) SetEnvironmentVariable(envName, finalValue); } + + /// + public void SetExecutionEnvironment(string assemblyName, string assemblyVersion) + { + const string envName = Constants.AWSSdkUAAppId; + var currentEnvValue = GetEnvironmentVariable(envName); + var parsedAssemblyName = ParseAssemblyName(assemblyName); + + // Check for duplication early + if (!string.IsNullOrEmpty(currentEnvValue) && currentEnvValue.Contains(parsedAssemblyName)) + { + return; + } + + var newEntry = $"{parsedAssemblyName}/{assemblyVersion}"; + + string finalValue; + + if (string.IsNullOrEmpty(currentEnvValue)) + { + // First entry: "PT/Assembly/1.0.0 PTENV/AWS_LAMBDA_DOTNET8" + finalValue = $"{newEntry} {CachedRuntimeEnvironment}"; + } + else + { + // Check if PTENV already exists in one pass + var containsPtenv = currentEnvValue.Contains("PTENV/"); + + if (containsPtenv) + { + // Just append the new entry: "existing PT/Assembly/1.0.0" + finalValue = $"{currentEnvValue} {newEntry}"; + } + else + { + // Append new entry + PTENV: "existing PT/Assembly/1.0.0 PTENV/AWS_LAMBDA_DOTNET8" + finalValue = $"{currentEnvValue} {newEntry} {CachedRuntimeEnvironment}"; + } + } + + SetEnvironmentVariable(envName, finalValue); + } /// /// Parsing the name to conform with the required naming convention for the UserAgent header (PTFeature/Name/Version) diff --git a/libraries/src/AWS.Lambda.Powertools.EventHandler/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.EventHandler/SourceGenerators/UASourceGenerator.cs new file mode 100644 index 00000000..4ef9f3ea --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.EventHandler/SourceGenerators/UASourceGenerator.cs @@ -0,0 +1,31 @@ +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Text; + +[Generator] +public class UASourceGenerator : IIncrementalGenerator +{ + public void Initialize(IncrementalGeneratorInitializationContext context) + { + context.RegisterPostInitializationOutput(ctx => + { + var source = @"// +using System.Runtime.CompilerServices; +using AWS.Lambda.Powertools.Common; + +namespace PowertoolsGenerated +{ + internal static class UAModuleInitializerEventHandler + { + [ModuleInitializer] + internal static void Initialize() + { + PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.EventHandler.AppSyncEvents.AppSyncEventsResolver)); + } + } +}"; + ctx.AddSource("UAModuleInitializerEventHandler.g.cs", SourceText.From(source, Encoding.UTF8)); + }); + } +} + diff --git a/libraries/src/AWS.Lambda.Powertools.Idempotency/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Idempotency/SourceGenerators/UASourceGenerator.cs new file mode 100644 index 00000000..10e7f987 --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.Idempotency/SourceGenerators/UASourceGenerator.cs @@ -0,0 +1,31 @@ +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Text; + +[Generator] +public class UASourceGenerator : IIncrementalGenerator +{ + public void Initialize(IncrementalGeneratorInitializationContext context) + { + context.RegisterPostInitializationOutput(ctx => + { + var source = @"// +using System.Runtime.CompilerServices; +using AWS.Lambda.Powertools.Common; + +namespace PowertoolsGenerated +{ + internal static class UAModuleInitializerIdempotency + { + [ModuleInitializer] + internal static void Initialize() + { + PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.Idempotency.Idempotency)); + } + } +}"; + ctx.AddSource("UAModuleInitializerIdempotency.g.cs", SourceText.From(source, Encoding.UTF8)); + }); + } +} + diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka/AWS.Lambda.Powertools.Kafka.csproj b/libraries/src/AWS.Lambda.Powertools.Kafka/AWS.Lambda.Powertools.Kafka.csproj index d947528d..609d6742 100644 --- a/libraries/src/AWS.Lambda.Powertools.Kafka/AWS.Lambda.Powertools.Kafka.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Kafka/AWS.Lambda.Powertools.Kafka.csproj @@ -18,4 +18,8 @@ + + + + diff --git a/libraries/src/AWS.Lambda.Powertools.Logging/Internal/PowertoolsLoggerProvider.cs b/libraries/src/AWS.Lambda.Powertools.Logging/Internal/PowertoolsLoggerProvider.cs index 8c16a0ac..b3788ed4 100644 --- a/libraries/src/AWS.Lambda.Powertools.Logging/Internal/PowertoolsLoggerProvider.cs +++ b/libraries/src/AWS.Lambda.Powertools.Logging/Internal/PowertoolsLoggerProvider.cs @@ -25,8 +25,8 @@ public PowertoolsLoggerProvider( _powertoolsConfigurations = powertoolsConfigurations; _currentConfig = config; - // Set execution environment - _powertoolsConfigurations.SetExecutionEnvironment(this); + // Remove this line - the source generator now handles setting execution environment + // _powertoolsConfigurations.SetExecutionEnvironment(this); // Apply environment configurations if available ConfigureFromEnvironment(); diff --git a/libraries/src/AWS.Lambda.Powertools.Logging/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Logging/SourceGenerators/UASourceGenerator.cs new file mode 100644 index 00000000..d52ce8aa --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.Logging/SourceGenerators/UASourceGenerator.cs @@ -0,0 +1,30 @@ +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Text; + +[Generator] +public class UASourceGenerator : IIncrementalGenerator +{ + public void Initialize(IncrementalGeneratorInitializationContext context) + { + context.RegisterPostInitializationOutput(ctx => + { + var source = @"// +using System.Runtime.CompilerServices; +using AWS.Lambda.Powertools.Common; + +namespace PowertoolsGenerated +{ + internal static class UAModuleInitializerLogging + { + [ModuleInitializer] + internal static void Initialize() + { + PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.Logging.Logger)); + } + } +}"; + ctx.AddSource("UAModuleInitializerLogging.g.cs", SourceText.From(source, Encoding.UTF8)); + }); + } +} diff --git a/libraries/src/AWS.Lambda.Powertools.Metrics/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Metrics/SourceGenerators/UASourceGenerator.cs new file mode 100644 index 00000000..44c718fb --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.Metrics/SourceGenerators/UASourceGenerator.cs @@ -0,0 +1,31 @@ +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Text; + +[Generator] +public class UASourceGenerator : IIncrementalGenerator +{ + public void Initialize(IncrementalGeneratorInitializationContext context) + { + context.RegisterPostInitializationOutput(ctx => + { + var source = @"// +using System.Runtime.CompilerServices; +using AWS.Lambda.Powertools.Common; + +namespace PowertoolsGenerated +{ + internal static class UAModuleInitializerMetrics + { + [ModuleInitializer] + internal static void Initialize() + { + PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.Metrics.Metrics)); + } + } +}"; + ctx.AddSource("UAModuleInitializerMetrics.g.cs", SourceText.From(source, Encoding.UTF8)); + }); + } +} + diff --git a/libraries/src/AWS.Lambda.Powertools.Parameters/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Parameters/SourceGenerators/UASourceGenerator.cs new file mode 100644 index 00000000..744f16b7 --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.Parameters/SourceGenerators/UASourceGenerator.cs @@ -0,0 +1,31 @@ +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Text; + +[Generator] +public class UASourceGenerator : IIncrementalGenerator +{ + public void Initialize(IncrementalGeneratorInitializationContext context) + { + context.RegisterPostInitializationOutput(ctx => + { + var source = @"// +using System.Runtime.CompilerServices; +using AWS.Lambda.Powertools.Common; + +namespace PowertoolsGenerated +{ + internal static class UAModuleInitializerParameters + { + [ModuleInitializer] + internal static void Initialize() + { + PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.Parameters.ParametersManager)); + } + } +}"; + ctx.AddSource("UAModuleInitializerParameters.g.cs", SourceText.From(source, Encoding.UTF8)); + }); + } +} + diff --git a/libraries/src/AWS.Lambda.Powertools.Tracing/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Tracing/SourceGenerators/UASourceGenerator.cs new file mode 100644 index 00000000..119024b3 --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.Tracing/SourceGenerators/UASourceGenerator.cs @@ -0,0 +1,31 @@ +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Text; + +[Generator] +public class UASourceGenerator : IIncrementalGenerator +{ + public void Initialize(IncrementalGeneratorInitializationContext context) + { + context.RegisterPostInitializationOutput(ctx => + { + var source = @"// +using System.Runtime.CompilerServices; +using AWS.Lambda.Powertools.Common; + +namespace PowertoolsGenerated +{ + internal static class UAModuleInitializerTracing + { + [ModuleInitializer] + internal static void Initialize() + { + PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.Tracing.Tracing)); + } + } +}"; + ctx.AddSource("UAModuleInitializerTracing.g.cs", SourceText.From(source, Encoding.UTF8)); + }); + } +} + diff --git a/libraries/src/Directory.Build.props b/libraries/src/Directory.Build.props index 7d1e38a6..d9350a0c 100644 --- a/libraries/src/Directory.Build.props +++ b/libraries/src/Directory.Build.props @@ -39,6 +39,7 @@ + Common\%(RecursiveDir)%(Filename)%(Extension) diff --git a/libraries/src/Directory.Packages.props b/libraries/src/Directory.Packages.props index be5d5685..5413794c 100644 --- a/libraries/src/Directory.Packages.props +++ b/libraries/src/Directory.Packages.props @@ -16,6 +16,8 @@ + + From c1927d64f28a93e5746cceaa224cdb0612e17c64 Mon Sep 17 00:00:00 2001 From: Henrique Graca <999396+hjgraca@users.noreply.github.com> Date: Mon, 28 Jul 2025 17:01:03 +0100 Subject: [PATCH 3/9] chore: update execution environment setter to support utility name and add source generator tests --- libraries/AWS.Lambda.Powertools.sln | 15 ++++++ .../SourceGenerators/UASourceGenerator.cs | 2 +- .../Core/IPowertoolsEnvironment.cs | 12 ++--- .../Core/PowertoolsEnvironment.cs | 46 +---------------- .../SourceGenerators/UASourceGenerator.cs | 31 ++++++++++++ .../SourceGenerators/UASourceGenerator.cs | 30 ++++++++++++ .../SourceGenerators/UASourceGenerator.cs | 30 ++++++++++++ .../SourceGenerators/UASourceGenerator.cs | 30 ++++++++++++ ...da.Powertools.SourceGenerator.Tests.csproj | 45 +++++++++++++++++ .../UAGenerator/UASetter.cs | 49 +++++++++++++++++++ 10 files changed, 236 insertions(+), 54 deletions(-) create mode 100644 libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/SourceGenerators/UASourceGenerator.cs create mode 100644 libraries/src/AWS.Lambda.Powertools.Kafka.Avro/SourceGenerators/UASourceGenerator.cs create mode 100644 libraries/src/AWS.Lambda.Powertools.Kafka.Json/SourceGenerators/UASourceGenerator.cs create mode 100644 libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/SourceGenerators/UASourceGenerator.cs create mode 100644 libraries/tests/AWS.Lambda.Powertools.SourceGenerator.Tests/AWS.Lambda.Powertools.SourceGenerator.Tests.csproj create mode 100644 libraries/tests/AWS.Lambda.Powertools.SourceGenerator.Tests/UAGenerator/UASetter.cs diff --git a/libraries/AWS.Lambda.Powertools.sln b/libraries/AWS.Lambda.Powertools.sln index 325c683e..5f7ccf18 100644 --- a/libraries/AWS.Lambda.Powertools.sln +++ b/libraries/AWS.Lambda.Powertools.sln @@ -123,6 +123,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AWS.Lambda.Powertools.Kafka EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AWS.Lambda.Powertools.Kafka.Protobuf", "src\AWS.Lambda.Powertools.Kafka.Protobuf\AWS.Lambda.Powertools.Kafka.Protobuf.csproj", "{B640DB80-C982-407B-A2EC-CD29AC77DDB8}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AWS.Lambda.Powertools.SourceGenerator.Tests", "tests\AWS.Lambda.Powertools.SourceGenerator.Tests\AWS.Lambda.Powertools.SourceGenerator.Tests.csproj", "{D94F60B1-B65B-451B-BFB4-EAC63881B17E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -688,6 +690,18 @@ Global {B640DB80-C982-407B-A2EC-CD29AC77DDB8}.Release|x64.Build.0 = Release|Any CPU {B640DB80-C982-407B-A2EC-CD29AC77DDB8}.Release|x86.ActiveCfg = Release|Any CPU {B640DB80-C982-407B-A2EC-CD29AC77DDB8}.Release|x86.Build.0 = Release|Any CPU + {D94F60B1-B65B-451B-BFB4-EAC63881B17E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D94F60B1-B65B-451B-BFB4-EAC63881B17E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D94F60B1-B65B-451B-BFB4-EAC63881B17E}.Debug|x64.ActiveCfg = Debug|Any CPU + {D94F60B1-B65B-451B-BFB4-EAC63881B17E}.Debug|x64.Build.0 = Debug|Any CPU + {D94F60B1-B65B-451B-BFB4-EAC63881B17E}.Debug|x86.ActiveCfg = Debug|Any CPU + {D94F60B1-B65B-451B-BFB4-EAC63881B17E}.Debug|x86.Build.0 = Debug|Any CPU + {D94F60B1-B65B-451B-BFB4-EAC63881B17E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D94F60B1-B65B-451B-BFB4-EAC63881B17E}.Release|Any CPU.Build.0 = Release|Any CPU + {D94F60B1-B65B-451B-BFB4-EAC63881B17E}.Release|x64.ActiveCfg = Release|Any CPU + {D94F60B1-B65B-451B-BFB4-EAC63881B17E}.Release|x64.Build.0 = Release|Any CPU + {D94F60B1-B65B-451B-BFB4-EAC63881B17E}.Release|x86.ActiveCfg = Release|Any CPU + {D94F60B1-B65B-451B-BFB4-EAC63881B17E}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution @@ -746,5 +760,6 @@ Global {25F0929B-2E04-4ED6-A0ED-5379A0A755B0} = {73C9B1E5-3893-47E8-B373-17E5F5D7E6F5} {9E2B8160-3E76-4B33-86AB-DE35A5FCDB1E} = {73C9B1E5-3893-47E8-B373-17E5F5D7E6F5} {B640DB80-C982-407B-A2EC-CD29AC77DDB8} = {73C9B1E5-3893-47E8-B373-17E5F5D7E6F5} + {D94F60B1-B65B-451B-BFB4-EAC63881B17E} = {1CFF5568-8486-475F-81F6-06105C437528} EndGlobalSection EndGlobal diff --git a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs index c157aab6..9e5983ef 100644 --- a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs @@ -20,7 +20,7 @@ internal static class UAModuleInitializerBatchProcessing [ModuleInitializer] internal static void Initialize() { - PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.BatchProcessing.BatchProcessor)); + PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.BatchProcessing.ProcessingOptions)); } } }"; diff --git a/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsEnvironment.cs b/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsEnvironment.cs index f5b36449..23e2c179 100644 --- a/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsEnvironment.cs +++ b/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsEnvironment.cs @@ -34,17 +34,11 @@ public interface IPowertoolsEnvironment /// /// Assembly Version in the Major.Minor.Build format string GetAssemblyVersion(T type); - + /// /// Sets the execution Environment Variable (AWS_SDK_UA_APP_ID) /// /// - void SetExecutionEnvironment(T type); - - /// - /// Sets the execution environment using assembly name and version strings directly - /// - /// The assembly name - /// The assembly version - void SetExecutionEnvironment(string assemblyName, string assemblyVersion); + /// + void SetExecutionEnvironment(T type, string utilityName = null); } \ No newline at end of file diff --git a/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsEnvironment.cs b/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsEnvironment.cs index e55133a0..a4eb9ce0 100644 --- a/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsEnvironment.cs +++ b/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsEnvironment.cs @@ -69,11 +69,11 @@ public string GetAssemblyVersion(T type) } /// - public void SetExecutionEnvironment(T type) + public void SetExecutionEnvironment(T type, string utilityName = null) { const string envName = Constants.AWSSdkUAAppId; var currentEnvValue = GetEnvironmentVariable(envName); - var assemblyName = ParseAssemblyName(GetAssemblyName(type)); + var assemblyName = utilityName != null ? $"{Constants.FeatureContextIdentifier}/{utilityName}" : ParseAssemblyName(GetAssemblyName(type)); // Check for duplication early if (!string.IsNullOrEmpty(currentEnvValue) && currentEnvValue.Contains(assemblyName)) @@ -110,48 +110,6 @@ public void SetExecutionEnvironment(T type) SetEnvironmentVariable(envName, finalValue); } - - /// - public void SetExecutionEnvironment(string assemblyName, string assemblyVersion) - { - const string envName = Constants.AWSSdkUAAppId; - var currentEnvValue = GetEnvironmentVariable(envName); - var parsedAssemblyName = ParseAssemblyName(assemblyName); - - // Check for duplication early - if (!string.IsNullOrEmpty(currentEnvValue) && currentEnvValue.Contains(parsedAssemblyName)) - { - return; - } - - var newEntry = $"{parsedAssemblyName}/{assemblyVersion}"; - - string finalValue; - - if (string.IsNullOrEmpty(currentEnvValue)) - { - // First entry: "PT/Assembly/1.0.0 PTENV/AWS_LAMBDA_DOTNET8" - finalValue = $"{newEntry} {CachedRuntimeEnvironment}"; - } - else - { - // Check if PTENV already exists in one pass - var containsPtenv = currentEnvValue.Contains("PTENV/"); - - if (containsPtenv) - { - // Just append the new entry: "existing PT/Assembly/1.0.0" - finalValue = $"{currentEnvValue} {newEntry}"; - } - else - { - // Append new entry + PTENV: "existing PT/Assembly/1.0.0 PTENV/AWS_LAMBDA_DOTNET8" - finalValue = $"{currentEnvValue} {newEntry} {CachedRuntimeEnvironment}"; - } - } - - SetEnvironmentVariable(envName, finalValue); - } /// /// Parsing the name to conform with the required naming convention for the UserAgent header (PTFeature/Name/Version) diff --git a/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/SourceGenerators/UASourceGenerator.cs new file mode 100644 index 00000000..22e2d015 --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/SourceGenerators/UASourceGenerator.cs @@ -0,0 +1,31 @@ +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Text; + +[Generator] +public class UASourceGenerator : IIncrementalGenerator +{ + public void Initialize(IncrementalGeneratorInitializationContext context) + { + context.RegisterPostInitializationOutput(ctx => + { + var source = @"// +using System.Runtime.CompilerServices; +using AWS.Lambda.Powertools.Common; + +namespace PowertoolsGenerated +{ + internal static class UAModuleInitializerBedrockAgentFunctionResolver + { + [ModuleInitializer] + internal static void Initialize() + { + PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunctionResolver)); + } + } +}"; + ctx.AddSource("UAModuleInitializerBedrockAgentFunctionResolver.g.cs", SourceText.From(source, Encoding.UTF8)); + }); + } +} + diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/SourceGenerators/UASourceGenerator.cs new file mode 100644 index 00000000..123608ec --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/SourceGenerators/UASourceGenerator.cs @@ -0,0 +1,30 @@ +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Text; + +[Generator] +public class UASourceGenerator : IIncrementalGenerator +{ + public void Initialize(IncrementalGeneratorInitializationContext context) + { + context.RegisterPostInitializationOutput(ctx => + { + var source = @"// +using System.Runtime.CompilerServices; +using AWS.Lambda.Powertools.Common; + +namespace PowertoolsGenerated +{ + internal static class UAModuleInitializerKafkaAvro + { + [ModuleInitializer] + internal static void Initialize() + { + PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.Kafka.Avro.PowertoolsKafkaAvroSerializer), ""Kafka.Avro""); + } + } +}"; + ctx.AddSource("UAModuleInitializerKafkaAvro.g.cs", SourceText.From(source, Encoding.UTF8)); + }); + } +} diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Json/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Kafka.Json/SourceGenerators/UASourceGenerator.cs new file mode 100644 index 00000000..48c12204 --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Json/SourceGenerators/UASourceGenerator.cs @@ -0,0 +1,30 @@ +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Text; + +[Generator] +public class UASourceGenerator : IIncrementalGenerator +{ + public void Initialize(IncrementalGeneratorInitializationContext context) + { + context.RegisterPostInitializationOutput(ctx => + { + var source = @"// +using System.Runtime.CompilerServices; +using AWS.Lambda.Powertools.Common; + +namespace PowertoolsGenerated +{ + internal static class UAModuleInitializerKafkaJson + { + [ModuleInitializer] + internal static void Initialize() + { + PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.Kafka.Json.PowertoolsKafkaJsonSerializer), ""Kafka.Json""); + } + } +}"; + ctx.AddSource("UAModuleInitializerKafkaJson.g.cs", SourceText.From(source, Encoding.UTF8)); + }); + } +} diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/SourceGenerators/UASourceGenerator.cs new file mode 100644 index 00000000..d2cf2b5b --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/SourceGenerators/UASourceGenerator.cs @@ -0,0 +1,30 @@ +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Text; + +[Generator] +public class UASourceGenerator : IIncrementalGenerator +{ + public void Initialize(IncrementalGeneratorInitializationContext context) + { + context.RegisterPostInitializationOutput(ctx => + { + var source = @"// +using System.Runtime.CompilerServices; +using AWS.Lambda.Powertools.Common; + +namespace PowertoolsGenerated +{ + internal static class UAModuleInitializerKafkaProtobuf + { + [ModuleInitializer] + internal static void Initialize() + { + PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.Kafka.Protobuf.PowertoolsKafkaProtobufSerializer), ""Kafka.Protobuf""); + } + } +}"; + ctx.AddSource("UAModuleInitializerKafkaProtobuf.g.cs", SourceText.From(source, Encoding.UTF8)); + }); + } +} diff --git a/libraries/tests/AWS.Lambda.Powertools.SourceGenerator.Tests/AWS.Lambda.Powertools.SourceGenerator.Tests.csproj b/libraries/tests/AWS.Lambda.Powertools.SourceGenerator.Tests/AWS.Lambda.Powertools.SourceGenerator.Tests.csproj new file mode 100644 index 00000000..081b9f20 --- /dev/null +++ b/libraries/tests/AWS.Lambda.Powertools.SourceGenerator.Tests/AWS.Lambda.Powertools.SourceGenerator.Tests.csproj @@ -0,0 +1,45 @@ + + + + net8.0 + enable + enable + + false + true + true + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + + + + diff --git a/libraries/tests/AWS.Lambda.Powertools.SourceGenerator.Tests/UAGenerator/UASetter.cs b/libraries/tests/AWS.Lambda.Powertools.SourceGenerator.Tests/UAGenerator/UASetter.cs new file mode 100644 index 00000000..458e20fa --- /dev/null +++ b/libraries/tests/AWS.Lambda.Powertools.SourceGenerator.Tests/UAGenerator/UASetter.cs @@ -0,0 +1,49 @@ +using System.Text.RegularExpressions; + +namespace AWS.Lambda.Powertools.SourceGenerator.Tests; + +public class UASetter +{ + private readonly string? _appId; + + public UASetter() + { + _appId = Environment.GetEnvironmentVariable("AWS_SDK_UA_APP_ID"); + } + + [Fact] + public void Is_PTENV_Set() + { + Assert.NotNull(_appId); + Assert.Contains("PTENV/AWS_LAMBDA_DOTNET8", _appId); + CheckUtilityOnlyAppearsOnce(_appId); + } + + [Theory] + [InlineData("Logging")] + [InlineData("Tracing")] + [InlineData("BatchProcessing")] + [InlineData("Idempotency")] + [InlineData("Metrics")] + [InlineData("EventHandler")] + [InlineData("BedrockAgentFunction")] + [InlineData("Kafka.Avro")] + [InlineData("Kafka.Json")] + [InlineData("Kafka.Protobuf")] + [InlineData("Parameters")] + public void Is_Utility_Set(string utility) + { + var appId = Environment.GetEnvironmentVariable("AWS_SDK_UA_APP_ID"); + Assert.NotNull(appId); + Assert.Contains($"PT/{utility}/1.0.0", appId); + + CheckUtilityOnlyAppearsOnce(appId); + } + + private static void CheckUtilityOnlyAppearsOnce(string appId) + { + // only appears once + var matches = Regex.Matches(appId, Regex.Escape(appId)); + Assert.Single(matches); + } +} From 65cfe37a22969fe6fbe0b408a9410101a758371a Mon Sep 17 00:00:00 2001 From: Henrique Graca <999396+hjgraca@users.noreply.github.com> Date: Mon, 28 Jul 2025 22:16:23 +0100 Subject: [PATCH 4/9] chore: remove SetExecutionEnvironment from PowertoolsConfigurations and related classes --- .../BatchProcessor.cs | 9 - .../DynamoDb/DynamoDbStreamBatchProcessor.cs | 16 +- .../Kinesis/KinesisEventBatchProcessor.cs | 18 +- .../SourceGenerators/UASourceGenerator.cs | 10 + .../Sqs/SqsBatchProcessor.cs | 17 +- .../Core/IPowertoolsConfigurations.cs | 6 - .../Core/PowertoolsConfigurations.cs | 6 - .../SourceGenerators/UASourceGenerator.cs | 7 + .../SourceGenerators/UASourceGenerator.cs | 7 + .../Idempotency.cs | 11 +- .../SourceGenerators/UASourceGenerator.cs | 11 ++ .../SourceGenerators/UASourceGenerator.cs | 7 + .../SourceGenerators/UASourceGenerator.cs | 7 + .../SourceGenerators/UASourceGenerator.cs | 7 + .../SourceGenerators/UASourceGenerator.cs | 11 ++ .../AWS.Lambda.Powertools.Metrics/Metrics.cs | 1 - .../SourceGenerators/UASourceGenerator.cs | 10 + .../Provider/ParameterProviderBaseHandler.cs | 6 +- .../Provider/ParameterProvider.cs | 4 +- .../SourceGenerators/UASourceGenerator.cs | 10 + .../AWS.Lambda.Powertools.Tracing.csproj | 1 - .../Internal/XRayRecorder.cs | 6 +- .../SourceGenerators/UASourceGenerator.cs | 10 + libraries/src/Directory.Build.props | 3 +- .../BatchProcessingTests.cs | 16 +- .../Internal/BatchProcessingInternalTests.cs | 62 ------- .../Core/PowertoolsConfigurationsTest.cs | 21 --- .../Internal/IdempotentAspectTests.cs | 18 -- .../PowertoolsLoggerTest.cs | 25 --- .../MetricsTests.cs | 16 -- .../Provider/ParameterProviderTest.cs | 175 +++++++----------- ...da.Powertools.SourceGenerator.Tests.csproj | 5 +- .../XRayRecorderTests.cs | 19 -- 33 files changed, 196 insertions(+), 362 deletions(-) delete mode 100644 libraries/tests/AWS.Lambda.Powertools.BatchProcessing.Tests/Internal/BatchProcessingInternalTests.cs diff --git a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/BatchProcessor.cs b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/BatchProcessor.cs index 6afeebfa..d8583207 100644 --- a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/BatchProcessor.cs +++ b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/BatchProcessor.cs @@ -5,7 +5,6 @@ using System.Threading; using System.Threading.Tasks; using AWS.Lambda.Powertools.BatchProcessing.Exceptions; -using AWS.Lambda.Powertools.Common; namespace AWS.Lambda.Powertools.BatchProcessing; @@ -16,14 +15,6 @@ namespace AWS.Lambda.Powertools.BatchProcessing; /// Type of batch record. public abstract class BatchProcessor : IBatchProcessor { - /// - /// Default constructor - /// - protected BatchProcessor(IPowertoolsConfigurations powertoolsConfigurations) - { - powertoolsConfigurations.SetExecutionEnvironment(this); - } - /// public ProcessingResult ProcessingResult { get; protected set; } diff --git a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/DynamoDb/DynamoDbStreamBatchProcessor.cs b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/DynamoDb/DynamoDbStreamBatchProcessor.cs index c19b4a44..1e59423f 100644 --- a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/DynamoDb/DynamoDbStreamBatchProcessor.cs +++ b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/DynamoDb/DynamoDbStreamBatchProcessor.cs @@ -15,7 +15,6 @@ using System.Collections.Generic; using Amazon.Lambda.DynamoDBEvents; -using AWS.Lambda.Powertools.Common; namespace AWS.Lambda.Powertools.BatchProcessing.DynamoDb; @@ -33,23 +32,16 @@ public class DynamoDbStreamBatchProcessor : BatchProcessor public static IDynamoDbStreamBatchProcessor Instance => - _instance ??= new DynamoDbStreamBatchProcessor(PowertoolsConfigurations.Instance); + _instance ??= new DynamoDbStreamBatchProcessor(); + - /// - /// This is the default constructor - /// - /// - public DynamoDbStreamBatchProcessor(IPowertoolsConfigurations powertoolsConfigurations) : base(powertoolsConfigurations) - { - _instance = this; - } - /// /// Need default constructor for when consumers create a custom batch processor /// // ReSharper disable once MemberCanBePrivate.Global - protected DynamoDbStreamBatchProcessor() : this(PowertoolsConfigurations.Instance) + protected DynamoDbStreamBatchProcessor() { + _instance = this; } /// diff --git a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/Kinesis/KinesisEventBatchProcessor.cs b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/Kinesis/KinesisEventBatchProcessor.cs index 6c332308..eb518598 100644 --- a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/Kinesis/KinesisEventBatchProcessor.cs +++ b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/Kinesis/KinesisEventBatchProcessor.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using Amazon.Lambda.KinesisEvents; -using AWS.Lambda.Powertools.Common; namespace AWS.Lambda.Powertools.BatchProcessing.Kinesis; @@ -18,25 +17,16 @@ public class KinesisEventBatchProcessor : BatchProcessor public static IKinesisEventBatchProcessor Instance => - _instance ??= new KinesisEventBatchProcessor(PowertoolsConfigurations.Instance); - - /// - /// This is the default constructor - /// - /// - public KinesisEventBatchProcessor(IPowertoolsConfigurations powertoolsConfigurations) : base(powertoolsConfigurations) - { - _instance = this; - } + _instance ??= new KinesisEventBatchProcessor(); /// /// Need default constructor for when consumers create a custom batch processor /// - // ReSharper disable once MemberCanBePrivate.Global - protected KinesisEventBatchProcessor() : this(PowertoolsConfigurations.Instance) + protected KinesisEventBatchProcessor() { + _instance = this; } - + /// /// Return the instance ProcessingResult /// diff --git a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs index 9e5983ef..e74a5a88 100644 --- a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs @@ -1,10 +1,19 @@ +#if NET8_0_OR_GREATER + using System.Text; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +/// +/// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable +/// [Generator] public class UASourceGenerator : IIncrementalGenerator { + /// + /// Initializes the source generator. + /// + /// public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => @@ -29,3 +38,4 @@ internal static void Initialize() } } +#endif \ No newline at end of file diff --git a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/Sqs/SqsBatchProcessor.cs b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/Sqs/SqsBatchProcessor.cs index f7741e52..0f620153 100644 --- a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/Sqs/SqsBatchProcessor.cs +++ b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/Sqs/SqsBatchProcessor.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using Amazon.Lambda.SQSEvents; -using AWS.Lambda.Powertools.Common; namespace AWS.Lambda.Powertools.BatchProcessing.Sqs; @@ -20,22 +19,14 @@ public class SqsBatchProcessor : BatchProcessor, /// Gets the instance. /// /// The instance. - public static ISqsBatchProcessor Instance => _instance ??= new SqsBatchProcessor(PowertoolsConfigurations.Instance); - - /// - /// This is the default constructor - /// - /// - public SqsBatchProcessor(IPowertoolsConfigurations powertoolsConfigurations) : base(powertoolsConfigurations) - { - _instance = this; - } - + public static ISqsBatchProcessor Instance => _instance ??= new SqsBatchProcessor(); + /// /// Need default constructor for when consumers create a custom batch processor /// - protected SqsBatchProcessor() : this(PowertoolsConfigurations.Instance) + public SqsBatchProcessor() { + _instance = this; } /// diff --git a/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsConfigurations.cs b/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsConfigurations.cs index ea25e980..9263c6bf 100644 --- a/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsConfigurations.cs +++ b/libraries/src/AWS.Lambda.Powertools.Common/Core/IPowertoolsConfigurations.cs @@ -127,12 +127,6 @@ public interface IPowertoolsConfigurations /// true if XXXX, false otherwise. bool GetEnvironmentVariableOrDefault(string variable, bool defaultValue); - /// - /// Sets the execution Environment Variable (AWS_SDK_UA_APP_ID) - /// - /// - void SetExecutionEnvironment(T type); - /// /// Gets a value indicating whether [Idempotency is disabled]. /// diff --git a/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsConfigurations.cs b/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsConfigurations.cs index e6b6f644..051c5c33 100644 --- a/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsConfigurations.cs +++ b/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsConfigurations.cs @@ -182,12 +182,6 @@ public bool GetEnvironmentVariableOrDefault(string variable, bool defaultValue) public bool TracingDisabled => GetEnvironmentVariableOrDefault(Constants.TracingDisabledEnv, false); - /// - public void SetExecutionEnvironment(T type) - { - _powertoolsEnvironment.SetExecutionEnvironment(type); - } - /// public bool IdempotencyDisabled => GetEnvironmentVariableOrDefault(Constants.IdempotencyDisabledEnv, false); diff --git a/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/SourceGenerators/UASourceGenerator.cs index 22e2d015..11099e0c 100644 --- a/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/SourceGenerators/UASourceGenerator.cs @@ -2,9 +2,16 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +/// +/// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable +/// [Generator] public class UASourceGenerator : IIncrementalGenerator { + /// + /// Initializes the source generator. + /// + /// public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => diff --git a/libraries/src/AWS.Lambda.Powertools.EventHandler/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.EventHandler/SourceGenerators/UASourceGenerator.cs index 4ef9f3ea..87304a10 100644 --- a/libraries/src/AWS.Lambda.Powertools.EventHandler/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.EventHandler/SourceGenerators/UASourceGenerator.cs @@ -2,9 +2,16 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +/// +/// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable +/// [Generator] public class UASourceGenerator : IIncrementalGenerator { + /// + /// Initializes the source generator. + /// + /// public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => diff --git a/libraries/src/AWS.Lambda.Powertools.Idempotency/Idempotency.cs b/libraries/src/AWS.Lambda.Powertools.Idempotency/Idempotency.cs index 3e953e73..d8dcdf75 100644 --- a/libraries/src/AWS.Lambda.Powertools.Idempotency/Idempotency.cs +++ b/libraries/src/AWS.Lambda.Powertools.Idempotency/Idempotency.cs @@ -26,15 +26,6 @@ public sealed class Idempotency /// public BasePersistenceStore PersistenceStore { get; private set; } = null!; - /// - /// Idempotency Constructor - /// - /// - internal Idempotency(IPowertoolsConfigurations powertoolsConfigurations) - { - powertoolsConfigurations.SetExecutionEnvironment(this); - } - /// /// Set Idempotency options /// @@ -56,7 +47,7 @@ private void SetPersistenceStore(BasePersistenceStore persistenceStore) /// /// Holds the idempotency Instance: /// - internal static Idempotency Instance { get; } = new(PowertoolsConfigurations.Instance); + internal static Idempotency Instance { get; } = new(); /// /// Use this method to configure persistence layer (mandatory) and idempotency options (optional) diff --git a/libraries/src/AWS.Lambda.Powertools.Idempotency/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Idempotency/SourceGenerators/UASourceGenerator.cs index 10e7f987..1df3232c 100644 --- a/libraries/src/AWS.Lambda.Powertools.Idempotency/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Idempotency/SourceGenerators/UASourceGenerator.cs @@ -1,10 +1,19 @@ +#if NET8_0_OR_GREATER + using System.Text; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +/// +/// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable +/// [Generator] public class UASourceGenerator : IIncrementalGenerator { + /// + /// Initializes the source generator. + /// + /// public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => @@ -29,3 +38,5 @@ internal static void Initialize() } } +#endif + diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/SourceGenerators/UASourceGenerator.cs index 123608ec..4ba7cc80 100644 --- a/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/SourceGenerators/UASourceGenerator.cs @@ -2,9 +2,16 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +/// +/// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable +/// [Generator] public class UASourceGenerator : IIncrementalGenerator { + /// + /// Initializes the source generator. + /// + /// public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Json/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Kafka.Json/SourceGenerators/UASourceGenerator.cs index 48c12204..4e7cbea9 100644 --- a/libraries/src/AWS.Lambda.Powertools.Kafka.Json/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Json/SourceGenerators/UASourceGenerator.cs @@ -2,9 +2,16 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +/// +/// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable +/// [Generator] public class UASourceGenerator : IIncrementalGenerator { + /// + /// Initializes the source generator. + /// + /// public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/SourceGenerators/UASourceGenerator.cs index d2cf2b5b..abd22c97 100644 --- a/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/SourceGenerators/UASourceGenerator.cs @@ -2,9 +2,16 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +/// +/// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable +/// [Generator] public class UASourceGenerator : IIncrementalGenerator { + /// + /// Initializes the source generator. + /// + /// public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => diff --git a/libraries/src/AWS.Lambda.Powertools.Logging/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Logging/SourceGenerators/UASourceGenerator.cs index d52ce8aa..11131779 100644 --- a/libraries/src/AWS.Lambda.Powertools.Logging/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Logging/SourceGenerators/UASourceGenerator.cs @@ -1,10 +1,19 @@ +#if NET8_0_OR_GREATER + using System.Text; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +/// +/// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable +/// [Generator] public class UASourceGenerator : IIncrementalGenerator { + /// + /// Initializes the source generator. + /// + /// public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => @@ -28,3 +37,5 @@ internal static void Initialize() }); } } + +#endif \ No newline at end of file diff --git a/libraries/src/AWS.Lambda.Powertools.Metrics/Metrics.cs b/libraries/src/AWS.Lambda.Powertools.Metrics/Metrics.cs index 9cf95ec5..60baa362 100644 --- a/libraries/src/AWS.Lambda.Powertools.Metrics/Metrics.cs +++ b/libraries/src/AWS.Lambda.Powertools.Metrics/Metrics.cs @@ -163,7 +163,6 @@ internal Metrics(IPowertoolsConfigurations powertoolsConfigurations, string name _disabled = _powertoolsConfigurations.MetricsDisabled; Instance = this; - _powertoolsConfigurations.SetExecutionEnvironment(this); // set namespace and service always SetNamespace(nameSpace); diff --git a/libraries/src/AWS.Lambda.Powertools.Metrics/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Metrics/SourceGenerators/UASourceGenerator.cs index 44c718fb..9c5d44d4 100644 --- a/libraries/src/AWS.Lambda.Powertools.Metrics/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Metrics/SourceGenerators/UASourceGenerator.cs @@ -1,10 +1,19 @@ +#if NET8_0_OR_GREATER + using System.Text; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +/// +/// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable +/// [Generator] public class UASourceGenerator : IIncrementalGenerator { + /// + /// Initializes the source generator. + /// + /// public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => @@ -29,3 +38,4 @@ internal static void Initialize() } } +#endif diff --git a/libraries/src/AWS.Lambda.Powertools.Parameters/Internal/Provider/ParameterProviderBaseHandler.cs b/libraries/src/AWS.Lambda.Powertools.Parameters/Internal/Provider/ParameterProviderBaseHandler.cs index 05bc237c..43ed80db 100644 --- a/libraries/src/AWS.Lambda.Powertools.Parameters/Internal/Provider/ParameterProviderBaseHandler.cs +++ b/libraries/src/AWS.Lambda.Powertools.Parameters/Internal/Provider/ParameterProviderBaseHandler.cs @@ -13,7 +13,6 @@ * permissions and limitations under the License. */ -using AWS.Lambda.Powertools.Common; using AWS.Lambda.Powertools.Parameters.Cache; using AWS.Lambda.Powertools.Parameters.Configuration; using AWS.Lambda.Powertools.Parameters.Internal.Cache; @@ -90,16 +89,13 @@ internal class ParameterProviderBaseHandler : IParameterProviderBaseHandler /// The parameter provider GetAsync callback handler. /// The parameter provider GetMultipleAsync callback handler. /// The CacheMode. - /// The Powertools for AWS Lambda (.NET) configurations. internal ParameterProviderBaseHandler(GetAsyncDelegate getAsyncHandler, GetMultipleAsyncDelegate getMultipleAsyncHandler, - ParameterProviderCacheMode cacheMode, - IPowertoolsConfigurations powertoolsConfigurations) + ParameterProviderCacheMode cacheMode) { _getAsyncHandler = getAsyncHandler; _getMultipleAsyncHandler = getMultipleAsyncHandler; _cacheMode = cacheMode; - powertoolsConfigurations.SetExecutionEnvironment(this); } /// diff --git a/libraries/src/AWS.Lambda.Powertools.Parameters/Provider/ParameterProvider.cs b/libraries/src/AWS.Lambda.Powertools.Parameters/Provider/ParameterProvider.cs index e2f6c1f4..f7e43589 100644 --- a/libraries/src/AWS.Lambda.Powertools.Parameters/Provider/ParameterProvider.cs +++ b/libraries/src/AWS.Lambda.Powertools.Parameters/Provider/ParameterProvider.cs @@ -13,7 +13,6 @@ * permissions and limitations under the License. */ -using AWS.Lambda.Powertools.Common; using AWS.Lambda.Powertools.Parameters.Cache; using AWS.Lambda.Powertools.Parameters.Transform; using AWS.Lambda.Powertools.Parameters.Configuration; @@ -38,8 +37,7 @@ public abstract class ParameterProvider : IParameterProvider _handler ??= new ParameterProviderBaseHandler( GetAsync, GetMultipleAsync, - CacheMode, - PowertoolsConfigurations.Instance + CacheMode ); /// diff --git a/libraries/src/AWS.Lambda.Powertools.Parameters/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Parameters/SourceGenerators/UASourceGenerator.cs index 744f16b7..559abe30 100644 --- a/libraries/src/AWS.Lambda.Powertools.Parameters/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Parameters/SourceGenerators/UASourceGenerator.cs @@ -1,10 +1,19 @@ +#if NET8_0_OR_GREATER + using System.Text; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +/// +/// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable +/// [Generator] public class UASourceGenerator : IIncrementalGenerator { + /// + /// Initializes the source generator. + /// + /// public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => @@ -29,3 +38,4 @@ internal static void Initialize() } } +#endif diff --git a/libraries/src/AWS.Lambda.Powertools.Tracing/AWS.Lambda.Powertools.Tracing.csproj b/libraries/src/AWS.Lambda.Powertools.Tracing/AWS.Lambda.Powertools.Tracing.csproj index 550a8e83..427c55db 100644 --- a/libraries/src/AWS.Lambda.Powertools.Tracing/AWS.Lambda.Powertools.Tracing.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Tracing/AWS.Lambda.Powertools.Tracing.csproj @@ -6,7 +6,6 @@ Powertools for AWS Lambda (.NET) - Tracing package. AWS.Lambda.Powertools.Tracing AWS.Lambda.Powertools.Tracing - true diff --git a/libraries/src/AWS.Lambda.Powertools.Tracing/Internal/XRayRecorder.cs b/libraries/src/AWS.Lambda.Powertools.Tracing/Internal/XRayRecorder.cs index 0d4aa658..c333dc71 100644 --- a/libraries/src/AWS.Lambda.Powertools.Tracing/Internal/XRayRecorder.cs +++ b/libraries/src/AWS.Lambda.Powertools.Tracing/Internal/XRayRecorder.cs @@ -15,8 +15,6 @@ namespace AWS.Lambda.Powertools.Tracing.Internal; internal class XRayRecorder : IXRayRecorder { private static IAWSXRayRecorder _awsxRayRecorder; - private static IPowertoolsConfigurations _powertoolsConfigurations; - /// /// The instance /// @@ -32,9 +30,7 @@ internal class XRayRecorder : IXRayRecorder public XRayRecorder(IAWSXRayRecorder awsxRayRecorder, IPowertoolsConfigurations powertoolsConfigurations) { _instance = this; - _powertoolsConfigurations = powertoolsConfigurations; - _powertoolsConfigurations.SetExecutionEnvironment(this); - _isLambda = _powertoolsConfigurations.IsLambdaEnvironment; + _isLambda = powertoolsConfigurations.IsLambdaEnvironment; _awsxRayRecorder = awsxRayRecorder; } diff --git a/libraries/src/AWS.Lambda.Powertools.Tracing/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Tracing/SourceGenerators/UASourceGenerator.cs index 119024b3..d39db6d1 100644 --- a/libraries/src/AWS.Lambda.Powertools.Tracing/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Tracing/SourceGenerators/UASourceGenerator.cs @@ -1,10 +1,19 @@ +#if NET8_0_OR_GREATER + using System.Text; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +/// +/// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable +/// [Generator] public class UASourceGenerator : IIncrementalGenerator { + /// + /// Initializes the source generator. + /// + /// public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => @@ -29,3 +38,4 @@ internal static void Initialize() } } +#endif \ No newline at end of file diff --git a/libraries/src/Directory.Build.props b/libraries/src/Directory.Build.props index d9350a0c..82e9bd0b 100644 --- a/libraries/src/Directory.Build.props +++ b/libraries/src/Directory.Build.props @@ -17,7 +17,8 @@ true true $(VersionSuffix) - + RS1041 + RS1036 diff --git a/libraries/tests/AWS.Lambda.Powertools.BatchProcessing.Tests/BatchProcessingTests.cs b/libraries/tests/AWS.Lambda.Powertools.BatchProcessing.Tests/BatchProcessingTests.cs index a59866e7..e1738657 100644 --- a/libraries/tests/AWS.Lambda.Powertools.BatchProcessing.Tests/BatchProcessingTests.cs +++ b/libraries/tests/AWS.Lambda.Powertools.BatchProcessing.Tests/BatchProcessingTests.cs @@ -61,8 +61,8 @@ public async Task SqsBatchProcessor_StandardQueue_ContinueOnBatchItemFailure() } } }; - var configurations = Substitute.For(); - var batchProcessor = new SqsBatchProcessor(configurations); + + var batchProcessor = new SqsBatchProcessor(); var recordHandler = Substitute.For>(); recordHandler.WhenForAnyArgs(x => x.HandleAsync(Arg.Any(), Arg.Any())) @@ -108,8 +108,8 @@ public async Task SqsBatchProcessor_FifoQueue_StopOnFirstBatchItemFailure_FirstI } } }; - var configurations = Substitute.For(); - var batchProcessor = new SqsBatchProcessor(configurations); + + var batchProcessor = new SqsBatchProcessor(); var recordHandler = Substitute.For>(); @@ -159,8 +159,8 @@ public async Task SqsBatchProcessor_FifoQueue_StopOnFirstBatchItemFailure_Second } } }; - var configurations = Substitute.For(); - var batchProcessor = new SqsBatchProcessor(configurations); + + var batchProcessor = new SqsBatchProcessor(); var recordHandler = Substitute.For>(); recordHandler.WhenForAnyArgs(x => x.HandleAsync(Arg.Any(), Arg.Any())) @@ -209,8 +209,8 @@ public async Task SqsBatchProcessor_Parallel_StandardQueue_ContinueOnBatchItemFa } } }; - var configurations = Substitute.For(); - var batchProcessor = new SqsBatchProcessor(configurations); + + var batchProcessor = new SqsBatchProcessor(); var recordHandler = Substitute.For>(); recordHandler.WhenForAnyArgs(x => x.HandleAsync(Arg.Any(), Arg.Any())) diff --git a/libraries/tests/AWS.Lambda.Powertools.BatchProcessing.Tests/Internal/BatchProcessingInternalTests.cs b/libraries/tests/AWS.Lambda.Powertools.BatchProcessing.Tests/Internal/BatchProcessingInternalTests.cs deleted file mode 100644 index 8010af86..00000000 --- a/libraries/tests/AWS.Lambda.Powertools.BatchProcessing.Tests/Internal/BatchProcessingInternalTests.cs +++ /dev/null @@ -1,62 +0,0 @@ -using AWS.Lambda.Powertools.BatchProcessing.DynamoDb; -using AWS.Lambda.Powertools.BatchProcessing.Kinesis; -using AWS.Lambda.Powertools.BatchProcessing.Sqs; -using AWS.Lambda.Powertools.Common; -using NSubstitute; -using Xunit; - -namespace AWS.Lambda.Powertools.BatchProcessing.Tests.Internal; - -public class BatchProcessingInternalTests -{ - [Fact] - public void BatchProcessing_Set_Execution_Environment_Context_SQS() - { - // Arrange - var env = new PowertoolsEnvironment(); - var conf = new PowertoolsConfigurations(env); - - // Act - var sqsBatchProcessor = new SqsBatchProcessor(conf); - - // Assert - Assert.Contains($"{Constants.FeatureContextIdentifier}/BatchProcessing/", - env.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); - - Assert.NotNull(sqsBatchProcessor); - } - - [Fact] - public void BatchProcessing_Set_Execution_Environment_Context_Kinesis() - { - // Arrange - var env = new PowertoolsEnvironment(); - var conf = new PowertoolsConfigurations(env); - - // Act - var KinesisEventBatchProcessor = new KinesisEventBatchProcessor(conf); - - // Assert - Assert.Contains($"{Constants.FeatureContextIdentifier}/BatchProcessing/", - env.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); - - Assert.NotNull(KinesisEventBatchProcessor); - } - - [Fact] - public void BatchProcessing_Set_Execution_Environment_Context_DynamoDB() - { - // Arrange - var env = new PowertoolsEnvironment(); - var conf = new PowertoolsConfigurations(env); - - // Act - var dynamoDbStreamBatchProcessor = new DynamoDbStreamBatchProcessor(conf); - - // Assert - Assert.Contains($"{Constants.FeatureContextIdentifier}/BatchProcessing/", - env.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); - - Assert.NotNull(dynamoDbStreamBatchProcessor); - } -} \ No newline at end of file diff --git a/libraries/tests/AWS.Lambda.Powertools.Common.Tests/Core/PowertoolsConfigurationsTest.cs b/libraries/tests/AWS.Lambda.Powertools.Common.Tests/Core/PowertoolsConfigurationsTest.cs index 934a162c..5e450307 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Common.Tests/Core/PowertoolsConfigurationsTest.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Common.Tests/Core/PowertoolsConfigurationsTest.cs @@ -533,27 +533,6 @@ public void IsLambdaEnvironment_WhenEnvironmentHasValue_ReturnsTrue() Assert.True(result); } - [Fact] - public void Set_Lambda_Execution_Context() - { - // Arrange - var environment = Substitute.For(); - - // environment.Setup(c => - // c.SetExecutionEnvironment(GetType()) - // ); - - var configurations = new PowertoolsConfigurations(environment); - - // Act - configurations.SetExecutionEnvironment(typeof(PowertoolsConfigurations)); - - // Assert - // method with correct type was called - environment.Received(1) - .SetExecutionEnvironment(Arg.Is(i => i == typeof(PowertoolsConfigurations))); - } - #endregion } } \ No newline at end of file diff --git a/libraries/tests/AWS.Lambda.Powertools.Idempotency.Tests/Internal/IdempotentAspectTests.cs b/libraries/tests/AWS.Lambda.Powertools.Idempotency.Tests/Internal/IdempotentAspectTests.cs index e2aaec27..31d5a1be 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Idempotency.Tests/Internal/IdempotentAspectTests.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Idempotency.Tests/Internal/IdempotentAspectTests.cs @@ -245,24 +245,6 @@ public async Task Handle_WhenIdempotencyDisabled_ShouldJustRunTheFunction(Type t function.HandlerExecuted.Should().BeTrue(); } - [Fact] - public void Idempotency_Set_Execution_Environment_Context() - { - // Arrange - - var env = new PowertoolsEnvironment(); - var conf = new PowertoolsConfigurations(env); - - // Act - var xRayRecorder = new Idempotency(conf); - - // Assert - Assert.Contains($"{Constants.FeatureContextIdentifier}/Idempotency/", - env.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); - - Assert.NotNull(xRayRecorder); - } - [Fact] public async Task Handle_WhenIdempotencyOnSubMethodAnnotated_AndFirstCall_ShouldPutInStore() { diff --git a/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/PowertoolsLoggerTest.cs b/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/PowertoolsLoggerTest.cs index 37f4f2a9..addd28e4 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/PowertoolsLoggerTest.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/PowertoolsLoggerTest.cs @@ -1333,31 +1333,6 @@ public void Log_WhenMemoryStream_LogsBase64String_UnsafeRelaxedJsonEscaping() )); } - [Fact] - public void Log_Set_Execution_Environment_Context() - { - // Arrange - var loggerName = Guid.NewGuid().ToString(); - - var env = new PowertoolsEnvironment(); - // Act - var configurations = new PowertoolsConfigurations(env); - - var loggerConfiguration = new PowertoolsLoggerConfiguration - { - Service = null, - MinimumLogLevel = LogLevel.None - }; - - var provider = new PowertoolsLoggerProvider(loggerConfiguration, configurations); - var logger = provider.CreateLogger(loggerName); - logger.LogInformation("Test"); - - // Assert - Assert.Contains($"{Constants.FeatureContextIdentifier}/Logging/", - env.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); - } - [Fact] public void Log_Skip_If_Exists_Execution_Environment_Context() { diff --git a/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/MetricsTests.cs b/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/MetricsTests.cs index d3dadde8..a91e1a43 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/MetricsTests.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/MetricsTests.cs @@ -12,22 +12,6 @@ namespace AWS.Lambda.Powertools.Metrics.Tests; [Collection("Sequential")] public class MetricsTests { - [Fact] - public void Metrics_Set_Execution_Environment_Context() - { - // Arrange - Metrics.ResetForTest(); - var env = new PowertoolsEnvironment(); - - var conf = new PowertoolsConfigurations(env); - - _ = new Metrics(conf); - - // Assert - Assert.Contains($"{Constants.FeatureContextIdentifier}/Metrics/", - env.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); - } - [Fact] public void Before_When_RaiseOnEmptyMetricsNotSet_Should_Configure_Null() { diff --git a/libraries/tests/AWS.Lambda.Powertools.Parameters.Tests/Provider/ParameterProviderTest.cs b/libraries/tests/AWS.Lambda.Powertools.Parameters.Tests/Provider/ParameterProviderTest.cs index 90bc453c..56e486b3 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Parameters.Tests/Provider/ParameterProviderTest.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Parameters.Tests/Provider/ParameterProviderTest.cs @@ -52,14 +52,11 @@ public async Task GetAsync_WhenCachedObjectExists_ReturnsCachedObject() var cacheManager = Substitute.For(); cacheManager.Get(key).Returns(valueFromCache); - - var powertoolsConfigurations = Substitute.For(); - + var providerHandler = new ParameterProviderBaseHandler( providerProxy.GetAsync, providerProxy.GetMultipleAsync, - ParameterProviderCacheMode.All, - powertoolsConfigurations); + ParameterProviderCacheMode.All); providerHandler.SetCacheManager(cacheManager); @@ -69,7 +66,7 @@ public async Task GetAsync_WhenCachedObjectExists_ReturnsCachedObject() // Assert cacheManager.Received(1).Get(key); await providerProxy.DidNotReceive().GetAsync(key, Arg.Any()); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); Assert.Equal(valueFromCache, result); } @@ -92,14 +89,11 @@ public async Task GetAsync_WhenForceFetch_IgnoresCachedObject() var cacheManager = Substitute.For(); cacheManager.Get(key).Returns(valueFromCache); - - var powertoolsConfigurations = Substitute.For(); - + var providerHandler = new ParameterProviderBaseHandler( providerProxy.GetAsync, providerProxy.GetMultipleAsync, - ParameterProviderCacheMode.All, - powertoolsConfigurations); + ParameterProviderCacheMode.All); providerHandler.SetCacheManager(cacheManager); @@ -109,7 +103,7 @@ public async Task GetAsync_WhenForceFetch_IgnoresCachedObject() // Assert cacheManager.DidNotReceive().Get(key); await providerProxy.Received(1).GetAsync(key, Arg.Is(x => x!.ForceFetch)); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); Assert.Equal(value, result); } @@ -128,14 +122,11 @@ public async Task GetAsync_WhenMaxAgeNotSet_StoresCachedObjectWithDefaultMaxAge( var cacheManager = Substitute.For(); cacheManager.Get(key).Returns(null); - - var powertoolsConfigurations = Substitute.For(); - + var providerHandler = new ParameterProviderBaseHandler( providerProxy.GetAsync, providerProxy.GetMultipleAsync, - ParameterProviderCacheMode.All, - powertoolsConfigurations); + ParameterProviderCacheMode.All); providerHandler.SetCacheManager(cacheManager); @@ -146,7 +137,6 @@ public async Task GetAsync_WhenMaxAgeNotSet_StoresCachedObjectWithDefaultMaxAge( cacheManager.Received(1).Get(key); await providerProxy.Received(1).GetAsync(key, Arg.Any()); cacheManager.Received(1).Set(key, value, duration); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); Assert.NotNull(result); Assert.Equal(value, result); } @@ -170,13 +160,10 @@ public async Task GetAsync_WhenMaxAgeSet_StoresCachedObjectWithMaxAge() var cacheManager = Substitute.For(); cacheManager.Get(key).Returns(null); - var powertoolsConfigurations = Substitute.For(); - var providerHandler = new ParameterProviderBaseHandler( providerProxy.GetAsync, providerProxy.GetMultipleAsync, - ParameterProviderCacheMode.All, - powertoolsConfigurations); + ParameterProviderCacheMode.All); providerHandler.SetCacheManager(cacheManager); @@ -187,7 +174,7 @@ public async Task GetAsync_WhenMaxAgeSet_StoresCachedObjectWithMaxAge() cacheManager.Received(1).Get(key); await providerProxy.Received(1).GetAsync(key, Arg.Any()); cacheManager.Received(1).Set(key, value, duration); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); Assert.Equal(value, result); } @@ -212,13 +199,10 @@ public async Task GetAsync_WhenCacheModeIsGetResultOnly_StoresCachedObject() var cacheManager = Substitute.For(); cacheManager.Get(key).Returns(null); - var powertoolsConfigurations = Substitute.For(); - var providerHandler = new ParameterProviderBaseHandler( providerProxy.GetAsync, providerProxy.GetMultipleAsync, - cacheMode, - powertoolsConfigurations); + cacheMode); providerHandler.SetCacheManager(cacheManager); @@ -229,7 +213,7 @@ public async Task GetAsync_WhenCacheModeIsGetResultOnly_StoresCachedObject() cacheManager.Received(1).Get(key); await providerProxy.Received(1).GetAsync(key, Arg.Any()); cacheManager.Received(1).Set(key, value, duration); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); Assert.Equal(value, result); } @@ -253,14 +237,11 @@ public async Task GetAsync_WhenCacheModeIsGetMultipleResultOnly_DoesNotStoreCach var cacheManager = Substitute.For(); cacheManager.Get(key).Returns(null); - - var powertoolsConfigurations = Substitute.For(); - + var providerHandler = new ParameterProviderBaseHandler( providerProxy.GetAsync, providerProxy.GetMultipleAsync, - cacheMode, - powertoolsConfigurations); + cacheMode); providerHandler.SetCacheManager(cacheManager); @@ -271,7 +252,7 @@ public async Task GetAsync_WhenCacheModeIsGetMultipleResultOnly_DoesNotStoreCach cacheManager.Received(1).Get(key); await providerProxy.Received(1).GetAsync(key, Arg.Any()); cacheManager.Received(0).Set(key, value, duration); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); Assert.Equal(value, result); } @@ -296,13 +277,10 @@ public async Task GetAsync_WhenCacheModeIsDisabled_DoesNotStoreCachedObject() var cacheManager = Substitute.For(); cacheManager.Get(key).Returns(null); - var powertoolsConfigurations = Substitute.For(); - var providerHandler = new ParameterProviderBaseHandler( providerProxy.GetAsync, providerProxy.GetMultipleAsync, - cacheMode, - powertoolsConfigurations); + cacheMode); providerHandler.SetCacheManager(cacheManager); @@ -313,7 +291,7 @@ public async Task GetAsync_WhenCacheModeIsDisabled_DoesNotStoreCachedObject() cacheManager.Received(1).Get(key); await providerProxy.Received(1).GetAsync(key, Arg.Any()); cacheManager.Received(0).Set(key, value, duration); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); Assert.Equal(value, result); } @@ -342,13 +320,10 @@ public async Task GetAsync_WhenTransformerSet_ReturnsTransformedValue() var cacheManager = Substitute.For(); cacheManager.Get(key).Returns(null); - var powertoolsConfigurations = Substitute.For(); - var providerHandler = new ParameterProviderBaseHandler( providerProxy.GetAsync, providerProxy.GetMultipleAsync, - ParameterProviderCacheMode.All, - powertoolsConfigurations); + ParameterProviderCacheMode.All); providerHandler.SetCacheManager(cacheManager); @@ -360,7 +335,7 @@ public async Task GetAsync_WhenTransformerSet_ReturnsTransformedValue() await providerProxy.Received(1).GetAsync(key, Arg.Any()); transformer.Received(1).Transform(value); cacheManager.Received(1).Set(key, transformedValue, duration); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); Assert.Equal(transformedValue, result); } @@ -387,14 +362,11 @@ public async Task GetAsync_WhenTransformerNameSet_ReturnsTransformedValue() var cacheManager = Substitute.For(); cacheManager.Get(key).Returns(null); - - var powertoolsConfigurations = Substitute.For(); - + var providerHandler = new ParameterProviderBaseHandler( providerProxy.GetAsync, providerProxy.GetMultipleAsync, - ParameterProviderCacheMode.All, - powertoolsConfigurations); + ParameterProviderCacheMode.All); providerHandler.SetCacheManager(cacheManager); providerHandler.SetTransformerManager(transformerManager); @@ -407,7 +379,7 @@ public async Task GetAsync_WhenTransformerNameSet_ReturnsTransformedValue() await providerProxy.Received(1).GetAsync(key, Arg.Any()); transformer.Received(1).Transform(value); cacheManager.Received(1).Set(key, transformedValue, duration); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); Assert.Equal(transformedValue, result); } @@ -435,13 +407,10 @@ public async Task GetAsync_WhenJsonTransformationSet_ReturnsTransformedValue() var cacheManager = Substitute.For(); cacheManager.Get(key).Returns(null); - var powertoolsConfigurations = Substitute.For(); - var providerHandler = new ParameterProviderBaseHandler( providerProxy.GetAsync, providerProxy.GetMultipleAsync, - ParameterProviderCacheMode.All, - powertoolsConfigurations); + ParameterProviderCacheMode.All); providerHandler.SetCacheManager(cacheManager); providerHandler.SetTransformerManager(transformerManager); @@ -454,7 +423,7 @@ public async Task GetAsync_WhenJsonTransformationSet_ReturnsTransformedValue() await providerProxy.Received(1).GetAsync(key, Arg.Any()); transformer.Received(1).Transform(value); cacheManager.Received(1).Set(key, transformedValue, duration); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); Assert.Equal(transformedValue, result); } @@ -480,13 +449,12 @@ public async Task GetAsync_WhenRaiseTransformationErrorNotSet_ReturnsNullOnError var cacheManager = Substitute.For(); cacheManager.Get(key).Returns(null); - var powertoolsConfigurations = Substitute.For(); + var providerHandler = new ParameterProviderBaseHandler( providerProxy.GetAsync, providerProxy.GetMultipleAsync, - ParameterProviderCacheMode.All, - powertoolsConfigurations); + ParameterProviderCacheMode.All); providerHandler.SetCacheManager(cacheManager); providerHandler.SetTransformerManager(transformerManager); @@ -499,7 +467,7 @@ public async Task GetAsync_WhenRaiseTransformationErrorNotSet_ReturnsNullOnError await providerProxy.Received(1).GetAsync(key, Arg.Any()); transformer.Received(1).Transform(value); cacheManager.DidNotReceive().Set(Arg.Any(), Arg.Any(), Arg.Any()); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.Null(result); } @@ -525,13 +493,12 @@ public async Task GetAsync_WhenRaiseTransformationErrorSet_ThrowsException() var cacheManager = Substitute.For(); cacheManager.Get(key).Returns(null); - var powertoolsConfigurations = Substitute.For(); + var providerHandler = new ParameterProviderBaseHandler( providerProxy.GetAsync, providerProxy.GetMultipleAsync, - ParameterProviderCacheMode.All, - powertoolsConfigurations); + ParameterProviderCacheMode.All); providerHandler.SetCacheManager(cacheManager); providerHandler.SetTransformerManager(transformerManager); @@ -542,7 +509,7 @@ public async Task GetAsync_WhenRaiseTransformationErrorSet_ThrowsException() // Assert await Assert.ThrowsAsync(Act); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + } #endregion @@ -571,11 +538,11 @@ public async Task GetMultipleAsync_WhenCachedObjectExists_ReturnsCachedObject() var cacheManager = Substitute.For(); cacheManager.Get(key).Returns(valueFromCache); - var powertoolsConfigurations = Substitute.For(); + var providerHandler = new ParameterProviderBaseHandler(providerProxy.GetAsync, providerProxy.GetMultipleAsync, - ParameterProviderCacheMode.All, powertoolsConfigurations); + ParameterProviderCacheMode.All); providerHandler.SetCacheManager(cacheManager); // Act @@ -584,7 +551,7 @@ public async Task GetMultipleAsync_WhenCachedObjectExists_ReturnsCachedObject() // Assert cacheManager.Received(1).Get(key); await providerProxy.Received(0).GetMultipleAsync(key, Arg.Any()); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); Assert.Equal(valueFromCache, result); } @@ -615,11 +582,11 @@ public async Task GetMultipleAsync_WhenForceFetch_IgnoresCachedObject() var cacheManager = Substitute.For(); cacheManager.Get(key).Returns(valueFromCache); - var powertoolsConfigurations = Substitute.For(); + var providerHandler = new ParameterProviderBaseHandler(providerProxy.GetAsync, providerProxy.GetMultipleAsync, - ParameterProviderCacheMode.All, powertoolsConfigurations); + ParameterProviderCacheMode.All); providerHandler.SetCacheManager(cacheManager); // Act @@ -629,7 +596,7 @@ public async Task GetMultipleAsync_WhenForceFetch_IgnoresCachedObject() // Assert cacheManager.Received(0).Get(key); await providerProxy.Received(1).GetMultipleAsync(key, Arg.Any()); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); Assert.Equal(value, result); } @@ -652,11 +619,11 @@ public async Task GetMultipleAsync_WhenMaxAgeNotSet_StoresCachedObjectWithDefaul var cacheManager = Substitute.For(); cacheManager.Get(key).Returns(null); - var powertoolsConfigurations = Substitute.For(); + var providerHandler = new ParameterProviderBaseHandler(providerProxy.GetAsync, providerProxy.GetMultipleAsync, - ParameterProviderCacheMode.All, powertoolsConfigurations); + ParameterProviderCacheMode.All); providerHandler.SetCacheManager(cacheManager); // Act @@ -671,7 +638,7 @@ public async Task GetMultipleAsync_WhenMaxAgeNotSet_StoresCachedObjectWithDefaul x.Last().Key == value.Last().Key && x.Last().Value == value.Last().Value && x.Count == value.Count), duration); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); Assert.Equal(value, result); } @@ -698,11 +665,11 @@ public async Task GetMultipleAsync_WhenMaxAgeSet_StoresCachedObjectWithMaxAge() var cacheManager = Substitute.For(); cacheManager.Get(key).Returns(null); - var powertoolsConfigurations = Substitute.For(); + var providerHandler = new ParameterProviderBaseHandler(providerProxy.GetAsync, providerProxy.GetMultipleAsync, - ParameterProviderCacheMode.All, powertoolsConfigurations); + ParameterProviderCacheMode.All); providerHandler.SetCacheManager(cacheManager); // Act @@ -717,7 +684,7 @@ public async Task GetMultipleAsync_WhenMaxAgeSet_StoresCachedObjectWithMaxAge() x.Last().Key == value.Last().Key && x.Last().Value == value.Last().Value && x.Count == value.Count), duration); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); Assert.Equal(value, result); } @@ -745,11 +712,11 @@ public async Task GetMultipleAsync_WhenCacheModeIsGetMultipleResultOnly_StoresCa var cacheManager = Substitute.For(); cacheManager.Get(key).Returns(null); - var powertoolsConfigurations = Substitute.For(); + var providerHandler = new ParameterProviderBaseHandler(providerProxy.GetAsync, providerProxy.GetMultipleAsync, - cacheMode, powertoolsConfigurations); + cacheMode); providerHandler.SetCacheManager(cacheManager); // Act @@ -763,7 +730,7 @@ public async Task GetMultipleAsync_WhenCacheModeIsGetMultipleResultOnly_StoresCa x.Last().Key == value.Last().Key && x.Last().Value == value.Last().Value && x.Count == value.Count), duration); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); Assert.Equal(value, result); } @@ -791,11 +758,11 @@ public async Task GetMultipleAsync_WhenCacheModeIsGetResultOnly_DoesNotStoreCach var cacheManager = Substitute.For(); cacheManager.Get(key).Returns(null); - var powertoolsConfigurations = Substitute.For(); + var providerHandler = new ParameterProviderBaseHandler(providerProxy.GetAsync, providerProxy.GetMultipleAsync, - cacheMode, powertoolsConfigurations); + cacheMode); providerHandler.SetCacheManager(cacheManager); // Act @@ -804,7 +771,7 @@ public async Task GetMultipleAsync_WhenCacheModeIsGetResultOnly_DoesNotStoreCach // Assert await providerProxy.Received(1).GetMultipleAsync(key, Arg.Any()); cacheManager.DidNotReceiveWithAnyArgs().Set(Arg.Any(), Arg.Any(), Arg.Any()); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); Assert.Equal(value, result); } @@ -832,11 +799,11 @@ public async Task GetMultipleAsync_WhenCacheModeDisabled_DoesNotStoreCachedObjec var cacheManager = Substitute.For(); cacheManager.Get(key).Returns(null); - var powertoolsConfigurations = Substitute.For(); + var providerHandler = new ParameterProviderBaseHandler(providerProxy.GetAsync, providerProxy.GetMultipleAsync, - cacheMode, powertoolsConfigurations); + cacheMode); providerHandler.SetCacheManager(cacheManager); // Act @@ -845,7 +812,7 @@ public async Task GetMultipleAsync_WhenCacheModeDisabled_DoesNotStoreCachedObjec // Assert await providerProxy.Received(1).GetMultipleAsync(key, Arg.Any()); cacheManager.DidNotReceiveWithAnyArgs().Set(Arg.Any(), Arg.Any(), Arg.Any()); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); Assert.Equal(value, result); } @@ -882,11 +849,11 @@ public async Task GetMultipleAsync_WhenTransformerSet_ReturnsTransformedValue() var cacheManager = Substitute.For(); cacheManager.Get(path).Returns(null); - var powertoolsConfigurations = Substitute.For(); + var providerHandler = new ParameterProviderBaseHandler(providerProxy.GetAsync, providerProxy.GetMultipleAsync, - ParameterProviderCacheMode.All, powertoolsConfigurations); + ParameterProviderCacheMode.All); providerHandler.SetCacheManager(cacheManager); // Act @@ -906,7 +873,7 @@ public async Task GetMultipleAsync_WhenTransformerSet_ReturnsTransformedValue() o.Last().Value == transformedValue.Last().Value ), duration); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); } @@ -941,11 +908,11 @@ public async Task GetMultipleAsync_WhenTransformerNameSet_ReturnsTransformedValu var cacheManager = Substitute.For(); cacheManager.Get(path).Returns(null); - var powertoolsConfigurations = Substitute.For(); + var providerHandler = new ParameterProviderBaseHandler(providerProxy.GetAsync, providerProxy.GetMultipleAsync, - ParameterProviderCacheMode.All, powertoolsConfigurations); + ParameterProviderCacheMode.All); providerHandler.SetCacheManager(cacheManager); providerHandler.SetTransformerManager(transformerManager); @@ -967,7 +934,7 @@ public async Task GetMultipleAsync_WhenTransformerNameSet_ReturnsTransformedValu o.Last().Value == transformedValue.Last().Value ), duration); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); } @@ -1002,13 +969,12 @@ public async Task GetMultipleAsync_WhenTransformationSet_ReturnsTransformedValue var cacheManager = Substitute.For(); cacheManager.Get(path).Returns(null); - var powertoolsConfigurations = Substitute.For(); + var providerHandler = new ParameterProviderBaseHandler( providerProxy.GetAsync, providerProxy.GetMultipleAsync, - ParameterProviderCacheMode.All, - powertoolsConfigurations); + ParameterProviderCacheMode.All); providerHandler.SetCacheManager(cacheManager); providerHandler.SetTransformerManager(transformerManager); @@ -1030,7 +996,7 @@ public async Task GetMultipleAsync_WhenTransformationSet_ReturnsTransformedValue o.Last().Value == transformedValue.Last().Value ), duration); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); } @@ -1074,13 +1040,12 @@ public async Task GetMultipleAsync_WhenTransformationAuto_ReturnsTransformedValu var cacheManager = Substitute.For(); cacheManager.Get(path).Returns(null); - var powertoolsConfigurations = Substitute.For(); + var providerHandler = new ParameterProviderBaseHandler( providerProxy.GetAsync, providerProxy.GetMultipleAsync, - ParameterProviderCacheMode.All, - powertoolsConfigurations); + ParameterProviderCacheMode.All); providerHandler.SetCacheManager(cacheManager); providerHandler.SetTransformerManager(transformerManager); @@ -1102,7 +1067,7 @@ public async Task GetMultipleAsync_WhenTransformationAuto_ReturnsTransformedValu o.Last().Value == transformedValue.Last().Value ), duration); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); } @@ -1135,13 +1100,12 @@ public async Task GetMultipleAsync_WhenRaiseTransformationErrorNotSet_ReturnsNul var cacheManager = Substitute.For(); cacheManager.Get(path).Returns(null); - var powertoolsConfigurations = Substitute.For(); + var providerHandler = new ParameterProviderBaseHandler( providerProxy.GetAsync, providerProxy.GetMultipleAsync, - ParameterProviderCacheMode.All, - powertoolsConfigurations); + ParameterProviderCacheMode.All); providerHandler.SetCacheManager(cacheManager); providerHandler.SetTransformerManager(transformerManager); @@ -1163,7 +1127,7 @@ public async Task GetMultipleAsync_WhenRaiseTransformationErrorNotSet_ReturnsNul o.Last().Value == transformedValue ), duration); - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + Assert.NotNull(result); } @@ -1196,13 +1160,12 @@ public async Task GetMultipleAsync_WhenRaiseTransformationErrorSet_ThrowsExcepti var cacheManager = Substitute.For(); cacheManager.Get(path).Returns(null); - var powertoolsConfigurations = Substitute.For(); + var providerHandler = new ParameterProviderBaseHandler( providerProxy.GetAsync, providerProxy.GetMultipleAsync, - ParameterProviderCacheMode.All, - powertoolsConfigurations); + ParameterProviderCacheMode.All); providerHandler.SetCacheManager(cacheManager); providerHandler.SetTransformerManager(transformerManager); @@ -1213,7 +1176,7 @@ public async Task GetMultipleAsync_WhenRaiseTransformationErrorSet_ThrowsExcepti await providerHandler.GetMultipleAsync(path, null, transformation, null); // Assert - powertoolsConfigurations.Received(1).SetExecutionEnvironment(providerHandler); + await Assert.ThrowsAsync(Act); } diff --git a/libraries/tests/AWS.Lambda.Powertools.SourceGenerator.Tests/AWS.Lambda.Powertools.SourceGenerator.Tests.csproj b/libraries/tests/AWS.Lambda.Powertools.SourceGenerator.Tests/AWS.Lambda.Powertools.SourceGenerator.Tests.csproj index 081b9f20..0686442e 100644 --- a/libraries/tests/AWS.Lambda.Powertools.SourceGenerator.Tests/AWS.Lambda.Powertools.SourceGenerator.Tests.csproj +++ b/libraries/tests/AWS.Lambda.Powertools.SourceGenerator.Tests/AWS.Lambda.Powertools.SourceGenerator.Tests.csproj @@ -1,7 +1,10 @@ + - net8.0 + AWS.Lambda.Powertools.SourceGenerator.Tests + AWS.Lambda.Powertools.SourceGenerator.Tests + net8.0 enable enable diff --git a/libraries/tests/AWS.Lambda.Powertools.Tracing.Tests/XRayRecorderTests.cs b/libraries/tests/AWS.Lambda.Powertools.Tracing.Tests/XRayRecorderTests.cs index acc8b546..47b2159c 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Tracing.Tests/XRayRecorderTests.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Tracing.Tests/XRayRecorderTests.cs @@ -12,25 +12,6 @@ namespace AWS.Lambda.Powertools.Tracing.Tests; [Collection("Sequential")] public class XRayRecorderTests { - [Fact] - public void Tracing_Set_Execution_Environment_Context() - { - // Arrange - var env = new PowertoolsEnvironment(); - - var conf = new PowertoolsConfigurations(env); - var awsXray = Substitute.For(); - - // Act - var xRayRecorder = new XRayRecorder(awsXray, conf); - - // Assert - Assert.Contains($"{Constants.FeatureContextIdentifier}/Tracing/", - env.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); - - Assert.NotNull(xRayRecorder); - } - [Fact] public void Tracing_Instance() { From 5a17bdff744dbcdde62009ca929b53f5802c85fb Mon Sep 17 00:00:00 2001 From: Henrique Graca <999396+hjgraca@users.noreply.github.com> Date: Tue, 29 Jul 2025 09:23:38 +0100 Subject: [PATCH 5/9] chore: update CodeAnalysis dependency usage and refine UA environment variable handling - Replace Microsoft.CodeAnalysis.Analyzers and CSharp with Microsoft.CodeAnalysis.Common in central package management and project files - Add Microsoft.CodeAnalysis.Common package reference to relevant projects - Remove unused source generator file reference from Kafka project - Refactor PowertoolsEnvironment to improve UA environment variable string construction and PTENV placement logic - Update UASetter test to use ITestOutputHelper and add assertions for PTENV position and output --- ...S.Lambda.Powertools.BatchProcessing.csproj | 1 + .../AWS.Lambda.Powertools.Common.csproj | 2 -- .../Core/PowertoolsEnvironment.cs | 29 +++++++------------ ...ers.BedrockAgentFunction.AspNetCore.csproj | 1 + ...dler.Resolvers.BedrockAgentFunction.csproj | 1 + .../AWS.Lambda.Powertools.EventHandler.csproj | 2 ++ .../AWS.Lambda.Powertools.Idempotency.csproj | 1 + .../AWS.Lambda.Powertools.Kafka.Avro.csproj | 1 + .../AWS.Lambda.Powertools.Kafka.Json.csproj | 4 +++ ...WS.Lambda.Powertools.Kafka.Protobuf.csproj | 1 + .../AWS.Lambda.Powertools.Kafka.csproj | 5 ---- .../AWS.Lambda.Powertools.Logging.csproj | 1 + .../AWS.Lambda.Powertools.Metrics.csproj | 1 + .../AWS.Lambda.Powertools.Parameters.csproj | 1 + .../AWS.Lambda.Powertools.Tracing.csproj | 1 + libraries/src/Directory.Packages.props | 3 +- .../UAGenerator/UASetter.cs | 9 +++++- 17 files changed, 35 insertions(+), 29 deletions(-) diff --git a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/AWS.Lambda.Powertools.BatchProcessing.csproj b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/AWS.Lambda.Powertools.BatchProcessing.csproj index 54af1670..f095e5aa 100644 --- a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/AWS.Lambda.Powertools.BatchProcessing.csproj +++ b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/AWS.Lambda.Powertools.BatchProcessing.csproj @@ -13,6 +13,7 @@ + diff --git a/libraries/src/AWS.Lambda.Powertools.Common/AWS.Lambda.Powertools.Common.csproj b/libraries/src/AWS.Lambda.Powertools.Common/AWS.Lambda.Powertools.Common.csproj index 83e02c1f..83378deb 100644 --- a/libraries/src/AWS.Lambda.Powertools.Common/AWS.Lambda.Powertools.Common.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Common/AWS.Lambda.Powertools.Common.csproj @@ -14,8 +14,6 @@ - - \ No newline at end of file diff --git a/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsEnvironment.cs b/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsEnvironment.cs index a4eb9ce0..cf0279fe 100644 --- a/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsEnvironment.cs +++ b/libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsEnvironment.cs @@ -74,38 +74,29 @@ public void SetExecutionEnvironment(T type, string utilityName = null) const string envName = Constants.AWSSdkUAAppId; var currentEnvValue = GetEnvironmentVariable(envName); var assemblyName = utilityName != null ? $"{Constants.FeatureContextIdentifier}/{utilityName}" : ParseAssemblyName(GetAssemblyName(type)); + var assemblyVersion = GetAssemblyVersion(type); + var newEntry = $"{assemblyName}/{assemblyVersion}"; - // Check for duplication early if (!string.IsNullOrEmpty(currentEnvValue) && currentEnvValue.Contains(assemblyName)) { return; } - var assemblyVersion = GetAssemblyVersion(type); - var newEntry = $"{assemblyName}/{assemblyVersion}"; - string finalValue; - + var ptenvIndex = currentEnvValue?.IndexOf("PTENV/") ?? -1; + if (string.IsNullOrEmpty(currentEnvValue)) { - // First entry: "PT/Assembly/1.0.0 PTENV/AWS_LAMBDA_DOTNET8" finalValue = $"{newEntry} {CachedRuntimeEnvironment}"; } + else if (ptenvIndex >= 0) + { + // Insert newEntry before PTENV + finalValue = $"{currentEnvValue.Substring(0, ptenvIndex).TrimEnd()} {newEntry} {currentEnvValue.Substring(ptenvIndex)}".Trim(); + } else { - // Check if PTENV already exists in one pass - var containsPtenv = currentEnvValue.Contains("PTENV/"); - - if (containsPtenv) - { - // Just append the new entry: "existing PT/Assembly/1.0.0" - finalValue = $"{currentEnvValue} {newEntry}"; - } - else - { - // Append new entry + PTENV: "existing PT/Assembly/1.0.0 PTENV/AWS_LAMBDA_DOTNET8" - finalValue = $"{currentEnvValue} {newEntry} {CachedRuntimeEnvironment}"; - } + finalValue = $"{currentEnvValue} {newEntry} {CachedRuntimeEnvironment}"; } SetEnvironmentVariable(envName, finalValue); diff --git a/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.AspNetCore/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.AspNetCore.csproj b/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.AspNetCore/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.AspNetCore.csproj index 5e5c6666..35757a76 100644 --- a/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.AspNetCore/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.AspNetCore.csproj +++ b/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.AspNetCore/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.AspNetCore.csproj @@ -15,6 +15,7 @@ + diff --git a/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.csproj b/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.csproj index b0a7db73..cd77baea 100644 --- a/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.csproj +++ b/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.csproj @@ -15,6 +15,7 @@ + diff --git a/libraries/src/AWS.Lambda.Powertools.EventHandler/AWS.Lambda.Powertools.EventHandler.csproj b/libraries/src/AWS.Lambda.Powertools.EventHandler/AWS.Lambda.Powertools.EventHandler.csproj index 04f632fe..11607212 100644 --- a/libraries/src/AWS.Lambda.Powertools.EventHandler/AWS.Lambda.Powertools.EventHandler.csproj +++ b/libraries/src/AWS.Lambda.Powertools.EventHandler/AWS.Lambda.Powertools.EventHandler.csproj @@ -15,6 +15,8 @@ + + diff --git a/libraries/src/AWS.Lambda.Powertools.Idempotency/AWS.Lambda.Powertools.Idempotency.csproj b/libraries/src/AWS.Lambda.Powertools.Idempotency/AWS.Lambda.Powertools.Idempotency.csproj index 00150b72..79d16013 100644 --- a/libraries/src/AWS.Lambda.Powertools.Idempotency/AWS.Lambda.Powertools.Idempotency.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Idempotency/AWS.Lambda.Powertools.Idempotency.csproj @@ -15,6 +15,7 @@ + diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/AWS.Lambda.Powertools.Kafka.Avro.csproj b/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/AWS.Lambda.Powertools.Kafka.Avro.csproj index bb074161..0def96d1 100644 --- a/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/AWS.Lambda.Powertools.Kafka.Avro.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/AWS.Lambda.Powertools.Kafka.Avro.csproj @@ -21,6 +21,7 @@ + diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Json/AWS.Lambda.Powertools.Kafka.Json.csproj b/libraries/src/AWS.Lambda.Powertools.Kafka.Json/AWS.Lambda.Powertools.Kafka.Json.csproj index 3c5ec81c..56fcea9e 100644 --- a/libraries/src/AWS.Lambda.Powertools.Kafka.Json/AWS.Lambda.Powertools.Kafka.Json.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Json/AWS.Lambda.Powertools.Kafka.Json.csproj @@ -18,6 +18,10 @@ $(DefineConstants);KAFKA_JSON + + + + diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/AWS.Lambda.Powertools.Kafka.Protobuf.csproj b/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/AWS.Lambda.Powertools.Kafka.Protobuf.csproj index eef17873..b83c37a2 100644 --- a/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/AWS.Lambda.Powertools.Kafka.Protobuf.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/AWS.Lambda.Powertools.Kafka.Protobuf.csproj @@ -20,6 +20,7 @@ + diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka/AWS.Lambda.Powertools.Kafka.csproj b/libraries/src/AWS.Lambda.Powertools.Kafka/AWS.Lambda.Powertools.Kafka.csproj index 609d6742..040a2734 100644 --- a/libraries/src/AWS.Lambda.Powertools.Kafka/AWS.Lambda.Powertools.Kafka.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Kafka/AWS.Lambda.Powertools.Kafka.csproj @@ -17,9 +17,4 @@ - - - - - diff --git a/libraries/src/AWS.Lambda.Powertools.Logging/AWS.Lambda.Powertools.Logging.csproj b/libraries/src/AWS.Lambda.Powertools.Logging/AWS.Lambda.Powertools.Logging.csproj index ccf8c3ea..92a44dea 100644 --- a/libraries/src/AWS.Lambda.Powertools.Logging/AWS.Lambda.Powertools.Logging.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Logging/AWS.Lambda.Powertools.Logging.csproj @@ -16,6 +16,7 @@ + diff --git a/libraries/src/AWS.Lambda.Powertools.Metrics/AWS.Lambda.Powertools.Metrics.csproj b/libraries/src/AWS.Lambda.Powertools.Metrics/AWS.Lambda.Powertools.Metrics.csproj index 77ec07a3..fa623086 100644 --- a/libraries/src/AWS.Lambda.Powertools.Metrics/AWS.Lambda.Powertools.Metrics.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Metrics/AWS.Lambda.Powertools.Metrics.csproj @@ -9,6 +9,7 @@ + diff --git a/libraries/src/AWS.Lambda.Powertools.Parameters/AWS.Lambda.Powertools.Parameters.csproj b/libraries/src/AWS.Lambda.Powertools.Parameters/AWS.Lambda.Powertools.Parameters.csproj index 526f6694..3b02b783 100644 --- a/libraries/src/AWS.Lambda.Powertools.Parameters/AWS.Lambda.Powertools.Parameters.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Parameters/AWS.Lambda.Powertools.Parameters.csproj @@ -20,6 +20,7 @@ + diff --git a/libraries/src/AWS.Lambda.Powertools.Tracing/AWS.Lambda.Powertools.Tracing.csproj b/libraries/src/AWS.Lambda.Powertools.Tracing/AWS.Lambda.Powertools.Tracing.csproj index 427c55db..0ce622d3 100644 --- a/libraries/src/AWS.Lambda.Powertools.Tracing/AWS.Lambda.Powertools.Tracing.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Tracing/AWS.Lambda.Powertools.Tracing.csproj @@ -16,6 +16,7 @@ + diff --git a/libraries/src/Directory.Packages.props b/libraries/src/Directory.Packages.props index 5413794c..c75c47b2 100644 --- a/libraries/src/Directory.Packages.props +++ b/libraries/src/Directory.Packages.props @@ -16,8 +16,7 @@ - - + diff --git a/libraries/tests/AWS.Lambda.Powertools.SourceGenerator.Tests/UAGenerator/UASetter.cs b/libraries/tests/AWS.Lambda.Powertools.SourceGenerator.Tests/UAGenerator/UASetter.cs index 458e20fa..e6c40b18 100644 --- a/libraries/tests/AWS.Lambda.Powertools.SourceGenerator.Tests/UAGenerator/UASetter.cs +++ b/libraries/tests/AWS.Lambda.Powertools.SourceGenerator.Tests/UAGenerator/UASetter.cs @@ -1,13 +1,16 @@ using System.Text.RegularExpressions; +using Xunit.Abstractions; namespace AWS.Lambda.Powertools.SourceGenerator.Tests; public class UASetter { + private readonly ITestOutputHelper _output; private readonly string? _appId; - public UASetter() + public UASetter(ITestOutputHelper output) { + _output = output; _appId = Environment.GetEnvironmentVariable("AWS_SDK_UA_APP_ID"); } @@ -17,6 +20,9 @@ public void Is_PTENV_Set() Assert.NotNull(_appId); Assert.Contains("PTENV/AWS_LAMBDA_DOTNET8", _appId); CheckUtilityOnlyAppearsOnce(_appId); + _output.WriteLine(_appId); + // check that it is last in the string + Assert.EndsWith("PTENV/AWS_LAMBDA_DOTNET8", _appId, StringComparison.OrdinalIgnoreCase); } [Theory] @@ -38,6 +44,7 @@ public void Is_Utility_Set(string utility) Assert.Contains($"PT/{utility}/1.0.0", appId); CheckUtilityOnlyAppearsOnce(appId); + _output.WriteLine(_appId); } private static void CheckUtilityOnlyAppearsOnce(string appId) From ac4fa6ff52fbe78786ea0cf612fb5da5930e6edb Mon Sep 17 00:00:00 2001 From: Henrique Graca <999396+hjgraca@users.noreply.github.com> Date: Tue, 29 Jul 2025 15:13:24 +0100 Subject: [PATCH 6/9] chore: refactor UA environment initialization with EnvWrapper and update source generator output - Introduce EnvWrapper helper in each utility for setting execution environment - Update source generator to use EnvWrapper in generated module initializers - Add IncludeExecutionEnvironment property to project files for conditional EnvWrapper inclusion - Add Directory.Build.targets to automate EnvWrapper generation in Release builds --- ...S.Lambda.Powertools.BatchProcessing.csproj | 1 + .../Internal/EnvWrapper.cs | 12 +++++++ .../SourceGenerators/UASourceGenerator.cs | 31 ++++++++--------- ...dler.Resolvers.BedrockAgentFunction.csproj | 1 + .../Internal/EnvWrapper.cs | 12 +++++++ .../SourceGenerators/UASourceGenerator.cs | 31 ++++++++--------- .../AWS.Lambda.Powertools.EventHandler.csproj | 1 + .../Internal/EnvWrapper.cs | 12 +++++++ .../SourceGenerators/UASourceGenerator.cs | 31 ++++++++--------- .../AWS.Lambda.Powertools.Idempotency.csproj | 1 + .../Internal/EnvWrapper.cs | 12 +++++++ .../SourceGenerators/UASourceGenerator.cs | 31 ++++++++--------- .../AWS.Lambda.Powertools.Kafka.Avro.csproj | 1 + .../Internal/EnvWrapper.cs | 12 +++++++ .../SourceGenerators/UASourceGenerator.cs | 33 ++++++++++--------- .../AWS.Lambda.Powertools.Kafka.Json.csproj | 1 + .../Internal/EnvWrapper.cs | 12 +++++++ .../SourceGenerators/UASourceGenerator.cs | 31 ++++++++--------- ...WS.Lambda.Powertools.Kafka.Protobuf.csproj | 1 + .../Internal/EnvWrapper.cs | 12 +++++++ .../SourceGenerators/UASourceGenerator.cs | 31 ++++++++--------- .../AWS.Lambda.Powertools.Logging.csproj | 1 + .../Internal/EnvWrapper.cs | 11 +++++++ .../SourceGenerators/UASourceGenerator.cs | 32 +++++++++--------- .../AWS.Lambda.Powertools.Metrics.csproj | 1 + .../Internal/EnvWrapper.cs | 11 +++++++ .../SourceGenerators/UASourceGenerator.cs | 31 ++++++++--------- .../AWS.Lambda.Powertools.Parameters.csproj | 1 + .../Internal/EnvWrapper.cs | 11 +++++++ .../SourceGenerators/UASourceGenerator.cs | 31 ++++++++--------- .../AWS.Lambda.Powertools.Tracing.csproj | 3 +- .../Internal/EnvWrapper.cs | 11 +++++++ .../SourceGenerators/UASourceGenerator.cs | 31 ++++++++--------- libraries/src/DIrectory.Build.targets | 30 +++++++++++++++++ 34 files changed, 347 insertions(+), 168 deletions(-) create mode 100644 libraries/src/AWS.Lambda.Powertools.BatchProcessing/Internal/EnvWrapper.cs create mode 100644 libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/Internal/EnvWrapper.cs create mode 100644 libraries/src/AWS.Lambda.Powertools.EventHandler/Internal/EnvWrapper.cs create mode 100644 libraries/src/AWS.Lambda.Powertools.Idempotency/Internal/EnvWrapper.cs create mode 100644 libraries/src/AWS.Lambda.Powertools.Kafka.Avro/Internal/EnvWrapper.cs create mode 100644 libraries/src/AWS.Lambda.Powertools.Kafka.Json/Internal/EnvWrapper.cs create mode 100644 libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/Internal/EnvWrapper.cs create mode 100644 libraries/src/AWS.Lambda.Powertools.Logging/Internal/EnvWrapper.cs create mode 100644 libraries/src/AWS.Lambda.Powertools.Metrics/Internal/EnvWrapper.cs create mode 100644 libraries/src/AWS.Lambda.Powertools.Parameters/Internal/EnvWrapper.cs create mode 100644 libraries/src/AWS.Lambda.Powertools.Tracing/Internal/EnvWrapper.cs create mode 100644 libraries/src/DIrectory.Build.targets diff --git a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/AWS.Lambda.Powertools.BatchProcessing.csproj b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/AWS.Lambda.Powertools.BatchProcessing.csproj index f095e5aa..21d7abf4 100644 --- a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/AWS.Lambda.Powertools.BatchProcessing.csproj +++ b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/AWS.Lambda.Powertools.BatchProcessing.csproj @@ -6,6 +6,7 @@ AWS.Lambda.Powertools.BatchProcessing AWS.Lambda.Powertools.BatchProcessing true + true diff --git a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/Internal/EnvWrapper.cs b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/Internal/EnvWrapper.cs new file mode 100644 index 00000000..ad25349c --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/Internal/EnvWrapper.cs @@ -0,0 +1,12 @@ +using AWS.Lambda.Powertools.Common; + +namespace AWS.Lambda.Powertools.BatchProcessing.Internal +{ + public static class EnvWrapper + { + public static void SetExecutionEnvironment() + { + PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(EnvWrapper)); + } + } +} \ No newline at end of file diff --git a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs index e74a5a88..d79f0510 100644 --- a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs @@ -18,22 +18,23 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => { - var source = @"// -using System.Runtime.CompilerServices; -using AWS.Lambda.Powertools.Common; + var source = """ + // + using System.Runtime.CompilerServices; -namespace PowertoolsGenerated -{ - internal static class UAModuleInitializerBatchProcessing - { - [ModuleInitializer] - internal static void Initialize() - { - PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.BatchProcessing.ProcessingOptions)); - } - } -}"; - ctx.AddSource("UAModuleInitializerBatchProcessing.g.cs", SourceText.From(source, Encoding.UTF8)); + namespace AWS.Lambda.Powertools.BatchProcessing.Internal + { + internal static class UAModuleInitializer + { + [ModuleInitializer] + internal static void Initialize() + { + EnvWrapper.SetExecutionEnvironment(); + } + } + } + """; + ctx.AddSource("UAModuleInitializer.g.cs", SourceText.From(source, Encoding.UTF8)); }); } } diff --git a/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.csproj b/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.csproj index cd77baea..d403653f 100644 --- a/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.csproj +++ b/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.csproj @@ -10,6 +10,7 @@ enable true true + true diff --git a/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/Internal/EnvWrapper.cs b/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/Internal/EnvWrapper.cs new file mode 100644 index 00000000..09aa077a --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/Internal/EnvWrapper.cs @@ -0,0 +1,12 @@ +using AWS.Lambda.Powertools.Common; + +namespace AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.Internal +{ + public static class EnvWrapper + { + public static void SetExecutionEnvironment() + { + PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(EnvWrapper)); + } + } +} \ No newline at end of file diff --git a/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/SourceGenerators/UASourceGenerator.cs index 11099e0c..de7d22be 100644 --- a/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/SourceGenerators/UASourceGenerator.cs @@ -16,22 +16,23 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => { - var source = @"// -using System.Runtime.CompilerServices; -using AWS.Lambda.Powertools.Common; + var source = """ + // + using System.Runtime.CompilerServices; -namespace PowertoolsGenerated -{ - internal static class UAModuleInitializerBedrockAgentFunctionResolver - { - [ModuleInitializer] - internal static void Initialize() - { - PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunctionResolver)); - } - } -}"; - ctx.AddSource("UAModuleInitializerBedrockAgentFunctionResolver.g.cs", SourceText.From(source, Encoding.UTF8)); + namespace AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.Internal + { + internal static class UAModuleInitializer + { + [ModuleInitializer] + internal static void Initialize() + { + EnvWrapper.SetExecutionEnvironment(); + } + } + } + """; + ctx.AddSource("UAModuleInitializer.g.cs", SourceText.From(source, Encoding.UTF8)); }); } } diff --git a/libraries/src/AWS.Lambda.Powertools.EventHandler/AWS.Lambda.Powertools.EventHandler.csproj b/libraries/src/AWS.Lambda.Powertools.EventHandler/AWS.Lambda.Powertools.EventHandler.csproj index 11607212..2e5d5400 100644 --- a/libraries/src/AWS.Lambda.Powertools.EventHandler/AWS.Lambda.Powertools.EventHandler.csproj +++ b/libraries/src/AWS.Lambda.Powertools.EventHandler/AWS.Lambda.Powertools.EventHandler.csproj @@ -11,6 +11,7 @@ enable enable true + true diff --git a/libraries/src/AWS.Lambda.Powertools.EventHandler/Internal/EnvWrapper.cs b/libraries/src/AWS.Lambda.Powertools.EventHandler/Internal/EnvWrapper.cs new file mode 100644 index 00000000..b3d4b1e8 --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.EventHandler/Internal/EnvWrapper.cs @@ -0,0 +1,12 @@ +using AWS.Lambda.Powertools.Common; + +namespace AWS.Lambda.Powertools.EventHandler.Internal +{ + public static class EnvWrapper + { + public static void SetExecutionEnvironment() + { + PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(EnvWrapper)); + } + } +} \ No newline at end of file diff --git a/libraries/src/AWS.Lambda.Powertools.EventHandler/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.EventHandler/SourceGenerators/UASourceGenerator.cs index 87304a10..00640872 100644 --- a/libraries/src/AWS.Lambda.Powertools.EventHandler/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.EventHandler/SourceGenerators/UASourceGenerator.cs @@ -16,22 +16,23 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => { - var source = @"// -using System.Runtime.CompilerServices; -using AWS.Lambda.Powertools.Common; + var source = """ + // + using System.Runtime.CompilerServices; -namespace PowertoolsGenerated -{ - internal static class UAModuleInitializerEventHandler - { - [ModuleInitializer] - internal static void Initialize() - { - PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.EventHandler.AppSyncEvents.AppSyncEventsResolver)); - } - } -}"; - ctx.AddSource("UAModuleInitializerEventHandler.g.cs", SourceText.From(source, Encoding.UTF8)); + namespace AWS.Lambda.Powertools.EventHandler.Internal + { + internal static class UAModuleInitializer + { + [ModuleInitializer] + internal static void Initialize() + { + EnvWrapper.SetExecutionEnvironment(); + } + } + } + """; + ctx.AddSource("UAModuleInitializer.g.cs", SourceText.From(source, Encoding.UTF8)); }); } } diff --git a/libraries/src/AWS.Lambda.Powertools.Idempotency/AWS.Lambda.Powertools.Idempotency.csproj b/libraries/src/AWS.Lambda.Powertools.Idempotency/AWS.Lambda.Powertools.Idempotency.csproj index 79d16013..1f0fc14e 100644 --- a/libraries/src/AWS.Lambda.Powertools.Idempotency/AWS.Lambda.Powertools.Idempotency.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Idempotency/AWS.Lambda.Powertools.Idempotency.csproj @@ -7,6 +7,7 @@ AWS.Lambda.Powertools.Idempotency AWS.Lambda.Powertools.Idempotency true + true diff --git a/libraries/src/AWS.Lambda.Powertools.Idempotency/Internal/EnvWrapper.cs b/libraries/src/AWS.Lambda.Powertools.Idempotency/Internal/EnvWrapper.cs new file mode 100644 index 00000000..392d6f2e --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.Idempotency/Internal/EnvWrapper.cs @@ -0,0 +1,12 @@ +using AWS.Lambda.Powertools.Common; + +namespace AWS.Lambda.Powertools.Idempotency.Internal +{ + public static class EnvWrapper + { + public static void SetExecutionEnvironment() + { + PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(EnvWrapper)); + } + } +} \ No newline at end of file diff --git a/libraries/src/AWS.Lambda.Powertools.Idempotency/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Idempotency/SourceGenerators/UASourceGenerator.cs index 1df3232c..4dca402b 100644 --- a/libraries/src/AWS.Lambda.Powertools.Idempotency/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Idempotency/SourceGenerators/UASourceGenerator.cs @@ -18,22 +18,23 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => { - var source = @"// -using System.Runtime.CompilerServices; -using AWS.Lambda.Powertools.Common; + var source = """ + // + using System.Runtime.CompilerServices; -namespace PowertoolsGenerated -{ - internal static class UAModuleInitializerIdempotency - { - [ModuleInitializer] - internal static void Initialize() - { - PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.Idempotency.Idempotency)); - } - } -}"; - ctx.AddSource("UAModuleInitializerIdempotency.g.cs", SourceText.From(source, Encoding.UTF8)); + namespace AWS.Lambda.Powertools.Idempotency.Internal + { + internal static class UAModuleInitializer + { + [ModuleInitializer] + internal static void Initialize() + { + EnvWrapper.SetExecutionEnvironment(); + } + } + } + """; + ctx.AddSource("UAModuleInitializer.g.cs", SourceText.From(source, Encoding.UTF8)); }); } } diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/AWS.Lambda.Powertools.Kafka.Avro.csproj b/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/AWS.Lambda.Powertools.Kafka.Avro.csproj index 0def96d1..a72f0e7c 100644 --- a/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/AWS.Lambda.Powertools.Kafka.Avro.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/AWS.Lambda.Powertools.Kafka.Avro.csproj @@ -11,6 +11,7 @@ false enable enable + true diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/Internal/EnvWrapper.cs b/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/Internal/EnvWrapper.cs new file mode 100644 index 00000000..a7dde23f --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/Internal/EnvWrapper.cs @@ -0,0 +1,12 @@ +using AWS.Lambda.Powertools.Common; + +namespace AWS.Lambda.Powertools.Kafka.Avro.Internal +{ + public static class EnvWrapper + { + public static void SetExecutionEnvironment() + { + PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(EnvWrapper), "Kafka.Avro"); + } + } +} \ No newline at end of file diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/SourceGenerators/UASourceGenerator.cs index 4ba7cc80..a8f1bed1 100644 --- a/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/SourceGenerators/UASourceGenerator.cs @@ -16,22 +16,23 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => { - var source = @"// -using System.Runtime.CompilerServices; -using AWS.Lambda.Powertools.Common; - -namespace PowertoolsGenerated -{ - internal static class UAModuleInitializerKafkaAvro - { - [ModuleInitializer] - internal static void Initialize() - { - PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.Kafka.Avro.PowertoolsKafkaAvroSerializer), ""Kafka.Avro""); - } - } -}"; - ctx.AddSource("UAModuleInitializerKafkaAvro.g.cs", SourceText.From(source, Encoding.UTF8)); + var source = """ + // + using System.Runtime.CompilerServices; + + namespace AWS.Lambda.Powertools.Kafka.Avro.Internal + { + internal static class UAModuleInitializer + { + [ModuleInitializer] + internal static void Initialize() + { + EnvWrapper.SetExecutionEnvironment(); + } + } + } + """; + ctx.AddSource("UAModuleInitializer.g.cs", SourceText.From(source, Encoding.UTF8)); }); } } diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Json/AWS.Lambda.Powertools.Kafka.Json.csproj b/libraries/src/AWS.Lambda.Powertools.Kafka.Json/AWS.Lambda.Powertools.Kafka.Json.csproj index 56fcea9e..1a26f5f9 100644 --- a/libraries/src/AWS.Lambda.Powertools.Kafka.Json/AWS.Lambda.Powertools.Kafka.Json.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Json/AWS.Lambda.Powertools.Kafka.Json.csproj @@ -10,6 +10,7 @@ false enable enable + true diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Json/Internal/EnvWrapper.cs b/libraries/src/AWS.Lambda.Powertools.Kafka.Json/Internal/EnvWrapper.cs new file mode 100644 index 00000000..1bdc5e4c --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Json/Internal/EnvWrapper.cs @@ -0,0 +1,12 @@ +using AWS.Lambda.Powertools.Common; + +namespace AWS.Lambda.Powertools.Kafka.Json.Internal +{ + public static class EnvWrapper + { + public static void SetExecutionEnvironment() + { + PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(EnvWrapper), "Kafka.Json"); + } + } +} \ No newline at end of file diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Json/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Kafka.Json/SourceGenerators/UASourceGenerator.cs index 4e7cbea9..a5d3637d 100644 --- a/libraries/src/AWS.Lambda.Powertools.Kafka.Json/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Json/SourceGenerators/UASourceGenerator.cs @@ -16,22 +16,23 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => { - var source = @"// -using System.Runtime.CompilerServices; -using AWS.Lambda.Powertools.Common; + var source = """ + // + using System.Runtime.CompilerServices; -namespace PowertoolsGenerated -{ - internal static class UAModuleInitializerKafkaJson - { - [ModuleInitializer] - internal static void Initialize() - { - PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.Kafka.Json.PowertoolsKafkaJsonSerializer), ""Kafka.Json""); - } - } -}"; - ctx.AddSource("UAModuleInitializerKafkaJson.g.cs", SourceText.From(source, Encoding.UTF8)); + namespace AWS.Lambda.Powertools.Kafka.Json.Internal + { + internal static class UAModuleInitializer + { + [ModuleInitializer] + internal static void Initialize() + { + EnvWrapper.SetExecutionEnvironment(); + } + } + } + """; + ctx.AddSource("UAModuleInitializer.g.cs", SourceText.From(source, Encoding.UTF8)); }); } } diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/AWS.Lambda.Powertools.Kafka.Protobuf.csproj b/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/AWS.Lambda.Powertools.Kafka.Protobuf.csproj index b83c37a2..d424ebfa 100644 --- a/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/AWS.Lambda.Powertools.Kafka.Protobuf.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/AWS.Lambda.Powertools.Kafka.Protobuf.csproj @@ -10,6 +10,7 @@ false enable enable + true diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/Internal/EnvWrapper.cs b/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/Internal/EnvWrapper.cs new file mode 100644 index 00000000..92734b67 --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/Internal/EnvWrapper.cs @@ -0,0 +1,12 @@ +using AWS.Lambda.Powertools.Common; + +namespace AWS.Lambda.Powertools.Kafka.Protobuf.Internal +{ + public static class EnvWrapper + { + public static void SetExecutionEnvironment() + { + PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(EnvWrapper), "Kafka.Protobuf"); + } + } +} \ No newline at end of file diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/SourceGenerators/UASourceGenerator.cs index abd22c97..217e4ca1 100644 --- a/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/SourceGenerators/UASourceGenerator.cs @@ -16,22 +16,23 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => { - var source = @"// -using System.Runtime.CompilerServices; -using AWS.Lambda.Powertools.Common; + var source = """ + // + using System.Runtime.CompilerServices; -namespace PowertoolsGenerated -{ - internal static class UAModuleInitializerKafkaProtobuf - { - [ModuleInitializer] - internal static void Initialize() - { - PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.Kafka.Protobuf.PowertoolsKafkaProtobufSerializer), ""Kafka.Protobuf""); - } - } -}"; - ctx.AddSource("UAModuleInitializerKafkaProtobuf.g.cs", SourceText.From(source, Encoding.UTF8)); + namespace AWS.Lambda.Powertools.Kafka.Protobuf.Internal + { + internal static class UAModuleInitializer + { + [ModuleInitializer] + internal static void Initialize() + { + EnvWrapper.SetExecutionEnvironment(); + } + } + } + """; + ctx.AddSource("UAModuleInitializer.g.cs", SourceText.From(source, Encoding.UTF8)); }); } } diff --git a/libraries/src/AWS.Lambda.Powertools.Logging/AWS.Lambda.Powertools.Logging.csproj b/libraries/src/AWS.Lambda.Powertools.Logging/AWS.Lambda.Powertools.Logging.csproj index 92a44dea..dd19b43b 100644 --- a/libraries/src/AWS.Lambda.Powertools.Logging/AWS.Lambda.Powertools.Logging.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Logging/AWS.Lambda.Powertools.Logging.csproj @@ -7,6 +7,7 @@ AWS.Lambda.Powertools.Logging AWS.Lambda.Powertools.Logging true + true diff --git a/libraries/src/AWS.Lambda.Powertools.Logging/Internal/EnvWrapper.cs b/libraries/src/AWS.Lambda.Powertools.Logging/Internal/EnvWrapper.cs new file mode 100644 index 00000000..5a50f7be --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.Logging/Internal/EnvWrapper.cs @@ -0,0 +1,11 @@ +using AWS.Lambda.Powertools.Common; +namespace AWS.Lambda.Powertools.Logging.Internal +{ +public static class EnvWrapper +{ +public static void SetExecutionEnvironment() +{ +PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(EnvWrapper)); +} +} +} diff --git a/libraries/src/AWS.Lambda.Powertools.Logging/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Logging/SourceGenerators/UASourceGenerator.cs index 11131779..ec92e8a9 100644 --- a/libraries/src/AWS.Lambda.Powertools.Logging/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Logging/SourceGenerators/UASourceGenerator.cs @@ -18,22 +18,24 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => { - var source = @"// -using System.Runtime.CompilerServices; -using AWS.Lambda.Powertools.Common; + var source = """ + // + using System.Runtime.CompilerServices; + using AWS.Lambda.Powertools.Common; -namespace PowertoolsGenerated -{ - internal static class UAModuleInitializerLogging - { - [ModuleInitializer] - internal static void Initialize() - { - PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.Logging.Logger)); - } - } -}"; - ctx.AddSource("UAModuleInitializerLogging.g.cs", SourceText.From(source, Encoding.UTF8)); + namespace AWS.Lambda.Powertools.Logging.Internal + { + internal static class UAModuleInitializer + { + [ModuleInitializer] + internal static void Initialize() + { + EnvWrapper.SetExecutionEnvironment(); + } + } + } + """; + ctx.AddSource("UAModuleInitializer.g.cs", SourceText.From(source, Encoding.UTF8)); }); } } diff --git a/libraries/src/AWS.Lambda.Powertools.Metrics/AWS.Lambda.Powertools.Metrics.csproj b/libraries/src/AWS.Lambda.Powertools.Metrics/AWS.Lambda.Powertools.Metrics.csproj index fa623086..60e71bb3 100644 --- a/libraries/src/AWS.Lambda.Powertools.Metrics/AWS.Lambda.Powertools.Metrics.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Metrics/AWS.Lambda.Powertools.Metrics.csproj @@ -6,6 +6,7 @@ AWS.Lambda.Powertools.Metrics AWS.Lambda.Powertools.Metrics true + true diff --git a/libraries/src/AWS.Lambda.Powertools.Metrics/Internal/EnvWrapper.cs b/libraries/src/AWS.Lambda.Powertools.Metrics/Internal/EnvWrapper.cs new file mode 100644 index 00000000..ecd15649 --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.Metrics/Internal/EnvWrapper.cs @@ -0,0 +1,11 @@ +using AWS.Lambda.Powertools.Common; +namespace AWS.Lambda.Powertools.Metrics.Internal +{ +public static class EnvWrapper +{ +public static void SetExecutionEnvironment() +{ +PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(EnvWrapper)); +} +} +} diff --git a/libraries/src/AWS.Lambda.Powertools.Metrics/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Metrics/SourceGenerators/UASourceGenerator.cs index 9c5d44d4..d2505e43 100644 --- a/libraries/src/AWS.Lambda.Powertools.Metrics/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Metrics/SourceGenerators/UASourceGenerator.cs @@ -18,22 +18,23 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => { - var source = @"// -using System.Runtime.CompilerServices; -using AWS.Lambda.Powertools.Common; + var source = """ + // + using System.Runtime.CompilerServices; -namespace PowertoolsGenerated -{ - internal static class UAModuleInitializerMetrics - { - [ModuleInitializer] - internal static void Initialize() - { - PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.Metrics.Metrics)); - } - } -}"; - ctx.AddSource("UAModuleInitializerMetrics.g.cs", SourceText.From(source, Encoding.UTF8)); + namespace AWS.Lambda.Powertools.Metrics.Internal + { + internal static class UAModuleInitializer + { + [ModuleInitializer] + internal static void Initialize() + { + EnvWrapper.SetExecutionEnvironment(); + } + } + } + """; + ctx.AddSource("UAModuleInitializer.g.cs", SourceText.From(source, Encoding.UTF8)); }); } } diff --git a/libraries/src/AWS.Lambda.Powertools.Parameters/AWS.Lambda.Powertools.Parameters.csproj b/libraries/src/AWS.Lambda.Powertools.Parameters/AWS.Lambda.Powertools.Parameters.csproj index 3b02b783..2d06227e 100644 --- a/libraries/src/AWS.Lambda.Powertools.Parameters/AWS.Lambda.Powertools.Parameters.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Parameters/AWS.Lambda.Powertools.Parameters.csproj @@ -9,6 +9,7 @@ AWS.Lambda.Powertools.Parameters AWS.Lambda.Powertools.Parameters true + true diff --git a/libraries/src/AWS.Lambda.Powertools.Parameters/Internal/EnvWrapper.cs b/libraries/src/AWS.Lambda.Powertools.Parameters/Internal/EnvWrapper.cs new file mode 100644 index 00000000..fdae6c84 --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.Parameters/Internal/EnvWrapper.cs @@ -0,0 +1,11 @@ +using AWS.Lambda.Powertools.Common; +namespace AWS.Lambda.Powertools.Parameters.Internal +{ +public static class EnvWrapper +{ +public static void SetExecutionEnvironment() +{ +PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(EnvWrapper)); +} +} +} diff --git a/libraries/src/AWS.Lambda.Powertools.Parameters/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Parameters/SourceGenerators/UASourceGenerator.cs index 559abe30..c83337b7 100644 --- a/libraries/src/AWS.Lambda.Powertools.Parameters/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Parameters/SourceGenerators/UASourceGenerator.cs @@ -18,22 +18,23 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => { - var source = @"// -using System.Runtime.CompilerServices; -using AWS.Lambda.Powertools.Common; + var source = """ + // + using System.Runtime.CompilerServices; -namespace PowertoolsGenerated -{ - internal static class UAModuleInitializerParameters - { - [ModuleInitializer] - internal static void Initialize() - { - PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.Parameters.ParametersManager)); - } - } -}"; - ctx.AddSource("UAModuleInitializerParameters.g.cs", SourceText.From(source, Encoding.UTF8)); + namespace AWS.Lambda.Powertools.Parameters.Internal + { + internal static class UAModuleInitializer + { + [ModuleInitializer] + internal static void Initialize() + { + EnvWrapper.SetExecutionEnvironment(); + } + } + } + """; + ctx.AddSource("UAModuleInitializer.g.cs", SourceText.From(source, Encoding.UTF8)); }); } } diff --git a/libraries/src/AWS.Lambda.Powertools.Tracing/AWS.Lambda.Powertools.Tracing.csproj b/libraries/src/AWS.Lambda.Powertools.Tracing/AWS.Lambda.Powertools.Tracing.csproj index 0ce622d3..7c4a2491 100644 --- a/libraries/src/AWS.Lambda.Powertools.Tracing/AWS.Lambda.Powertools.Tracing.csproj +++ b/libraries/src/AWS.Lambda.Powertools.Tracing/AWS.Lambda.Powertools.Tracing.csproj @@ -7,6 +7,7 @@ AWS.Lambda.Powertools.Tracing AWS.Lambda.Powertools.Tracing true + true @@ -19,6 +20,4 @@ - - \ No newline at end of file diff --git a/libraries/src/AWS.Lambda.Powertools.Tracing/Internal/EnvWrapper.cs b/libraries/src/AWS.Lambda.Powertools.Tracing/Internal/EnvWrapper.cs new file mode 100644 index 00000000..568ccfa9 --- /dev/null +++ b/libraries/src/AWS.Lambda.Powertools.Tracing/Internal/EnvWrapper.cs @@ -0,0 +1,11 @@ +using AWS.Lambda.Powertools.Common; +namespace AWS.Lambda.Powertools.Tracing.Internal +{ +public static class EnvWrapper +{ +public static void SetExecutionEnvironment() +{ +PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(EnvWrapper)); +} +} +} diff --git a/libraries/src/AWS.Lambda.Powertools.Tracing/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Tracing/SourceGenerators/UASourceGenerator.cs index d39db6d1..80c00f64 100644 --- a/libraries/src/AWS.Lambda.Powertools.Tracing/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Tracing/SourceGenerators/UASourceGenerator.cs @@ -18,22 +18,23 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(ctx => { - var source = @"// -using System.Runtime.CompilerServices; -using AWS.Lambda.Powertools.Common; + var source = """ + // + using System.Runtime.CompilerServices; -namespace PowertoolsGenerated -{ - internal static class UAModuleInitializerTracing - { - [ModuleInitializer] - internal static void Initialize() - { - PowertoolsEnvironment.Instance.SetExecutionEnvironment(typeof(AWS.Lambda.Powertools.Tracing.Tracing)); - } - } -}"; - ctx.AddSource("UAModuleInitializerTracing.g.cs", SourceText.From(source, Encoding.UTF8)); + namespace AWS.Lambda.Powertools.Tracing.Internal + { + internal static class UAModuleInitializer + { + [ModuleInitializer] + internal static void Initialize() + { + EnvWrapper.SetExecutionEnvironment(); + } + } + } + """; + ctx.AddSource("UAModuleInitializer.g.cs", SourceText.From(source, Encoding.UTF8)); }); } } diff --git a/libraries/src/DIrectory.Build.targets b/libraries/src/DIrectory.Build.targets new file mode 100644 index 00000000..e0de40b8 --- /dev/null +++ b/libraries/src/DIrectory.Build.targets @@ -0,0 +1,30 @@ + + + + $(RootNamespace) + $(ProjectDir)Internal/EnvWrapper.cs + + + + + + + + + + + + + + + + + + + + + From a13b8d0cdb5166e4647d37c331d8d467f7f835a7 Mon Sep 17 00:00:00 2001 From: Henrique Graca <999396+hjgraca@users.noreply.github.com> Date: Tue, 29 Jul 2025 15:38:29 +0100 Subject: [PATCH 7/9] chore: update UA app ID test to reflect new environment variable order --- .../Core/PowertoolsEnvironmentTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/tests/AWS.Lambda.Powertools.Common.Tests/Core/PowertoolsEnvironmentTest.cs b/libraries/tests/AWS.Lambda.Powertools.Common.Tests/Core/PowertoolsEnvironmentTest.cs index f571179f..1b3adbe1 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Common.Tests/Core/PowertoolsEnvironmentTest.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Common.Tests/Core/PowertoolsEnvironmentTest.cs @@ -63,7 +63,7 @@ public void Set_Multiple_Execution_Environment() powertoolsEnv.SetExecutionEnvironment(powertoolsEnv.GetType()); // Assert - Assert.Equal($"{Constants.FeatureContextIdentifier}/Tests/1.0.0 PTENV/AWS_LAMBDA_DOTNET{Environment.Version.Major} {Constants.FeatureContextIdentifier}/Common/1.0.0", + Assert.Equal($"{Constants.FeatureContextIdentifier}/Tests/1.0.0 {Constants.FeatureContextIdentifier}/Common/1.0.0 PTENV/AWS_LAMBDA_DOTNET{Environment.Version.Major}", powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")); } From ec061929aa49e06595a985f1664fe23d266cc049 Mon Sep 17 00:00:00 2001 From: Henrique Graca <999396+hjgraca@users.noreply.github.com> Date: Tue, 29 Jul 2025 15:44:46 +0100 Subject: [PATCH 8/9] chore: remove obsolete execution environment setter and update Lambda check field in XRayRecorder --- .../Internal/PowertoolsLoggerProvider.cs | 5 +---- .../AWS.Lambda.Powertools.Tracing/Internal/XRayRecorder.cs | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/libraries/src/AWS.Lambda.Powertools.Logging/Internal/PowertoolsLoggerProvider.cs b/libraries/src/AWS.Lambda.Powertools.Logging/Internal/PowertoolsLoggerProvider.cs index b3788ed4..e9ec415e 100644 --- a/libraries/src/AWS.Lambda.Powertools.Logging/Internal/PowertoolsLoggerProvider.cs +++ b/libraries/src/AWS.Lambda.Powertools.Logging/Internal/PowertoolsLoggerProvider.cs @@ -24,10 +24,7 @@ public PowertoolsLoggerProvider( { _powertoolsConfigurations = powertoolsConfigurations; _currentConfig = config; - - // Remove this line - the source generator now handles setting execution environment - // _powertoolsConfigurations.SetExecutionEnvironment(this); - + // Apply environment configurations if available ConfigureFromEnvironment(); } diff --git a/libraries/src/AWS.Lambda.Powertools.Tracing/Internal/XRayRecorder.cs b/libraries/src/AWS.Lambda.Powertools.Tracing/Internal/XRayRecorder.cs index c333dc71..0c546da2 100644 --- a/libraries/src/AWS.Lambda.Powertools.Tracing/Internal/XRayRecorder.cs +++ b/libraries/src/AWS.Lambda.Powertools.Tracing/Internal/XRayRecorder.cs @@ -38,7 +38,7 @@ public XRayRecorder(IAWSXRayRecorder awsxRayRecorder, IPowertoolsConfigurations /// Checks whether current execution is in AWS Lambda. /// /// Returns true if current execution is in AWS Lambda. - private static bool _isLambda; + private readonly bool _isLambda; /// /// Gets the emitter. From 2c6e7a29f9f9e35609db6a0ade6a1752e396817e Mon Sep 17 00:00:00 2001 From: Henrique Graca <999396+hjgraca@users.noreply.github.com> Date: Tue, 29 Jul 2025 15:49:31 +0100 Subject: [PATCH 9/9] chore: add explicit namespace declarations to UA source generators for each package --- .../SourceGenerators/UASourceGenerator.cs | 2 ++ .../SourceGenerators/UASourceGenerator.cs | 2 ++ .../SourceGenerators/UASourceGenerator.cs | 2 ++ .../SourceGenerators/UASourceGenerator.cs | 2 ++ .../SourceGenerators/UASourceGenerator.cs | 2 ++ .../SourceGenerators/UASourceGenerator.cs | 2 ++ .../SourceGenerators/UASourceGenerator.cs | 2 ++ .../SourceGenerators/UASourceGenerator.cs | 2 ++ .../SourceGenerators/UASourceGenerator.cs | 2 ++ .../SourceGenerators/UASourceGenerator.cs | 2 ++ .../SourceGenerators/UASourceGenerator.cs | 2 ++ 11 files changed, 22 insertions(+) diff --git a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs index d79f0510..a5faf766 100644 --- a/libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.BatchProcessing/SourceGenerators/UASourceGenerator.cs @@ -4,6 +4,8 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +namespace AWS.Lambda.Powertools.BatchProcessing.SourceGenerators; + /// /// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable /// diff --git a/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/SourceGenerators/UASourceGenerator.cs index de7d22be..bb7f3045 100644 --- a/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction/SourceGenerators/UASourceGenerator.cs @@ -2,6 +2,8 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +namespace AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.SourceGenerators; + /// /// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable /// diff --git a/libraries/src/AWS.Lambda.Powertools.EventHandler/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.EventHandler/SourceGenerators/UASourceGenerator.cs index 00640872..d74897cf 100644 --- a/libraries/src/AWS.Lambda.Powertools.EventHandler/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.EventHandler/SourceGenerators/UASourceGenerator.cs @@ -2,6 +2,8 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +namespace AWS.Lambda.Powertools.EventHandler.SourceGenerators; + /// /// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable /// diff --git a/libraries/src/AWS.Lambda.Powertools.Idempotency/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Idempotency/SourceGenerators/UASourceGenerator.cs index 4dca402b..613932f4 100644 --- a/libraries/src/AWS.Lambda.Powertools.Idempotency/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Idempotency/SourceGenerators/UASourceGenerator.cs @@ -4,6 +4,8 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +namespace AWS.Lambda.Powertools.Idempotency.SourceGenerators; + /// /// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable /// diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/SourceGenerators/UASourceGenerator.cs index a8f1bed1..4adc0dd7 100644 --- a/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Avro/SourceGenerators/UASourceGenerator.cs @@ -2,6 +2,8 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +namespace AWS.Lambda.Powertools.Kafka.Avro.SourceGenerators; + /// /// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable /// diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Json/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Kafka.Json/SourceGenerators/UASourceGenerator.cs index a5d3637d..599d7203 100644 --- a/libraries/src/AWS.Lambda.Powertools.Kafka.Json/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Json/SourceGenerators/UASourceGenerator.cs @@ -2,6 +2,8 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +namespace AWS.Lambda.Powertools.Kafka.Json.SourceGenerators; + /// /// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable /// diff --git a/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/SourceGenerators/UASourceGenerator.cs index 217e4ca1..cd07ebd8 100644 --- a/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Kafka.Protobuf/SourceGenerators/UASourceGenerator.cs @@ -2,6 +2,8 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +namespace AWS.Lambda.Powertools.Kafka.Protobuf.SourceGenerators; + /// /// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable /// diff --git a/libraries/src/AWS.Lambda.Powertools.Logging/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Logging/SourceGenerators/UASourceGenerator.cs index ec92e8a9..b5f7a0f1 100644 --- a/libraries/src/AWS.Lambda.Powertools.Logging/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Logging/SourceGenerators/UASourceGenerator.cs @@ -4,6 +4,8 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +namespace AWS.Lambda.Powertools.Logging.SourceGenerators; + /// /// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable /// diff --git a/libraries/src/AWS.Lambda.Powertools.Metrics/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Metrics/SourceGenerators/UASourceGenerator.cs index d2505e43..e7117d76 100644 --- a/libraries/src/AWS.Lambda.Powertools.Metrics/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Metrics/SourceGenerators/UASourceGenerator.cs @@ -4,6 +4,8 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +namespace AWS.Lambda.Powertools.Metrics.SourceGenerators; + /// /// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable /// diff --git a/libraries/src/AWS.Lambda.Powertools.Parameters/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Parameters/SourceGenerators/UASourceGenerator.cs index c83337b7..85c06916 100644 --- a/libraries/src/AWS.Lambda.Powertools.Parameters/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Parameters/SourceGenerators/UASourceGenerator.cs @@ -4,6 +4,8 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +namespace AWS.Lambda.Powertools.Parameters.SourceGenerators; + /// /// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable /// diff --git a/libraries/src/AWS.Lambda.Powertools.Tracing/SourceGenerators/UASourceGenerator.cs b/libraries/src/AWS.Lambda.Powertools.Tracing/SourceGenerators/UASourceGenerator.cs index 80c00f64..5250b33c 100644 --- a/libraries/src/AWS.Lambda.Powertools.Tracing/SourceGenerators/UASourceGenerator.cs +++ b/libraries/src/AWS.Lambda.Powertools.Tracing/SourceGenerators/UASourceGenerator.cs @@ -4,6 +4,8 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; +namespace AWS.Lambda.Powertools.Tracing.SourceGenerators; + /// /// Source generator that automatically sets the AWS_SDK_UA_APP_ID environment variable ///