OpenTelemetry
OpenTelemetry (OTel) 是一个与供应商无关的开源可观测性框架, 用于检测、生成、收集和导出遥测数据。 OpenTelemetry 协议 (OTLP) 链路可以发送到 Jaeger 以及许多商业服务。
要了解 Istio 如何处理链路追踪,请访问此任务的概述。
完成此任务后,无论您使用什么语言、框架或平台来构建应用程序, 您都将了解如何让您的应用程序接入 OpenTelemetry 的链路追踪。
此任务使用 Bookinfo 示例作为示例应用程序, 并使用 OpenTelemetry Collector 作为链路接收器。 要查看如何将链路直接发送到 OTLP 兼容后端的示例, 请参阅 Jaeger 任务。
要了解 Istio 如何处理链路追踪,请访问此任务的概述。
部署 OpenTelemetry Collector
为 OpenTelemetry Collector 创建命名空间:
$ kubectl apply -f @samples/open-telemetry/otel.yaml@ -n istio-system
$ kubectl create namespace observability
部署 OpenTelemetry Collector。 您可以使用此示例配置作为起点。
$ kubectl apply -f @samples/open-telemetry/otel.yaml@ -n observability
安装
所有链路追踪选项都可以通过 MeshConfig
进行全局配置。
为了简化配置,建议创建一个 YAML 文件,
您可以将其传递到 istioctl install -f
命令。
选择 Exporter
Istio 可以被配置为通过 gRPC 或 HTTP 导出 OpenTelemetry Protocol(OTLP)链路。 一次只能配置一个 Exporter(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
通过 Telemetry 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 的采样率。 采样率在安装 Istio 时设置,默认采样速率为 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)
清理
删除 Telemetry 资源:
$ 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 清理说明来关闭应用程序。