istio.io/content/zh/docs/tasks/observability/distributed-tracing/overview/index.md

3.0 KiB
Raw Blame History

title description weight keywords aliases owner test
概述 Istio 分布式追踪的概述。 1
telemetry
tracing
/zh/docs/tasks/telemetry/distributed-tracing/overview/
istio/wg-policies-and-telemetry-maintainers no

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

Istio 利用 Envoy 的分布式追踪功能提供了开箱即用的追踪集成。确切地说Istio 提供了安装各种追踪后端服务的选项,并且通过配置代理来自动发送追踪 Span 到追踪后端服务。请参阅 ZipkinJaegerLightStep 的任务文档来了解 Istio 如何与这些分布式追踪系统一起工作。

追踪上下文传递

尽管 Istio 代理能够自动发送 Span但是他们需要一些附加线索才能将整个追踪链路关联到一起。所以当代理发送 span 信息的时候,应用需要附加适当的 HTTP 请求头信息,这样才能够把多个 Span 正确的关联到同一个追踪上。

要做到这一点,应用程序从传入请求到任何传出的请求中需要包含以下请求头参数:

  • x-request-id
  • x-b3-traceid
  • x-b3-spanid
  • x-b3-parentspanid
  • x-b3-sampled
  • x-b3-flags
  • x-ot-span-context

此外,基于 OpenCensus的追踪集成,例如 Stackdriver会传输以下头文件

  • x-cloud-trace-context
  • traceparent
  • grpc-trace-bin

例如,如果您看 Python 的 productpage 服务这个例子,可以看到这个应用程序使用了 OpenTracing 库从 HTTP 请求中提取所需的头信息:

{{< text python >}} 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-datadog-trace-id', 'x-datadog-parent-id', 'x-datadog-sampled']

# ...

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

return headers

{{< /text >}}

在 Review 这个应用中Java使用 requestHeaders 做了类似的事情:

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

// ...

if (ratings_enabled) { JsonObject ratingsResponse = getRatings(Integer.toString(productId), requestHeaders); {{< /text >}}

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