Prometheus+Grafanaでメトリクスを監視する【メトリクス収集・監視】

今回はPrometheusとGrafanaを使用してメトリクスを監視する方法をご紹介します。
なお、【メトリクス収集・監視】シリーズと題して他にも記事を投稿していきますので、併せてご確認ください。

目的

本記事では、メトリクス収集・監視の入門編として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-target1Node 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と絡めて、その辺りもご紹介できればと思います。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

1人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です