何を残し、何を捨てるか
目標
トレースをすべて保存するとコストが賄えず、ランダムに減らすと肝心の見たいリクエストが消えます。この2つの間を数字で決めます。
用意するもの
/opt/lab/trace/spans.jsonl 요청 1만 건 (지속 시간·상태·서비스)
mkdir -p /root/trace && cp /opt/lab/trace/* /root/trace/ && cd /root/trace
head -2 spans.jsonl
残すもの
01-shape.txt 분포와 오류 건수
02-head.txt 무작위 1% 가 남기는 것
03-tail.txt 오류·느린 것을 전부 남길 때
04-cost.txt 저장 비용
05-memory.txt 꼬리 표본의 숨은 비용
06-decide.md 우리가 쓸 규칙
07-notes.md 왜 그런지
まず分布を見る
spans.jsonlの総件数・p50・p95・p99・エラー件数を求めて01-shape.txtに残し、この分布の形を1行で書いてください。
python3 - <<'PY'
import json
d = sorted(json.loads(l)['duration_ms'] for l in open('spans.jsonl'))
n = len(d)
print(n, d[n//2], d[int(n*0.95)], d[int(n*0.99)])
PY
平均は、この分布では何も教えてくれません。大部分が速くごく少数がとても遅い形なので、平均はその2つの間の、誰も経験しない値になります。
ランダム1%は何を見逃すか
全体からランダムに1%を選び、そのサンプルにp99を超えるリクエストとエラーが何件残るかを02-head.txtに残してください。ランダムなサンプルが何を見逃すかを書きます。
import random; random.seed(7)
sample = random.sample(rows, len(rows)//100)
100件前後が残り、そのうちp99を超えるものは1、2個のはずです。
障害調査で必要なのは、まさにその1、2個です。ランダムなサンプルは、ありふれたものはよく残し、まれなものを失います。ところが、見たいのはいつもまれなほうです。
終わったあとに選ぶ
エラーはすべて、p99を超えるものもすべて、残りは1%で選んだときの保管件数を03-tail.txtに残し、ランダム1%と比べて何倍かを書いてください。
リクエストが終わったあとに判断するため、テールサンプリング(tail sampling)と呼びます。
エラー129件+p99超過(エラーではないもの)+残りの1%を足します。300件前後になります。ランダム1%の3倍ほどですが、見たいものは1つも失っていません。
サンプル率はそのままコストである
トレース1つが4KBだとして、毎秒1,000リクエスト・保持30日を基準に、(1)すべて保存、(2)ランダム1%、(3)テールサンプリングの保存量を計算して04-cost.txtに残してください。
毎秒のリクエスト数×86,400×保持日数×1件あたりのサイズ×サンプル率です。
すべて保存すると、1日でも大きな数字になります。この計算を先にしないで「とりあえず全部オンにしよう」と始めると、翌月の請求書で気づきます。
テールサンプリングの隠れたコスト
テールサンプリングを行うには、コレクターが何をいつまで保持している必要があるかと、そのとき必要なメモリを見積もって、05-memory.txtに残してください。
リクエストが終わって初めて、遅いかエラーかがわかります。そのため、コレクターはそのリクエストのすべてのspanを終わるまでメモリに保持している必要があります。
必要なメモリ≈毎秒のリクエスト数×平均所要時間(秒)×1件あたりのサイズ。
この数字が大きければコレクターを複数台に分ける必要がありますが、そのときは同じtraceのspanが同じコレクターに届かなければ判断できません。それがテールサンプリングの運用が難しくなる点です。
ルールとして書く
サービスで使うサンプルのルールを06-decide.mdに書いてください。エラーをどう扱うか・遅いとみなすしきい値・残りの割合を数字で決め、それぞれの理由もあわせて書きます。
「適当にサンプリングする」はルールではありません。次の人がそのまま設定に移せて初めてルールです。
しきい値をp99にするか固定値(例: 1秒)にするかも決めてください。p99はサービスが遅くなると一緒に上がるため、遅くなっている最中には何も引っかからないことがあります。
次に読む人へ
ここで見たものの中から4つ以上を選んで07-notes.mdにまとめてください。何をしたかではなく、なぜそうなのかを書きます。
サンプル設定を再び触るときの自分が読むと考えてください。「テールサンプリングを選んだ」は役に立たず、「ランダムはありふれたものをよく残してまれなものを失いますが、見たいのはいつもまれなほうです」は役に立ちます。