ustawienia domyślne usługi .NET.NET Aspire
W tym artykule dowiesz się więcej o projekcie domyślnym usługi .NET.NET Aspire, czyli zestawie metod rozszerzeń, które:
- Połącz telemetrii, kontroli kondycji, odnajdywanie usługi z aplikacją.
- Można dostosowywać i rozszerzać.
Aplikacje natywne dla chmury często wymagają rozbudowanych konfiguracji, aby zapewnić niezawodne i bezpieczne działanie w różnych środowiskach. .NET Aspire udostępnia wiele metod i narzędzi pomocników, które usprawniają zarządzanie konfiguracjami OpenTelemetry, kontroli kondycji, zmiennych środowiskowych i innych.
Eksplorowanie projektu ustawień domyślnych usługi
Gdy enlist in .NET.NET Aspire orchestration lub utworzyć nowy projekt .NET.NET Aspire, do rozwiązania zostanie dodany projekt YourAppName.ServiceDefaults.csproj. Na przykład podczas tworzenia interfejsu API wywołujesz metodę AddServiceDefaults
w pliku Program.cs aplikacji:
builder.AddServiceDefaults();
Metoda AddServiceDefaults
obsługuje następujące zadania:
- Konfiguruje OpenTelemetry metryki i śledzenie.
- Dodaje domyślne punkty końcowe sprawdzania kondycji.
- Dodaje funkcje odnajdywania usług.
- Konfiguruje HttpClient do pracy z odnajdywaniem usług.
Aby uzyskać więcej informacji, zobacz Dostarczone metody rozszerzenia, aby uzyskać szczegółowe informacje na temat metody AddServiceDefaults
.
Ważny
Projekt domyślny usługi .NET.NET Aspire jest przeznaczony specjalnie do udostępniania pliku Extensions.cs i jego funkcji. Nie dołączaj innych funkcji udostępnionych ani modeli w tym projekcie. W tych celach należy użyć konwencjonalnego projektu biblioteki klas udostępnionych.
Charakterystyka projektu
Projekt YourAppName.ServiceDefaults to biblioteka .NET 9.0 zawierająca następujący kod XML:
<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>
Szablon projektu domyślnego usługi nakłada zależność FrameworkReference
od Microsoft.AspNetCore.App
.
Napiwek
Jeśli nie chcesz stosować zależności od Microsoft.AspNetCore.App
, możesz utworzyć projekt domyślnych usług niestandardowych. Aby uzyskać więcej informacji, zobacz ustawienia domyślne usługi niestandardowej.
Właściwość IsAspireSharedProject
jest ustawiona na true
, która wskazuje, że ten projekt jest projektem udostępnionym. Narzędzia .NET Aspire używają tego projektu jako odwołania do innych projektów dodanych do rozwiązania .NET Aspire. Po zarejestrowaniu nowego projektu do orkiestracji program automatycznie odwołuje się do projektu YourAppName.ServiceDefaults i aktualizuje plik Program.cs w celu wywołania metody AddServiceDefaults
.
Udostępnione metody rozszerzenia
Projekt YourAppName.ServiceDefaults uwidacznia jeden plik Extensions.cs zawierający kilka metod rozszerzenia opinii:
-
AddServiceDefaults
: dodaje funkcję domyślną usługi. -
ConfigureOpenTelemetry
: konfiguruje metryki i śledzenie OpenTelemetry. -
AddDefaultHealthChecks
: dodaje domyślne punkty końcowe sprawdzania kondycji. -
MapDefaultEndpoints
: mapuje punkt końcowy kontroli kondycji na/health
i punkt końcowy aktualności, aby/alive
.
Dodawanie funkcji domyślnych usługi
Metoda AddServiceDefaults
definiuje konfiguracje domyślne z następującymi funkcjami opinii:
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;
}
Powyższy kod:
- Konfiguruje OpenTelemetry metryki i śledzenie, wywołując metodę
ConfigureOpenTelemetry
. - Dodaje domyślne punkty końcowe sprawdzania kondycji przez wywołanie metody
AddDefaultHealthChecks
. - Dodaje funkcje odnajdywania usługi przez wywołanie metody
AddServiceDiscovery
. - Konfiguruje domyślne HttpClient przez wywołanie metody
ConfigureHttpClientDefaults
— która jest oparta na Tworzenie odpornych aplikacji HTTP: Kluczowe wzorce programistyczne:- Dodaje standardową procedurę obsługi odporności HTTP przez wywołanie metody
AddStandardResilienceHandler
. - Określa, że IHttpClientBuilder powinien używać odnajdywania usług, wywołując metodę
UseServiceDiscovery
.
- Dodaje standardową procedurę obsługi odporności HTTP przez wywołanie metody
- Zwraca wystąpienie
IHostApplicationBuilder
, aby umożliwić łączenie metod.
konfiguracja OpenTelemetry
Telemetria jest krytyczną częścią każdej aplikacji natywnej dla chmury.
.NET Aspire zawiera zestaw wartości domyślnych dla OpenTelemetry, które są skonfigurowane przy użyciu metody ConfigureOpenTelemetry
:
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;
}
Metoda ConfigureOpenTelemetry
:
- Dodaje .NET.NET Aspire dane telemetryczne rejestrowania w celu uwzględnienia sformatowanych komunikatów i zakresów.
- Dodaje OpenTelemetry metryki i śledzenie, które obejmują:
- Metryki instrumentacji środowiska uruchomieniowego.
- ASP.NET Core metryki instrumentacji.
- Metryki instrumentacji HttpClient.
- W środowisku projektowym
AlwaysOnSampler
służy do wyświetlania wszystkich śladów. - Szczegóły śledzenia ASP.NET Core, gRPC i instrumentacji HTTP.
- Dodaje eksporterów OpenTelemetry, wywołując
AddOpenTelemetryExporters
.
Metoda AddOpenTelemetryExporters
jest definiowana prywatnie w następujący sposób:
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;
}
Metoda AddOpenTelemetryExporters
dodaje eksporterów OpenTelemetry na podstawie następujących warunków:
- Jeśli zmienna środowiskowa
OTEL_EXPORTER_OTLP_ENDPOINT
jest ustawiona, dodawany jest eksporter OpenTelemetry. - Opcjonalnie użytkownicy domyślnych .NET Aspire usług mogą usunąć znaczniki komentarza, aby włączyć eksportera Prometheus lub eksportera monitora Azure.
Aby uzyskać więcej informacji, zobacz .NET.NET Aspire telemetrii.
Konfiguracja kontroli kondycji
Testy kondycji są używane przez różne narzędzia i systemy do oceny gotowości aplikacji.
.NET
.NET Aspire zawiera zestaw wartości domyślnych opinii dla kontroli kondycji, które są skonfigurowane przy użyciu metody AddDefaultHealthChecks
:
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;
}
Metoda AddDefaultHealthChecks
dodaje domyślne sprawdzanie dostępności, aby upewnić się, że aplikacja reaguje. Wywołanie AddHealthChecks rejestruje HealthCheckService. Aby uzyskać więcej informacji, zobacz .NET.NET Aspire kontroli kondycji.
Konfiguracja kontroli kondycji aplikacji internetowej
Aby uwidocznić kontrole kondycji w aplikacji internetowej, .NET.NET Aspire automatycznie określa typ przywoływanego projektu w rozwiązaniu i dodaje odpowiednie wywołanie MapDefaultEndpoints
:
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;
}
Metoda MapDefaultEndpoints
:
- Umożliwia użytkownikom opcjonalne anulowanie komentarza kodu w celu włączenia punktu końcowego Prometheus.
- Mapuje punkt końcowy kontroli kondycji na
/health
. - Mapuje punkt końcowy aktualności na
/alive
trasę, w której tag sprawdzania kondycji zawieralive
.
Aby uzyskać więcej informacji, zobacz .NET.NET Aspire kontroli kondycji.
Ustawienia domyślne usługi niestandardowej
Jeśli domyślna konfiguracja usługi dostarczona przez szablon projektu nie jest wystarczająca dla Twoich potrzeb, możesz utworzyć własny projekt domyślny usługi. Jest to szczególnie przydatne, gdy projekt zużywany, taki jak projekt Roboczy lub projekt WinForms, nie może lub nie chce mieć zależności FrameworkReference
od Microsoft.AspNetCore.App
.
W tym celu utwórz nowy projekt biblioteki klas .NET 9.0 i dodaj niezbędne zależności do pliku projektu, rozważmy następujący przykład:
<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>
Następnie utwórz klasę rozszerzeń zawierającą niezbędne metody konfigurowania ustawień domyślnych aplikacji:
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;
}
}
Jest to tylko przykład i można dostosować klasę AppDefaultsExtensions
w celu spełnienia określonych potrzeb.
Następne kroki
Ten kod pochodzi z szablonu aplikacji początkowej .NET.NET Aspire i jest przeznaczony jako punkt początkowy. Możesz zmodyfikować ten kod, jednak uważasz, że jest to konieczne do spełnienia Twoich potrzeb. Ważne jest, aby wiedzieć, że projekt domyślny usługi i jego funkcjonalność są automatycznie stosowane do wszystkich zasobów projektu w rozwiązaniu .NET.NET Aspire.
- odnajdywanie usługi w usłudze .NET.NET Aspire
- zestawu SDK
- szablony .NET.NET Aspire
- kontrole kondycji w .NET.NET Aspire
- .NET .NET Aspire telemetrii
- Tworzenie odpornych aplikacji HTTP: kluczowe wzorce programistyczne