概述

分布式跟踪使用户能够跟踪跨多个服务分布的网格中的请求。这可以通过可视化来更深入地了解请求延迟、序列化和并行性。

Istio 利用 Envoy 的分布式跟踪 功能,开箱即用地提供跟踪集成。具体来说,Istio 提供了安装各种跟踪后端和配置代理以自动将跟踪跨度发送到它们的选项。请参阅 ZipkinJaegerLightstep 任务文档,了解 Istio 如何与这些跟踪系统协同工作。

跟踪上下文传播

虽然 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

评论应用程序 (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);

在应用程序中进行下游调用时,请确保包含这些标头。

这些信息对您有用吗?
您有什么改进建议吗?

感谢您的反馈!