Resursövervakning
Resursövervakning omfattar kontinuerlig mätning av resursanvändning under en angiven period. NuGet-paketet Microsoft.Extensions.Diagnostics.ResourceMonitoring erbjuder en samling API:er som är skräddarsydda för att övervaka resursanvändningen för dina .NET-program.
Gränssnittet IResourceMonitor tillhandahåller metoder för att hämta realtidsinformation om processresursanvändning. Det här gränssnittet stöder hämtning av data som rör processor- och minnesanvändning och är för närvarande kompatibelt med både Windows- och Linux-plattformar. All diagnostikinformation för resursövervakning publiceras som standard till OpenTelemetry, så du behöver inte publicera den manuellt själv.
Dessutom rapporterar resursövervakningsbiblioteket olika diagnostikmått. Mer information finns i Diagnostikmått: Microsoft.Extensions.Diagnostics.ResourceMonitoring
.
Exempel på användning av resursövervakning
I följande exempel visas hur du använder IResourceMonitor
gränssnittet för att hämta information om den aktuella processens processor- och minnesanvändning.
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>();
Koden ovan:
- Instansierar en ny ServiceCollection instans, länkningsanrop till tilläggsmetoderna AddLogging och AddResourceMonitoring .
- Skapar en ny ServiceProvider instans från instansen
ServiceCollection
. - Hämtar en instans av IResourceMonitor gränssnittet från instansen
ServiceProvider
.
Viktigt!
Paketet Microsoft.Extensions.Diagnostics.ResourceMonitoring förutsätter att konsumenten registrerar loggningsproviders med Microsoft.Extensions.Logging
paketet. Om du inte registrerar loggning utlöser anropet till AddResourceMonitoring
ett undantag. Dessutom kan du aktivera intern biblioteksloggning genom att Debug
konfigurera loggnivån för Microsoft.Extensions.Diagnostics.ResourceMonitoring
kategorin enligt guiden.
Nu med implementeringen IResourceMonitor
ber du om resursanvändning med IResourceMonitor.GetUtilization metoden . Metoden GetUtilization
returnerar en ResourceUtilization instans som innehåller följande information:
- ResourceUtilization.CpuUsedPercentage: CPU-användning i procent.
- ResourceUtilization.MemoryUsedPercentage: Minnesanvändning i procent.
- ResourceUtilization.MemoryUsedInBytes: Minnesanvändning i byte.
- ResourceUtilization.SystemResources: Systemresurser.
- SystemResources.GuaranteedMemoryInBytes: Garanterat minne i byte.
- SystemResources.MaximumMemoryInBytes: Maximalt minne i byte.
- SystemResources.GuaranteedCpuUnits: Garanterad cpu i enheter.
- SystemResources.MaximumCpuUnits: Maximal cpu i enheter.
Utöka resursövervakning med Spectre.Console
Om du utökar det här exemplet kan du använda Spectre.Console, ett väl ansedd .NET-bibliotek som är utformat för att förenkla utvecklingen av visuellt tilltalande konsolprogram mellan plattformar. Med Spectre kan du presentera resursanvändningsdata i tabellformat. Följande kod illustrerar användningen av IResourceMonitor
gränssnittet för att få åtkomst till information om processor- och minnesanvändningen för den aktuella processen och presenterar sedan dessa data i en tabell:
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();
};
}
Koden ovan:
- Skapar en källa för annulleringstoken och en annulleringstoken.
- Skapar en ny
Table
instans och konfigurerar den med en rubrik, bildtext och kolumner. - Utför en live-återgivning av instansen
Table
och skickar in ett ombud som anropas var tredje sekund. - Hämtar den aktuella resursanvändningsinformationen från instansen
IResourceMonitor
och visar den som en ny rad i instansenTable
.
Följande är ett exempel på utdata från föregående kod:
Källkoden för det här exemplet finns i exemplet Resursövervakning.
Kubernetes-avsökningar
Förutom resursövervakning rapporterar appar som finns i ett Kubernetes-kluster sin hälsa via diagnostikavsökningar. NuGet-paketet Microsoft.Extensions.Diagnostics.Probes har stöd för Kubernetes-avsökningar. Den externaliserar olika hälsokontroller som överensstämmer med olika Kubernetes-avsökningar, till exempel:
- Livskraft
- Beredskap
- Start
Biblioteket kommunicerar apparnas aktuella hälsa till en Kubernetes-värdmiljö. Om en process rapporterar att den inte är felfri skickar Kubernetes ingen trafik, vilket ger processtiden att återställa eller avsluta.
Om du vill lägga till stöd för Kubernetes-avsökningar lägger du till en paketreferens till Microsoft.Extensions.Diagnostics.Probes. På en IServiceCollection instans anropar du AddKubernetesProbes.