Flotte & santé réseau
Toutes les API du réseau central (saturn, venus, mercure, dnsdhcp) sont
connectées à Kafka et émettent périodiquement un health state. Mercure
consomme ce flux et persiste le dernier état de chaque instance dans
Elasticsearch. Le web Venus expose ces machines dans l'onglet Network → Flotte.
En complément du flux Kafka, Mercure accepte aussi des états externes via HTTP
(POST /health/state) pour les agents hors cluster central (ex: appserver-agent).
Flux
Contrat du message (leukos-health-state)
Chaque instance publie sur le topic Kafka leukos-health-state un message JSON :
{
"service": "saturn",
"instance_id": "central-saturn",
"status": "up",
"address": "central-saturn",
"port": 8130,
"storage": { "postgresql": "up", "elasticsearch": "up" },
"timestamp": "2026-08-11T08:53:43Z",
"meta": {}
}
- La clé Kafka vaut
"{service}:{instance_id}". status:up|degraded|down.- L'intervalle d'émission est réglé par
HEALTH_EMIT_INTERVAL(15 s par défaut).
Émetteurs
| Service | Implémentation | Détails |
|---|---|---|
saturn | internal/adapters/kafkahealth (Go, segmentio/kafka-go) | Reflète svc.Health (PostgreSQL + ES). |
dnsdhcp | internal/adapters/kafkahealth (Go) | Reflète l'état du stockage fichier (file) du service DB-less. |
venus | src/modules/fleet/health-emitter.service.ts (NestJS, kafkajs) | Producteur au bootstrap applicatif. |
mercure | app/infra/kafka_health.py (aiokafka) | Émet et consomme le topic. |
Persistance Elasticsearch
Mercure indexe chaque état dans l'index leukos-health-state, avec un
identifiant de document stable "{service}:{instance_id}" : chaque instance ne
conserve donc qu'un seul document, toujours à jour (dernier état connu).
Endpoint flotte (central-mercure)
| Méthode | Chemin | Description |
|---|---|---|
GET | /fleet | Liste des instances ayant émis un health state. |
POST | /health/state | Ingest d'un état externe (payload identique au message Kafka). |
{
"instances": [
{
"service": "saturn",
"instance_id": "central-saturn",
"status": "up",
"address": "central-saturn",
"port": 8130,
"storage": { "postgresql": "up", "elasticsearch": "up" },
"timestamp": "2026-08-11T08:53:43Z"
}
]
}
Requête GraphQL Venus
Venus proxifie la flotte via la requête fleet (dispatcher CQRS → FleetService
→ LogsApiClient.fleet()), consommée par l'onglet Network → Flotte du web.
La vue flotte ne fusionne pas de sources supplémentaires côté frontend : la source de vérité est l'API Mercure.
query Fleet {
fleet {
service
instanceId
status
address
port
storage
timestamp
meta
}
}
Configuration
Variables d'environnement communes (voir config/yaml/dev.yml) :
| Variable | Défaut | Portée |
|---|---|---|
KAFKA_ENABLED | true | Tous |
KAFKA_BOOTSTRAP_SERVERS | central-kafka:9092 | Tous |
HEALTH_TOPIC | leukos-health-state | Tous |
HEALTH_EMIT_INTERVAL | 15 | Émetteurs |
INSTANCE_ID | nom du service | Émetteurs Go/Venus |
HEALTH_GROUP_ID | mercure-fleet | Mercure (consumer) |
HEALTH_INDEX | leukos-health-state | Mercure (ES) |
Résilience en cas d'indisponibilité Elasticsearch
Si l'indexation Elasticsearch échoue (ex: quota de shards atteint), Mercure
conserve le dernier état en mémoire et continue de servir /fleet pour garder la
visibilité opérationnelle de la flotte.