istio.io/content/zh/docs/tasks/observability/distributed-tracing/sampling/index.md

7.5 KiB
Raw Blame History

title description weight keywords owner test
链路采样 了解有关如何在代理上配置链路采样的不同方法。 10
sampling
telemetry
tracing
opentelemetry
istio/wg-policies-and-telemetry-maintainers yes

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

开始之前

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

可用的链路采样配置

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

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

  3. 部署 OpenTelemetry Collector。

    {{< boilerplate start-otel-collector-service >}}

百分比采样器

{{< boilerplate telemetry-tracing-tips >}}

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

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

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

通过 MeshConfig 进行全局配置

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

{{< text syntax=bash snip_id=install_default_sampling >}} $ 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 {{< /text >}}

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

{{< text syntax=bash snip_id=enable_telemetry_no_sampling >}} $ 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 {{< /text >}}

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

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

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

{{< text syntax=yaml snip_id=none >}} apiVersion: apps/v1 kind: Deployment metadata: name: sleep spec: ... template: metadata: ... annotations: ... proxy.istio.io/config: | tracing: sampling: 20 spec: ... {{< /text >}}

Telemetry API

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

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

{{< text syntax=bash snip_id=install_without_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 {{< /text >}}

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

{{< text syntax=bash snip_id=enable_telemetry_with_sampling >}} $ kubectl apply -f - <<EOF apiVersion: telemetry.istio.io/v1 kind: Telemetry metadata: name: otel-demo spec: tracing:

  • providers:
    • name: otel-tracing randomSamplingPercentage: 10 EOF {{< /text >}}

自定义 OpenTelemetry 采样器

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

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

{{< quote >}} 驻留在代理中的采样器实现, 可以在 Envoy OpenTelemetry Samplers 中找到 。 {{< /quote >}}

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

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

{{< text syntax=yaml snip_id=none >}} 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 {{< /text >}}

优先顺序

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

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

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 一次或多次以生成链路信息。

    {{< boilerplate trace-generation >}}

清理

  1. 删除 Telemetry 资源:

    {{< text syntax=bash snip_id=cleanup_telemetry >}} $ kubectl delete telemetry otel-demo {{< /text >}}

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

    {{< text syntax=bash snip_id=none >}} $ istioctl uninstall --purge -y {{< /text >}}

  3. 卸载 OpenTelemetry Collector

    {{< text syntax=bash snip_id=cleanup_collector >}} $ kubectl delete -f @samples/open-telemetry/otel.yaml@ -n observability $ kubectl delete namespace observability {{< /text >}}