diff --git a/libraries/src/AWS.Lambda.Powertools.Metrics/IMetrics.cs b/libraries/src/AWS.Lambda.Powertools.Metrics/IMetrics.cs index 8af956b0..5d33f484 100644 --- a/libraries/src/AWS.Lambda.Powertools.Metrics/IMetrics.cs +++ b/libraries/src/AWS.Lambda.Powertools.Metrics/IMetrics.cs @@ -96,4 +96,9 @@ void PushSingleMetric(string metricName, double value, MetricUnit unit, string n /// /// if set to true [metrics overflow]. void Flush(bool metricsOverflow = false); + + /// + /// Clears both default dimensions and dimensions lists + /// + void ClearDefaultDimensions(); } diff --git a/libraries/src/AWS.Lambda.Powertools.Metrics/Metrics.cs b/libraries/src/AWS.Lambda.Powertools.Metrics/Metrics.cs index 6e1878cc..e5f72186 100644 --- a/libraries/src/AWS.Lambda.Powertools.Metrics/Metrics.cs +++ b/libraries/src/AWS.Lambda.Powertools.Metrics/Metrics.cs @@ -212,6 +212,14 @@ void IMetrics.Flush(bool metricsOverflow) "##WARNING## Metrics and Metadata have not been specified. No data will be sent to Cloudwatch Metrics."); } } + + /// + /// Clears both default dimensions and dimensions lists + /// + void IMetrics.ClearDefaultDimensions() + { + _context.ClearDefaultDimensions(); + } /// /// Serialize global context object @@ -317,6 +325,14 @@ public static void SetDefaultDimensions(Dictionary defaultDimens { _instance.SetDefaultDimensions(defaultDimensions); } + + /// + /// Clears both default dimensions and dimensions lists + /// + public static void ClearDefaultDimensions() + { + _instance.ClearDefaultDimensions(); + } /// /// Flushes metrics in Embedded Metric Format (EMF) to Standard Output. In Lambda, this output is collected diff --git a/libraries/src/AWS.Lambda.Powertools.Metrics/Model/Metadata.cs b/libraries/src/AWS.Lambda.Powertools.Metrics/Model/Metadata.cs index f417e66e..0b656ae2 100644 --- a/libraries/src/AWS.Lambda.Powertools.Metrics/Model/Metadata.cs +++ b/libraries/src/AWS.Lambda.Powertools.Metrics/Model/Metadata.cs @@ -175,4 +175,12 @@ internal Dictionary ExpandAllDimensionSets() return dimensionSets; } + + /// + /// Clears both default dimensions and dimensions lists + /// + internal void ClearDefaultDimensions() + { + _metricDirective.ClearDefaultDimensions(); + } } \ No newline at end of file diff --git a/libraries/src/AWS.Lambda.Powertools.Metrics/Model/MetricDirective.cs b/libraries/src/AWS.Lambda.Powertools.Metrics/Model/MetricDirective.cs index 363636a0..06c0e8ac 100644 --- a/libraries/src/AWS.Lambda.Powertools.Metrics/Model/MetricDirective.cs +++ b/libraries/src/AWS.Lambda.Powertools.Metrics/Model/MetricDirective.cs @@ -225,4 +225,12 @@ internal Dictionary ExpandAllDimensionSets() return dimensions; } + + /// + /// Clears both default dimensions and dimensions lists + /// + internal void ClearDefaultDimensions() + { + DefaultDimensions.Clear(); + } } \ No newline at end of file diff --git a/libraries/src/AWS.Lambda.Powertools.Metrics/Model/MetricsContext.cs b/libraries/src/AWS.Lambda.Powertools.Metrics/Model/MetricsContext.cs index c2a83a42..ba77d0ed 100644 --- a/libraries/src/AWS.Lambda.Powertools.Metrics/Model/MetricsContext.cs +++ b/libraries/src/AWS.Lambda.Powertools.Metrics/Model/MetricsContext.cs @@ -162,4 +162,12 @@ public string Serialize() { return _rootNode.Serialize(); } + + /// + /// Clears both default dimensions and dimensions lists + /// + public void ClearDefaultDimensions() + { + _rootNode.AWS.ClearDefaultDimensions(); + } } \ No newline at end of file diff --git a/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/ClearDimensionsTests.cs b/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/ClearDimensionsTests.cs new file mode 100644 index 00000000..8e28bcbe --- /dev/null +++ b/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/ClearDimensionsTests.cs @@ -0,0 +1,51 @@ +using System; +using System.IO; +using AWS.Lambda.Powertools.Common; +using Moq; +using Xunit; + +namespace AWS.Lambda.Powertools.Metrics.Tests; + +[Collection("Sequential")] +public class ClearDimensionsTests +{ + [Fact] + public void WhenClearAllDimensions_NoDimensionsInOutput() + { + // Arrange + var methodName = Guid.NewGuid().ToString(); + var consoleOut = new StringWriter(); + Console.SetOut(consoleOut); + + var configurations = new Mock(); + + var metrics = new Metrics( + configurations.Object, + nameSpace: "dotnet-powertools-test", + service: "testService" + ); + + var handler = new MetricsAspectHandler( + metrics, + false + ); + + var eventArgs = new AspectEventArgs { Name = methodName }; + + // Act + handler.OnEntry(eventArgs); + + Metrics.ClearDefaultDimensions(); + Metrics.AddMetric($"Metric Name", 1, MetricUnit.Count); + + handler.OnExit(eventArgs); + + var metricsOutput = consoleOut.ToString(); + + // Assert + Assert.Contains("{\"Namespace\":\"dotnet-powertools-test\",\"Metrics\":[{\"Name\":\"Metric Name\",\"Unit\":\"Count\"}],\"Dimensions\":[[]]", metricsOutput); + + // Reset + handler.ResetForTest(); + } +} \ No newline at end of file diff --git a/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/EMFValidationTests.cs b/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/EMFValidationTests.cs index 52b88fe5..79752e4b 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/EMFValidationTests.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/EMFValidationTests.cs @@ -39,7 +39,7 @@ public void WhenCaptureColdStart_CreateSeparateBlob() var configurations = new Mock(); - var logger = new Metrics( + var metrics = new Metrics( configurations.Object, nameSpace: "dotnet-powertools-test", service: "testService", @@ -47,7 +47,7 @@ public void WhenCaptureColdStart_CreateSeparateBlob() ); var handler = new MetricsAspectHandler( - logger, + metrics, captureColdStartEnabled ); @@ -120,14 +120,14 @@ public void When100MetricsAreAdded_FlushAutomatically() var configurations = new Mock(); - var logger = new Metrics( + var metrics = new Metrics( configurations.Object, nameSpace: "dotnet-powertools-test", service: "testService" ); var handler = new MetricsAspectHandler( - logger, + metrics, false ); @@ -162,14 +162,14 @@ public void WhenMoreThan9DimensionsAdded_ThrowArgumentOutOfRangeException() var methodName = Guid.NewGuid().ToString(); var configurations = new Mock(); - var logger = new Metrics( + var metrics = new Metrics( configurations.Object, nameSpace: "dotnet-powertools-test", service: "testService" ); var handler = new MetricsAspectHandler( - logger, + metrics, false ); @@ -203,12 +203,12 @@ public void WhenNamespaceNotDefined_ThrowSchemaValidationException() var methodName = Guid.NewGuid().ToString(); var configurations = new Mock(); - var logger = new Metrics( + var metrics = new Metrics( configurations.Object ); var handler = new MetricsAspectHandler( - logger, + metrics, false ); @@ -241,14 +241,14 @@ public void WhenDimensionsAreAdded_MustExistAsMembers() var configurations = new Mock(); - var logger = new Metrics( + var metrics = new Metrics( configurations.Object, nameSpace: "dotnet-powertools-test", service: "testService" ); var handler = new MetricsAspectHandler( - logger, + metrics, false ); @@ -279,10 +279,10 @@ public void WhenNamespaceIsDefined_AbleToRetrieveNamespace() // Arrange var methodName = Guid.NewGuid().ToString(); var configurations = new Mock(); - var logger = new Metrics(configurations.Object); + var metrics = new Metrics(configurations.Object); var handler = new MetricsAspectHandler( - logger, + metrics, false ); @@ -311,14 +311,14 @@ public void WhenMetricsDefined_AbleToAddMetadata() Console.SetOut(consoleOut); var configurations = new Mock(); - var logger = new Metrics( + var metrics = new Metrics( configurations.Object, nameSpace: "dotnet-powertools-test", service: "testService" ); var handler = new MetricsAspectHandler( - logger, + metrics, false ); @@ -350,14 +350,14 @@ public void WhenDefaultDimensionsSet_ValidInitialization() var defaultDimensions = new Dictionary { { "CustomDefaultDimension", "CustomDefaultDimensionValue" } }; var configurations = new Mock(); - var logger = new Metrics( + var metrics = new Metrics( configurations.Object, nameSpace: "dotnet-powertools-test", service: "testService" ); var handler = new MetricsAspectHandler( - logger, + metrics, false ); @@ -387,14 +387,14 @@ public void WhenMetricIsNegativeValue_ThrowException() var methodName = Guid.NewGuid().ToString(); var configurations = new Mock(); - var logger = new Metrics( + var metrics = new Metrics( configurations.Object, nameSpace: "dotnet-powertools-test", service: "testService" ); var handler = new MetricsAspectHandler( - logger, + metrics, false ); @@ -428,14 +428,14 @@ public void WhenDefaultDimensionSet_IgnoreDuplicates() var configurations = new Mock(); var defaultDimensions = new Dictionary { { "CustomDefaultDimension", "CustomDefaultDimensionValue" } }; - var logger = new Metrics( + var metrics = new Metrics( configurations.Object, nameSpace: "dotnet-powertools-test", service: "testService" ); var handler = new MetricsAspectHandler( - logger, + metrics, false ); @@ -467,14 +467,14 @@ public void WhenMetricsAndMetadataAdded_ValidateOutput() Console.SetOut(consoleOut); var configurations = new Mock(); - var logger = new Metrics( + var metrics = new Metrics( configurations.Object, nameSpace: "dotnet-powertools-test", service: "testService" ); var handler = new MetricsAspectHandler( - logger, + metrics, false ); @@ -508,14 +508,14 @@ public void WhenMetricsWithSameNameAdded_ValidateMetricArray() var configurations = new Mock(); - var logger = new Metrics( + var metrics = new Metrics( configurations.Object, nameSpace: "dotnet-powertools-test", service: "testService" ); var handler = new MetricsAspectHandler( - logger, + metrics, false ); @@ -551,14 +551,14 @@ public void WhenMetricsWithStandardResolutionAdded_ValidateMetricArray() var configurations = new Mock(); - var logger = new Metrics( + var metrics = new Metrics( configurations.Object, nameSpace: "dotnet-powertools-test", service: "testService" ); var handler = new MetricsAspectHandler( - logger, + metrics, false ); @@ -593,14 +593,14 @@ public void WhenMetricsWithHighResolutionAdded_ValidateMetricArray() var configurations = new Mock(); - var logger = new Metrics( + var metrics = new Metrics( configurations.Object, nameSpace: "dotnet-powertools-test", service: "testService" ); var handler = new MetricsAspectHandler( - logger, + metrics, false );