はじめに

現代のシステム運用において、サーバーやアプリケーションの状態を把握する「監視」は不可欠な要素です。その中でも、オープンソースの組み合わせであるPrometheusとGrafanaは、モダンな監視スタックとしてデファクトスタンダードの地位を確立しています。

Prometheusがメトリクス(監視データ)の収集と保存を担当し、Grafanaがそのデータを人間が見やすい美しいグラフやダッシュボードに可視化します。この強力なコンビを使いこなすことで、システムの健全性を維持し、問題の早期発見に繋げることができます。

この記事では、Dockerを使用してローカル環境にPrometheusとGrafanaによる監視基盤を構築し、サーバーの基本的なリソース(CPU, メモリ, ディスクなど)を監視するまでの手順を、初中級者向けに分かりやすく解説します。

PrometheusとNode Exporterのセットアップ

まず、監視の心臓部となるPrometheusと、サーバーのメトリクスを収集・公開するエージェントであるNode Exporterをセットアップします。Node Exporterは、OSやハードウェアの様々な情報をPrometheusが取得可能な形式でHTTPエンドポイントとして公開します。

今回は、これらのコンポーネントをDocker Composeで簡単に起動します。以下の内容でdocker-compose.ymlファイルを作成してください。node-exporterは監視対象のホスト情報を取得するため、network_mode: hostを指定しています。

version: '3.8'

services:
  prometheus:
    image: prom/prometheus:v2.45.0
    container_name: prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'

  node_exporter:
    image: prom/node-exporter:v1.6.1
    container_name: node_exporter
    network_mode: host
    pid: host
    volumes:
      - '/:/host:ro,rslave'

次に、Prometheusがどのターゲットからメトリクスを収集するかを定義する設定ファイルprometheus.ymlを作成します。今回はローカルで起動するNode Exporter(デフォルトポートは9100)を指定します。

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'node_exporter'
    static_configs:
      - targets: ['localhost:9100']

ファイルが準備できたらdocker-compose up -dコマンドでコンテナを起動します。http://localhost:9090にアクセスし、Prometheusの管理画面が表示されれば成功です。

Grafanaのセットアップとデータソース設定

次に、収集したデータを可視化するためのGrafanaをセットアップします。先ほどのdocker-compose.ymlにGrafanaのサービス定義を追加しましょう。

version: '3.8'

services:
  prometheus:
    # ... (変更なし)

  node_exporter:
    # ... (変更なし)

  grafana:
    image: grafana/grafana:9.5.3
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana-storage:/var/lib/grafana

volumes:
  grafana-storage: {}

ファイルを更新したら、再度docker-compose up -dを実行してGrafanaを起動します。初回起動時はイメージのダウンロードに少し時間がかかります。起動後、http://localhost:3000にアクセスしてください。初期ユーザー名とパスワードは両方ともadminです。ログイン後、パスワードの変更を求められます。

ログインできたら、Prometheusをデータソースとして登録します。左側のメニューから歯車アイコン(Configuration)→「Data Sources」を選択し、「Add data source」ボタンをクリックします。リストから「Prometheus」を選び、設定画面でHTTPのURLにhttp://prometheus:9090と入力します。Dockerの内部ネットワークを利用するため、コンテナ名であるprometheusをホスト名として指定するのがポイントです。最後に「Save & Test」をクリックし、「Data source is working」と表示されれば接続完了です。

Grafanaでダッシュボードを作成する

データソースの接続が完了したら、いよいよダッシュボードを作成してサーバーの状態を可視化します。Grafanaの強力な機能の一つに、コミュニティによって作成・公開されているダッシュボードを簡単にインポートできる機能があります。

今回は、Node Exporterのための非常に高機能なダッシュボードである「Node Exporter Full」をインポートしてみましょう。まず、左側メニューの「+」アイコン(Create)から「Import」を選択します。Grafana.comのダッシュボードIDを入力する欄に1860と入力し、「Load」ボタンをクリックします。

次の画面で、ダッシュボードの名前などを設定し、下部にある「Prometheus」の選択欄で、先ほど設定したデータソースを選択します。最後に「Import」ボタンを押すだけで、CPU使用率、メモリ使用量、ディスクI/O、ネットワークトラフィックなど、サーバーに関する詳細なメトリクスが網羅されたダッシュボードが自動で作成されます。

もちろん、自分でダッシュボードをゼロから作ることも可能です。その場合は「Create」→「Dashboard」→「Add new panel」から、PromQLというクエリ言語を使って表示したいデータを定義します。例えば、CPU使用率(アイドルでない時間)を表示するには1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m]))のようなクエリを使用します。まずはインポート機能で全体像を掴み、そこからカスタマイズしていくのがおすすめです。

まとめ

この記事では、Docker Composeを利用してPrometheus, Node Exporter, Grafanaを連携させ、基本的なサーバー監視システムを構築する手順を解説しました。特に、Grafanaのダッシュボードインポート機能を使えば、専門的な知識がなくても短時間で高品質な監視環境が手に入ることがお分かりいただけたかと思います。

今回構築したのは、あくまで監視の第一歩です。ここからさらに、以下のようなステップに進むことで、より堅牢で実践的な監視システムへと発展させることができます。

  • Alertmanagerの導入: Prometheusと連携し、CPU使用率の急増やディスク容量の逼迫といった異常事態を検知して、Slackやメールに通知する仕組みを構築します。
  • アプリケーションメトリクスの監視: WebサーバーのレスポンスタイムやAPIのエラーレートなど、アプリケーション独自のメトリクスを公開し、監視対象に加えます。
  • 他のExporterの活用: Blackbox Exporterによる外部からの死活監視や、各種データベース、ミドルウェア専用のExporterを導入し、監視範囲を広げます。

ぜひ、今回構築した環境をベースに、ご自身のシステムに合わせた監視の仕組みを作り込んでみてください。