Prometheusでデータ収集

PrometheusはPull型の監視ソフトです。
Prometheusサーバーから監視対象のサーバーに配置したexporterに対して定期的にポーリングを行い様々な情報を収集します。
exporterは取得したいデータ、アプリケーションに応じて公式/サードパーティー製が用意されていますので、必要なものを監視対象サーバーに配置します。
基本的に数値データをPullするアプリケーションですが、監視対象側からのPushにも対応するexporterも用意されています。
取得したデータの可視化はPrometheus単体でも機能として存在しますが、Grafanaを使う事例が多いようです。
また、prometheusはサービスディスカバリという機能で、AWSやAzure、kubernetesなどオートスケールするような場合でも自動的に監視対象を見つけて収集対象に追加することができます。

Prometheus

概要

Prometheusとnode_exporterのインストール、基本的な設定を行い、データを収集できるまでの手順をご紹介します。

環境

OSCentOS Linux release 8.2.2004
監視prometheus-2.19.2
監視エージェントnode_exporter-1.0.1
  • Prometheusサーバー
    • 10.14.200.10
  • クライアント(node_exporter)
    • 10.14.200.11
    • 10.14.200.12
    • 10.14.200.13
    • 10.14.200.14
    • 10.14.200.15

構築の流れ

  1. Prometheusサーバーインストール
  2. Prometheus環境設定
  3. 監視対象の指定
  4. node_exporterインストール
  5. node_exporter環境設定
  6. データ取得状況の確認

構築方法

[1] Prometheusサーバーインストール

Prometheusはバイナリファイルを配置するだけで動作可能です。
公式サイトにファイルがありますのでダウンロードします。
ダウンロードしたファイルを解凍し、作成されたディレクトリごと /usr/local/bin/ に移動させてディレクトリ名を変更します。

Prometheus DOWNLOAD

# wget https://github.com/prometheus/prometheus/releases/download/v2.19.2/prometheus-2.19.2.linux-amd64.tar.gz
# tar zxf prometheus-2.19.2.linux-amd64.tar.gz
# mv prometheus-2.19.2.linux-amd64 /usr/local/bin/prometheus
# ll /usr/local/bin/prometheus/
合計 150556
-rw-r--r-- 1 3434 3434    11357  6月 26 20:10 LICENSE
-rw-r--r-- 1 3434 3434     3184  6月 26 20:10 NOTICE
drwxr-xr-x 2 3434 3434       38  6月 26 20:10 console_libraries
drwxr-xr-x 2 3434 3434      173  6月 26 20:10 consoles
-rwxr-xr-x 1 3434 3434 88382754  6月 26 18:04 prometheus
-rw-r--r-- 1 3434 3434      926  6月 26 20:10 prometheus.yml
-rwxr-xr-x 1 3434 3434 50644081  6月 26 18:06 promtool
-rwxr-xr-x 1 3434 3434 15117787  6月 26 18:06 tsdb

UID、GIDが「3434」になってますね。

  • 各ファイルの所有者/グループ変更

Prometheusユーザ/グループを作成して、各ファイルの所有者/グループを変更します。

# useradd -s /bin/false -c "Prometheus User" prometheus
# chown -R prometheus:prometheus /usr/local/bin/prometheus
# ll -d /usr/local/bin/prometheus/
drwxr-xr-x 4 prometheus prometheus 144  6月 26 20:12 /usr/local/bin/prometheus/
# ll /usr/local/bin/prometheus/
合計 150556
-rw-r--r-- 1 prometheus prometheus    11357  6月 26 20:10 LICENSE
-rw-r--r-- 1 prometheus prometheus     3184  6月 26 20:10 NOTICE
drwxr-xr-x 2 prometheus prometheus       38  6月 26 20:10 console_libraries
drwxr-xr-x 2 prometheus prometheus      173  6月 26 20:10 consoles
-rwxr-xr-x 1 prometheus prometheus 88382754  6月 26 18:04 prometheus
-rw-r--r-- 1 prometheus prometheus      926  6月 26 20:10 prometheus.yml
-rwxr-xr-x 1 prometheus prometheus 50644081  6月 26 18:06 promtool
-rwxr-xr-x 1 prometheus prometheus 15117787  6月 26 18:06 tsdb

[2] Prometheus環境設定

  • ディレクトリ作成

今回は収集したデータの保存先として、「/var/lib/prometheus/metrics」を指定しますのでディレクトリの作成も行います。
※metricsディレクトリはPrometheus起動時に自動的に作成されるので手動での作成は不要です。

# mkdir -p /var/lib/prometheus
# chown prometheus:prometheus /var/lib/prometheus
# ll -d /var/lib/prometheus
drwxr-xr-x 2 prometheus prometheus 6  7月 22 16:14 /var/lib/prometheus

Prometheusのコンフィグファイルを配置するディレクトリを作成し、サンプルコンフィグファイルをコピーしておきます。

# mkdir /etc/prometheus
# cp -a /usr/local/bin/prometheus/prometheus.yml /etc/prometheus/
  • 起動ファイル設定

プログラムを直接起動しても動作しますが、ユニットファイルを用意してsystemdで起動するようにします。
ユニットファイルの内容は先人たちの力でネット上に散らばっていますのでお好みで作成してください。

# vi /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus
After=network.target
[Service]
User=prometheus
ExecStart=/usr/local/bin/prometheus/prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus/metrics
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
SendSIGKILL=no
Restart=always
[Install]
WantedBy=multi-user.target

daemon-reloadを実行し、systemdの変更を反映します。

# systemctl daemon-reload
  • ログファイル設定

Prometheusのログはデフォルトでmessagesに出力されてしまうので、分離してPrometheus.logに出力するようにrsyslogを変更します。rsyslog.confに設定を追加しても良いですが、/etc/rsyslog.d/下にPrometheusのログを分離するルールファイルを作成します。

# vi /etc/rsyslog.d/prometheus.conf
# Log prometheus generated log messages to file
:syslogtag, startswith, "pro
metheus" /var/log/prometheus.log
& stop

※/etc/rsyslog.d/にrsyslogのルールを記述すると、/etc/rsyslog.confに記載の各ルールの前に読み込まれます。 

ログを分離したのでローテーションの設定もrsyslogとは別に設定ファイルを作成します。

# vi /etc/logrotate.d/prometheus
/var/log/prometheus/*.log {
    missingok
    notifempty
    sharedscripts
    delaycompress
    postrotate
        systemctl restart prometheus.service >/dev/null 2>&1 || true
    endscript
}
  • rsyslog再起動

rsyslogを再起動しておきます。

# systemctl restart rsyslog

ここで一度起動して、正常に起動するか、ログが正しく出力されているか確認します。

# systemctl start prometheus
# systemctl status prometheus
● prometheus.service - Prometheus
   Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2020-07-28 10:12:25 JST; 45s ago
 Main PID: 1608 (prometheus)
    Tasks: 7 (limit: 23968)
   Memory: 25.5M
   CGroup: /system.slice/prometheus.service
           └1608 /usr/local/bin/prometheus/prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus/metrics
 
# cat /var/log/prometheus.log

[3] 監視対象の指定

監視対象ホストの指定方法はec2、docker、dnsなどオートスケールを追従するように記載できますが、今回は単純にファイルを使ったサービスディスカバリ(file_sd_configs)(ファイルにIPアドレスを列挙する)を使用します。フォーマットはymlまたはjsonです。

  • 設定ファイル編集

「targets」にIPアドレスとポートを記載します。
ポート番号はPrometheusサーバーからクライアントへhttpで通信するポート番号です。ポート番号は9100を使用します。
labelsは分類の為に設定します。

# vi /etc/prometheus/client_host.yml
- targets:
    - 10.14.200.11:9100
    - 10.14.200.12:9100
    - 10.14.200.13:9100
    - 10.14.200.14:9100
    - 10.14.200.15:9100
  labels:
    service: promethesu_test
    stage: dev
    role: test

監視対象を指定したファイルをprometheus.ymlで読み込むように指定します。
prometheus.ymlの最後尾に下記を追加します。

# vi /etc/prometheus/prometheus.yml
  - job_name: 'client_host_file_sd'
    file_sd_configs:
      - files:
        - /etc/prometheus/client_host.yml

監視対象の指定をPrometheus.yml本体ではなく別ファイルに記載しているのは、監視対象指定ファイルの変更をPrometheusが自動で検知してデータ取得を開始する仕組みを使用する為です。

[4] node_exporterインストール

  • バイナリファイル配置

クライアント側にインストールするnode_exporterもPrometheusと同様にバイナリファイルを配置するだけです。
公式サイトにファイルがありますのでダウンロードします。
ダウンロードしたファイルを解凍し、作成されたnode_exporterファイルを/usr/local/bin/ に移動させます。

Prometheus DOWNLOAD node_exporter

# wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz
# tar xzf node_exporter-1.0.1.linux-amd64.tar.gz
# cd node_exporter-1.0.1.linux-amd64
# cp -a node_exporter /usr/local/bin/
# ll /usr/local/bin/
合計 19200
-rwxr-xr-x 1 3434 3434 19657731  6月 16 21:44 node_exporter
  • 権限変更

所有者、グループが3434となっているのでPrometheusユーザを作成し、ファイルの所有者、グループを変更します。

# useradd -U -s /sbin/nologin -M -d / prometheus
# chown prometheus:prometheus /usr/local/bin/node_exporter

[5] node_exporter環境設定

  • ポート開放

Prometheusサーバーからのpullリクエストに応える為、9100ポートを開放します。

# firewall-cmd --add-port=9100/tcp
# firewall-cmd --add-port=9100/tcp --permanent
  • ユニットファイル作成

node_exporterもsystemdで起動できるようにユニットファイルを用意します。

# vi /etc/systemd/system/prometheus-node-exporter.service
[Unit]
Description=node_exporter for Prometheus
[Service]
Restart=always
User=prometheus
ExecStart=/usr/local/bin/node_exporter
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
  • daemon-reload

daemon-reloadを実行し、systemdの変更を反映します。

# systemctl daemon-reload
  • ログ出力先変更

Prometheusサーバーと同様にログ出力先を変更します。

# vi /etc/rsyslog.d/node_exporter.conf
# Log prometheus node_exporter generated log messages to file
:syslogtag, startswith, "node_exporter" /var/log/node_exporter.log
& stop
  • rsyslog再起動
# systemctl restart rsyslog
  • ログローテーション設定
# vi /etc/logrotate.d/node_exporter
/var/log/node_exporter.log {
    missingok
    notifempty
    sharedscripts
    delaycompress
    postrotate
        systemctl restart prometheus-node-exporter.service restart >/dev/null 2>&1 || true
    endscript
}
  • 自動起動設定
# systemctl enable prometheus-node-exporter
# systemctl start prometheus-node-exporter
# systemctl status prometheus-node-exporter
  • ログ出力確認

ログが正しく出力されていることを確認します。

# cat /var/log/node_exporter.log

クライアント側の設定はこれで終了です。
複数クライアントを設定する場合は、[4]、[5]を他の監視対象サーバーにも実施します。

[6] データ取得状況の確認

クライアント1台設定した時点でデータが取得されているか確認します。
PrometheusにはGUI画面が用意されていますので、Prometheusサーバーにブラウザから9090ポートでアクセスします。
※9090ポートは、Webコンソール(cockepit)で使用するポートで、RHEL8(CentOS8)から最小インストール以外では自動的にインストールされ、Firewallポートも自動的に開くようになっています。
firewall-cmdで開いているポートを確認し、servicesにcockpitがない場合は手動で追加する必要があります。

http://10.14.200.10:9090/

上部メニューバーの[status]をプルダウンし、[Target]を選択します。

node_exporterを配置、設定したサーバーのみ状態の取得ができています。
PrometheusはPrometheusサーバー自身のデータも取得しているので、下の画像の様にPrometheusの情報も表示されます。

Prometheusが取得したデータをグラフ表示することもできます。
グラフの表示は 「- insert metric at cursor -」 で表示可能なデータを選択できます。
また、PromQLを直接記載してデータを取得することも可能です。

複数クライアントからデータを取得した場合、下図の様にグラフ表示されます。
下のグラフは、クライアント5サーバーのload average(1min)をグラフ表示したものになります。

PromQLを使って自在にデータを取得しグラフ化できますが、Grafanaを使って高度な可視化を実現するのが常套手段となっています。

技術情報

商標について

お気軽にお問い合わせください。応対時間 9:30-17:30 [ 土・日・祝日除く ]

お問い合わせ
  • X