链路采样

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

开始之前

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

可用的链路采样配置

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

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

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

百分比采样器

鼓励用户过渡到 Telemetry API 跟踪配置。

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

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

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

通过 MeshConfig 进行全局配置

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

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

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

  1. $ kubectl apply -f - <<EOF
  2. apiVersion: telemetry.istio.io/v1alpha1
  3. kind: Telemetry
  4. metadata:
  5. name: mesh-default
  6. namespace: istio-system
  7. spec:
  8. tracing:
  9. - providers:
  10. - name: otel-tracing
  11. EOF

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

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

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

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: sleep
  5. spec:
  6. ...
  7. template:
  8. metadata:
  9. ...
  10. annotations:
  11. ...
  12. proxy.istio.io/config: |
  13. tracing:
  14. sampling: 20
  15. spec:
  16. ...

Telemetry API

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

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

  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

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

  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: 10
  11. EOF

自定义 OpenTelemetry 采样器

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

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

驻留在代理中的采样器实现, 可以在 Envoy OpenTelemetry Samplers 中找到 。

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

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

  1. apiVersion: install.istio.io/v1alpha1
  2. kind: IstioOperator
  3. spec:
  4. meshConfig:
  5. extensionProviders:
  6. - name: otel-tracing
  7. opentelemetry:
  8. port: 443
  9. service: abc.live.dynatrace.com/api/v2/otlp
  10. http:
  11. path: "/api/v2/otlp/v1/traces"
  12. timeout: 10s
  13. headers:
  14. - name: "Authorization"
  15. value: "Api-Token dt0c01."
  16. dynatrace_sampler:
  17. tenant: "abc"
  18. 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 个请求:

    1. $ for i in $(seq 1 100); do curl -s -o /dev/null "http://$GATEWAY_URL/productpage"; done

清理

  1. 删除 Telemetry 资源:

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

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

    Zip

    1. $ kubectl delete -f @samples/open-telemetry/otel.yaml@ -n observability
    2. $ kubectl delete namespace observability