OpenTelemetry

OpenTelemetry (OTel) 是一个与供应商无关的开源可观测性框架, 用于检测、生成、收集和导出遥测数据。 OpenTelemetry 协议 (OTLP) 链路可以发送到 Jaeger 以及许多商业服务。

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

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

此任务使用 Bookinfo 示例作为示例应用程序, 并使用 OpenTelemetry Collector 作为链路接收器。 要查看如何将链路直接发送到 OTLP 兼容后端的示例, 请参阅 Jaeger 任务

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

部署 OpenTelemetry Collector

为 OpenTelemetry Collector 创建命名空间:

Zip
$ kubectl apply -f @samples/open-telemetry/otel.yaml@ -n istio-system
$ kubectl create namespace observability

部署 OpenTelemetry Collector。 您可以使用此示例配置作为起点。

Zip
$ 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 示例生成链路

  1. 当 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
  2. 在示例中使用的 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)

清理

  1. 删除 Telemetry 资源:

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

    $ killall istioctl
  3. 卸载 OpenTelemetry Collector:

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

这些信息有用吗?
您是否有更多建议和改进意见?

感谢您的反馈!