TT Lab
はじめる
学ぶ 学習パス コース

分散トレーシングが切れる場所

何を残し、何を捨てるか

TT Labで続きを見る

目標

トレースをすべて保存するとコストが賄えず、ランダムに減らすと肝心の見たいリクエストが消えます。この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にまとめてください。何をしたかではなく、なぜそうなのかを書きます。

サンプル設定を再び触るときの自分が読むと考えてください。「テールサンプリングを選んだ」は役に立たず、「ランダムはありふれたものをよく残してまれなものを失いますが、見たいのはいつもまれなほうです」は役に立ちます。