Skip to content

Commit 3ead530

Browse files
author
R9 Fundamentals
committed
Initial commit
1 parent bab8a9b commit 3ead530

File tree

5 files changed

+84
-21
lines changed

5 files changed

+84
-21
lines changed

src/Libraries/Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization/ResourceUtilizationHealthCheck.cs

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ namespace Microsoft.Extensions.Diagnostics.HealthChecks;
1818
/// </summary>
1919
internal sealed partial class ResourceUtilizationHealthCheck : IHealthCheck, IDisposable
2020
{
21+
#if !NETFRAMEWORK
22+
private const double Hundred = 100.0;
23+
#endif
2124
private readonly double _multiplier;
2225
private readonly MeterListener? _meterListener;
2326
private readonly ResourceUtilizationHealthCheckOptions _options;
@@ -82,12 +85,14 @@ public static Task<HealthCheckResult> EvaluateHealthStatusAsync(double cpuUsedPe
8285
}
8386
#pragma warning restore EA0014 // The async method doesn't support cancellation
8487

88+
#if !NETFRAMEWORK
8589
/// <summary>
8690
/// Initializes a new instance of the <see cref="ResourceUtilizationHealthCheck"/> class.
8791
/// </summary>
8892
/// <param name="options">The options.</param>
8993
/// <param name="dataTracker">The datatracker.</param>
90-
public ResourceUtilizationHealthCheck(IOptions<ResourceUtilizationHealthCheckOptions> options, IResourceMonitor dataTracker)
94+
/// <param name="rmOptions">The Resource Monitoring options.</param>
95+
public ResourceUtilizationHealthCheck(IOptions<ResourceUtilizationHealthCheckOptions> options, IResourceMonitor dataTracker, IOptions<ResourceMonitoringOptions> rmOptions)
9196
{
9297
_options = Throw.IfMemberNull(options, options.Value);
9398
if (!_options.UseObservableResourceMonitoringInstruments)
@@ -96,25 +101,44 @@ public ResourceUtilizationHealthCheck(IOptions<ResourceUtilizationHealthCheckOpt
96101
return;
97102
}
98103

99-
#if NETFRAMEWORK
100-
_multiplier = 1;
101-
#else
102-
// Due to a bug on Windows https://github.com/dotnet/extensions/issues/5472,
103-
// the CPU utilization comes in the range [0, 100].
104-
if (OperatingSystem.IsWindows())
104+
// On Windows there was a bug https://github.com/dotnet/extensions/issues/5472,
105+
// so the CPU utilization might come in the range [0, 100], which means we don't need to multiply it by 100.
106+
var rmOptionsValue = Throw.IfMemberNull(rmOptions, rmOptions.Value);
107+
if (!rmOptionsValue.UseZeroToOneRangeForMetrics)
105108
{
106109
_multiplier = 1;
107110
}
108111

109-
// On Linux, the CPU utilization comes in the correct range [0, 1], which we will be converting to percentage.
112+
// On Linux, the CPU utilization always comes in the correct range [0, 1], which we need to convert to percentage.
110113
else
111114
{
112-
#pragma warning disable S109 // Magic numbers should not be used
113-
_multiplier = 100;
114-
#pragma warning restore S109 // Magic numbers should not be used
115+
_multiplier = Hundred;
116+
}
117+
118+
_meterListener = new()
119+
{
120+
InstrumentPublished = OnInstrumentPublished
121+
};
122+
123+
_meterListener.SetMeasurementEventCallback<double>(OnMeasurementRecorded);
124+
_meterListener.Start();
125+
}
126+
#else
127+
/// <summary>
128+
/// Initializes a new instance of the <see cref="ResourceUtilizationHealthCheck"/> class.
129+
/// </summary>
130+
/// <param name="options">The options.</param>
131+
/// <param name="dataTracker">The datatracker.</param>
132+
public ResourceUtilizationHealthCheck(IOptions<ResourceUtilizationHealthCheckOptions> options, IResourceMonitor dataTracker)
133+
{
134+
_options = Throw.IfMemberNull(options, options.Value);
135+
if (!_options.UseObservableResourceMonitoringInstruments)
136+
{
137+
ObsoleteConstructor(dataTracker);
138+
return;
115139
}
116-
#endif
117140

141+
_multiplier = 1;
118142
_meterListener = new()
119143
{
120144
InstrumentPublished = OnInstrumentPublished
@@ -123,6 +147,7 @@ public ResourceUtilizationHealthCheck(IOptions<ResourceUtilizationHealthCheckOpt
123147
_meterListener.SetMeasurementEventCallback<double>(OnMeasurementRecorded);
124148
_meterListener.Start();
125149
}
150+
#endif
126151

127152
/// <summary>
128153
/// Runs the health check.

test/Libraries/Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization.Tests/Linux/LinuxResourceHealthCheckTests.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,10 @@ public async Task TestCpuAndMemoryChecks_WithMetrics(
183183
};
184184

185185
var options = Microsoft.Extensions.Options.Options.Create(checkOptions);
186-
using var healthCheck = new ResourceUtilizationHealthCheck(options, dataTracker.Object);
186+
using var healthCheck = new ResourceUtilizationHealthCheck(
187+
options,
188+
dataTracker.Object,
189+
Microsoft.Extensions.Options.Options.Create(new ResourceMonitoringOptions()));
187190

188191
// Act
189192
fakeClock.Advance(TimeSpan.FromMilliseconds(1));

test/Libraries/Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization.Tests/ResourceHealthCheckExtensionsTests.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ public void AddResourceHealthCheck_RegistersInternalResourceMonitoring()
8181

8282
IResourceMonitor? resourceMonitor = serviceProvider.GetService<IResourceMonitor>();
8383
Assert.NotNull(resourceMonitor);
84+
85+
// check Resource Monitoring Options:
86+
var resourceMonitoringOptions = serviceProvider.GetRequiredService<IOptions<ResourceMonitoringOptions>>().Value;
87+
Assert.NotNull(resourceMonitoringOptions);
8488
}
8589

8690
[ConditionalFact]
@@ -522,7 +526,16 @@ public async Task TestCpuAndMemoryChecks_WithMetrics(
522526
};
523527

524528
var options = Microsoft.Extensions.Options.Options.Create(checkOptions);
525-
using var healthCheck = new ResourceUtilizationHealthCheck(options, dataTracker.Object);
529+
#if !NETFRAMEWORK
530+
using var healthCheck = new ResourceUtilizationHealthCheck(
531+
options,
532+
dataTracker.Object,
533+
Microsoft.Extensions.Options.Options.Create(new ResourceMonitoringOptions()));
534+
#else
535+
using var healthCheck = new ResourceUtilizationHealthCheck(
536+
options,
537+
dataTracker.Object);
538+
#endif
526539

527540
// Act
528541
fakeClock.Advance(TimeSpan.FromMilliseconds(1));

test/Libraries/Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization.Tests/ResourceHealthCheckTests.cs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,16 @@ public async Task TestCpuAndMemoryChecks(HealthStatus expected, double utilizati
3333
};
3434

3535
var options = Microsoft.Extensions.Options.Options.Create(checkOptions);
36-
using var healthCheck = new ResourceUtilizationHealthCheck(options, dataTracker.Object);
36+
#if !NETFRAMEWORK
37+
using var healthCheck = new ResourceUtilizationHealthCheck(
38+
options,
39+
dataTracker.Object,
40+
Microsoft.Extensions.Options.Options.Create(new ResourceMonitoringOptions()));
41+
#else
42+
using var healthCheck = new ResourceUtilizationHealthCheck(
43+
options,
44+
dataTracker.Object);
45+
#endif
3746
var healthCheckResult = await healthCheck.CheckHealthAsync(checkContext);
3847
Assert.Equal(expected, healthCheckResult.Status);
3948
Assert.NotEmpty(healthCheckResult.Data);
@@ -43,9 +52,22 @@ public async Task TestCpuAndMemoryChecks(HealthStatus expected, double utilizati
4352
}
4453
}
4554

55+
#if !NETFRAMEWORK
4656
[Fact]
4757
public void TestNullChecks()
4858
{
49-
Assert.Throws<ArgumentException>(() => new ResourceUtilizationHealthCheck(Mock.Of<IOptions<ResourceUtilizationHealthCheckOptions>>(), null!));
59+
Assert.Throws<ArgumentException>(() => new ResourceUtilizationHealthCheck(
60+
Mock.Of<IOptions<ResourceUtilizationHealthCheckOptions>>(),
61+
null!,
62+
Mock.Of<IOptions<ResourceMonitoringOptions>>()));
5063
}
64+
#else
65+
[Fact]
66+
public void TestNullChecks()
67+
{
68+
Assert.Throws<ArgumentException>(() => new ResourceUtilizationHealthCheck(
69+
Mock.Of<IOptions<ResourceUtilizationHealthCheckOptions>>(),
70+
null!));
71+
}
72+
#endif
5173
}

test/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests/ResourceMonitoringExtensionsTests.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public void Throw_Null_When_Registration_Ingredients_Null()
3131
}
3232

3333
[ConditionalFact]
34-
public void AddResourceUtilization_AddsResourceMonitoringService_ToServicesCollection()
34+
public void AddsResourceMonitoringService_ToServicesCollection()
3535
{
3636
using var provider = new ServiceCollection()
3737
.AddLogging()
@@ -51,7 +51,7 @@ public void AddResourceUtilization_AddsResourceMonitoringService_ToServicesColle
5151
}
5252

5353
[ConditionalFact]
54-
public void AddResourceUtilization_AddsResourceMonitoringService_ToServicesCollection_NoArgs()
54+
public void AddsResourceMonitoringService_ToServicesCollection_NoArgs()
5555
{
5656
using var provider = new ServiceCollection()
5757
.AddLogging()
@@ -67,7 +67,7 @@ public void AddResourceUtilization_AddsResourceMonitoringService_ToServicesColle
6767
}
6868

6969
[ConditionalFact]
70-
public void AddResourceUtilization_AddsResourceMonitoringService_AsHostedService()
70+
public void AddsResourceMonitoringService_AsHostedService()
7171
{
7272
using var provider = new ServiceCollection()
7373
.AddLogging()
@@ -114,7 +114,7 @@ public void ConfigureResourceUtilization_InitializeTrackerProperly()
114114
}
115115

116116
[ConditionalFact]
117-
public void ConfigureTracker_GivenOptionsDelegate_InitializeTrackerWithOptionsProperly()
117+
public void ConfigureMonitor_GivenOptionsDelegate_InitializeTrackerWithOptionsProperly()
118118
{
119119
const int SamplingWindowValue = 3;
120120
const int CalculationPeriodValue = 2;
@@ -142,7 +142,7 @@ public void ConfigureTracker_GivenOptionsDelegate_InitializeTrackerWithOptionsPr
142142
}
143143

144144
[ConditionalFact]
145-
public void ConfigureTracker_GivenIConfigurationSection_InitializeTrackerWithOptionsProperly()
145+
public void ConfigureMonitor_GivenIConfigurationSection_InitializeTrackerWithOptionsProperly()
146146
{
147147
const int SamplingWindowValue = 3;
148148
const int CalculationPeriod = 2;

0 commit comments

Comments
 (0)