👻

Prometheus×Node Exporter×Grafanaでサーバー監視ダッシュボードを構築する

2023/03/12に公開

この記事の概要

この記事では、Prometheus、Node Exporter、Grafanaを利用したリッチなサーバー監視システムを手軽に構成する方法を解説します。以下にPrometheusの構成図を示していますが、今回解説するのはオレンジ色の角丸四角形で囲まれた部分についてのみです。Alert Managerなどその他の機能を実装したい方は他の方の記事や公式ドキュメントをご覧ください。

本記事の対象読者

以下に当てはまる人を対象にします。

  • サーバ監視に興味があるが何から手をつければいいかわからない
  • Prometheusを導入してみたいが、公式ドキュメントや解説記事を読んでもよくわからない

本記事は、初心者に非常におすすめです!理由は、たった3行のコマンドでPrometheus, Node Exporter, Grafanaのセットアップが終了するからです。コマンド自体は3行ですが、それぞれの意味や本当に実行できているか確認する方法など初心者がつまづきやすい部分を丁寧にフォローしたつもりです。Grafanaの設定に関しても写真付きで詳しく解説しています。

Prometheus/Node Exporter/Grafanaの概要

https://prometheus.io/docs/introduction/overview/

Prometheusとは、システムを監視したりアラートを飛ばしたりするためのオープンソースのツールキットです。Prometheusが収集したデータにアクセスするには、PromQLというクエリ言語を用います。オープンソースの可視化ツールであるGrafanaを用いることで、Prometheusサーバーにクエリを投げ取得したデータをダッシュボードに表示することができます。

https://grafana.com/grafana/

手の込んだダッシュボードを自作するにはPromQLを学習する必要がありますが、構築済みのダッシュボードを用いることもできます。以下のサイトで構築済みのダッシュボードが多数公開されています。用途に合わせて利用してください。

https://grafana.com/grafana/dashboards/

Prometheusは、監視対象からmetricsを収集してデータベースに保存します。metricsとは、数値で表される何らかの測定値のことです。監視対象にPrometheus Exporterを設置すると、Exporterは監視対象のmetricsを収集し、Prometheusに送信します。 Exporterは、用途に合わせてさまざまな種類が存在しています。本記事で紹介するのは、Linuxシステムの状態をmetricsに変換して送信するNode Exporterです。

https://prometheus.io/docs/guides/node-exporter/

前提条件

  • dockerがインストールされていること
    • Prometheusだけはバイナリファイルによるセットアップ方法もフォローしています。

本記事のゴール

  • 以下のようなサーバー監視用のダッシュボードを構築するのが本記事のゴールです。
    • 主にCPUやメモリ、ネットワークトラフィックなどが監視できます。

本記事でやらないこと

  • GPUの監視
  • Alert Mangerの実装

本記事を終えた後

Alertmanagerの実装

Prometheusには、Slackやe-mailなどにAlertを飛ばす機能があります。それについての解説記事を書いたので、本記事を終えた後のステップアップとして参考にしていただければ幸いです。

https://zenn.dev/aobaiwaki/articles/5b1655bde00230

コマンドまとめ

2回目以降に読む方や細かい説明は必要ない方向けに設定ファイルやコマンドだけを端的にまとめます。

  • 本記事では、デフォルトポートを以下のように設定しています。実装環境によってこれらのポートがすでに使用されている場合は、異なるポートを使用してください。
Service Port
Prometheus 9090
Node Exporter 9100
Grafana 3000

Prometheusサーバーの設定

  • prometheus.ymlは全体を通して以下のものを用います。配置場所が異なることもあるのでパスの指定する際に間違えないように注意してください。
prometheus.yml
global:
  scrape_interval:     15s # By default, scrape targets every 15 seconds.

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
    monitor: 'codelab-monitor'

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s

    static_configs:
      - targets: ['{監視対象1のIPアドレス}:9100',
                  '{監視対象2のIPアドレス}:9100']
  • prometheus.yml~/prometheus/prometheus.ymlに配置されているものとします。
$ sudo docker run -d --name prometheus -p 9090:9090 \
    -v ~/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
    prom/prometheus
  • 本記事では、PrometheusサーバーがGrafanaサーバーを兼任するので、Grafanaも設定します。
$ sudo docker run -d --name=grafana -p 3000:3000 grafana/grafana-enterprise

監視対象サーバーの設定

  • 以下のコマンドでNode Exporterを起動します。
$ sudo docker run -d --name=node_exporter -p 9100:9100 prom/node-exporter

ポート解放

  • ファイアウォールをホワイトリスト方式にしている場合は、ルールを追加する必要があります。以下にIPTablesにおけるコマンドを示します。
# Prometheusの設定
$ sudo iptables -A INPUT -p tcp --dport 9090 -j ACCEPT
$ sudo iptables -A OUTPUT -p tcp --dport 9090 -j ACCEPT
# Node Exporterの設定
$ sudo iptables -A INPUT -p tcp --dport 9100 -j ACCEPT
$ sudo iptables -A OUTPUT -p tcp --dport 9100 -j ACCEPT
# Grafanaの設定
$ sudo iptables -A INPUT -p tcp --dport 3000 -j ACCEPT

Prometheusサーバーの設定

このセクションでは、docker runを用いる方法、docker-compose upを用いる方法、プレコンパイルされたバイナリファイルを用いる方法の3種類でPrometheusの設定方法を解説します。自分にとって一番やりやすい方法で設定することをお勧めします。

docker runを用いた設定

  • 公式のDocker image

  • 以下のコマンドとオプションについて説明します。

    • docker runでdocker imageを起動します。imageがローカルにない場合は、インターネット上から自動的に取得してくれます。
    • そのままだとフォアグラウンドで実行されるので、-dをつけてバックグランドで起動します。
    • -pでポートを指定します。左側がホストのポート、右側がDockerのポートです。
    • -vで設定ファイルや設定ファイルを含むディレクトリをマウントします。要するにDockerが設定ファイルにアクセスできるようにします。
    • 最後に実行するdocker imageを指定します。
# prometheus.ymlファイルをマウントする場合
sudo docker run \
    -d \
    --name prometheus \
    -p 9090:9090 \
    -v ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
    prom/prometheus
# prometheus.ymlを含むディレクトリをマウントする場合
sudo docker run \
    -d \
    --name prometheus \
    -p 9090:9090 \
    -v ./prometheus/:/etc/prometheus/ \
    prom/prometheus
  • 以下のように実行確認を行います。
$ sudo docker ps 
CONTAINER ID   IMAGE             COMMAND                   CREATED         STATUS         PORTS                                       NAMES
37b6ca93deaf   prom/prometheus   "/bin/prometheus --c…"   5 seconds ago   Up 3 seconds   0.0.0.0:9090->9090/tcp, :::9090->9090/tcp   jolly_lamport
$ curl localhost:9090
<a href="/graph">Found</a>.
  • dockerを停止するには、docker psで表示されたIDを用いて以下のようにコマンド打ちます。
$ sudo docker rm -f 37b6ca93deaf

docker-composeを用いた設定

  • 特に参考にした記事

https://qiita.com/Esfahan/items/0feaedfd771f49ac7ee4

  • ディレクトリ構成
.
├── docker-compose.yaml
└── prometheus
    └── prometheus.yml
  • docker volumeを作成します。
$ sudo docker volume create metrics_data
  • 上述の通りにprometheus.ymlを修正します。
  • その後、docker-compose.yamlを以下のように設定します。
docker-compose.yaml
version: '3'
services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    hostname: prometheus
    volumes:
      - ./prometheus:/etc/prometheus
      - metrics_data:/prometheus
    command:
      - "--config.file=/etc/prometheus/prometheus.yml"
    ports:
      - 9090:9090
    restart: always

volumes:
  metrics_data:
    external: true
  • dockerの起動
    • -dオプションを渡すことでバックグランドで実行することができます。
$ sudo docker-compose up -d
  • docker psコマンドで実行状況を確認します。以下のようになっていれば成功です。
$ sudo docker ps
CONTAINER ID   IMAGE             COMMAND                   CREATED         STATUS         PORTS                                       NAMES
1fbccbbfe103   prom/prometheus   "/bin/prometheus --c…"   5 seconds ago   Up 2 seconds   0.0.0.0:9090->9090/tcp, :::9090->9090/tcp   prometheus
  • dockerを終了する場合は、以下のコマンドを使用します。
$ sudo docker-compose down

バイナリファイルを用いた設定

  • 公式のチュートリアルページ

https://prometheus.io/docs/prometheus/latest/getting_started/

  • 以下のサイトからPrometheusの最新バージョンを調べてください。

  • 調べたリンク先のtarファイルをwgetコマンドで取得します。

$ wget https://github.com/prometheus/prometheus/releases/download/v2.43.0-rc.0/prometheus-2.43.0-rc.0.linux-amd64.tar.gz
  • その後、tarコマンドを用いてダウンロードしたファイルを解凍します。
$ tar xvfz prometheus-2.43.0-rc.0.linux-amd64.tar.gz
  • 解凍して生成されたフォルダをVSCodeなどのテキストエディターで開きます。
  • フォルダ直下のprometheus.ymlを上述の通りに設定します。
  • 以下のコマンドで Prometheusサーバーに設定ファイルを渡して起動することができます。
# フォアグランドで実行する場合
$ ./prometheus --config.file=prometheus.yml
# バックグランドで実行する場合
$ nohup ./prometheus --config.file=prometheus.yml &
  • 以下のコマンドを入力して次のように表示されればインストール成功です。
$ curl localhost:9090
<a href="/graph">Found</a>.
  • フォアグラウンドで実行した場合、Ctrl+Cでプログラムを停止できます。
  • バックグランドで実行した場合、まず以下のコマンドでプロセスIDを調べてください
$ jobs -l
[1]+ 1062985 実行中               nohup ./prometheus --config.file=prometheus.yml &
  • その後、killコマンドでプロセスを停止します。
$ kill 1062985

ちょっとハマった

  • SSHでPrometheusサーバーに接続しフォアグラウンドでプロセスを実行したのにプロセスを停止せずに切断した時に、プロセスが停止せずjobsコマンドでもプロセスが見つからず少しハマりました。以下のように解決します。
$ lsof -i
# 以下は例です。
COMMAND    PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
node    506136 <User-Name>   18u  IPv4 2062141      0t0  TCP localhost:37427 (LISTEN)
node    506136 <User-Name>   21u  IPv4 2064956      0t0  TCP localhost:37427->localhost:42652 (ESTABLISHED)
node    506536 <User-Name>   19u  IPv4 2064958      0t0  TCP localhost:37427->localhost:42658 (ESTABLISHED)
  • lsofコマンドでPID(プロセスID)が取得できます。プロセスIDさえわかればkillコマンドで終了できます。
$ kill {プロセスID}
  • 最初本当に解決法がわからなくてわざわざサーバーの再起動までしました。

監視対象のサーバーにNode Exporterを設定する

このセクションでは、docker runを用いたNode Exporterの設定方法のみをフォローしています。バイナリファイルを用いた設定を行いたい場合は公式ページを参考にしてください。

  • dockerを用いる場合は、以下のコマンド1行ですみます。
$ sudo docker run -d --name=node_exporter -p 9100:9100 prom/node-exporter
# 実行確認
$ sudo docker ps
CONTAINER ID   IMAGE                COMMAND                CREATED         STATUS         PORTS                                       NAMES
949ac00e254b   prom/node-exporter   "/bin/node_exporter"   4 seconds ago   Up 2 seconds   0.0.0.0:9100->9100/tcp, :::9100->9100/tcp   node_exporter
  • Node Exporterが送信する情報をPrometheusが動作しているサーバーで受け取る必要があります。まず、Prometheusが動作しているサーバーから監視対象のNode Exporterの情報を取得できるかチェックします。以下のように表示されれば成功です。
$ curl {監視対象のIPアドレス}:9100
<html>
  <head><title>Node Exporter</title></head>
  <body>
  <h1>Node Exporter</h1>
  <p><a href="/metrics">Metrics</a></p>
  </body>
</html>
  • Node Exporterを監視対象に設置したらPrometheusサーバーのprometheus.ymlを次のように変更します。(必要な部分だけ抜き出しています)
static_configs:
  - targets: ['{監視対象1のIPアドレス}:9100',
              '{監視対象2のIPアドレス}:9100',]

Grafanaで綺麗に可視化する

このセクションでは、docker runを用いたGrafanaの設定方法のみをフォローしています。バイナリファイルを用いた設定を行いたい場合は公式ページを参考にしてください。

Grafanaのセットアップ

  • 公式のDocker image

  • dockerを用いる場合は、以下のコマンド1行ですみます。

    • 次のdockerコマンドを実行するのはPrometheusサーバーでもそれ以外でも大丈夫です。自分の場合、PrometheusサーバーにGrafanaも立てています。
$ sudo docker run -d --name=grafana -p 3000:3000 grafana/grafana-enterprise
# 実行確認
$ sudo docker ps 
CONTAINER ID   IMAGE                        COMMAND                CREATED         STATUS         PORTS                                       NAMES
b90393b404e2   grafana/grafana-enterprise   "/run.sh"              3 minutes ago   Up 3 minutes   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp   grafana
# dockerが起動してからGrafanaが立ち上がるまではラグがあります
# しばらく待ってから以下を実行してください
$ curl {grafanaサーバーのIPアドレス}:3000
<a href="/login">Found</a>.
  • 以上が確認できればGrafanaのセットアップは完了です。

Grafanaの基本的な使い方

  • 次に基本的なGrafahaの使い方を解説します。
  • まず、ブラウザで{grafanaサーバーのIPアドレス}:3000にアクセスします。すると、次のような画面が表示されます。
    • 初回ログイン時のユーザー名およびパスワードは、adminです。予測されやすいので外部に公開する前に変更しましょう。

Node Exporterから得られた情報を綺麗に可視化

  • Node Exoprterで取得した情報をGrafanaで可視化する際に用いるダッシュボード

https://grafana.com/grafana/dashboards/1860-node-exporter-full/

  • 構築済みのダッシュボードを利用するために次のような設定を行います。また、以下に公式のドキュメントを示します。

https://grafana.com/docs/grafana/latest/dashboards/manage-dashboards/

  • ログイン後、トップページからDATA SOURCEを選択します。

  • 次に、データソースの中からPrometheusを選択します。

  • データソースに任意の名前、今回はPrometheus-Monitoring-Serverをつけます。
  • URLには、http://{PrometheusサーバーのIP}:9090を入力します。これで、GrafanaがPrometheusサーバーに対してクエリを叩いてくれるようになります。この時、GrafanaからPrometheusサーバーにアクセスできない場合、エラーが出て設定を保存できません。

  • データソースの追加後、サイドバーからダッシュボードを探し、Importを選択します。

  • 上述のNode Exporter用のダッシュボードのURLをImport via grafana.comにペーストします。これだけで、ダッシュボードをインポートすることができます。

  • 最後にダッシュボードを追加するデータソースを選択します。

  • 最後に、Loadして以下のような画面が表示されれば成功です。もしかするとLoad直後はデータが来ていない可能性もあるので、何も表示されなくてもしばらく待ってみてください。しばらく待って更新しても表示されない場合、何らかの不具合が発生している可能性があります。

最後に

本記事では、Prometheusの導入方法、Prometheus Exporterの用途と役割、Grafanaの構築済みのダッシュボードをインポートする方法を紹介しました。PrometheusもGrafana非常に多機能で紹介したいことはまだまだたくさんあるのですが、まずは基礎を抑えるという意味で本記事を執筆しました。サーバー監視をやってみたい方におすすめです。

今後の展望

本記事を終えた方は次のようなことを考えたかもしれません。

  • 計算機用サーバーのGPUの使用状況を監視したい
  • サーバーが過負荷に陥ったらアラートがSlackなどに飛ぶようにしたい

これらの機能は、それぞれGPU用のExporterやPrometheusのAlert Managerという機能を用いて実装できます。以下の記事が参考になると思います。

その他の参考記事

GitHubで編集を提案

Discussion