總覽
分散式追蹤讓使用者能夠追蹤在多個服務之間分散的網格中的請求。這允許透過視覺化更深入地了解請求延遲、序列化和並行性。
Istio 利用 Envoy 的分散式追蹤功能,提供開箱即用的追蹤整合。具體來說,Istio 提供了安裝各種追蹤後端,並設定代理程式自動將追蹤跨度傳送到它們的選項。請參閱關於 Istio 如何與這些追蹤系統協作的 Zipkin、Jaeger 和 Lightstep 工作文件。
追蹤上下文傳播
雖然 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);
當您在應用程式中進行下游呼叫時,請確保包含這些標頭。