Standardeinstellungen für .NET.NET Aspire-Dienst
In diesem Artikel erfahren Sie mehr über das .NET.NET Aspire Dienststandardprojekt, eine Reihe von Erweiterungsmethoden, die:
- Verbinden Sie Telemetrie-, Integritätsprüfungen, Dienstermittlung mit Ihrer App.
- Sind anpassbar und erweiterbar.
Cloud-native Anwendungen erfordern häufig umfangreiche Konfigurationen, um sicherzustellen, dass sie zuverlässig und sicher in verschiedenen Umgebungen funktionieren. .NET Aspire bietet viele Hilfsmethoden und Tools, um die Verwaltung von Konfigurationen für OpenTelemetry, Integritätsprüfungen, Umgebungsvariablen und vieles mehr zu optimieren.
Erkunden des Dienststandardprojekts
Wenn Sie entweder Enlist in .NET.NET Aspire Orchestrierung oder ein neues .NET.NET Aspire Projekterstellen, wird der Projektmappe das YourAppName.ServiceDefaults.csproj Projekt hinzugefügt. Wenn Sie beispielsweise eine API erstellen, rufen Sie die AddServiceDefaults
-Methode in der Program.cs Datei Ihrer Apps auf:
builder.AddServiceDefaults();
Die AddServiceDefaults
-Methode behandelt die folgenden Aufgaben:
- Konfiguriert OpenTelemetry Metriken und Ablaufverfolgung.
- Fügt Standardmäßige Integritätsprüfungsendpunkte hinzu.
- Fügt Dienstermittlungsfunktionen hinzu.
- Konfiguriert HttpClient für die Arbeit mit der Dienstermittlung.
Weitere Informationen finden Sie unter Bereitgestellte Erweiterungsmethoden ausführliche Informationen zur AddServiceDefaults
Methode.
Wichtig
Das .NET.NET Aspire Dienststandardprojekt wurde speziell für die Freigabe der Extensions.cs Datei und deren Funktionalität entwickelt. Fügen Sie in diesem Projekt keine anderen freigegebenen Funktionen oder Modelle hinzu. Verwenden Sie für diese Zwecke ein herkömmliches freigegebenes Klassenbibliotheksprojekt.
Projektmerkmale
Das YourAppName.ServiceDefaults Projekt ist eine .NET 9.0-Bibliothek, die die folgende XML-Datei enthält:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsAspireSharedProject>true</IsAspireSharedProject>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.Extensions.Http.Resilience" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.ServiceDiscovery" Version="9.0.0" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.10.0" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.10.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.10.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.10.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.10.0" />
</ItemGroup>
</Project>
Die Projektvorlage des Dienststandardprojekts stellt eine FrameworkReference
Abhängigkeit von Microsoft.AspNetCore.App
auf.
Trinkgeld
Wenn Sie keine Abhängigkeit von Microsoft.AspNetCore.App
übernehmen möchten, können Sie ein benutzerdefiniertes Dienststandardprojekt erstellen. Weitere Informationen finden Sie unter Benutzerdefinierten Dienst standardmäßig.
Die IsAspireSharedProject
-Eigenschaft ist auf true
festgelegt, was angibt, dass es sich bei diesem Projekt um ein freigegebenes Projekt handelt. Das .NET Aspire Tooling verwendet dieses Projekt als Referenz für andere Projekte, die einer .NET Aspire Lösung hinzugefügt wurden. Wenn Sie das neue Projekt für die Orchestrierung auflisten, verweist es automatisch auf die YourAppName.ServiceDefaults Projekt und aktualisiert die Program.cs Datei, um die AddServiceDefaults
Methode aufzurufen.
Bereitgestellte Erweiterungsmethoden
Das YourAppName.ServiceDefaults--Projekt macht eine einzelne Extensions.cs Datei verfügbar, die mehrere meinungsierte Erweiterungsmethoden enthält:
-
AddServiceDefaults
: Fügt die Standardfunktionen des Diensts hinzu. -
ConfigureOpenTelemetry
: Konfiguriert OpenTelemetry Metriken und Ablaufverfolgung. -
AddDefaultHealthChecks
: Fügt Endpunkte für die Standardintegritätsprüfung hinzu. -
MapDefaultEndpoints
: Ordnet den Endpunkt für Integritätsprüfungen/health
und dem Livenessendpunkt/alive
zu.
Hinzufügen von Dienststandardfunktionen
Die AddServiceDefaults
-Methode definiert Standardkonfigurationen mit der folgenden Meinungsfunktion:
public static IHostApplicationBuilder AddServiceDefaults(
this IHostApplicationBuilder builder)
{
builder.ConfigureOpenTelemetry();
builder.AddDefaultHealthChecks();
builder.Services.AddServiceDiscovery();
builder.Services.ConfigureHttpClientDefaults(http =>
{
// Turn on resilience by default
http.AddStandardResilienceHandler();
// Turn on service discovery by default
http.AddServiceDiscovery();
});
// Uncomment the following to restrict the allowed schemes for service discovery.
// builder.Services.Configure<ServiceDiscoveryOptions>(options =>
// {
// options.AllowedSchemes = ["https"];
// });
return builder;
}
Der vorangehende Code:
- Konfiguriert OpenTelemetry Metriken und Ablaufverfolgung durch Aufrufen der
ConfigureOpenTelemetry
-Methode. - Fügt Standardmäßige Integritätsprüfungsendpunkte hinzu, indem die
AddDefaultHealthChecks
-Methode aufgerufen wird. - Fügt Funktionalität
Dienstermittlung hinzu, indem die -Methode aufgerufen wird. - Konfiguriert HttpClient Standardwerte, indem die
ConfigureHttpClientDefaults
-Methode aufgerufen wird, die auf Erstellen widerstandsfähiger HTTP-Apps basiert: Wichtige Entwicklungsmuster:- Fügt den standardmäßigen HTTP-Resilienzhandler hinzu, indem die
AddStandardResilienceHandler
-Methode aufgerufen wird. - Gibt an, dass der IHttpClientBuilder die Dienstermittlung verwenden soll, indem die
UseServiceDiscovery
-Methode aufgerufen wird.
- Fügt den standardmäßigen HTTP-Resilienzhandler hinzu, indem die
- Gibt die
IHostApplicationBuilder
Instanz zurück, die die Methodenkette zulassen soll.
OpenTelemetry Konfiguration
Telemetrie ist ein wichtiger Bestandteil jeder cloudeigenen Anwendung.
.NET Aspire stellt eine Reihe von Meinungsstandardeinstellungen für OpenTelemetrybereit, die mit der ConfigureOpenTelemetry
-Methode konfiguriert sind:
public static IHostApplicationBuilder ConfigureOpenTelemetry(
this IHostApplicationBuilder builder)
{
builder.Logging.AddOpenTelemetry(logging =>
{
logging.IncludeFormattedMessage = true;
logging.IncludeScopes = true;
});
builder.Services.AddOpenTelemetry()
.WithMetrics(metrics =>
{
metrics.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddRuntimeInstrumentation();
})
.WithTracing(tracing =>
{
if (builder.Environment.IsDevelopment())
{
// We want to view all traces in development
tracing.SetSampler(new AlwaysOnSampler());
}
tracing.AddAspNetCoreInstrumentation()
// Uncomment the following line to enable gRPC instrumentation
// (requires the OpenTelemetry.Instrumentation.GrpcNetClient package)
//.AddGrpcClientInstrumentation()
.AddHttpClientInstrumentation();
});
builder.AddOpenTelemetryExporters();
return builder;
}
Die ConfigureOpenTelemetry
-Methode:
- Fügt .NET.NET Aspire Telemetrie Protokollierung hinzu, um formatierte Nachrichten und Bereiche einzuschließen.
- Fügt OpenTelemetry Metriken und Ablaufverfolgung hinzu, die Folgendes umfassen:
- Metriken der Laufzeitinstrumentation.
- ASP.NET Core Metriken der Instrumentierung.
- HttpClient-Instrumentierungsmetriken.
- In einer Entwicklungsumgebung wird die
AlwaysOnSampler
verwendet, um alle Ablaufverfolgungen anzuzeigen. - Ablaufverfolgungsdetails für ASP.NET Core, gRPC und HTTP-Instrumentierung.
- Fügt OpenTelemetry Exporter hinzu, indem
AddOpenTelemetryExporters
aufgerufen wird.
Die AddOpenTelemetryExporters
-Methode wird privat wie folgt definiert:
private static IHostApplicationBuilder AddOpenTelemetryExporters(
this IHostApplicationBuilder builder)
{
var useOtlpExporter = !string.IsNullOrWhiteSpace(
builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]);
if (useOtlpExporter)
{
builder.Services.Configure<OpenTelemetryLoggerOptions>(
logging => logging.AddOtlpExporter());
builder.Services.ConfigureOpenTelemetryMeterProvider(
metrics => metrics.AddOtlpExporter());
builder.Services.ConfigureOpenTelemetryTracerProvider(
tracing => tracing.AddOtlpExporter());
}
// Uncomment the following lines to enable the Prometheus exporter
// (requires the OpenTelemetry.Exporter.Prometheus.AspNetCore package)
// builder.Services.AddOpenTelemetry()
// .WithMetrics(metrics => metrics.AddPrometheusExporter());
// Uncomment the following lines to enable the Azure Monitor exporter
// (requires the Azure.Monitor.OpenTelemetry.AspNetCore package)
//if (!string.IsNullOrEmpty(
// builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]))
//{
// builder.Services.AddOpenTelemetry()
// .UseAzureMonitor();
//}
return builder;
}
Die AddOpenTelemetryExporters
-Methode fügt OpenTelemetry Exporter basierend auf den folgenden Bedingungen hinzu:
- Wenn die
OTEL_EXPORTER_OTLP_ENDPOINT
Umgebungsvariable festgelegt ist, wird der OpenTelemetry Exporter hinzugefügt. - Optional können Consumer von .NET Aspire Dienststandard die Kommentare aufheben, um den Prometheus-Exporter oder den Azure Monitor-Exporter zu aktivieren.
Weitere Informationen finden Sie unter .NET.NET Aspire Telemetrie-.
Konfiguration der Integritätsprüfungen
Integritätsprüfungen werden von verschiedenen Tools und Systemen verwendet, um die Bereitschaft Ihrer App zu bewerten.
.NET
.NET Aspire stellt eine Reihe von meinungsvermerkten Standardwerten für Integritätsprüfungen bereit, die mit der AddDefaultHealthChecks
-Methode konfiguriert sind:
public static IHostApplicationBuilder AddDefaultHealthChecks(
this IHostApplicationBuilder builder)
{
builder.Services.AddHealthChecks()
// Add a default liveness check to ensure app is responsive
.AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]);
return builder;
}
Die AddDefaultHealthChecks
-Methode fügt eine Standardmäßige Liveness-Prüfung hinzu, um sicherzustellen, dass die App reaktionsfähig ist. Der Aufruf von AddHealthChecks registriert die HealthCheckService. Weitere Informationen finden Sie unter .NET.NET Aspire Integritätsprüfungen.
Konfiguration der Web App-Integritätsprüfungen
Um Integritätsprüfungen in einer Web-App verfügbar zu machen, bestimmt .NET.NET Aspire automatisch den Typ des Projekts, auf das innerhalb der Lösung verwiesen wird, und fügt den entsprechenden Aufruf zu MapDefaultEndpoints
hinzu:
public static WebApplication MapDefaultEndpoints(this WebApplication app)
{
// Uncomment the following line to enable the Prometheus endpoint
// (requires the OpenTelemetry.Exporter.Prometheus.AspNetCore package)
// app.MapPrometheusScrapingEndpoint();
// Adding health checks endpoints to applications in non-development
// environments has security implications.
// See https://aka.ms/dotnet/aspire/healthchecks for details before
// enabling these endpoints in non-development environments.
if (app.Environment.IsDevelopment())
{
// All health checks must pass for app to be considered ready to
// accept traffic after starting
app.MapHealthChecks("/health");
// Only health checks tagged with the "live" tag must pass for
// app to be considered alive
app.MapHealthChecks("/alive", new HealthCheckOptions
{
Predicate = r => r.Tags.Contains("live")
});
}
return app;
}
Die MapDefaultEndpoints
-Methode:
- Ermöglicht es Consumern, die Kommentare optional aufzuheben, um den Prometheus-Endpunkt zu aktivieren.
- Ordnet den Endpunkt für Integritätsprüfungen
/health
zu. - Ordnet den Livenessendpunkt
/alive
Route zu, auf der das Integritätsprüfungstaglive
enthält.
Weitere Informationen finden Sie unter .NET.NET Aspire Integritätsprüfungen.
Standardeinstellungen für benutzerdefinierte Dienste
Wenn die von der Projektvorlage bereitgestellte Standarddienstkonfiguration für Ihre Anforderungen nicht ausreicht, haben Sie die Möglichkeit, Ihr eigenes Dienststandardprojekt zu erstellen. Dies ist besonders nützlich, wenn Ihr Projekt, z. B. ein Worker-Projekt oder winForms-Projekt, keine FrameworkReference
Abhängigkeit von Microsoft.AspNetCore.App
haben soll.
Erstellen Sie hierzu ein neues .NET 9.0-Klassenbibliotheksprojekt, und fügen Sie der Projektdatei die erforderlichen Abhängigkeiten hinzu, beachten Sie das folgende Beispiel:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net9.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" />
<PackageReference Include="Microsoft.Extensions.ServiceDiscovery" />
<PackageReference Include="Microsoft.Extensions.Http.Resilience" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" />
</ItemGroup>
</Project>
Erstellen Sie dann eine Erweiterungsklasse, die die erforderlichen Methoden zum Konfigurieren der App-Standardwerte enthält:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using OpenTelemetry.Logs;
using OpenTelemetry.Metrics;
using OpenTelemetry.Trace;
namespace Microsoft.Extensions.Hosting;
public static class AppDefaultsExtensions
{
public static IHostApplicationBuilder AddAppDefaults(
this IHostApplicationBuilder builder)
{
builder.ConfigureAppOpenTelemetry();
builder.Services.AddServiceDiscovery();
builder.Services.ConfigureHttpClientDefaults(http =>
{
// Turn on resilience by default
http.AddStandardResilienceHandler();
// Turn on service discovery by default
http.AddServiceDiscovery();
});
return builder;
}
public static IHostApplicationBuilder ConfigureAppOpenTelemetry(
this IHostApplicationBuilder builder)
{
builder.Logging.AddOpenTelemetry(logging =>
{
logging.IncludeFormattedMessage = true;
logging.IncludeScopes = true;
});
builder.Services.AddOpenTelemetry()
.WithMetrics(static metrics =>
{
metrics.AddRuntimeInstrumentation();
})
.WithTracing(tracing =>
{
if (builder.Environment.IsDevelopment())
{
// We want to view all traces in development
tracing.SetSampler(new AlwaysOnSampler());
}
tracing.AddGrpcClientInstrumentation()
.AddHttpClientInstrumentation();
});
builder.AddOpenTelemetryExporters();
return builder;
}
private static IHostApplicationBuilder AddOpenTelemetryExporters(
this IHostApplicationBuilder builder)
{
var useOtlpExporter =
!string.IsNullOrWhiteSpace(
builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]);
if (useOtlpExporter)
{
builder.Services.Configure<OpenTelemetryLoggerOptions>(
logging => logging.AddOtlpExporter());
builder.Services.ConfigureOpenTelemetryMeterProvider(
metrics => metrics.AddOtlpExporter());
builder.Services.ConfigureOpenTelemetryTracerProvider(
tracing => tracing.AddOtlpExporter());
}
return builder;
}
}
Dies ist nur ein Beispiel, und Sie können die AppDefaultsExtensions
Klasse an Ihre spezifischen Anforderungen anpassen.
Nächste Schritte
Dieser Code wird von der Vorlage .NET.NET Aspire Startanwendung abgeleitet und ist als Ausgangspunkt vorgesehen. Sie können diesen Code frei ändern, aber Sie sind für notwendig, um Ihre Anforderungen zu erfüllen. Es ist wichtig zu wissen, dass das Standardprojekt des Diensts und seine Funktionalität automatisch auf alle Projektressourcen in einer .NET.NET Aspire Lösung angewendet werden.