[YML or YAML] 拡張子の違いで、 prometheus の設定が反映されないケースがある
初歩的なミスの備忘録です😇
一文まとめ
prometheus の設定ファイル(/etc/prometheus/prometheus.yml
)を上書きしたつもりが、 反映されることのない /etc/prometheus/prometheus.yaml
を新規生成してしまっていた😇
解決策
解決策として、
-
prometheus.yaml
ではなくprometheus.yml
を使うか、 -
prometheus.yaml
であっても上書きされるようにするか、の二通りある
が、
Go に入っては Go に従え
とよく言われるので前者の対応が適切に思う。
補足
補足として、YAML の拡張子には、 yaml
か yml
が用いられる[1]。
そして、prometheus/prometheusにおいては、 yaml
ではなく yml
が主流である[2]。
また、 prometheus のデフォルトの設定ファイルは、以下の通り prometheus.yml
が設置され、読み込まれる。よって、prometheus.yaml
を渡すだけでは prometheus.yml
が優先されてしまい、望んだ設定が反映されない。
また筆者は普段 yaml
を使っている 😇
再現手順
以下では、本件の再現手順について述べる。
ソートコードはこちら。
環境情報
WSL2
Docker version 20.10.5, build 55c4c88
prometheus: 2.42.0 / 2023-01-31
prometheus の設定
設定が反映されているかを確認するため、 prometheus に任意の設定を記述しておく。
scrape_configs:
- job_name: 'node_exporter'
static_configs:
- targets: ['node_exporter:9100']
設定が反映されないケース
必要最低限のprometheus、node_exporter、grafanaの設定を記述しておく。
services:
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yaml:/etc/prometheus/prometheus.yaml # 反映されない 😇😇😇😇
ports:
- 9090:9090
container_name: prometheus
node_exporter:
image: prom/node-exporter
container_name: node_exporter
grafana:
image: grafana/grafana-oss:9.3.6
ports:
- 3000:3000
volumes:
- grafana_data:/var/lib/grafana
volumes:
grafana_data:
上記の設定でサービスを立ち上げると、以下の通り prometheus.yaml
と prometheus.yml
が共存する[3]。
$ git clone -b fail_case git@github.com:rokkish/prometheus_dot_yml_has_priority_over_dot_yaml.git
$ cd prometheus_dot_yml_has_priority_over_dot_yaml
$ docker compose up -d
[+] Running 3/0
⠿ Container prometheus_dot_yml_has_priority_over_dot_yaml_grafana_1 Running 0.0s
⠿ Container node_exporter Running 0.0s
⠿ Container prometheus Running 0.0s
$ docker exec -it prometheus sh
/prometheus $ ls -al /etc/prometheus/prometheus.*
-rw-r--r-- 1 1000 1001 106 Feb 24 10:11 prometheus.yaml // 反映されない 😇😇😇😇
-rw-r--r-- 1 nobody nobody 934 Feb 1 08:23 prometheus.yml // こちらが反映されてしまう 😇😇😇😇
$ docker compose stop
$ docker rm prometheus
設定が反映されるケース
既存の prometheus.yml
を上書き対象とすると、
- - ./prometheus.yaml:/etc/prometheus/prometheus.yaml // 反映されない 😇😇😇😇
+ - ./prometheus.yaml:/etc/prometheus/prometheus.yml // 反映される 🥰🥰🥰🥰
# or
+ - ./prometheus.yml:/etc/prometheus/prometheus.yml // 反映される 🥰🥰🥰🥰
以下の通り、正しく上書きされる。
# $ git checkout -b pass_case
$ docker compose up -d
$ docker exec -it prometheus sh
/prometheus $ ls -al /etc/prometheus/prometheus.*
-rw-r--r-- 1 1000 1001 106 Feb 24 10:11 prometheus.yml // 反映される 🥰🥰🥰🥰
おわりに
- 3文字拡張子と4文字拡張子の違いで、挙動が異なるケースは初めて遭遇したので、記念に記事にしてみました。
- 「変更したはずのファイルが反映されない!? → 勘違いだった」というケースはこれまで何度も経験がありますね...
- ただ、初めからドキュメント読んでおけば、
yml
と気づいていたようにも思います。やはりドキュメントですね。
-
Officialではyamlを推奨:https://yaml.org/faq.html ↩︎
-
testdataがすべてymlだ...:https://github.com/prometheus/prometheus/tree/release-2.42/config/testdata ↩︎
-
prometheus が node_exporter をスクレイピング出来ないことから、
prometheus.yml
が適用されることが確認できた。 ↩︎
Discussion