Skip to content

Commit 8eaf4b5

Browse files
Merge pull request #50576 from dotnet-maestro-bot/merge/release/8.0-to-main
[automated] Merge branch 'release/8.0' => 'main'
2 parents 8e5bcfe + 9e5b381 commit 8eaf4b5

File tree

87 files changed

+437
-356
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

87 files changed

+437
-356
lines changed

src/Hosting/Hosting/src/Internal/HostingApplication.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,8 @@ public Activity? Activity
144144

145145
public long StartTimestamp { get; set; }
146146
internal bool HasDiagnosticListener { get; set; }
147-
public bool EventLogOrMetricsEnabled { get; set; }
147+
public bool MetricsEnabled { get; set; }
148+
public bool EventLogEnabled { get; set; }
148149

149150
internal HttpActivityFeature? HttpActivityFeature;
150151
internal HttpMetricsTagsFeature? MetricsTagsFeature;
@@ -159,7 +160,8 @@ public void Reset()
159160

160161
StartTimestamp = 0;
161162
HasDiagnosticListener = false;
162-
EventLogOrMetricsEnabled = false;
163+
MetricsEnabled = false;
164+
EventLogEnabled = false;
163165
MetricsTagsFeature?.TagsList.Clear();
164166
}
165167
}

src/Hosting/Hosting/src/Internal/HostingApplicationDiagnostics.cs

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,27 @@ public void BeginRequest(HttpContext httpContext, HostingApplication.Context con
5454
{
5555
long startTimestamp = 0;
5656

57-
if (_eventSource.IsEnabled() || _metrics.IsEnabled())
57+
if (_metrics.IsEnabled())
5858
{
59-
context.EventLogOrMetricsEnabled = true;
59+
context.MetricsEnabled = true;
6060
context.MetricsTagsFeature ??= new HttpMetricsTagsFeature();
6161
httpContext.Features.Set<IHttpMetricsTagsFeature>(context.MetricsTagsFeature);
6262

6363
startTimestamp = Stopwatch.GetTimestamp();
6464

65+
// To keep the hot path short we defer logging in this function to non-inlines
66+
RecordRequestStartMetrics(httpContext);
67+
}
68+
69+
if (_eventSource.IsEnabled())
70+
{
71+
context.EventLogEnabled = true;
72+
73+
if (startTimestamp == 0)
74+
{
75+
startTimestamp = Stopwatch.GetTimestamp();
76+
}
77+
6578
// To keep the hot path short we defer logging in this function to non-inlines
6679
RecordRequestStartEventLog(httpContext);
6780
}
@@ -135,7 +148,7 @@ public void RequestEnd(HttpContext httpContext, Exception? exception, HostingApp
135148
// Non-inline
136149
LogRequestFinished(context, startTimestamp, currentTimestamp);
137150

138-
if (context.EventLogOrMetricsEnabled)
151+
if (context.MetricsEnabled)
139152
{
140153
var route = httpContext.GetEndpoint()?.Metadata.GetMetadata<IRouteDiagnosticsMetadata>()?.Route;
141154
var customTags = context.MetricsTagsFeature?.TagsList;
@@ -197,7 +210,7 @@ public void RequestEnd(HttpContext httpContext, Exception? exception, HostingApp
197210
StopActivity(httpContext, activity, context.HasDiagnosticListener);
198211
}
199212

200-
if (context.EventLogOrMetricsEnabled)
213+
if (context.EventLogEnabled)
201214
{
202215
if (exception != null)
203216
{
@@ -219,7 +232,7 @@ public void RequestEnd(HttpContext httpContext, Exception? exception, HostingApp
219232
[MethodImpl(MethodImplOptions.AggressiveInlining)]
220233
public void ContextDisposed(HostingApplication.Context context)
221234
{
222-
if (context.EventLogOrMetricsEnabled)
235+
if (context.EventLogEnabled)
223236
{
224237
_eventSource.RequestStop();
225238
}
@@ -352,10 +365,15 @@ internal UnhandledExceptionData(HttpContext httpContext, long timestamp, Excepti
352365
[MethodImpl(MethodImplOptions.NoInlining)]
353366
private void RecordRequestStartEventLog(HttpContext httpContext)
354367
{
355-
_metrics.RequestStart(httpContext.Request.IsHttps, httpContext.Request.Scheme, httpContext.Request.Method, httpContext.Request.Host);
356368
_eventSource.RequestStart(httpContext.Request.Method, httpContext.Request.Path);
357369
}
358370

371+
[MethodImpl(MethodImplOptions.NoInlining)]
372+
private void RecordRequestStartMetrics(HttpContext httpContext)
373+
{
374+
_metrics.RequestStart(httpContext.Request.IsHttps, httpContext.Request.Scheme, httpContext.Request.Method, httpContext.Request.Host);
375+
}
376+
359377
[MethodImpl(MethodImplOptions.NoInlining)]
360378
private Activity? StartActivity(HttpContext httpContext, bool loggingEnabled, bool diagnosticListenerActivityCreationEnabled, out bool hasDiagnosticListener)
361379
{

src/Hosting/Hosting/test/HostingApplicationDiagnosticsTests.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,56 @@ public async Task EventCountersAndMetricsValues()
124124
m => Assert.True(m.Value > 0));
125125
}
126126

127+
[Fact]
128+
public void EventCountersEnabled()
129+
{
130+
// Arrange
131+
var hostingEventSource = new HostingEventSource(Guid.NewGuid().ToString());
132+
133+
var eventListener = new TestCounterListener(new[]
134+
{
135+
"requests-per-second",
136+
"total-requests",
137+
"current-requests",
138+
"failed-requests"
139+
});
140+
141+
eventListener.EnableEvents(hostingEventSource, EventLevel.Informational, EventKeywords.None,
142+
new Dictionary<string, string>
143+
{
144+
{ "EventCounterIntervalSec", "1" }
145+
});
146+
147+
var testMeterFactory = new TestMeterFactory();
148+
149+
// Act
150+
var hostingApplication = CreateApplication(out var features, eventSource: hostingEventSource, meterFactory: testMeterFactory);
151+
var context = hostingApplication.CreateContext(features);
152+
153+
// Assert
154+
Assert.True(context.EventLogEnabled);
155+
Assert.False(context.MetricsEnabled);
156+
}
157+
158+
[Fact]
159+
public void MetricsEnabled()
160+
{
161+
// Arrange
162+
var hostingEventSource = new HostingEventSource(Guid.NewGuid().ToString());
163+
164+
var testMeterFactory = new TestMeterFactory();
165+
using var activeRequestsCollector = new MetricCollector<long>(testMeterFactory, HostingMetrics.MeterName, "http.server.active_requests");
166+
using var requestDurationCollector = new MetricCollector<double>(testMeterFactory, HostingMetrics.MeterName, "http.server.request.duration");
167+
168+
// Act
169+
var hostingApplication = CreateApplication(out var features, eventSource: hostingEventSource, meterFactory: testMeterFactory);
170+
var context = hostingApplication.CreateContext(features);
171+
172+
// Assert
173+
Assert.True(context.MetricsEnabled);
174+
Assert.False(context.EventLogEnabled);
175+
}
176+
127177
[Fact]
128178
public void DisposeContextDoesNotThrowWhenContextScopeIsNull()
129179
{

src/Http/Http.Extensions/gen/DiagnosticDescriptors.cs

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,111 +7,122 @@ namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator;
77

88
internal static class DiagnosticDescriptors
99
{
10+
private static string GetHelpLinkUrl(string id) => $"https://learn.microsoft.com/aspnet/core/fundamentals/aot/request-delegate-generator/diagnostics/{id}";
11+
1012
public static DiagnosticDescriptor UnableToResolveRoutePattern { get; } = new(
1113
"RDG001",
1214
new LocalizableResourceString(nameof(Resources.UnableToResolveRoutePattern_Title), Resources.ResourceManager, typeof(Resources)),
1315
new LocalizableResourceString(nameof(Resources.UnableToResolveRoutePattern_Message), Resources.ResourceManager, typeof(Resources)),
1416
"Usage",
1517
DiagnosticSeverity.Warning,
16-
isEnabledByDefault: true
17-
);
18+
isEnabledByDefault: true,
19+
helpLinkUri: GetHelpLinkUrl("RDG001"));
1820

1921
public static DiagnosticDescriptor UnableToResolveMethod { get; } = new(
2022
"RDG002",
2123
new LocalizableResourceString(nameof(Resources.UnableToResolveMethod_Title), Resources.ResourceManager, typeof(Resources)),
2224
new LocalizableResourceString(nameof(Resources.UnableToResolveMethod_Message), Resources.ResourceManager, typeof(Resources)),
2325
"Usage",
2426
DiagnosticSeverity.Warning,
25-
isEnabledByDefault: true
26-
);
27+
isEnabledByDefault: true,
28+
helpLinkUri: GetHelpLinkUrl("RDG002"));
2729

28-
// This is temporary. The plan is to be able to resolve all parameters to a known EndpointParameterSource.
29-
// For now, we emit a warning for the unsupported set.
3030
public static DiagnosticDescriptor UnableToResolveParameterDescriptor { get; } = new(
3131
"RDG003",
3232
new LocalizableResourceString(nameof(Resources.UnableToResolveParameter_Title), Resources.ResourceManager, typeof(Resources)),
3333
new LocalizableResourceString(nameof(Resources.UnableToResolveParameter_Message), Resources.ResourceManager, typeof(Resources)),
3434
"Usage",
3535
DiagnosticSeverity.Warning,
36-
isEnabledByDefault: true);
36+
isEnabledByDefault: true,
37+
helpLinkUri: GetHelpLinkUrl("RDG003"));
3738

3839
public static DiagnosticDescriptor UnableToResolveAnonymousReturnType { get; } = new(
3940
"RDG004",
4041
new LocalizableResourceString(nameof(Resources.UnableToResolveAnonymousReturnType_Title), Resources.ResourceManager, typeof(Resources)),
4142
new LocalizableResourceString(nameof(Resources.UnableToResolveAnonymousReturnType_Message), Resources.ResourceManager, typeof(Resources)),
4243
"Usage",
4344
DiagnosticSeverity.Warning,
44-
isEnabledByDefault: true);
45+
isEnabledByDefault: true,
46+
helpLinkUri: GetHelpLinkUrl("RDG004"));
4547

4648
public static DiagnosticDescriptor InvalidAsParametersAbstractType { get; } = new(
4749
"RDG005",
4850
new LocalizableResourceString(nameof(Resources.InvalidAsParametersAbstractType_Title), Resources.ResourceManager, typeof(Resources)),
4951
new LocalizableResourceString(nameof(Resources.InvalidAsParametersAbstractType_Message), Resources.ResourceManager, typeof(Resources)),
5052
"Usage",
5153
DiagnosticSeverity.Warning,
52-
isEnabledByDefault: true);
54+
isEnabledByDefault: true,
55+
helpLinkUri: GetHelpLinkUrl("RDG005"));
5356

5457
public static DiagnosticDescriptor InvalidAsParametersSignature { get; } = new(
5558
"RDG006",
5659
new LocalizableResourceString(nameof(Resources.InvalidAsParametersSignature_Title), Resources.ResourceManager, typeof(Resources)),
5760
new LocalizableResourceString(nameof(Resources.InvalidAsParametersSignature_Message), Resources.ResourceManager, typeof(Resources)),
5861
"Usage",
5962
DiagnosticSeverity.Warning,
60-
isEnabledByDefault: true);
63+
isEnabledByDefault: true,
64+
helpLinkUri: GetHelpLinkUrl("RDG006"));
6165

6266
public static DiagnosticDescriptor InvalidAsParametersNoConstructorFound { get; } = new(
6367
"RDG007",
6468
new LocalizableResourceString(nameof(Resources.InvalidAsParametersNoConstructorFound_Title), Resources.ResourceManager, typeof(Resources)),
6569
new LocalizableResourceString(nameof(Resources.InvalidAsParametersNoConstructorFound_Message), Resources.ResourceManager, typeof(Resources)),
6670
"Usage",
6771
DiagnosticSeverity.Warning,
68-
isEnabledByDefault: true);
72+
isEnabledByDefault: true,
73+
helpLinkUri: GetHelpLinkUrl("RDG007"));
6974

7075
public static DiagnosticDescriptor InvalidAsParametersSingleConstructorOnly { get; } = new(
7176
"RDG008",
7277
new LocalizableResourceString(nameof(Resources.InvalidAsParametersSingleConstructorOnly_Title), Resources.ResourceManager, typeof(Resources)),
7378
new LocalizableResourceString(nameof(Resources.InvalidAsParametersSingleConstructorOnly_Message), Resources.ResourceManager, typeof(Resources)),
7479
"Usage",
7580
DiagnosticSeverity.Warning,
76-
isEnabledByDefault: true);
81+
isEnabledByDefault: true,
82+
helpLinkUri: GetHelpLinkUrl("RDG008"));
7783

7884
public static DiagnosticDescriptor InvalidAsParametersNested { get; } = new(
7985
"RDG009",
8086
new LocalizableResourceString(nameof(Resources.InvalidAsParametersNested_Title), Resources.ResourceManager, typeof(Resources)),
8187
new LocalizableResourceString(nameof(Resources.InvalidAsParametersNested_Message), Resources.ResourceManager, typeof(Resources)),
8288
"Usage",
8389
DiagnosticSeverity.Warning,
84-
isEnabledByDefault: true);
90+
isEnabledByDefault: true,
91+
helpLinkUri: GetHelpLinkUrl("RDG009"));
8592

8693
public static DiagnosticDescriptor InvalidAsParametersNullable { get; } = new(
8794
"RDG010",
8895
new LocalizableResourceString(nameof(Resources.InvalidAsParametersNullable_Title), Resources.ResourceManager, typeof(Resources)),
8996
new LocalizableResourceString(nameof(Resources.InvalidAsParametersNullable_Message), Resources.ResourceManager, typeof(Resources)),
9097
"Usage",
9198
DiagnosticSeverity.Warning,
92-
isEnabledByDefault: true);
99+
isEnabledByDefault: true,
100+
helpLinkUri: GetHelpLinkUrl("RDG010"));
93101

94102
public static DiagnosticDescriptor TypeParametersNotSupported { get; } = new(
95103
"RDG011",
96104
new LocalizableResourceString(nameof(Resources.TypeParametersNotSupported_Title), Resources.ResourceManager, typeof(Resources)),
97105
new LocalizableResourceString(nameof(Resources.TypeParametersNotSupported_Message), Resources.ResourceManager, typeof(Resources)),
98106
"Usage",
99107
DiagnosticSeverity.Warning,
100-
isEnabledByDefault: true);
108+
isEnabledByDefault: true,
109+
helpLinkUri: GetHelpLinkUrl("RDG011"));
101110

102111
public static DiagnosticDescriptor InaccessibleTypesNotSupported { get; } = new(
103112
"RDG012",
104113
new LocalizableResourceString(nameof(Resources.InaccessibleTypesNotSupported_Title), Resources.ResourceManager, typeof(Resources)),
105114
new LocalizableResourceString(nameof(Resources.InaccessibleTypesNotSupported_Message), Resources.ResourceManager, typeof(Resources)),
106115
"Usage",
107116
DiagnosticSeverity.Warning,
108-
isEnabledByDefault: true);
117+
isEnabledByDefault: true,
118+
helpLinkUri: GetHelpLinkUrl("RDG012"));
109119

110120
public static DiagnosticDescriptor KeyedAndNotKeyedServiceAttributesNotSupported { get; } = new(
111121
"RDG013",
112122
new LocalizableResourceString(nameof(Resources.KeyedAndNotKeyedServiceAttributesNotSupported_Title), Resources.ResourceManager, typeof(Resources)),
113123
new LocalizableResourceString(nameof(Resources.KeyedAndNotKeyedServiceAttributesNotSupported_Message), Resources.ResourceManager, typeof(Resources)),
114124
"Usage",
115125
DiagnosticSeverity.Warning,
116-
isEnabledByDefault: true);
126+
isEnabledByDefault: true,
127+
helpLinkUri: GetHelpLinkUrl("RDG013"));
117128
}

0 commit comments

Comments
 (0)