將可檢視性新增至雲端原生應用程式

已完成

既然您已瞭解可檢視性的重要性,您將瞭解如何將其包含在雲端原生應用程式中。 將 OpenTelemetry 新增至您的應用程式,即可執行此步驟。

將 OpenTelemetry 新增至您的應用程式

.NET 具有豐富的內建可觀察性工具生態系統,可產生記錄、計量和追蹤數據。 您可以使用這些工具,將可檢視性新增至雲端原生應用程式。 這些程式庫包括:

  • 記錄Microsoft.Extensions.Logging.ILogger
  • 計量System.Diagnostics.Metrics.Meter
  • 追蹤System.Diagnostics.ActivitySystem.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產品與集服務的所有套件包含在微服務應用程式中。 不過,在真實世界應用程式中,您有更多服務。 將這些套件新增至每一個套件都涉及不必要的重複。 更好的方法是將新的診斷專案新增至您的解決方案,讓任何微服務都可以參考以觀察。

以下是一些範例程序代碼,其會建立微服務可以呼叫以使用 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 服務。