Fractal Techware

Alert runbooks /

PrometheusConfigReloadFailed

Prometheus tried to load a new configuration, rejected it, and is still running the previous one.

   
Severity warning
Source Prometheus’ own /metrics (2.x and 3.x)
Key metric prometheus_config_last_reload_successful (1 = ok, 0 = failed)

What it means

A reload happens on SIGHUP, on POST /-/reload, or automatically when a config-reloader sidecar (Prometheus Operator, Helm charts) sees the files change. If the new config or any rule file fails to parse, Prometheus logs the error, keeps the old config in memory, and sets the gauge to 0. The alert fires once the last reload has stayed failed for several minutes.

Nothing is down yet, but your change (a new scrape job, a new alert, a fixed rule) is not live, and the next restart may fail to start at all with the same broken file.

Common causes

First checks

  1. Confirm which instance is affected and when the last good reload happened:
    time() - prometheus_config_last_reload_success_timestamp_seconds
    
  2. Read the actual error from the logs:
    kubectl -n monitoring logs <prometheus-pod> -c prometheus | grep -iE "error loading config|reload"
    
  3. Validate the config and every rule file it pulls in. Run this against the rendered config the pod actually sees:
    kubectl -n monitoring exec <prometheus-pod> -c prometheus -- promtool check config /etc/prometheus/config_out/prometheus.env.yaml
    promtool check rules rules/*.yml
    
  4. With the Operator, check the reloader sidecar and the Operator logs for rejected objects:
    kubectl -n monitoring logs <prometheus-pod> -c config-reloader
    

Fixing it

Fix or revert the offending change, validate with promtool, then trigger a reload. curl -X POST http://<prometheus>:9090/-/reload only works when Prometheus runs with --web.enable-lifecycle; otherwise send SIGHUP to the process. Watch the gauge return to 1. Adding promtool check config and promtool check rules to CI prevents most of these.