順位を問う質問は折れ線グラフでは受け取れない
一言でいうと
「どれがいちばん悪いのか」は順位を問う質問で、順位には折れ線グラフが答えられません。テーブルと変換が、その質問を受け止める道具です。
なぜ必要なのか
障害対応会議で最もよく出る質問は、2つのうちのどちらかです。「いつからこうなったのか」と「どれがいちばん悪いのか」です。前者は時間に沿った動きを問い、後者はある瞬間の一覧を問います。ところが、ダッシュボードはたいてい、前者にしか答えられない形で作られています。
4つのハンドラーのp95を、1つのパネルに重ねて描いたとします。値が0.216・0.219・0.229・0.233のように互いに近いと、4本の線はずっと絡み合ったままです。どの線がどのハンドラーなのかは凡例で色を探して合わせる必要があり、順位を知るには、マウスを1つの時刻に合わせて4つの値を読み、頭の中で並べ替えなければなりません。8個になると、誰もその作業をしません。ただ「どれも似ているな」と言って通り過ぎます。
これは描き方の好みの問題ではありません。質問の形と答えの形がずれているのです。順位を問う質問の答えはソートされた一覧で、ソートされた一覧を見せる形は、テーブルです。
どう動くのか
Grafanaで時系列をテーブルに移す作業は、3つの層に分かれます。1つ目はクエリです。同じPromQLでも、瞬間値クエリ(instant)で投げると系列ごとに値が1つずつ返り、区間クエリ(range)で投げると系列ごとに点が数十から数百個ずつ返ります。Prometheusデータソースのクエリエディターには、この2つを選ぶ場所と、結果をどんな形で受け取るかを選ぶ場所が、別々にあります(Prometheusクエリエディターのドキュメント)。ダッシュボードJSONでは、クエリごとにinstantとformatの2つのキーとして残ります。
区間クエリをそのままテーブルに流し込むと、行数は系列の数に点の数を掛けた分になります。系列4つで2時間を60秒間隔で見ると、4×121で484行です。誰も読めません。そこで、2つ目の層が必要になります。変換です。
| 変換 | 何をするか | テーブルでの効果 |
|---|---|---|
reduce |
系列1つを数字1つに減らします | 484行が4行になります |
organize |
列を隠し、名前を変え、順序を決めます | Fieldが핸들러(韓国語で「ハンドラー」を意味する語です)になります |
joinByField |
2つのクエリの結果を共通の列で結合します | レイテンシとリクエストレートが1行に並びます |
reduceは「系列ごとに数字1つ」を作ります。最後の値を選べば「いま」、最大値を選べば「この区間の最悪」です。3つ目の層は表示です。テーブルのセルには、色やバーを付けられますが(テーブル可視化のドキュメント)、ここにルールが1つあります。色はしきい値のある数値列にだけ付けます。ハンドラー名の列にまで色が塗られると、色は何の意味もない飾りになり、その瞬間に、ほかの場所の本物の赤も一緒に力を失います。そのため、色はパネルの既定値ではなく、その列1つを指名するオーバーライドで付けます。
2つのクエリを1つのテーブルに結合する作業も、よく必要になります。「遅いハンドラーはトラフィックも多く受けているのか」は、レイテンシだけでも、リクエストレートだけでも答えられません。2つをハンドラー名で結合して1行に置いて初めて、目が関係を見られます。
現場での姿
決済チームの状態ダッシュボードには、エンドポイント12個のp99が、1つのパネルに重なっていました。事故が起きると、みんなそのパネルを開いて、「何か上がったね」までしか言いませんでした。どのエンドポイントなのかを突き止めるのに、毎回3分かかっていました。同じクエリを瞬間値で投げてテーブルに変え、p99の降順でソートしておくと、次の事故では、画面を開いて5秒で名前が出ました。クエリは1文字も変わっていません。
逆方向の間違いもあります。全体のリクエストレートのように、時間に沿った動きを問うパネルまでテーブルに変えると、かえって悪くなります。数字1つでは、昨日と同じかどうかがわかりません。テーブルに移すのは、順位を問うパネルだけです。
この環境で判定できることとできないこと
変換は、サーバーではなくブラウザーで計算されます。そのため、このPodでは、変換が適用されたテーブルが実際にどう見えるかを見る方法がありません。画像レンダラープラグインもありません。その代わり、判定は2つで行います。ダッシュボードJSONモデルに書かれたtransformations・type・optionsとクエリのinstant・format、そして、そのクエリをデータソースに実際に投げて得られた値です。列の幅や色が目にどう見えるかは、結局、Webプレビューで3000番ポートを開いて、一度見る必要があります。
次のラボですること
折れ線グラフから順位を読み取る作業を、一度自分でやってみます。過ぎた時刻を1つ固定して、4つのハンドラーのp95を降順で書き出してみると、その作業がなぜ目ではできないのかが、数字で明らかになります。次に、同じ質問をテーブルに移し、区間クエリがテーブルで何行になるかを測ってから、reduceで減らし、organizeで列を整えます。2つのクエリをjoinByFieldで結合して1つのテーブルに置き、色は、しきい値のある列1つにだけ、オーバーライドで付けます。最後に、まだ折れ線グラフのまま残っている順位のパネルを、自分でテーブルに変えて提出します。