Hinzufügen von Einblicken zu einer cloudnativen Anwendung
Nachdem Sie verstehen, wie wichtig Einblicke sind, erfahren Sie nun, wie Sie diese in Ihre cloudnative Anwendung integrieren können. Hierzu fügen Sie Ihrer App in diesem Schritt OpenTelemetry hinzu.
Hinzufügen von OpenTelemetry zu Ihrer App
.NET verfügt über ein umfangreiches Ökosystem von integrierten Tools für Einblicke, die Protokollierung, Metriken und Ablaufverfolgungsdaten erzeugen. Sie können diese Tools verwenden, um Ihrer cloudnativen Anwendung Einblicke hinzuzufügen. Diese Bibliotheken sind:
- Protokollierung:
Microsoft.Extensions.Logging.ILogger
- Metriken:
System.Diagnostics.Metrics.Meter
- Ablaufverfolgung:
System.Diagnostics.Activity
undSystem.Diagnostics.ActivitySource
OpenTelemetry verwendet alle oben genannten Telemetriedaten, doch muss Ihre cloudnative App zuerst OpenTelemetry-Unterstützung über NuGet-Pakete hinzufügen. Diese Pakete können in drei Gruppen kategorisiert werden:
Kategorie | Paket | Beschreibung |
---|---|---|
Core-API | OpenTelemetry | Die Hauptbibliothek, welche die Kernfunktionalität von OpenTelemetry bereitstellt. |
Core-API | OpenTelemetry.Extensions.Hosting | Stellt Erweiterungsmethoden zum automatischen Starten und Beenden der OpenTelemetry-Ablaufverfolgung in ASP.NET Core-Hosts bereit. |
Instrumentation | OpenTelemetry.Instrumentation.AspNetCore | Instrumentierung für ASP.NET Core-Anwendungen. Dieses Paket sammelt eine große Anzahl von Metriken über Ihre App, ohne dass Sie Code schreiben müssen. |
Exporteur | OpenTelemetry.Exporter.Console | Der Exporter für die Konsole ermöglicht der App das Schreiben von Telemetriedaten in die Konsole. |
Viele weitere Instrumentierungs- und Exporterpakete stehen zur Verfügung, die in Ihre cloudnative App aufgenommen werden können. Weitere Informationen finden Sie unter .NET-Einblicke mit OpenTelemetry. Je nach Typ der App, die Sie erstellen, können Sie die Pakete hinzufügen, die für Sie am relevantesten sind.
Dieses Modul konzentriert sich auf die Verwendung von OpenTelemetry mit der cloudnativen eShopLite-App. Diese App wird mit .NET Core und Blazor WebAssembly erstellt. Das bedeutet, dass alle Codebeispiele auf der Nutzung der Abhängigkeitsinjektion basieren.
Sie könnten sich dafür entscheiden, alle OpenTelemetry
-Pakete sowohl für den Dienst Products als auch für den Dienst Store in die Microservices-App aufzunehmen. In einer realen App gibt es jedoch weit mehr Dienste. Das Hinzufügen aller dieser Pakete zu jedem einzelnen bedeutet unnötige Doppelarbeit. Ein besserer Ansatz besteht darin, Ihrer Lösung ein neues Diagnoseprojekt hinzuzufügen, auf das jeder Microservice verweisen kann, um beobachtet zu werden.
Hier ist ein Beispielcode, der eine Methode AddObservability
erstellt, die ein Microservice aufrufen kann, um OpenTelemetry zu verwenden:
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();
}
}
Die Methode gibt eine IServiceCollection
-Klasse zurück, die ASP.NET Core WebApplicationBuilder
als Dienst hinzugefügt werden kann.
Durch diese Aktion wird eine Variable var otelBuilder = services.AddOpenTelemetry()
zum Speichern des OpenTelemetry-Generators erstellt. Der Code kann dann Metriken und Ablaufverfolgungen zu otelBuilder
hinzufügen.
Diese Konfiguration fügt z. B. eine Instrumentierung für Folgende hinzu:
- ASP.NET Core
- C#-Runtime
- HttpCLient
- Kestrel-Webserver
Diese Metriken werden in der Konsole angezeigt. Die .AddConsoleExporter()
-Methode fügt dem Generator den Exporter hinzu.
Außerdem wird der Konsole die Ablaufverfolgung hinzugefügt für:
- ASP.NET Core
- HttpClient
- SQL-Client
Die letzte Zeile gibt die IServiceCollection
-Klasse zurück.
Nachdem das Diagnoseprojekt abgeschlossen wurde, ist es so einfach wie das Hinzufügen eines Verweises auf das Projekt und eine einzelne Codezeile zum Dienst. Um z. B. OpenTelemetry in den Dienst Products einzuschließen, fügen Sie Ihrer Product.csproj
-Datei den Projektverweis hinzu:
<ProjectReference Include="..\Diagnostics\Diagnostics.csproj" />
Fügen Sie dann der Program.cs
-Datei unter Ihrer Deklaration für builder
die folgende Zeile hinzu:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddObservability("Products", builder.Configuration);
Fügen wir diesen Code den Produkt-Diensten in der eShopLite-App hinzu.