全部產品
Search
文件中心

Alibaba Cloud Service Mesh:在ASM中實現分布式跟蹤

更新時間:Jul 31, 2024

Service MeshASM整合了阿里雲可觀測鏈路OpenTelemetry版,為分布式應用的開發人員提供了完整的調用鏈路還原、調用請求量統計、鏈路拓撲、應用依賴分析等能力,可以協助開發人員快速分析和診斷分布式應用架構下的效能瓶頸,提升開發診斷效率。本文介紹如何在ASM中實現分布式跟蹤。

背景資訊

分布式跟蹤是一種用於對應用程式進行概要分析和監視的方法,尤其是適用於使用微服務架構構建的應用程式。使用服務網格時,Istio代理Envoy可以自動產生和發送Span資訊,但為了確保這些 Span 能正確關聯到同一個跟蹤中,應用程式仍然需要傳播相應的HTTP標題。在代理髮送Span時,應用程式必須收集特定的標題並將其從傳入請求傳播到所有傳出請求。OpenTelemetry支援不同的傳播器,在不同的傳播器中,特定的標題格式定義也有所不同,以下列出了OpenTelemetry支援的傳播器以及對應的標題。

B3傳播器

  • x-request-id

  • x-b3-traceid

  • x-b3-spanid

  • x-b3-parentspanid

  • x-b3-sampled

  • x-b3-flags

  • x-ot-span-context

W3C Trace Context傳播器

  • traceparent

  • tracestate

說明

ASM在1.18.0.124版本之前預設採用的B3傳播器,之後預設採用W3C Trace Context傳播器。

前提條件

樣本解析

在Bookinfo書評應用中,以Python語言實現的productpage服務使用了OpenTracing庫,並利用B3傳播器標題格式從HTTP請求中提取了所需的標題。

def getForwardHeaders(request):
    headers = {}
    # x-b3-*** headers can be populated using the opentracing span
    span = get_current_span()
    carrier = {}
    tracer.inject(
        span_context=span.context,
        format=Format.HTTP_HEADERS,
        carrier=carrier)
    headers.update(carrier)
    # ...

    incoming_headers = ['x-request-id']

    # ...

    for ihdr in incoming_headers:
        val = request.headers.get(ihdr)
        if val is not None:
            headers[ihdr] = val
    return headers

以Java語言實現的reviews服務是也可以看到使用了B3傳播器的HTTP標題。

@GET
@Path("/reviews/{productId}")
public Response bookReviewsById(@PathParam("productId") int productId,
                            @HeaderParam("end-user") String user,
                            @HeaderParam("x-request-id") String xreq,
                            @HeaderParam("x-b3-traceid") String xtraceid,
                            @HeaderParam("x-b3-spanid") String xspanid,
                            @HeaderParam("x-b3-parentspanid") String xparentspanid,
                            @HeaderParam("x-b3-sampled") String xsampled,
                            @HeaderParam("x-b3-flags") String xflags,
                            @HeaderParam("x-ot-span-context") String xotspan) {

  if (ratings_enabled) {
    JsonObject ratingsResponse = getRatings(Integer.toString(productId), user, xreq, xtraceid, xspanid, xparentspanid, xsampled, xflags, xotspan);

訪問樣本

在瀏覽器地址欄輸入http://{入口網關服務的IP地址}/productpage,可以看到Bookinfo應用的頁面。

查看應用列表

應用列表頁面展示了所有被監控應用的健康度得分、本日請求數、本日錯誤數等關鍵計量。您還可以為應用設定自訂標籤,從而通過標籤進行篩選。

  1. 登入可觀測鏈路OpenTelemetry版控制台

  2. 在左側導覽列,單擊應用列表,然後在頁面上方,選擇目標地區。應用列表

查看應用詳情

應用詳情頁面可展示應用在所部屬的每一台機器上的關鍵效能指標、調用拓撲圖和調用鏈路。

  1. 登入可觀測鏈路OpenTelemetry版控制台

  2. 在左側導覽列,單擊應用列表,然後在頁面上方選擇目標地區,單擊目標應用程式名稱。

  3. 在左側導覽列,單擊應用詳情,在左側的機器列表中單擊全部或一台以IP地址標識的機器。

    您可以在概覽頁簽查看調用拓撲圖和關鍵效能指標;在調用鏈路頁簽查看該應用在所選機器上的調用鏈路列表,按耗時降序排列,最多可列出100個調用鏈路。調用鏈路

查看調用鏈瀑布圖

調用鏈路的瀑布圖展示了調用鏈路的日誌產生時間、狀態、IP址/機器名稱、服務名、時間軸等資訊。

  1. 應用詳情頁面,單擊調用鏈路頁簽,然後單擊目標鏈路的Trace ID。

  2. 在新彈出的調用鏈路頁面,查看該調用鏈路的瀑布圖。

    說明
    • IP地址欄位顯示的是IP地址還是機器名稱,取決於應用設定頁面上的顯示配置。更多資訊,請參見管理應用和標籤

    • 將滑鼠懸浮於服務名上,還可以查看該服務的時間長度、開始時間、Tag和日誌事件等資訊。更多資訊,請參見應用詳情

    瀑布圖

FAQ

為什麼在ASM中將鏈路追蹤資料擷取到可觀測鏈路OpenTelemetry版,卻仍然看不到調用鏈路?

  1. 查看鏈路推送日誌。

    1. 擷取叢集KubeConfig並通過kubectl工具串連叢集

    2. 執行以下命令,查看istio-system命名空間下tracing-on-external-zipkin的鏈路推送日誌。

      kubectl logs "$(kubectl get pods -n istio-system  -l app=tracing -o jsonpath='{.items[0].metadata.name}')" -n istio-system -c  nginx

      可以看到鏈路推送日誌的狀態代碼為406。日誌

  2. 查看額度請求數量和昨日請求數量。

    1. 登入可觀測鏈路OpenTelemetry版控制台

    2. 在左側導覽列,單擊叢集配置,查看額度請求數量和昨日請求數量。

      額度配置

    根據以上結果,可以看到服務的請求數量大於鏈路追蹤的額度請求數量。

  3. 修改額度請求數量。

    如果服務的請求數量大於鏈路追蹤的額度請求數量,上報的資料將會被丟棄,您將看不到服務的調用鏈路。您需要修改額度配置,使得額度請求數量大於服務要求數量。

    1. 在可觀測鏈路OpenTelemetry版控制台左側導覽列,單擊叢集配置

    2. 叢集配置頁簽的額度配置地區修改配置額度,使得額度請求數量大於服務要求數量,然後單擊儲存

    3. 提示對話方塊,單擊確認

為什麼traceid經過ASM網關或Sidecar後發生了改變?

該問題可能是由於發起端應用在發起請求時攜帶的特定傳播標題不全,Envoy認為追蹤資訊不完整,導致重建了傳播標題。若您希望自行產生traceid,對於B3傳播器來說,請求中至少需要攜帶x-b3-trace-id和x-b3-spanid兩個標題;對於W3C Trace Context傳播器來說,請求中至少需要攜帶traceparent標題。