將可檢視性新增至雲端原生應用程式
既然您已瞭解可檢視性的重要性,您將瞭解如何將其包含在雲端原生應用程式中。 將 OpenTelemetry 新增至您的應用程式,即可執行此步驟。
將 OpenTelemetry 新增至您的應用程式
.NET 具有豐富的內建可觀察性工具生態系統,可產生記錄、計量和追蹤數據。 您可以使用這些工具,將可檢視性新增至雲端原生應用程式。 這些程式庫包括:
- 記錄:
Microsoft.Extensions.Logging.ILogger - 計量:
System.Diagnostics.Metrics.Meter - 追蹤:
System.Diagnostics.Activity和System.Diagnostics.ActivitySource
OpenTelemetry 會取用上述所有遙測,但首先您的雲端原生應用程式必須透過 NuGet 套件新增 OpenTelemetry 支援。 這些套件可以分類為三個群組:
| 類別 | 套件 | 說明 |
|---|---|---|
| 核心 API | OpenTelemetry | 提供核心 OpenTelemetry 功能的主要函式庫。 |
| 核心 API | OpenTelemetry.Extensions.Hosting | 提供擴充方法,以在 ASP.NET Core 主機中自動啟動和停止 OpenTelemetry 追蹤。 |
| 儀器儀表 | OpenTelemetry.Instrumentation.AspNetCore | ASP.NET Core 應用程式的檢測設備。 此套件會收集您應用程式的相關大量計量,而不需要撰寫任何程序代碼。 |
| 出口商 | OpenTelemetry.Exporter.Console | 應用程式的匯出器允許將遙測數據寫入控制台。 |
更多檢測和導出工具套件可供包含在雲端原生應用程式中。 如需詳細資訊,請參閱 使用 OpenTelemetry 的 .NET 可觀察性。 視您要建置的應用程式類型而定,您可以新增與您最相關的套件。
本課程模組著重於搭配 eShopLite 雲端原生應用程式使用 OpenTelemetry。 此應用程式是以 .NET Core 和 Blazor WebAssembly 建置,因此表示所有程式碼範例都是以利用相依性插入為基礎。
您可以選擇將OpenTelemetry產品與市集服務的所有套件包含在微服務應用程式中。 不過,在真實世界應用程式中,您有更多服務。 將這些套件新增至每一個套件都涉及不必要的重複。 更好的方法是將新的診斷專案新增至您的解決方案,讓任何微服務都可以參考以觀察。
以下是一些範例程序代碼,其會建立微服務可以呼叫以使用 OpenTelemetry 的方法 AddObservability :
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();
}
}
方法傳回一個 IServiceCollection 類別,該類別可以作為服務新增至 ASP.NET Core WebApplicationBuilder。
此動作接著會建立變數 var otelBuilder = services.AddOpenTelemetry() 來儲存 OpenTelemetry 產生器。 程式代碼接著可以將計量和追蹤新增至 otelBuilder。
例如,此設定會新增下列項目的檢測設備:
- ASP.NET Core
- C# 執行階段
- HttpClient
- Kestrel 網頁伺服器
這些計量會顯示在控制台中。 方法 .AddConsoleExporter() 會將匯出工具新增至產生器。
其也會將追蹤新增至主控台,以便:
- ASP.NET Core
- HttpClient
- SQL 用戶端
最後一行會傳回IServiceCollection類別。
完成診斷專案後,只要將參考新增至專案,並將單一程式代碼行新增至服務即可。 例如,若要在 產品 服務中包含 OpenTelemetry,請在檔案 Product.csproj 中新增項目參考:
<ProjectReference Include="..\Diagnostics\Diagnostics.csproj" />
然後將下列這一行新增至 builder 的宣告下的 Program.cs 檔案:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddObservability("Products", builder.Configuration);
讓我們將此程式代碼新增至 eShopLite 應用程式中的 Products 服務。