Cloud Trace 和 Cloud Service Mesh

Cloud Trace 是一个分布式跟踪系统,该系统可从应用中收集延迟数据并近乎实时地显示这些数据。它可让您通过分布式系统跟踪示例请求、观察网络调用,并对系统进行端到端分析。

可以在以下平台上安装的 Cloud Service Mesh 使用 Cloud Trace:

  • GKE on Google Cloud
  • 本地 GKE Enterprise 集群(如果您使用 Cloud Service Mesh 证书授权机构进行安装)

请注意,Cloud Trace 默认处于停用状态。启用后,Google Cloud 控制台中的 Cloud Service Mesh 页面提供了指向 Cloud Trace 页面中的跟踪记录的链接。如需详细了解价格信息,请参阅 Cloud Trace 价格页面

启用 Cloud Trace

本部分介绍如何启用 Cloud Trace。

受管理 (TD)

本部分介绍如何在使用代管式 Cloud Service Mesh 控制平面的 Cloud Service Mesh 上启用 Cloud Trace。

  1. 运行以下命令以启用 Cloud Trace:

    cat <<EOF | kubectl apply -n istio-system -f -
    apiVersion: telemetry.istio.io/v1alpha1
    kind: Telemetry
    metadata:
       name: enable-cloud-trace
       namespace: istio-system
    spec:
       tracing:
       - providers:
         - name: stackdriver
    EOF
    

受管理 (Istiod)

本部分介绍如何在 Cloud Service Mesh 上使用代管式 Istiod 控制平面启用 Cloud Trace。

  1. 运行以下命令:

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    data:
       mesh: |-
          defaultConfig:
            tracing:
              stackdriver: {}
    kind: ConfigMap
    metadata:
       name: istio-release-channel
       namespace: istio-system
    EOF
    

    其中,release-channel 是您的发布渠道asm-managedasm-managed-stableasm-managed-rapid)。

  2. 运行以下命令以查看 configmap:

    kubectl get configmap istio-release-channel -n istio-system -o yaml
    
  3. 如需验证 Cloud Trace 是否已启用,请确保 mesh: 部分中显示以下行:

    ...
    apiVersion: v1
    data:
       mesh: |
       ....
       defaultConfig:
          tracing:
             stackdriver:{}
    ...
    
  4. 重启代理。

    请注意,跟踪器配置是代理引导配置的一部分,因此每个 pod 需要重启并重新注入才能获取跟踪器更新。例如,您可以使用以下命令重启属于某个部署的 pod:

    kubectl rollout restart deployment -n NAMESPACE DEPLOYMENT_NAME

集群内

本部分介绍如何在集群内控制平面中启用 Cloud Service Mesh 上的 Cloud Trace。

如需启用 Cloud Trace,请使用以下叠加文件重新部署客户管理的控制平面。如需详细了解叠加文件,请参阅关于叠加文件

默认

运行以下命令以启用 Cloud Trace:

 ./asmcli install \
    OTHER_FLAGS \
    --option cloud-trace

此命令会应用以下叠加文件,以使用默认选项启用跟踪功能。请注意,默认采样率为 1%。如果您要覆盖默认值,则必须改用 --custom-overlay

 apiVersion: install.istio.io/v1alpha1
 kind: IstioOperator
 spec:
   meshConfig:
     enableTracing: true
   values:
     global:
       proxy:
         tracer: stackdriver

如需查看选项列表,请参阅 anthos-service-mesh 软件包。

自定义

您可以通过指定 tracing.sampling 值来覆盖默认值。值必须在 0.0 到 100.0 的范围内,且精确率为 0.01。例如,如需跟踪每 10,000 个请求中的 5 个,请使用 0.05。

以下示例展示了 100% 的采样率(仅用于演示或问题排查目的)。

 apiVersion: install.istio.io/v1alpha1
 kind: IstioOperator
 spec:
   meshConfig:
     enableTracing: true
     defaultConfig:
        tracing:
        sampling: 100
   values:
     global:
       proxy:
         tracer: stackdriver

运行以下命令以启用 Cloud Trace:

 ./asmcli install \
    OTHER_FLAGS \
    --custom_overlay PATH_TO_FILE

请注意,跟踪器配置是代理引导配置的一部分,因此 pod 需要重启并重新注入才能获取跟踪器更新。使用以下命令重启属于某个部署的 pod:

kubectl rollout restart deployment -n NAMESPACE DEPLOYMENT_NAME

跟踪上下文传播

虽然 Sidecar 代理可以自动发送跟踪记录 span,但它们需要一些提示来将整个跟踪记录关联在一起。应用需要传播适当的 HTTP 标头,以便在代理发送 span 信息时,span 可以正确地关联到单个跟踪记录中。

为此,应用需要从传入请求中收集相应标头并将其传播到任何传出请求:Cloud Service Mesh Stackdriver 跟踪配置将接受以下任意标头格式,并传播以下所有格式:

  • B3(x-b3-traceidx-b3-spanidx-b3parentspanidx-b3-sampledx-b3-flags
  • W3C TraceContext (traceparent)
  • Google Cloud Trace (x-cloud-trace-context)
  • gRPC TraceBin (grpc-trace-bin)

这意味着您的应用可以使用其中任何一种格式来传播跟踪上下文,生成跟踪记录,并设置为适当的 Stackdriver。

示例

以下是原始请求带有 traceparent 标头的示例 HTTP-Get 请求。请注意代理添加的其他跟踪记录上下文标头。

$ kubectl exec -it sleep-557747455f-n6flv -- curl "httpbin:8000/anything?freeform=" -H "accept: application/json" -H "Traceparent: 00-7543d15e09e5d61801d4f74cde1269b8-604ef051d35c5b3f-01" -vv
*   Trying 10.12.3.52:8000...
* Connected to httpbin (10.12.3.52) port 8000 (#0)
> GET /anything?freeform= HTTP/1.1
> Host: httpbin:8000
> User-Agent: curl/7.80.0-DEV
> accept: application/json
> Traceparent: 00-7543d15e09e5d61801d4f74cde1269b8-604ef051d35c5b3f-01
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< server: envoy
< date: Wed, 10 Nov 2021 20:36:04 GMT
< content-type: application/json
< content-length: 1032
< access-control-allow-origin: *
< access-control-allow-credentials: true
< x-envoy-upstream-service-time: 5
<
{
  "args": {
    "freeform": ""
  },
  "data": "",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/json",
    "Grpc-Trace-Bin": "AAB1Q9FeCeXWGAHU90zeEmm4AaDHmGRtdM7wAgE",
    "Host": "httpbin:8000",
    "Traceparent": "00-7543d15e09e5d61801d4f74cde1269b8-a0c798646d74cef0-01",
    "User-Agent": "curl/7.80.0-DEV",
    "X-B3-Sampled": "1",
    "X-B3-Spanid": "a0c798646d74cef0",
    "X-B3-Traceid": "7543d15e09e5d61801d4f74cde1269b8",
    "X-Cloud-Trace-Context": "7543d15e09e5d61801d4f74cde1269b8/11585396123534413552;o=1",
    "X-Envoy-Attempt-Count": "1",
    "X-Forwarded-Client-Cert": "<REDACTED>"
  },
  "json": null,
  "method": "GET",
  "origin": "127.0.0.6",
  "url": "http://httpbin:8000/anything?freeform="
}

请注意,在返回的请求标头集中,存在完整的跟踪上下文标头集。

如需查看更多传播标头的示例,请参阅跟踪上下文传播

使用自定义 ID 从客户端创建跟踪记录

如要从具有自定义 ID 的客户端创建跟踪记录,请使用 curl 命令创建包含外部客户端的请求,并强制其显示跟踪记录。例如:

curl $URL --header "x-client-trace-id: 105445aa7843bc8bf206b12000100000"

如需详细了解 x-client-trace-id,请参阅 Envoy 文档

访问跟踪记录

查看服务的跟踪记录示例

如需查看应用中服务的跟踪记录采样,请按以下步骤操作:

  1. 前往 Google Cloud 控制台中的 Cloud Service Mesh 页面

    前往 Cloud Service Mesh 页面

  2. 服务下,选择要检查的服务的名称。

    以下屏幕截图显示了 frontend Service 的示例。

    Cloud Service Mesh 跟踪记录图表

  3. 请求跟踪记录下,点击任何跟踪记录可查看详细信息。

    以下屏幕截图显示了跟踪请求子面板的示例。

    Cloud Service Mesh 跟踪记录子面板

查看所有跟踪记录

如需查看 Service 的所有跟踪记录,请按照以下步骤操作:

  1. 前往 Google Cloud 控制台中的 Cloud Service Mesh 页面

    前往 Cloud Service Mesh 页面

  2. 服务下,选择要检查的服务的名称。

  3. 转到指标页面。

  4. 时间范围下拉菜单中指定一个时间范围,或使用时间轴设置自定义范围

  5. 点击查看跟踪记录

Cloud Service Mesh 中的服务跟踪记录包含以下信息:

  • 网格中不同服务之间的请求延迟时间。
  • HTTP 请求属性,包括 ID、网址、大小、延迟时间和协议。
  • 服务名称、命名空间和网格 ID(分别作为 istio.canonical_serviceistio.namespaceistio.mesh_id 标签的一部分)。

后续步骤