取樣
Jaeger 函式庫實作一致的預先(或基於頭部)取樣。例如,假設我們有一個簡單的呼叫圖,其中服務 A 呼叫服務 B,而 B 呼叫服務 C:A -> B -> C
。當服務 A 收到不包含追蹤資訊的請求時,Jaeger 追蹤器將啟動新的追蹤,為其分配隨機追蹤 ID,並根據目前安裝的取樣策略做出取樣決策。取樣決策將與對 B 和 C 的請求一起傳播,因此這些服務將不再做出取樣決策,而是會尊重頂層服務 A 所做的決策。這種方法可確保如果對追蹤進行取樣,則其所有跨度都將記錄在後端中。如果每個服務都做出自己的取樣決策,我們將很少在後端獲得完整的追蹤。
客戶端取樣組態
當使用組態物件來實例化追蹤器時,可以透過 sampler.type
和 sampler.param
屬性來選擇取樣類型。Jaeger 函式庫支援下列取樣器
- 常數 (
sampler.type=const
) 取樣器始終對所有追蹤做出相同的決策。它可以對所有追蹤進行取樣 (sampler.param=1
) 或不對其進行取樣 (sampler.param=0
)。 - 機率性 (
sampler.type=probabilistic
) 取樣器會做出隨機取樣決策,其取樣機率等於sampler.param
屬性的值。例如,使用sampler.param=0.1
,大約會對 10 個追蹤中的 1 個進行取樣。 - 速率限制 (
sampler.type=ratelimiting
) 取樣器使用洩漏桶速率限制器來確保以特定常數速率對追蹤進行取樣。例如,當sampler.param=2.0
時,它將以每秒 2 個追蹤的速率對請求進行取樣。 - 遠端 (
sampler.type=remote
,這也是預設值) 取樣器會諮詢 jaeger-agent,以取得要在目前服務中使用的適當取樣策略。這允許從 Jaeger 後端的中央組態控制服務中的取樣策略(請參閱遠端取樣),甚至動態控制(請參閱自適應取樣)。
遠端取樣
如果您的客戶端 SDK 組態為使用遠端取樣組態(請參閱遠端取樣 API),則可以透過 jaeger-collector 集中控制取樣率。在此設定中,會將描述端點及其取樣機率的取樣策略組態提供給客戶端 SDK。此組態可以透過兩種不同的方式由 jaeger-collector 產生:從檔案定期載入或根據流量動態計算。產生方法由環境變數 SAMPLING_CONFIG_TYPE
控制,可以將其設定為 file
(預設值) 或 adaptive
。
基於檔案的取樣組態
可以使用 --sampling.strategies-file
選項實例化 jaeger-collector,該選項指向包含要提供給 Jaeger 客戶端的取樣策略的檔案。該選項的值可以包含 JSON 檔案的路徑,如果檔案內容發生變更,則會自動重新載入,也可以包含 HTTP URL,系統會從該 URL 定期擷取檔案,重新載入頻率由 --sampling.strategies-reload-interval
選項控制。
如果未提供任何組態,jaeger-collector 將傳回預設機率取樣原則,所有服務的機率為 0.001 (0.1%)。
範例 strategies.json
{
"service_strategies": [
{
"service": "foo",
"type": "probabilistic",
"param": 0.8,
"operation_strategies": [
{
"operation": "op1",
"type": "probabilistic",
"param": 0.2
},
{
"operation": "op2",
"type": "probabilistic",
"param": 0.4
}
]
},
{
"service": "bar",
"type": "ratelimiting",
"param": 5
}
],
"default_strategy": {
"type": "probabilistic",
"param": 0.5,
"operation_strategies": [
{
"operation": "/health",
"type": "probabilistic",
"param": 0.0
},
{
"operation": "/metrics",
"type": "probabilistic",
"param": 0.0
}
]
}
}
service_strategies
元素定義特定於服務的取樣策略,而 operation_strategies
定義特定於操作的取樣策略。有 2 種可能的策略類型:probabilistic
和 ratelimiting
,如上文所述(注意:ratelimiting
不支援 operation_strategies
)。default_strategy
定義如果服務未包含在 service_strategies
中時傳播的全部捕捉取樣策略。
在以上範例中
- 服務
foo
的所有操作都以 0.8 的機率取樣,但操作op1
和op2
除外,它們分別以 0.2 和 0.4 的機率進行機率性取樣。 - 服務
bar
的所有操作都以每秒 5 個追蹤的速率進行速率限制。 - 任何其他服務都將以
default_strategy
定義的 0.5 的機率進行取樣。 default_strategy
也包含共用的每個操作策略。在此範例中,我們透過使用機率 0,對所有服務上的/health
和/metrics
端點停用追蹤。除非foo
和bar
服務針對這兩個操作定義了自己的策略,否則這些每個操作策略將適用於未列在組態中的任何新服務,以及foo
和bar
服務。
自適應取樣
自 Jaeger v1.27 起。
自適應取樣在 jaeger-collector 中運作,方法是觀察從服務接收的跨度,並重新計算每個服務/端點組合的取樣機率,以確保收集的追蹤量符合 --sampling.target-samples-per-second
。偵測到新的服務或端點時,它最初會以 --sampling.initial-sampling-probability
進行取樣,直到收集到足夠的資料來計算適用於流經端點的流量的速率。
自適應取樣需要儲存後端來儲存觀察到的流量資料和計算的機率。目前,memory
(適用於多合一部署)、cassandra
、badger
、elasticsearch
和 opensearch
支援作為取樣儲存後端。
依預設,自適應取樣將嘗試使用 SPAN_STORAGE_TYPE
指定的後端來儲存資料。但是,也可以使用 SAMPLING_STORAGE_TYPE
指定第二種類型的後端。例如,SPAN_STORAGE_TYPE=elasticsearch SAMPLING_STORAGE_TYPE=cassandra ./jaeger-collector
將以嘗試將其跨度資料儲存在已設定的 elasticsearch 叢集中,並將其自適應取樣資料儲存在已設定的 cassandra 叢集中的模式下執行 jaeger-collector。請注意,此功能不能用於將跨度和自適應取樣資料儲存在同一類型的兩個不同後端中。
請閱讀此部落格文章 ,以取得有關自適應取樣引擎的更多詳細資訊。