追蹤取樣

Istio 提供了多種方式來配置追蹤取樣。在本頁中,您將學習並了解所有不同的取樣配置方式。

開始之前

  1. 請確保您的應用程式如此處所述傳播追蹤標頭。

可用的追蹤取樣配置

  1. 百分比取樣器:針對選取用於產生追蹤的請求,設定隨機取樣率的百分比。

  2. 自訂 OpenTelemetry 取樣器:必須與 OpenTelemetryTracingProvider 配對使用的自訂取樣器實作。

  3. 部署 OpenTelemetry Collector

    • 為 OpenTelemetry Collector 建立命名空間

      $ 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

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

隨機百分比取樣器也可以透過 Telemetry API 進行配置。透過 Telemetry API,可以在各種範圍(網格範圍、命名空間或工作負載)上配置取樣,提供極大的靈活性。若要瞭解更多資訊,請參閱 Telemetry 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

然後透過 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 可以建立自訂取樣器,該取樣器可以執行更智慧和有效率的取樣決策,例如 機率取樣

然後,此類取樣器可以與 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% 的跨度,才能夠正確執行其決策。

部署 Bookinfo 應用程式

部署 Bookinfo 範例應用程式。

使用 Bookinfo 範例產生追蹤

  1. 當 Bookinfo 應用程式啟動並執行後,存取 http://$GATEWAY_URL/productpage 一次或多次,以產生追蹤資訊。

    若要查看追蹤資料,您必須將請求傳送至您的服務。請求數量取決於 Istio 的取樣率,可以使用 Telemetry API 進行配置。使用預設取樣率 1% 時,您需要至少傳送 100 個請求,才能看到第一個追蹤。若要將 100 個請求傳送至 productpage 服務,請使用以下命令

    $ 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. 使用 Ctrl-C 或

    $ istioctl uninstall --purge -y
    
  3. 解除安裝 OpenTelemetry Collector

    拉鍊
    $ kubectl delete -f @samples/open-telemetry/otel.yaml@ -n observability
    $ kubectl delete namespace observability
    
此資訊對您有幫助嗎?
您是否有任何改進建議?

感謝您的回饋!