Aller au contenu principal

Endpoints de santé

La page Supervision couvre la vue runtime lisible par un humain. Pour les sondes automatisées — load balancers, Kubernetes, healthchecks Docker, supervision externe — Liberty propose deux endpoints HTTP sans authentification.

EndpointRôleRenvoie
GET /healthSonde de vivacité — le processus tourne.{ "status": "ok", "version": "<version>" }
GET /infoIntrospection runtime — quelle configuration est chargée.Un objet JSON plus volumineux avec les connecteurs, les pools, les entrées du dictionnaire, les écrans, les menus, les graphiques, les tableaux de bord, le backend d'authentification, l'état IA, le mode de licence.

Les deux sont non authentifiés — ils sont conçus pour être interrogés par l'infrastructure, pas par les utilisateurs. La charge utile de /info ne diffuse aucun secret (ni mot de passe, ni jeton, ni clé de signature JWT) — uniquement des compteurs structurels et des drapeaux de configuration.


/health — vivacité

L'endpoint le plus simple. Renvoie 200 et un corps JSON quand le processus est démarré et sert les requêtes.

curl http://localhost:8000/health
{ "status": "ok", "version": "2026.06.1" }
ChampCe qu'il porte
statusToujours "ok" quand l'endpoint répond. Le code HTTP (200) est le vrai signal — si le processus est arrêté, on obtient une erreur de connexion ou un 5xx, pas "status": "down".
versionLa chaîne de version du framework (équivalent à pip show liberty-next ou à l'étiquette de l'image Docker).

À utiliser pour

SondeConfiguration
Healthcheck DockerHEALTHCHECK CMD curl -fsS http://localhost:8000/health || exit 1
Sonde de vivacité KuberneteslivenessProbe: { httpGet: { path: /health, port: 8000 } }
AWS ALB / GCP LB / nginxPointer le contrôle de santé sur /health. Statut attendu par défaut : 200.
Supervision externe (UptimeRobot, Datadog Synthetic)Idem — appeler l'endpoint /health, alerter sur tout statut différent de 200.

Cadence d'interrogation

Intervalle conseillé
Vivacité Docker / KubernetesToutes les 10 à 30 secondes. Trop fréquent consomme du CPU ; trop espacé retarde la reprise.
Load balancer cloudToutes les 10 secondes en règle générale.
Supervision externeToutes les 30 à 60 secondes.

L'endpoint est peu coûteux (pas d'appel BDD) — une interrogation à haute fréquence ne pose pas de problème, elle est juste inutile.


/info — introspection runtime

Une charge utile plus volumineuse, avec tout ce que le framework sait de sa propre configuration. Utile pour les tableaux de bord, les tests rapides, les audits.

curl http://localhost:8000/info | jq

Exemple de réponse :

{
"name": "Liberty",
"version": "2026.06.1",
"connectors_loaded": 4,
"connectors": ["default", "crm", "reporting", "jdedwards"],
"pools": ["default", "crm_pool", "reporting_pool", "jde_pool"],
"dictionary": {
"entries": 412,
"default_language": "en"
},
"menus": {
"apps": ["crm", "reporting"]
},
"screens": {
"apps": ["crm", "reporting"],
"total": 47
},
"charts": {"total": 12},
"dashboards": {"total": 5},
"auth": {
"backend": "db",
"pool": "default",
"oidc_enabled": true
},
"ai": {
"enabled": true,
"available": true,
"model": "claude-opus-4-7"
},
"crypto": {"configured": true},
"license": {"mode": "full"},
"frontend": "/app/frontend/dist"
}

Sens de chaque champ

ChampCe qu'il indique
name, versionIdentité du framework.
connectors_loaded, connectorsNombre et liste des connecteurs chargés. En baisse → soit une erreur de configuration, soit un connecteur sous licence qui a été ignoré (voir license.mode).
poolsLes pools SQL gérés par le framework.
dictionary.entriesTotal des entrées du dictionnaire (communes + par connecteur). À contrôler sur une installation neuve : doit correspondre à ce que vous avez commité.
dictionary.default_languageLa langue de repli du dictionnaire quand une requête n'exprime aucune préférence linguistique.
menus.appsApplications dotées d'un menu (= visibles dans le sélecteur d'applications quand show_in_switcher est actif).
screens.apps, screens.totalCouverture par application et nombre total d'écrans.
charts.total, dashboards.totalCompteurs.
auth.backend"toml" ou "db".
auth.pool(backend db uniquement) Le nom du pool qu'utilise le magasin d'authentification.
auth.toml(backend toml uniquement) Chemin du fichier d'authentification sur disque.
auth.oidc_enabledIndique si la connexion OIDC est câblée.
ai.enabled / ai.available / ai.modelSi l'assistant IA est activé, si le fournisseur configuré répond, et l'identifiant du modèle.
crypto.configuredIndique si la clé maîtresse est renseignée (true = les valeurs ENC: peuvent être déchiffrées).
license.mode"full" (connecteurs sous licence chargés) ou "restricted" (sans licence — seul le framework ouvert fonctionne).
frontendChemin du répertoire de build React.

À utiliser pour

SchémaExemple
Test rapide post-déploiementRécupérer /info après un déploiement ; vérifier que la version correspond à ce qui a été déployé, que le compte connectors_loaded correspond à ce que définit votre dépôt d'apps, et que crypto.configured = true.
Supervision de licenceAlerter quand license.mode bascule sur "restricted" — une licence a expiré ou n'a pas été installée.
Tableau de disponibilité IASuivre ai.available — si la valeur passe à false sans raison, le LLM amont est injoignable.
Détection de dérive de configurationCapturer /info quotidiennement ; comparer avec la capture précédente pour détecter les changements inattendus.

À NE PAS utiliser pour

  • Les métriques de performance/info est une capture de configuration, pas un endpoint de métriques. Pour la latence et le débit, câbler un APM.
  • L'état par utilisateur — aucune donnée utilisateur dans la charge utile, par conception.

Câblage vers Kubernetes

Une spécification de pod minimale avec les deux sondes :

apiVersion: apps/v1
kind: Deployment
metadata:
name: liberty
spec:
replicas: 1
selector:
matchLabels: { app: liberty }
template:
metadata:
labels: { app: liberty }
spec:
containers:
- name: liberty
image: ghcr.io/fblettner/liberty-next:2026.06.1
ports:
- containerPort: 8000
env:
- { name: LIBERTY_APPS_DIR, value: /apps/config }
- { name: LIBERTY_MASTER_KEY, valueFrom: { secretKeyRef: { name: liberty-secrets, key: master-key } } }
- { name: LIBERTY_JWT_SECRET, valueFrom: { secretKeyRef: { name: liberty-secrets, key: jwt-secret } } }
- { name: DATABASE_URL, valueFrom: { secretKeyRef: { name: liberty-secrets, key: database-url } } }
volumeMounts:
- { name: apps, mountPath: /apps, readOnly: true }
# Liveness — restart the pod if /health fails for too long
livenessProbe:
httpGet: { path: /health, port: 8000 }
initialDelaySeconds: 30 # give the framework time to bootstrap
periodSeconds: 15
timeoutSeconds: 3
failureThreshold: 3
# Readiness — keep the pod out of the service until it's healthy
readinessProbe:
httpGet: { path: /health, port: 8000 }
initialDelaySeconds: 10
periodSeconds: 5
timeoutSeconds: 2
failureThreshold: 2
volumes:
- name: apps
persistentVolumeClaim: { claimName: liberty-apps-pvc }

Liberty propose un unique endpoint /health qui sert à la fois la vivacité et la disponibilité — le framework tourne (et sert les requêtes) ou il ne tourne pas. Pour un contrôle de disponibilité plus strict (par exemple « chaque pool est connecté, chaque configuration est chargée »), analyser /info et conditionner sur connectors_loaded > 0 et crypto.configured = true.


Supervision externe

Pour des métriques complètes, Liberty n'expose pas en standard un endpoint Prometheus /metrics. Les schémas d'intégration :

Schéma A — Métriques au niveau du processus via un sidecar

Lancer un sidecar qui collecte les métriques de processus ou de conteneur (CPU, RAM, réseau) — node_exporter pour le bare metal, cAdvisor pour Docker, kubelet pour Kubernetes. Le processus Liberty apparaît comme un conteneur ; vous obtenez son utilisation des ressources sans que le framework ait à exposer quoi que ce soit.

Schéma B — Métriques dérivées des journaux

Les journaux structurés de Liberty couvrent la plupart des signaux applicatifs — chemins de requête, latences (quand DEBUG est activé), résultats d'exécution des jobs, erreurs de connecteur. Router les journaux vers Loki / ELK / Datadog Logs et bâtir des alertes sur les motifs de journal :

ERROR · liberty.jobs · run_a8c4d failed → page on-call
WARN · liberty.connectors · pool default overflow → capacity alert

C'est la voie sur laquelle la plupart des installations finissent — tirer parti de ce qui est déjà dans les journaux plutôt qu'ajouter un endpoint de métriques.

Schéma C — Exportateur Prometheus sur mesure

Pour les installations qui ont besoin d'un vrai scraping Prometheus, exposer un petit endpoint /metrics via un plugin Python ou un sidecar qui interroge /info et ré-émet les compteurs pertinents (connecteurs chargés, taille des pools, mode de licence) sous forme de gauges Prometheus. ~30 lignes de code ; non fourni avec le framework aujourd'hui.

Schéma D — APM (Datadog APM, New Relic, OpenTelemetry)

Pour les histogrammes de latence par requête et le chronométrage par requête, l'intégration FastAPI standard :

pip install datadog-api-client # or opentelemetry-instrumentation-fastapi

Puis câbler le middleware dans app.toml via un hook de plugin. Liberty ne fournit pas d'intégration APM intégrée — l'écosystème FastAPI couvre ce besoin.


Ce que /health et /info NE sont PAS

Idée reçueRéalité
/health fait un contrôle approfondi (BDD joignable, IA disponible).Non — il renvoie 200 dès que le processus est démarré. Pour des contrôles plus poussés, analyser /info ou écrire un endpoint de sonde sur mesure.
/info diffuse des secrets.Non — par conception, ni mot de passe, ni jeton, ni clé de signature. Inspecter les sources en cas de doute ; la liste des champs ci-dessus est exhaustive.
/health est limité en débit.Non — interroger à la cadence requise par votre sonde.
Les endpoints respectent les permissions.Non — ils sont sans authentification, accessibles à tout client qui peut joindre le port HTTP du framework. Restreindre via un pare-feu ou un reverse proxy si nécessaire (par exemple, n'autoriser que le LB et la supervision à joindre le port).

Pièges courants

ErreurSymptômeCorrection
Intervalle de sonde plus court que le temps d'amorçage.Le pod redémarre en boucle — l'orchestrateur le tue avant la fin du bootstrap.Régler initialDelaySeconds à au moins 30 secondes.
Framework exposé publiquement avec /info joignable.N'importe qui sur Internet peut lire votre inventaire de configuration.Restreindre au niveau du reverse proxy (renvoyer 403 sur /info) si ce n'est pas intentionnellement public.
La sonde attend une forme de corps précise.La forme de réponse Liberty change entre versions — les alertes sur le contenu cassent à la mise à niveau.S'appuyer uniquement sur le code HTTP pour la vivacité.
Confondre license.mode = "restricted" avec une erreur.Le framework fonctionne parfaitement — seuls les connecteurs sous licence sont ignorés.Traiter "restricted" comme une information ; n'alerter que si vous attendiez "full".

La suite