前年學會用 Grafana + Prometheus 長期監測 Docker CPU/RAM、主機溫度,陸續在我的迷你電腦加入插座用電量路由器 CPU/溫度/網路流量監控,但每次都是設定完看到線圖就開香檳慶祝了事。前天遇到寬頻異常,興趣想查查這幾個月的路由器資訊,這才發現,資料怎麼只從 7/8 開始,之前的都不見了?

原以為是 Docker 沒設好或 Volume 出錯,追了一圈才發現是自己太菜,連 Prometheus 預設只會保留 15 天資料都不知道,登楞!

研究了一下,資料保存期限無法用 Prometheus 的 9090 Web 介面 及 prometheus.yml 修改,要在 docker-compose.yml 用 command 參數指定,可設定天數、月數、年數或限定資料大小:

prometheus:
    container_name: prometheus
    image: prom/prometheus:latest
    network_mode: "host"
    volumes:
      - "./prometheus.yml:/etc/prometheus/prometheus.yml"
      - "prometheus-data:/prometheus"
    privileged: true
    restart: unless-stopped
    command:
      - "--config.file=/etc/prometheus/prometheus.yml"
      - "--storage.tsdb.path=/prometheus"
      - "--storage.tsdb.retention.time=90d"   # 增加此行,指定保留 90 天
      # - "--storage.tsdb.retention.size=50GB" # 亦可搭配上限容量限制
    depends_on:
      - cadvisor

過程踩到一個小雷,command 不能只加 "--storage.tsdb.retention.time=90d",原因是它會完全取代原有 Dockerfile 裡的 CMD,而非新增或複寫,而 Prometheus 的 Dockerfile 原有 CMD 有 config.file 及 storage.tsdb.path,少了會出錯。參考

# ... 略 ...
WORKDIR /prometheus
RUN chown -R nobody:nobody /etc/prometheus /prometheus && chmod g+w /prometheus

USER       nobody
EXPOSE     9090
VOLUME     [ "/prometheus" ]
ENTRYPOINT [ "/bin/prometheus" ]
CMD        [ "--config.file=/etc/prometheus/prometheus.yml", \
             "--storage.tsdb.path=/prometheus" ]

關於不能省略其他設定這點,只有 Gemini Flash 答對,Copilot GPT 5.6-sol 跟 Sonnect 4.6 都答錯。所以,使用 AI 還是得時時謹慎,沒有模型可以盡信。

若我想保存一年資料,需要準備多少空間?

我找到的簡單估算方式是用 docker compose exec prometheus /bin/sh 登入 Docker 下 du -hd1 /prometheus 統計目前 15 天的資料量,乘上 24 便接近一年 12 個月的大小。

如上圖,Prometheus 數據被分別存在多個 Block 資料夾,容量有大有小:

  • 5–13 MB:通常是近期剛建立的 2 小時 Block
  • 38 MB:可能是部分合併或時間範圍較短的 Block
  • 112 MB:通常是 Compaction 後、涵蓋較長時間的 Block
  • wal 約 65 MB:尚未寫入持久化 Block 的近期資料

若想看到每個 Block 精確的時間範圍跟資料筆數可用 promtool tsdb list /prometheus 取得精準數字:

粗估以我目前的監測量,一年不會超過 25GB,目前 128G SSD 還有 60GB 空間,應該頂得住,就先設 --storage.tsdb.retention.time=1y,後面再觀察。


Comments

Be the first to post a comment

Post a comment