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

Grafana — ダッシュボードは問いだ

順位を問う質問は折れ線グラフでは受け取れない

TT Labで続きを見る

一言でいうと

「どれがいちばん悪いのか」は順位を問う質問で、順位には折れ線グラフが答えられません。テーブルと変換が、その質問を受け止める道具です。

なぜ必要なのか

障害対応会議で最もよく出る質問は、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つにだけ、オーバーライドで付けます。最後に、まだ折れ線グラフのまま残っている順位のパネルを、自分でテーブルに変えて提出します。