Prometheusはコンテナやクラウドなどの大量コンポーネントを監視する事に特化したソフトウェアです。このページではdockerコンテナを用いた操作方法を説明します。
前提
参照資料
動作確認済環境
- Rocky Linux 8.6
- docker-ce 20.10.17
- prom/prometheus v2.37.0
Prometheus
インストール
最小限のprometheusの設定ファイルを作成します。
mkdir /etc/prometheus cat << EOF > /etc/prometheus/prometheus.yml scrape_configs: - job_name: prometheus static_configs: - targets: - localhost:9090 EOF
Prometheusのコンテナを起動します。
docker run -d \ --name prometheus \ -p 9090:9090 \ -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \ prom/prometheus
動作確認
以下URLをブラウザで開きます。「/」へのアクセスを試みると、「/graph」へリダイレクトされグラフ描画ページへ遷移します。
http://<IPアドレス>:9090/
以下URLをブラウザで開きます。すると、監視項目の一覧が表示されます。この画面で表示される監視項目のうち1つをメモに控えましょう。
http://<IPアドレス>:9090/metric
再びグラフ描画ページ(http://<ip_addr>:9090/graph)に戻ります。検索窓に監視項目(例:prometheus_http_requests_total)を入力し、「Graph」を押下します。すると、監視結果がグラフ化される事が分かります。
Node exporter
インストール
前述の操作で監視されているのはPrometheusそのものです。PrometheusはGo言語で作成されたHTTPサーバで、そのHTTPサーバのメモリ使用量や200応答の回数などがメトリックとして蓄積されていきます。
それではPrometheusではなく仮想マシンそのものを監視してみましょう。PrometheusはHTTPで公開されたメトリック情報をスクレイピングして情報を蓄積します。ですので、HTTPで公開できる情報ならば「何でも」監視する事ができます。それではOSの情報をHTTPとして公開するNode exporterをコンテナを起動してみましょう。
この時、仮想マシンの/procや/devなどをコンテナへexportする事を意識してください。監視したいのはコンテナのCPU使用率やディスクIOではなく、ホスト(仮想マシン)側のCPU使用率やディスクIOです。ですので、ホスト(仮想マシン)のファイルをコンテナから読み取れるようにし、ホスト(仮想マシン)の値を読み取れるようにします。
以下は「GitHub node_exporter」で紹介されているnode exporterの起動例です。
docker run -d \ --name node-exporter \ --net="host" \ --pid="host" \ -v "/:/host:ro,rslave" \ quay.io/prometheus/node-exporter:latest \ --path.rootfs=/host
動作確認
Node exporterによってメトリックがHTTPによって公開されているかどうかを確認します。以下のようなcurlコマンドを実行しメトリックを取得できるかどうかを確認します。
curl http://localhost:9100/metrics
curlコマンドの実行結果をよく観察すると、diskやcpuなどOSに関する情報を取得できている事が分かるかと思います。以下に出力の一部を載せます。
念の為、コンテナではなくホスト(仮想マシン)の監視ができているかどうかを慎重に確認しましょう。ファイルシステムやCPU数などが想定通りの値になっているか(仮想マシンのスペックと一致しているか)を確認します。
[root@linux010 ~]# curl http://localhost:9100/metrics <omitted> # HELP node_filesystem_files Filesystem total file nodes. # TYPE node_filesystem_files gauge node_filesystem_files{device="/dev/sda1",fstype="ext4",mountpoint="/mnt/resource"} 262144 node_filesystem_files{device="/dev/sdb2",fstype="xfs",mountpoint="/"} 1.5727104e+07 node_filesystem_files{device="tmpfs",fstype="tmpfs",mountpoint="/run"} 95333 node_filesystem_files{device="tmpfs",fstype="tmpfs",mountpoint="/run/user/1000"} 95333 <omitted>
Prometheusとの連携
prometheusの設定ファイルを以下のように修正します。tcp9090(prometheus)とtcp9100(node_exporter)を監視するようにしてください。
また、tcp9100(node_exporter)はlocalhostではなく、ホスト(仮想マシン)のIPアドレスを指定するようにしてください。スクレイプする時の送信元はprometheusのコンテナになるので、prometheusのコンテナからnode_exporterのコンテナへ疎通可能になるようなIPアドレスを指定する必要があります。
DockerでNode exporterを使用するにはファイルシステムのマウントに注意を払わなければなりません。また、IPアドレスなどのネットワーク設定も「Prometheusインストール (tarball編)」と比較すると複雑です。このような背景もあり「オライリー本 入門 Prometheus」では、DockerでNode exporterを使用する事を推奨していません。
cat << EOF > /etc/prometheus/prometheus.yml scrape_configs: - job_name: prometheus static_configs: - targets: - localhost:9090 - job_name: node static_configs: - targets: - 172.16.1.10:9100 EOF
Prometheusを再起動します。
docker container restart prometheus
監視対象ページ(http://<ip_addr>:9090/targets)を表示すると、prometheusとnodeの2つを監視している事が分かります。
グラフ描画ページ(http://<ip_addr>:9090/graph)を表示します。検索窓に監視項目(例:node_cpu_seconds_total)を入力し、「Graph」を押下します。すると、監視結果がグラフ化される事が分かります。