Aller au contenu principal

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

ServiceImplémentationDétails
saturninternal/adapters/kafkahealth (Go, segmentio/kafka-go)Reflète svc.Health (PostgreSQL + ES).
dnsdhcpinternal/adapters/kafkahealth (Go)Reflète l'état du stockage fichier (file) du service DB-less.
venussrc/modules/fleet/health-emitter.service.ts (NestJS, kafkajs)Producteur au bootstrap applicatif.
mercureapp/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éthodeCheminDescription
GET/fleetListe des instances ayant émis un health state.
POST/health/stateIngest 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 → FleetServiceLogsApiClient.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) :

VariableDéfautPortée
KAFKA_ENABLEDtrueTous
KAFKA_BOOTSTRAP_SERVERScentral-kafka:9092Tous
HEALTH_TOPICleukos-health-stateTous
HEALTH_EMIT_INTERVAL15Émetteurs
INSTANCE_IDnom du serviceÉmetteurs Go/Venus
HEALTH_GROUP_IDmercure-fleetMercure (consumer)
HEALTH_INDEXleukos-health-stateMercure (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.