三流エンジニアの落書き帳

さあ、今日も未知という扉を開けてみよう

CentOS7環境でexporterを自動で再起動させる方法

個人的な備忘録

やりたかったこと

サーバを再起動しても不意にKillされてもnode_exporter, mysqld_exporterが自動起動するようにしたかった

環境

CentOS 7.6 node_exporter 0.18.1 mysqld_exporter 0.12.1

環境はWin7上に立てた仮想マシン 各exporterはGit Hubからバイナリファイルをwgetしたものです。 すでに展開しています。(各exporterはバージョン名まで含み冗長なので省略しました)

[root@instance2:/usr/local/src/prometheus]$ ll
合計 14852
drwxr-xr-x. 2 3434 3434      58  729  2019 mysqld_exporter
-rw-r--r--. 1 root root 7121565  214  2020 mysqld_exporter-0.12.1.linux-amd64.tar.gz
drwxr-xr-x. 2 3434 3434      56  65  2019 node_exporter
-rw-r--r--. 1 root root 8083296  214  2020 node_exporter-0.18.1.linux-amd64.tar.gz

node_exporter

node_exporterはOSのメトリクスを収集してくれます。 デフォルトポートは9100ですので、Prometheusを利用する場合は予めfirewall-cmdで開けておくといいでしょう。

$ firewall-cmd --add-port=9100/tcp --zone=public --permanent

今回は省略します。

mysqld_exporter

mysqld_exporterはMySQLのメトリクスを収集してくれます。 デフォルトポートは9104ですので、Prometheusを利用する場合は予めfirewall-cmdで開けておくといいでしょう。

$ firewall-cmd --add-port=9104/tcp --zone=public --permanent

今回は省略します。

Unit定義ファイルを作成する

/lib/systemd/sytem/に各exporterのUnit定義ファイルを作成します。

/lib/systemd/system/node-exporter.service

[Unit]
Description=Node Exporter
Documentation=https://github.com/prometheus/node_exporter

[Service]
Type=simple
ExecStart=/usr/local/src/prometheus/node_exporter/node_exporter
Restart=always

[Install]
WantedBy=multi-user.target

Restart=alwaysとすることでsystemctlで完全に停止したとき以外でプロセスが終了したときに再起動してくれます。

/lib/systemd/system/mysqld-exporter.service

[Unit]
Description=Mysqld Exporter
Documentation=https://github.com/prometheus/mysqld_exporter

[Service]
Type=simple
ExecStart=/usr/local/src/prometheus/mysqld_exporter/mysqld_exporter --config.my-cnf=/usr/local/src/prometheus/mysqld_exporter/.my.cnf
Restart=always

[Install]
WantedBy=multi-user.target

node_exporterとほぼ同じですが、オプションにconfig.my-cnfを渡しています。 ここで指定している.my.cnfにはmysqld_exporterがMySQLにログインするための接続情報を記載しています。

/usr/local/src/prometheus/mysqld_exporter/.my.cnf

[client]
user=prometheus
password=%1+ja%l{ou+ITW{}B(%p
host=127.0.0.1
port=3306

各Unit定義ファイルを作成したら反映させる必要があります。

[root@instance2:/usr/local/src/prometheus]$ systemctl daemon-reload

[root@instance2:/usr/local/src/prometheus]$ systemctl list-unit-files | grep exporter
mysqld-exporter.service                       disabled
node-exporter.service                         disabled

各exporterを起動させる

[root@instance2:/usr/local/src/prometheus]$ systemctl start node-exporter
[root@instance2:/usr/local/src/prometheus]$ systemctl start mysqld-exporter

起動後は必ずサービスが正常に起動しているか確認しましょう

[root@instance2:/usr/local/src/prometheus]$ systemctl status node-exporter
● node-exporter.service - Node Exporter
   Loaded: loaded (/usr/lib/systemd/system/node-exporter.service; disabled; vendor preset: disabled)
   Active: active (running) since 金 2020-02-14 09:52:58 JST; 8s ago
     Docs: https://github.com/prometheus/node_exporter
 Main PID: 5346 (node_exporter)
    Tasks: 3
   CGroup: /system.slice/node-exporter.service
           └─5346 /usr/local/src/prometheus/node_exporter/node_exporter

 214 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg=" - sockstat" source="node_exporter.go:104"
 214 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg=" - stat" source="node_exporter.go:104"
 214 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg=" - textfile" source="node_exporter.go:104"
 214 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg=" - time" source="node_exporter.go:104"
 214 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg=" - timex" source="node_exporter.go:104"
 214 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg=" - uname" source="node_exporter.go:104"
 214 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg=" - vmstat" source="node_exporter.go:104"
 214 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg=" - xfs" source="node_exporter.go:104"
 214 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg=" - zfs" source="node_exporter.go:104"
 214 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg="Listening on :9100" source="node_exporter.go:170"

[root@instance2:/usr/local/src/prometheus]$ systemctl status mysqld-exporter
● mysqld-exporter.service - Mysqld Exporter
   Loaded: loaded (/usr/lib/systemd/system/mysqld-exporter.service; disabled; vendor preset: disabled)
   Active: active (running) since 金 2020-02-14 09:53:02 JST; 9s ago
     Docs: https://github.com/prometheus/mysqld_exporter
 Main PID: 5359 (mysqld_exporter)
    Tasks: 3
   CGroup: /system.slice/mysqld-exporter.service
           └─5359 /usr/local/src/prometheus/mysqld_exporter/mysqld_exporter --config.my-cnf=/usr/local/src/prometheus/mysqld_exporter/.my.cnf

 214 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg="Starting mysqld_exporter (version=0.12.1, branch=HEAD, revision=48667bf7c3b438b5e93b259f3d17b7...orter.go:257"
 214 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg="Build context (go=go1.12.7, user=root@0b3e56a7bc0a, date=20190729-12:35:58)" source="mysqld_exporter.go:258"
 214 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg="Enabled scrapers:" source="mysqld_exporter.go:269"
 214 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg=" --collect.slave_status" source="mysqld_exporter.go:273"
 214 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg=" --collect.global_status" source="mysqld_exporter.go:273"
 214 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg=" --collect.global_variables" source="mysqld_exporter.go:273"
 214 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg=" --collect.info_schema.query_response_time" source="mysqld_exporter.go:273"
 214 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg=" --collect.info_schema.innodb_cmp" source="mysqld_exporter.go:273"
 214 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg=" --collect.info_schema.innodb_cmpmem" source="mysqld_exporter.go:273"
 214 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg="Listening on :9104" source="mysqld_exporter.go:283"
Hint: Some lines were ellipsized, use -l to show in full.

大丈夫そうです。

サービス自動起動を有効にする

このままではサーバが再起動したときに自動でサービスを再起動してくれないので、自動起動を有効にする必要があります。

[root@instance2:/usr/local/src/prometheus]$ systemctl enable node-exporter
Created symlink from /etc/systemd/system/multi-user.target.wants/node-exporter.service to /usr/lib/systemd/system/node-exporter.service.

[root@instance2:/usr/local/src/prometheus]$ systemctl enable mysqld-exporter
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld-exporter.service to /usr/lib/systemd/system/mysqld-exporter.service.

設定後は必ず自動起動が有効になっているか確認しましょう。

[root@instance2:/usr/local/src/prometheus]$ systemctl list-unit-files | grep exporter
mysqld-exporter.service                       enabled 
node-exporter.service                         enabled 

enableになっていればOKです。

最後に実際にサーバを再起動してみて各exporterが自動で起動されるか確認してみます。

[root@instance2:/usr/local/src/prometheus]$ reboot

[root@instance2:~]$ uptime
 11:16:21 up 2 min,  1 user,  load average: 0.75, 0.42, 0.16
[root@instance2:~]$ 

[root@instance2:~]$ systemctl status node-exporter
● node-exporter.service - Node Exporter
   Loaded: loaded (/usr/lib/systemd/system/node-exporter.service; enabled; vendor preset: disabled)
   Active: active (running) since 金 2020-02-14 11:14:31 JST; 5min ago
     Docs: https://github.com/prometheus/node_exporter
 Main PID: 2744 (node_exporter)
    Tasks: 5
   CGroup: /system.slice/node-exporter.service
           └─2744 /usr/local/src/prometheus/node_exporter/node_exporter

 214 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg=" - sockstat" source="node_exporter.go:104"
 214 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg=" - stat" source="node_exporter.go:104"
 214 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg=" - textfile" source="node_exporter.go:104"
 214 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg=" - time" source="node_exporter.go:104"
 214 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg=" - timex" source="node_exporter.go:104"
 214 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg=" - uname" source="node_exporter.go:104"
 214 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg=" - vmstat" source="node_exporter.go:104"
 214 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg=" - xfs" source="node_exporter.go:104"
 214 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg=" - zfs" source="node_exporter.go:104"
 214 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg="Listening on :9100" source="node_exporter.go:170"
[root@instance2:~]$ 
[root@instance2:~]$ systemctl status mysqld-exporter
● mysqld-exporter.service - Mysqld Exporter
   Loaded: loaded (/usr/lib/systemd/system/mysqld-exporter.service; enabled; vendor preset: disabled)
   Active: active (running) since 金 2020-02-14 11:14:30 JST; 5min ago
     Docs: https://github.com/prometheus/mysqld_exporter
 Main PID: 2696 (mysqld_exporter)
    Tasks: 4
   CGroup: /system.slice/mysqld-exporter.service
           └─2696 /usr/local/src/prometheus/mysqld_exporter/mysqld_exporter --config.my-cnf=/usr/local/src/prometheus/mysqld_exporter/.my.cnf

 214 11:14:31 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:31+09:00" level=info msg="Build context (go=go1.12.7, user=root@0b3e56a7bc0a, date=20190729-12:35:58)" source="mysqld_exporter.go:258"
 214 11:14:31 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:31+09:00" level=info msg="Enabled scrapers:" source="mysqld_exporter.go:269"
 214 11:14:31 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:31+09:00" level=info msg=" --collect.global_status" source="mysqld_exporter.go:273"
 214 11:14:31 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:31+09:00" level=info msg=" --collect.global_variables" source="mysqld_exporter.go:273"
 214 11:14:31 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:31+09:00" level=info msg=" --collect.slave_status" source="mysqld_exporter.go:273"
 214 11:14:31 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:31+09:00" level=info msg=" --collect.info_schema.innodb_cmpmem" source="mysqld_exporter.go:273"
 214 11:14:31 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:31+09:00" level=info msg=" --collect.info_schema.query_response_time" source="mysqld_exporter.go:273"
 214 11:14:31 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:31+09:00" level=info msg=" --collect.info_schema.innodb_cmp" source="mysqld_exporter.go:273"
 214 11:14:31 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:31+09:00" level=info msg="Listening on :9104" source="mysqld_exporter.go:283"
 214 11:14:44 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:44+09:00" level=error msg="Error pinging mysqld: dial tcp 127.0.0.1:3306: connect: connection refused" source="exporter.go:146"

無事に目標が達成されました!

参考にさせていただいたサイト

CentOS7にPrometheusをInstall - Qiita

systemd のユニットファイルの作り方