链路采样
Istio 提供了多种配置链路采样的方法。 在此页面中,您将学习并了解所有配置采样的不同方式。
开始之前
- 确保您的应用程序按照此处描述的方式传播链路追踪标头。
可用的链路采样配置
百分比采样器:选择用于链路生成的请求百分比的随机采样率。
自定义 OpenTelemetry 采样器:自定义采样器实现,必须与
OpenTelemetryTracingProvider
进行配对。部署 OpenTelemetry Collector。
为 OpenTelemetry Collector 创建命名空间:
$ kubectl apply -f @samples/open-telemetry/otel.yaml@ -n istio-system $ kubectl create namespace observability
部署 OpenTelemetry Collector。您可以使用此示例配置作为起点:
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
然后通过 Telemetry 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
proxy.istio.io/config
Pod 注解 {#pod-annotation-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:
...
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/v1
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 示例生成链路
当 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
清理
删除 Telemetry 资源:
$ kubectl delete telemetry otel-demo
使用 control-C 或下面命令删除可能仍在运行的任何
istioctl
进程:$ istioctl uninstall --purge -y
卸载 OpenTelemetry Collector:
$ kubectl delete -f @samples/open-telemetry/otel.yaml@ -n observability $ kubectl delete namespace observability