Traefik, StripPrefix/ReplacePathRegex and Redirects

Hello all! Long-time traefik user (mostly in Kubernetes!) branching out for more use cases.

Currently I'm trying to prototype a Traefik install that fronts, among other things, several Prometheus servers. These servers will end up on paths on the same hostname, such as <my-traefik>/prometheus/prometheus-dev-1 and <my-traefik>/prometheus/prometheus-prod-1 via the load balancer

I've been through a couple of iterations of configuration but have yet to find a workable solution. The issue is that when a user hits / on a Prometheus server, it immediately 302's to /graph and Traefik doesn't play nicely with 302s and path-based routing

I'm using file-based dynamic configuration, and I've tested two different configurations and have not gotten past the issue I'm running into.

The gist of the configuration I have right now is as follows:

---
entryPoints:
  http:
    address: ":80"
http:
  routers:
    prometheus:
      middlewares:
        - prometheus-path
      rule: "Host(`twexler-k8s-cluster-workers.bdns.bloomberg.com`) && PathPrefix(`/prometheus/prometheus-dev-1`)"
      service: "prometheus@file"
  services:
    prometheus:
      loadBalancer:
        healthCheck:
          path: /graph
        servers:
          - url: "http://prometheus-dev-1:9090"
  middlewares:
    prometheus-path:
      stripPrefix:
        prefixes:
          - "/prometheus/prometheus-dev-1"

This configuration results in an immediate redirect to <my-traefik>/graph, since Prometheus is 302ing to /graph and then eventually 404s.

If I change the prometheus-path middleware to use ReplacePathRegex, I get nearly the behavior I'm looking for, but resources requested by the Prometheus web UI still end up on / (i.e. <my-traefik>/static/some-asset.js)

    prometheus-path:
      replacePathRegex:
        regex: "/prometheus/(.*)"
        replacement: "/$1"

What's the correct way to get the behavior I'm looking for here? I've tried a bunch of iterations and can't find the right configuration that works.

Hi @twexler

I think some Prometheus configuration is required to get the returned paths correct:

When running Prometheus behind the nginx proxy, you'll need to set the external URL to https://example.com/prometheus and the route prefix to / :

prometheus \
  --config.file=/path/to/prometheus.yml \
  --web.external-url=https://example.com/prometheus \
  --web.route-prefix="/"

I think you’re correct. I didn’t think that existed in Prometheus. Thanks!

At: 19-Mar-2021 18:15:56