追踪采样

Istio 提供多种方法来配置追踪采样。在本页中,您将学习和了解所有不同的采样配置方式。

开始之前

  1. 确保您的应用程序传播追踪标头,如此处所述。

可用的追踪采样配置

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

  2. 自定义 OpenTelemetry 采样器:必须与 OpenTelemetryTracingProvider 配合使用的自定义采样器实现。

  3. 部署 OpenTelemetry 收集器

    • 为 OpenTelemetry 收集器创建命名空间

      $ kubectl create namespace observability
          
    • 部署 OpenTelemetry 收集器。您可以使用此示例配置作为起点:otel.yaml

      压缩

      $ 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

然后通过遥测 API 启用跟踪提供程序。请注意,我们此处不设置randomSamplingPercentage

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

Pod 注解 proxy.istio.io/config

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

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

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

遥测 API

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

在不设置defaultConfig内的sampling的情况下安装 Istio

$ 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

然后通过遥测 API 启用跟踪提供程序并设置randomSamplingPercentage

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

自定义 OpenTelemetry 采样器

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

然后可以将此类采样器与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

优先级顺序

有多种配置采样的方法,因此了解每种方法的优先级顺序非常重要。

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

遥测 API > Pod 注解 > MeshConfig

这意味着,如果在上述所有内容中都定义了值,则选择遥测 API上的值。

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

自定义 OTel 采样器 > (遥测 API | Pod 注解 | MeshConfig)

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

部署 Bookinfo 应用程序

部署Bookinfo示例应用程序。

使用 Bookinfo 示例生成追踪

  1. 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
        

清理

  1. 删除遥测资源

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

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

    压缩

    $ kubectl delete -f @samples/open-telemetry/otel.yaml@ -n observability
    $ kubectl delete namespace observability
    
此信息是否有用?
您是否有任何改进建议?

感谢您的反馈!