OpenTelemetry

完成此任务后,无论您使用什么语言、框架或平台来构建应用程序, 您都将了解如何让您的应用程序接入 OpenTelemetry 的链路追踪。

此任务使用 Bookinfo 作为示例应用程序,并使用 OpenTelemetry Collector 作为链路接收器。

要了解 Istio 如何处理链路追踪,请访问此任务的概述

部署 OpenTelemetry Collector

  • 为 OpenTelemetry Collector 创建命名空间:

    Zip

    1. $ kubectl apply -f @samples/open-telemetry/otel.yaml@ -n istio-system
    2. $ kubectl create namespace observability
  • 部署 OpenTelemetry Collector。您可以使用此示例配置作为起点: otel.yaml

    Zip

    1. $ 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 资源中。

  1. $ cat <<EOF | istioctl install -y -f -
  2. apiVersion: install.istio.io/v1alpha1
  3. kind: IstioOperator
  4. spec:
  5. meshConfig:
  6. enableTracing: true
  7. extensionProviders:
  8. - name: otel-tracing
  9. opentelemetry:
  10. port: 4317
  11. service: opentelemetry-collector.observability.svc.cluster.local
  12. resource_detectors:
  13. environment: {}
  14. EOF

通过 HTTP 导出

在此示例中,链路将通过 OTLP/HTTP 导出到 OpenTelemetry Collector。 该示例还启用了环境资源检测器。 环境检测器将环境变量 OTEL_RESOURCE_ATTRIBUTES 中的属性添加到导出的 OpenTelemetry 资源中。

  1. $ cat <<EOF | istioctl install -y -f -
  2. apiVersion: install.istio.io/v1alpha1
  3. kind: IstioOperator
  4. spec:
  5. meshConfig:
  6. enableTracing: true
  7. extensionProviders:
  8. - name: otel-tracing
  9. opentelemetry:
  10. port: 4318
  11. service: opentelemetry-collector.observability.svc.cluster.local
  12. http:
  13. path: "/v1/traces"
  14. timeout: 5s
  15. headers:
  16. - name: "custom-header"
  17. value: "custom value"
  18. resource_detectors:
  19. environment: {}
  20. EOF

通过 Telemetry API 启用网格链路追踪

通过应用以下配置启用链路:

  1. $ kubectl apply -f - <<EOF
  2. apiVersion: telemetry.istio.io/v1alpha1
  3. kind: Telemetry
  4. metadata:
  5. name: otel-demo
  6. spec:
  7. tracing:
  8. - providers:
  9. - name: otel-tracing
  10. randomSamplingPercentage: 100
  11. customTags:
  12. "my-attribute":
  13. literal:
  14. value: "default-value"
  15. EOF

部署 Bookinfo 应用程序

部署 Bookinfo 示例应用程序。

使用 Bookinfo 示例生成链路

  1. 当 Bookinfo 应用程序启动并运行时, 访问 http://$GATEWAY_URL/productpage 一次或多次以生成链路信息。

    要查看追踪数据,必须向服务发送请求。请求的数量取决于 Istio 的采样率。 采样率在安装 Istio 时设置,默认采样速率为 1%。在第一个跟踪可见之前,您需要发送至少 100 个请求。 使用以下命令向 productpage 服务发送 100 个请求:

    1. $ for i in $(seq 1 100); do curl -s -o /dev/null "http://$GATEWAY_URL/productpage"; done
  2. 在示例中使用的 OpenTelemetry Collector 被配置为将链路导出到控制台。 如果您使用示例中的 Collector 配置,则可以通过查看 Collector 日志来验证链路是否已到达。它应该包含类似以下内容:

    1. Resource SchemaURL:
    2. Resource labels:
    3. -> service.name: STRING(productpage.default)
    4. ScopeSpans #0
    5. ScopeSpans SchemaURL:
    6. InstrumentationScope
    7. Span #0
    8. Trace ID : 79fb7b59c1c3a518750a5d6dad7cd2d1
    9. Parent ID : 0cf792b061f0ad51
    10. ID : 2dff26f3b4d6d20f
    11. Name : egress reviews:9080
    12. Kind : SPAN_KIND_CLIENT
    13. Start time : 2024-01-30 15:57:58.588041 +0000 UTC
    14. End time : 2024-01-30 15:57:59.451116 +0000 UTC
    15. Status code : STATUS_CODE_UNSET
    16. Status message :
    17. Attributes:
    18. -> node_id: STRING(sidecar~10.244.0.8~productpage-v1-564d4686f-t6s4m.default~default.svc.cluster.local)
    19. -> zone: STRING()
    20. -> guid:x-request-id: STRING(da543297-0dd6-998b-bd29-fdb184134c8c)
    21. -> http.url: STRING(http://reviews:9080/reviews/0)
    22. -> http.method: STRING(GET)
    23. -> downstream_cluster: STRING(-)
    24. -> user_agent: STRING(curl/7.74.0)
    25. -> http.protocol: STRING(HTTP/1.1)
    26. -> peer.address: STRING(10.244.0.8)
    27. -> request_size: STRING(0)
    28. -> response_size: STRING(441)
    29. -> component: STRING(proxy)
    30. -> upstream_cluster: STRING(outbound|9080||reviews.default.svc.cluster.local)
    31. -> upstream_cluster.name: STRING(outbound|9080||reviews.default.svc.cluster.local)
    32. -> http.status_code: STRING(200)
    33. -> response_flags: STRING(-)
    34. -> istio.namespace: STRING(default)
    35. -> istio.canonical_service: STRING(productpage)
    36. -> istio.mesh_id: STRING(cluster.local)
    37. -> istio.canonical_revision: STRING(v1)
    38. -> istio.cluster_id: STRING(Kubernetes)
    39. -> my-attribute: STRING(default-value)

清理

  1. 删除 Telemetry 资源:

    1. $ kubectl delete telemetry otel-demo
  2. 使用 Ctrl+C 或以下命令来删除可能仍在运行的任何 istioctl 进程:

    1. $ killall istioctl
  3. 卸载 OpenTelemetry Collector:

    Zip

    1. $ kubectl delete -f @samples/open-telemetry/otel.yaml@ -n observability
    2. $ kubectl delete namespace observability
  4. 如果您不打算探索任何后续任务, 请参阅 Bookinfo 清理说明来关闭应用程序。