diff --git a/libraries/src/AWS.Lambda.Powertools.Metrics/Metrics.cs b/libraries/src/AWS.Lambda.Powertools.Metrics/Metrics.cs index e7f27561..d66f0fa0 100644 --- a/libraries/src/AWS.Lambda.Powertools.Metrics/Metrics.cs +++ b/libraries/src/AWS.Lambda.Powertools.Metrics/Metrics.cs @@ -180,8 +180,9 @@ internal Metrics(IPowertoolsConfigurations powertoolsConfigurations, string name Instance = this; _powertoolsConfigurations.SetExecutionEnvironment(this); - if (!string.IsNullOrEmpty(nameSpace)) SetNamespace(nameSpace); - if (!string.IsNullOrEmpty(service)) SetService(service); + // set namespace and service always + SetNamespace(nameSpace); + SetService(service); } /// @@ -364,7 +365,18 @@ void IMetrics.PushSingleMetric(string name, double value, MetricUnit unit, strin var context = new MetricsContext(); context.SetNamespace(nameSpace ?? GetNamespace()); - context.SetService(service ?? _context.GetService()); + + var parsedService = !string.IsNullOrWhiteSpace(service) + ? service + : _powertoolsConfigurations.Service == "service_undefined" + ? null + : _powertoolsConfigurations.Service; + + if (!string.IsNullOrWhiteSpace(parsedService)) + { + context.SetService(parsedService); + context.AddDimension("Service", parsedService); + } if (dimensions != null) { diff --git a/libraries/tests/AWS.Lambda.Powertools.Metrics.AspNetCore.Tests/MetricsEndpointExtensionsTests.cs b/libraries/tests/AWS.Lambda.Powertools.Metrics.AspNetCore.Tests/MetricsEndpointExtensionsTests.cs index c5ee7c2c..18ef4c2c 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Metrics.AspNetCore.Tests/MetricsEndpointExtensionsTests.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Metrics.AspNetCore.Tests/MetricsEndpointExtensionsTests.cs @@ -20,8 +20,7 @@ public async Task When_WithMetrics_Should_Add_ColdStart() var options = new MetricsOptions { CaptureColdStart = true, - Namespace = "TestNamespace", - Service = "TestService" + Namespace = "TestNamespace" }; var conf = Substitute.For(); @@ -61,7 +60,6 @@ public async Task When_WithMetrics_Should_Add_ColdStart_Dimensions() { CaptureColdStart = true, Namespace = "TestNamespace", - Service = "TestService" }; var conf = Substitute.For(); @@ -111,7 +109,6 @@ public async Task When_WithMetrics_Should_Add_ColdStart_Default_Dimensions() { CaptureColdStart = true, Namespace = "TestNamespace", - Service = "TestService", DefaultDimensions = new Dictionary { { "Environment", "Prod" } diff --git a/libraries/tests/AWS.Lambda.Powertools.Metrics.AspNetCore.Tests/MetricsMiddlewareExtensionsTests.cs b/libraries/tests/AWS.Lambda.Powertools.Metrics.AspNetCore.Tests/MetricsMiddlewareExtensionsTests.cs index a9510eaa..128a5c42 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Metrics.AspNetCore.Tests/MetricsMiddlewareExtensionsTests.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Metrics.AspNetCore.Tests/MetricsMiddlewareExtensionsTests.cs @@ -21,7 +21,6 @@ public async Task When_UseMetrics_Should_Add_ColdStart() { CaptureColdStart = true, Namespace = "TestNamespace", - Service = "TestService" }; var conf = Substitute.For(); @@ -59,7 +58,6 @@ public async Task When_UseMetrics_Should_Add_ColdStart_With_LambdaContext() { CaptureColdStart = true, Namespace = "TestNamespace", - Service = "TestService" }; var conf = Substitute.For(); diff --git a/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/EMFValidationTests.cs b/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/EMFValidationTests.cs index 687ba17e..0934b316 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/EMFValidationTests.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/EMFValidationTests.cs @@ -216,6 +216,12 @@ public void When_PushSingleMetric_With_Env_Namespace() // Assert Assert.Contains("\"CloudWatchMetrics\":[{\"Namespace\":\"EnvNamespace\",\"Metrics\":[{\"Name\":\"SingleMetric\",\"Unit\":\"Count\",\"StorageResolution\":1}],\"Dimensions\":[[\"Default\"]]}]},\"Default\":\"SingleMetric\",\"SingleMetric\":1}", metricsOutput); + + // assert with different service name + Assert.Contains("\"CloudWatchMetrics\":[{\"Namespace\":\"EnvNamespace\",\"Metrics\":[{\"Name\":\"SingleMetric2\",\"Unit\":\"Count\",\"StorageResolution\":1}],\"Dimensions\":[[\"Service\",\"Default\"]]}]},\"Service\":\"service1\",\"Default\":\"SingleMetric\",\"SingleMetric2\":1}", metricsOutput); + + // assert with different service name + Assert.Contains("\"CloudWatchMetrics\":[{\"Namespace\":\"EnvNamespace\",\"Metrics\":[{\"Name\":\"SingleMetric3\",\"Unit\":\"Count\",\"StorageResolution\":1}],\"Dimensions\":[[\"Service\",\"Default\"]]}]},\"Service\":\"service2\",\"Default\":\"SingleMetric\",\"SingleMetric3\":1}", metricsOutput); } [Trait("Category", "MetricsImplementation")] diff --git a/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/Handlers/FunctionHandler.cs b/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/Handlers/FunctionHandler.cs index acc66627..5743c09d 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/Handlers/FunctionHandler.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/Handlers/FunctionHandler.cs @@ -86,6 +86,18 @@ public void PushSingleMetricWithEnvNamespace() dimensions: new Dictionary { { "Default", "SingleMetric" } }); + + Metrics.PushSingleMetric("SingleMetric2", 1, MetricUnit.Count, resolution: MetricResolution.High, + service: "service1", + dimensions: new Dictionary { + { "Default", "SingleMetric" } + }); + + Metrics.PushSingleMetric("SingleMetric3", 1, MetricUnit.Count, resolution: MetricResolution.High, + service: "service2", + dimensions: new Dictionary { + { "Default", "SingleMetric" } + }); } [Metrics(Namespace = "dotnet-powertools-test", Service = "testService")] diff --git a/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/MetricsTests.cs b/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/MetricsTests.cs index 8db246a1..f9cbb9e5 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/MetricsTests.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/MetricsTests.cs @@ -234,7 +234,6 @@ public void When_ColdStart_Should_Use_DefaultDimensions_From_Options() { CaptureColdStart = true, Namespace = "dotnet-powertools-test", - Service = "testService", DefaultDimensions = new Dictionary { { "Environment", "Test" }, @@ -268,7 +267,6 @@ public void When_ColdStart_And_DefaultDimensions_Is_Null_Should_Only_Add_Service { CaptureColdStart = true, Namespace = "dotnet-powertools-test", - Service = "testService", DefaultDimensions = null }; diff --git a/libraries/tests/e2e/functions/core/metrics/Function/test/Function.Tests/FunctionTests.cs b/libraries/tests/e2e/functions/core/metrics/Function/test/Function.Tests/FunctionTests.cs index 0a3573b0..d156fba6 100644 --- a/libraries/tests/e2e/functions/core/metrics/Function/test/Function.Tests/FunctionTests.cs +++ b/libraries/tests/e2e/functions/core/metrics/Function/test/Function.Tests/FunctionTests.cs @@ -270,11 +270,15 @@ private void AssertSingleMetric(string output) Assert.Equal("Count", unitElement.GetString()); Assert.True(cloudWatchMetricsElement[0].TryGetProperty("Dimensions", out JsonElement dimensionsElement)); - Assert.Equal("FunctionName", dimensionsElement[0][0].GetString()); + Assert.Equal("Service", dimensionsElement[0][0].GetString()); + Assert.Equal("FunctionName", dimensionsElement[0][1].GetString()); Assert.True(root.TryGetProperty("FunctionName", out JsonElement functionNameElement)); Assert.Equal(_functionName, functionNameElement.GetString()); + Assert.True(root.TryGetProperty("Service", out JsonElement serviceElement)); + Assert.Equal("Test", serviceElement.GetString()); + Assert.True(root.TryGetProperty("SingleMetric", out JsonElement singleMetricElement)); Assert.Equal(1, singleMetricElement.GetInt32()); }