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 Hedgedoc.

Dans notre cas, un exporter Prometheus écoute sous le chemin /metrics/hedgedoc 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.hedgedoc-app.entrypoints: websecure
traefik.http.routers.hedgedoc-app.rule: Host(`md.picasoft.net`)
traefik.http.routers.hedgedoc-app.service: hedgedoc-app
traefik.http.routers.hedgedoc-metrics.entrypoints: websecure
traefik.http.routers.hedgedoc-metrics.rule: "Host(`md.picasoft.net`) && PathPrefix(`/metrics`)"
traefik.http.routers.hedgedoc-metrics.service: hedgedoc-app
traefik.http.routers.hedgedoc-metrics.middlewares: "hedgedoc-metrics-auth@docker"
traefik.http.middlewares.hedgedoc-metrics-auth.basicauth.users: "${METRICS_AUTH}"
traefik.http.services.hedgedoc-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: hedgedoc
    metrics_path: "/metrics/hedgedoc"
    scheme: "https"
    basic_auth:
      username: hedgedoc
      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: hedgedoc
    metrics_path: "/metrics/hedgedoc"
    scheme: "https"
    basic_auth:
      username: "%{HEDGEDOC_METRICS_USER}"
      password: "%{HEDGEDOC_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.

Après avoir créé l’utilisateur pour le service (ici hedgedoc par exemple), on sauvegarde le mot de passe dans le dossier Tech/Prometheus-Exporters-Auth du vaultwarden.

Ce mot de passe peut être donné en clair côté monitoring via la variable d’environnement HEDGEDOC_METRICS_PASSWORD. Cependant, traefik s’attendant à un format particulier de la forme hedgedoc:$$apr1$$waO5zvqJ$$jrty/RULcxryemeBmH3RU0, il faut d’abord le transformer. Pour cela on exécutera la commande suivante

snippet.sh
htpasswd -nb $HEDGEDOC_METRICS_USER $HEDGEDOC_METRICS_PASSWORD

Dont la sortie peut être mise dans la variable d’environnement METRICS_AUTH

  • technique/adminsys/monitoring/collect/service_metrics.txt
  • de limaanto