總覽

分散式追蹤讓使用者能夠追蹤在多個服務之間分散的網格中的請求。這允許透過視覺化更深入地了解請求延遲、序列化和並行性。

Istio 利用 Envoy 的分散式追蹤功能,提供開箱即用的追蹤整合。具體來說,Istio 提供了安裝各種追蹤後端,並設定代理程式自動將追蹤跨度傳送到它們的選項。請參閱關於 Istio 如何與這些追蹤系統協作的 ZipkinJaegerLightstep 工作文件。

追蹤上下文傳播

雖然 Istio 代理程式可以自動傳送跨度,但需要額外資訊才能將這些跨度加入單一追蹤。應用程式必須在 HTTP 標頭中傳播此資訊,以便在代理程式傳送跨度時,後端可以將它們合併到單一追蹤中。

為此,每個應用程式必須從每個傳入請求收集標頭,並將標頭轉發到該傳入請求觸發的所有傳出請求。要轉發的標頭的選擇取決於配置的追蹤後端。要轉發的標頭集合在每個追蹤後端特定的任務頁面中描述。以下是摘要

所有應用程式都應轉發以下標頭

  • x-request-id:這是一個 Envoy 特有的標頭,用於一致地取樣日誌和追蹤。

對於 Zipkin、Jaeger 和 Stackdriver,應轉發 B3 多標頭格式

  • x-b3-traceid
  • x-b3-spanid
  • x-b3-parentspanid
  • x-b3-sampled
  • x-b3-flags

這些標頭受到 Zipkin、Jaeger 和許多其他工具的支援。

對於 Datadog,應轉發以下標頭。對於許多語言和框架,轉發這些標頭由 Datadog 客戶端程式庫自動處理。

  • x-datadog-trace-id.
  • x-datadog-parent-id.
  • x-datadog-sampling-priority.

對於 Lightstep,應轉發 OpenTracing 跨度上下文標頭

  • x-ot-span-context

對於 Stackdriver,您可以選擇使用以下任何一個標頭,而不是 B3 多標頭格式。

  • grpc-trace-bin:標準 grpc 追蹤標頭。
  • traceparent:W3C 追蹤上下文標準,用於追蹤。受到 OpenTelemetry 和越來越多的 Jaeger 客戶端程式庫的支援。
  • x-cloud-trace-context:由 Google Cloud 產品 API 使用。

例如,如果您查看範例 Python productpage 服務,您會看到應用程式使用 OpenTracing 程式庫從 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',
        'x-ot-span-context',
        'x-datadog-trace-id',
        'x-datadog-parent-id',
        'x-datadog-sampling-priority',
        'traceparent',
        'tracestate',
        'x-cloud-trace-context',
        'grpc-trace-bin',
        'user-agent',
        'cookie',
        'authorization',
        'jwt',
    ]

    # ...

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

    return headers

reviews 應用程式 (Java) 使用 requestHeaders 執行類似的操作

@GET
@Path("/reviews/{productId}")
public Response bookReviewsById(@PathParam("productId") int productId, @Context HttpHeaders requestHeaders) {

  // ...

  if (ratings_enabled) {
    JsonObject ratingsResponse = getRatings(Integer.toString(productId), requestHeaders);

當您在應用程式中進行下游呼叫時,請確保包含這些標頭。

此資訊是否有用?
您有任何改進建議嗎?

感謝您的回饋!