Métriques propres aux services

Lorsque les métriques des services sont exposées via un exporter Prometheus, cela signifie simplement que, sur un chemin du domaine (généralement /metrics), les métriques sont accessibles en HTTP. Pour des raisons de sécurité, nous préférons que ces métriques ne soient pas exposées publiquement, et que seul notre scraper vmagent puisse y avoir accès.
Comme l’exporter est exposé via HTTP, et donc derrière Traefik, on peut simplement activer de l’authentification Basic pour permettre uniquement à vmagent de récupérer les métriques.

Du côté de Traefik, on va simplement se baser sur le middleware Basic Auth. Il permet d’activer une authentification Basic sur un router Traefik spécifique.
Prenons l’exemple d’un service Web classique, ici CodiMD.

Dans notre cas, un exporter Prometheus écoute sous le chemin /metrics/codimd du service, et un autre sous /metrics/router. On veut donc que tout le trafic vers ce service pour le chemin commençant par /metrics soit soumis à une authentification Basic de Traefik. Pour cela on créé un second routeur. Les labels appliqués sur le conteneur pour exposer le service sont ainsi les suivants :

snippet.yaml
traefik.enable: true
traefik.http.routers.codimd-app.entrypoints: websecure
traefik.http.routers.codimd-app.rule: Host(`md.picasoft.net`)
traefik.http.routers.codimd-app.service: codimd-app
traefik.http.routers.codimd-metrics.entrypoints: websecure
traefik.http.routers.codimd-metrics.rule: "Host(`md.picasoft.net`) && PathPrefix(`/metrics`)"
traefik.http.routers.codimd-metrics.service: codimd-app
traefik.http.routers.codimd-metrics.middlewares: "codimd-metrics-auth@docker"
traefik.http.middlewares.codimd-metrics-auth.basicauth.users: "test:$$apr1$$waO5zvqJ$$jrty/RULcxryemeBmH3RU0"
traefik.http.services.codimd-app.loadbalancer.server.port: 3000

Note:

Pour une explication détaillée des labels utilisés, voir la documentation de Picasoft sur Traefik.

Important:

Les identifiants générés pour /metrics sont placés dans le dossier Tech/Prometheus-Exporters-Auth du vaultwarden.

Du côté de vmagent il faut préciser les identifiants en question dans le fichier de configuration Prometheus. Pour chaque configuration de service, l’objet basic_auth permet de spécifier que l’exporter nécessite une uathentification Basic. Par exemple pour notre cas (des champs ont été retirés pour se concentrer sur ce qui nous intéresse) :

snippet.yaml
  - job_name: codimd
    metrics_path: "/metrics/codimd"
    scheme: "https"
    basic_auth:
      username: codimd
      password: monpassword
    static_configs:
      - targets:
        - "md.picasoft.net"

L’inconvénient est que nos identifiants vont se retrouver dans le fichier de configuration, qui est versionné. Pour cela on va donc utiliser un mécanisme de vmagent qui permet de remplacer des valeurs dans le fichier de configuration à l’aide de variables d’environnement. On utilisera donc la configuration suivante :

snippet.yaml
  - job_name: codimd
    metrics_path: "/metrics/codimd"
    scheme: "https"
    basic_auth:
      username: "%{CODIMD_METRICS_USER}"
      password: "%{CODIMD_METRICS_PASSWORD}"
    static_configs:
      - targets:
        - "md.picasoft.net"

Il ne reste plus que à fournir les 2 variables d’environnement en question à vmagent. Pour cela on utilise le même mécanisme de fichiers de secrets que l’on utilise dans nos autres dépôts. On charge ensuite le fichier de variables dans le conteneur vmagent.

  • technique/adminsys/monitoring/collect/service_metrics.1663921191.txt.gz
  • de 127.0.0.1