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。
受管理 (TD)
本部分介绍如何在使用代管式 Cloud Service Mesh 控制平面的 Cloud Service Mesh 上启用 Cloud Trace。
运行以下命令以启用 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 上启用 Cloud Trace 托管式 Istio 控制平面
运行以下命令:
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-managed
、asm-managed-stable
或asm-managed-rapid
)。运行以下命令以查看 configmap:
kubectl get configmap istio-release-channel -n istio-system -o yaml
如需验证 Cloud Trace 是否已启用,请确保
mesh:
部分中显示以下行:... apiVersion: v1 data: mesh: | .... defaultConfig: tracing: stackdriver:{} ...
重启代理。
请注意,跟踪器配置是代理引导配置的一部分,因此每个 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-traceid
、x-b3-spanid
、x-b3parentspanid
、x-b3-sampled
、x-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 文档。
访问跟踪记录
查看服务的跟踪记录示例
如需查看应用中服务的跟踪记录采样,请按以下步骤操作:
前往 Google Cloud 控制台中的 Cloud Service Mesh 页面。
在服务下,选择要检查的服务的名称。
以下屏幕截图显示了
frontend
Service 的示例。在请求跟踪记录下,点击任何跟踪记录可查看详细信息。
以下屏幕截图显示了跟踪请求子面板的示例。
查看所有跟踪记录
如需查看 Service 的所有跟踪记录,请按照以下步骤操作:
前往 Google Cloud 控制台中的 Cloud Service Mesh 页面。
在服务下,选择要检查的服务的名称。
转到指标页面。
从时间范围下拉菜单中指定一个时间范围,或使用时间轴设置自定义范围。
点击查看跟踪记录。
Cloud Service Mesh 中的服务跟踪记录包含以下信息:
- 网格中不同服务之间的请求延迟时间。
- HTTP 请求属性,包括 ID、网址、大小、延迟时间和协议。
- 服务名称、命名空间和网格 ID(分别作为
istio.canonical_service
、istio.namespace
和istio.mesh_id
标签的一部分)。