概述

分布式链路追踪可以让用户对跨多个分布式服务网格的 1 个请求进行追踪分析。 进而可以通过可视化的方式更加深入地了解请求的延迟、序列化和并行度。

Istio 利用 Envoy 的分布式链路追踪功能提供开箱即用的链路追踪集成。

现在,大多数链路追踪后端都接受 OpenTelemetry 协议来接收链路, 但 Istio 还支持 ZipkinApache SkyWalking 等项目的传统协议。

配置链路追踪

Istio 提供了 Telemetry API, 可用于配置分布式链路追踪,包括选择提供商、 设置采样率和修改标头。

扩展提供程序

扩展提供程序MeshConfig 中定义, 并允许定义链路追踪后端的配置。支持的提供程序包括 OpenTelemetry、Zipkin、SkyWalking、Datadog 和 Stackdriver。

构建应用程序以支持链路上下文传播

尽管 Istio 代理能够自动发送 span,但需要一些附加信息才能将这些 span 加到同一个调用链。 所以当代理发送 span 信息的时候,应用程序需要附加适当的 HTTP 请求头信息,这样才能够把多个 span 加到同一个调用链。

要做到这一点,每个应用程序必须从每个传入的请求中收集请求头,并将这些请求头转发到传入请求所触发的所有传出请求中。 具体选择转发哪些请求头取决于所配置的链路追踪后端,要转发的请求头在每个链路追踪系统特定的任务页面进行说明, 以下是一个汇总:

所有应用程序必须转发以下请求头:

  • x-request-id:一个 Envoy 特定的标头,用于一致地采样日志和链路。
  • traceparenttracestateW3C 标准标头

对于 Zipkin,应转发 B3 多标头格式

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

对于商业可观察性工具,请参阅其文档。

例如,如果你查看示例 Python productpage 服务, 你会看到应用程序使用 OpenTelemetry 库从 HTTP 请求中提取所有链路追踪器所需的标头:

def getForwardHeaders(request):
    headers = {}

    # 可以使用 OpenTelemetry 跨度填充 x-b3-*** 标头
    ctx = propagator.extract(carrier={k.lower(): v for k, v in request.headers})
    propagator.inject(headers, ctx)

    # ...

        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);

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

这些信息有用吗?
您是否有更多建议和改进意见?

感谢您的反馈!