🅰️

[YML or YAML] 拡張子の違いで、 prometheus の設定が反映されないケースがある

2023/02/24に公開

初歩的なミスの備忘録です😇

一文まとめ

prometheus の設定ファイル(/etc/prometheus/prometheus.yml)を上書きしたつもりが、 反映されることのない /etc/prometheus/prometheus.yaml を新規生成してしまっていた😇

解決策

解決策として、

  • prometheus.yaml ではなく prometheus.yml を使うか、
  • prometheus.yaml であっても上書きされるようにするか、の二通りある

が、

Go に入っては Go に従え

https://gihyo.jp/news/report/01/GoCon2014Autumn/0002

とよく言われるので前者の対応が適切に思う。

補足

補足として、YAML の拡張子には、 yamlyml が用いられる[1]

そして、prometheus/prometheusにおいては、 yaml ではなく yml が主流である[2]

また、 prometheus のデフォルトの設定ファイルは、以下の通り prometheus.yml が設置され、読み込まれる。よって、prometheus.yaml を渡すだけでは prometheus.yml が優先されてしまい、望んだ設定が反映されない。

https://github.com/prometheus/prometheus/blob/35026fb26d30fb63dbe6557058fb336c1bd400fa/Dockerfile#L10

https://github.com/prometheus/prometheus/blob/35026fb26d30fb63dbe6557058fb336c1bd400fa/Dockerfile#L25

また筆者は普段 yaml を使っている 😇

再現手順

以下では、本件の再現手順について述べる。
ソートコードはこちら。

https://github.com/rokkish/prometheus_dot_yml_has_priority_over_dot_yaml

環境情報

WSL2
Docker version 20.10.5, build 55c4c88
prometheus: 2.42.0 / 2023-01-31

prometheus の設定

設定が反映されているかを確認するため、 prometheus に任意の設定を記述しておく。

prometheus.yaml
scrape_configs:
  - job_name: 'node_exporter'
    static_configs:
      - targets: ['node_exporter:9100']

設定が反映されないケース

必要最低限のprometheus、node_exporter、grafanaの設定を記述しておく。

compose.yaml
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.yamlprometheus.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 を上書き対象とすると、

compose.yaml
-      - ./prometheus.yaml:/etc/prometheus/prometheus.yaml // 反映されない 😇😇😇😇
+      - ./prometheus.yaml:/etc/prometheus/prometheus.yml // 反映される 🥰🥰🥰🥰
# or
+      - ./prometheus.yml:/etc/prometheus/prometheus.yml // 反映される 🥰🥰🥰🥰

以下の通り、正しく上書きされる。

pass_case
# $ 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 と気づいていたようにも思います。やはりドキュメントですね。

https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config

脚注
  1. Officialではyamlを推奨:https://yaml.org/faq.html ↩︎

  2. testdataがすべてymlだ...:https://github.com/prometheus/prometheus/tree/release-2.42/config/testdata ↩︎

  3. prometheus が node_exporter をスクレイピング出来ないことから、prometheus.yml が適用されることが確認できた。 ↩︎

GitHubで編集を提案

Discussion