Skip to content

Commit 03edc26

Browse files
authored
Replace InstrumentRecorder with MetricCollector (#48931)
1 parent 0356ba0 commit 03edc26

23 files changed

+245
-290
lines changed

eng/Dependencies.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ and are generated based on the last package release.
6262
<LatestPackageReference Include="Microsoft.Extensions.Options.DataAnnotations" />
6363
<LatestPackageReference Include="Microsoft.Extensions.Options" />
6464
<LatestPackageReference Include="Microsoft.Extensions.Primitives" />
65+
<LatestPackageReference Include="Microsoft.Extensions.Telemetry.Testing" />
6566
<LatestPackageReference Include="Microsoft.Win32.Registry" />
6667
<LatestPackageReference Include="Microsoft.CodeAnalysis.CSharp.Analyzer.Testing.XUnit" />
6768
<LatestPackageReference Include="Microsoft.CodeAnalysis.CSharp.CodeFix.Testing.XUnit" />

eng/Version.Details.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,10 @@
385385
<Uri>https://github.com/dotnet/arcade</Uri>
386386
<Sha>e2334b2be36919347923d0ec872a46acddb1e385</Sha>
387387
</Dependency>
388+
<Dependency Name="Microsoft.Extensions.Telemetry.Testing" Version="8.0.0-preview.6.23320.3">
389+
<Uri>https://github.com/dotnet/extensions</Uri>
390+
<Sha>a0e9c8794e3e0ba27033a9f54a545385228d0876</Sha>
391+
</Dependency>
388392
<Dependency Name="NuGet.Frameworks" Version="6.2.4">
389393
<Uri>https://github.com/nuget/nuget.client</Uri>
390394
<Sha>8fef55f5a55a3b4f2c96cd1a9b5ddc51d4b927f8</Sha>

eng/Versions.props

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@
134134
<SystemDiagnosticsPerformanceCounterVersion>8.0.0-preview.6.23318.9</SystemDiagnosticsPerformanceCounterVersion>
135135
<SystemIOHashingVersion>8.0.0-preview.6.23318.9</SystemIOHashingVersion>
136136
<SystemRuntimeCachingVersion>8.0.0-preview.6.23318.9</SystemRuntimeCachingVersion>
137+
<!-- Packages from dotnet/extensions -->
138+
<MicrosoftExtensionsTelemetryTestingVersion>8.0.0-preview.6.23320.3</MicrosoftExtensionsTelemetryTestingVersion>
137139
<!-- Packages from dotnet/efcore -->
138140
<dotnetefVersion>8.0.0-preview.6.23319.5</dotnetefVersion>
139141
<MicrosoftEntityFrameworkCoreInMemoryVersion>8.0.0-preview.6.23319.5</MicrosoftEntityFrameworkCoreInMemoryVersion>

src/Hosting/Hosting/test/HostingApplicationDiagnosticsTests.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
using System.Diagnostics;
5-
using System.Diagnostics.Metrics;
65
using System.Diagnostics.Tracing;
76
using System.Reflection;
87
using Microsoft.AspNetCore.Http;
@@ -12,6 +11,7 @@
1211
using Microsoft.Extensions.Diagnostics.Metrics;
1312
using Microsoft.Extensions.Logging;
1413
using Microsoft.Extensions.Logging.Testing;
14+
using Microsoft.Extensions.Telemetry.Testing.Metering;
1515
using Moq;
1616

1717
namespace Microsoft.AspNetCore.Hosting.Tests;
@@ -52,10 +52,10 @@ public async Task EventCountersAndMetricsValues()
5252
var hostingApplication1 = CreateApplication(out var features1, eventSource: hostingEventSource, meterFactory: testMeterFactory1);
5353
var hostingApplication2 = CreateApplication(out var features2, eventSource: hostingEventSource, meterFactory: testMeterFactory2);
5454

55-
using var currentRequestsRecorder1 = new InstrumentRecorder<long>(testMeterFactory1, HostingMetrics.MeterName, "http-server-current-requests");
56-
using var currentRequestsRecorder2 = new InstrumentRecorder<long>(testMeterFactory2, HostingMetrics.MeterName, "http-server-current-requests");
57-
using var requestDurationRecorder1 = new InstrumentRecorder<double>(testMeterFactory1, HostingMetrics.MeterName, "http-server-request-duration");
58-
using var requestDurationRecorder2 = new InstrumentRecorder<double>(testMeterFactory2, HostingMetrics.MeterName, "http-server-request-duration");
55+
using var currentRequestsRecorder1 = new MetricCollector<long>(testMeterFactory1, HostingMetrics.MeterName, "http-server-current-requests");
56+
using var currentRequestsRecorder2 = new MetricCollector<long>(testMeterFactory2, HostingMetrics.MeterName, "http-server-current-requests");
57+
using var requestDurationRecorder1 = new MetricCollector<double>(testMeterFactory1, HostingMetrics.MeterName, "http-server-request-duration");
58+
using var requestDurationRecorder2 = new MetricCollector<double>(testMeterFactory2, HostingMetrics.MeterName, "http-server-request-duration");
5959

6060
// Act/Assert 1
6161
var context1 = hostingApplication1.CreateContext(features1);
@@ -74,15 +74,15 @@ public async Task EventCountersAndMetricsValues()
7474
Assert.Equal(0, await currentRequestValues.FirstOrDefault(v => v == 0));
7575
Assert.Equal(0, await failedRequestValues.FirstOrDefault(v => v == 0));
7676

77-
Assert.Collection(currentRequestsRecorder1.GetMeasurements(),
77+
Assert.Collection(currentRequestsRecorder1.GetMeasurementSnapshot(),
7878
m => Assert.Equal(1, m.Value),
7979
m => Assert.Equal(-1, m.Value));
80-
Assert.Collection(currentRequestsRecorder2.GetMeasurements(),
80+
Assert.Collection(currentRequestsRecorder2.GetMeasurementSnapshot(),
8181
m => Assert.Equal(1, m.Value),
8282
m => Assert.Equal(-1, m.Value));
83-
Assert.Collection(requestDurationRecorder1.GetMeasurements(),
83+
Assert.Collection(requestDurationRecorder1.GetMeasurementSnapshot(),
8484
m => Assert.True(m.Value > 0));
85-
Assert.Collection(requestDurationRecorder2.GetMeasurements(),
85+
Assert.Collection(requestDurationRecorder2.GetMeasurementSnapshot(),
8686
m => Assert.True(m.Value > 0));
8787

8888
// Act/Assert 2
@@ -105,20 +105,20 @@ public async Task EventCountersAndMetricsValues()
105105
Assert.Equal(0, await currentRequestValues.FirstOrDefault(v => v == 0));
106106
Assert.Equal(2, await failedRequestValues.FirstOrDefault(v => v == 2));
107107

108-
Assert.Collection(currentRequestsRecorder1.GetMeasurements(),
108+
Assert.Collection(currentRequestsRecorder1.GetMeasurementSnapshot(),
109109
m => Assert.Equal(1, m.Value),
110110
m => Assert.Equal(-1, m.Value),
111111
m => Assert.Equal(1, m.Value),
112112
m => Assert.Equal(-1, m.Value));
113-
Assert.Collection(currentRequestsRecorder2.GetMeasurements(),
113+
Assert.Collection(currentRequestsRecorder2.GetMeasurementSnapshot(),
114114
m => Assert.Equal(1, m.Value),
115115
m => Assert.Equal(-1, m.Value),
116116
m => Assert.Equal(1, m.Value),
117117
m => Assert.Equal(-1, m.Value));
118-
Assert.Collection(requestDurationRecorder1.GetMeasurements(),
118+
Assert.Collection(requestDurationRecorder1.GetMeasurementSnapshot(),
119119
m => Assert.True(m.Value > 0),
120120
m => Assert.True(m.Value > 0));
121-
Assert.Collection(requestDurationRecorder2.GetMeasurements(),
121+
Assert.Collection(requestDurationRecorder2.GetMeasurementSnapshot(),
122122
m => Assert.True(m.Value > 0),
123123
m => Assert.True(m.Value > 0));
124124
}

src/Hosting/Hosting/test/HostingMetricsTests.cs

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using Microsoft.Extensions.DependencyInjection;
1212
using Microsoft.Extensions.Diagnostics.Metrics;
1313
using Microsoft.Extensions.Logging.Abstractions;
14+
using Microsoft.Extensions.Telemetry.Testing.Metering;
1415

1516
namespace Microsoft.AspNetCore.Hosting.Tests;
1617

@@ -25,9 +26,9 @@ public void MultipleRequests()
2526
var httpContext = new DefaultHttpContext();
2627
var meter = meterFactory.Meters.Single();
2728

28-
using var requestDurationRecorder = new InstrumentRecorder<double>(meterFactory, HostingMetrics.MeterName, "http-server-request-duration");
29-
using var currentRequestsRecorder = new InstrumentRecorder<long>(meterFactory, HostingMetrics.MeterName, "http-server-current-requests");
30-
using var unhandledRequestsRecorder = new InstrumentRecorder<long>(meterFactory, HostingMetrics.MeterName, "http-server-unhandled-requests");
29+
using var requestDurationCollector = new MetricCollector<double>(meterFactory, HostingMetrics.MeterName, "http-server-request-duration");
30+
using var currentRequestsCollector = new MetricCollector<long>(meterFactory, HostingMetrics.MeterName, "http-server-current-requests");
31+
using var unhandledRequestsCollector = new MetricCollector<long>(meterFactory, HostingMetrics.MeterName, "http-server-unhandled-requests");
3132

3233
// Act/Assert
3334
Assert.Equal(HostingMetrics.MeterName, meter.Name);
@@ -39,10 +40,10 @@ public void MultipleRequests()
3940
context1.HttpContext.Response.StatusCode = StatusCodes.Status200OK;
4041
hostingApplication.DisposeContext(context1, null);
4142

42-
Assert.Collection(currentRequestsRecorder.GetMeasurements(),
43+
Assert.Collection(currentRequestsCollector.GetMeasurementSnapshot(),
4344
m => Assert.Equal(1, m.Value),
4445
m => Assert.Equal(-1, m.Value));
45-
Assert.Collection(requestDurationRecorder.GetMeasurements(),
46+
Assert.Collection(requestDurationCollector.GetMeasurementSnapshot(),
4647
m => AssertRequestDuration(m, HttpProtocol.Http11, StatusCodes.Status200OK));
4748

4849
// Request 2 (after failure)
@@ -51,12 +52,12 @@ public void MultipleRequests()
5152
context2.HttpContext.Response.StatusCode = StatusCodes.Status500InternalServerError;
5253
hostingApplication.DisposeContext(context2, new InvalidOperationException("Test error"));
5354

54-
Assert.Collection(currentRequestsRecorder.GetMeasurements(),
55+
Assert.Collection(currentRequestsCollector.GetMeasurementSnapshot(),
5556
m => Assert.Equal(1, m.Value),
5657
m => Assert.Equal(-1, m.Value),
5758
m => Assert.Equal(1, m.Value),
5859
m => Assert.Equal(-1, m.Value));
59-
Assert.Collection(requestDurationRecorder.GetMeasurements(),
60+
Assert.Collection(requestDurationCollector.GetMeasurementSnapshot(),
6061
m => AssertRequestDuration(m, HttpProtocol.Http11, StatusCodes.Status200OK),
6162
m => AssertRequestDuration(m, HttpProtocol.Http2, StatusCodes.Status500InternalServerError, exceptionName: "System.InvalidOperationException"));
6263

@@ -66,37 +67,37 @@ public void MultipleRequests()
6667
context3.HttpContext.Items["__RequestUnhandled"] = true;
6768
context3.HttpContext.Response.StatusCode = StatusCodes.Status404NotFound;
6869

69-
Assert.Collection(currentRequestsRecorder.GetMeasurements(),
70+
Assert.Collection(currentRequestsCollector.GetMeasurementSnapshot(),
7071
m => Assert.Equal(1, m.Value),
7172
m => Assert.Equal(-1, m.Value),
7273
m => Assert.Equal(1, m.Value),
7374
m => Assert.Equal(-1, m.Value),
7475
m => Assert.Equal(1, m.Value));
75-
Assert.Collection(requestDurationRecorder.GetMeasurements(),
76+
Assert.Collection(requestDurationCollector.GetMeasurementSnapshot(),
7677
m => AssertRequestDuration(m, HttpProtocol.Http11, StatusCodes.Status200OK),
7778
m => AssertRequestDuration(m, HttpProtocol.Http2, StatusCodes.Status500InternalServerError, exceptionName: "System.InvalidOperationException"));
7879

7980
hostingApplication.DisposeContext(context3, null);
8081

81-
Assert.Collection(currentRequestsRecorder.GetMeasurements(),
82+
Assert.Collection(currentRequestsCollector.GetMeasurementSnapshot(),
8283
m => Assert.Equal(1, m.Value),
8384
m => Assert.Equal(-1, m.Value),
8485
m => Assert.Equal(1, m.Value),
8586
m => Assert.Equal(-1, m.Value),
8687
m => Assert.Equal(1, m.Value),
8788
m => Assert.Equal(-1, m.Value));
88-
Assert.Collection(requestDurationRecorder.GetMeasurements(),
89+
Assert.Collection(requestDurationCollector.GetMeasurementSnapshot(),
8990
m => AssertRequestDuration(m, HttpProtocol.Http11, StatusCodes.Status200OK),
9091
m => AssertRequestDuration(m, HttpProtocol.Http2, StatusCodes.Status500InternalServerError, exceptionName: "System.InvalidOperationException"),
9192
m => AssertRequestDuration(m, HttpProtocol.Http3, StatusCodes.Status404NotFound));
92-
Assert.Collection(unhandledRequestsRecorder.GetMeasurements(),
93+
Assert.Collection(unhandledRequestsCollector.GetMeasurementSnapshot(),
9394
m => Assert.Equal(1, m.Value));
9495

95-
static void AssertRequestDuration(Measurement<double> measurement, string protocol, int statusCode, string exceptionName = null)
96+
static void AssertRequestDuration(CollectedMeasurement<double> measurement, string protocol, int statusCode, string exceptionName = null)
9697
{
9798
Assert.True(measurement.Value > 0);
98-
Assert.Equal(protocol, (string)measurement.Tags.ToArray().Single(t => t.Key == "protocol").Value);
99-
Assert.Equal(statusCode, (int)measurement.Tags.ToArray().Single(t => t.Key == "status-code").Value);
99+
Assert.Equal(protocol, (string)measurement.Tags["protocol"]);
100+
Assert.Equal(statusCode, (int)measurement.Tags["status-code"]);
100101
if (exceptionName == null)
101102
{
102103
Assert.DoesNotContain(measurement.Tags.ToArray(), t => t.Key == "exception-name");
@@ -132,17 +133,17 @@ public async Task StartListeningDuringRequest_NotMeasured()
132133

133134
await syncPoint.WaitForSyncPoint().DefaultTimeout();
134135

135-
using var requestDurationRecorder = new InstrumentRecorder<double>(meterFactory, HostingMetrics.MeterName, "http-server-request-duration");
136-
using var currentRequestsRecorder = new InstrumentRecorder<long>(meterFactory, HostingMetrics.MeterName, "http-server-current-requests");
136+
using var requestDurationCollector = new MetricCollector<double>(meterFactory, HostingMetrics.MeterName, "http-server-request-duration");
137+
using var currentRequestsCollector = new MetricCollector<long>(meterFactory, HostingMetrics.MeterName, "http-server-current-requests");
137138
context1.HttpContext.Response.StatusCode = StatusCodes.Status200OK;
138139

139140
syncPoint.Continue();
140141
await processRequestTask.DefaultTimeout();
141142

142143
hostingApplication.DisposeContext(context1, null);
143144

144-
Assert.Empty(currentRequestsRecorder.GetMeasurements());
145-
Assert.Empty(requestDurationRecorder.GetMeasurements());
145+
Assert.Empty(currentRequestsCollector.GetMeasurementSnapshot());
146+
Assert.Empty(requestDurationCollector.GetMeasurementSnapshot());
146147
}
147148

148149
[Fact]
@@ -154,8 +155,8 @@ public void IHttpMetricsTagsFeatureNotUsedFromFeatureCollection()
154155
var httpContext = new DefaultHttpContext();
155156
var meter = meterFactory.Meters.Single();
156157

157-
using var requestDurationRecorder = new InstrumentRecorder<double>(meterFactory, HostingMetrics.MeterName, "http-server-request-duration");
158-
using var currentRequestsRecorder = new InstrumentRecorder<long>(meterFactory, HostingMetrics.MeterName, "http-server-current-requests");
158+
using var requestDurationCollector = new MetricCollector<double>(meterFactory, HostingMetrics.MeterName, "http-server-request-duration");
159+
using var currentRequestsCollector = new MetricCollector<long>(meterFactory, HostingMetrics.MeterName, "http-server-current-requests");
159160

160161
// Act/Assert
161162
Assert.Equal(HostingMetrics.MeterName, meter.Name);

src/Hosting/Hosting/test/Microsoft.AspNetCore.Hosting.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
<Reference Include="Microsoft.AspNetCore.Hosting" />
2323
<Reference Include="Microsoft.Extensions.Hosting" />
2424
<Reference Include="Microsoft.Extensions.Options" />
25+
<Reference Include="Microsoft.Extensions.Telemetry.Testing" />
2526
<Reference Include="System.Threading.Channels" />
2627
</ItemGroup>
2728

src/Http/Routing/test/UnitTests/Microsoft.AspNetCore.Routing.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
<Reference Include="Microsoft.Extensions.Diagnostics" />
1616
<Reference Include="Microsoft.Extensions.Hosting.Abstractions" />
1717
<Reference Include="Microsoft.Extensions.Logging" />
18+
<Reference Include="Microsoft.Extensions.Telemetry.Testing" />
1819
<Reference Include="Microsoft.Extensions.WebEncoders" />
1920

2021
<Compile Include="$(SharedSourceRoot)Metrics\TestMeterFactory.cs" LinkBase="shared" />

0 commit comments

Comments
 (0)