diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/AspNetCoreInstrumentation.cs b/src/OpenTelemetry.Instrumentation.AspNetCore/AspNetCoreInstrumentation.cs index dff3081e9e3..d8254871576 100644 --- a/src/OpenTelemetry.Instrumentation.AspNetCore/AspNetCoreInstrumentation.cs +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/AspNetCoreInstrumentation.cs @@ -27,7 +27,6 @@ internal sealed class AspNetCoreInstrumentation : IDisposable "Microsoft.AspNetCore.Hosting.HttpRequestIn", "Microsoft.AspNetCore.Hosting.HttpRequestIn.Start", "Microsoft.AspNetCore.Hosting.HttpRequestIn.Stop", - "Microsoft.AspNetCore.Mvc.BeforeAction", "Microsoft.AspNetCore.Diagnostics.UnhandledException", "Microsoft.AspNetCore.Hosting.UnhandledException", }; diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md b/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md index f1ce29e689a..697fb1ce424 100644 --- a/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/CHANGELOG.md @@ -41,6 +41,17 @@ exception. The attribute value will be set to full name of exception type. path. ([#5044](https://github.com/open-telemetry/opentelemetry-dotnet/pull/5044)) +* Fixes the `http.route` attribute for scenarios in which it was + previously missing or incorrect. Additionally, the `http.route` attribute + is now the same for both the metric and `Activity` emitted for a request. + Lastly, the `Activity.DisplayName` has been adjusted to have the format + `{http.request.method} {http.route}` to conform with [the specification](https://github.com/open-telemetry/semantic-conventions/blob/main/docs/http/http-spans.md#name). + There remain scenarios when using conventional routing or Razor pages where + `http.route` is still incorrect. See [#5056](https://github.com/open-telemetry/opentelemetry-dotnet/issues/5056) + and [#5057](https://github.com/open-telemetry/opentelemetry-dotnet/issues/5057) + for more details. + ([#5026](https://github.com/open-telemetry/opentelemetry-dotnet/pull/5026)) + * Removed `network.protocol.name` from `http.server.request.duration` metric as per spec. ([#5049](https://github.com/open-telemetry/opentelemetry-dotnet/pull/5049)) diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/HttpInListener.cs b/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/HttpInListener.cs index 9b141e938a8..0542e146b58 100644 --- a/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/HttpInListener.cs +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/HttpInListener.cs @@ -23,8 +23,8 @@ using System.Runtime.CompilerServices; #endif using Microsoft.AspNetCore.Http; -#if NET6_0_OR_GREATER -using Microsoft.AspNetCore.Mvc.Diagnostics; +#if !NETSTANDARD +using Microsoft.AspNetCore.Routing; #endif using OpenTelemetry.Context.Propagation; #if !NETSTANDARD2_0 @@ -41,7 +41,6 @@ internal class HttpInListener : ListenerHandler internal const string ActivityOperationName = "Microsoft.AspNetCore.Hosting.HttpRequestIn"; internal const string OnStartEvent = "Microsoft.AspNetCore.Hosting.HttpRequestIn.Start"; internal const string OnStopEvent = "Microsoft.AspNetCore.Hosting.HttpRequestIn.Stop"; - internal const string OnMvcBeforeActionEvent = "Microsoft.AspNetCore.Mvc.BeforeAction"; internal const string OnUnhandledHostingExceptionEvent = "Microsoft.AspNetCore.Hosting.UnhandledException"; internal const string OnUnHandledDiagnosticsExceptionEvent = "Microsoft.AspNetCore.Diagnostics.UnhandledException"; @@ -97,12 +96,6 @@ public override void OnEventWritten(string name, object payload) this.OnStopActivity(Activity.Current, payload); } - break; - case OnMvcBeforeActionEvent: - { - this.OnMvcBeforeAction(Activity.Current, payload); - } - break; case OnUnhandledHostingExceptionEvent: case OnUnHandledDiagnosticsExceptionEvent: @@ -202,7 +195,7 @@ public void OnStartActivity(Activity activity, object payload) #endif var path = (request.PathBase.HasValue || request.Path.HasValue) ? (request.PathBase + request.Path).ToString() : "/"; - activity.DisplayName = path; + activity.DisplayName = this.GetDisplayName(request.Method); // see the spec https://github.com/open-telemetry/opentelemetry-specification/blob/v1.20.0/specification/trace/semantic_conventions/http.md if (this.emitOldAttributes) @@ -252,17 +245,7 @@ public void OnStartActivity(Activity activity, object payload) activity.SetTag(SemanticConventions.AttributeUrlQuery, request.QueryString.Value); } - if (RequestMethodHelper.KnownMethods.TryGetValue(request.Method, out var httpMethod)) - { - activity.SetTag(SemanticConventions.AttributeHttpRequestMethod, httpMethod); - } - else - { - // Set to default "_OTHER" as per spec. - // https://github.com/open-telemetry/semantic-conventions/blob/v1.22.0/docs/http/http-spans.md#common-attributes - activity.SetTag(SemanticConventions.AttributeHttpRequestMethod, "_OTHER"); - activity.SetTag(SemanticConventions.AttributeHttpRequestMethodOriginal, request.Method); - } + RequestMethodHelper.SetHttpMethodTag(activity, request.Method); activity.SetTag(SemanticConventions.AttributeUrlScheme, request.Scheme); activity.SetTag(SemanticConventions.AttributeUrlPath, path); @@ -302,6 +285,15 @@ public void OnStopActivity(Activity activity, object payload) var response = context.Response; +#if !NETSTANDARD + var routePattern = (context.GetEndpoint() as RouteEndpoint)?.RoutePattern.RawText; + if (!string.IsNullOrEmpty(routePattern)) + { + activity.DisplayName = this.GetDisplayName(context.Request.Method, routePattern); + activity.SetTag(SemanticConventions.AttributeHttpRoute, routePattern); + } +#endif + if (this.emitOldAttributes) { activity.SetTag(SemanticConventions.AttributeHttpStatusCode, TelemetryHelper.GetBoxedStatusCode(response.StatusCode)); @@ -363,57 +355,6 @@ public void OnStopActivity(Activity activity, object payload) } } - public void OnMvcBeforeAction(Activity activity, object payload) - { - // We cannot rely on Activity.Current here - // There could be activities started by middleware - // after activity started by framework resulting in different Activity.Current. - // so, we need to first find the activity started by Asp.Net Core. - // For .net6.0 onwards we could use IHttpActivityFeature to get the activity created by framework - // var httpActivityFeature = context.Features.Get(); - // activity = httpActivityFeature.Activity; - // However, this will not work as in case of custom propagator - // we start a new activity during onStart event which is a sibling to the activity created by framework - // So, in that case we need to get the activity created by us here. - // we can do so only by looping through activity.Parent chain. - while (activity != null) - { - if (string.Equals(activity.OperationName, ActivityOperationName, StringComparison.Ordinal)) - { - break; - } - - activity = activity.Parent; - } - - if (activity == null) - { - return; - } - - if (activity.IsAllDataRequested) - { -#if !NET6_0_OR_GREATER - _ = this.beforeActionActionDescriptorFetcher.TryFetch(payload, out var actionDescriptor); - _ = this.beforeActionAttributeRouteInfoFetcher.TryFetch(actionDescriptor, out var attributeRouteInfo); - _ = this.beforeActionTemplateFetcher.TryFetch(attributeRouteInfo, out var template); -#else - var beforeActionEventData = payload as BeforeActionEventData; - var template = beforeActionEventData.ActionDescriptor?.AttributeRouteInfo?.Template; -#endif - if (!string.IsNullOrEmpty(template)) - { - // override the span name that was previously set to the path part of URL. - activity.DisplayName = template; - activity.SetTag(SemanticConventions.AttributeHttpRoute, template); - } - - // TODO: Should we get values from RouteData? - // private readonly PropertyFetcher beforeActionRouteDataFetcher = new PropertyFetcher("routeData"); - // var routeData = this.beforeActionRouteDataFetcher.Fetch(payload) as RouteData; - } - } - public void OnException(Activity activity, object payload) { if (activity.IsAllDataRequested) @@ -509,7 +450,20 @@ private static bool TryGetGrpcMethod(Activity activity, out string grpcMethod) grpcMethod = GrpcTagHelper.GetGrpcMethodFromActivity(activity); return !string.IsNullOrEmpty(grpcMethod); } +#endif + + private string GetDisplayName(string httpMethod, string httpRoute = null) + { + var normalizedMethod = this.emitNewAttributes + ? RequestMethodHelper.GetNormalizedHttpMethod(httpMethod) + : httpMethod; + + return string.IsNullOrEmpty(httpRoute) + ? normalizedMethod + : $"{normalizedMethod} {httpRoute}"; + } +#if !NETSTANDARD2_0 [MethodImpl(MethodImplOptions.AggressiveInlining)] private void AddGrpcAttributes(Activity activity, string grpcMethod, HttpContext context) { diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/HttpInMetricsListener.cs b/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/HttpInMetricsListener.cs index e85536c66e2..b442a429a2d 100644 --- a/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/HttpInMetricsListener.cs +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/Implementation/HttpInMetricsListener.cs @@ -191,16 +191,9 @@ public void OnEventWritten_New(string name, object payload) tags.Add(new KeyValuePair(SemanticConventions.AttributeNetworkProtocolVersion, HttpTagHelper.GetFlavorTagValueFromProtocol(context.Request.Protocol))); tags.Add(new KeyValuePair(SemanticConventions.AttributeUrlScheme, context.Request.Scheme)); tags.Add(new KeyValuePair(SemanticConventions.AttributeHttpResponseStatusCode, TelemetryHelper.GetBoxedStatusCode(context.Response.StatusCode))); - if (RequestMethodHelper.KnownMethods.TryGetValue(context.Request.Method, out var httpMethod)) - { - tags.Add(new KeyValuePair(SemanticConventions.AttributeHttpRequestMethod, httpMethod)); - } - else - { - // Set to default "_OTHER" as per spec. - // https://github.com/open-telemetry/semantic-conventions/blob/v1.22.0/docs/http/http-spans.md#common-attributes - tags.Add(new KeyValuePair(SemanticConventions.AttributeHttpRequestMethod, "_OTHER")); - } + + var httpMethod = RequestMethodHelper.GetNormalizedHttpMethod(context.Request.Method); + tags.Add(new KeyValuePair(SemanticConventions.AttributeHttpRequestMethod, httpMethod)); #if NET6_0_OR_GREATER var route = (context.GetEndpoint() as RouteEndpoint)?.RoutePattern.RawText; diff --git a/src/Shared/RequestMethodHelper.cs b/src/Shared/RequestMethodHelper.cs index 8ae14f89d0b..f6050121b4b 100644 --- a/src/Shared/RequestMethodHelper.cs +++ b/src/Shared/RequestMethodHelper.cs @@ -17,11 +17,17 @@ #if NET8_0_OR_GREATER using System.Collections.Frozen; #endif +using System.Diagnostics; +using OpenTelemetry.Trace; namespace OpenTelemetry.Internal; internal static class RequestMethodHelper { + // The value "_OTHER" is used for non-standard HTTP methods. + // https://github.com/open-telemetry/semantic-conventions/blob/v1.22.0/docs/http/http-spans.md#common-attributes + public const string OtherHttpMethod = "_OTHER"; + #if NET8_0_OR_GREATER internal static readonly FrozenDictionary KnownMethods; #else @@ -50,4 +56,24 @@ static RequestMethodHelper() KnownMethods = knownMethodSet; #endif } + + public static string GetNormalizedHttpMethod(string method) + { + return KnownMethods.TryGetValue(method, out var normalizedMethod) + ? normalizedMethod + : OtherHttpMethod; + } + + public static void SetHttpMethodTag(Activity activity, string method) + { + if (KnownMethods.TryGetValue(method, out var normalizedMethod)) + { + activity?.SetTag(SemanticConventions.AttributeHttpRequestMethod, normalizedMethod); + } + else + { + activity?.SetTag(SemanticConventions.AttributeHttpRequestMethod, OtherHttpMethod); + activity?.SetTag(SemanticConventions.AttributeHttpRequestMethodOriginal, method); + } + } } diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs index 43794de2983..0ceeb2fef73 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs @@ -189,7 +189,6 @@ public async Task SuccessfulTemplateControllerCallUsesParentContext() var activity = exportedItems[0]; Assert.Equal("Microsoft.AspNetCore.Hosting.HttpRequestIn", activity.OperationName); - Assert.Equal("api/Values/{id}", activity.DisplayName); Assert.Equal(expectedTraceId, activity.Context.TraceId); Assert.Equal(expectedSpanId, activity.ParentSpanId); @@ -251,7 +250,6 @@ public async Task CustomPropagator(bool addSampler) var activity = exportedItems[0]; Assert.True(activity.Duration != TimeSpan.Zero); - Assert.Equal("api/Values/{id}", activity.DisplayName); Assert.Equal(expectedTraceId, activity.Context.TraceId); Assert.Equal(expectedSpanId, activity.ParentSpanId); @@ -644,10 +642,9 @@ void ConfigureTestServices(IServiceCollection services) Assert.Equal(activityName, middlewareActivity.OperationName); Assert.Equal(activityName, middlewareActivity.DisplayName); - // tag http.route should be added on activity started by asp.net core - Assert.Equal("api/Values/{id}", aspnetcoreframeworkactivity.GetTagValue(SemanticConventions.AttributeHttpRoute) as string); + // tag http.method should be added on activity started by asp.net core + Assert.Equal("GET", aspnetcoreframeworkactivity.GetTagValue(SemanticConventions.AttributeHttpMethod) as string); Assert.Equal("Microsoft.AspNetCore.Hosting.HttpRequestIn", aspnetcoreframeworkactivity.OperationName); - Assert.Equal("api/Values/{id}", aspnetcoreframeworkactivity.DisplayName); } [Theory] @@ -763,10 +760,9 @@ public async Task ActivitiesStartedInMiddlewareBySettingHostActivityToNullShould Assert.Equal(activityName, middlewareActivity.OperationName); Assert.Equal(activityName, middlewareActivity.DisplayName); - // tag http.route should not be added on activity started by asp.net core as it will not be found during OnEventWritten event - Assert.DoesNotContain(aspnetcoreframeworkactivity.TagObjects, t => t.Key == SemanticConventions.AttributeHttpRoute); + // tag http.method should be added on activity started by asp.net core + Assert.Equal("GET", aspnetcoreframeworkactivity.GetTagValue(SemanticConventions.AttributeHttpMethod) as string); Assert.Equal("Microsoft.AspNetCore.Hosting.HttpRequestIn", aspnetcoreframeworkactivity.OperationName); - Assert.Equal("/api/values/2", aspnetcoreframeworkactivity.DisplayName); } #if NET7_0_OR_GREATER @@ -865,12 +861,6 @@ void ConfigureTestServices(IServiceCollection services) numberofSubscribedEvents++; } - break; - case HttpInListener.OnMvcBeforeActionEvent: - { - numberofSubscribedEvents++; - } - break; default: { @@ -900,7 +890,7 @@ void ConfigureTestServices(IServiceCollection services) } Assert.Equal(0, numberOfUnSubscribedEvents); - Assert.Equal(3, numberofSubscribedEvents); + Assert.Equal(2, numberofSubscribedEvents); } [Fact] @@ -930,12 +920,6 @@ void ConfigureTestServices(IServiceCollection services) numberofSubscribedEvents++; } - break; - case HttpInListener.OnMvcBeforeActionEvent: - { - numberofSubscribedEvents++; - } - break; // TODO: Add test case for validating name for both the types @@ -984,7 +968,7 @@ void ConfigureTestServices(IServiceCollection services) Assert.Equal(1, numberOfExceptionCallbacks); Assert.Equal(0, numberOfUnSubscribedEvents); - Assert.Equal(4, numberofSubscribedEvents); + Assert.Equal(3, numberofSubscribedEvents); } [Fact(Skip = "https://github.com/open-telemetry/opentelemetry-dotnet/issues/4884")] @@ -1078,57 +1062,6 @@ static void ThrowException(IApplicationBuilder app) await app.DisposeAsync(); } - [Fact] - public async Task RouteInformationIsNotAddedToRequestsOutsideOfMVC() - { - var exportedItems = new List(); - - // configure SDK - using var tracerprovider = Sdk.CreateTracerProviderBuilder() - .AddAspNetCoreInstrumentation() - .AddInMemoryExporter(exportedItems) - .Build(); - - var builder = WebApplication.CreateBuilder(); - builder.Logging.ClearProviders(); - var app = builder.Build(); - - app.MapGet("/custom/{name:alpha}", () => "Hello"); - - _ = app.RunAsync(); - - using var client = new HttpClient(); - var res = await client.GetStringAsync("http://localhost:5000/custom/abc"); - Assert.NotNull(res); - - tracerprovider.ForceFlush(); - for (var i = 0; i < 10; i++) - { - if (exportedItems.Count > 0) - { - break; - } - - // We need to let End callback execute as it is executed AFTER response was returned. - // In unit tests environment there may be a lot of parallel unit tests executed, so - // giving some breezing room for the End callback to complete - await Task.Delay(TimeSpan.FromSeconds(1)); - } - - var activity = exportedItems[0]; - - Assert.NotNull(activity); - - // After fix update to Contains http.route - Assert.DoesNotContain(activity.TagObjects, t => t.Key == SemanticConventions.AttributeHttpRoute); - Assert.Equal("Microsoft.AspNetCore.Hosting.HttpRequestIn", activity.OperationName); - - // After fix this should be /custom/{name:alpha} - Assert.Equal("/custom/abc", activity.DisplayName); - - await app.DisposeAsync(); - } - public void Dispose() { this.tracerProvider?.Dispose(); diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net6.0.md b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net6.0.md index ac9ff0d5117..c12dc40dadc 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net6.0.md +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net6.0.md @@ -1,35 +1,35 @@ # Test results for ASP.NET Core 6 -| Span http.route | Metric http.route | App | Test Name | -| - | - | - | - | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Root path](#conventionalrouting-root-path) | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Non-default action with route parameter and query string](#conventionalrouting-non-default-action-with-route-parameter-and-query-string) | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Non-default action with query string](#conventionalrouting-non-default-action-with-query-string) | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Not Found (404)](#conventionalrouting-not-found-404) | -| :broken_heart: | :green_heart: | ConventionalRouting | [Route template with parameter constraint](#conventionalrouting-route-template-with-parameter-constraint) | -| :broken_heart: | :green_heart: | ConventionalRouting | [Path that does not match parameter constraint](#conventionalrouting-path-that-does-not-match-parameter-constraint) | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Area using area:exists, default controller/action](#conventionalrouting-area-using-areaexists-default-controlleraction) | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Area using area:exists, non-default action](#conventionalrouting-area-using-areaexists-non-default-action) | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Area w/o area:exists, default controller/action](#conventionalrouting-area-wo-areaexists-default-controlleraction) | -| :green_heart: | :green_heart: | AttributeRouting | [Default action](#attributerouting-default-action) | -| :green_heart: | :green_heart: | AttributeRouting | [Action without parameter](#attributerouting-action-without-parameter) | -| :green_heart: | :green_heart: | AttributeRouting | [Action with parameter](#attributerouting-action-with-parameter) | -| :green_heart: | :green_heart: | AttributeRouting | [Action with parameter before action name in template](#attributerouting-action-with-parameter-before-action-name-in-template) | -| :green_heart: | :green_heart: | AttributeRouting | [Action invoked resulting in 400 Bad Request](#attributerouting-action-invoked-resulting-in-400-bad-request) | -| :broken_heart: | :broken_heart: | RazorPages | [Root path](#razorpages-root-path) | -| :broken_heart: | :broken_heart: | RazorPages | [Index page](#razorpages-index-page) | -| :broken_heart: | :broken_heart: | RazorPages | [Throws exception](#razorpages-throws-exception) | -| :green_heart: | :green_heart: | RazorPages | [Static content](#razorpages-static-content) | -| :broken_heart: | :green_heart: | MinimalApi | [Action without parameter](#minimalapi-action-without-parameter) | -| :broken_heart: | :green_heart: | MinimalApi | [Action with parameter](#minimalapi-action-with-parameter) | +| http.route | App | Test Name | +| - | - | - | +| :broken_heart: | ConventionalRouting | [Root path](#conventionalrouting-root-path) | +| :broken_heart: | ConventionalRouting | [Non-default action with route parameter and query string](#conventionalrouting-non-default-action-with-route-parameter-and-query-string) | +| :broken_heart: | ConventionalRouting | [Non-default action with query string](#conventionalrouting-non-default-action-with-query-string) | +| :green_heart: | ConventionalRouting | [Not Found (404)](#conventionalrouting-not-found-404) | +| :green_heart: | ConventionalRouting | [Route template with parameter constraint](#conventionalrouting-route-template-with-parameter-constraint) | +| :green_heart: | ConventionalRouting | [Path that does not match parameter constraint](#conventionalrouting-path-that-does-not-match-parameter-constraint) | +| :broken_heart: | ConventionalRouting | [Area using area:exists, default controller/action](#conventionalrouting-area-using-areaexists-default-controlleraction) | +| :broken_heart: | ConventionalRouting | [Area using area:exists, non-default action](#conventionalrouting-area-using-areaexists-non-default-action) | +| :broken_heart: | ConventionalRouting | [Area w/o area:exists, default controller/action](#conventionalrouting-area-wo-areaexists-default-controlleraction) | +| :green_heart: | AttributeRouting | [Default action](#attributerouting-default-action) | +| :green_heart: | AttributeRouting | [Action without parameter](#attributerouting-action-without-parameter) | +| :green_heart: | AttributeRouting | [Action with parameter](#attributerouting-action-with-parameter) | +| :green_heart: | AttributeRouting | [Action with parameter before action name in template](#attributerouting-action-with-parameter-before-action-name-in-template) | +| :green_heart: | AttributeRouting | [Action invoked resulting in 400 Bad Request](#attributerouting-action-invoked-resulting-in-400-bad-request) | +| :broken_heart: | RazorPages | [Root path](#razorpages-root-path) | +| :broken_heart: | RazorPages | [Index page](#razorpages-index-page) | +| :broken_heart: | RazorPages | [Throws exception](#razorpages-throws-exception) | +| :green_heart: | RazorPages | [Static content](#razorpages-static-content) | +| :green_heart: | MinimalApi | [Action without parameter](#minimalapi-action-without-parameter) | +| :green_heart: | MinimalApi | [Action with parameter](#minimalapi-action-with-parameter) | ## ConventionalRouting: Root path ```json { "IdealHttpRoute": "ConventionalRoute/Default/{id?}", - "ActivityDisplayName": "/", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET {controller=ConventionalRoute}/{action=Default}/{id?}", + "ActivityHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "RouteInfo": { "HttpMethod": "GET", @@ -58,8 +58,8 @@ ```json { "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}", - "ActivityDisplayName": "/ConventionalRoute/ActionWithStringParameter/2", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET {controller=ConventionalRoute}/{action=Default}/{id?}", + "ActivityHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "RouteInfo": { "HttpMethod": "GET", @@ -92,8 +92,8 @@ ```json { "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}", - "ActivityDisplayName": "/ConventionalRoute/ActionWithStringParameter", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET {controller=ConventionalRoute}/{action=Default}/{id?}", + "ActivityHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "RouteInfo": { "HttpMethod": "GET", @@ -125,7 +125,7 @@ ```json { "IdealHttpRoute": "", - "ActivityDisplayName": "/ConventionalRoute/NotFound", + "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "MetricHttpRoute": "", "RouteInfo": { @@ -144,8 +144,8 @@ ```json { "IdealHttpRoute": "SomePath/{id}/{num:int}", - "ActivityDisplayName": "/SomePath/SomeString/2", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET SomePath/{id}/{num:int}", + "ActivityHttpRoute": "SomePath/{id}/{num:int}", "MetricHttpRoute": "SomePath/{id}/{num:int}", "RouteInfo": { "HttpMethod": "GET", @@ -179,7 +179,7 @@ ```json { "IdealHttpRoute": "", - "ActivityDisplayName": "/SomePath/SomeString/NotAnInt", + "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "MetricHttpRoute": "", "RouteInfo": { @@ -198,8 +198,8 @@ ```json { "IdealHttpRoute": "{area:exists}/ControllerForMyArea/Default/{id?}", - "ActivityDisplayName": "/MyArea", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET {area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", + "ActivityHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "MetricHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "RouteInfo": { "HttpMethod": "GET", @@ -229,8 +229,8 @@ ```json { "IdealHttpRoute": "{area:exists}/ControllerForMyArea/NonDefault/{id?}", - "ActivityDisplayName": "/MyArea/ControllerForMyArea/NonDefault", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET {area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", + "ActivityHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "MetricHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "RouteInfo": { "HttpMethod": "GET", @@ -260,8 +260,8 @@ ```json { "IdealHttpRoute": "SomePrefix/AnotherArea/Index/{id?}", - "ActivityDisplayName": "/SomePrefix", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", + "ActivityHttpRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", "MetricHttpRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", "RouteInfo": { "HttpMethod": "GET", @@ -291,7 +291,7 @@ ```json { "IdealHttpRoute": "AttributeRoute", - "ActivityDisplayName": "AttributeRoute", + "ActivityDisplayName": "GET AttributeRoute", "ActivityHttpRoute": "AttributeRoute", "MetricHttpRoute": "AttributeRoute", "RouteInfo": { @@ -321,7 +321,7 @@ ```json { "IdealHttpRoute": "AttributeRoute/Get", - "ActivityDisplayName": "AttributeRoute/Get", + "ActivityDisplayName": "GET AttributeRoute/Get", "ActivityHttpRoute": "AttributeRoute/Get", "MetricHttpRoute": "AttributeRoute/Get", "RouteInfo": { @@ -351,7 +351,7 @@ ```json { "IdealHttpRoute": "AttributeRoute/Get/{id}", - "ActivityDisplayName": "AttributeRoute/Get/{id}", + "ActivityDisplayName": "GET AttributeRoute/Get/{id}", "ActivityHttpRoute": "AttributeRoute/Get/{id}", "MetricHttpRoute": "AttributeRoute/Get/{id}", "RouteInfo": { @@ -384,7 +384,7 @@ ```json { "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", - "ActivityDisplayName": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", + "ActivityDisplayName": "GET AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "ActivityHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "MetricHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "RouteInfo": { @@ -417,7 +417,7 @@ ```json { "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", - "ActivityDisplayName": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", + "ActivityDisplayName": "GET AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "ActivityHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "MetricHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "RouteInfo": { @@ -450,7 +450,7 @@ ```json { "IdealHttpRoute": "/Index", - "ActivityDisplayName": "/", + "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "MetricHttpRoute": "", "RouteInfo": { @@ -479,7 +479,7 @@ ```json { "IdealHttpRoute": "/Index", - "ActivityDisplayName": "Index", + "ActivityDisplayName": "GET Index", "ActivityHttpRoute": "Index", "MetricHttpRoute": "Index", "RouteInfo": { @@ -508,7 +508,7 @@ ```json { "IdealHttpRoute": "/PageThatThrowsException", - "ActivityDisplayName": "PageThatThrowsException", + "ActivityDisplayName": "GET PageThatThrowsException", "ActivityHttpRoute": "PageThatThrowsException", "MetricHttpRoute": "PageThatThrowsException", "RouteInfo": { @@ -537,7 +537,7 @@ ```json { "IdealHttpRoute": "", - "ActivityDisplayName": "/js/site.js", + "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "MetricHttpRoute": "", "RouteInfo": { @@ -556,8 +556,8 @@ ```json { "IdealHttpRoute": "/MinimalApi", - "ActivityDisplayName": "/MinimalApi", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET /MinimalApi", + "ActivityHttpRoute": "/MinimalApi", "MetricHttpRoute": "/MinimalApi", "RouteInfo": { "HttpMethod": "GET", @@ -575,8 +575,8 @@ ```json { "IdealHttpRoute": "/MinimalApi/{id}", - "ActivityDisplayName": "/MinimalApi/123", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET /MinimalApi/{id}", + "ActivityHttpRoute": "/MinimalApi/{id}", "MetricHttpRoute": "/MinimalApi/{id}", "RouteInfo": { "HttpMethod": "GET", diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net7.0.md b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net7.0.md index f93e5de8ea8..ec252654a2a 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net7.0.md +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net7.0.md @@ -1,37 +1,37 @@ # Test results for ASP.NET Core 7 -| Span http.route | Metric http.route | App | Test Name | -| - | - | - | - | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Root path](#conventionalrouting-root-path) | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Non-default action with route parameter and query string](#conventionalrouting-non-default-action-with-route-parameter-and-query-string) | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Non-default action with query string](#conventionalrouting-non-default-action-with-query-string) | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Not Found (404)](#conventionalrouting-not-found-404) | -| :broken_heart: | :green_heart: | ConventionalRouting | [Route template with parameter constraint](#conventionalrouting-route-template-with-parameter-constraint) | -| :broken_heart: | :green_heart: | ConventionalRouting | [Path that does not match parameter constraint](#conventionalrouting-path-that-does-not-match-parameter-constraint) | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Area using area:exists, default controller/action](#conventionalrouting-area-using-areaexists-default-controlleraction) | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Area using area:exists, non-default action](#conventionalrouting-area-using-areaexists-non-default-action) | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Area w/o area:exists, default controller/action](#conventionalrouting-area-wo-areaexists-default-controlleraction) | -| :green_heart: | :green_heart: | AttributeRouting | [Default action](#attributerouting-default-action) | -| :green_heart: | :green_heart: | AttributeRouting | [Action without parameter](#attributerouting-action-without-parameter) | -| :green_heart: | :green_heart: | AttributeRouting | [Action with parameter](#attributerouting-action-with-parameter) | -| :green_heart: | :green_heart: | AttributeRouting | [Action with parameter before action name in template](#attributerouting-action-with-parameter-before-action-name-in-template) | -| :green_heart: | :green_heart: | AttributeRouting | [Action invoked resulting in 400 Bad Request](#attributerouting-action-invoked-resulting-in-400-bad-request) | -| :broken_heart: | :broken_heart: | RazorPages | [Root path](#razorpages-root-path) | -| :broken_heart: | :broken_heart: | RazorPages | [Index page](#razorpages-index-page) | -| :broken_heart: | :broken_heart: | RazorPages | [Throws exception](#razorpages-throws-exception) | -| :green_heart: | :green_heart: | RazorPages | [Static content](#razorpages-static-content) | -| :broken_heart: | :green_heart: | MinimalApi | [Action without parameter](#minimalapi-action-without-parameter) | -| :broken_heart: | :green_heart: | MinimalApi | [Action with parameter](#minimalapi-action-with-parameter) | -| :broken_heart: | :green_heart: | MinimalApi | [Action without parameter (MapGroup)](#minimalapi-action-without-parameter-mapgroup) | -| :broken_heart: | :green_heart: | MinimalApi | [Action with parameter (MapGroup)](#minimalapi-action-with-parameter-mapgroup) | +| http.route | App | Test Name | +| - | - | - | +| :broken_heart: | ConventionalRouting | [Root path](#conventionalrouting-root-path) | +| :broken_heart: | ConventionalRouting | [Non-default action with route parameter and query string](#conventionalrouting-non-default-action-with-route-parameter-and-query-string) | +| :broken_heart: | ConventionalRouting | [Non-default action with query string](#conventionalrouting-non-default-action-with-query-string) | +| :green_heart: | ConventionalRouting | [Not Found (404)](#conventionalrouting-not-found-404) | +| :green_heart: | ConventionalRouting | [Route template with parameter constraint](#conventionalrouting-route-template-with-parameter-constraint) | +| :green_heart: | ConventionalRouting | [Path that does not match parameter constraint](#conventionalrouting-path-that-does-not-match-parameter-constraint) | +| :broken_heart: | ConventionalRouting | [Area using area:exists, default controller/action](#conventionalrouting-area-using-areaexists-default-controlleraction) | +| :broken_heart: | ConventionalRouting | [Area using area:exists, non-default action](#conventionalrouting-area-using-areaexists-non-default-action) | +| :broken_heart: | ConventionalRouting | [Area w/o area:exists, default controller/action](#conventionalrouting-area-wo-areaexists-default-controlleraction) | +| :green_heart: | AttributeRouting | [Default action](#attributerouting-default-action) | +| :green_heart: | AttributeRouting | [Action without parameter](#attributerouting-action-without-parameter) | +| :green_heart: | AttributeRouting | [Action with parameter](#attributerouting-action-with-parameter) | +| :green_heart: | AttributeRouting | [Action with parameter before action name in template](#attributerouting-action-with-parameter-before-action-name-in-template) | +| :green_heart: | AttributeRouting | [Action invoked resulting in 400 Bad Request](#attributerouting-action-invoked-resulting-in-400-bad-request) | +| :broken_heart: | RazorPages | [Root path](#razorpages-root-path) | +| :broken_heart: | RazorPages | [Index page](#razorpages-index-page) | +| :broken_heart: | RazorPages | [Throws exception](#razorpages-throws-exception) | +| :green_heart: | RazorPages | [Static content](#razorpages-static-content) | +| :green_heart: | MinimalApi | [Action without parameter](#minimalapi-action-without-parameter) | +| :green_heart: | MinimalApi | [Action with parameter](#minimalapi-action-with-parameter) | +| :green_heart: | MinimalApi | [Action without parameter (MapGroup)](#minimalapi-action-without-parameter-mapgroup) | +| :green_heart: | MinimalApi | [Action with parameter (MapGroup)](#minimalapi-action-with-parameter-mapgroup) | ## ConventionalRouting: Root path ```json { "IdealHttpRoute": "ConventionalRoute/Default/{id?}", - "ActivityDisplayName": "/", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET {controller=ConventionalRoute}/{action=Default}/{id?}", + "ActivityHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "RouteInfo": { "HttpMethod": "GET", @@ -60,8 +60,8 @@ ```json { "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}", - "ActivityDisplayName": "/ConventionalRoute/ActionWithStringParameter/2", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET {controller=ConventionalRoute}/{action=Default}/{id?}", + "ActivityHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "RouteInfo": { "HttpMethod": "GET", @@ -94,8 +94,8 @@ ```json { "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}", - "ActivityDisplayName": "/ConventionalRoute/ActionWithStringParameter", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET {controller=ConventionalRoute}/{action=Default}/{id?}", + "ActivityHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "RouteInfo": { "HttpMethod": "GET", @@ -127,7 +127,7 @@ ```json { "IdealHttpRoute": "", - "ActivityDisplayName": "/ConventionalRoute/NotFound", + "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "MetricHttpRoute": "", "RouteInfo": { @@ -146,8 +146,8 @@ ```json { "IdealHttpRoute": "SomePath/{id}/{num:int}", - "ActivityDisplayName": "/SomePath/SomeString/2", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET SomePath/{id}/{num:int}", + "ActivityHttpRoute": "SomePath/{id}/{num:int}", "MetricHttpRoute": "SomePath/{id}/{num:int}", "RouteInfo": { "HttpMethod": "GET", @@ -181,7 +181,7 @@ ```json { "IdealHttpRoute": "", - "ActivityDisplayName": "/SomePath/SomeString/NotAnInt", + "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "MetricHttpRoute": "", "RouteInfo": { @@ -200,8 +200,8 @@ ```json { "IdealHttpRoute": "{area:exists}/ControllerForMyArea/Default/{id?}", - "ActivityDisplayName": "/MyArea", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET {area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", + "ActivityHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "MetricHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "RouteInfo": { "HttpMethod": "GET", @@ -231,8 +231,8 @@ ```json { "IdealHttpRoute": "{area:exists}/ControllerForMyArea/NonDefault/{id?}", - "ActivityDisplayName": "/MyArea/ControllerForMyArea/NonDefault", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET {area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", + "ActivityHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "MetricHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "RouteInfo": { "HttpMethod": "GET", @@ -262,8 +262,8 @@ ```json { "IdealHttpRoute": "SomePrefix/AnotherArea/Index/{id?}", - "ActivityDisplayName": "/SomePrefix", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", + "ActivityHttpRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", "MetricHttpRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", "RouteInfo": { "HttpMethod": "GET", @@ -293,7 +293,7 @@ ```json { "IdealHttpRoute": "AttributeRoute", - "ActivityDisplayName": "AttributeRoute", + "ActivityDisplayName": "GET AttributeRoute", "ActivityHttpRoute": "AttributeRoute", "MetricHttpRoute": "AttributeRoute", "RouteInfo": { @@ -323,7 +323,7 @@ ```json { "IdealHttpRoute": "AttributeRoute/Get", - "ActivityDisplayName": "AttributeRoute/Get", + "ActivityDisplayName": "GET AttributeRoute/Get", "ActivityHttpRoute": "AttributeRoute/Get", "MetricHttpRoute": "AttributeRoute/Get", "RouteInfo": { @@ -353,7 +353,7 @@ ```json { "IdealHttpRoute": "AttributeRoute/Get/{id}", - "ActivityDisplayName": "AttributeRoute/Get/{id}", + "ActivityDisplayName": "GET AttributeRoute/Get/{id}", "ActivityHttpRoute": "AttributeRoute/Get/{id}", "MetricHttpRoute": "AttributeRoute/Get/{id}", "RouteInfo": { @@ -386,7 +386,7 @@ ```json { "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", - "ActivityDisplayName": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", + "ActivityDisplayName": "GET AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "ActivityHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "MetricHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "RouteInfo": { @@ -419,7 +419,7 @@ ```json { "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", - "ActivityDisplayName": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", + "ActivityDisplayName": "GET AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "ActivityHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "MetricHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "RouteInfo": { @@ -452,7 +452,7 @@ ```json { "IdealHttpRoute": "/Index", - "ActivityDisplayName": "/", + "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "MetricHttpRoute": "", "RouteInfo": { @@ -481,7 +481,7 @@ ```json { "IdealHttpRoute": "/Index", - "ActivityDisplayName": "Index", + "ActivityDisplayName": "GET Index", "ActivityHttpRoute": "Index", "MetricHttpRoute": "Index", "RouteInfo": { @@ -510,7 +510,7 @@ ```json { "IdealHttpRoute": "/PageThatThrowsException", - "ActivityDisplayName": "PageThatThrowsException", + "ActivityDisplayName": "GET PageThatThrowsException", "ActivityHttpRoute": "PageThatThrowsException", "MetricHttpRoute": "PageThatThrowsException", "RouteInfo": { @@ -539,7 +539,7 @@ ```json { "IdealHttpRoute": "", - "ActivityDisplayName": "/js/site.js", + "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "MetricHttpRoute": "", "RouteInfo": { @@ -558,8 +558,8 @@ ```json { "IdealHttpRoute": "/MinimalApi", - "ActivityDisplayName": "/MinimalApi", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET /MinimalApi", + "ActivityHttpRoute": "/MinimalApi", "MetricHttpRoute": "/MinimalApi", "RouteInfo": { "HttpMethod": "GET", @@ -577,8 +577,8 @@ ```json { "IdealHttpRoute": "/MinimalApi/{id}", - "ActivityDisplayName": "/MinimalApi/123", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET /MinimalApi/{id}", + "ActivityHttpRoute": "/MinimalApi/{id}", "MetricHttpRoute": "/MinimalApi/{id}", "RouteInfo": { "HttpMethod": "GET", @@ -598,8 +598,8 @@ ```json { "IdealHttpRoute": "/MinimalApiUsingMapGroup/", - "ActivityDisplayName": "/MinimalApiUsingMapGroup", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET /MinimalApiUsingMapGroup/", + "ActivityHttpRoute": "/MinimalApiUsingMapGroup/", "MetricHttpRoute": "/MinimalApiUsingMapGroup/", "RouteInfo": { "HttpMethod": "GET", @@ -617,8 +617,8 @@ ```json { "IdealHttpRoute": "/MinimalApiUsingMapGroup/{id}", - "ActivityDisplayName": "/MinimalApiUsingMapGroup/123", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET /MinimalApiUsingMapGroup/{id}", + "ActivityHttpRoute": "/MinimalApiUsingMapGroup/{id}", "MetricHttpRoute": "/MinimalApiUsingMapGroup/{id}", "RouteInfo": { "HttpMethod": "GET", 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 4cacc1eac0c..3b712f73e20 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net8.0.md +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/README.net8.0.md @@ -1,37 +1,37 @@ # Test results for ASP.NET Core 8 -| Span http.route | Metric http.route | App | Test Name | -| - | - | - | - | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Root path](#conventionalrouting-root-path) | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Non-default action with route parameter and query string](#conventionalrouting-non-default-action-with-route-parameter-and-query-string) | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Non-default action with query string](#conventionalrouting-non-default-action-with-query-string) | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Not Found (404)](#conventionalrouting-not-found-404) | -| :broken_heart: | :green_heart: | ConventionalRouting | [Route template with parameter constraint](#conventionalrouting-route-template-with-parameter-constraint) | -| :broken_heart: | :green_heart: | ConventionalRouting | [Path that does not match parameter constraint](#conventionalrouting-path-that-does-not-match-parameter-constraint) | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Area using area:exists, default controller/action](#conventionalrouting-area-using-areaexists-default-controlleraction) | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Area using area:exists, non-default action](#conventionalrouting-area-using-areaexists-non-default-action) | -| :broken_heart: | :broken_heart: | ConventionalRouting | [Area w/o area:exists, default controller/action](#conventionalrouting-area-wo-areaexists-default-controlleraction) | -| :green_heart: | :green_heart: | AttributeRouting | [Default action](#attributerouting-default-action) | -| :green_heart: | :green_heart: | AttributeRouting | [Action without parameter](#attributerouting-action-without-parameter) | -| :green_heart: | :green_heart: | AttributeRouting | [Action with parameter](#attributerouting-action-with-parameter) | -| :green_heart: | :green_heart: | AttributeRouting | [Action with parameter before action name in template](#attributerouting-action-with-parameter-before-action-name-in-template) | -| :green_heart: | :green_heart: | AttributeRouting | [Action invoked resulting in 400 Bad Request](#attributerouting-action-invoked-resulting-in-400-bad-request) | -| :broken_heart: | :broken_heart: | RazorPages | [Root path](#razorpages-root-path) | -| :broken_heart: | :broken_heart: | RazorPages | [Index page](#razorpages-index-page) | -| :broken_heart: | :broken_heart: | RazorPages | [Throws exception](#razorpages-throws-exception) | -| :green_heart: | :green_heart: | RazorPages | [Static content](#razorpages-static-content) | -| :broken_heart: | :green_heart: | MinimalApi | [Action without parameter](#minimalapi-action-without-parameter) | -| :broken_heart: | :green_heart: | MinimalApi | [Action with parameter](#minimalapi-action-with-parameter) | -| :broken_heart: | :green_heart: | MinimalApi | [Action without parameter (MapGroup)](#minimalapi-action-without-parameter-mapgroup) | -| :broken_heart: | :green_heart: | MinimalApi | [Action with parameter (MapGroup)](#minimalapi-action-with-parameter-mapgroup) | +| http.route | App | Test Name | +| - | - | - | +| :broken_heart: | ConventionalRouting | [Root path](#conventionalrouting-root-path) | +| :broken_heart: | ConventionalRouting | [Non-default action with route parameter and query string](#conventionalrouting-non-default-action-with-route-parameter-and-query-string) | +| :broken_heart: | ConventionalRouting | [Non-default action with query string](#conventionalrouting-non-default-action-with-query-string) | +| :green_heart: | ConventionalRouting | [Not Found (404)](#conventionalrouting-not-found-404) | +| :green_heart: | ConventionalRouting | [Route template with parameter constraint](#conventionalrouting-route-template-with-parameter-constraint) | +| :green_heart: | ConventionalRouting | [Path that does not match parameter constraint](#conventionalrouting-path-that-does-not-match-parameter-constraint) | +| :broken_heart: | ConventionalRouting | [Area using area:exists, default controller/action](#conventionalrouting-area-using-areaexists-default-controlleraction) | +| :broken_heart: | ConventionalRouting | [Area using area:exists, non-default action](#conventionalrouting-area-using-areaexists-non-default-action) | +| :broken_heart: | ConventionalRouting | [Area w/o area:exists, default controller/action](#conventionalrouting-area-wo-areaexists-default-controlleraction) | +| :green_heart: | AttributeRouting | [Default action](#attributerouting-default-action) | +| :green_heart: | AttributeRouting | [Action without parameter](#attributerouting-action-without-parameter) | +| :green_heart: | AttributeRouting | [Action with parameter](#attributerouting-action-with-parameter) | +| :green_heart: | AttributeRouting | [Action with parameter before action name in template](#attributerouting-action-with-parameter-before-action-name-in-template) | +| :green_heart: | AttributeRouting | [Action invoked resulting in 400 Bad Request](#attributerouting-action-invoked-resulting-in-400-bad-request) | +| :broken_heart: | RazorPages | [Root path](#razorpages-root-path) | +| :broken_heart: | RazorPages | [Index page](#razorpages-index-page) | +| :broken_heart: | RazorPages | [Throws exception](#razorpages-throws-exception) | +| :green_heart: | RazorPages | [Static content](#razorpages-static-content) | +| :green_heart: | MinimalApi | [Action without parameter](#minimalapi-action-without-parameter) | +| :green_heart: | MinimalApi | [Action with parameter](#minimalapi-action-with-parameter) | +| :green_heart: | MinimalApi | [Action without parameter (MapGroup)](#minimalapi-action-without-parameter-mapgroup) | +| :green_heart: | MinimalApi | [Action with parameter (MapGroup)](#minimalapi-action-with-parameter-mapgroup) | ## ConventionalRouting: Root path ```json { "IdealHttpRoute": "ConventionalRoute/Default/{id?}", - "ActivityDisplayName": "/", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET {controller=ConventionalRoute}/{action=Default}/{id?}", + "ActivityHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "RouteInfo": { "HttpMethod": "GET", @@ -60,8 +60,8 @@ ```json { "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}", - "ActivityDisplayName": "/ConventionalRoute/ActionWithStringParameter/2", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET {controller=ConventionalRoute}/{action=Default}/{id?}", + "ActivityHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "RouteInfo": { "HttpMethod": "GET", @@ -94,8 +94,8 @@ ```json { "IdealHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}", - "ActivityDisplayName": "/ConventionalRoute/ActionWithStringParameter", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET {controller=ConventionalRoute}/{action=Default}/{id?}", + "ActivityHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "MetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "RouteInfo": { "HttpMethod": "GET", @@ -127,7 +127,7 @@ ```json { "IdealHttpRoute": "", - "ActivityDisplayName": "/ConventionalRoute/NotFound", + "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "MetricHttpRoute": "", "RouteInfo": { @@ -146,8 +146,8 @@ ```json { "IdealHttpRoute": "SomePath/{id}/{num:int}", - "ActivityDisplayName": "/SomePath/SomeString/2", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET SomePath/{id}/{num:int}", + "ActivityHttpRoute": "SomePath/{id}/{num:int}", "MetricHttpRoute": "SomePath/{id}/{num:int}", "RouteInfo": { "HttpMethod": "GET", @@ -181,7 +181,7 @@ ```json { "IdealHttpRoute": "", - "ActivityDisplayName": "/SomePath/SomeString/NotAnInt", + "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "MetricHttpRoute": "", "RouteInfo": { @@ -200,8 +200,8 @@ ```json { "IdealHttpRoute": "{area:exists}/ControllerForMyArea/Default/{id?}", - "ActivityDisplayName": "/MyArea", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET {area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", + "ActivityHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "MetricHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "RouteInfo": { "HttpMethod": "GET", @@ -231,8 +231,8 @@ ```json { "IdealHttpRoute": "{area:exists}/ControllerForMyArea/NonDefault/{id?}", - "ActivityDisplayName": "/MyArea/ControllerForMyArea/NonDefault", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET {area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", + "ActivityHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "MetricHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "RouteInfo": { "HttpMethod": "GET", @@ -262,8 +262,8 @@ ```json { "IdealHttpRoute": "SomePrefix/AnotherArea/Index/{id?}", - "ActivityDisplayName": "/SomePrefix", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", + "ActivityHttpRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", "MetricHttpRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", "RouteInfo": { "HttpMethod": "GET", @@ -293,7 +293,7 @@ ```json { "IdealHttpRoute": "AttributeRoute", - "ActivityDisplayName": "AttributeRoute", + "ActivityDisplayName": "GET AttributeRoute", "ActivityHttpRoute": "AttributeRoute", "MetricHttpRoute": "AttributeRoute", "RouteInfo": { @@ -323,7 +323,7 @@ ```json { "IdealHttpRoute": "AttributeRoute/Get", - "ActivityDisplayName": "AttributeRoute/Get", + "ActivityDisplayName": "GET AttributeRoute/Get", "ActivityHttpRoute": "AttributeRoute/Get", "MetricHttpRoute": "AttributeRoute/Get", "RouteInfo": { @@ -353,7 +353,7 @@ ```json { "IdealHttpRoute": "AttributeRoute/Get/{id}", - "ActivityDisplayName": "AttributeRoute/Get/{id}", + "ActivityDisplayName": "GET AttributeRoute/Get/{id}", "ActivityHttpRoute": "AttributeRoute/Get/{id}", "MetricHttpRoute": "AttributeRoute/Get/{id}", "RouteInfo": { @@ -386,7 +386,7 @@ ```json { "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", - "ActivityDisplayName": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", + "ActivityDisplayName": "GET AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "ActivityHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "MetricHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "RouteInfo": { @@ -419,7 +419,7 @@ ```json { "IdealHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", - "ActivityDisplayName": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", + "ActivityDisplayName": "GET AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "ActivityHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "MetricHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", "RouteInfo": { @@ -452,7 +452,7 @@ ```json { "IdealHttpRoute": "/Index", - "ActivityDisplayName": "/", + "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "MetricHttpRoute": "", "RouteInfo": { @@ -481,7 +481,7 @@ ```json { "IdealHttpRoute": "/Index", - "ActivityDisplayName": "Index", + "ActivityDisplayName": "GET Index", "ActivityHttpRoute": "Index", "MetricHttpRoute": "Index", "RouteInfo": { @@ -510,7 +510,7 @@ ```json { "IdealHttpRoute": "/PageThatThrowsException", - "ActivityDisplayName": "PageThatThrowsException", + "ActivityDisplayName": "GET PageThatThrowsException", "ActivityHttpRoute": "PageThatThrowsException", "MetricHttpRoute": "PageThatThrowsException", "RouteInfo": { @@ -539,7 +539,7 @@ ```json { "IdealHttpRoute": "", - "ActivityDisplayName": "/js/site.js", + "ActivityDisplayName": "GET", "ActivityHttpRoute": "", "MetricHttpRoute": "", "RouteInfo": { @@ -558,8 +558,8 @@ ```json { "IdealHttpRoute": "/MinimalApi", - "ActivityDisplayName": "/MinimalApi", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET /MinimalApi", + "ActivityHttpRoute": "/MinimalApi", "MetricHttpRoute": "/MinimalApi", "RouteInfo": { "HttpMethod": "GET", @@ -577,8 +577,8 @@ ```json { "IdealHttpRoute": "/MinimalApi/{id}", - "ActivityDisplayName": "/MinimalApi/123", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET /MinimalApi/{id}", + "ActivityHttpRoute": "/MinimalApi/{id}", "MetricHttpRoute": "/MinimalApi/{id}", "RouteInfo": { "HttpMethod": "GET", @@ -598,8 +598,8 @@ ```json { "IdealHttpRoute": "/MinimalApiUsingMapGroup/", - "ActivityDisplayName": "/MinimalApiUsingMapGroup", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET /MinimalApiUsingMapGroup/", + "ActivityHttpRoute": "/MinimalApiUsingMapGroup/", "MetricHttpRoute": "/MinimalApiUsingMapGroup/", "RouteInfo": { "HttpMethod": "GET", @@ -617,8 +617,8 @@ ```json { "IdealHttpRoute": "/MinimalApiUsingMapGroup/{id}", - "ActivityDisplayName": "/MinimalApiUsingMapGroup/123", - "ActivityHttpRoute": "", + "ActivityDisplayName": "GET /MinimalApiUsingMapGroup/{id}", + "ActivityHttpRoute": "/MinimalApiUsingMapGroup/{id}", "MetricHttpRoute": "/MinimalApiUsingMapGroup/{id}", "RouteInfo": { "HttpMethod": "GET", diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.cs index d2b7bb730df..cd7cf88222d 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.cs @@ -72,11 +72,7 @@ public class TestCase public string? ExpectedHttpRoute { get; set; } - public string? CurrentActivityDisplayName { get; set; } - - public string? CurrentActivityHttpRoute { get; set; } - - public string? CurrentMetricHttpRoute { get; set; } + public string? CurrentHttpRoute { get; set; } public override string ToString() { diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json index c5c8febb77b..4d871d986a1 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestCases.json @@ -5,9 +5,7 @@ "httpMethod": "GET", "path": "/", "expectedStatusCode": 200, - "currentActivityDisplayName": "/", - "currentActivityHttpRoute": "", - "currentMetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", + "currentHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "expectedHttpRoute": "ConventionalRoute/Default/{id?}" }, { @@ -16,9 +14,7 @@ "httpMethod": "GET", "path": "/ConventionalRoute/ActionWithStringParameter/2?num=3", "expectedStatusCode": 200, - "currentActivityDisplayName": "/ConventionalRoute/ActionWithStringParameter/2", - "currentActivityHttpRoute": "", - "currentMetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", + "currentHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "expectedHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}" }, { @@ -27,9 +23,7 @@ "httpMethod": "GET", "path": "/ConventionalRoute/ActionWithStringParameter?num=3", "expectedStatusCode": 200, - "currentActivityDisplayName": "/ConventionalRoute/ActionWithStringParameter", - "currentActivityHttpRoute": "", - "currentMetricHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", + "currentHttpRoute": "{controller=ConventionalRoute}/{action=Default}/{id?}", "expectedHttpRoute": "ConventionalRoute/ActionWithStringParameter/{id?}" }, { @@ -38,9 +32,7 @@ "httpMethod": "GET", "path": "/ConventionalRoute/NotFound", "expectedStatusCode": 404, - "currentActivityDisplayName": "/ConventionalRoute/NotFound", - "currentActivityHttpRoute": "", - "currentMetricHttpRoute": "", + "currentHttpRoute": null, "expectedHttpRoute": "" }, { @@ -49,9 +41,7 @@ "httpMethod": "GET", "path": "/SomePath/SomeString/2", "expectedStatusCode": 200, - "currentActivityDisplayName": "/SomePath/SomeString/2", - "currentActivityHttpRoute": "", - "currentMetricHttpRoute": null, + "currentHttpRoute": null, "expectedHttpRoute": "SomePath/{id}/{num:int}" }, { @@ -60,9 +50,7 @@ "httpMethod": "GET", "path": "/SomePath/SomeString/NotAnInt", "expectedStatusCode": 404, - "currentActivityDisplayName": "/SomePath/SomeString/NotAnInt", - "currentActivityHttpRoute": "", - "currentMetricHttpRoute": null, + "currentHttpRoute": null, "expectedHttpRoute": "" }, { @@ -71,9 +59,7 @@ "httpMethod": "GET", "path": "/MyArea", "expectedStatusCode": 200, - "currentActivityDisplayName": "/MyArea", - "currentActivityHttpRoute": "", - "currentMetricHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", + "currentHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "expectedHttpRoute": "{area:exists}/ControllerForMyArea/Default/{id?}" }, { @@ -82,9 +68,7 @@ "httpMethod": "GET", "path": "/MyArea/ControllerForMyArea/NonDefault", "expectedStatusCode": 200, - "currentActivityDisplayName": "/MyArea/ControllerForMyArea/NonDefault", - "currentActivityHttpRoute": "", - "currentMetricHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", + "currentHttpRoute": "{area:exists}/{controller=ControllerForMyArea}/{action=Default}/{id?}", "expectedHttpRoute": "{area:exists}/ControllerForMyArea/NonDefault/{id?}" }, { @@ -93,9 +77,7 @@ "httpMethod": "GET", "path": "/SomePrefix", "expectedStatusCode": 200, - "currentActivityDisplayName": "/SomePrefix", - "currentActivityHttpRoute": "", - "currentMetricHttpRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", + "currentHttpRoute": "SomePrefix/{controller=AnotherArea}/{action=Index}/{id?}", "expectedHttpRoute": "SomePrefix/AnotherArea/Index/{id?}" }, { @@ -104,9 +86,7 @@ "httpMethod": "GET", "path": "/AttributeRoute", "expectedStatusCode": 200, - "currentActivityDisplayName": "AttributeRoute", - "currentActivityHttpRoute": null, - "currentMetricHttpRoute": null, + "currentHttpRoute": null, "expectedHttpRoute": "AttributeRoute" }, { @@ -115,9 +95,7 @@ "httpMethod": "GET", "path": "/AttributeRoute/Get", "expectedStatusCode": 200, - "currentActivityDisplayName": "AttributeRoute/Get", - "currentActivityHttpRoute": null, - "currentMetricHttpRoute": null, + "currentHttpRoute": null, "expectedHttpRoute": "AttributeRoute/Get" }, { @@ -126,9 +104,7 @@ "httpMethod": "GET", "path": "/AttributeRoute/Get/12", "expectedStatusCode": 200, - "currentActivityDisplayName": "AttributeRoute/Get/{id}", - "currentActivityHttpRoute": null, - "currentMetricHttpRoute": null, + "currentHttpRoute": null, "expectedHttpRoute": "AttributeRoute/Get/{id}" }, { @@ -137,9 +113,7 @@ "httpMethod": "GET", "path": "/AttributeRoute/12/GetWithActionNameInDifferentSpotInTemplate", "expectedStatusCode": 200, - "currentActivityDisplayName": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", - "currentActivityHttpRoute": null, - "currentMetricHttpRoute": null, + "currentHttpRoute": null, "expectedHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate" }, { @@ -148,9 +122,7 @@ "httpMethod": "GET", "path": "/AttributeRoute/NotAnInt/GetWithActionNameInDifferentSpotInTemplate", "expectedStatusCode": 400, - "currentActivityDisplayName": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate", - "currentActivityHttpRoute": null, - "currentMetricHttpRoute": null, + "currentHttpRoute": null, "expectedHttpRoute": "AttributeRoute/{id}/GetWithActionNameInDifferentSpotInTemplate" }, { @@ -159,9 +131,7 @@ "httpMethod": "GET", "path": "/", "expectedStatusCode": 200, - "currentActivityDisplayName": "/", - "currentActivityHttpRoute": "", - "currentMetricHttpRoute": "", + "currentHttpRoute": "", "expectedHttpRoute": "/Index" }, { @@ -170,9 +140,7 @@ "httpMethod": "GET", "path": "/Index", "expectedStatusCode": 200, - "currentActivityDisplayName": "Index", - "currentActivityHttpRoute": "Index", - "currentMetricHttpRoute": "Index", + "currentHttpRoute": "Index", "expectedHttpRoute": "/Index" }, { @@ -181,9 +149,7 @@ "httpMethod": "GET", "path": "/PageThatThrowsException", "expectedStatusCode": 500, - "currentActivityDisplayName": "PageThatThrowsException", - "currentActivityHttpRoute": "PageThatThrowsException", - "currentMetricHttpRoute": "PageThatThrowsException", + "currentHttpRoute": "PageThatThrowsException", "expectedHttpRoute": "/PageThatThrowsException" }, { @@ -192,9 +158,7 @@ "httpMethod": "GET", "path": "/js/site.js", "expectedStatusCode": 200, - "currentActivityDisplayName": "/js/site.js", - "currentActivityHttpRoute": null, - "currentMetricHttpRoute": null, + "currentHttpRoute": null, "expectedHttpRoute": "" }, { @@ -203,9 +167,7 @@ "httpMethod": "GET", "path": "/MinimalApi", "expectedStatusCode": 200, - "currentActivityDisplayName": "/MinimalApi", - "currentActivityHttpRoute": "", - "currentMetricHttpRoute": null, + "currentHttpRoute": null, "expectedHttpRoute": "/MinimalApi" }, { @@ -214,9 +176,7 @@ "httpMethod": "GET", "path": "/MinimalApi/123", "expectedStatusCode": 200, - "currentActivityDisplayName": "/MinimalApi/123", - "currentActivityHttpRoute": "", - "currentMetricHttpRoute": null, + "currentHttpRoute": null, "expectedHttpRoute": "/MinimalApi/{id}" }, { @@ -226,9 +186,7 @@ "httpMethod": "GET", "path": "/MinimalApiUsingMapGroup", "expectedStatusCode": 200, - "currentActivityDisplayName": "/MinimalApiUsingMapGroup", - "currentActivityHttpRoute": "", - "currentMetricHttpRoute": null, + "currentHttpRoute": null, "expectedHttpRoute": "/MinimalApiUsingMapGroup/" }, { @@ -238,9 +196,7 @@ "httpMethod": "GET", "path": "/MinimalApiUsingMapGroup/123", "expectedStatusCode": 200, - "currentActivityDisplayName": "/MinimalApiUsingMapGroup/123", - "currentActivityHttpRoute": "", - "currentMetricHttpRoute": null, + "currentHttpRoute": null, "expectedHttpRoute": "/MinimalApiUsingMapGroup/{id}" } ] diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestFixture.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestFixture.cs index 0181e8dff8e..c05e5b9e4d5 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestFixture.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTestFixture.cs @@ -77,16 +77,14 @@ private void GenerateReadme() var sb = new StringBuilder(); sb.AppendLine($"# Test results for ASP.NET Core {Environment.Version.Major}"); sb.AppendLine(); - sb.AppendLine("| Span http.route | Metric http.route | App | Test Name |"); - sb.AppendLine("| - | - | - | - |"); + sb.AppendLine("| http.route | App | Test Name |"); + sb.AppendLine("| - | - | - |"); for (var i = 0; i < this.testResults.Count; ++i) { var result = this.testResults[i]; - var emoji1 = result.TestCase.CurrentActivityHttpRoute == null ? ":green_heart:" : ":broken_heart:"; - var emoji2 = result.TestCase.CurrentMetricHttpRoute == null ? ":green_heart:" : ":broken_heart:"; - sb.Append($"| {emoji1} | {emoji2} "); - sb.AppendLine($"| {result.TestCase.TestApplicationScenario} | [{result.TestCase.Name}]({MakeAnchorTag(result.TestCase.TestApplicationScenario, result.TestCase.Name)}) |"); + var emoji = result.TestCase.CurrentHttpRoute == null ? ":green_heart:" : ":broken_heart:"; + sb.AppendLine($"| {emoji} | {result.TestCase.TestApplicationScenario} | [{result.TestCase.Name}]({MakeAnchorTag(result.TestCase.TestApplicationScenario, result.TestCase.Name)}) |"); } for (var i = 0; i < this.testResults.Count; ++i) diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTests.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTests.cs index 7df25c7dc6a..dda7df55749 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTests.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/RouteTests/RoutingTests.cs @@ -99,43 +99,19 @@ public async Task TestHttpRoute(RoutingTestCases.TestCase testCase, bool useLega Assert.Equal(testCase.HttpMethod, activityHttpMethod); Assert.Equal(testCase.HttpMethod, metricHttpMethod); - // TODO: The CurrentActivityDisplayName, CurrentActivityHttpRoute, and CurrentMetricHttpRoute - // properties will go away. They only serve to capture status quo. The "else" blocks are the real - // asserts that we ultimately want. - // If any of the current properties are null, then that means we already conform to the - // correct behavior. - if (testCase.CurrentActivityDisplayName != null) - { - Assert.Equal(testCase.CurrentActivityDisplayName, activity.DisplayName); - } - else - { - // Activity.DisplayName should be a combination of http.method + http.route attributes, see: - // https://github.com/open-telemetry/semantic-conventions/blob/main/docs/http/http-spans.md#name - var expectedActivityDisplayName = string.IsNullOrEmpty(testCase.ExpectedHttpRoute) - ? testCase.HttpMethod - : $"{testCase.HttpMethod} {testCase.ExpectedHttpRoute}"; - - Assert.Equal(expectedActivityDisplayName, activity.DisplayName); - } - - if (testCase.CurrentActivityHttpRoute != null) - { - Assert.Equal(testCase.CurrentActivityHttpRoute, activityHttpRoute); - } - else - { - Assert.Equal(testCase.ExpectedHttpRoute, activityHttpRoute); - } - - if (testCase.CurrentMetricHttpRoute != null) - { - Assert.Equal(testCase.CurrentMetricHttpRoute, metricHttpRoute); - } - else - { - Assert.Equal(testCase.ExpectedHttpRoute, metricHttpRoute); - } + // TODO: The CurrentHttpRoute property will go away. It 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 != null ? testCase.CurrentHttpRoute : testCase.ExpectedHttpRoute; + Assert.Equal(expectedHttpRoute, activityHttpRoute); + Assert.Equal(expectedHttpRoute, metricHttpRoute); + + // Activity.DisplayName should be a combination of http.method + http.route attributes, see: + // https://github.com/open-telemetry/semantic-conventions/blob/main/docs/http/http-spans.md#name + var expectedActivityDisplayName = string.IsNullOrEmpty(expectedHttpRoute) + ? testCase.HttpMethod + : $"{testCase.HttpMethod} {expectedHttpRoute}"; + + Assert.Equal(expectedActivityDisplayName, activity.DisplayName); // Only produce README files based on final semantic conventions if (!useLegacyConventions)