Dataway テールサンプリング¶
機能¶
Dataway はテールサンプリング機能を提供します。外部インターフェースは以下の通りです。
/v1/tail_sampling(raw payload;Datakit 2.10 のヘッダーレス zstd payload と互換性あり)/v1/tail_sampling_v2(従来の raw 互換パス)/v2/tail_sampling(zstd payload)/v1/tail_sampling_config
テールサンプリングは、まず Dataway 側でグループ化されたデータを受信し、サンプリングルールに基づいて保持または破棄を決定し、最終的に保持されたデータをセンターに書き込みます。
現在サポートしているデータは次の3種類です。
tracingloggingrum
基本的な処理フローは以下の通りです。
sequenceDiagram
autonumber
participant dk as Datakit/Client
participant dw as Dataway
participant ts as TailSamplingProcessor
participant kodo as Kodo
dk ->> dw: POST /v2/tail_sampling(zstd)または /v1/tail_sampling(raw)
alt config ready
dw ->> ts: ingest packet
ts ->> dw: kept packets
dw ->> kodo: write tracing/logging/rum
else config not ready
dw ->> dw: pending cache
dw -->> dk: 412 Precondition Failed
dk ->> dw: POST /v1/tail_sampling_config
dw ->> ts: update config and drain pending
end
動作モード¶
テールサンプリングと集約は同一のモード設定を共有します。
standaloneproxy
standalone¶
standalone モードでは、現在の Dataway が直接テールサンプリングデータを処理します。
- protobuf エンコードされた
aggregate.DataPacketを受信 token + data_typeに基づいてテールサンプリング設定を検索- 設定が準備完了している場合、直接
TailSamplingProcessorに書き込み - 定期的に期限切れのグループを取り出し、対応するデータタイプの書き込みインターフェースに送信
現在の実装では:
- サンプリングウィンドウの進行間隔は 1 秒
- 派生指標のリフレッシュ間隔は 1 分
- 送信フェーズでは worker pool を使用して非同期に書き出し
proxy¶
proxy モードでは、現在の Dataway はローカルにテールサンプリング状態を保持しません。
/v1/tail_sampling、/v1/tail_sampling_v2、/v2/tail_samplingはバックエンドノードに転送/v1/tail_sampling_configはすべてのバックエンドノードにブロードキャスト
そのため、proxy モードでは:
aggregator_endpointを設定する必要があります- クライアントは有効な
Guance-Pick-Keyを保持する必要があります - バックエンドノードが実際のサンプリングと状態管理を担当します
Warning
Kubernetes 環境で、前段の Dataway がテールサンプリングリクエストを特定の後段ノードに安定して転送する必要がある場合、aggregator_endpoint には安定した不変のバックエンドアドレスを指定する必要があります。この場合、後段の Dataway は StatefulSet でデプロイし、Pod アドレスと DNS 名を安定させ、前段の Dataway が固定転送できるようにすることを推奨します。
ローカル設定¶
Dataway のローカルには個別のテールサンプリング用 YAML 設定項目はありません。テールサンプリングは集約と同じモード設定を使用します。
環境変数:
説明:
standalone:現在のノードが自身でテールサンプリング状態を保持しますproxy:現在のノードは転送またはブロードキャストのみを行います
Kubernetes で、前段の Dataway を入口層、後段の Dataway を実際のテールサンプリング担当とする場合、後段のノードは StatefulSet でデプロイし、StatefulSet Pod の安定したアドレスを aggregator_endpoint に指定することを推奨します。
サンプリング設定の配信¶
テールサンプリングルールは、dataway.yaml に記述するのではなく、インターフェースを通じて配信されます。
リクエストボディは JSON で、トップレベルの構造は以下の通りです。
ここで:
traceは tracing テールサンプリング設定に対応loggingは logging テールサンプリング設定に対応rumは rum テールサンプリング設定に対応
tracing 設定例¶
{
"version": 1,
"trace": {
"version": 1,
"data_ttl": "5m",
"group_key": "trace_id",
"pipelines": [
{
"name": "keep-all",
"type": "probabilistic",
"rate": 1
}
],
"builtin_metrics": [
{
"name": "trace_total_count",
"enabled": true
}
]
}
}
説明:
trace.group_keyは現在trace_idのみ可能trace.data_ttlが空の場合はデフォルトで5mpipelinesはconditionとprobabilisticをサポートconditionはaction=keep/dropを使用probabilisticはrate=0~1を使用
logging 設定例¶
{
"version": 1,
"logging": {
"version": 1,
"data_ttl": "1m",
"group_dimensions": [
{
"group_key": "service",
"pipelines": [
{
"name": "keep-all",
"type": "probabilistic",
"rate": 1
}
]
}
]
}
}
rum 設定例¶
{
"version": 1,
"rum": {
"version": 1,
"data_ttl": "1m",
"group_dimensions": [
{
"group_key": "session_id",
"pipelines": [
{
"name": "keep-all",
"type": "probabilistic",
"rate": 1
}
]
}
]
}
}
Info
logging と rum は group_dimensions を使用してグループ化の次元を設定します。data_ttl が空の場合は、デフォルトで両方とも 1m です。
Warning
現在の実装では設定内容の検証を行います。trace では group_key=trace_id のみ許可されます。derived_metrics は現在サポートされておらず、設定するとエラーが返されます。
データレポートインターフェース¶
テールサンプリングデータのインターフェース:
説明:
/v1/tail_samplingは非圧縮の PBPoints payload を受信します。さらに、Datakit 2.10 が送信する、圧縮ネゴシエーションヘッダーなし、PayloadCompression=1の zstd packet とのみ互換性があります。/v1/tail_sampling_v2は従来の raw 互換パスであり、/v1/tail_samplingと同じ処理ロジックを経由します。zstd プロトコルパスではありません。/v2/tail_samplingは zstd payload のみを受信します。リクエストは次の両方を満たす必要があります。- header
Guance-Tail-Sampling-Payload-Compression: zstd aggregate.DataPacket.PayloadCompression=1standaloneモードでは、リクエストボディは protobuf エンコードされたaggregate.DataPacketである必要があります。proxyモードでは、リクエストはバックエンドノードに転送されます。
クライアントは以下のプロトコル組み合わせを使用する必要があります。
| クライアントシナリオ | リクエストパス | 圧縮ネゴシエーションヘッダー | PayloadCompression |
payload |
|---|---|---|---|---|
| Datakit 2.10 以前 | /v1/tail_sampling |
なし | 0 |
raw PBPoints |
| Datakit 2.10 互換パス | /v1/tail_sampling |
なし | 1 |
zstd PBPoints |
| Datakit 2.11 以降のデフォルトパス | /v2/tail_sampling |
zstd |
1 |
zstd PBPoints |
| Datakit 2.11 以降のダウンレベルパス | /v1/tail_sampling |
なし | 0 |
raw PBPoints |
よくあるレスポンスステータスコード:
| ステータスコード | 意味 |
|---|---|
200 |
packet を受信 |
400 |
protobuf、PBPoints、または packet フィールドが無効 |
412 |
対応するサンプリング設定が準備完了していないが、packet は pending cache に入った |
413 |
リクエストボディが Dataway 設定のサイズ制限を超過 |
415 |
圧縮方法がサポートされていない、またはパス、ヘッダー、packet 圧縮フィールドが一致しない |
503 |
pending cache が満杯で、packet を受信しなかった |
圧縮プロトコルとローリングアップグレード¶
Datakit 2.11 以降は、デフォルトで /v2/tail_sampling を使用して zstd payload を送信します。Dataway はパス、ヘッダー、packet 圧縮フィールドを明示的に検証します。
- 旧バージョンの Dataway は
/v2/tail_samplingを認識できず、404を返します。 - 新バージョンの Dataway は、サポートされていない圧縮方法、ヘッダー欠落、raw v2 packet、または Datakit 2.10 互換の組み合わせに該当しない v1 zstd packet を受信した場合、
415 Unsupported Media Typeを返します。 - Datakit は
404または415を受信すると、現在の packet を raw に戻し、/v1/tail_samplingで再試行し、その endpoint の legacy 能力を 10 分間キャッシュします。 - ダウンレベル送信前に、Datakit は解凍後の protobuf ボディサイズに基づいてパケットを分割し、分割可能な各 raw packet が Dataway の
MaxRawBodySizeを超えないようにします。これにより、圧縮率の高い packet が古いノードで413拒否されるのを防ぎます。 - Datakit 2.10 は zstd packet を
/v1/tail_samplingに直接送信し、ネゴシエーションヘッダーは付けません。新しい Dataway は、このリリース済みバージョンに対して正確な互換性を維持します。 - 2.10 より前の Datakit は raw v1 データを送信し続けます。新しい Dataway は span 述語を再計算し、タイムホイールに入る前に利得に基づいて圧縮するかどうかを決定します。
上記の双方向互換性により、Datakit 2.11+ と新しい Dataway へのアップグレードは、混合ローリングで行うことができます。Datakit 2.10 と、この互換性をサポートしていない古い Dataway は依然として互換性がないため、まずどちらかを互換ロジックを含むバージョンにアップグレードする必要があります。
kept パケット送信と終了時リカバリ¶
Dataway は保持が決定された packet に対して、バウンド付き worker pool とディスクオーバーフローキューを使用して送信します。
- 送信失敗時は最大 3 回のバックオフ再試行を行います。再試行を使い切った場合のみ
failure/dropとしてカウントされます。 - メモリキューが満杯になると、最初に非同期 overflow チャネルに入り、その後ディスクキューに書き込まれます。Dataway 再起動後は、既存のキューを自動的に開き、送信を継続します。
- プロセス終了時は、overflow、メモリキュー、バックオフ中の packet が優先的に正常なディスクに書き込まれます。
- ディスクが利用できない場合、終了フェーズのネットワークフォールバック再試行は 5 秒の予算を共有します。予算を使い切った packet は、明確に失敗指標としてカウントされ、集約ログが出力されます。
412 と pending cache¶
standalone モードで、Dataway が起動したばかりで、対応する token + data_type のサンプリング設定がまだ配信されていない場合:
- Dataway はまずこのデータをローカルの pending cache に格納します
- その後、
412 Precondition Failedを返します
現在の動作:
- pending cache はメモリキャッシュです
token + data_typeごとに一時保存されます- 設定の配信が成功すると、利用可能なデータは自動的に
TailSamplingProcessorにドレインされます - 現在のデフォルトの最大キャッシュ数は
100000個の packet です
規定された動作:
- クライアントは
412を受信した後、このデータは Dataway が受け取ったものと見なします - クライアントは
/v1/tail_sampling_configの送信を続行するだけで済みます - クライアントはこのデータを再送信する必要はありません
異常系:
- pending cache が満杯の場合、Dataway は
503を返します - この場合、リクエストは受信済みとは見なされません
テールサンプリング指標セット(tail_sampling)¶
テールサンプリング設定は builtin_metrics をサポートしています。これらの指標は、テールサンプリングプロセッサがサンプリング中に生成し、定期的なリフレッシュ時にセンターに書き込まれます。センターに書き込まれた後、指標セット(measurement)名は tail_sampling です。例えば、観測雲で field trace_dropped_count、tag stage/decision/data_type をクエリできます。
現在の組み込み指標は以下の通りです。
tracing¶
trace_total_counttrace_kept_counttrace_dropped_counttrace_error_countspan_total_counttrace_duration
ここで:
trace_durationは持続時間分布指標- その他はカウント指標
logging¶
logging_total_countlogging_error_countlogging_kept_countlogging_dropped_count
rum¶
rum_total_countrum_kept_countrum_dropped_count
説明:
builtin_metricsが空の場合、現在はそのデータタイプがサポートするすべての組み込み指標がデフォルトで有効になります。- これらの指標はテールサンプリング処理プロセス自体から得られるものであり、Dataway 自身の実行指標ではありません。
Dataway 自動レポート指標(指標セット dataway_aggregate)¶
サンプラー自身の builtin_metrics(tail_sampling 指標セットに書き込まれる)に加えて、apis/metrics_special.go は Dataway の自己観測指標のセットを自動的に管理し、テールサンプリング API の処理状況を記述します。この指標セットは集約されてセンターの dataway_aggregate 指標セット に入り、フィールドのプレフィックスは dataway_http_tail_sampling_* です。
現在、テールサンプリングに関連する指標は以下の通りです。
| 指標名 | 型 | タグ | 説明 |
|---|---|---|---|
dataway_http_api_body_size_bytes_total |
Counter | api, token |
テールサンプリングインターフェースのリクエストボディ累計バイト数 |
dataway_http_tail_sampling_trace_total |
Counter | token |
受信した tracing グループ数 |
dataway_http_tail_sampling_span_total |
Counter | token |
受信した tracing span 総数 |
dataway_http_tail_sampling_packet_stage_total |
Counter | token, data_type, stage, result |
各フェーズのグループ数(receive/ingest/decision/submit/kodo) |
dataway_http_tail_sampling_point_stage_total |
Counter | token, data_type, stage, result |
各フェーズのポイント数 |
dataway_http_tail_sampling_rule_packet_total |
Counter | token, data_type, rule_name, rule_index, rule_type, action, result |
ヒットしたサンプリングルールごとのグループ数 |
dataway_http_tail_sampling_rule_point_total |
Counter | 同上 | ルールごとのポイント数 |
dataway_http_tail_sampling_packet_send_total |
Counter | token, data_type, result |
送信結果統計、result には success、failure、drop が含まれます |
dataway_http_tail_sampling_submit_queue_event_total |
Counter | token, data_type, result |
送信キューへのエンキュー結果(memory/wait/overflow/disk/drop/closed) |
dataway_http_tail_sampling_submit_queue_depth |
Gauge | - | 送信キューの現在の深さ(滞留) |
dataway_http_tail_sampling_submit_queue_capacity |
Gauge | - | 送信キューの容量 |
dataway_http_tail_sampling_submit_worker_total |
Gauge | - | 現在のワーカー数 |
dataway_http_tail_sampling_submit_worker_busy |
Gauge | - | 現在のビジーワーカー数 |
dataway_http_tail_sampling_submit_disk_depth |
Gauge | - | ディスクオーバーフローキューの深さ |
dataway_http_tail_sampling_submit_queue_wait_seconds |
Summary | source |
送信キューの待機時間(source は memory/wait/overflow/disk) |
これらの指標は:
- 1 分ごとに収集
dataway_aggregate指標ポイントに変換- Dataway のデフォルト token を使用して
/v1/write/metricにレポート - レポート後に現在の累積値をリセット
- 指標内の
tokenタグはredactedに固定され、元の token の一部は保持されません
この指標セットは、Dataway 自身がテールサンプリングトラフィックを処理する際の実行状態を反映し、サンプリングルール自体のビジネス統計ではありません。
2 つのセンター指標セットの役割分担:
tail_sampling:サンプリングルールのビジネス統計(token ごとに1つ)、例:trace_kept_count/trace_dropped_countdataway_aggregate:Dataway 処理プロセスの実行状態(dataway デフォルト token で集約)、例:各フェーズのカウント、送信/滞留、ワーカー状態