impostazioni predefinite del servizio .NET.NET Aspire
In questo articolo vengono fornite informazioni sul progetto predefinito del servizio .NET.NET Aspire, un set di metodi di estensione che:
- Connettere telemetria, i controlli di integrità , l'individuazione del servizio all'app.
- Sono personalizzabili ed estendibili.
Le applicazioni native del cloud spesso richiedono configurazioni estese per assicurarsi che funzionino in ambienti diversi in modo affidabile e sicuro. .NET Aspire fornisce numerosi metodi e strumenti helper per semplificare la gestione delle configurazioni per OpenTelemetry, controlli di integrità, variabili di ambiente e altro ancora.
Esplorare il progetto predefinito del servizio
Quando si Enlist in .NET.NET Aspire orchestrazione o creare un nuovo progetto .NET.NET Aspire, il progetto YourAppName.ServiceDefaults.csproj viene aggiunto alla soluzione. Ad esempio, quando si compila un'API, chiamare il metodo AddServiceDefaults
nel file Program.cs delle app:
builder.AddServiceDefaults();
Il metodo AddServiceDefaults
gestisce le attività seguenti:
- Configura OpenTelemetry metriche e traccia.
- Aggiunge gli endpoint di controllo integrità predefiniti.
- Aggiunge la funzionalità di individuazione dei servizi.
- Configura HttpClient per l'uso dell'individuazione dei servizi.
Per altre informazioni, vedere Metodi di estensione forniti per informazioni dettagliate sul metodo AddServiceDefaults
.
Importante
Il progetto predefinito del servizio .NET.NET Aspire è progettato specificamente per la condivisione del file Extensions.cs e delle relative funzionalità. Non includere altre funzionalità condivise o modelli in questo progetto. Usare un progetto di libreria di classi condiviso convenzionale per tali scopi.
Caratteristiche del progetto
Il progetto
<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>
Il modello di progetto predefinito del servizio impone una dipendenza FrameworkReference
da Microsoft.AspNetCore.App
.
Mancia
Se non si vuole accettare una dipendenza da Microsoft.AspNetCore.App
, è possibile creare un progetto di impostazioni predefinite del servizio personalizzato. Per altre informazioni, vedere impostazioni predefinite del servizio personalizzato.
La proprietà IsAspireSharedProject
è impostata su true
, che indica che il progetto è un progetto condiviso. Gli strumenti .NET Aspire usano questo progetto come riferimento per altri progetti aggiunti a una soluzione .NET Aspire. Quando si integra il nuovo progetto per l'orchestrazione, fa automaticamente riferimento al progetto YourAppName.ServiceDefaults e aggiorna il file Program.cs per chiamare il metodo AddServiceDefaults
.
Metodi di estensione forniti
Il progetto
-
AddServiceDefaults
: aggiunge la funzionalità predefinita del servizio. -
ConfigureOpenTelemetry
: configura le metriche e la traccia OpenTelemetry. -
AddDefaultHealthChecks
: aggiunge endpoint di controllo integrità predefiniti. -
MapDefaultEndpoints
: esegue il mapping dell'endpoint dei controlli di integrità a/health
e all'endpoint di attività a/alive
.
Aggiungere funzionalità predefinite del servizio
Il metodo AddServiceDefaults
definisce le configurazioni predefinite con le funzionalità di opinione seguenti:
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;
}
Il codice precedente:
- Configura OpenTelemetry metriche e traccia chiamando il metodo
ConfigureOpenTelemetry
. - Aggiunge gli endpoint di controllo integrità predefiniti chiamando il metodo
AddDefaultHealthChecks
. - Aggiunge funzionalità di individuazione del servizio chiamando il metodo
AddServiceDiscovery
. - Configura le impostazioni predefinite HttpClient chiamando il metodo
ConfigureHttpClientDefaults
, basato su Creare app HTTP resilienti: modelli di sviluppo chiave:- Aggiunge il gestore di resilienza HTTP standard chiamando il metodo
AddStandardResilienceHandler
. - Specifica che il IHttpClientBuilder deve usare l'individuazione del servizio chiamando il metodo
UseServiceDiscovery
.
- Aggiunge il gestore di resilienza HTTP standard chiamando il metodo
- Restituisce l'istanza di
IHostApplicationBuilder
per consentire il concatenamento dei metodi.
configurazione OpenTelemetry
La telemetria è una parte fondamentale di qualsiasi applicazione nativa del cloud.
.NET Aspire fornisce un set di valori predefiniti di opinione per OpenTelemetry, configurati con il metodo 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;
}
Metodo ConfigureOpenTelemetry
:
- Aggiunge .NET.NET Aspire dati di telemetria registrazione per includere messaggi e ambiti formattati.
- Aggiunge OpenTelemetry metriche e traccia che includono:
- Metriche di strumentazione di runtime.
- ASP.NET Core metriche di strumentazione.
- Metriche di strumentazione HttpClient.
- In un ambiente di sviluppo, il
AlwaysOnSampler
viene usato per visualizzare tutte le tracce. - Dettagli della traccia per ASP.NET Core, gRPC e strumentazione HTTP.
- Aggiunge OpenTelemetry gli esportatori chiamando
AddOpenTelemetryExporters
.
Il metodo AddOpenTelemetryExporters
viene definito privatamente come segue:
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;
}
Il metodo AddOpenTelemetryExporters
aggiunge OpenTelemetry gli esportatori in base alle condizioni seguenti:
- Se la variabile di ambiente
OTEL_EXPORTER_OTLP_ENDPOINT
è impostata, viene aggiunto l'utilità di esportazione OpenTelemetry. - Facoltativamente, i consumer di impostazioni predefinite del servizio .NET Aspire possono rimuovere il commento da parte di codice per abilitare l'utilità di esportazione Prometheus o l'utilità di esportazione Azure Monitor.
Per altre informazioni, vedere .NET.NET Aspire telemetria.
Configurazione dei controlli di integrità
I controlli di integrità vengono usati da vari strumenti e sistemi per valutare l'idoneità dell'app.
.NET
.NET Aspire fornisce un set di impostazioni predefinite con parere per i controlli di integrità, configurati con il metodo 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;
}
Il metodo AddDefaultHealthChecks
aggiunge un controllo di attività predefinito per assicurarsi che l'app sia reattiva. La chiamata a AddHealthChecks registra il HealthCheckService. Per altre informazioni, vedere .NET.NET Aspire controlli di integrità.
Configurazione dei controlli di integrità dell'app Web
Per esporre i controlli di integrità in un'app Web, .NET.NET Aspire determina automaticamente il tipo di progetto a cui si fa riferimento all'interno della soluzione e aggiunge la chiamata appropriata a 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;
}
Metodo MapDefaultEndpoints
:
- Consente ai consumer di rimuovere facoltativamente il commento da parte di codice per abilitare l'endpoint Prometheus.
- Esegue il mapping dell'endpoint dei controlli di integrità a
/health
. - Esegue il mapping dell'endpoint di attività a
/alive
route in cui il tag di controllo integrità contienelive
.
Per altre informazioni, vedere .NET.NET Aspire controlli di integrità.
Impostazioni predefinite del servizio personalizzato
Se la configurazione del servizio predefinita fornita dal modello di progetto non è sufficiente per le proprie esigenze, è possibile creare un progetto personalizzato per le impostazioni predefinite del servizio. Ciò è particolarmente utile quando il progetto utilizzato, ad esempio un progetto Worker o WinForms, non può o non vuole avere una dipendenza FrameworkReference
da Microsoft.AspNetCore.App
.
A tale scopo, creare un nuovo progetto di libreria di classi .NET 9.0 e aggiungere le dipendenze necessarie al file di progetto, considerare l'esempio seguente:
<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>
Creare quindi una classe di estensioni contenente i metodi necessari per configurare le impostazioni predefinite dell'app:
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;
}
}
Questo è solo un esempio ed è possibile personalizzare la classe AppDefaultsExtensions
per soddisfare le esigenze specifiche.
Passaggi successivi
Questo codice è derivato dal modello di applicazione iniziale .NET.NET Aspire ed è destinato a un punto di partenza. È possibile modificare questo codice, ma si ritiene necessario soddisfare le proprie esigenze. È importante sapere che le impostazioni predefinite del servizio e la relativa funzionalità vengono applicate automaticamente a tutte le risorse del progetto in una soluzione .NET.NET Aspire.