Prometheus/Loki/Grafanaによる観測基盤(構築記録はPhase 2 Observability実践マニュアルを参照)を、実際に日常運用する際の操作手順をまとめたページです。「どうやってGrafanaを開くのか」「Slack通知はどう設定するのか」「新しい監視ルールはどう作るのか」を、つまずきやすいポイントとあわせて記録しています。
1. Grafanaへ接続する
Grafanaの外部公開(境界ファイアウォール経由)は現状うまく通っていないため、SSHのローカルポートフォワードで接続する。
どこにも接続していない、まっさらな端末画面を用意する
Windowsのスタートメニューから、新しくコマンドプロンプト(またはPowerShell)を開く。すでに他のサーバーへSSH接続しているウィンドウを使い回さないこと(既存の接続の中でこのコマンドを打つと、二重接続になり正しく動作しない)。
SSHで接続する
ssh -L 3000:localhost:3000 <ユーザー名>@<Grafanaサーバーのアドレス>
接続後もこのウィンドウは閉じない(閉じると転送も切れる)。プロンプトがサーバー側([ユーザー名@ホスト名 ~]$のような表示)に変わっていれば接続できている。
ブラウザでアクセスする
接続したまま、ブラウザで http://localhost:3000/ を開く。Grafanaのログイン画面が表示される。
「Address already in use」と出た場合
これは「そのポートは既に使われている」という意味で、多くの場合接続先を間違えているサイン。すでにサーバーへ接続した状態のウィンドウの中で、もう一度同じSSHコマンドを打ってしまっている可能性が高い。一度exitで接続をすべて終了し、STEP 1からやり直す。
2. ログを検索する(Explore)
- 左メニューの「Explore」をクリック
- 画面左上のデータソース選択(初期値は「Prometheus」)を「Loki」に切り替える
- クエリ入力欄の右上にある「Builder」/「Code」の切り替えで「Code」を選ぶと、検索条件(LogQL)を直接テキストで入力できる
- 例えば
{job=~"fortigate|apache|systemd-journal"}のように入力し、右上の「Run query」をクリック
複数の機器・サーバーのログが時系列で横断表示される。
3. Slack通知の設定(ゼロから)
Slack側でWebhookを発行する
- api.slack.com/apps にアクセスし、「Create New App」→「From scratch」
- アプリ名を入力し、通知を送りたいワークスペースを選択
- 左メニューの「Incoming Webhooks」を開き、右上のトグルをON
- 「Add New Webhook to Workspace」をクリックし、投稿先チャンネルを選んで許可
- 発行された
https://hooks.slack.com/services/...形式のWebhook URLを控える
Webhook URLの扱い
このURLを知っていれば誰でもそのチャンネルに投稿できてしまう。チャットやメール、コード管理システムなどに平文で残さないこと。
GrafanaにContact Pointとして登録する
- 左メニューの「Alerting」→「Contact points」→「+ Add contact point」
- 名前を入力し、「Integration」で「Slack」を選択
- 「Webhook URL」欄に、STEP 1で発行したURLを貼り付ける
- 「Save contact point」で保存
テスト送信で疎通確認する
作成したContact Pointの「Edit」を開き、右上の「Test」ボタンから「Send test notification」を実行する。実際のアラートルールを1つも作らなくても、この時点でSlackへの疎通確認ができる。
4. アラートルールの作成手順
左メニューの「Alerting」→「Alert rules」→「+ New alert rule」から作成する。画面は上から4ステップで構成されている。
ルール名を入力する
「Name」欄に、何を検知するルールかが分かる名前を入力する(例:「Fail2ban BAN検知」)。
クエリと条件を定義する
データソースを「Loki」に切り替え、「Code」モードでLogQLクエリを入力する。以下は実際に使っている例。
例1:Fail2banによる不正アクセス遮断(BAN)の検知
count_over_time({job="fail2ban"} |= "Ban" [1m])
例2:systemdサービスの異常終了・再起動の検知
count_over_time({job="systemd-journal", container!~"grafana|loki"} |~ "Failed with result|Scheduled restart job" [1m])
観測基盤自身を除外する
GrafanaもLokiも、実行したクエリの内容をそのまま自分自身のログに書き出す。そのため「Failed with result」のような検索語をそのまま使うと、クエリ自身が自分にヒットし続ける無限ループになる。上記の例2のようにcontainer!~"grafana|loki"で観測基盤自身のログを除外すること。
「B(Reduce)」「C(Threshold)」はデフォルト(Last / Strict / IS ABOVE 0)のままでよい。
評価の頻度を設定する
- 「Folder」「Evaluation group」は、初回のみ「+ New folder」「+ New evaluation group」から新規作成する(2回目以降は既存のものを選べる)
- 評価間隔(Evaluation interval)は、通知までの速さに直結する。数秒〜数十秒での検知を狙う場合は「10s」程度に短く設定する
- 「Pending period」は「None」にすると、条件を満たした瞬間に即座に発報する
通知先を設定して保存する
「Notifications」で「Select contact point」を選び、3章で作成したContact Pointを指定する。右上の「Save rule and exit」で保存すると、以後は設定した間隔で自動的に評価され続ける。
「No data」が誤アラート化する場合
ログが0件のとき、Grafanaは「値0」ではなく「No data」として扱い、デフォルト設定だとDatasourceNoDataという別の通知が飛んでしまうことがある。ルール編集画面の「Configure no data and error handling」で、「Alert state if no data or all values are null」をNormalに変更しておくと、この誤通知を防げる。
5. よくあるつまずきポイント
- SSHの二重接続:すでにサーバーへ接続した状態のウィンドウの中で、もう一度SSHのポートフォワードコマンドを打ってしまい、「Address already in use」等のエラーになる。必ずどこにも接続していない新しいウィンドウから実行する。
- SSH接続ウィンドウを閉じてしまう:ポートフォワードはそのウィンドウを閉じると同時に切れる。翌日以降に再度Grafanaを開きたい場合は、1章の手順からやり直す。
- データソースの切り替え忘れ:Explore画面はデフォルトで「Prometheus」が選ばれている。ログを見るときは必ず「Loki」に切り替える。
- クエリ入力欄が見つからない:初期状態は「Builder」(項目選択式)になっていることが多い。テキストでクエリを直接入力したい場合は、右上の「Code」ボタンを押す。