Skip to content

Commit

Permalink
Update to latest
Browse files Browse the repository at this point in the history
  • Loading branch information
Martin Taillefer committed May 29, 2023
1 parent 876e85a commit f4d059c
Show file tree
Hide file tree
Showing 32 changed files with 624 additions and 248 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@ internal sealed class ResourceUtilizationHealthCheck : IHealthCheck
{
private static readonly Task<HealthCheckResult> _healthy = Task.FromResult(HealthCheckResult.Healthy());
private readonly ResourceUtilizationHealthCheckOptions _options;
private readonly IResourceUtilizationTracker _dataTracker;
private readonly IResourceMonitor _dataTracker;

/// <summary>
/// Initializes a new instance of the <see cref="ResourceUtilizationHealthCheck"/> class.
/// </summary>
/// <param name="options">The options.</param>
/// <param name="dataTracker">The datatracker.</param>
public ResourceUtilizationHealthCheck(IOptions<ResourceUtilizationHealthCheckOptions> options,
IResourceUtilizationTracker dataTracker)
IResourceMonitor dataTracker)
{
_options = Throw.IfMemberNull(options, options.Value);
_dataTracker = Throw.IfNull(dataTracker);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public class ResourceUtilizationHealthCheckOptions
/// </summary>
/// <remarks>
/// The thresholds are periodically compared against the utilization samples provided by
/// the registered <see cref="IResourceUtilizationTracker"/>.
/// the registered <see cref="IResourceMonitor"/>.
/// </remarks>
[ValidateObjectMembers]
public ResourceUsageThresholds CpuThresholds { get; set; } = new ResourceUsageThresholds();
Expand All @@ -31,7 +31,7 @@ public class ResourceUtilizationHealthCheckOptions
/// </summary>
/// <remarks>
/// The thresholds are periodically compared against the utilization samples provided by
/// the registered <see cref="IResourceUtilizationTracker"/>.
/// the registered <see cref="IResourceMonitor"/>.
/// </remarks>
[ValidateObjectMembers]
public ResourceUsageThresholds MemoryThresholds { get; set; } = new ResourceUsageThresholds();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace Microsoft.Extensions.Diagnostics.ResourceMonitoring;
/// <summary>
/// Provides the ability to sample the system for current resource utilization.
/// </summary>
public interface IResourceUtilizationTracker
public interface IResourceMonitor
{
/// <summary>
/// Gets utilization for the specified time window.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace Microsoft.Extensions.Diagnostics.ResourceMonitoring;
/// <summary>
/// Helps building resource monitoring infra.
/// </summary>
public interface IResourceUtilizationTrackerBuilder
public interface IResourceMonitorBuilder
{
/// <summary>
/// Gets the service collection being manipulated by the builder.
Expand All @@ -19,7 +19,7 @@ public interface IResourceUtilizationTrackerBuilder
/// Adds implementation of the utilization data publisher.
/// </summary>
/// <typeparam name="T">An implementation of <see cref="IResourceUtilizationPublisher"/> that is used by the tracker to publish <see cref="Utilization"/> to 3rd parties.</typeparam>
/// <returns>Instance of <see cref="IResourceUtilizationTrackerBuilder"/> for further configurations.</returns>
IResourceUtilizationTrackerBuilder AddPublisher<T>()
/// <returns>Instance of <see cref="IResourceMonitorBuilder"/> for further configurations.</returns>
IResourceMonitorBuilder AddPublisher<T>()
where T : class, IResourceUtilizationPublisher;
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,20 @@

namespace Microsoft.Extensions.Diagnostics.ResourceMonitoring.Internal;

internal sealed class ResourceUtilizationBuilder : IResourceUtilizationTrackerBuilder
internal sealed class ResourceUtilizationBuilder : IResourceMonitorBuilder
{
public IServiceCollection Services { get; }

public ResourceUtilizationBuilder(IServiceCollection services)
{
services.TryAddSingleton<ResourceUtilizationTrackerService>();
services.TryAddEnumerable(ServiceDescriptor.Singleton<IHostedService, ResourceUtilizationTrackerService>(static sp => sp.GetRequiredService<ResourceUtilizationTrackerService>()));
services.TryAddSingleton<IResourceUtilizationTracker>(static sp => sp.GetRequiredService<ResourceUtilizationTrackerService>());
services.TryAddSingleton<IResourceMonitor>(static sp => sp.GetRequiredService<ResourceUtilizationTrackerService>());

Services = services;
}

public IResourceUtilizationTrackerBuilder AddPublisher<T>()
public IResourceMonitorBuilder AddPublisher<T>()
where T : class, IResourceUtilizationPublisher
{
Services.TryAddEnumerable(ServiceDescriptor.Singleton<IResourceUtilizationPublisher, T>());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

namespace Microsoft.Extensions.Diagnostics.ResourceMonitoring.Internal;

internal sealed class ResourceUtilizationTrackerOptionsManualValidator : IValidateOptions<ResourceUtilizationTrackerOptions>
internal sealed class ResourceUtilizationTrackerOptionsManualValidator : IValidateOptions<ResourceMonitoringOptions>
{
public ValidateOptionsResult Validate(string? name, ResourceUtilizationTrackerOptions options)
public ValidateOptionsResult Validate(string? name, ResourceMonitoringOptions options)
{
var builder = new ValidateOptionsResultBuilder();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@
namespace Microsoft.Extensions.Diagnostics.ResourceMonitoring;

[OptionsValidator]
internal sealed partial class ResourceUtilizationTrackerOptionsValidator : IValidateOptions<ResourceUtilizationTrackerOptions>
internal sealed partial class ResourceUtilizationTrackerOptionsValidator : IValidateOptions<ResourceMonitoringOptions>
{
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,17 @@
using Microsoft.Extensions.Options;
using Microsoft.Shared.Diagnostics;

namespace Microsoft.Extensions.Diagnostics.ResourceMonitoring;
namespace Microsoft.Extensions.Diagnostics.ResourceMonitoring.Internal;

/// <summary>
/// The implementation of <see cref="IResourceUtilizationTracker"/> that computes average resource utilization over a configured period of time.
/// The implementation of <see cref="IResourceMonitor"/> that computes average resource utilization over a configured period of time.
/// </summary>
/// <remarks>
/// The class also acts as a hosted singleton, intended to be used to manage the
/// background process of periodically inspecting and monitoring the utilization
/// of an enclosing system.
/// </remarks>
internal sealed class ResourceUtilizationTrackerService : BackgroundService, IResourceUtilizationTracker
internal sealed class ResourceUtilizationTrackerService : BackgroundService, IResourceMonitor
{
/// <summary>
/// The data source.
Expand Down Expand Up @@ -57,7 +57,7 @@ internal sealed class ResourceUtilizationTrackerService : BackgroundService, IRe
public ResourceUtilizationTrackerService(
ISnapshotProvider provider,
ILogger<ResourceUtilizationTrackerService> logger,
IOptions<ResourceUtilizationTrackerOptions> options,
IOptions<ResourceMonitoringOptions> options,
IEnumerable<IResourceUtilizationPublisher> publishers)
: this(provider, logger, options, publishers, TimeProvider.System)
{
Expand All @@ -66,7 +66,7 @@ public ResourceUtilizationTrackerService(
internal ResourceUtilizationTrackerService(
ISnapshotProvider provider,
ILogger<ResourceUtilizationTrackerService> logger,
IOptions<ResourceUtilizationTrackerOptions> options,
IOptions<ResourceMonitoringOptions> options,
IEnumerable<IResourceUtilizationPublisher> publishers,
TimeProvider timeProvider)
{
Expand Down Expand Up @@ -103,9 +103,14 @@ public Utilization GetUtilization(TimeSpan window)
_ = Throw.IfGreaterThan(window.Ticks, _collectionWindow.Ticks);

var samplesToRead = (int)(window.Ticks / _samplingInterval.Ticks) + 1;
var (firstElement, lastElement) = _snapshotsStore.GetFirstAndLastFromWindow(samplesToRead);
(ResourceUtilizationSnapshot first, ResourceUtilizationSnapshot last) t;

return Calculator.CalculateUtilization(firstElement, lastElement, _provider.Resources);
lock (_snapshotsStore)
{
t = _snapshotsStore.GetFirstAndLastFromWindow(samplesToRead);
}

return Calculator.CalculateUtilization(t.first, t.last, _provider.Resources);
}

/// <inheritdoc/>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.InteropServices;

Expand All @@ -22,7 +23,17 @@ internal sealed class UserHz : IUserHz
{
private const int SystemConfigurationUserHz = 2;

public long Value { get; } = NativeMethods.sysconf(SystemConfigurationUserHz);
public UserHz(IOperatingSystem os)
{
if (!os.IsLinux)
{
throw new NotSupportedException($"Method 'AddLinuxProvider' was used on '{Environment.OSVersion.Platform}' while it was expected to run on Linux.");
}

Value = NativeMethods.sysconf(SystemConfigurationUserHz);
}

public long Value { get; }

#if !NET7_0_OR_GREATER
private static class NativeMethods
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
namespace Microsoft.Extensions.Diagnostics.ResourceMonitoring;

/// <summary>
/// Extensions for adding Linux Resource Utilization providers.
/// Extensions for adding the Linux resource utilization provider.
/// </summary>
public static class LinuxUtilizationExtensions
{
Expand All @@ -23,7 +23,7 @@ public static class LinuxUtilizationExtensions
/// <param name="builder">The tracker builder instance used to add the provider.</param>
/// <returns>Returns the input tracker builder for call chaining.</returns>
/// <exception cref="ArgumentNullException"><paramref name="builder"/> is <see langword="null" />.</exception>
public static IResourceUtilizationTrackerBuilder AddLinuxProvider(this IResourceUtilizationTrackerBuilder builder)
public static IResourceMonitorBuilder AddLinuxProvider(this IResourceMonitorBuilder builder)
{
_ = Throw.IfNull(builder);

Expand All @@ -50,7 +50,7 @@ public static IResourceUtilizationTrackerBuilder AddLinuxProvider(this IResource
/// <remarks>
/// <seealso cref="System.Diagnostics.Metrics.Instrument"/>.
/// </remarks>
public static IResourceUtilizationTrackerBuilder AddLinuxProvider(this IResourceUtilizationTrackerBuilder builder, IConfigurationSection section)
public static IResourceMonitorBuilder AddLinuxProvider(this IResourceMonitorBuilder builder, IConfigurationSection section)
{
_ = Throw.IfNull(builder);
_ = Throw.IfNull(section);
Expand All @@ -67,7 +67,7 @@ public static IResourceUtilizationTrackerBuilder AddLinuxProvider(this IResource
/// <param name="configure">The delegate for configuring of <see cref="LinuxResourceUtilizationProviderOptions"/>.</param>
/// <returns>Returns the builder.</returns>
/// <exception cref="ArgumentNullException"><paramref name="builder"/> or <paramref name="configure"/> is <see langword="null" />.</exception>
public static IResourceUtilizationTrackerBuilder AddLinuxProvider(this IResourceUtilizationTrackerBuilder builder, Action<LinuxResourceUtilizationProviderOptions> configure)
public static IResourceMonitorBuilder AddLinuxProvider(this IResourceMonitorBuilder builder, Action<LinuxResourceUtilizationProviderOptions> configure)
{
_ = Throw.IfNull(builder);
_ = Throw.IfNull(configure);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@

<ItemGroup>
<InternalsVisibleToDynamicProxyGenAssembly2 Include="*" />
<InternalsVisibleToDynamicProxyGenAssembly2 Remove="IResourceMonitor.cs" />
<InternalsVisibleToDynamicProxyGenAssembly2 Remove="IResourceMonitorBuilder.cs" />
<InternalsVisibleToDynamicProxyGenAssembly2 Remove="ResourceMonitoringOptions.cs" />
<InternalsVisibleToTest Include="$(AssemblyName).Tests" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -100,23 +100,25 @@
]
},
{
"Type": "static class Microsoft.Extensions.Diagnostics.ResourceMonitoring.ResourceMonitoringExtensions",
"Type": "static class Microsoft.Extensions.Diagnostics.ResourceMonitoring.NullUtilizationExtensions",
"Stage": "Stable",
"Methods": [
{
"Member": "static Microsoft.Extensions.DependencyInjection.IServiceCollection Microsoft.Extensions.Diagnostics.ResourceMonitoring.ResourceMonitoringExtensions.AddNullResourceUtilization(this Microsoft.Extensions.DependencyInjection.IServiceCollection services);",
"Stage": "Stable"
},
{
"Member": "static Microsoft.Extensions.Diagnostics.ResourceMonitoring.IResourceUtilizationTrackerBuilder Microsoft.Extensions.Diagnostics.ResourceMonitoring.ResourceMonitoringExtensions.AddNullResourceUtilizationProvider(this Microsoft.Extensions.Diagnostics.ResourceMonitoring.IResourceUtilizationTrackerBuilder builder);",
"Member": "static Microsoft.Extensions.Diagnostics.ResourceMonitoring.IResourceUtilizationTrackerBuilder Microsoft.Extensions.Diagnostics.ResourceMonitoring.NullUtilizationExtensions.AddNullResourceUtilizationProvider(this Microsoft.Extensions.Diagnostics.ResourceMonitoring.IResourceUtilizationTrackerBuilder builder);",
"Stage": "Stable"
},
}
]
},
{
"Type": "static class Microsoft.Extensions.Diagnostics.ResourceMonitoring.ResourceMonitoringExtensions",
"Stage": "Stable",
"Methods": [
{
"Member": "static Microsoft.Extensions.DependencyInjection.IServiceCollection Microsoft.Extensions.Diagnostics.ResourceMonitoring.ResourceMonitoringExtensions.AddResourceUtilization(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Microsoft.Extensions.Diagnostics.ResourceMonitoring.IResourceUtilizationTrackerBuilder> configure);",
"Member": "static Microsoft.Extensions.DependencyInjection.IServiceCollection Microsoft.Extensions.Diagnostics.ResourceMonitoring.ResourceMonitoringExtensions.AddResourceMonitoring(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Microsoft.Extensions.Diagnostics.ResourceMonitoring.IResourceUtilizationTrackerBuilder> configure);",
"Stage": "Stable"
},
{
"Member": "static Microsoft.Extensions.Hosting.IHostBuilder Microsoft.Extensions.Diagnostics.ResourceMonitoring.ResourceMonitoringExtensions.ConfigureResourceUtilization(this Microsoft.Extensions.Hosting.IHostBuilder builder, System.Action<Microsoft.Extensions.Diagnostics.ResourceMonitoring.IResourceUtilizationTrackerBuilder> configure);",
"Member": "static Microsoft.Extensions.Hosting.IHostBuilder Microsoft.Extensions.Diagnostics.ResourceMonitoring.ResourceMonitoringExtensions.ConfigureResourceMonitoring(this Microsoft.Extensions.Hosting.IHostBuilder builder, System.Action<Microsoft.Extensions.Diagnostics.ResourceMonitoring.IResourceUtilizationTrackerBuilder> configure);",
"Stage": "Stable"
},
{
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.ResourceMonitoring.Internal;
using Microsoft.Shared.Diagnostics;

namespace Microsoft.Extensions.Diagnostics.ResourceMonitoring;

/// <summary>
/// Extensions for adding the null resource utilization provider.
/// </summary>
public static class NullUtilizationExtensions
{
/// <summary>
/// Adds a platform independent and non-operational provider to the service collection.
/// </summary>
/// <param name="builder">The builder instance used to configure the tracker.</param>
/// <returns>The value of <paramref name="builder"/>.</returns>
/// <remarks>This extension method will add a non-operational provider that generates fixed CPU and Memory information. Don't use this in
/// production, but you can use it in development environment when you're uncertain about the underlying platform and don't need real data
/// to be generated.</remarks>
/// <exception cref="ArgumentNullException">If <paramref name="builder"/> is <see langword="null" />.</exception>
public static IResourceMonitorBuilder AddNullProvider(this IResourceMonitorBuilder builder)
{
_ = Throw.IfNull(builder);

_ = builder.Services.AddSingleton<ISnapshotProvider, NullSnapshotProvider>();
return builder;
}
}
Loading

0 comments on commit f4d059c

Please sign in to comment.