Welcome to YARP - 8.分散式跟蹤

y發表於2023-11-22

Welcome to YARP - 1.認識YARP並搭建反向代理服務

Welcome to YARP - 2.配置功能

Welcome to YARP - 3.負載均衡

Welcome to YARP - 4.限流

Welcome to YARP - 5.身份驗證和授權

Welcome to YARP - 6.壓縮、快取

Welcome to YARP - 7.目標健康檢查

Welcome to YARP - 8.分散式跟蹤

這篇文章結束,YARP 的學習就先告一段落了。還有很多省略的章節(比如:中介軟體、HTTPS和TLS、GRPC等等)。想要了解更多的小夥伴可以自己去官網的文件瞭解。

介紹

在介紹 YARP 的分散式跟蹤之前,我們先來了解一下什麼是分散式跟蹤。

當我們構建大型的應用程式或系統時,通常會將其拆分成多個部分,這些部分可能執行在不同的計算機或程式中。這種分散式架構有助於提高系統的可伸縮性和效能,但也增加了故障診斷的難度。分散式跟蹤就像是應用程式的偵探工具,可以幫助工程師找出應用程式中的問題,特別是那些可能橫跨多個計算機或程式的問題。

舉個例子,假設我們有一個典型的網頁服務,使用者傳送請求後,這個請求可能經過負載均衡器,然後傳遞給後端的Web伺服器程式,最後可能會涉及資料庫的多次查詢。使用分散式跟蹤,就像我們在調查一樁案件一樣,工程師可以追蹤整個請求的過程。他們能夠分辨每個步驟是否成功,每個步驟花費了多少時間,甚至可以記錄每個步驟產生的詳細資訊。

作為 ASP.NET Core 的元件,YARP 可以像任何其他 Web 應用程式一樣輕鬆整合到不同的跟蹤系統中。可以使用以下程式配置分散式跟蹤,詳情參考:

.NET 具有對分散式跟蹤的內建可配置支援,YARP 利用這些支援來啟用此類現成方案。

使用自定義跟蹤標頭

在使用 .NET 不原生支援的傳播機制時,需要建立一個專門的傳播器(DistributedContextPropagator)來處理該機制的上下文資訊傳遞。

YARP 會移除 DistributedContextPropagator.Fields( 這是DistributedContextPropagator中的一個屬性或欄位,用於儲存與上下文傳播相關的資訊 ) 中的任何標頭,以便在 Inject 呼叫期間,傳播器可以重新新增它們到請求中。 這個步驟是為了在整個傳播過程中有效地管理標頭資訊,以確保它們被適當地處理和傳遞。

透傳代理

如果不希望代理主動參與跟蹤,並希望保留所有跟蹤標頭,您可以透過將SocketsHttpHandler.ActivityHeadersPropagator 設定為null來實現。這表示代理將保持對跟蹤標頭的透明傳遞,而不會主動干預。

services.AddReverseProxy()
    .ConfigureHttpClient((context, handler) => handler.ActivityHeadersPropagator = null);

示例

1.建立專案

dotnet new web -n YARP.Metrics -f net6.0

2.新增專案引用

<ItemGroup>
	<PackageReference Include="Yarp.Telemetry.Consumption" Version="2.1.0" />
</ItemGroup>

這個是 YARP 提供的庫,用來監聽代理操作的各個階段,從而收集有關請求處理的詳細資訊和效能指標。

在內部,YARP 使用 EventSource 來收集來自許多用於處理請求的子系統的遙測事件和指標。

要監聽這些指標,需要在 DI(依賴注入)中註冊實現每個功能介面的類。以下是該類庫提供的功能:

功能概述:

  1. Proxy(代理):代表整個代理操作,包括成功或失敗。
    • 事件包括:
      • 代理請求的啟動和停止時
      • 請求/響應主體處理時
    • 指標包括:
      • 啟動的請求數量
      • 進行中的請求數量
      • 失敗的請求數量
  2. Kestrel:處理傳入請求的 Web 伺服器。
    • 事件包括:
      • 請求的啟動/停止或失敗時
    • 指標包括:
      • 連線速率 - 每秒開啟的連線數
      • 總連線數
      • TLS 握手次數
      • 入站佇列長度
  3. Http:用於向目標伺服器發出出站請求的 HttpClient。
    • 事件包括:
      • 連線建立時
      • 請求的啟動/停止或失敗時
      • 標頭/內容傳送/接收時
      • 請求在連線可用時出佇列時
    • 指標包括:
      • 啟動的出站請求數量
      • 失敗的請求數量
      • 活動請求數量
      • 出站連線數量
  4. Sockets:涉及連線嘗試的事件和有關傳送和接收的資料量的指標。
  5. NameResolution:涉及名稱解析嘗試的事件和有關目標的 DNS 查詢的指標。
  6. NetSecurity:涉及 SslStream 握手的事件和有關每個協議的握手數量和延遲的指標。

3.關鍵檔案

  • ForwarderTelemetryConsumer(監聽來自代理遙測的事件,記錄與代理請求處理的高階別過程相關的時序和資訊。)
  • HttpClientTelemetryConsumer(監聽來自 HttpClient 遙測的事件,記錄與目標伺服器的出站請求和響應相關的時序和資訊。)
  • PerRequestMetrics(儲存按每個請求計算的指標的類。例項在請求的整個生命週期記憶體儲在 AsyncLocal 儲存中。)
  • PerRequestYarpMetricCollectionMiddleware(處理請求的第一步和最後一步。它初始化每個請求的指標,並在請求結束時記錄結果。)

4.在DI中註冊

using YARP.Metrics;

var builder = WebApplication.CreateBuilder(args);

var services = builder.Services;

services.AddControllers();

services.AddReverseProxy()
    .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));

services.AddHttpContextAccessor();

// 用於收集有關代理轉發的常規指標的介面
services.AddMetricsConsumer<ForwarderMetricsConsumer>();

// 將使用者註冊到代理轉發器遙測的事件
services.AddTelemetryConsumer<ForwarderTelemetryConsumer>();

// 將使用者註冊到HttpClient遙測事件
services.AddTelemetryConsumer<HttpClientTelemetryConsumer>();

services.AddTelemetryConsumer<WebSocketsTelemetryConsumer>();

var app = builder.Build();

// 收集和報告代理度量的自定義中介軟體
// 放置在開頭,因此它是每個請求執行的第一件也是最後一件事
app.UsePerRequestMetricCollection();

// 用於攔截WebSocket連線並收集暴露給WebSocketsTemetryConsumer的遙測的中介軟體
app.UseWebSocketsTelemetry();

app.MapReverseProxy();

app.Run();

5.Appsettings.json配置

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      // "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ReverseProxy": {
    "Routes": {
      "route1": {
        "ClusterId": "cluster1",
        "Match": {
          "Path": "{**catch-all}"
        }
      }
    },
    "Clusters": {
      "cluster1": {
        "Destinations": {
          "cluster1/destination1": {
            "Address": "https://www.baidu.com/"
          }
        }
      }
    }
  }
}

5.執行專案

接下來我們執行專案,就可以看到代理請求的一些指標資料:

image.png

總結

到這裡分散式跟蹤篇章也已經結束了,它在分散式系統中尤為重要,可以分析效能瓶頸,定位錯誤和異常。而且收集的這些遙測資料(指標)可以匯出到多種不同的後端儲存或視覺化工具中。比如:ZipkinJaegerPrometheus,這都是後話了。有興趣的小夥伴自己研究吧。相關程式碼已上傳Github,關鍵檔案也都有註釋。至此 YARP 的學習就先告一段落了。還有很多省略的章節(比如:中介軟體、HTTPS和TLS、GRPC等等)。想要了解更多的小夥伴可以自己去官網的文件瞭解。

相關文章