初めてGrafanaを触るタイミングで知っておきたかったこと
本記事はShowcase Gig Advent Calendar 2022の20日目の記事です。
こんにちは。ふくさかと申します。Showcase Gigでエンジニアとして働いています。
今回は Grafana について書いていきます。
Grafanaはざっくりいうと、メトリクスのモニタリングやログの収集・探索・アラートといった、監視基盤を敷くための便利ツールです。
そしてありがたいことにOSSです。
私はShowcase Gigに入社して初めてGrafanaに触れましたが、あらためて利用開始の時点で知っておけば良かったことを書いていきます。
よろしくお願いします。
Lokiの話
Grafanaの利用シーンとして、アラートの発報を確認してログを漁ることが最も多いのではないでしょうか。
その際に、避けては通れなさそうな Loki について書いていきます。
Grafanaでは、Lokiと呼ばれるログ集約システムによってログの収集・探索が可能です。
少し具体的に言うと、
Promtail と呼ばれるエージェントが標準出力等からログを収集・ラベリングしたうえで Loki のサーバに送信
Loki は受信したログを永続化
Grafana は Loki に探索のクエリを渡して結果を可視化
といった構成となっています。
初手で必要になるのは 3. の探索にあたると思われますので、簡単に LogQL と呼ばれるクエリについて触れます。
LogQLの話
LogQLはログの探索だけではなく、抽出したログのメトリクス化が可能です。
ただし、初手で利用することはないと思われますので今回は割愛します。
よって探索のためのクエリについて触れていくのですが、ログ探索に用途を絞り込むと、書き方は非常にシンプルだったりします。
この2点を把握しておけば大丈夫です。
Log stream selector(以下セレクタ)
Log pipeline(以下パイプライン)
下記は基本的なLogQLの例文となるのですが、 {} の部分がセレクタで、| で区切ってある箇所がパイプラインにあたります。
{label1="sample1",label2="sample2"} | json | status=404
この2つをもう少しだけ深堀りしていきます。
セレクタについて
セレクタは、ログに付与されているラベルを使って絞り込みを行います。
このラベルは先述したPromtailが、Lokiサーバに送信する際、ラベリングされたものになります。
よって、どのようなラベルがあるのかは、Promtailの設定ファイル(promtail.yaml)を見れば確認できます。
ただ、LogQLをGrafana上で入力する際は、GUIでラベルを選択してクエリを生成できてしまうため、初手で確認する必要はありません。
パッと見、いったい何を指しているか見当がつかない場合は、参照すると良いと思われます。
書き方としては、例にもあるようにラベル名とその値のセットになっており、複数ある場合はカンマで区切っていきます。
ここで細かく指定して、ログをガッツリ絞り込んでおくと、クエリの実行は軽くなります。
また、例では = でラベルを指定していますが、ほかにも演算子があるので公式ドキュメントを参照の上、必要に応じて手を加えてください。
パイプラインについて
パイプラインは、ざっくり言うとセレクタで絞り込んだログに対してさらに絞り込みを行います。
具体的には、ラベルではなくログの中身で行います。
また、ログは文字列ですので、絞り込みを行う前にパースする必要があります。
ログの形式がJSONであれば、jsonパーサを使うとお手軽にパースできます。
先の例では、JSONにパースした後、 status が 404 となっているログに絞り込みを行っています。
下記のように数珠つなぎで条件を足していけば、どんどん絞り込みができます。
{label1="sample1",label2="sample2"} | json | status=404 | request_time>5
もしログがJSONではなく、ほかの形式であれば、それに合わせたパーサの利用・パースの方法をとる必要があります。
どのようなものがあるかは、公式ドキュメント を参照ください。
Grafanaの公式ドキュメントは、情報量が多くサンプルも易しいとは言えない所感です。
なる早の圧を受けながら障害の原因調査を行うと、不慣れなほど苦しい思いをします。
以上の簡単なLogQLを頭に入れて、期間の絞り込みさえできれば、いったんはストレス無くやりくりできるんじゃないでしょうか。
余談
初見で触ったGrafanaは v8.1.1 ですが、下記のようにLogQLの入力がうまくいかなかったりします。
さらに言えば、Log browserで生成されたLogQLをそのまま実行した場合は成功しますが、少しでも手を加えるとクエリのパースエラーが表示されます。
上記をエディタに貼り付けてみると、下記のように怪しげな文字が含まれています。
案の定ですが、これを削除してコピペ・実行すると成功します。
試しに v8.5.15 で挙動を確認しましたが、上記の異常は解消されておりました。
似たような挙動があるのであれば、おとなしくバージョンアップすることをお勧めします。
終わりに
お役に立てる内容なのかは微妙ではありますが、個人的には書いていて楽しかったので良かったです。
最後まで読んでいただきありがとうございました。