While configuring my new Prometheus and Grafana setup, I had to spend some time figuring out how to get the Prometheus UI to correctly serve on a sub-path, e.g.
I won’t bore you with all the intermediate steps I tried (and failed!), but rather jump straight to the conclusion: You need to set the
--web.external-url flag to
From the Prometheus manpage:
1 2 3 4
--web.external-url=<URL> The URL under which Prometheus is externally reachable (for example, if Prometheus is served via a reverse proxy). Used for generating relative and absolute links back to Prometheus itself. If the URL has a path portion, it will be used to prefix all HTTP endpoints served by Prometheus. If omitted, relevant URL components will be derived automatically. --web.route-prefix=<path> Prefix for the internal routes of web endpoints. Defaults to path of --web.external-url.
(By the way: I’m not sure what’s so hard about just documenting the command line flags on the offcial documentation pages instead of an unhelpful “just run prometheus -h”)
Then configure the reverse proxy so that it forwards requests for
/prometheus/ to the address Prometheus is listening on, but without stripping the prefix (!).
traefik.http.routers.<my-router>.rule="Host(`example.com`) && PathPrefix(`/prometheus/`)"
Thanks also to this issue for some inspiration.
Hope this helps, happy monitoring!