OpenTelemetry
完成此任务后,您将了解如何使您的应用程序参与使用 OpenTelemetry 进行跟踪,无论您使用何种语言、框架或平台构建您的应用程序。
此任务使用 Bookinfo 示例作为示例应用程序,并使用 OpenTelemetry Collector 作为跟踪接收器。
要了解 Istio 如何处理跟踪,请访问此任务的 概述。
部署 OpenTelemetry 收集器
为 OpenTelemetry Collector 创建命名空间
$ kubectl create namespace observability
部署 OpenTelemetry Collector。您可以使用此示例配置作为起点:
otel.yaml
$ kubectl apply -f @samples/open-telemetry/otel.yaml@ -n observability
安装
所有跟踪选项都可以通过 MeshConfig
全局配置。为了简化配置,建议创建一个单独的 YAML 文件,您可以将其传递给 istioctl install -f
命令。
选择导出器
Istio 可以配置为通过 gRPC 或 HTTP 导出 OpenTelemetry Protocol (OTLP) 跟踪。一次只能配置一个导出器(gRPC 或 HTTP)。
通过 gRPC 导出
在本示例中,跟踪将通过 OTLP/gRPC 导出到 OpenTelemetry Collector。该示例还启用了 环境资源检测器。环境检测器将来自环境变量 OTEL_RESOURCE_ATTRIBUTES
的属性添加到导出的 OpenTelemetry 资源中。
$ cat <<EOF | istioctl install -y -f -
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
meshConfig:
enableTracing: true
extensionProviders:
- name: otel-tracing
opentelemetry:
port: 4317
service: opentelemetry-collector.observability.svc.cluster.local
resource_detectors:
environment: {}
EOF
通过 HTTP 导出
在本示例中,跟踪将通过 OTLP/HTTP 导出到 OpenTelemetry Collector。该示例还启用了 环境资源检测器。环境检测器将来自环境变量 OTEL_RESOURCE_ATTRIBUTES
的属性添加到导出的 OpenTelemetry 资源中。
$ cat <<EOF | istioctl install -y -f -
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
meshConfig:
enableTracing: true
extensionProviders:
- name: otel-tracing
opentelemetry:
port: 4318
service: opentelemetry-collector.observability.svc.cluster.local
http:
path: "/v1/traces"
timeout: 5s
headers:
- name: "custom-header"
value: "custom value"
resource_detectors:
environment: {}
EOF
通过遥测 API 为网格启用跟踪
通过应用以下配置启用跟踪
$ kubectl apply -f - <<EOF
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: otel-demo
spec:
tracing:
- providers:
- name: otel-tracing
randomSamplingPercentage: 100
customTags:
"my-attribute":
literal:
value: "default-value"
EOF
部署 Bookinfo 应用
部署 Bookinfo 示例应用程序。
使用 Bookinfo 示例生成跟踪
当 Bookinfo 应用程序启动并运行后,访问
http://$GATEWAY_URL/productpage
一次或多次以生成跟踪信息。要查看跟踪数据,您必须向您的服务发送请求。请求数量取决于 Istio 的采样率,可以使用 遥测 API 配置。默认采样率为 1%,您需要发送至少 100 个请求才能看到第一个跟踪。要向
productpage
服务发送 100 个请求,请使用以下命令$ for i in $(seq 1 100); do curl -s -o /dev/null "http://$GATEWAY_URL/productpage"; done
示例中使用的 OpenTelemetry Collector 被配置为将跟踪导出到控制台。如果您使用的是示例 Collector 配置,您可以通过查看 Collector 日志来验证跟踪是否已到达。它应该包含类似以下内容
Resource SchemaURL: Resource labels: -> service.name: STRING(productpage.default) ScopeSpans #0 ScopeSpans SchemaURL: InstrumentationScope Span #0 Trace ID : 79fb7b59c1c3a518750a5d6dad7cd2d1 Parent ID : 0cf792b061f0ad51 ID : 2dff26f3b4d6d20f Name : egress reviews:9080 Kind : SPAN_KIND_CLIENT Start time : 2024-01-30 15:57:58.588041 +0000 UTC End time : 2024-01-30 15:57:59.451116 +0000 UTC Status code : STATUS_CODE_UNSET Status message : Attributes: -> node_id: STRING(sidecar~10.244.0.8~productpage-v1-564d4686f-t6s4m.default~default.svc.cluster.local) -> zone: STRING() -> guid:x-request-id: STRING(da543297-0dd6-998b-bd29-fdb184134c8c) -> http.url: STRING(http://reviews:9080/reviews/0) -> http.method: STRING(GET) -> downstream_cluster: STRING(-) -> user_agent: STRING(curl/7.74.0) -> http.protocol: STRING(HTTP/1.1) -> peer.address: STRING(10.244.0.8) -> request_size: STRING(0) -> response_size: STRING(441) -> component: STRING(proxy) -> upstream_cluster: STRING(outbound|9080||reviews.default.svc.cluster.local) -> upstream_cluster.name: STRING(outbound|9080||reviews.default.svc.cluster.local) -> http.status_code: STRING(200) -> response_flags: STRING(-) -> istio.namespace: STRING(default) -> istio.canonical_service: STRING(productpage) -> istio.mesh_id: STRING(cluster.local) -> istio.canonical_revision: STRING(v1) -> istio.cluster_id: STRING(Kubernetes) -> my-attribute: STRING(default-value)
清理
删除遥测资源
$ kubectl delete telemetry otel-demo
使用 Ctrl+C 或以下命令删除可能仍在运行的任何
istioctl
进程$ killall istioctl
卸载 OpenTelemetry Collector
$ kubectl delete -f @samples/open-telemetry/otel.yaml@ -n observability $ kubectl delete namespace observability
如果您不打算探索任何后续任务,请参考 Bookinfo 清理 说明以关闭应用程序。