Resourcebewaking
Resourcebewaking omvat de continue meting van het resourcegebruik gedurende een opgegeven periode. Het NuGet-pakket Microsoft.Extensions.Diagnostics.ResourceMonitoring biedt een verzameling API's die zijn afgestemd op het bewaken van het resourcegebruik van uw .NET-toepassingen.
De IResourceMonitor interface levert methoden voor het ophalen van realtime informatie over het gebruik van procesresources. Deze interface ondersteunt het ophalen van gegevens met betrekking tot CPU- en geheugengebruik en is momenteel compatibel met zowel Windows- als Linux-platforms. Alle diagnostische gegevens voor resourcebewaking worden standaard gepubliceerd naar OpenTelemetry, dus u hoeft deze zelf niet handmatig te publiceren.
Daarnaast rapporteert de bibliotheek voor resourcebewaking verschillende diagnostische metrische gegevens. Zie Diagnostische metrische gegevens voor meer informatie: Microsoft.Extensions.Diagnostics.ResourceMonitoring
.
Voorbeeld van resourcebewaking
In het volgende voorbeeld ziet u hoe u de IResourceMonitor
interface gebruikt om informatie over het CPU- en geheugengebruik van het huidige proces op te halen.
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.ResourceMonitoring;
using Microsoft.Extensions.Logging;
using Spectre.Console;
var services = new ServiceCollection()
.AddLogging(static builder => builder.AddConsole())
.AddResourceMonitoring();
var provider = services.BuildServiceProvider();
var monitor = provider.GetRequiredService<IResourceMonitor>();
Met de voorgaande code wordt:
- Instantieert een nieuw ServiceCollection exemplaar, waarbij aanroepen naar de AddLogging en AddResourceMonitoring extensiemethoden worden gekoppeld.
- Hiermee wordt een nieuw ServiceProvider exemplaar van het
ServiceCollection
exemplaar gebouwd. - Hiermee haalt u een exemplaar van de IResourceMonitor interface van het
ServiceProvider
exemplaar op.
Belangrijk
Bij Microsoft.Extensions.Diagnostics.ResourceMonitoring het pakket wordt ervan uitgegaan dat de consument logboekregistratieproviders registreert bij het Microsoft.Extensions.Logging
pakket. Als u geen logboekregistratie registreert, genereert de aanroep een AddResourceMonitoring
uitzondering. Bovendien kunt u interne bibliotheeklogboekregistratie inschakelen door het Debug
logboekniveau voor de Microsoft.Extensions.Diagnostics.ResourceMonitoring
categorie te configureren volgens de handleiding.
Op dit moment vraagt u met de IResourceMonitor
implementatie om resourcegebruik met de IResourceMonitor.GetUtilization methode. De GetUtilization
methode retourneert een ResourceUtilization exemplaar dat de volgende informatie bevat:
- ResourceUtilization.CpuUsedPercentage: CPU-gebruik als percentage.
- ResourceUtilization.MemoryUsedPercentage: Geheugengebruik als percentage.
- ResourceUtilization.MemoryUsedInBytes: geheugengebruik in bytes.
- ResourceUtilization.SystemResources: Systeembronnen.
- SystemResources.GuaranteedMemoryInBytes: Gegarandeerd geheugen in bytes.
- SystemResources.MaximumMemoryInBytes: Maximaal geheugen in bytes.
- SystemResources.GuaranteedCpuUnits: Gegarandeerde CPU in eenheden.
- SystemResources.MaximumCpuUnits: Maximale CPU in eenheden.
Resourcebewaking uitbreiden met Spectre.Console
Als u dit voorbeeld uitbreidt, kunt u gebruikmaken van Spectre.Console, een goed beschouwde .NET-bibliotheek die is ontworpen om de ontwikkeling van visueel aantrekkelijke, platformoverschrijdende consoletoepassingen te vereenvoudigen. Met Spectre kunt u resourcegebruiksgegevens in tabelvorm presenteren. De volgende code illustreert het gebruik van de IResourceMonitor
interface voor toegang tot details met betrekking tot het CPU- en geheugengebruik van het huidige proces en presenteert deze gegevens vervolgens in een tabel:
await StartMonitoringAsync(monitor, token);
async Task StartMonitoringAsync(IResourceMonitor monitor, CancellationToken cancellationToken)
{
var table = new Table()
.Centered()
.Title("Resource Monitoring", new Style(foreground: Color.Purple, decoration: Decoration.Bold))
.Caption("Updates every three seconds. *GTD: Guaranteed ", new Style(decoration: Decoration.Dim))
.RoundedBorder()
.BorderColor(Color.Cyan1)
.AddColumns(
[
new TableColumn("Time").Centered(),
new TableColumn("CPU %").Centered(),
new TableColumn("Memory %").Centered(),
new TableColumn("Memory (bytes)").Centered(),
new TableColumn("GTD / Max Memory (bytes)").Centered(),
new TableColumn("GTD / Max CPU (units)").Centered(),
]);
await AnsiConsole.Live(table)
.StartAsync(async ctx =>
{
var window = TimeSpan.FromSeconds(3);
while (cancellationToken.IsCancellationRequested is false)
{
var utilization = monitor.GetUtilization(window);
var resources = utilization.SystemResources;
table.AddRow(
[
$"{DateTime.Now:T}",
$"{utilization.CpuUsedPercentage:p}",
$"{utilization.MemoryUsedPercentage:p}",
$"{utilization.MemoryUsedInBytes:#,#}",
$"{resources.GuaranteedMemoryInBytes:#,#} / {resources.MaximumMemoryInBytes:#,#}",
$"{resources.GuaranteedCpuUnits} / {resources.MaximumCpuUnits}",
]);
ctx.Refresh();
await Task.Delay(window);
}
});
Console.CancelKeyPress += (_, e) =>
{
e.Cancel = true;
cancellationTokenSource.Cancel();
};
}
Met de voorgaande code wordt:
- Hiermee maakt u een annuleringstokenbron en een annuleringstoken.
- Hiermee maakt u een nieuw
Table
exemplaar, configureert u het met een titel, bijschrift en kolommen. - Voert een live render van het
Table
exemplaar uit, waarbij een gemachtigde wordt doorgegeven die elke drie seconden wordt aangeroepen. - Hiermee haalt u de huidige resourcegebruiksgegevens van het
IResourceMonitor
exemplaar op en wordt deze weergegeven als een nieuwe rij in hetTable
exemplaar.
Hier volgt een voorbeeld van de uitvoer uit de voorgaande code:
Zie het voorbeeld van resourcebewaking voor de broncode van dit voorbeeld.
Kubernetes-tests
Naast resourcebewaking rapporteren apps die bestaan in een Kubernetes-cluster hun status via diagnostische tests. Het NuGet-pakket Microsoft.Extensions.Diagnostics.Probes biedt ondersteuning voor Kubernetes-tests. Het externaliseert verschillende statuscontroles die zijn afgestemd op verschillende Kubernetes-tests, bijvoorbeeld:
- Leeflijkheid
- Gereedheid
- Opstarten
De bibliotheek communiceert de huidige status van de apps naar een Kubernetes-hostingomgeving. Als een proces rapporteert dat het niet in orde is, verzendt Kubernetes het verkeer niet, waardoor de procestijd wordt opgegeven om te herstellen of te beƫindigen.
Als u ondersteuning voor Kubernetes-tests wilt toevoegen, voegt u een pakketverwijzing toe aan Microsoft.Extensions.Diagnostics.Probes. Roep op een IServiceCollection exemplaar het aan AddKubernetesProbes.