diff --git a/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/README.md b/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/README.md index ae20ab0297e..41f91b7df44 100644 --- a/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/README.md +++ b/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/README.md @@ -1,6 +1,10 @@ # Microsoft.Extensions.Diagnostics.ResourceMonitoring -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. +Measures and reports processor and memory usage. To monitor system resources, this library: + +- Utilizes control groups (cgroups) in Linux. Both cgroups v1 and v2 are supported. +- Utilized Job Objects in Windows. +- Mac OS is not supported. ## Install the package diff --git a/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/ResourceMonitoringServiceCollectionExtensions.cs b/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/ResourceMonitoringServiceCollectionExtensions.cs index 541984db78d..c368e2bff91 100644 --- a/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/ResourceMonitoringServiceCollectionExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/ResourceMonitoringServiceCollectionExtensions.cs @@ -60,19 +60,21 @@ public static IServiceCollection AddResourceMonitoring( return services.AddResourceMonitoringInternal(configure); } - // can't easily test the exception throwing case - [ExcludeFromCodeCoverage] private static IServiceCollection AddResourceMonitoringInternal( this IServiceCollection services, Action configure) { - var builder = new ResourceMonitorBuilder(services); - _ = services.AddMetrics(); - + var builder = new ResourceMonitorBuilder(services); #if NETFRAMEWORK _ = builder.AddWindowsProvider(); #else + bool isSupportedOs = OperatingSystem.IsWindows() || OperatingSystem.IsLinux(); + if (!isSupportedOs) + { + return services; + } + if (OperatingSystem.IsWindows()) { _ = builder.AddWindowsProvider(); @@ -81,10 +83,6 @@ private static IServiceCollection AddResourceMonitoringInternal( { _ = builder.AddLinuxProvider(); } - else - { - throw new PlatformNotSupportedException(); - } #endif configure.Invoke(builder); diff --git a/test/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests/ResourceMonitoringExtensionsTests.cs b/test/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests/ResourceMonitoringExtensionsTests.cs index 995afb65c62..875fbb67158 100644 --- a/test/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests/ResourceMonitoringExtensionsTests.cs +++ b/test/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests/ResourceMonitoringExtensionsTests.cs @@ -16,9 +16,9 @@ namespace Microsoft.Extensions.Diagnostics.ResourceMonitoring.Test; -[OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")] public sealed class ResourceMonitoringExtensionsTests { + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")] [ConditionalFact] public void Throw_Null_When_Registration_Ingredients_Null() { @@ -30,6 +30,7 @@ public void Throw_Null_When_Registration_Ingredients_Null() Assert.Throws(() => services.AddResourceMonitoring((b) => b.ConfigureMonitor((Action)null!))); } + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")] [ConditionalFact] public void AddsResourceMonitoringService_ToServicesCollection() { @@ -50,6 +51,7 @@ public void AddsResourceMonitoringService_ToServicesCollection() Assert.IsAssignableFrom(trackerService); } + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")] [ConditionalFact] public void AddsResourceMonitoringService_ToServicesCollection_NoArgs() { @@ -66,6 +68,7 @@ public void AddsResourceMonitoringService_ToServicesCollection_NoArgs() Assert.IsAssignableFrom(trackerService); } + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")] [ConditionalFact] public void AddsResourceMonitoringService_AsHostedService() { @@ -87,6 +90,7 @@ public void AddsResourceMonitoringService_AsHostedService() Assert.IsAssignableFrom(trackerService); } + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")] [ConditionalFact] public void ConfigureResourceUtilization_InitializeTrackerProperly() { @@ -113,6 +117,7 @@ public void ConfigureResourceUtilization_InitializeTrackerProperly() Assert.NotNull(publisher); } + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")] [ConditionalFact] public void ConfigureMonitor_GivenOptionsDelegate_InitializeTrackerWithOptionsProperly() { @@ -141,6 +146,7 @@ public void ConfigureMonitor_GivenOptionsDelegate_InitializeTrackerWithOptionsPr Assert.Equal(TimeSpan.FromSeconds(CalculationPeriodValue), options!.Value.PublishingWindow); } + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")] [ConditionalFact] public void ConfigureMonitor_GivenIConfigurationSection_InitializeTrackerWithOptionsProperly() { @@ -182,6 +188,7 @@ public void ConfigureMonitor_GivenIConfigurationSection_InitializeTrackerWithOpt Assert.Equal(TimeSpan.FromSeconds(CalculationPeriod), options!.Value.PublishingWindow); } + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")] [ConditionalFact] public void Registering_Resource_Utilization_Adds_Only_One_Object_Of_Type_ResourceUtilizationService_To_DI_Container() { @@ -204,4 +211,46 @@ public void Registering_Resource_Utilization_Adds_Only_One_Object_Of_Type_Resour Assert.IsAssignableFrom(background); Assert.Same(tracker as ResourceMonitorService, background as ResourceMonitorService); } + + [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.Windows, SkipReason = "For MacOs only.")] + [ConditionalFact] + public void AddResourceMonitoringInternal_WhenMacOs_ReturnsSameServiceCollection() + { + var services = new ServiceCollection(); + + // Act + IServiceCollection result = services.AddResourceMonitoring(); + + // Assert + Assert.Same(services, result); + Assert.DoesNotContain(services, s => s.ServiceType == typeof(ISnapshotProvider)); + } + + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")] + [ConditionalFact] + public void AddResourceMonitoring_AddsISnapshotProvider() + { + var services = new ServiceCollection(); + + // Act + IServiceCollection result = services.AddResourceMonitoring(); + + // Assert + Assert.Same(services, result); + Assert.Contains(services, s => s.ServiceType == typeof(ISnapshotProvider)); + } + + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Not supported on MacOs.")] + [ConditionalFact] + public void AddResourceMonitoringInternal_CallsConfigureDelegate() + { + var services = new ServiceCollection(); + bool delegateCalled = false; + + // Act + services.AddResourceMonitoring(_ => delegateCalled = true); + + // Assert + Assert.True(delegateCalled); + } } diff --git a/test/TestUtilities/XUnit/OSSkipConditionAttribute.cs b/test/TestUtilities/XUnit/OSSkipConditionAttribute.cs index 143cd7005ad..586b53d3fcb 100644 --- a/test/TestUtilities/XUnit/OSSkipConditionAttribute.cs +++ b/test/TestUtilities/XUnit/OSSkipConditionAttribute.cs @@ -60,7 +60,7 @@ private static OperatingSystems GetCurrentOS() throw new PlatformNotSupportedException(); #else - // RuntimeInformation API is only avaialble in .NET Framework 4.7.1+ + // RuntimeInformation API is only available in .NET Framework 4.7.1+ // .NET Framework 4.7 and below can only run on Windows. return OperatingSystems.Windows; #endif