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

已完成

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

將 OpenTelemetry 新增至您的應用程式

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

  • 記錄Microsoft.Extensions.Logging.ILogger
  • 計量System.Diagnostics.Metrics.Meter
  • 追蹤System.Diagnostics.ActivitySystem.Diagnostics.ActivitySource

OpenTelemetry 會取用上述所有遙測,但首先您的雲端原生應用程式需要透過 NuGet 套件新增 OpenTelemetry 支援。 這些套件可以分類為三個群組:

類別 Package 描述
Core API OpenTelemetry 提供核心 OpenTelemetry 功能的主要程式庫。
Core API OpenTelemetry.Extensions.Hosting 提供延伸模組方法,以在 ASP.NET Core 主機中自動啟動和停止 OpenTelemetry 追蹤。
檢測 OpenTelemetry.Instrumentation.AspNetCore ASP.NET Core 應用程式的檢測設備。 此套件會收集您應用程式的大量計量,您不需要撰寫任何程式碼。
Exporter OpenTelemetry.Exporter.Console 主控台的匯出工具可讓應用程式將遙測寫入主控台。

您的雲端原生應用程式中包括更多可用的檢測設備和匯出工具套件。 如需詳細資訊,請參閱 OpenTelemetry 的 .NET 可檢視性。 依您要建置的應用程式類型而定,您可以新增與您最相關的套件。

本課程模組主要介紹如何將 OpenTelemetry 和 eShopLite 雲端原生應用程式搭配使用。 此應用程式是以 .NET Core 和 Blazor WebAssembly 建置,因此這表示所有程式碼範例都是根據如何利用相依性插入來完成的。

顯示應用程式不同 OpenTelemetry 元件的圖表。

您可以選擇將所有 OpenTelemetry 個套件包括在微服務應用程式的產品Microsoft Store 服務中。 不過,在實際的應用程式中,您有更多服務。 將所有這些套件新增至每一個都需要不必要的重複作業。 更好的方法是將新的診斷專案新增至您的解決方案,讓任何微服務都可以參考以進行觀察。

以下是一些範例程式碼,其會建立微服務可以呼叫以使用 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] 應用程式中的 [產品] 服務。