Prometheusはコンテナやクラウドなどの大量コンポーネントを監視する事に特化したソフトウェアです。監視対象は大量に存在しますので、その監視対象を1つ1つ手作業で定義するのは非現実的です。このような問題に対応するため、Prometheusには監視対象を動的に検出するサービスディスカバリという機能が備わっています。このページではサービスディスカバリの1つであるファイル定義の方法を説明します。
前提
参照資料
動作確認済環境
- Rocky Linux 8.6
- Prometheus 2.36.2
- node_exporter 1.3.1
構成図
3台の仮想マシンに対して、以下コンポーネントがインストール済の状態とします。
+----------------+ +----------------+ +----------------+ | linux010 | | linux020 | | linux030 | | 172.16.1.10/24 | | 172.16.1.20/24 | | 172.16.1.30/24 | | node_exporter | | node_exporter | | node_exporter | | prometheus | | | | | +----------------+ +----------------+ +----------------+
静的なファイル
手作業編集の場合
「Prometheus 監視対象ホストの追加」では、複数の監視対象ホストを設定する例を紹介しました。もし、監視対象が少ないならばテキストエディタを使用して以下のようなprometheus.ymlを定義しても良いかもしれません。
scrape_configs:
- job_name: prometheus
static_configs:
- targets:
- localhost:9090
- job_name: linux010 node
static_configs:
- targets:
- 172.16.1.10:9100
- 172.16.1.20:9100
- 172.16.1.30:9100
もし、Ansibleで監視対象ホスト一覧を管理しているならば、以下のようにテンプレートエンジンの機能を使って監視対象を生成しても良いでしょう。
scrape_configs:
- job_name: prometheus
static_configs:
- targets:
- localhost:9090
- job_name: linux010 node
static_configs:
- targets:
{% for host in groups["all"] %}
- {{ host }}:9100
{% endfor %}
動的なファイル
JSONファイルの作成例
もし、Ansible以外の仕組みで監視対象一覧を管理しているならば、何らかの方法で監視対象一覧をjsonとして整形できる事が多いと思われます。AWSやAzureなどのパブリッククラウドはCLIやREST APIに対応していますし、最近のIDM(ID管理)製品はREST API対応している事が多いでしょう。
例えば、Azureならば以下のような操作でIPアドレスの一覧を取得できます。
$ az network nic list \ --resource-group MyResourceGroup \ --query "[].ipConfigurations[].privateIpAddress" [ "172.16.1.10", "172.16.1.20", "172.16.1.30" ]
実業務では、好みの言語やプロジェクト指針に従って、取得した情報を適宜JSONに整形します。ですが、このページでは具体的な整形のコードは説明の簡略化のために省略します。以下をコピー&ペーストし、/etc/prometheus/filesd.jsonというファイルを作成します。
cat << 'EOF' > /etc/prometheus/filesd.json
[
{
"targets": [
"linux010:9100",
"linux020:9100",
"linux030:9100"
],
"labels": {
"team": "web",
"job": "node"
}
},
{
"targets": [
"linux010:9090"
],
"labels": {
"team": "monitoring",
"job": "prometheus"
}
}
]
EOF
以下のようなprometeheus.ymlを作成します。file_sd_configsという指定をすると、jsonファイルを読み取り動的にターゲットを変更します。
cat << 'EOF' > /etc/prometheus/prometheus.yml
scrape_configs:
- job_name: file
file_sd_configs:
- files:
- '/etc/prometheus/*.json'
EOF
設定を反映させるために再起動します。
/etc/prometheus/filesd.jsonの変更反映は再起動不要です。また、「Prometheus Node Exporter補足説明」で示したように/etc/prometheus/filesd.jsonの変更はrenameコマンドを使用したアトミックな操作がオススメです。
systemctl restart prometheus.service
動作確認
Service Discoveryページ(http://<ip_addr>:9090/service-discovery)を表示すると、サービスディスカバリの結果が表示されます。今回のシナリオの場合ならば、/etc/prometheus/filesd.jsonの解析結果が表示されます。

Targetsページ(http://<ip_addr>:9090/targets)を表示すると、監視対象ホストの一覧が表示されます。

