Prometheus×Node Exporter×Grafanaでサーバー監視ダッシュボードを構築する
この記事の概要
この記事では、Prometheus、Node Exporter、Grafanaを利用したリッチなサーバー監視システムを手軽に構成する方法を解説します。以下にPrometheusの構成図を示していますが、今回解説するのはオレンジ色の角丸四角形で囲まれた部分についてのみです。Alert Managerなどその他の機能を実装したい方は他の方の記事や公式ドキュメントをご覧ください。
本記事の対象読者
以下に当てはまる人を対象にします。
- サーバ監視に興味があるが何から手をつければいいかわからない
- Prometheusを導入してみたいが、公式ドキュメントや解説記事を読んでもよくわからない
本記事は、初心者に非常におすすめです!理由は、たった3行のコマンドでPrometheus, Node Exporter, Grafanaのセットアップが終了するからです。コマンド自体は3行ですが、それぞれの意味や本当に実行できているか確認する方法など初心者がつまづきやすい部分を丁寧にフォローしたつもりです。Grafanaの設定に関しても写真付きで詳しく解説しています。
Prometheus/Node Exporter/Grafanaの概要
Prometheusとは、システムを監視したりアラートを飛ばしたりするためのオープンソースのツールキットです。Prometheusが収集したデータにアクセスするには、PromQLというクエリ言語を用います。オープンソースの可視化ツールであるGrafanaを用いることで、Prometheusサーバーにクエリを投げ取得したデータをダッシュボードに表示することができます。
手の込んだダッシュボードを自作するにはPromQLを学習する必要がありますが、構築済みのダッシュボードを用いることもできます。以下のサイトで構築済みのダッシュボードが多数公開されています。用途に合わせて利用してください。
Prometheusは、監視対象からmetricsを収集してデータベースに保存します。metricsとは、数値で表される何らかの測定値のことです。監視対象にPrometheus Exporterを設置すると、Exporterは監視対象のmetricsを収集し、Prometheusに送信します。 Exporterは、用途に合わせてさまざまな種類が存在しています。本記事で紹介するのは、Linuxシステムの状態をmetricsに変換して送信するNode Exporterです。
前提条件
- dockerがインストールされていること
- Prometheusだけはバイナリファイルによるセットアップ方法もフォローしています。
本記事のゴール
- 以下のようなサーバー監視用のダッシュボードを構築するのが本記事のゴールです。
- 主にCPUやメモリ、ネットワークトラフィックなどが監視できます。
本記事でやらないこと
- GPUの監視
- Alert Mangerの実装
本記事を終えた後
Alertmanagerの実装
Prometheusには、Slackやe-mailなどにAlertを飛ばす機能があります。それについての解説記事を書いたので、本記事を終えた後のステップアップとして参考にしていただければ幸いです。
コマンドまとめ
2回目以降に読む方や細かい説明は必要ない方向けに設定ファイルやコマンドだけを端的にまとめます。
- 本記事では、デフォルトポートを以下のように設定しています。実装環境によってこれらのポートがすでに使用されている場合は、異なるポートを使用してください。
Service | Port |
---|---|
Prometheus | 9090 |
Node Exporter | 9100 |
Grafana | 3000 |
Prometheusサーバーの設定
-
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を用いた設定
- 特に参考にした記事
- ディレクトリ構成
.
├── docker-compose.yaml
└── prometheus
└── prometheus.yml
- docker volumeを作成します。
$ sudo docker volume create metrics_data
- 上述の通りに
prometheus.yml
を修正します。 - その後、
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
バイナリファイルを用いた設定
- 公式のチュートリアルページ
-
以下のサイトから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で可視化する際に用いるダッシュボード
- 構築済みのダッシュボードを利用するために次のような設定を行います。また、以下に公式のドキュメントを示します。
- ログイン後、トップページから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という機能を用いて実装できます。以下の記事が参考になると思います。
Discussion