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); }