Waarneembaarheid toevoegen aan een cloudeigen toepassing
Nu u het belang van waarneembaarheid begrijpt, ziet u hoe u deze kunt opnemen in uw cloudeigen toepassing. U doet deze stap door OpenTelemetry toe te voegen aan uw app.
OpenTelemetry toevoegen aan uw app
.NET heeft een uitgebreid ecosysteem van ingebouwde hulpprogramma's voor waarneembaarheid die logboekregistratie, metrische gegevens en traceringsgegevens produceren. U kunt deze hulpprogramma's gebruiken om waarneembaarheid toe te voegen aan uw cloudeigen toepassing. Deze bibliotheken zijn:
- Logboekregistratie:
Microsoft.Extensions.Logging.ILogger
- Metrische gegevens:
System.Diagnostics.Metrics.Meter
- Tracering:
System.Diagnostics.Activity
enSystem.Diagnostics.ActivitySource
OpenTelemetry verbruikt alle voorgaande telemetrie, maar eerst moet uw cloudeigen app OpenTelemetry-ondersteuning toevoegen via NuGet-pakketten. Deze pakketten kunnen worden onderverdeeld in drie groepen:
Categorie | Pakket | Beschrijving |
---|---|---|
Kern-API | OpenTelemetry | De hoofdbibliotheek die de kernfunctionaliteit van OpenTelemetry biedt. |
Kern-API | OpenTelemetry.Extensions.Hosting | Biedt uitbreidingsmethoden voor het automatisch starten en stoppen van OpenTelemetry-tracering in ASP.NET Core-hosts. |
Instrumentatie | OpenTelemetry.Instrumentation.AspNetCore | Instrumentatie voor ASP.NET Core-toepassingen. Dit pakket verzamelt een groot aantal metrische gegevens over uw app zonder dat u code hoeft te schrijven. |
Exportfunctie | OpenTelemetry.Exporter.Console | Met de exporteur voor de console kan de app telemetrie naar de console schrijven. |
Er zijn nog veel meer instrumentatie- en exportpakketten beschikbaar die u kunt opnemen in uw cloudeigen app. Zie .NET-waarneembaarheid met OpenTelemetry voor meer informatie. Afhankelijk van het type app dat u bouwt, kunt u de pakketten toevoegen die het meest relevant voor u zijn.
Deze module is gericht op het gebruik van OpenTelemetry met de cloudeigen eShopLite-app . Deze app is gebouwd met .NET Core en Blazor WebAssembly, dus dit betekent dat alle codevoorbeelden zijn gebaseerd op het gebruik van afhankelijkheidsinjectie.
U kunt ervoor kiezen om alle OpenTelemetry
pakketten op te nemen in zowel de Producten - als Store-services in de microservices-app. In een echte app hebt u echter nog veel meer services. Het toevoegen van al deze pakketten aan elk pakket omvat onnodige duplicatie. Een betere aanpak is het toevoegen van een nieuw diagnostisch project aan uw oplossing waarnaar elke microservice kan verwijzen.
Hier volgt een voorbeeldcode waarmee een methode AddObservability
wordt gemaakt die een microservice kan aanroepen om OpenTelemetry te gebruiken:
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
namespace Microsoft.Extensions.DependencyInjection;
public static class DiagnosticServiceCollectionExtensions
{
public static IServiceCollection AddObservability(this IServiceCollection services,
string serviceName,
IConfiguration configuration)
{
// create the resource that references the service name passed in
var resource = ResourceBuilder.CreateDefault().AddService(serviceName: serviceName, serviceVersion: "1.0");
// add the OpenTelemetry services
var otelBuilder = services.AddOpenTelemetry();
otelBuilder
// add the metrics providers
.WithMetrics(metrics =>
{
metrics
.SetResourceBuilder(resource)
.AddRuntimeInstrumentation()
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddEventCountersInstrumentation(c =>
{
c.AddEventSources(
"Microsoft.AspNetCore.Hosting",
"Microsoft-AspNetCore-Server-Kestrel",
"System.Net.Http",
"System.Net.Sockets");
})
.AddMeter("Microsoft.AspNetCore.Hosting", "Microsoft.AspNetCore.Server.Kestrel")
.AddConsoleExporter();
})
// add the tracing providers
.WithTracing(tracing =>
{
tracing.SetResourceBuilder(resource)
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddSqlClientInstrumentation();
});
return services;
}
// Add the Prometheus endpoints to your service, this will expose the metrics at http://service/metrics
public static void MapObservability(this IEndpointRouteBuilder routes)
{
routes.MapPrometheusScrapingEndpoint();
}
}
De methode retourneert een IServiceCollection
klasse die als een service kan worden toegevoegd aan een ASP.NET Core WebApplicationBuilder
.
Met deze actie maakt u vervolgens een variabele var otelBuilder = services.AddOpenTelemetry()
voor het opslaan van de opbouwfunctie voor OpenTelemetry. De code kan vervolgens metrische gegevens en traceringen toevoegen aan otelBuilder
.
Met deze configuratie wordt bijvoorbeeld instrumentatie toegevoegd voor:
- ASP.NET Core
- C# Runtime
- HttpCLient
- Kestrel-webserver
Deze metrische gegevens worden weergegeven in de console. De .AddConsoleExporter()
methode voegt de exporteur toe aan de opbouwfunctie.
Er wordt ook tracering toegevoegd aan de console voor:
- ASP.NET Core
- HttpClient
- SQL-client
De laatste regel retourneert de IServiceCollection
klasse.
Als het diagnostische project is voltooid, is het net zo eenvoudig als het toevoegen van een verwijzing naar het project en één regel code aan de service. Als u bijvoorbeeld OpenTelemetry wilt opnemen in de productenservice , voegt u de projectreferentie toe aan uw Product.csproj
bestand:
<ProjectReference Include="..\Diagnostics\Diagnostics.csproj" />
Voeg vervolgens de volgende regel toe aan het Program.cs
bestand onder uw declaratie van builder
:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddObservability("Products", builder.Configuration);
We gaan deze code toevoegen aan de productenservices in de eShopLite-app .