Skip to content

Commit 8148872

Browse files
authored
#5962 Change to early return of OS instead of throwing (#5963)
1 parent 9b94d9d commit 8148872

File tree

4 files changed

+63
-12
lines changed

4 files changed

+63
-12
lines changed

src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# Microsoft.Extensions.Diagnostics.ResourceMonitoring
22

3-
Measures and reports processor and memory usage. This library utilizes control groups (cgroups) in Linux to monitor system resources. Both cgroups v1 and v2 are supported.
3+
Measures and reports processor and memory usage. To monitor system resources, this library:
4+
5+
- Utilizes control groups (cgroups) in Linux. Both cgroups v1 and v2 are supported.
6+
- Utilized Job Objects in Windows.
7+
- Mac OS is not supported.
48

59
## Install the package
610

src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/ResourceMonitoringServiceCollectionExtensions.cs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,19 +60,21 @@ public static IServiceCollection AddResourceMonitoring(
6060
return services.AddResourceMonitoringInternal(configure);
6161
}
6262

63-
// can't easily test the exception throwing case
64-
[ExcludeFromCodeCoverage]
6563
private static IServiceCollection AddResourceMonitoringInternal(
6664
this IServiceCollection services,
6765
Action<IResourceMonitorBuilder> configure)
6866
{
69-
var builder = new ResourceMonitorBuilder(services);
70-
7167
_ = services.AddMetrics();
72-
68+
var builder = new ResourceMonitorBuilder(services);
7369
#if NETFRAMEWORK
7470
_ = builder.AddWindowsProvider();
7571
#else
72+
bool isSupportedOs = OperatingSystem.IsWindows() || OperatingSystem.IsLinux();
73+
if (!isSupportedOs)
74+
{
75+
return services;
76+
}
77+
7678
if (OperatingSystem.IsWindows())
7779
{
7880
_ = builder.AddWindowsProvider();
@@ -81,10 +83,6 @@ private static IServiceCollection AddResourceMonitoringInternal(
8183
{
8284
_ = builder.AddLinuxProvider();
8385
}
84-
else
85-
{
86-
throw new PlatformNotSupportedException();
87-
}
8886
#endif
8987

9088
configure.Invoke(builder);

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

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616

1717
namespace Microsoft.Extensions.Diagnostics.ResourceMonitoring.Test;
1818

19-
[OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")]
2019
public sealed class ResourceMonitoringExtensionsTests
2120
{
21+
[OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")]
2222
[ConditionalFact]
2323
public void Throw_Null_When_Registration_Ingredients_Null()
2424
{
@@ -30,6 +30,7 @@ public void Throw_Null_When_Registration_Ingredients_Null()
3030
Assert.Throws<ArgumentNullException>(() => services.AddResourceMonitoring((b) => b.ConfigureMonitor((Action<ResourceMonitoringOptions>)null!)));
3131
}
3232

33+
[OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")]
3334
[ConditionalFact]
3435
public void AddsResourceMonitoringService_ToServicesCollection()
3536
{
@@ -50,6 +51,7 @@ public void AddsResourceMonitoringService_ToServicesCollection()
5051
Assert.IsAssignableFrom<IResourceMonitor>(trackerService);
5152
}
5253

54+
[OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")]
5355
[ConditionalFact]
5456
public void AddsResourceMonitoringService_ToServicesCollection_NoArgs()
5557
{
@@ -66,6 +68,7 @@ public void AddsResourceMonitoringService_ToServicesCollection_NoArgs()
6668
Assert.IsAssignableFrom<IResourceMonitor>(trackerService);
6769
}
6870

71+
[OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")]
6972
[ConditionalFact]
7073
public void AddsResourceMonitoringService_AsHostedService()
7174
{
@@ -87,6 +90,7 @@ public void AddsResourceMonitoringService_AsHostedService()
8790
Assert.IsAssignableFrom<IResourceMonitor>(trackerService);
8891
}
8992

93+
[OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")]
9094
[ConditionalFact]
9195
public void ConfigureResourceUtilization_InitializeTrackerProperly()
9296
{
@@ -113,6 +117,7 @@ public void ConfigureResourceUtilization_InitializeTrackerProperly()
113117
Assert.NotNull(publisher);
114118
}
115119

120+
[OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")]
116121
[ConditionalFact]
117122
public void ConfigureMonitor_GivenOptionsDelegate_InitializeTrackerWithOptionsProperly()
118123
{
@@ -141,6 +146,7 @@ public void ConfigureMonitor_GivenOptionsDelegate_InitializeTrackerWithOptionsPr
141146
Assert.Equal(TimeSpan.FromSeconds(CalculationPeriodValue), options!.Value.PublishingWindow);
142147
}
143148

149+
[OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")]
144150
[ConditionalFact]
145151
public void ConfigureMonitor_GivenIConfigurationSection_InitializeTrackerWithOptionsProperly()
146152
{
@@ -182,6 +188,7 @@ public void ConfigureMonitor_GivenIConfigurationSection_InitializeTrackerWithOpt
182188
Assert.Equal(TimeSpan.FromSeconds(CalculationPeriod), options!.Value.PublishingWindow);
183189
}
184190

191+
[OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")]
185192
[ConditionalFact]
186193
public void Registering_Resource_Utilization_Adds_Only_One_Object_Of_Type_ResourceUtilizationService_To_DI_Container()
187194
{
@@ -204,4 +211,46 @@ public void Registering_Resource_Utilization_Adds_Only_One_Object_Of_Type_Resour
204211
Assert.IsAssignableFrom<ResourceMonitorService>(background);
205212
Assert.Same(tracker as ResourceMonitorService, background as ResourceMonitorService);
206213
}
214+
215+
[OSSkipCondition(OperatingSystems.Linux | OperatingSystems.Windows, SkipReason = "For MacOs only.")]
216+
[ConditionalFact]
217+
public void AddResourceMonitoringInternal_WhenMacOs_ReturnsSameServiceCollection()
218+
{
219+
var services = new ServiceCollection();
220+
221+
// Act
222+
IServiceCollection result = services.AddResourceMonitoring();
223+
224+
// Assert
225+
Assert.Same(services, result);
226+
Assert.DoesNotContain(services, s => s.ServiceType == typeof(ISnapshotProvider));
227+
}
228+
229+
[OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")]
230+
[ConditionalFact]
231+
public void AddResourceMonitoring_AddsISnapshotProvider()
232+
{
233+
var services = new ServiceCollection();
234+
235+
// Act
236+
IServiceCollection result = services.AddResourceMonitoring();
237+
238+
// Assert
239+
Assert.Same(services, result);
240+
Assert.Contains(services, s => s.ServiceType == typeof(ISnapshotProvider));
241+
}
242+
243+
[OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")]
244+
[ConditionalFact]
245+
public void AddResourceMonitoringInternal_CallsConfigureDelegate()
246+
{
247+
var services = new ServiceCollection();
248+
bool delegateCalled = false;
249+
250+
// Act
251+
services.AddResourceMonitoring(_ => delegateCalled = true);
252+
253+
// Assert
254+
Assert.True(delegateCalled);
255+
}
207256
}

test/TestUtilities/XUnit/OSSkipConditionAttribute.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ private static OperatingSystems GetCurrentOS()
6060

6161
throw new PlatformNotSupportedException();
6262
#else
63-
// RuntimeInformation API is only avaialble in .NET Framework 4.7.1+
63+
// RuntimeInformation API is only available in .NET Framework 4.7.1+
6464
// .NET Framework 4.7 and below can only run on Windows.
6565
return OperatingSystems.Windows;
6666
#endif

0 commit comments

Comments
 (0)