Coin web de Frédéric Péters

fpeters@0d.be

Prometheus & Grafana pour le suivi Ă  la radio

24 mai 2024, 16:59

Il y a quelques années déjà j’écrivais à propos de munin, fidèle outil lowtech, c’est toujours vrai mais récemment je l’ai plutôt délaissé au profit de Prometheus et, pour la peine absolument pas lowtech, Grafana.

Dans les motivations pour ce changement il y a surtout la mise en place d’un système d’alertes, par exemple quand le niveau audio de la radio devient trop faible ou que l’enregistrement automatique tombe en panne (il y a longtemps on utilisait nagios mais ça fait des années que c’est à l’arrêt et qu'on n'avait plus rien). Pour ça Prometheus suffirait mais tant qu’à collecter les données, autant en faciliter l’exploration.

Pour Prometheus il y a le nĂ©cessaire dans Debian, pour Grafana pas mais le projet met Ă  disposition un dĂ©pĂ´t (apt.grafana.com), ça s’installe sans problème mais ensuite ça a Ă©tĂ© plutĂ´t pĂ©nible Ă  configurer pour fonctionner derrière un reverse-proxy, dans un prĂ©fixe. Pas de rĂ©ussite via la documentation, c’est finalement un article de Jack Henschel (Configure Prometheus on a Sub-Path behind Reverse Proxy) qui m’a aidĂ©. AdaptĂ© Ă  Debian il s’agit de modifier /etc/default/prometheus pour ajouter --web.external-url=/prometheus/ --web.route-prefix=/prometheus/ dans la variable ARGS. Pour les alertes il faut Ă©galement prĂ©ciser l’affaire,

# Alertmanager configuration
alerting:
  alertmanagers:
  - scheme: http
  - path_prefix: "prometheus/"
	static_configs:
	- targets: ['localhost:9093']

Avec ça et la collecte des donnĂ©es utiles le système d’alertes est opĂ©rationnel, par exemple une alerte pour le niveau audio est dĂ©finie ainsi :

  - alert: Volume
    expr: panik_volume < -60
    for: 10m
    labels:
      severity: critical
    annotations:
      title: niveau sonore
      summary: volume très bas, sans doute du silence

Pour Grafana pour le fonctionnement dans un prĂ©fixe derrière un reverse-proxy c’était plus simple Ă  trouver, dans /etc/grafana/grafana.ini, variable root_url. Ă€ explorer le fichier de configuration de Grafana, j’ai notĂ© aussi que l’authentification pouvait ĂŞtre dĂ©lĂ©guĂ©e Ă  un serveur OpenID Connect, c’est pratique pour directement donner l’accès Ă  tous les membres de la radio,

[auth.generic_oauth]
enabled = true
name = PanikDB
allow_sign_up = true
auto_login = false
client_id = grafana
client_secret = ...
scopes = openid email profile
email_attribute_name = email
auth_url = https://panikdb.radiopanik.org/oauth/authorize
token_url = https://panikdb.radiopanik.org/oauth/token
api_url = https://panikdb.radiopanik.org/oauth/user-info

À ce sujet il y a possibilité de désactiver la connexion interne (disable_login = true) mais curieusement l’écran de connexion continue à présenter des champs Username/Password.

Dans la configuration un dernier Ă©lĂ©ment utile est la mise en place d’un tableau de bord personnalisĂ© sur la page d’accueil, variable default_home_dashboard_path. (c’est dommage que ça ne puisse pas ĂŞtre fait via l’interface, ça oblige Ă  maintenir un export JSON de la configuration du tableau de bord sur le disque).

Quand j’avais écrit sur munin c’était à propos de graphe de suivi pour notre émetteur, j’ai refait les mêmes,

#! /usr/bin/python3

import requests

from prometheus_client import CollectorRegistry, Gauge
from prometheus_client.exposition import generate_latest

session = requests.Session()
session.get('http://emetteur.panik/api/auth', data={'password': 'XXX'}, timeout=5)
r = session.get('http://emetteur.panik/api/getParameters.js', timeout=5)
session.get('http://emetteur/api/logout', timeout=5)

registry = CollectorRegistry()

for key in (
	'transmitter.power',
	'transmitter.set_power',
	'meters.fwd_power',
	'meters.rev_power',
	'meters.pa_voltage',
	'meters.aux_voltage',
	'meters.pa_temp',
	'meters.peak_deviation',
):
	gauge = Gauge('emetteur_%s' % key.replace('.', '_'), key.replace('.', '_'), registry=registry)
	gauge.set(float(r.json()[key]))

print(generate_latest(registry).decode())

et voilĂ  donc un graphe affichant emetteur_meters_pa_temp : (passionnant)

Graphe de la température de l’émetteur

Pour le moment parce que ça ne coûte pas grand chose je garde munin en place.