链路采样

Istio 提供了多种配置链路采样的方法。 在此页面中,您将学习并了解所有配置采样的不同方式。

开始之前

  1. 确保您的应用程序按照此处描述的方式传播链路追踪标头。

可用的链路采样配置

  1. 百分比采样器:选择用于链路生成的请求百分比的随机采样率。

  2. 自定义 OpenTelemetry 采样器:自定义采样器实现,必须与 OpenTelemetryTracingProvider 进行配对。

  3. 部署 OpenTelemetry Collector。

    • 为 OpenTelemetry Collector 创建命名空间:

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

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

百分比采样器

随机采样率百分比使用指定的百分比值来选择要采样的请求。

采样率应在 0.0 至 100.0 范围内,精度为 0.01。 例如,要跟踪每 10000 个请求中的 5 个请求,请使用 0.05 作为此处的值。

您可以通过三种方式配置随机采样率:

通过 MeshConfig 进行全局配置

随机百分比采样可以通过 MeshConfig 进行全局配置。

$ cat <<EOF | istioctl install -y -f -
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    enableTracing: true
    defaultConfig:
      tracing:
        sampling: 10
    extensionProviders:
    - name: otel-tracing
      opentelemetry:
        port: 4317
        service: opentelemetry-collector.observability.svc.cluster.local
        resource_detectors:
          environment: {}
EOF

然后通过 Telemetry API 启用链路追踪提供程序。 请注意,我们在这里不对 randomSamplingPercentage 进行设置。

$ kubectl apply -f - <<EOF
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
  name: mesh-default
  namespace: istio-system
spec:
  tracing:
  - providers:
    - name: otel-tracing
EOF

proxy.istio.io/config Pod 注解 {#pod-annotation-proxy.istio.io/config}

您可以将 proxy.istio.io/config 注解添加到 Pod 元数据规范中, 以覆盖任何网格范围的采样设置。

例如,要覆盖上面的网格范围的采样,您可以将以下内容添加到 Pod 清单中:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sleep
spec:
  ...
  template:
    metadata:
      ...
      annotations:
        ...
        proxy.istio.io/config: |
          tracing:
            sampling: 20
    spec:
      ...

Telemetry API

随机百分比采样器也可以通过 Telemetry API 进行配置。 通过 Telemetry API,可以在各种范围内配置采样:网格范围、命名空间或工作负载,提供了极大的灵活性。 要了解更多信息,请参阅 Telemetry API 文档。

安装 Istio,并且不在 defaultConfig 中设置 sampling

$ 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

然后通过 Telemetry API 启用链路追踪提供程序并设置 randomSamplingPercentage

$ kubectl apply -f - <<EOF
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
   name: otel-demo
spec:
  tracing:
  - providers:
    - name: otel-tracing
    randomSamplingPercentage: 10
EOF

自定义 OpenTelemetry 采样器

OpenTelemetry 规范定义了 Sampler API。 Sampler API 支持构建自定义采样器,该采样器可以执行更智能、更高效的采样决策, 例如 Probability Sampling(概率采样)

然后,此类采样器可以与 OpenTelemetryTracingProvider 配对。

当前在 Istio 中的自定义采样器配置:

自定义采样器通过 Meshconfig 进行配置。以下是配置 Dynatrace 采样器的示例:

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    extensionProviders:
    - name: otel-tracing
      opentelemetry:
        port: 443
        service: abc.live.dynatrace.com/api/v2/otlp
        http:
          path: "/api/v2/otlp/v1/traces"
          timeout: 10s
          headers:
            - name: "Authorization"
              value: "Api-Token dt0c01."
        dynatrace_sampler:
          tenant: "abc"
          cluster_id: 123

优先顺序

通过多种配置采样的方法,了解每种方法的优先顺序非常重要。

使用随机百分比采样器时,优先顺序为:

Telemetry API > Pod 注解 > MeshConfig

这意味着,如果在上述所有内容中都定义了一个值, 则 Telemetry API 中的值就是被选定的值。

配置自定义 OpenTelemetry 采样器时,优先顺序为:

自定义 OTel 采样器 > (Telemetry API | Pod 注解 | MeshConfig

这意味着,如果配置了自定义 OpenTelemetry 采样器,它将覆盖所有其他方式。 此外,随机百分比值被设置为 100 且不可更改。 这很重要,因为自定义采样器需要接收 100% 的 Span 才能正确执行其决策。

部署 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
        

清理

  1. 删除 Telemetry 资源:

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

    $ istioctl uninstall --purge -y
    
  3. 卸载 OpenTelemetry Collector:

    Zip
    $ kubectl delete -f @samples/open-telemetry/otel.yaml@ -n observability
    $ kubectl delete namespace observability
    
这些信息有用吗?
您是否有更多建议和改进意见?

感谢您的反馈!