今回はPrometheusとGrafanaを使用してメトリクスを監視する方法をご紹介します。
なお、【メトリクス収集・監視】シリーズと題して他にも記事を投稿していきますので、併せてご確認ください。
- Prometheus+Grafanaでメトリクスを監視する【メトリクス収集・監視】 ★本記事
- Pushgatewayでメトリクスをプッシュする【メトリクス収集・監視】
- Alertmanagerでアラートを通知する【メトリクス収集・監視】
- Prometheusを冗長化構成(HA構成)にする方法と注意点【メトリクス収集・監視】
目的
本記事では、メトリクス収集・監視の入門編としてPrometheus serverの導入、監視対象サーバー(Node exporter)の導入、そしてそれらのメトリクスをGrafanaで表示するための方法をご紹介します。
環境
今回の構成図・検証環境サーバーは以下の通りです。
・構成図
用途 | ホスト名 | IPアドレス |
---|---|---|
Grafanaサーバー | vm-grafana1 | 172.24.1.5/24 |
Prometheusサーバー | vm-prom1 | 172.24.1.9/24 |
監視対象サーバー(Node exporter) | vm-target1 | 172.24.1.10/24 |
上記サーバーのOS/SWは以下の通りです。
OS/SW | バージョン |
---|---|
OS | Ubuntu 22.04 LTS |
Grafana | grafana-enterprise 9.5.13 |
Prometheus | 2.53.2 LTS |
Node exporter | 1.8.2 |
Prometheusサーバーの構築・動作確認
それではPrometheusサーバーの構築を行っていきます。
ここでは特段記載のない限りvm-prom1
で操作を行います。
バイナリダウンロード・解凍
まず作業ディレクトリを作成して移動します。
# 作業ディレクトリ作成
sudo mkdir /work; sudo chown azureuser:azureuser /work; sudo chmod 777 /work
# 移動・確認
cd /work
ls -la
実行結果
azureuser@vm-prom1:~$ sudo mkdir /work; sudo chown azureuser:azureuser /work; sudo chmod 777 /work
azureuser@vm-prom1:~$
azureuser@vm-prom1:~$ cd /work
azureuser@vm-prom1:/work$ ls -la
total 8
drwxrwxrwx 2 azureuser azureuser 4096 Sep 18 15:47 .
drwxr-xr-x 20 root root 4096 Sep 18 15:47 ..
azureuser@vm-prom1:/work$
次にPrometheusサーバーのバイナリダウンロード、および、解凍をします。
# バージョン指定
VERSION=2.53.2
# ダウンロード・確認
curl -sSOL https://github.com/prometheus/prometheus/releases/download/v${VERSION}/prometheus-${VERSION}.linux-amd64.tar.gz
ls -la
# 解凍・確認
tar xf prometheus-${VERSION}.linux-amd64.tar.gz
ls -la
# 解凍先ディレクトリへの移動・確認
cd prometheus-${VERSION}.linux-amd64/
ls -la
実行結果
azureuser@vm-prom1:/work$ VERSION=2.53.2
azureuser@vm-prom1:/work$ curl -sSOL https://github.com/prometheus/prometheus/releases/download/v${VERSION}/prometheus-${VERSION}.linux-amd64.tar.gz
azureuser@vm-prom1:/work$ ls -la
total 101780
drwxrwxrwx 2 azureuser azureuser 4096 Sep 18 16:06 .
drwxr-xr-x 20 root root 4096 Sep 18 15:47 ..
-rw-rw-r-- 1 azureuser azureuser 104212702 Sep 18 16:06 prometheus-2.53.2.linux-amd64.tar.gz
azureuser@vm-prom1:/work$
azureuser@vm-prom1:/work$ tar xf prometheus-${VERSION}.linux-amd64.tar.gz
azureuser@vm-prom1:/work$ ls -la
total 101788
drwxrwxrwx 3 azureuser azureuser 4096 Sep 18 16:07 .
drwxr-xr-x 20 root root 4096 Sep 18 15:47 ..
drwxr-xr-x 4 azureuser azureuser 4096 Aug 10 00:16 prometheus-2.53.2.linux-amd64
-rw-rw-r-- 1 azureuser azureuser 104212702 Sep 18 16:06 prometheus-2.53.2.linux-amd64.tar.gz
azureuser@vm-prom1:/work$
azureuser@vm-prom1:/work$ cd prometheus-${VERSION}.linux-amd64/
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$ ls -la
total 261348
drwxr-xr-x 4 azureuser azureuser 4096 Aug 10 00:16 .
drwxrwxrwx 3 azureuser azureuser 4096 Sep 18 16:07 ..
-rw-r--r-- 1 azureuser azureuser 11357 Aug 10 00:13 LICENSE
-rw-r--r-- 1 azureuser azureuser 3773 Aug 10 00:13 NOTICE
drwxr-xr-x 2 azureuser azureuser 4096 Aug 10 00:13 console_libraries
drwxr-xr-x 2 azureuser azureuser 4096 Aug 10 00:13 consoles
-rwxr-xr-x 1 azureuser azureuser 137838575 Aug 9 23:56 prometheus
-rw-r--r-- 1 azureuser azureuser 934 Aug 10 00:13 prometheus.yml
-rwxr-xr-x 1 azureuser azureuser 129735160 Aug 9 23:56 promtool
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$
Prometheus serverのインストール
今回はPrometheusバイナリ実行用のユーザーを作成して実行することにします。
そのため、ユーザー作成と取得したバイナリを適切なディレクトリへ配置します。
まずはユーザー/グループ作成を行います。
# グループ追加
sudo groupadd prometheus
# ユーザー追加・ホームディレクトリ確認
sudo useradd prometheus -g prometheus -d /var/lib/prometheus -s /usr/sbin/nologin -m
sudo ls -la /var/lib/prometheus/
実行結果
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$ sudo groupadd prometheus
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$ sudo useradd prometheus -g prometheus -d /var/lib/prometheus -s /usr/sbin/nologin -m
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$ sudo ls -la /var/lib/prometheus/
total 20
drwxr-x--- 2 prometheus prometheus 4096 Sep 18 16:11 .
drwxr-xr-x 41 root root 4096 Sep 18 16:11 ..
-rw-r--r-- 1 prometheus prometheus 220 Jan 7 2022 .bash_logout
-rw-r--r-- 1 prometheus prometheus 3771 Jan 7 2022 .bashrc
-rw-r--r-- 1 prometheus prometheus 807 Jan 7 2022 .profile
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$
次に取得したバイナリ/設定ファイルを配置していきます。
# 実行バイナリの配置・確認
sudo cp prometheus promtool /usr/local/bin/
ls -la /usr/local/bin/prom*
# 設定ファイル、データ格納先ディレクトリ作成・確認
sudo mkdir -p /etc/prometheus /var/lib/prometheus/data
sudo chown prometheus:prometheus /var/lib/prometheus/data
sudo ls -la /etc/prometheus /var/lib/prometheus/data
# 設定ファイルなどの配置・確認
sudo cp -r prometheus.yml consoles console_libraries /etc/prometheus/
ls -la /etc/prometheus/
実行結果
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$ sudo cp prometheus promtool /usr/local/bin/
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$ ls -la /usr/local/bin/prom*
-rwxr-xr-x 1 root root 137838575 Sep 18 16:16 /usr/local/bin/prometheus
-rwxr-xr-x 1 root root 129735160 Sep 18 16:16 /usr/local/bin/promtool
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$ sudo mkdir -p /etc/prometheus /var/lib/prometheus/data
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$ sudo chown prometheus:prometheus /var/lib/prometheus/data
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$ sudo ls -la /etc/prometheus /var/lib/prometheus/data
/etc/prometheus:
total 8
drwxr-xr-x 2 root root 4096 Sep 18 16:16 .
drwxr-xr-x 98 root root 4096 Sep 18 16:16 ..
/var/lib/prometheus/data:
total 8
drwxr-xr-x 2 prometheus prometheus 4096 Sep 18 16:16 .
drwxr-x--- 3 prometheus prometheus 4096 Sep 18 16:16 ..
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$ sudo cp -r prometheus.yml consoles console_libraries /etc/prometheus/
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$ ls -la /etc/prometheus/
total 20
drwxr-xr-x 4 root root 4096 Sep 18 16:16 .
drwxr-xr-x 98 root root 4096 Sep 18 16:16 ..
drwxr-xr-x 2 root root 4096 Sep 18 16:16 console_libraries
drwxr-xr-x 2 root root 4096 Sep 18 16:16 consoles
-rw-r--r-- 1 root root 934 Sep 18 16:16 prometheus.yml
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$
Prometheus serverのサービス化と起動確認
こちらはオプションとなりますが、今回はsystemctl
コマンドで管理できるよう、Unitファイルを作成してSystemdサービス化を行います。
# Unitファイル作成
cat <<"EOF" | sudo tee /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network-online.target
[Service]
User=prometheus
WorkingDirectory=/var/lib/prometheus
ExecStart=/usr/local/bin/prometheus --config.file=/etc/prometheus/prometheus.yml --web.console.templates=/etc/prometheus/consoles --web.console.libraries=/etc/prometheus/console_libraries
ExecStop=/bin/kill -TERM ${MAINPID}
ExecReload=/bin/kill -HUP ${MAINPID}
[Install]
WantedBy=multi-user.target
EOF
実行結果
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$ cat <<"EOF" | sudo tee /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network-online.target
[Service]
User=prometheus
WorkingDirectory=/var/lib/prometheus
ExecStart=/usr/local/bin/prometheus --config.file=/etc/prometheus/prometheus.yml --web.console.templates=/etc/prometheus/consoles --web.console.libraries=/etc/prometheus/console_libraries
ExecStop=/bin/kill -TERM ${MAINPID}
ExecReload=/bin/kill -HUP ${MAINPID}
[Install]
WantedBy=multi-user.target
EOF
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network-online.target
[Service]
User=prometheus
WorkingDirectory=/var/lib/prometheus
ExecStart=/usr/local/bin/prometheus --config.file=/etc/prometheus/prometheus.yml --web.console.templates=/etc/prometheus/consoles --web.console.libraries=/etc/prometheus/console_libraries
ExecStop=/bin/kill -TERM ${MAINPID}
ExecReload=/bin/kill -HUP ${MAINPID}
[Install]
WantedBy=multi-user.target
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$
それでは正常に起動することを確認するため、サービス起動を行います。
# Unitファイルの反映・ステータス確認
sudo systemctl daemon-reload
sudo systemctl status prometheus
# サービス起動・ステータス確認
sudo systemctl start prometheus
sudo systemctl status prometheus
# サービスの自動起動有効化
sudo systemctl enable prometheus
実行結果
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$ sudo systemctl daemon-reload
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$ sudo systemctl status prometheus
○ prometheus.service - Prometheus Server
Loaded: loaded (/etc/systemd/system/prometheus.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: https://prometheus.io/docs/introduction/overview/
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$ sudo systemctl start prometheus
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$ sudo systemctl status prometheus
● prometheus.service - Prometheus Server
Loaded: loaded (/etc/systemd/system/prometheus.service; disabled; vendor preset: enabled)
Active: active (running) since Wed 2024-09-18 16:22:53 JST; 4s ago
Docs: https://prometheus.io/docs/introduction/overview/
Main PID: 19221 (prometheus)
Tasks: 6 (limit: 2263)
Memory: 17.1M
CPU: 44ms
CGroup: /system.slice/prometheus.service
└─19221 /usr/local/bin/prometheus --config.file=/etc/prometheus/prometheus.yml --web.console.templates=/etc/prometheus/consoles --web.console.libraries=/etc/prometheus/console_libraries
Sep 18 16:22:53 vm-prom1 prometheus[19221]: ts=2024-09-18T07:22:53.497Z caller=tls_config.go:316 level=info component=web msg="TLS is disabled." http2=false address=[::]:9090
Sep 18 16:22:53 vm-prom1 prometheus[19221]: ts=2024-09-18T07:22:53.497Z caller=head.go:793 level=info component=tsdb msg="WAL segment loaded" segment=0 maxSegment=0
Sep 18 16:22:53 vm-prom1 prometheus[19221]: ts=2024-09-18T07:22:53.497Z caller=head.go:830 level=info component=tsdb msg="WAL replay completed" checkpoint_replay_duration=32.001µs wal_replay_duration=1.479323m>
Sep 18 16:22:53 vm-prom1 prometheus[19221]: ts=2024-09-18T07:22:53.499Z caller=main.go:1169 level=info fs_type=EXT4_SUPER_MAGIC
Sep 18 16:22:53 vm-prom1 prometheus[19221]: ts=2024-09-18T07:22:53.499Z caller=main.go:1172 level=info msg="TSDB started"
Sep 18 16:22:53 vm-prom1 prometheus[19221]: ts=2024-09-18T07:22:53.499Z caller=main.go:1354 level=info msg="Loading configuration file" filename=/etc/prometheus/prometheus.yml
Sep 18 16:22:53 vm-prom1 prometheus[19221]: ts=2024-09-18T07:22:53.511Z caller=main.go:1391 level=info msg="updated GOGC" old=100 new=75
Sep 18 16:22:53 vm-prom1 prometheus[19221]: ts=2024-09-18T07:22:53.511Z caller=main.go:1402 level=info msg="Completed loading of configuration file" filename=/etc/prometheus/prometheus.yml totalDuration=12.228>
Sep 18 16:22:53 vm-prom1 prometheus[19221]: ts=2024-09-18T07:22:53.511Z caller=main.go:1133 level=info msg="Server is ready to receive web requests."
Sep 18 16:22:53 vm-prom1 prometheus[19221]: ts=2024-09-18T07:22:53.511Z caller=manager.go:164 level=info component="rule manager" msg="Starting rule manager..."
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$ sudo systemctl enable prometheus
Created symlink /etc/systemd/system/multi-user.target.wants/prometheus.service → /etc/systemd/system/prometheus.service.
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$
Prometheus WebUIでの確認
PrometheusにはWebUI画面が用意されているため、ここではPrometheus server自身のメトリクスが収集されており、正常に表示されることを確認します。
prometheus.ymlの確認(自分自身が収集対象であることの確認)
まずprometheus.ymlでPrometheus server自身がメトリクス収集対象になっていることを確認します。
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$ tail -n 11 /etc/prometheus/prometheus.yml
# 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=` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090"]
azureuser@vm-prom1:/work/prometheus-2.53.2.linux-amd64$
上記の通りscrape_configsにジョブ定義があり、targets: [“localhost:9090”]となっていれば自分自身が収集対象となっています。
WebUIでの確認
下記のURLでアクセスしWebUI画面が表示されることを確認します。
http://<vm-prom1のホスト名/IPアドレス>:9090/
このWebUI画面ではPromQLでメトリクス情報を検索できるので、試しにprocess_cpu_seconds_totalでCPU使用率がグラフに表示されることを確認します。
なお、Prometheus serverは下記のURLを使用してメトリクスを収集しているため、ブラウザでアクセスすると取得メトリクスが表示されます。
http://<vm-prom1のホスト名/IPアドレス>:9090/metrics
監視対象サーバーの追加
このままではPrometheusサーバー自身の監視しか行っていませんので、監視対象サーバーを追加していきます。
具体的には監視対象サーバーにNode exporter
を導入して監視します。
ここでは特段記載のない限りvm-target1
で操作を行います。
バイナリダウンロード・解凍
まず作業ディレクトリを作成して移動します。
# 作業ディレクトリ作成
sudo mkdir /work; sudo chown azureuser:azureuser /work; sudo chmod 777 /work
# 移動・確認
cd /work
ls -la
azureuser@vm-target1:~$ sudo mkdir /work; sudo chown azureuser:azureuser /work; sudo chmod 777 /work
azureuser@vm-target1:~$
azureuser@vm-target1:~$ cd /work
azureuser@vm-target1:/work$ ls -la
total 8
drwxrwxrwx 2 azureuser azureuser 4096 Sep 18 17:21 .
drwxr-xr-x 20 root root 4096 Sep 18 17:21 ..
azureuser@vm-target1:/work$
次にNode exporter
のバイナリダウンロード、および、解凍をします。
# バージョン指定
VERSION=1.8.2
# ダウンロード・確認
curl -sSOL https://github.com/prometheus/node_exporter/releases/download/v${VERSION}/node_exporter-${VERSION}.linux-amd64.tar.gz
ls -la
# 解凍・確認
tar xf node_exporter-${VERSION}.linux-amd64.tar.gz
ls -la
# 解凍先ディレクトリへの移動・確認
cd node_exporter-${VERSION}.linux-amd64/
ls -la
実行結果
azureuser@vm-target1:/work$ VERSION=1.8.2
azureuser@vm-target1:/work$ curl -sSOL https://github.com/prometheus/node_exporter/releases/download/v${VERSION}/node_exporter-${VERSION}.linux-amd64.tar.gz
azureuser@vm-target1:/work$
azureuser@vm-target1:/work$ ls -la
total 10436
drwxrwxrwx 2 azureuser azureuser 4096 Sep 18 17:23 .
drwxr-xr-x 20 root root 4096 Sep 18 17:21 ..
-rw-rw-r-- 1 azureuser azureuser 10676343 Sep 18 17:23 node_exporter-1.8.2.linux-amd64.tar.gz
azureuser@vm-target1:/work$
azureuser@vm-target1:/work$ tar xf node_exporter-${VERSION}.linux-amd64.tar.gz
azureuser@vm-target1:/work$ ls -la
total 10440
drwxrwxrwx 3 azureuser azureuser 4096 Sep 18 17:23 .
drwxr-xr-x 20 root root 4096 Sep 18 17:21 ..
drwxr-xr-x 2 azureuser azureuser 4096 Jul 14 20:58 node_exporter-1.8.2.linux-amd64
-rw-rw-r-- 1 azureuser azureuser 10676343 Sep 18 17:23 node_exporter-1.8.2.linux-amd64.tar.gz
azureuser@vm-target1:/work$
azureuser@vm-target1:/work$ cd node_exporter-${VERSION}.linux-amd64/
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$ ls -la
total 20048
drwxr-xr-x 2 azureuser azureuser 4096 Jul 14 20:58 .
drwxrwxrwx 3 azureuser azureuser 4096 Sep 18 17:23 ..
-rw-r--r-- 1 azureuser azureuser 11357 Jul 14 20:57 LICENSE
-rw-r--r-- 1 azureuser azureuser 463 Jul 14 20:57 NOTICE
-rwxr-xr-x 1 azureuser azureuser 20500541 Jul 14 20:54 node_exporter
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$
Node exporterのインストール
Prometheus server
同様、バイナリ実行用のユーザーを作成して実行することにします。
そのため、ユーザー作成と取得したバイナリを適切なディレクトリへ配置します。
まずはユーザー/グループ作成を行います。
# グループ追加
sudo groupadd prometheus
# ユーザー追加・ホームディレクトリ確認
sudo useradd prometheus -g prometheus -d /var/lib/prometheus -s /usr/sbin/nologin -m
sudo ls -la /var/lib/prometheus/
実行結果
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$ sudo groupadd prometheus
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$ sudo useradd prometheus -g prometheus -d /var/lib/prometheus -s /usr/sbin/nologin -m
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$ sudo ls -la /var/lib/prometheus/
total 20
drwxr-x--- 2 prometheus prometheus 4096 Sep 18 17:25 .
drwxr-xr-x 41 root root 4096 Sep 18 17:25 ..
-rw-r--r-- 1 prometheus prometheus 220 Jan 7 2022 .bash_logout
-rw-r--r-- 1 prometheus prometheus 3771 Jan 7 2022 .bashrc
-rw-r--r-- 1 prometheus prometheus 807 Jan 7 2022 .profile
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$
次に取得したバイナリを配置していきます。
# 実行バイナリの配置・確認
sudo cp node_exporter /usr/local/bin/
ls -la /usr/local/bin/node*
実行結果
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$ sudo cp node_exporter /usr/local/bin/
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$ ls -la /usr/local/bin/node*
-rwxr-xr-x 1 root root 20500541 Sep 18 17:27 /usr/local/bin/node_exporter
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$
Node exporterのサービス化と起動確認
こちらはオプションとなりますが、今回はsystemctl
コマンドで管理できるよう、Unitファイルを作成してSystemdサービス化を行います。
# Unitファイル作成
cat <<"EOF" | sudo tee /etc/systemd/system/prometheus-node-exporter.service
[Unit]
Description=Prometheus Node Exporter
Documentation=https://github.com/prometheus/node_exporter
After=network-online.target
[Service]
User=prometheus
WorkingDirectory=/var/lib/prometheus
ExecStart=/usr/local/bin/node_exporter
ExecStop=/bin/kill -TERM ${MAINPID}
ExecReload=/bin/kill -HUP ${MAINPID}
[Install]
WantedBy=multi-user.target
EOF
実行結果
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$ cat <<"EOF" | sudo tee /etc/systemd/system/prometheus-node-exporter.service
[Unit]
Description=Prometheus Node Exporter
Documentation=https://github.com/prometheus/node_exporter
After=network-online.target
[Service]
User=prometheus
WorkingDirectory=/var/lib/prometheus
ExecStart=/usr/local/bin/node_exporter
ExecStop=/bin/kill -TERM ${MAINPID}
ExecReload=/bin/kill -HUP ${MAINPID}
[Install]
WantedBy=multi-user.target
EOF
[Unit]
Description=Prometheus Node Exporter
Documentation=https://github.com/prometheus/node_exporter
After=network-online.target
[Service]
User=prometheus
WorkingDirectory=/var/lib/prometheus
ExecStart=/usr/local/bin/node_exporter
ExecStop=/bin/kill -TERM ${MAINPID}
ExecReload=/bin/kill -HUP ${MAINPID}
[Install]
WantedBy=multi-user.target
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$
それでは正常に起動することを確認するため、サービス起動を行います。
# Unitファイルの反映・ステータス確認
sudo systemctl daemon-reload
sudo systemctl status prometheus-node-exporter
# サービス起動・ステータス確認
sudo systemctl start prometheus-node-exporter
sudo systemctl status prometheus-node-exporter
# サービスの自動起動有効化
sudo systemctl enable prometheus-node-exporter
実行結果
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$ sudo systemctl daemon-reload
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$ sudo systemctl status prometheus-node-exporter
○ prometheus-node-exporter.service - Prometheus Node Exporter
Loaded: loaded (/etc/systemd/system/prometheus-node-exporter.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: https://github.com/prometheus/node_exporter
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$ sudo systemctl start prometheus-node-exporter
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$ sudo systemctl status prometheus-node-exporter
● prometheus-node-exporter.service - Prometheus Node Exporter
Loaded: loaded (/etc/systemd/system/prometheus-node-exporter.service; disabled; vendor preset: enabled)
Active: active (running) since Wed 2024-09-18 17:29:58 JST; 3s ago
Docs: https://github.com/prometheus/node_exporter
Main PID: 20164 (node_exporter)
Tasks: 3 (limit: 2263)
Memory: 4.6M
CPU: 6ms
CGroup: /system.slice/prometheus-node-exporter.service
└─20164 /usr/local/bin/node_exporter
Sep 18 17:29:58 vm-target1 node_exporter[20164]: ts=2024-09-18T08:29:58.327Z caller=node_exporter.go:118 level=info collector=time
Sep 18 17:29:58 vm-target1 node_exporter[20164]: ts=2024-09-18T08:29:58.327Z caller=node_exporter.go:118 level=info collector=timex
Sep 18 17:29:58 vm-target1 node_exporter[20164]: ts=2024-09-18T08:29:58.327Z caller=node_exporter.go:118 level=info collector=udp_queues
Sep 18 17:29:58 vm-target1 node_exporter[20164]: ts=2024-09-18T08:29:58.328Z caller=node_exporter.go:118 level=info collector=uname
Sep 18 17:29:58 vm-target1 node_exporter[20164]: ts=2024-09-18T08:29:58.328Z caller=node_exporter.go:118 level=info collector=vmstat
Sep 18 17:29:58 vm-target1 node_exporter[20164]: ts=2024-09-18T08:29:58.328Z caller=node_exporter.go:118 level=info collector=watchdog
Sep 18 17:29:58 vm-target1 node_exporter[20164]: ts=2024-09-18T08:29:58.328Z caller=node_exporter.go:118 level=info collector=xfs
Sep 18 17:29:58 vm-target1 node_exporter[20164]: ts=2024-09-18T08:29:58.328Z caller=node_exporter.go:118 level=info collector=zfs
Sep 18 17:29:58 vm-target1 node_exporter[20164]: ts=2024-09-18T08:29:58.328Z caller=tls_config.go:313 level=info msg="Listening on" address=[::]:9100
Sep 18 17:29:58 vm-target1 node_exporter[20164]: ts=2024-09-18T08:29:58.328Z caller=tls_config.go:316 level=info msg="TLS is disabled." http2=false address=[::]:9100
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$ sudo systemctl enable prometheus-node-exporter
Created symlink /etc/systemd/system/multi-user.target.wants/prometheus-node-exporter.service → /etc/systemd/system/prometheus-node-exporter.service.
azureuser@vm-target1:/work/node_exporter-1.8.2.linux-amd64$
Prometheus serverのメトリクス収集先の追加
監視対象サーバーvm-target1
にNode exporter
を導入したため、Prometheus server
のメトリクス収集先にvm-target1
を追加します。
そのため、ここではvm-prom1
で操作を行います。
prometheus.ymlの変更
scrape_configs
ブロックに新たにjob_name
ブロックを追加し、新たなメトリクス収集先であるvm-target1
の情報を下記の通り追記します。
- job_name: target01
static_configs:
- targets: ['vm-target1:9100']
追記後の内容確認
azureuser@vm-prom1:/work$ tail -n 20 /etc/prometheus/prometheus.yml
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# 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=` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090"]
- job_name: target01
static_configs:
- targets: ['vm-target1:9100']
azureuser@vm-prom1:/work$
prometheus.ymlの反映
変更内容を反映するためsystemctlでサービスを再起動します。
# サービス再起動・ステータス確認
sudo systemctl restart prometheus
sudo systemctl status prometheus
実行結果
azureuser@vm-prom1:/work$ sudo systemctl restart prometheus
azureuser@vm-prom1:/work$ sudo systemctl status prometheus
● prometheus.service - Prometheus Server
Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2024-09-18 17:44:29 JST; 5s ago
Docs: https://prometheus.io/docs/introduction/overview/
Main PID: 19459 (prometheus)
Tasks: 5 (limit: 2263)
Memory: 27.5M
CPU: 70ms
CGroup: /system.slice/prometheus.service
└─19459 /usr/local/bin/prometheus --config.file=/etc/prometheus/prometheus.yml --web.console.templates=/etc/prometheus/consoles --web.console.libraries=/etc/prometheus/console_libraries
Sep 18 17:44:29 vm-prom1 prometheus[19459]: ts=2024-09-18T08:44:29.975Z caller=head.go:793 level=info component=tsdb msg="WAL segment loaded" segment=0 maxSegment=1
Sep 18 17:44:29 vm-prom1 prometheus[19459]: ts=2024-09-18T08:44:29.976Z caller=head.go:793 level=info component=tsdb msg="WAL segment loaded" segment=1 maxSegment=1
Sep 18 17:44:29 vm-prom1 prometheus[19459]: ts=2024-09-18T08:44:29.976Z caller=head.go:830 level=info component=tsdb msg="WAL replay completed" checkpoint_replay_duration=47.201µs wal_replay_duration=29.824796>
Sep 18 17:44:29 vm-prom1 prometheus[19459]: ts=2024-09-18T08:44:29.978Z caller=main.go:1169 level=info fs_type=EXT4_SUPER_MAGIC
Sep 18 17:44:29 vm-prom1 prometheus[19459]: ts=2024-09-18T08:44:29.978Z caller=main.go:1172 level=info msg="TSDB started"
Sep 18 17:44:29 vm-prom1 prometheus[19459]: ts=2024-09-18T08:44:29.978Z caller=main.go:1354 level=info msg="Loading configuration file" filename=/etc/prometheus/prometheus.yml
Sep 18 17:44:30 vm-prom1 prometheus[19459]: ts=2024-09-18T08:44:30.003Z caller=main.go:1391 level=info msg="updated GOGC" old=100 new=75
Sep 18 17:44:30 vm-prom1 prometheus[19459]: ts=2024-09-18T08:44:30.004Z caller=main.go:1402 level=info msg="Completed loading of configuration file" filename=/etc/prometheus/prometheus.yml totalDuration=25.263>
Sep 18 17:44:30 vm-prom1 prometheus[19459]: ts=2024-09-18T08:44:30.004Z caller=main.go:1133 level=info msg="Server is ready to receive web requests."
Sep 18 17:44:30 vm-prom1 prometheus[19459]: ts=2024-09-18T08:44:30.004Z caller=manager.go:164 level=info component="rule manager" msg="Starting rule manager..."
azureuser@vm-prom1:/work$
Prometheus WebUIでの確認
ここでは新しく追加したNode exporter
を導入したvm-target1
のメトリクス収集が行われていることを、Prometheus server
のWebUI画面にて確認します。
WebUIでの確認
下記のURLでアクセスし、PromQLのprocess_cpu_seconds_totalでCPU使用率をグラフに表示します。
http://<vm-prom1のホスト名/IPアドレス>:9090/
そうすると、Node exporter
を導入したvm-target1
のメトリクスも収集・表示されていることが分かります。
なお、Prometheus serverと同様に、Node exporterを導入したサーバーでは下記のURLを公開しており、それにPrometheus serverがアクセスしてメトリクスを収集しているため、下記URLをブラウザでアクセスすると取得メトリクスが表示されます。
http://<vm-target1のホスト名/IPアドレス>:9100/metrics
Grafanaの構築・メトリクス表示
それでは、いよいよGrafanaでメトリクス表示していきます。
Grafanaの構築
Grafanaのインストールについては、簡易ではありますが以前書いたブログをご参照ください。
Grafana利用DBをSQLiteからPostgreSQLに変更する【Grafana運用管理】#Grafanaの構築
Grafanaでメトリクス表示
Prometheusデータソースの作成
下記の通り、Prometheusデータソースの設定を行い、Save & test
で正常に保存されることを確認してください。
Name:任意の名前を付けてください。
HTTP > URL:http://<vm-prom1のホスト名/IPアドレス>:9090
ダッシュボード作成・メトリクス表示
下記の通り、先ほど作成したデータソースを対象にダッシュボードを作成してメトリクスが表示されることを確認します。(ここでは今までと同じprocess_cpu_seconds_totalを表示します。)
終わりに
いまやメトリクス収集・監視といえばPrometheusがデファクトスタンダードと言っても過言ではないですが、
本番運用、特に冗長化やHA構成にする場合は色々と考慮点が必要になってきます。
今後、GrafanaファミリーのMimirと絡めて、その辺りもご紹介できればと思います。