From fc78c0e51cf67f8072c244964d4a5e610564f021 Mon Sep 17 00:00:00 2001 From: Rasmus Kuusmann Date: Tue, 21 Oct 2025 16:04:59 +0100 Subject: [PATCH 01/15] fix route attribute logic --- .../Implementation/HttpInListener.cs | 10 +-- .../Implementation/RouteAttributeHelper.cs | 80 +++++++++++++++++++ 2 files changed, 85 insertions(+), 5 deletions(-) create mode 100644 src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/HttpInListener.cs b/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/HttpInListener.cs index 5ac36618e3..165159862e 100644 --- a/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/HttpInListener.cs +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/HttpInListener.cs @@ -244,12 +244,12 @@ public void OnStopActivity(Activity activity, object? payload) var response = context.Response; #if !NETSTANDARD - var routePattern = (context.Features.Get()?.Endpoint as RouteEndpoint ?? - context.GetEndpoint() as RouteEndpoint)?.RoutePattern.RawText; - if (!string.IsNullOrEmpty(routePattern)) + var endpoint = context.Features.Get()?.Endpoint as RouteEndpoint + ?? context.GetEndpoint() as RouteEndpoint; + + if (endpoint != null) { - TelemetryHelper.RequestDataHelper.SetActivityDisplayName(activity, context.Request.Method, routePattern); - activity.SetTag(SemanticConventions.AttributeHttpRoute, routePattern); + activity.SetRouteAttributeTag(endpoint, context.Request); } #endif diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs b/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs new file mode 100644 index 0000000000..49a468ad5a --- /dev/null +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs @@ -0,0 +1,80 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#if !NETSTANDARD + +using System.Diagnostics; +using System.Text; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Routing; +using Microsoft.AspNetCore.Routing.Patterns; +using OpenTelemetry.Trace; + +namespace OpenTelemetry.Instrumentation.AspNetCore.Implementation; + +internal static class RouteAttributeHelper +{ + public static void SetRouteAttributeTag(this Activity activity, RouteEndpoint endpoint, HttpRequest request) + { + var routePattern = GetRoutePattern(endpoint.RoutePattern, request.RouteValues); + + if (!string.IsNullOrEmpty(routePattern)) + { + TelemetryHelper.RequestDataHelper.SetActivityDisplayName(activity, request.Method, routePattern); + activity.SetTag(SemanticConventions.AttributeHttpRoute, routePattern); + } + } + + private static string GetRoutePattern(RoutePattern routePattern, RouteValueDictionary routeValues) + { + var sb = new StringBuilder(); + + for (var i = 0; i < routePattern.PathSegments.Count; i++) + { + var segment = routePattern.PathSegments[i]; + + foreach (var part in segment.Parts) + { + if (part is RoutePatternLiteralPart literalPart) + { + sb.Append(literalPart.Content); + } + else if (part is RoutePatternParameterPart parameterPart) + { + switch (parameterPart.Name) + { + case "area": + case "controller": + case "action": + routePattern.RequiredValues.TryGetValue(parameterPart.Name, out var parameterValue); + if (parameterValue != null) + { + sb.Append(parameterValue); + break; + } + + goto default; + default: + if (routeValues.ContainsKey(parameterPart.Name)) + { + sb.Append('{'); + sb.Append(parameterPart.Name); + sb.Append('}'); + } + + break; + } + } + } + + if (i < routePattern.PathSegments.Count - 1) + { + sb.Append('/'); + } + } + + return sb.ToString(); + } +} + +#endif From d3ab87ac7618c480c474bef2d1fc91b35ef0ec3a Mon Sep 17 00:00:00 2001 From: Rasmus Kuusmann Date: Thu, 23 Oct 2025 11:40:21 +0100 Subject: [PATCH 02/15] update --- .../Implementation/HttpInMetricsListener.cs | 9 +++--- .../Implementation/RouteAttributeHelper.cs | 28 ++++++++++++------- .../RouteTests/RoutingTestCases.json | 14 +++++----- .../RouteTests/RoutingTests.cs | 2 +- 4 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/HttpInMetricsListener.cs b/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/HttpInMetricsListener.cs index 551421403a..e5dedd8991 100644 --- a/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/HttpInMetricsListener.cs +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/HttpInMetricsListener.cs @@ -94,11 +94,12 @@ public static void OnStopEventWritten(string name, object? payload) #if NET // Check the exception handler feature first in case the endpoint was overwritten - var route = (context.Features.Get()?.Endpoint as RouteEndpoint ?? - context.GetEndpoint() as RouteEndpoint)?.RoutePattern.RawText; - if (!string.IsNullOrEmpty(route)) + var endpoint = context.Features.Get()?.Endpoint as RouteEndpoint + ?? context.GetEndpoint() as RouteEndpoint; + + if (endpoint != null) { - tags.Add(new KeyValuePair(SemanticConventions.AttributeHttpRoute, route)); + tags.AddRouteAttribute(endpoint, context.Request); } #endif if (context.Items.TryGetValue(ErrorTypeHttpContextItemsKey, out var errorType)) diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs b/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs index 49a468ad5a..d81fd74900 100644 --- a/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs @@ -14,6 +14,16 @@ namespace OpenTelemetry.Instrumentation.AspNetCore.Implementation; internal static class RouteAttributeHelper { + public static void AddRouteAttribute(this TagList tags, RouteEndpoint endpoint, HttpRequest request) + { + var routePattern = GetRoutePattern(endpoint.RoutePattern, request.RouteValues); + + if (!string.IsNullOrEmpty(routePattern)) + { + tags.Add(new KeyValuePair(SemanticConventions.AttributeHttpRoute, routePattern)); + } + } + public static void SetRouteAttributeTag(this Activity activity, RouteEndpoint endpoint, HttpRequest request) { var routePattern = GetRoutePattern(endpoint.RoutePattern, request.RouteValues); @@ -29,15 +39,14 @@ private static string GetRoutePattern(RoutePattern routePattern, RouteValueDicti { var sb = new StringBuilder(); - for (var i = 0; i < routePattern.PathSegments.Count; i++) + foreach (var segment in routePattern.PathSegments) { - var segment = routePattern.PathSegments[i]; - foreach (var part in segment.Parts) { if (part is RoutePatternLiteralPart literalPart) { sb.Append(literalPart.Content); + sb.Append('/'); } else if (part is RoutePatternParameterPart parameterPart) { @@ -50,30 +59,29 @@ private static string GetRoutePattern(RoutePattern routePattern, RouteValueDicti if (parameterValue != null) { sb.Append(parameterValue); + sb.Append('/'); break; } goto default; default: - if (routeValues.ContainsKey(parameterPart.Name)) + if (!parameterPart.IsOptional || + (parameterPart.IsOptional && routeValues.ContainsKey(parameterPart.Name))) { sb.Append('{'); sb.Append(parameterPart.Name); sb.Append('}'); + sb.Append('/'); } break; } } } - - if (i < routePattern.PathSegments.Count - 1) - { - sb.Append('/'); - } } - return sb.ToString(); + // Remove the trailing '/' + return sb.ToString(0, sb.Length - 1); } } diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json index d524b58afc..12fa81f497 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json @@ -6,7 +6,7 @@ "path": "/", "expectedStatusCode": 200, "currentHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "expectedHttpRoute": "ConventionalRoute/Default/{id?}" + "expectedHttpRoute": "ConventionalRoute/Default" }, { "name": "Non-default action with route parameter and query string", @@ -15,7 +15,7 @@ "path": "/ConventionalRoute/ActionWithStringParameter/2?num=3", "expectedStatusCode": 200, "currentHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "expectedHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}" + "expectedHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id}" }, { "name": "Non-default action with query string", @@ -24,7 +24,7 @@ "path": "/ConventionalRoute/ActionWithStringParameter?num=3", "expectedStatusCode": 200, "currentHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "expectedHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}" + "expectedHttpRoute": "ConventionalRoute/ActionWithStringParameter" }, { "name": "Not Found (404)", @@ -42,7 +42,7 @@ "path": "/SomePath/SomeString/2", "expectedStatusCode": 200, "currentHttpRoute": null, - "expectedHttpRoute": "SomePath/{id}/{num:int}" + "expectedHttpRoute": "SomePath/{id}/{num}" }, { "name": "Path that does not match parameter constraint", @@ -60,7 +60,7 @@ "path": "/MyArea", "expectedStatusCode": 200, "currentHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "expectedHttpRoute": "{area:exists}/ControllerForMyArea/Default/{id?}" + "expectedHttpRoute": "MyArea/ControllerForMyArea/Default" }, { "name": "Area using `area:exists`, non-default action", @@ -69,7 +69,7 @@ "path": "/MyArea/ControllerForMyArea/NonDefault", "expectedStatusCode": 200, "currentHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "expectedHttpRoute": "{area:exists}/ControllerForMyArea/NonDefault/{id?}" + "expectedHttpRoute": "MyArea/ControllerForMyArea/NonDefault" }, { "name": "Area w/o `area:exists`, default controller/action", @@ -78,7 +78,7 @@ "path": "/SomePrefix", "expectedStatusCode": 200, "currentHttpRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", - "expectedHttpRoute": "SomePrefix/AnotherArea/Index/{id?}" + "expectedHttpRoute": "SomePrefix/AnotherArea/Index/{id}" }, { "name": "Default action", diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTests.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTests.cs index fe7d3d3201..f489acd957 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTests.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTests.cs @@ -52,7 +52,7 @@ public async Task TestHttpRoute_Traces(TestCase testCase) // TODO: The CurrentHttpRoute property will go away. They only serve to capture status quo. // If CurrentHttpRoute is null, then that means we already conform to the correct behavior. - var expectedHttpRoute = testCase.CurrentHttpRoute ?? testCase.ExpectedHttpRoute; + var expectedHttpRoute = testCase.ExpectedHttpRoute ?? testCase.CurrentHttpRoute; Assert.Equal(expectedHttpRoute, activityHttpRoute); // Activity.DisplayName should be a combination of http.method + http.route attributes, see: From 103f520eea4dbee895da40d4432f1a1d544ec576 Mon Sep 17 00:00:00 2001 From: Rasmus Kuusmann Date: Tue, 4 Nov 2025 13:29:33 +0000 Subject: [PATCH 03/15] fix traces and update routes --- .../Implementation/RouteAttributeHelper.cs | 12 ++++++++++++ .../RouteTests/RoutingTestCases.json | 18 +++++++++--------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs b/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs index d81fd74900..297093f05e 100644 --- a/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs @@ -37,6 +37,18 @@ public static void SetRouteAttributeTag(this Activity activity, RouteEndpoint en private static string GetRoutePattern(RoutePattern routePattern, RouteValueDictionary routeValues) { + if (routePattern.PathSegments.Count == 0) + { + // RazorPage default route + if (routePattern.Defaults.ContainsKey("page")) + { + return routePattern.Defaults["page"]?.ToString()?.Trim('/') + ?? string.Empty; + } + + return string.Empty; + } + var sb = new StringBuilder(); foreach (var segment in routePattern.PathSegments) diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json index 12fa81f497..cb42a08f34 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json @@ -78,7 +78,7 @@ "path": "/SomePrefix", "expectedStatusCode": 200, "currentHttpRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", - "expectedHttpRoute": "SomePrefix/AnotherArea/Index/{id}" + "expectedHttpRoute": "SomePrefix/AnotherArea/Index" }, { "name": "Default action", @@ -133,7 +133,7 @@ "path": "/", "expectedStatusCode": 200, "currentHttpRoute": "", - "expectedHttpRoute": "/Index" + "expectedHttpRoute": "Index" }, { "name": "Index page", @@ -142,7 +142,7 @@ "path": "/Index", "expectedStatusCode": 200, "currentHttpRoute": "Index", - "expectedHttpRoute": "/Index" + "expectedHttpRoute": "Index" }, { "name": "Throws exception", @@ -151,7 +151,7 @@ "path": "/PageThatThrowsException", "expectedStatusCode": 500, "currentHttpRoute": "PageThatThrowsException", - "expectedHttpRoute": "/PageThatThrowsException" + "expectedHttpRoute": "PageThatThrowsException" }, { "name": "Static content", @@ -169,7 +169,7 @@ "path": "/MinimalApi", "expectedStatusCode": 200, "currentHttpRoute": null, - "expectedHttpRoute": "/MinimalApi" + "expectedHttpRoute": "MinimalApi" }, { "name": "Action with parameter", @@ -178,7 +178,7 @@ "path": "/MinimalApi/123", "expectedStatusCode": 200, "currentHttpRoute": null, - "expectedHttpRoute": "/MinimalApi/{id}" + "expectedHttpRoute": "MinimalApi/{id}" }, { "name": "Action without parameter (MapGroup)", @@ -188,7 +188,7 @@ "path": "/MinimalApiUsingMapGroup", "expectedStatusCode": 200, "currentHttpRoute": null, - "expectedHttpRoute": "/MinimalApiUsingMapGroup/" + "expectedHttpRoute": "MinimalApiUsingMapGroup" }, { "name": "Action with parameter (MapGroup)", @@ -198,7 +198,7 @@ "path": "/MinimalApiUsingMapGroup/123", "expectedStatusCode": 200, "currentHttpRoute": null, - "expectedHttpRoute": "/MinimalApiUsingMapGroup/{id}" + "expectedHttpRoute": "MinimalApiUsingMapGroup/{id}" }, { "name": "Exception Handled by Exception Handler Middleware", @@ -207,6 +207,6 @@ "path": "/Exception", "expectedStatusCode": 500, "currentHttpRoute": null, - "expectedHttpRoute": "/Exception" + "expectedHttpRoute": "Exception" } ] From cee12f918158e920670cfede72c3376f52003249 Mon Sep 17 00:00:00 2001 From: Rasmus Kuusmann Date: Tue, 4 Nov 2025 13:50:48 +0000 Subject: [PATCH 04/15] revert routingtests and update cases --- .../RouteTests/RoutingTestCases.json | 16 ++++++++-------- .../RouteTests/RoutingTests.cs | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json index cb42a08f34..f25d263a79 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json @@ -5,7 +5,7 @@ "httpMethod": "GET", "path": "/", "expectedStatusCode": 200, - "currentHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", + "currentHttpRoute": null, "expectedHttpRoute": "ConventionalRoute/Default" }, { @@ -14,7 +14,7 @@ "httpMethod": "GET", "path": "/ConventionalRoute/ActionWithStringParameter/2?num=3", "expectedStatusCode": 200, - "currentHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", + "currentHttpRoute": null, "expectedHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id}" }, { @@ -23,7 +23,7 @@ "httpMethod": "GET", "path": "/ConventionalRoute/ActionWithStringParameter?num=3", "expectedStatusCode": 200, - "currentHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", + "currentHttpRoute": null, "expectedHttpRoute": "ConventionalRoute/ActionWithStringParameter" }, { @@ -59,7 +59,7 @@ "httpMethod": "GET", "path": "/MyArea", "expectedStatusCode": 200, - "currentHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", + "currentHttpRoute": null, "expectedHttpRoute": "MyArea/ControllerForMyArea/Default" }, { @@ -68,7 +68,7 @@ "httpMethod": "GET", "path": "/MyArea/ControllerForMyArea/NonDefault", "expectedStatusCode": 200, - "currentHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", + "currentHttpRoute": null, "expectedHttpRoute": "MyArea/ControllerForMyArea/NonDefault" }, { @@ -77,7 +77,7 @@ "httpMethod": "GET", "path": "/SomePrefix", "expectedStatusCode": 200, - "currentHttpRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", + "currentHttpRoute": null, "expectedHttpRoute": "SomePrefix/AnotherArea/Index" }, { @@ -132,7 +132,7 @@ "httpMethod": "GET", "path": "/", "expectedStatusCode": 200, - "currentHttpRoute": "", + "currentHttpRoute": null, "expectedHttpRoute": "Index" }, { @@ -141,7 +141,7 @@ "httpMethod": "GET", "path": "/Index", "expectedStatusCode": 200, - "currentHttpRoute": "Index", + "currentHttpRoute": null, "expectedHttpRoute": "Index" }, { diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTests.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTests.cs index f489acd957..fe7d3d3201 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTests.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTests.cs @@ -52,7 +52,7 @@ public async Task TestHttpRoute_Traces(TestCase testCase) // TODO: The CurrentHttpRoute property will go away. They only serve to capture status quo. // If CurrentHttpRoute is null, then that means we already conform to the correct behavior. - var expectedHttpRoute = testCase.ExpectedHttpRoute ?? testCase.CurrentHttpRoute; + var expectedHttpRoute = testCase.CurrentHttpRoute ?? testCase.ExpectedHttpRoute; Assert.Equal(expectedHttpRoute, activityHttpRoute); // Activity.DisplayName should be a combination of http.method + http.route attributes, see: From edc8a72d95e5d477ae744158500ab68080acb455 Mon Sep 17 00:00:00 2001 From: Rasmus Kuusmann Date: Tue, 4 Nov 2025 16:07:22 +0000 Subject: [PATCH 05/15] update metric tests --- .../RouteTests/README.net8.0.md | 192 +++++++++++------- .../RouteTests/README.net9.0.md | 192 +++++++++++------- .../RouteTests/RoutingTestCases.json | 25 ++- .../RouteTests/RoutingTestFixture.cs | 2 +- .../RouteTests/RoutingTestResult.cs | 2 + .../RouteTests/RoutingTests.cs | 15 +- .../RouteTests/TestCase.cs | 2 +- 7 files changed, 275 insertions(+), 155 deletions(-) diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net8.0.md b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net8.0.md index 2e30e5ae06..d0ebef0fc7 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net8.0.md +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net8.0.md @@ -6,23 +6,23 @@ | http.route | App | Test Name | | - | - | - | -| :broken_heart: | ConventionalRouting | [Root path](#activity__conventionalrouting-root-path) | -| :broken_heart: | ConventionalRouting | [Non-default action with route parameter and query string](#activity__conventionalrouting-non-default-action-with-route-parameter-and-query-string) | -| :broken_heart: | ConventionalRouting | [Non-default action with query string](#activity__conventionalrouting-non-default-action-with-query-string) | +| :green_heart: | ConventionalRouting | [Root path](#activity__conventionalrouting-root-path) | +| :green_heart: | ConventionalRouting | [Non-default action with route parameter and query string](#activity__conventionalrouting-non-default-action-with-route-parameter-and-query-string) | +| :green_heart: | ConventionalRouting | [Non-default action with query string](#activity__conventionalrouting-non-default-action-with-query-string) | | :green_heart: | ConventionalRouting | [Not Found (404)](#activity__conventionalrouting-not-found-404) | | :green_heart: | ConventionalRouting | [Route template with parameter constraint](#activity__conventionalrouting-route-template-with-parameter-constraint) | | :green_heart: | ConventionalRouting | [Path that does not match parameter constraint](#activity__conventionalrouting-path-that-does-not-match-parameter-constraint) | -| :broken_heart: | ConventionalRouting | [Area using `area:exists`, default controller/action](#activity__conventionalrouting-area-using-areaexists-default-controlleraction) | -| :broken_heart: | ConventionalRouting | [Area using `area:exists`, non-default action](#activity__conventionalrouting-area-using-areaexists-non-default-action) | -| :broken_heart: | ConventionalRouting | [Area w/o `area:exists`, default controller/action](#activity__conventionalrouting-area-wo-areaexists-default-controlleraction) | +| :green_heart: | ConventionalRouting | [Area using `area:exists`, default controller/action](#activity__conventionalrouting-area-using-areaexists-default-controlleraction) | +| :green_heart: | ConventionalRouting | [Area using `area:exists`, non-default action](#activity__conventionalrouting-area-using-areaexists-non-default-action) | +| :green_heart: | ConventionalRouting | [Area w/o `area:exists`, default controller/action](#activity__conventionalrouting-area-wo-areaexists-default-controlleraction) | | :green_heart: | AttributeRouting | [Default action](#activity__attributerouting-default-action) | | :green_heart: | AttributeRouting | [Action without parameter](#activity__attributerouting-action-without-parameter) | | :green_heart: | AttributeRouting | [Action with parameter](#activity__attributerouting-action-with-parameter) | | :green_heart: | AttributeRouting | [Action with parameter before action name in template](#activity__attributerouting-action-with-parameter-before-action-name-in-template) | | :green_heart: | AttributeRouting | [Action invoked resulting in 400 Bad Request](#activity__attributerouting-action-invoked-resulting-in-400-bad-request) | -| :broken_heart: | RazorPages | [Root path](#activity__razorpages-root-path) | -| :broken_heart: | RazorPages | [Index page](#activity__razorpages-index-page) | -| :broken_heart: | RazorPages | [Throws exception](#activity__razorpages-throws-exception) | +| :green_heart: | RazorPages | [Root path](#activity__razorpages-root-path) | +| :green_heart: | RazorPages | [Index page](#activity__razorpages-index-page) | +| :green_heart: | RazorPages | [Throws exception](#activity__razorpages-throws-exception) | | :green_heart: | RazorPages | [Static content](#activity__razorpages-static-content) | | :green_heart: | MinimalApi | [Action without parameter](#activity__minimalapi-action-without-parameter) | | :green_heart: | MinimalApi | [Action with parameter](#activity__minimalapi-action-with-parameter) | @@ -38,7 +38,7 @@ | :broken_heart: | ConventionalRouting | [Non-default action with route parameter and query string](#metrics__conventionalrouting-non-default-action-with-route-parameter-and-query-string) | | :broken_heart: | ConventionalRouting | [Non-default action with query string](#metrics__conventionalrouting-non-default-action-with-query-string) | | :green_heart: | ConventionalRouting | [Not Found (404)](#metrics__conventionalrouting-not-found-404) | -| :green_heart: | ConventionalRouting | [Route template with parameter constraint](#metrics__conventionalrouting-route-template-with-parameter-constraint) | +| :broken_heart: | ConventionalRouting | [Route template with parameter constraint](#metrics__conventionalrouting-route-template-with-parameter-constraint) | | :green_heart: | ConventionalRouting | [Path that does not match parameter constraint](#metrics__conventionalrouting-path-that-does-not-match-parameter-constraint) | | :broken_heart: | ConventionalRouting | [Area using `area:exists`, default controller/action](#metrics__conventionalrouting-area-using-areaexists-default-controlleraction) | | :broken_heart: | ConventionalRouting | [Area using `area:exists`, non-default action](#metrics__conventionalrouting-area-using-areaexists-non-default-action) | @@ -49,14 +49,14 @@ | :green_heart: | AttributeRouting | [Action with parameter before action name in template](#metrics__attributerouting-action-with-parameter-before-action-name-in-template) | | :green_heart: | AttributeRouting | [Action invoked resulting in 400 Bad Request](#metrics__attributerouting-action-invoked-resulting-in-400-bad-request) | | :broken_heart: | RazorPages | [Root path](#metrics__razorpages-root-path) | -| :broken_heart: | RazorPages | [Index page](#metrics__razorpages-index-page) | -| :broken_heart: | RazorPages | [Throws exception](#metrics__razorpages-throws-exception) | +| :green_heart: | RazorPages | [Index page](#metrics__razorpages-index-page) | +| :green_heart: | RazorPages | [Throws exception](#metrics__razorpages-throws-exception) | | :green_heart: | RazorPages | [Static content](#metrics__razorpages-static-content) | -| :green_heart: | MinimalApi | [Action without parameter](#metrics__minimalapi-action-without-parameter) | -| :green_heart: | MinimalApi | [Action with parameter](#metrics__minimalapi-action-with-parameter) | -| :green_heart: | MinimalApi | [Action without parameter (MapGroup)](#metrics__minimalapi-action-without-parameter-mapgroup) | -| :green_heart: | MinimalApi | [Action with parameter (MapGroup)](#metrics__minimalapi-action-with-parameter-mapgroup) | -| :green_heart: | ExceptionMiddleware | [Exception Handled by Exception Handler Middleware](#metrics__exceptionmiddleware-exception-handled-by-exception-handler-middleware) | +| :broken_heart: | MinimalApi | [Action without parameter](#metrics__minimalapi-action-without-parameter) | +| :broken_heart: | MinimalApi | [Action with parameter](#metrics__minimalapi-action-with-parameter) | +| :broken_heart: | MinimalApi | [Action without parameter (MapGroup)](#metrics__minimalapi-action-without-parameter-mapgroup) | +| :broken_heart: | MinimalApi | [Action with parameter (MapGroup)](#metrics__minimalapi-action-with-parameter-mapgroup) | +| :broken_heart: | ExceptionMiddleware | [Exception Handled by Exception Handler Middleware](#metrics__exceptionmiddleware-exception-handled-by-exception-handler-middleware) | ## Tracing tests details @@ -65,9 +65,10 @@ ```json { - "ActivityDisplayName": "GET {controller=ConventionalRoute}/{action=Default}/{id?}", - "ActivityHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "IdealHttpRoute": "ConventionalRoute/Default/{id?}", + "ActivityDisplayName": "GET ConventionalRoute/Default", + "ActivityHttpRoute": "ConventionalRoute/Default", + "IdealHttpRoute": "ConventionalRoute/Default", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -94,9 +95,10 @@ ```json { - "ActivityDisplayName": "GET {controller=ConventionalRoute}/{action=Default}/{id?}", - "ActivityHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}", + "ActivityDisplayName": "GET ConventionalRoute/ActionWithStringParameter/{id}", + "ActivityHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id}", + "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id}", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter/2?num=3", @@ -127,9 +129,10 @@ ```json { - "ActivityDisplayName": "GET {controller=ConventionalRoute}/{action=Default}/{id?}", - "ActivityHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}", + "ActivityDisplayName": "GET ConventionalRoute/ActionWithStringParameter", + "ActivityHttpRoute": "ConventionalRoute/ActionWithStringParameter", + "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter?num=3", @@ -162,6 +165,7 @@ "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "IdealHttpRoute": "", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/NotFound", @@ -177,9 +181,10 @@ ```json { - "ActivityDisplayName": "GET SomePath/{id}/{num:int}", - "ActivityHttpRoute": "SomePath/{id}/{num:int}", - "IdealHttpRoute": "SomePath/{id}/{num:int}", + "ActivityDisplayName": "GET SomePath/{id}/{num}", + "ActivityHttpRoute": "SomePath/{id}/{num}", + "IdealHttpRoute": "SomePath/{id}/{num}", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/2", @@ -214,6 +219,7 @@ "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "IdealHttpRoute": "", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/NotAnInt", @@ -229,9 +235,10 @@ ```json { - "ActivityDisplayName": "GET {area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "ActivityHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "IdealHttpRoute": "{area:exists}/ControllerForMyArea/Default/{id?}", + "ActivityDisplayName": "GET MyArea/ControllerForMyArea/Default", + "ActivityHttpRoute": "MyArea/ControllerForMyArea/Default", + "IdealHttpRoute": "MyArea/ControllerForMyArea/Default", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea", @@ -259,9 +266,10 @@ ```json { - "ActivityDisplayName": "GET {area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "ActivityHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "IdealHttpRoute": "{area:exists}/ControllerForMyArea/NonDefault/{id?}", + "ActivityDisplayName": "GET MyArea/ControllerForMyArea/NonDefault", + "ActivityHttpRoute": "MyArea/ControllerForMyArea/NonDefault", + "IdealHttpRoute": "MyArea/ControllerForMyArea/NonDefault", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea/ControllerForMyArea/NonDefault", @@ -289,9 +297,10 @@ ```json { - "ActivityDisplayName": "GET SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", - "ActivityHttpRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", - "IdealHttpRoute": "SomePrefix/AnotherArea/Index/{id?}", + "ActivityDisplayName": "GET SomePrefix/AnotherArea/Index", + "ActivityHttpRoute": "SomePrefix/AnotherArea/Index", + "IdealHttpRoute": "SomePrefix/AnotherArea/Index", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePrefix", @@ -322,6 +331,7 @@ "ActivityDisplayName": "GET AttributeRoute", "ActivityHttpRoute": "AttributeRoute", "IdealHttpRoute": "AttributeRoute", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute", @@ -351,6 +361,7 @@ "ActivityDisplayName": "GET AttributeRoute/Get", "ActivityHttpRoute": "AttributeRoute/Get", "IdealHttpRoute": "AttributeRoute/Get", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get", @@ -380,6 +391,7 @@ "ActivityDisplayName": "GET AttributeRoute/Get/{id}", "ActivityHttpRoute": "AttributeRoute/Get/{id}", "IdealHttpRoute": "AttributeRoute/Get/{id}", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get/12", @@ -412,6 +424,7 @@ "ActivityDisplayName": "GET AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "ActivityHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/12/GetWithActionNameInDifferentSpotInTemplate", @@ -444,6 +457,7 @@ "ActivityDisplayName": "GET AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "ActivityHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/NotAnInt/GetWithActionNameInDifferentSpotInTemplate", @@ -473,9 +487,10 @@ ```json { - "ActivityDisplayName": "GET", - "ActivityHttpRoute": "", - "IdealHttpRoute": "/Index", + "ActivityDisplayName": "GET Index", + "ActivityHttpRoute": "Index", + "IdealHttpRoute": "Index", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -503,7 +518,8 @@ { "ActivityDisplayName": "GET Index", "ActivityHttpRoute": "Index", - "IdealHttpRoute": "/Index", + "IdealHttpRoute": "Index", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/Index", @@ -531,7 +547,8 @@ { "ActivityDisplayName": "GET PageThatThrowsException", "ActivityHttpRoute": "PageThatThrowsException", - "IdealHttpRoute": "/PageThatThrowsException", + "IdealHttpRoute": "PageThatThrowsException", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/PageThatThrowsException", @@ -560,6 +577,7 @@ "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "IdealHttpRoute": "", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/js/site.js", @@ -575,9 +593,10 @@ ```json { - "ActivityDisplayName": "GET /MinimalApi", - "ActivityHttpRoute": "/MinimalApi", - "IdealHttpRoute": "/MinimalApi", + "ActivityDisplayName": "GET MinimalApi", + "ActivityHttpRoute": "MinimalApi", + "IdealHttpRoute": "MinimalApi", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi", @@ -593,9 +612,10 @@ ```json { - "ActivityDisplayName": "GET /MinimalApi/{id}", - "ActivityHttpRoute": "/MinimalApi/{id}", - "IdealHttpRoute": "/MinimalApi/{id}", + "ActivityDisplayName": "GET MinimalApi/{id}", + "ActivityHttpRoute": "MinimalApi/{id}", + "IdealHttpRoute": "MinimalApi/{id}", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi/123", @@ -613,9 +633,10 @@ ```json { - "ActivityDisplayName": "GET /MinimalApiUsingMapGroup/", - "ActivityHttpRoute": "/MinimalApiUsingMapGroup/", - "IdealHttpRoute": "/MinimalApiUsingMapGroup/", + "ActivityDisplayName": "GET MinimalApiUsingMapGroup", + "ActivityHttpRoute": "MinimalApiUsingMapGroup", + "IdealHttpRoute": "MinimalApiUsingMapGroup", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup", @@ -631,9 +652,10 @@ ```json { - "ActivityDisplayName": "GET /MinimalApiUsingMapGroup/{id}", - "ActivityHttpRoute": "/MinimalApiUsingMapGroup/{id}", - "IdealHttpRoute": "/MinimalApiUsingMapGroup/{id}", + "ActivityDisplayName": "GET MinimalApiUsingMapGroup/{id}", + "ActivityHttpRoute": "MinimalApiUsingMapGroup/{id}", + "IdealHttpRoute": "MinimalApiUsingMapGroup/{id}", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup/123", @@ -651,9 +673,10 @@ ```json { - "ActivityDisplayName": "GET /Exception", - "ActivityHttpRoute": "/Exception", - "IdealHttpRoute": "/Exception", + "ActivityDisplayName": "GET Exception", + "ActivityHttpRoute": "Exception", + "IdealHttpRoute": "Exception", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/Exception", @@ -673,7 +696,8 @@ ```json { "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "IdealHttpRoute": "ConventionalRoute/Default/{id?}", + "IdealHttpRoute": "ConventionalRoute/Default", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -701,7 +725,8 @@ ```json { "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}", + "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id}", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter/2?num=3", @@ -733,7 +758,8 @@ ```json { "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}", + "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter?num=3", @@ -765,6 +791,7 @@ { "MetricHttpRoute": "", "IdealHttpRoute": "", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/NotFound", @@ -781,7 +808,8 @@ ```json { "MetricHttpRoute": "SomePath/{id}/{num:int}", - "IdealHttpRoute": "SomePath/{id}/{num:int}", + "IdealHttpRoute": "SomePath/{id}/{num}", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/2", @@ -815,6 +843,7 @@ { "MetricHttpRoute": "", "IdealHttpRoute": "", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/NotAnInt", @@ -831,7 +860,8 @@ ```json { "MetricHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "IdealHttpRoute": "{area:exists}/ControllerForMyArea/Default/{id?}", + "IdealHttpRoute": "MyArea/ControllerForMyArea/Default", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea", @@ -860,7 +890,8 @@ ```json { "MetricHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "IdealHttpRoute": "{area:exists}/ControllerForMyArea/NonDefault/{id?}", + "IdealHttpRoute": "MyArea/ControllerForMyArea/NonDefault", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea/ControllerForMyArea/NonDefault", @@ -889,7 +920,8 @@ ```json { "MetricHttpRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", - "IdealHttpRoute": "SomePrefix/AnotherArea/Index/{id?}", + "IdealHttpRoute": "SomePrefix/AnotherArea/Index", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePrefix", @@ -919,6 +951,7 @@ { "MetricHttpRoute": "AttributeRoute", "IdealHttpRoute": "AttributeRoute", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute", @@ -947,6 +980,7 @@ { "MetricHttpRoute": "AttributeRoute/Get", "IdealHttpRoute": "AttributeRoute/Get", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get", @@ -975,6 +1009,7 @@ { "MetricHttpRoute": "AttributeRoute/Get/{id}", "IdealHttpRoute": "AttributeRoute/Get/{id}", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get/12", @@ -1006,6 +1041,7 @@ { "MetricHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/12/GetWithActionNameInDifferentSpotInTemplate", @@ -1037,6 +1073,7 @@ { "MetricHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/NotAnInt/GetWithActionNameInDifferentSpotInTemplate", @@ -1067,7 +1104,8 @@ ```json { "MetricHttpRoute": "", - "IdealHttpRoute": "/Index", + "IdealHttpRoute": "Index", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -1094,7 +1132,8 @@ ```json { "MetricHttpRoute": "Index", - "IdealHttpRoute": "/Index", + "IdealHttpRoute": "Index", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/Index", @@ -1121,7 +1160,8 @@ ```json { "MetricHttpRoute": "PageThatThrowsException", - "IdealHttpRoute": "/PageThatThrowsException", + "IdealHttpRoute": "PageThatThrowsException", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/PageThatThrowsException", @@ -1149,6 +1189,7 @@ { "MetricHttpRoute": "", "IdealHttpRoute": "", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/js/site.js", @@ -1165,7 +1206,8 @@ ```json { "MetricHttpRoute": "/MinimalApi", - "IdealHttpRoute": "/MinimalApi", + "IdealHttpRoute": "MinimalApi", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi", @@ -1182,7 +1224,8 @@ ```json { "MetricHttpRoute": "/MinimalApi/{id}", - "IdealHttpRoute": "/MinimalApi/{id}", + "IdealHttpRoute": "MinimalApi/{id}", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi/123", @@ -1201,7 +1244,8 @@ ```json { "MetricHttpRoute": "/MinimalApiUsingMapGroup/", - "IdealHttpRoute": "/MinimalApiUsingMapGroup/", + "IdealHttpRoute": "MinimalApiUsingMapGroup", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup", @@ -1218,7 +1262,8 @@ ```json { "MetricHttpRoute": "/MinimalApiUsingMapGroup/{id}", - "IdealHttpRoute": "/MinimalApiUsingMapGroup/{id}", + "IdealHttpRoute": "MinimalApiUsingMapGroup/{id}", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup/123", @@ -1237,7 +1282,8 @@ ```json { "MetricHttpRoute": "/Exception", - "IdealHttpRoute": "/Exception", + "IdealHttpRoute": "Exception", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/Exception", diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net9.0.md b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net9.0.md index b5b0b279a1..158f055171 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net9.0.md +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net9.0.md @@ -6,23 +6,23 @@ | http.route | App | Test Name | | - | - | - | -| :broken_heart: | ConventionalRouting | [Root path](#activity__conventionalrouting-root-path) | -| :broken_heart: | ConventionalRouting | [Non-default action with route parameter and query string](#activity__conventionalrouting-non-default-action-with-route-parameter-and-query-string) | -| :broken_heart: | ConventionalRouting | [Non-default action with query string](#activity__conventionalrouting-non-default-action-with-query-string) | +| :green_heart: | ConventionalRouting | [Root path](#activity__conventionalrouting-root-path) | +| :green_heart: | ConventionalRouting | [Non-default action with route parameter and query string](#activity__conventionalrouting-non-default-action-with-route-parameter-and-query-string) | +| :green_heart: | ConventionalRouting | [Non-default action with query string](#activity__conventionalrouting-non-default-action-with-query-string) | | :green_heart: | ConventionalRouting | [Not Found (404)](#activity__conventionalrouting-not-found-404) | | :green_heart: | ConventionalRouting | [Route template with parameter constraint](#activity__conventionalrouting-route-template-with-parameter-constraint) | | :green_heart: | ConventionalRouting | [Path that does not match parameter constraint](#activity__conventionalrouting-path-that-does-not-match-parameter-constraint) | -| :broken_heart: | ConventionalRouting | [Area using `area:exists`, default controller/action](#activity__conventionalrouting-area-using-areaexists-default-controlleraction) | -| :broken_heart: | ConventionalRouting | [Area using `area:exists`, non-default action](#activity__conventionalrouting-area-using-areaexists-non-default-action) | -| :broken_heart: | ConventionalRouting | [Area w/o `area:exists`, default controller/action](#activity__conventionalrouting-area-wo-areaexists-default-controlleraction) | +| :green_heart: | ConventionalRouting | [Area using `area:exists`, default controller/action](#activity__conventionalrouting-area-using-areaexists-default-controlleraction) | +| :green_heart: | ConventionalRouting | [Area using `area:exists`, non-default action](#activity__conventionalrouting-area-using-areaexists-non-default-action) | +| :green_heart: | ConventionalRouting | [Area w/o `area:exists`, default controller/action](#activity__conventionalrouting-area-wo-areaexists-default-controlleraction) | | :green_heart: | AttributeRouting | [Default action](#activity__attributerouting-default-action) | | :green_heart: | AttributeRouting | [Action without parameter](#activity__attributerouting-action-without-parameter) | | :green_heart: | AttributeRouting | [Action with parameter](#activity__attributerouting-action-with-parameter) | | :green_heart: | AttributeRouting | [Action with parameter before action name in template](#activity__attributerouting-action-with-parameter-before-action-name-in-template) | | :green_heart: | AttributeRouting | [Action invoked resulting in 400 Bad Request](#activity__attributerouting-action-invoked-resulting-in-400-bad-request) | -| :broken_heart: | RazorPages | [Root path](#activity__razorpages-root-path) | -| :broken_heart: | RazorPages | [Index page](#activity__razorpages-index-page) | -| :broken_heart: | RazorPages | [Throws exception](#activity__razorpages-throws-exception) | +| :green_heart: | RazorPages | [Root path](#activity__razorpages-root-path) | +| :green_heart: | RazorPages | [Index page](#activity__razorpages-index-page) | +| :green_heart: | RazorPages | [Throws exception](#activity__razorpages-throws-exception) | | :green_heart: | RazorPages | [Static content](#activity__razorpages-static-content) | | :green_heart: | MinimalApi | [Action without parameter](#activity__minimalapi-action-without-parameter) | | :green_heart: | MinimalApi | [Action with parameter](#activity__minimalapi-action-with-parameter) | @@ -38,7 +38,7 @@ | :broken_heart: | ConventionalRouting | [Non-default action with route parameter and query string](#metrics__conventionalrouting-non-default-action-with-route-parameter-and-query-string) | | :broken_heart: | ConventionalRouting | [Non-default action with query string](#metrics__conventionalrouting-non-default-action-with-query-string) | | :green_heart: | ConventionalRouting | [Not Found (404)](#metrics__conventionalrouting-not-found-404) | -| :green_heart: | ConventionalRouting | [Route template with parameter constraint](#metrics__conventionalrouting-route-template-with-parameter-constraint) | +| :broken_heart: | ConventionalRouting | [Route template with parameter constraint](#metrics__conventionalrouting-route-template-with-parameter-constraint) | | :green_heart: | ConventionalRouting | [Path that does not match parameter constraint](#metrics__conventionalrouting-path-that-does-not-match-parameter-constraint) | | :broken_heart: | ConventionalRouting | [Area using `area:exists`, default controller/action](#metrics__conventionalrouting-area-using-areaexists-default-controlleraction) | | :broken_heart: | ConventionalRouting | [Area using `area:exists`, non-default action](#metrics__conventionalrouting-area-using-areaexists-non-default-action) | @@ -49,14 +49,14 @@ | :green_heart: | AttributeRouting | [Action with parameter before action name in template](#metrics__attributerouting-action-with-parameter-before-action-name-in-template) | | :green_heart: | AttributeRouting | [Action invoked resulting in 400 Bad Request](#metrics__attributerouting-action-invoked-resulting-in-400-bad-request) | | :broken_heart: | RazorPages | [Root path](#metrics__razorpages-root-path) | -| :broken_heart: | RazorPages | [Index page](#metrics__razorpages-index-page) | -| :broken_heart: | RazorPages | [Throws exception](#metrics__razorpages-throws-exception) | +| :green_heart: | RazorPages | [Index page](#metrics__razorpages-index-page) | +| :green_heart: | RazorPages | [Throws exception](#metrics__razorpages-throws-exception) | | :green_heart: | RazorPages | [Static content](#metrics__razorpages-static-content) | -| :green_heart: | MinimalApi | [Action without parameter](#metrics__minimalapi-action-without-parameter) | -| :green_heart: | MinimalApi | [Action with parameter](#metrics__minimalapi-action-with-parameter) | -| :green_heart: | MinimalApi | [Action without parameter (MapGroup)](#metrics__minimalapi-action-without-parameter-mapgroup) | -| :green_heart: | MinimalApi | [Action with parameter (MapGroup)](#metrics__minimalapi-action-with-parameter-mapgroup) | -| :green_heart: | ExceptionMiddleware | [Exception Handled by Exception Handler Middleware](#metrics__exceptionmiddleware-exception-handled-by-exception-handler-middleware) | +| :broken_heart: | MinimalApi | [Action without parameter](#metrics__minimalapi-action-without-parameter) | +| :broken_heart: | MinimalApi | [Action with parameter](#metrics__minimalapi-action-with-parameter) | +| :broken_heart: | MinimalApi | [Action without parameter (MapGroup)](#metrics__minimalapi-action-without-parameter-mapgroup) | +| :broken_heart: | MinimalApi | [Action with parameter (MapGroup)](#metrics__minimalapi-action-with-parameter-mapgroup) | +| :broken_heart: | ExceptionMiddleware | [Exception Handled by Exception Handler Middleware](#metrics__exceptionmiddleware-exception-handled-by-exception-handler-middleware) | ## Tracing tests details @@ -65,9 +65,10 @@ ```json { - "ActivityDisplayName": "GET {controller=ConventionalRoute}/{action=Default}/{id?}", - "ActivityHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "IdealHttpRoute": "ConventionalRoute/Default/{id?}", + "ActivityDisplayName": "GET ConventionalRoute/Default", + "ActivityHttpRoute": "ConventionalRoute/Default", + "IdealHttpRoute": "ConventionalRoute/Default", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -94,9 +95,10 @@ ```json { - "ActivityDisplayName": "GET {controller=ConventionalRoute}/{action=Default}/{id?}", - "ActivityHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}", + "ActivityDisplayName": "GET ConventionalRoute/ActionWithStringParameter/{id}", + "ActivityHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id}", + "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id}", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter/2?num=3", @@ -127,9 +129,10 @@ ```json { - "ActivityDisplayName": "GET {controller=ConventionalRoute}/{action=Default}/{id?}", - "ActivityHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}", + "ActivityDisplayName": "GET ConventionalRoute/ActionWithStringParameter", + "ActivityHttpRoute": "ConventionalRoute/ActionWithStringParameter", + "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter?num=3", @@ -162,6 +165,7 @@ "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "IdealHttpRoute": "", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/NotFound", @@ -177,9 +181,10 @@ ```json { - "ActivityDisplayName": "GET SomePath/{id}/{num:int}", - "ActivityHttpRoute": "SomePath/{id}/{num:int}", - "IdealHttpRoute": "SomePath/{id}/{num:int}", + "ActivityDisplayName": "GET SomePath/{id}/{num}", + "ActivityHttpRoute": "SomePath/{id}/{num}", + "IdealHttpRoute": "SomePath/{id}/{num}", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/2", @@ -214,6 +219,7 @@ "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "IdealHttpRoute": "", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/NotAnInt", @@ -229,9 +235,10 @@ ```json { - "ActivityDisplayName": "GET {area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "ActivityHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "IdealHttpRoute": "{area:exists}/ControllerForMyArea/Default/{id?}", + "ActivityDisplayName": "GET MyArea/ControllerForMyArea/Default", + "ActivityHttpRoute": "MyArea/ControllerForMyArea/Default", + "IdealHttpRoute": "MyArea/ControllerForMyArea/Default", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea", @@ -259,9 +266,10 @@ ```json { - "ActivityDisplayName": "GET {area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "ActivityHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "IdealHttpRoute": "{area:exists}/ControllerForMyArea/NonDefault/{id?}", + "ActivityDisplayName": "GET MyArea/ControllerForMyArea/NonDefault", + "ActivityHttpRoute": "MyArea/ControllerForMyArea/NonDefault", + "IdealHttpRoute": "MyArea/ControllerForMyArea/NonDefault", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea/ControllerForMyArea/NonDefault", @@ -289,9 +297,10 @@ ```json { - "ActivityDisplayName": "GET SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", - "ActivityHttpRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", - "IdealHttpRoute": "SomePrefix/AnotherArea/Index/{id?}", + "ActivityDisplayName": "GET SomePrefix/AnotherArea/Index", + "ActivityHttpRoute": "SomePrefix/AnotherArea/Index", + "IdealHttpRoute": "SomePrefix/AnotherArea/Index", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePrefix", @@ -322,6 +331,7 @@ "ActivityDisplayName": "GET AttributeRoute", "ActivityHttpRoute": "AttributeRoute", "IdealHttpRoute": "AttributeRoute", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute", @@ -351,6 +361,7 @@ "ActivityDisplayName": "GET AttributeRoute/Get", "ActivityHttpRoute": "AttributeRoute/Get", "IdealHttpRoute": "AttributeRoute/Get", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get", @@ -380,6 +391,7 @@ "ActivityDisplayName": "GET AttributeRoute/Get/{id}", "ActivityHttpRoute": "AttributeRoute/Get/{id}", "IdealHttpRoute": "AttributeRoute/Get/{id}", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get/12", @@ -412,6 +424,7 @@ "ActivityDisplayName": "GET AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "ActivityHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/12/GetWithActionNameInDifferentSpotInTemplate", @@ -444,6 +457,7 @@ "ActivityDisplayName": "GET AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "ActivityHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/NotAnInt/GetWithActionNameInDifferentSpotInTemplate", @@ -473,9 +487,10 @@ ```json { - "ActivityDisplayName": "GET", - "ActivityHttpRoute": "", - "IdealHttpRoute": "/Index", + "ActivityDisplayName": "GET Index", + "ActivityHttpRoute": "Index", + "IdealHttpRoute": "Index", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -503,7 +518,8 @@ { "ActivityDisplayName": "GET Index", "ActivityHttpRoute": "Index", - "IdealHttpRoute": "/Index", + "IdealHttpRoute": "Index", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/Index", @@ -531,7 +547,8 @@ { "ActivityDisplayName": "GET PageThatThrowsException", "ActivityHttpRoute": "PageThatThrowsException", - "IdealHttpRoute": "/PageThatThrowsException", + "IdealHttpRoute": "PageThatThrowsException", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/PageThatThrowsException", @@ -560,6 +577,7 @@ "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "IdealHttpRoute": "", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/js/site.js", @@ -575,9 +593,10 @@ ```json { - "ActivityDisplayName": "GET /MinimalApi", - "ActivityHttpRoute": "/MinimalApi", - "IdealHttpRoute": "/MinimalApi", + "ActivityDisplayName": "GET MinimalApi", + "ActivityHttpRoute": "MinimalApi", + "IdealHttpRoute": "MinimalApi", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi", @@ -593,9 +612,10 @@ ```json { - "ActivityDisplayName": "GET /MinimalApi/{id}", - "ActivityHttpRoute": "/MinimalApi/{id}", - "IdealHttpRoute": "/MinimalApi/{id}", + "ActivityDisplayName": "GET MinimalApi/{id}", + "ActivityHttpRoute": "MinimalApi/{id}", + "IdealHttpRoute": "MinimalApi/{id}", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi/123", @@ -613,9 +633,10 @@ ```json { - "ActivityDisplayName": "GET /MinimalApiUsingMapGroup/", - "ActivityHttpRoute": "/MinimalApiUsingMapGroup/", - "IdealHttpRoute": "/MinimalApiUsingMapGroup/", + "ActivityDisplayName": "GET MinimalApiUsingMapGroup", + "ActivityHttpRoute": "MinimalApiUsingMapGroup", + "IdealHttpRoute": "MinimalApiUsingMapGroup", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup", @@ -631,9 +652,10 @@ ```json { - "ActivityDisplayName": "GET /MinimalApiUsingMapGroup/{id}", - "ActivityHttpRoute": "/MinimalApiUsingMapGroup/{id}", - "IdealHttpRoute": "/MinimalApiUsingMapGroup/{id}", + "ActivityDisplayName": "GET MinimalApiUsingMapGroup/{id}", + "ActivityHttpRoute": "MinimalApiUsingMapGroup/{id}", + "IdealHttpRoute": "MinimalApiUsingMapGroup/{id}", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup/123", @@ -651,9 +673,10 @@ ```json { - "ActivityDisplayName": "GET /Exception", - "ActivityHttpRoute": "/Exception", - "IdealHttpRoute": "/Exception", + "ActivityDisplayName": "GET Exception", + "ActivityHttpRoute": "Exception", + "IdealHttpRoute": "Exception", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/Exception", @@ -673,7 +696,8 @@ ```json { "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "IdealHttpRoute": "ConventionalRoute/Default/{id?}", + "IdealHttpRoute": "ConventionalRoute/Default", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -701,7 +725,8 @@ ```json { "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}", + "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id}", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter/2?num=3", @@ -733,7 +758,8 @@ ```json { "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}", + "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter?num=3", @@ -765,6 +791,7 @@ { "MetricHttpRoute": "", "IdealHttpRoute": "", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/NotFound", @@ -781,7 +808,8 @@ ```json { "MetricHttpRoute": "SomePath/{id}/{num:int}", - "IdealHttpRoute": "SomePath/{id}/{num:int}", + "IdealHttpRoute": "SomePath/{id}/{num}", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/2", @@ -815,6 +843,7 @@ { "MetricHttpRoute": "", "IdealHttpRoute": "", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/NotAnInt", @@ -831,7 +860,8 @@ ```json { "MetricHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "IdealHttpRoute": "{area:exists}/ControllerForMyArea/Default/{id?}", + "IdealHttpRoute": "MyArea/ControllerForMyArea/Default", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea", @@ -860,7 +890,8 @@ ```json { "MetricHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "IdealHttpRoute": "{area:exists}/ControllerForMyArea/NonDefault/{id?}", + "IdealHttpRoute": "MyArea/ControllerForMyArea/NonDefault", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea/ControllerForMyArea/NonDefault", @@ -889,7 +920,8 @@ ```json { "MetricHttpRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", - "IdealHttpRoute": "SomePrefix/AnotherArea/Index/{id?}", + "IdealHttpRoute": "SomePrefix/AnotherArea/Index", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePrefix", @@ -919,6 +951,7 @@ { "MetricHttpRoute": "AttributeRoute", "IdealHttpRoute": "AttributeRoute", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute", @@ -947,6 +980,7 @@ { "MetricHttpRoute": "AttributeRoute/Get", "IdealHttpRoute": "AttributeRoute/Get", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get", @@ -975,6 +1009,7 @@ { "MetricHttpRoute": "AttributeRoute/Get/{id}", "IdealHttpRoute": "AttributeRoute/Get/{id}", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get/12", @@ -1006,6 +1041,7 @@ { "MetricHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/12/GetWithActionNameInDifferentSpotInTemplate", @@ -1037,6 +1073,7 @@ { "MetricHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/NotAnInt/GetWithActionNameInDifferentSpotInTemplate", @@ -1067,7 +1104,8 @@ ```json { "MetricHttpRoute": "", - "IdealHttpRoute": "/Index", + "IdealHttpRoute": "Index", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -1094,7 +1132,8 @@ ```json { "MetricHttpRoute": "Index", - "IdealHttpRoute": "/Index", + "IdealHttpRoute": "Index", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/Index", @@ -1121,7 +1160,8 @@ ```json { "MetricHttpRoute": "PageThatThrowsException", - "IdealHttpRoute": "/PageThatThrowsException", + "IdealHttpRoute": "PageThatThrowsException", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/PageThatThrowsException", @@ -1149,6 +1189,7 @@ { "MetricHttpRoute": "", "IdealHttpRoute": "", + "IdeaHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/js/site.js", @@ -1165,7 +1206,8 @@ ```json { "MetricHttpRoute": "/MinimalApi", - "IdealHttpRoute": "/MinimalApi", + "IdealHttpRoute": "MinimalApi", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi", @@ -1182,7 +1224,8 @@ ```json { "MetricHttpRoute": "/MinimalApi/{id}", - "IdealHttpRoute": "/MinimalApi/{id}", + "IdealHttpRoute": "MinimalApi/{id}", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi/123", @@ -1201,7 +1244,8 @@ ```json { "MetricHttpRoute": "/MinimalApiUsingMapGroup/", - "IdealHttpRoute": "/MinimalApiUsingMapGroup/", + "IdealHttpRoute": "MinimalApiUsingMapGroup", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup", @@ -1218,7 +1262,8 @@ ```json { "MetricHttpRoute": "/MinimalApiUsingMapGroup/{id}", - "IdealHttpRoute": "/MinimalApiUsingMapGroup/{id}", + "IdealHttpRoute": "MinimalApiUsingMapGroup/{id}", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup/123", @@ -1237,7 +1282,8 @@ ```json { "MetricHttpRoute": "/Exception", - "IdealHttpRoute": "/Exception", + "IdealHttpRoute": "Exception", + "IdeaHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/Exception", diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json index f25d263a79..af3de9aba9 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json @@ -6,6 +6,7 @@ "path": "/", "expectedStatusCode": 200, "currentHttpRoute": null, + "currentMetricRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "expectedHttpRoute": "ConventionalRoute/Default" }, { @@ -15,6 +16,7 @@ "path": "/ConventionalRoute/ActionWithStringParameter/2?num=3", "expectedStatusCode": 200, "currentHttpRoute": null, + "currentMetricRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "expectedHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id}" }, { @@ -24,6 +26,7 @@ "path": "/ConventionalRoute/ActionWithStringParameter?num=3", "expectedStatusCode": 200, "currentHttpRoute": null, + "currentMetricRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "expectedHttpRoute": "ConventionalRoute/ActionWithStringParameter" }, { @@ -33,6 +36,7 @@ "path": "/ConventionalRoute/NotFound", "expectedStatusCode": 404, "currentHttpRoute": null, + "currentMetricRoute": null, "expectedHttpRoute": "" }, { @@ -42,6 +46,7 @@ "path": "/SomePath/SomeString/2", "expectedStatusCode": 200, "currentHttpRoute": null, + "currentMetricRoute": "SomePath/{id}/{num:int}", "expectedHttpRoute": "SomePath/{id}/{num}" }, { @@ -51,6 +56,7 @@ "path": "/SomePath/SomeString/NotAnInt", "expectedStatusCode": 404, "currentHttpRoute": null, + "currentMetricRoute": null, "expectedHttpRoute": "" }, { @@ -60,6 +66,7 @@ "path": "/MyArea", "expectedStatusCode": 200, "currentHttpRoute": null, + "currentMetricRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "expectedHttpRoute": "MyArea/ControllerForMyArea/Default" }, { @@ -69,6 +76,7 @@ "path": "/MyArea/ControllerForMyArea/NonDefault", "expectedStatusCode": 200, "currentHttpRoute": null, + "currentMetricRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "expectedHttpRoute": "MyArea/ControllerForMyArea/NonDefault" }, { @@ -78,6 +86,7 @@ "path": "/SomePrefix", "expectedStatusCode": 200, "currentHttpRoute": null, + "currentMetricRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", "expectedHttpRoute": "SomePrefix/AnotherArea/Index" }, { @@ -87,6 +96,7 @@ "path": "/AttributeRoute", "expectedStatusCode": 200, "currentHttpRoute": null, + "currentMetricRoute": null, "expectedHttpRoute": "AttributeRoute" }, { @@ -96,6 +106,7 @@ "path": "/AttributeRoute/Get", "expectedStatusCode": 200, "currentHttpRoute": null, + "currentMetricRoute": null, "expectedHttpRoute": "AttributeRoute/Get" }, { @@ -105,6 +116,7 @@ "path": "/AttributeRoute/Get/12", "expectedStatusCode": 200, "currentHttpRoute": null, + "currentMetricRoute": null, "expectedHttpRoute": "AttributeRoute/Get/{id}" }, { @@ -114,6 +126,7 @@ "path": "/AttributeRoute/12/GetWithActionNameInDifferentSpotInTemplate", "expectedStatusCode": 200, "currentHttpRoute": null, + "currentMetricRoute": null, "expectedHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate" }, { @@ -123,6 +136,7 @@ "path": "/AttributeRoute/NotAnInt/GetWithActionNameInDifferentSpotInTemplate", "expectedStatusCode": 400, "currentHttpRoute": null, + "currentMetricRoute": null, "expectedHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate" }, { @@ -133,6 +147,7 @@ "path": "/", "expectedStatusCode": 200, "currentHttpRoute": null, + "currentMetricRoute": "", "expectedHttpRoute": "Index" }, { @@ -142,6 +157,7 @@ "path": "/Index", "expectedStatusCode": 200, "currentHttpRoute": null, + "currentMetricRoute": null, "expectedHttpRoute": "Index" }, { @@ -150,7 +166,8 @@ "httpMethod": "GET", "path": "/PageThatThrowsException", "expectedStatusCode": 500, - "currentHttpRoute": "PageThatThrowsException", + "currentHttpRoute": null, + "currentMetricRoute": null, "expectedHttpRoute": "PageThatThrowsException" }, { @@ -160,6 +177,7 @@ "path": "/js/site.js", "expectedStatusCode": 200, "currentHttpRoute": null, + "currentMetricRoute": null, "expectedHttpRoute": "" }, { @@ -169,6 +187,7 @@ "path": "/MinimalApi", "expectedStatusCode": 200, "currentHttpRoute": null, + "currentMetricRoute": "/MinimalApi", "expectedHttpRoute": "MinimalApi" }, { @@ -178,6 +197,7 @@ "path": "/MinimalApi/123", "expectedStatusCode": 200, "currentHttpRoute": null, + "currentMetricRoute": "/MinimalApi/{id}", "expectedHttpRoute": "MinimalApi/{id}" }, { @@ -188,6 +208,7 @@ "path": "/MinimalApiUsingMapGroup", "expectedStatusCode": 200, "currentHttpRoute": null, + "currentMetricRoute": "/MinimalApiUsingMapGroup/", "expectedHttpRoute": "MinimalApiUsingMapGroup" }, { @@ -198,6 +219,7 @@ "path": "/MinimalApiUsingMapGroup/123", "expectedStatusCode": 200, "currentHttpRoute": null, + "currentMetricRoute": "/MinimalApiUsingMapGroup/{id}", "expectedHttpRoute": "MinimalApiUsingMapGroup/{id}" }, { @@ -207,6 +229,7 @@ "path": "/Exception", "expectedStatusCode": 500, "currentHttpRoute": null, + "currentMetricRoute": "/Exception", "expectedHttpRoute": "Exception" } ] diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestFixture.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestFixture.cs index c8c6643f12..922bf42d07 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestFixture.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestFixture.cs @@ -121,7 +121,7 @@ private void AppendTestResults(StringBuilder sb, IReadOnlyCollection Date: Tue, 4 Nov 2025 16:10:48 +0000 Subject: [PATCH 06/15] simplify routepattern for page --- .../Implementation/RouteAttributeHelper.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs b/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs index 297093f05e..4ba1c78702 100644 --- a/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs @@ -40,9 +40,9 @@ private static string GetRoutePattern(RoutePattern routePattern, RouteValueDicti if (routePattern.PathSegments.Count == 0) { // RazorPage default route - if (routePattern.Defaults.ContainsKey("page")) + if (routePattern.Defaults.TryGetValue("page", out var pageValue)) { - return routePattern.Defaults["page"]?.ToString()?.Trim('/') + return pageValue?.ToString()?.Trim('/') ?? string.Empty; } From ed8680ac5ca196eb820163d471ce2ac1aea81fa3 Mon Sep 17 00:00:00 2001 From: Rasmus Kuusmann Date: Tue, 4 Nov 2025 16:16:14 +0000 Subject: [PATCH 07/15] typo fix --- .../RouteTests/README.net8.0.md | 92 +++++++++---------- .../RouteTests/README.net9.0.md | 92 +++++++++---------- .../RouteTests/RoutingTestFixture.cs | 2 +- .../RouteTests/RoutingTestResult.cs | 2 +- .../RouteTests/RoutingTests.cs | 4 +- 5 files changed, 96 insertions(+), 96 deletions(-) diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net8.0.md b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net8.0.md index d0ebef0fc7..2bf611ad4a 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net8.0.md +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net8.0.md @@ -68,7 +68,7 @@ "ActivityDisplayName": "GET ConventionalRoute/Default", "ActivityHttpRoute": "ConventionalRoute/Default", "IdealHttpRoute": "ConventionalRoute/Default", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -98,7 +98,7 @@ "ActivityDisplayName": "GET ConventionalRoute/ActionWithStringParameter/{id}", "ActivityHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id}", "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id}", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter/2?num=3", @@ -132,7 +132,7 @@ "ActivityDisplayName": "GET ConventionalRoute/ActionWithStringParameter", "ActivityHttpRoute": "ConventionalRoute/ActionWithStringParameter", "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter?num=3", @@ -165,7 +165,7 @@ "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "IdealHttpRoute": "", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/NotFound", @@ -184,7 +184,7 @@ "ActivityDisplayName": "GET SomePath/{id}/{num}", "ActivityHttpRoute": "SomePath/{id}/{num}", "IdealHttpRoute": "SomePath/{id}/{num}", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/2", @@ -219,7 +219,7 @@ "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "IdealHttpRoute": "", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/NotAnInt", @@ -238,7 +238,7 @@ "ActivityDisplayName": "GET MyArea/ControllerForMyArea/Default", "ActivityHttpRoute": "MyArea/ControllerForMyArea/Default", "IdealHttpRoute": "MyArea/ControllerForMyArea/Default", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea", @@ -269,7 +269,7 @@ "ActivityDisplayName": "GET MyArea/ControllerForMyArea/NonDefault", "ActivityHttpRoute": "MyArea/ControllerForMyArea/NonDefault", "IdealHttpRoute": "MyArea/ControllerForMyArea/NonDefault", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea/ControllerForMyArea/NonDefault", @@ -300,7 +300,7 @@ "ActivityDisplayName": "GET SomePrefix/AnotherArea/Index", "ActivityHttpRoute": "SomePrefix/AnotherArea/Index", "IdealHttpRoute": "SomePrefix/AnotherArea/Index", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePrefix", @@ -331,7 +331,7 @@ "ActivityDisplayName": "GET AttributeRoute", "ActivityHttpRoute": "AttributeRoute", "IdealHttpRoute": "AttributeRoute", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute", @@ -361,7 +361,7 @@ "ActivityDisplayName": "GET AttributeRoute/Get", "ActivityHttpRoute": "AttributeRoute/Get", "IdealHttpRoute": "AttributeRoute/Get", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get", @@ -391,7 +391,7 @@ "ActivityDisplayName": "GET AttributeRoute/Get/{id}", "ActivityHttpRoute": "AttributeRoute/Get/{id}", "IdealHttpRoute": "AttributeRoute/Get/{id}", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get/12", @@ -424,7 +424,7 @@ "ActivityDisplayName": "GET AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "ActivityHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/12/GetWithActionNameInDifferentSpotInTemplate", @@ -457,7 +457,7 @@ "ActivityDisplayName": "GET AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "ActivityHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/NotAnInt/GetWithActionNameInDifferentSpotInTemplate", @@ -490,7 +490,7 @@ "ActivityDisplayName": "GET Index", "ActivityHttpRoute": "Index", "IdealHttpRoute": "Index", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -519,7 +519,7 @@ "ActivityDisplayName": "GET Index", "ActivityHttpRoute": "Index", "IdealHttpRoute": "Index", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/Index", @@ -548,7 +548,7 @@ "ActivityDisplayName": "GET PageThatThrowsException", "ActivityHttpRoute": "PageThatThrowsException", "IdealHttpRoute": "PageThatThrowsException", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/PageThatThrowsException", @@ -577,7 +577,7 @@ "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "IdealHttpRoute": "", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/js/site.js", @@ -596,7 +596,7 @@ "ActivityDisplayName": "GET MinimalApi", "ActivityHttpRoute": "MinimalApi", "IdealHttpRoute": "MinimalApi", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi", @@ -615,7 +615,7 @@ "ActivityDisplayName": "GET MinimalApi/{id}", "ActivityHttpRoute": "MinimalApi/{id}", "IdealHttpRoute": "MinimalApi/{id}", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi/123", @@ -636,7 +636,7 @@ "ActivityDisplayName": "GET MinimalApiUsingMapGroup", "ActivityHttpRoute": "MinimalApiUsingMapGroup", "IdealHttpRoute": "MinimalApiUsingMapGroup", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup", @@ -655,7 +655,7 @@ "ActivityDisplayName": "GET MinimalApiUsingMapGroup/{id}", "ActivityHttpRoute": "MinimalApiUsingMapGroup/{id}", "IdealHttpRoute": "MinimalApiUsingMapGroup/{id}", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup/123", @@ -676,7 +676,7 @@ "ActivityDisplayName": "GET Exception", "ActivityHttpRoute": "Exception", "IdealHttpRoute": "Exception", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/Exception", @@ -697,7 +697,7 @@ { "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "IdealHttpRoute": "ConventionalRoute/Default", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -726,7 +726,7 @@ { "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id}", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter/2?num=3", @@ -759,7 +759,7 @@ { "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter?num=3", @@ -791,7 +791,7 @@ { "MetricHttpRoute": "", "IdealHttpRoute": "", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/NotFound", @@ -809,7 +809,7 @@ { "MetricHttpRoute": "SomePath/{id}/{num:int}", "IdealHttpRoute": "SomePath/{id}/{num}", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/2", @@ -843,7 +843,7 @@ { "MetricHttpRoute": "", "IdealHttpRoute": "", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/NotAnInt", @@ -861,7 +861,7 @@ { "MetricHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "IdealHttpRoute": "MyArea/ControllerForMyArea/Default", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea", @@ -891,7 +891,7 @@ { "MetricHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "IdealHttpRoute": "MyArea/ControllerForMyArea/NonDefault", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea/ControllerForMyArea/NonDefault", @@ -921,7 +921,7 @@ { "MetricHttpRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", "IdealHttpRoute": "SomePrefix/AnotherArea/Index", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePrefix", @@ -951,7 +951,7 @@ { "MetricHttpRoute": "AttributeRoute", "IdealHttpRoute": "AttributeRoute", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute", @@ -980,7 +980,7 @@ { "MetricHttpRoute": "AttributeRoute/Get", "IdealHttpRoute": "AttributeRoute/Get", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get", @@ -1009,7 +1009,7 @@ { "MetricHttpRoute": "AttributeRoute/Get/{id}", "IdealHttpRoute": "AttributeRoute/Get/{id}", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get/12", @@ -1041,7 +1041,7 @@ { "MetricHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/12/GetWithActionNameInDifferentSpotInTemplate", @@ -1073,7 +1073,7 @@ { "MetricHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/NotAnInt/GetWithActionNameInDifferentSpotInTemplate", @@ -1105,7 +1105,7 @@ { "MetricHttpRoute": "", "IdealHttpRoute": "Index", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -1133,7 +1133,7 @@ { "MetricHttpRoute": "Index", "IdealHttpRoute": "Index", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/Index", @@ -1161,7 +1161,7 @@ { "MetricHttpRoute": "PageThatThrowsException", "IdealHttpRoute": "PageThatThrowsException", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/PageThatThrowsException", @@ -1189,7 +1189,7 @@ { "MetricHttpRoute": "", "IdealHttpRoute": "", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/js/site.js", @@ -1207,7 +1207,7 @@ { "MetricHttpRoute": "/MinimalApi", "IdealHttpRoute": "MinimalApi", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi", @@ -1225,7 +1225,7 @@ { "MetricHttpRoute": "/MinimalApi/{id}", "IdealHttpRoute": "MinimalApi/{id}", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi/123", @@ -1245,7 +1245,7 @@ { "MetricHttpRoute": "/MinimalApiUsingMapGroup/", "IdealHttpRoute": "MinimalApiUsingMapGroup", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup", @@ -1263,7 +1263,7 @@ { "MetricHttpRoute": "/MinimalApiUsingMapGroup/{id}", "IdealHttpRoute": "MinimalApiUsingMapGroup/{id}", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup/123", @@ -1283,7 +1283,7 @@ { "MetricHttpRoute": "/Exception", "IdealHttpRoute": "Exception", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/Exception", diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net9.0.md b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net9.0.md index 158f055171..3ef17c51a9 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net9.0.md +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net9.0.md @@ -68,7 +68,7 @@ "ActivityDisplayName": "GET ConventionalRoute/Default", "ActivityHttpRoute": "ConventionalRoute/Default", "IdealHttpRoute": "ConventionalRoute/Default", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -98,7 +98,7 @@ "ActivityDisplayName": "GET ConventionalRoute/ActionWithStringParameter/{id}", "ActivityHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id}", "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id}", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter/2?num=3", @@ -132,7 +132,7 @@ "ActivityDisplayName": "GET ConventionalRoute/ActionWithStringParameter", "ActivityHttpRoute": "ConventionalRoute/ActionWithStringParameter", "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter?num=3", @@ -165,7 +165,7 @@ "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "IdealHttpRoute": "", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/NotFound", @@ -184,7 +184,7 @@ "ActivityDisplayName": "GET SomePath/{id}/{num}", "ActivityHttpRoute": "SomePath/{id}/{num}", "IdealHttpRoute": "SomePath/{id}/{num}", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/2", @@ -219,7 +219,7 @@ "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "IdealHttpRoute": "", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/NotAnInt", @@ -238,7 +238,7 @@ "ActivityDisplayName": "GET MyArea/ControllerForMyArea/Default", "ActivityHttpRoute": "MyArea/ControllerForMyArea/Default", "IdealHttpRoute": "MyArea/ControllerForMyArea/Default", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea", @@ -269,7 +269,7 @@ "ActivityDisplayName": "GET MyArea/ControllerForMyArea/NonDefault", "ActivityHttpRoute": "MyArea/ControllerForMyArea/NonDefault", "IdealHttpRoute": "MyArea/ControllerForMyArea/NonDefault", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea/ControllerForMyArea/NonDefault", @@ -300,7 +300,7 @@ "ActivityDisplayName": "GET SomePrefix/AnotherArea/Index", "ActivityHttpRoute": "SomePrefix/AnotherArea/Index", "IdealHttpRoute": "SomePrefix/AnotherArea/Index", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePrefix", @@ -331,7 +331,7 @@ "ActivityDisplayName": "GET AttributeRoute", "ActivityHttpRoute": "AttributeRoute", "IdealHttpRoute": "AttributeRoute", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute", @@ -361,7 +361,7 @@ "ActivityDisplayName": "GET AttributeRoute/Get", "ActivityHttpRoute": "AttributeRoute/Get", "IdealHttpRoute": "AttributeRoute/Get", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get", @@ -391,7 +391,7 @@ "ActivityDisplayName": "GET AttributeRoute/Get/{id}", "ActivityHttpRoute": "AttributeRoute/Get/{id}", "IdealHttpRoute": "AttributeRoute/Get/{id}", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get/12", @@ -424,7 +424,7 @@ "ActivityDisplayName": "GET AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "ActivityHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/12/GetWithActionNameInDifferentSpotInTemplate", @@ -457,7 +457,7 @@ "ActivityDisplayName": "GET AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "ActivityHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/NotAnInt/GetWithActionNameInDifferentSpotInTemplate", @@ -490,7 +490,7 @@ "ActivityDisplayName": "GET Index", "ActivityHttpRoute": "Index", "IdealHttpRoute": "Index", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -519,7 +519,7 @@ "ActivityDisplayName": "GET Index", "ActivityHttpRoute": "Index", "IdealHttpRoute": "Index", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/Index", @@ -548,7 +548,7 @@ "ActivityDisplayName": "GET PageThatThrowsException", "ActivityHttpRoute": "PageThatThrowsException", "IdealHttpRoute": "PageThatThrowsException", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/PageThatThrowsException", @@ -577,7 +577,7 @@ "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "IdealHttpRoute": "", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/js/site.js", @@ -596,7 +596,7 @@ "ActivityDisplayName": "GET MinimalApi", "ActivityHttpRoute": "MinimalApi", "IdealHttpRoute": "MinimalApi", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi", @@ -615,7 +615,7 @@ "ActivityDisplayName": "GET MinimalApi/{id}", "ActivityHttpRoute": "MinimalApi/{id}", "IdealHttpRoute": "MinimalApi/{id}", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi/123", @@ -636,7 +636,7 @@ "ActivityDisplayName": "GET MinimalApiUsingMapGroup", "ActivityHttpRoute": "MinimalApiUsingMapGroup", "IdealHttpRoute": "MinimalApiUsingMapGroup", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup", @@ -655,7 +655,7 @@ "ActivityDisplayName": "GET MinimalApiUsingMapGroup/{id}", "ActivityHttpRoute": "MinimalApiUsingMapGroup/{id}", "IdealHttpRoute": "MinimalApiUsingMapGroup/{id}", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup/123", @@ -676,7 +676,7 @@ "ActivityDisplayName": "GET Exception", "ActivityHttpRoute": "Exception", "IdealHttpRoute": "Exception", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/Exception", @@ -697,7 +697,7 @@ { "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "IdealHttpRoute": "ConventionalRoute/Default", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -726,7 +726,7 @@ { "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id}", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter/2?num=3", @@ -759,7 +759,7 @@ { "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter?num=3", @@ -791,7 +791,7 @@ { "MetricHttpRoute": "", "IdealHttpRoute": "", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/NotFound", @@ -809,7 +809,7 @@ { "MetricHttpRoute": "SomePath/{id}/{num:int}", "IdealHttpRoute": "SomePath/{id}/{num}", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/2", @@ -843,7 +843,7 @@ { "MetricHttpRoute": "", "IdealHttpRoute": "", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/NotAnInt", @@ -861,7 +861,7 @@ { "MetricHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "IdealHttpRoute": "MyArea/ControllerForMyArea/Default", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea", @@ -891,7 +891,7 @@ { "MetricHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "IdealHttpRoute": "MyArea/ControllerForMyArea/NonDefault", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea/ControllerForMyArea/NonDefault", @@ -921,7 +921,7 @@ { "MetricHttpRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", "IdealHttpRoute": "SomePrefix/AnotherArea/Index", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePrefix", @@ -951,7 +951,7 @@ { "MetricHttpRoute": "AttributeRoute", "IdealHttpRoute": "AttributeRoute", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute", @@ -980,7 +980,7 @@ { "MetricHttpRoute": "AttributeRoute/Get", "IdealHttpRoute": "AttributeRoute/Get", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get", @@ -1009,7 +1009,7 @@ { "MetricHttpRoute": "AttributeRoute/Get/{id}", "IdealHttpRoute": "AttributeRoute/Get/{id}", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get/12", @@ -1041,7 +1041,7 @@ { "MetricHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/12/GetWithActionNameInDifferentSpotInTemplate", @@ -1073,7 +1073,7 @@ { "MetricHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/NotAnInt/GetWithActionNameInDifferentSpotInTemplate", @@ -1105,7 +1105,7 @@ { "MetricHttpRoute": "", "IdealHttpRoute": "Index", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -1133,7 +1133,7 @@ { "MetricHttpRoute": "Index", "IdealHttpRoute": "Index", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/Index", @@ -1161,7 +1161,7 @@ { "MetricHttpRoute": "PageThatThrowsException", "IdealHttpRoute": "PageThatThrowsException", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/PageThatThrowsException", @@ -1189,7 +1189,7 @@ { "MetricHttpRoute": "", "IdealHttpRoute": "", - "IdeaHttpRouteMatch": true, + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/js/site.js", @@ -1207,7 +1207,7 @@ { "MetricHttpRoute": "/MinimalApi", "IdealHttpRoute": "MinimalApi", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi", @@ -1225,7 +1225,7 @@ { "MetricHttpRoute": "/MinimalApi/{id}", "IdealHttpRoute": "MinimalApi/{id}", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi/123", @@ -1245,7 +1245,7 @@ { "MetricHttpRoute": "/MinimalApiUsingMapGroup/", "IdealHttpRoute": "MinimalApiUsingMapGroup", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup", @@ -1263,7 +1263,7 @@ { "MetricHttpRoute": "/MinimalApiUsingMapGroup/{id}", "IdealHttpRoute": "MinimalApiUsingMapGroup/{id}", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup/123", @@ -1283,7 +1283,7 @@ { "MetricHttpRoute": "/Exception", "IdealHttpRoute": "Exception", - "IdeaHttpRouteMatch": false, + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/Exception", diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestFixture.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestFixture.cs index 922bf42d07..4a5b751ad3 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestFixture.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestFixture.cs @@ -121,7 +121,7 @@ private void AppendTestResults(StringBuilder sb, IReadOnlyCollection Date: Tue, 4 Nov 2025 16:26:33 +0000 Subject: [PATCH 08/15] fix if statement --- .../Implementation/RouteAttributeHelper.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs b/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs index 4ba1c78702..955fcc094f 100644 --- a/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/RouteAttributeHelper.cs @@ -67,8 +67,7 @@ private static string GetRoutePattern(RoutePattern routePattern, RouteValueDicti case "area": case "controller": case "action": - routePattern.RequiredValues.TryGetValue(parameterPart.Name, out var parameterValue); - if (parameterValue != null) + if (routePattern.RequiredValues.TryGetValue(parameterPart.Name, out var parameterValue) && parameterValue != null) { sb.Append(parameterValue); sb.Append('/'); From 92d1c9c6b1ab68779904c090b56071738abbb05a Mon Sep 17 00:00:00 2001 From: Rasmus Kuusmann Date: Wed, 5 Nov 2025 12:31:46 +0000 Subject: [PATCH 09/15] update docs --- .../CHANGELOG.md | 5 +++++ .../RouteTests/README.md | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md b/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md index 99c07267b2..7bbcb1c973 100644 --- a/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md @@ -2,6 +2,11 @@ ## Unreleased +* Fixes an issue where `http.route` attribute reported only a plain route template for some routing options. + Therefore, the HTTP span display name has been also changed to a more meaningful value. + ([#3338](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/3338)) + + ## 1.13.0 Released 2025-Oct-22 diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.md b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.md index fa683ab275..d2bd2643f9 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.md +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.md @@ -34,8 +34,8 @@ generated for a test case: ```json { - "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}", - "ActivityDisplayName": "/ConventionalRoute/ActionWithStringParameter/2", + "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id}", + "ActivityDisplayName": "GET ConventionalRoute/ActionWithStringParameter/2", "ActivityHttpRoute": "", "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "RouteInfo": { @@ -65,9 +65,9 @@ generated for a test case: ``` > [!NOTE] -> The test result currently includes an `IdealHttpRoute` property. This is -> temporary, and is meant to drive a conversation to determine the best way -> for generating the `http.route` attribute under different routing scenarios. +> The test result includes an `IdealHttpRoute` property. It is meant to drive +> a conversation to determine the best way for generating the `http.route` +> attribute under different routing scenarios. > In the example above, the path invoked is > `/ConventionalRoute/ActionWithStringParameter/2?num=3`. Currently, we see > that the `http.route` attribute on the metric emitted is From c75d643164a40e3ff5f3c8c08777b7f79f0476ba Mon Sep 17 00:00:00 2001 From: Rasmus Kuusmann Date: Wed, 5 Nov 2025 12:51:48 +0000 Subject: [PATCH 10/15] fix line length --- src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md b/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md index 63b1918151..d6cc46cf91 100644 --- a/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md @@ -5,8 +5,9 @@ * Add support for .NET 10.0. ([#2822](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/2822)) -* Fixes an issue where `http.route` attribute reported only a plain route template for some routing options. - Therefore, the HTTP span display name has been also changed to a more meaningful value. +* Fixes an issue where `http.route` attribute reported only a plain route + template for some routing options. Therefore, the HTTP span display name + has been also changed to a more meaningful value. ([#3338](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/3338)) From bb380b9b89e683798b59d46c1831481b297a6c16 Mon Sep 17 00:00:00 2001 From: Rasmus Kuusmann Date: Wed, 5 Nov 2025 12:53:03 +0000 Subject: [PATCH 11/15] fix md012 --- src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md b/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md index d6cc46cf91..25892a6366 100644 --- a/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md @@ -10,7 +10,6 @@ has been also changed to a more meaningful value. ([#3338](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/3338)) - ## 1.13.0 Released 2025-Oct-22 From 833fc3953c2d9b85764002c1737fc5346ce912c6 Mon Sep 17 00:00:00 2001 From: Rasmus Kuusmann Date: Wed, 5 Nov 2025 12:54:10 +0000 Subject: [PATCH 12/15] remove space --- src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md b/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md index 25892a6366..b452bdf469 100644 --- a/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md @@ -9,7 +9,7 @@ template for some routing options. Therefore, the HTTP span display name has been also changed to a more meaningful value. ([#3338](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/3338)) - + ## 1.13.0 Released 2025-Oct-22 From d57c244866d29e08d319e76cc1e6ed6c85de1f98 Mon Sep 17 00:00:00 2001 From: Rasmus Kuusmann Date: Wed, 5 Nov 2025 16:29:27 +0000 Subject: [PATCH 13/15] fix .net10 --- ...ry.Instrumentation.AspNetCore.Tests.csproj | 4 +- .../RouteTests/README.net10.0.md | 192 +++++++++++------- .../RouteTests/RoutingTestCases.json | 6 +- 3 files changed, 124 insertions(+), 78 deletions(-) diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/OpenTelemetry.Instrumentation.AspNetCore.Tests.csproj b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/OpenTelemetry.Instrumentation.AspNetCore.Tests.csproj index fe9ef429fc..efd13f5aa6 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/OpenTelemetry.Instrumentation.AspNetCore.Tests.csproj +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/OpenTelemetry.Instrumentation.AspNetCore.Tests.csproj @@ -1,4 +1,4 @@ - + $(SupportedNetTargets) @@ -7,7 +7,7 @@ - + diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net10.0.md b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net10.0.md index 602cd08bde..0dc4c18e50 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net10.0.md +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net10.0.md @@ -6,23 +6,23 @@ | http.route | App | Test Name | | - | - | - | -| :broken_heart: | ConventionalRouting | [Root path](#activity__conventionalrouting-root-path) | -| :broken_heart: | ConventionalRouting | [Non-default action with route parameter and query string](#activity__conventionalrouting-non-default-action-with-route-parameter-and-query-string) | -| :broken_heart: | ConventionalRouting | [Non-default action with query string](#activity__conventionalrouting-non-default-action-with-query-string) | +| :green_heart: | ConventionalRouting | [Root path](#activity__conventionalrouting-root-path) | +| :green_heart: | ConventionalRouting | [Non-default action with route parameter and query string](#activity__conventionalrouting-non-default-action-with-route-parameter-and-query-string) | +| :green_heart: | ConventionalRouting | [Non-default action with query string](#activity__conventionalrouting-non-default-action-with-query-string) | | :green_heart: | ConventionalRouting | [Not Found (404)](#activity__conventionalrouting-not-found-404) | | :green_heart: | ConventionalRouting | [Route template with parameter constraint](#activity__conventionalrouting-route-template-with-parameter-constraint) | | :green_heart: | ConventionalRouting | [Path that does not match parameter constraint](#activity__conventionalrouting-path-that-does-not-match-parameter-constraint) | -| :broken_heart: | ConventionalRouting | [Area using `area:exists`, default controller/action](#activity__conventionalrouting-area-using-areaexists-default-controlleraction) | -| :broken_heart: | ConventionalRouting | [Area using `area:exists`, non-default action](#activity__conventionalrouting-area-using-areaexists-non-default-action) | -| :broken_heart: | ConventionalRouting | [Area w/o `area:exists`, default controller/action](#activity__conventionalrouting-area-wo-areaexists-default-controlleraction) | +| :green_heart: | ConventionalRouting | [Area using `area:exists`, default controller/action](#activity__conventionalrouting-area-using-areaexists-default-controlleraction) | +| :green_heart: | ConventionalRouting | [Area using `area:exists`, non-default action](#activity__conventionalrouting-area-using-areaexists-non-default-action) | +| :green_heart: | ConventionalRouting | [Area w/o `area:exists`, default controller/action](#activity__conventionalrouting-area-wo-areaexists-default-controlleraction) | | :green_heart: | AttributeRouting | [Default action](#activity__attributerouting-default-action) | | :green_heart: | AttributeRouting | [Action without parameter](#activity__attributerouting-action-without-parameter) | | :green_heart: | AttributeRouting | [Action with parameter](#activity__attributerouting-action-with-parameter) | | :green_heart: | AttributeRouting | [Action with parameter before action name in template](#activity__attributerouting-action-with-parameter-before-action-name-in-template) | | :green_heart: | AttributeRouting | [Action invoked resulting in 400 Bad Request](#activity__attributerouting-action-invoked-resulting-in-400-bad-request) | -| :broken_heart: | RazorPages | [Root path](#activity__razorpages-root-path) | -| :broken_heart: | RazorPages | [Index page](#activity__razorpages-index-page) | -| :broken_heart: | RazorPages | [Throws exception](#activity__razorpages-throws-exception) | +| :green_heart: | RazorPages | [Root path](#activity__razorpages-root-path) | +| :green_heart: | RazorPages | [Index page](#activity__razorpages-index-page) | +| :green_heart: | RazorPages | [Throws exception](#activity__razorpages-throws-exception) | | :green_heart: | RazorPages | [Static content](#activity__razorpages-static-content) | | :green_heart: | MinimalApi | [Action without parameter](#activity__minimalapi-action-without-parameter) | | :green_heart: | MinimalApi | [Action with parameter](#activity__minimalapi-action-with-parameter) | @@ -38,7 +38,7 @@ | :broken_heart: | ConventionalRouting | [Non-default action with route parameter and query string](#metrics__conventionalrouting-non-default-action-with-route-parameter-and-query-string) | | :broken_heart: | ConventionalRouting | [Non-default action with query string](#metrics__conventionalrouting-non-default-action-with-query-string) | | :green_heart: | ConventionalRouting | [Not Found (404)](#metrics__conventionalrouting-not-found-404) | -| :green_heart: | ConventionalRouting | [Route template with parameter constraint](#metrics__conventionalrouting-route-template-with-parameter-constraint) | +| :broken_heart: | ConventionalRouting | [Route template with parameter constraint](#metrics__conventionalrouting-route-template-with-parameter-constraint) | | :green_heart: | ConventionalRouting | [Path that does not match parameter constraint](#metrics__conventionalrouting-path-that-does-not-match-parameter-constraint) | | :broken_heart: | ConventionalRouting | [Area using `area:exists`, default controller/action](#metrics__conventionalrouting-area-using-areaexists-default-controlleraction) | | :broken_heart: | ConventionalRouting | [Area using `area:exists`, non-default action](#metrics__conventionalrouting-area-using-areaexists-non-default-action) | @@ -49,14 +49,14 @@ | :green_heart: | AttributeRouting | [Action with parameter before action name in template](#metrics__attributerouting-action-with-parameter-before-action-name-in-template) | | :green_heart: | AttributeRouting | [Action invoked resulting in 400 Bad Request](#metrics__attributerouting-action-invoked-resulting-in-400-bad-request) | | :broken_heart: | RazorPages | [Root path](#metrics__razorpages-root-path) | -| :broken_heart: | RazorPages | [Index page](#metrics__razorpages-index-page) | -| :broken_heart: | RazorPages | [Throws exception](#metrics__razorpages-throws-exception) | +| :green_heart: | RazorPages | [Index page](#metrics__razorpages-index-page) | +| :green_heart: | RazorPages | [Throws exception](#metrics__razorpages-throws-exception) | | :green_heart: | RazorPages | [Static content](#metrics__razorpages-static-content) | -| :green_heart: | MinimalApi | [Action without parameter](#metrics__minimalapi-action-without-parameter) | -| :green_heart: | MinimalApi | [Action with parameter](#metrics__minimalapi-action-with-parameter) | -| :green_heart: | MinimalApi | [Action without parameter (MapGroup)](#metrics__minimalapi-action-without-parameter-mapgroup) | -| :green_heart: | MinimalApi | [Action with parameter (MapGroup)](#metrics__minimalapi-action-with-parameter-mapgroup) | -| :green_heart: | ExceptionMiddleware | [Exception Handled by Exception Handler Middleware](#metrics__exceptionmiddleware-exception-handled-by-exception-handler-middleware) | +| :broken_heart: | MinimalApi | [Action without parameter](#metrics__minimalapi-action-without-parameter) | +| :broken_heart: | MinimalApi | [Action with parameter](#metrics__minimalapi-action-with-parameter) | +| :broken_heart: | MinimalApi | [Action without parameter (MapGroup)](#metrics__minimalapi-action-without-parameter-mapgroup) | +| :broken_heart: | MinimalApi | [Action with parameter (MapGroup)](#metrics__minimalapi-action-with-parameter-mapgroup) | +| :broken_heart: | ExceptionMiddleware | [Exception Handled by Exception Handler Middleware](#metrics__exceptionmiddleware-exception-handled-by-exception-handler-middleware) | ## Tracing tests details @@ -65,9 +65,10 @@ ```json { - "ActivityDisplayName": "GET {controller=ConventionalRoute}/{action=Default}/{id?}", - "ActivityHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "IdealHttpRoute": "ConventionalRoute/Default/{id?}", + "ActivityDisplayName": "GET ConventionalRoute/Default", + "ActivityHttpRoute": "ConventionalRoute/Default", + "IdealHttpRoute": "ConventionalRoute/Default", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -94,9 +95,10 @@ ```json { - "ActivityDisplayName": "GET {controller=ConventionalRoute}/{action=Default}/{id?}", - "ActivityHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}", + "ActivityDisplayName": "GET ConventionalRoute/ActionWithStringParameter/{id}", + "ActivityHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id}", + "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id}", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter/2?num=3", @@ -127,9 +129,10 @@ ```json { - "ActivityDisplayName": "GET {controller=ConventionalRoute}/{action=Default}/{id?}", - "ActivityHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}", + "ActivityDisplayName": "GET ConventionalRoute/ActionWithStringParameter", + "ActivityHttpRoute": "ConventionalRoute/ActionWithStringParameter", + "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter?num=3", @@ -162,6 +165,7 @@ "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "IdealHttpRoute": "", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/NotFound", @@ -177,9 +181,10 @@ ```json { - "ActivityDisplayName": "GET SomePath/{id}/{num:int}", - "ActivityHttpRoute": "SomePath/{id}/{num:int}", - "IdealHttpRoute": "SomePath/{id}/{num:int}", + "ActivityDisplayName": "GET SomePath/{id}/{num}", + "ActivityHttpRoute": "SomePath/{id}/{num}", + "IdealHttpRoute": "SomePath/{id}/{num}", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/2", @@ -214,6 +219,7 @@ "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "IdealHttpRoute": "", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/NotAnInt", @@ -229,9 +235,10 @@ ```json { - "ActivityDisplayName": "GET {area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "ActivityHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "IdealHttpRoute": "{area:exists}/ControllerForMyArea/Default/{id?}", + "ActivityDisplayName": "GET MyArea/ControllerForMyArea/Default", + "ActivityHttpRoute": "MyArea/ControllerForMyArea/Default", + "IdealHttpRoute": "MyArea/ControllerForMyArea/Default", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea", @@ -259,9 +266,10 @@ ```json { - "ActivityDisplayName": "GET {area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "ActivityHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "IdealHttpRoute": "{area:exists}/ControllerForMyArea/NonDefault/{id?}", + "ActivityDisplayName": "GET MyArea/ControllerForMyArea/NonDefault", + "ActivityHttpRoute": "MyArea/ControllerForMyArea/NonDefault", + "IdealHttpRoute": "MyArea/ControllerForMyArea/NonDefault", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea/ControllerForMyArea/NonDefault", @@ -289,9 +297,10 @@ ```json { - "ActivityDisplayName": "GET SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", - "ActivityHttpRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", - "IdealHttpRoute": "SomePrefix/AnotherArea/Index/{id?}", + "ActivityDisplayName": "GET SomePrefix/AnotherArea/Index", + "ActivityHttpRoute": "SomePrefix/AnotherArea/Index", + "IdealHttpRoute": "SomePrefix/AnotherArea/Index", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePrefix", @@ -322,6 +331,7 @@ "ActivityDisplayName": "GET AttributeRoute", "ActivityHttpRoute": "AttributeRoute", "IdealHttpRoute": "AttributeRoute", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute", @@ -351,6 +361,7 @@ "ActivityDisplayName": "GET AttributeRoute/Get", "ActivityHttpRoute": "AttributeRoute/Get", "IdealHttpRoute": "AttributeRoute/Get", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get", @@ -380,6 +391,7 @@ "ActivityDisplayName": "GET AttributeRoute/Get/{id}", "ActivityHttpRoute": "AttributeRoute/Get/{id}", "IdealHttpRoute": "AttributeRoute/Get/{id}", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get/12", @@ -412,6 +424,7 @@ "ActivityDisplayName": "GET AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "ActivityHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/12/GetWithActionNameInDifferentSpotInTemplate", @@ -444,6 +457,7 @@ "ActivityDisplayName": "GET AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "ActivityHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/NotAnInt/GetWithActionNameInDifferentSpotInTemplate", @@ -473,9 +487,10 @@ ```json { - "ActivityDisplayName": "GET", - "ActivityHttpRoute": "", - "IdealHttpRoute": "/Index", + "ActivityDisplayName": "GET Index", + "ActivityHttpRoute": "Index", + "IdealHttpRoute": "Index", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -503,7 +518,8 @@ { "ActivityDisplayName": "GET Index", "ActivityHttpRoute": "Index", - "IdealHttpRoute": "/Index", + "IdealHttpRoute": "Index", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/Index", @@ -531,7 +547,8 @@ { "ActivityDisplayName": "GET PageThatThrowsException", "ActivityHttpRoute": "PageThatThrowsException", - "IdealHttpRoute": "/PageThatThrowsException", + "IdealHttpRoute": "PageThatThrowsException", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/PageThatThrowsException", @@ -560,6 +577,7 @@ "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "IdealHttpRoute": "", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/js/site.js", @@ -575,9 +593,10 @@ ```json { - "ActivityDisplayName": "GET /MinimalApi", - "ActivityHttpRoute": "/MinimalApi", - "IdealHttpRoute": "/MinimalApi", + "ActivityDisplayName": "GET MinimalApi", + "ActivityHttpRoute": "MinimalApi", + "IdealHttpRoute": "MinimalApi", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi", @@ -593,9 +612,10 @@ ```json { - "ActivityDisplayName": "GET /MinimalApi/{id}", - "ActivityHttpRoute": "/MinimalApi/{id}", - "IdealHttpRoute": "/MinimalApi/{id}", + "ActivityDisplayName": "GET MinimalApi/{id}", + "ActivityHttpRoute": "MinimalApi/{id}", + "IdealHttpRoute": "MinimalApi/{id}", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi/123", @@ -613,9 +633,10 @@ ```json { - "ActivityDisplayName": "GET /MinimalApiUsingMapGroup/", - "ActivityHttpRoute": "/MinimalApiUsingMapGroup/", - "IdealHttpRoute": "/MinimalApiUsingMapGroup/", + "ActivityDisplayName": "GET MinimalApiUsingMapGroup", + "ActivityHttpRoute": "MinimalApiUsingMapGroup", + "IdealHttpRoute": "MinimalApiUsingMapGroup", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup", @@ -631,9 +652,10 @@ ```json { - "ActivityDisplayName": "GET /MinimalApiUsingMapGroup/{id}", - "ActivityHttpRoute": "/MinimalApiUsingMapGroup/{id}", - "IdealHttpRoute": "/MinimalApiUsingMapGroup/{id}", + "ActivityDisplayName": "GET MinimalApiUsingMapGroup/{id}", + "ActivityHttpRoute": "MinimalApiUsingMapGroup/{id}", + "IdealHttpRoute": "MinimalApiUsingMapGroup/{id}", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup/123", @@ -651,9 +673,10 @@ ```json { - "ActivityDisplayName": "GET /Exception", - "ActivityHttpRoute": "/Exception", - "IdealHttpRoute": "/Exception", + "ActivityDisplayName": "GET Exception", + "ActivityHttpRoute": "Exception", + "IdealHttpRoute": "Exception", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/Exception", @@ -673,7 +696,8 @@ ```json { "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "IdealHttpRoute": "ConventionalRoute/Default/{id?}", + "IdealHttpRoute": "ConventionalRoute/Default", + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -701,7 +725,8 @@ ```json { "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}", + "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id}", + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter/2?num=3", @@ -733,7 +758,8 @@ ```json { "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", - "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}", + "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter", + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/ActionWithStringParameter?num=3", @@ -765,6 +791,7 @@ { "MetricHttpRoute": "", "IdealHttpRoute": "", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/ConventionalRoute/NotFound", @@ -781,7 +808,8 @@ ```json { "MetricHttpRoute": "SomePath/{id}/{num:int}", - "IdealHttpRoute": "SomePath/{id}/{num:int}", + "IdealHttpRoute": "SomePath/{id}/{num}", + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/2", @@ -815,6 +843,7 @@ { "MetricHttpRoute": "", "IdealHttpRoute": "", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePath/SomeString/NotAnInt", @@ -831,7 +860,8 @@ ```json { "MetricHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "IdealHttpRoute": "{area:exists}/ControllerForMyArea/Default/{id?}", + "IdealHttpRoute": "MyArea/ControllerForMyArea/Default", + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea", @@ -860,7 +890,8 @@ ```json { "MetricHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", - "IdealHttpRoute": "{area:exists}/ControllerForMyArea/NonDefault/{id?}", + "IdealHttpRoute": "MyArea/ControllerForMyArea/NonDefault", + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MyArea/ControllerForMyArea/NonDefault", @@ -889,7 +920,8 @@ ```json { "MetricHttpRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", - "IdealHttpRoute": "SomePrefix/AnotherArea/Index/{id?}", + "IdealHttpRoute": "SomePrefix/AnotherArea/Index", + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/SomePrefix", @@ -919,6 +951,7 @@ { "MetricHttpRoute": "AttributeRoute", "IdealHttpRoute": "AttributeRoute", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute", @@ -947,6 +980,7 @@ { "MetricHttpRoute": "AttributeRoute/Get", "IdealHttpRoute": "AttributeRoute/Get", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get", @@ -975,6 +1009,7 @@ { "MetricHttpRoute": "AttributeRoute/Get/{id}", "IdealHttpRoute": "AttributeRoute/Get/{id}", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/Get/12", @@ -1006,6 +1041,7 @@ { "MetricHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/12/GetWithActionNameInDifferentSpotInTemplate", @@ -1037,6 +1073,7 @@ { "MetricHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/AttributeRoute/NotAnInt/GetWithActionNameInDifferentSpotInTemplate", @@ -1067,7 +1104,8 @@ ```json { "MetricHttpRoute": "/", - "IdealHttpRoute": "/Index", + "IdealHttpRoute": "Index", + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/", @@ -1094,7 +1132,8 @@ ```json { "MetricHttpRoute": "Index", - "IdealHttpRoute": "/Index", + "IdealHttpRoute": "Index", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/Index", @@ -1121,7 +1160,8 @@ ```json { "MetricHttpRoute": "PageThatThrowsException", - "IdealHttpRoute": "/PageThatThrowsException", + "IdealHttpRoute": "PageThatThrowsException", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/PageThatThrowsException", @@ -1149,6 +1189,7 @@ { "MetricHttpRoute": "", "IdealHttpRoute": "", + "IdealHttpRouteMatch": true, "RouteInfo": { "HttpMethod": "GET", "Path": "/js/site.js", @@ -1165,7 +1206,8 @@ ```json { "MetricHttpRoute": "/MinimalApi", - "IdealHttpRoute": "/MinimalApi", + "IdealHttpRoute": "MinimalApi", + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi", @@ -1182,7 +1224,8 @@ ```json { "MetricHttpRoute": "/MinimalApi/{id}", - "IdealHttpRoute": "/MinimalApi/{id}", + "IdealHttpRoute": "MinimalApi/{id}", + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApi/123", @@ -1201,7 +1244,8 @@ ```json { "MetricHttpRoute": "/MinimalApiUsingMapGroup/", - "IdealHttpRoute": "/MinimalApiUsingMapGroup/", + "IdealHttpRoute": "MinimalApiUsingMapGroup", + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup", @@ -1218,7 +1262,8 @@ ```json { "MetricHttpRoute": "/MinimalApiUsingMapGroup/{id}", - "IdealHttpRoute": "/MinimalApiUsingMapGroup/{id}", + "IdealHttpRoute": "MinimalApiUsingMapGroup/{id}", + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/MinimalApiUsingMapGroup/123", @@ -1237,7 +1282,8 @@ ```json { "MetricHttpRoute": "/Exception", - "IdealHttpRoute": "/Exception", + "IdealHttpRoute": "Exception", + "IdealHttpRouteMatch": false, "RouteInfo": { "HttpMethod": "GET", "Path": "/Exception", diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json index 87990cb65d..263057d3b1 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json @@ -157,9 +157,9 @@ "httpMethod": "GET", "path": "/", "expectedStatusCode": 200, - "currentHttpRoute": "", - "expectedHttpRoute": "/Index", - "expectedMetricRoute": "/" + "currentHttpRoute": null, + "currentMetricRoute": "/", + "expectedHttpRoute": "Index" }, { "name": "Index page", From 49b93a12cb79761a0c6814dd5897fe630a1a6d2e Mon Sep 17 00:00:00 2001 From: Rasmus Kuusmann Date: Thu, 6 Nov 2025 10:11:19 +0000 Subject: [PATCH 14/15] update changelog --- src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md b/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md index b452bdf469..103fc1f04d 100644 --- a/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md @@ -5,9 +5,9 @@ * Add support for .NET 10.0. ([#2822](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/2822)) -* Fixes an issue where `http.route` attribute reported only a plain route - template for some routing options. Therefore, the HTTP span display name - has been also changed to a more meaningful value. +* Fixes an issue where the http.route attribute on HTTP server spans reported + only a plain route template for some routing options. Therefore, the HTTP server span + display name has also been changed to a more meaningful value. ([#3338](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/3338)) ## 1.13.0 From 5bfe512a7ac5dc26e9d0c3f964c50f9d72f39233 Mon Sep 17 00:00:00 2001 From: Rasmus Kuusmann Date: Thu, 6 Nov 2025 10:16:56 +0000 Subject: [PATCH 15/15] fix line length --- src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md b/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md index 103fc1f04d..7cef43f729 100644 --- a/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md @@ -6,8 +6,8 @@ ([#2822](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/2822)) * Fixes an issue where the http.route attribute on HTTP server spans reported - only a plain route template for some routing options. Therefore, the HTTP server span - display name has also been changed to a more meaningful value. + only a plain route template for some routing options. Therefore, the HTTP + server span display name has also been changed to a more meaningful value. ([#3338](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/3338)) ## 1.13.0