Discovery Agent
Le Discovery Agent surveille l’hote sur lequel il s’execute, decouvre les services, collecte les metriques systeme et processus, et genere des alertes basees sur des seuils.
Vue d’ensemble
| Propriete | Valeur |
|---|---|
| Nom du service | MugnsoftDiscoveryAgent |
| Port par defaut | 8070 |
| Fichier de configuration | discovery_agent.json |
| Version | v4.0.0 |
| Stockage | magasin cle-valeur integre (discovery.db, metrics.db, process.db, system.db) |
Gestion du service
Commandes CLI
# Install as service and register with the Webserver
discovery_agent install <webserver_ip>:<port>
# Re-register with the Webserver
discovery_agent register <webserver_ip>:<port>
# Migrate to a new Webserver
discovery_agent migrate <webserver_ip>:<port> <jwt_token>
# Start / Stop / Restart
discovery_agent start
discovery_agent stop
discovery_agent restart
# Run in foreground
discovery_agent run
# Remove the service
discovery_agent uninstall
Configuration
Parametres principaux
{
"name": "agent1",
"port": "8070",
"webserver": "192.168.1.100:8050",
"integratorEndPoint": "192.168.1.100:8052",
"location": "Datacenter-1",
"sched": "5MIN",
"processes": "nginx,mysql,java",
"ports": "80,443,3306",
"logLevel": "info"
}
| Champ | Description | Valeur par defaut |
|---|---|---|
name |
Identifiant unique de l’agent | obligatoire |
port |
Port d’ecoute de l’API | "8070" |
webserver |
IP:port du Webserver pour l’enregistrement | obligatoire |
integratorEndPoint |
IP:port de l’Integrator pour le transfert de donnees | (vide) |
probeEndPoint |
Sonde(s) qui executent les controles URL/API/port delegues (obligatoire si urls, apis ou ports sont definis) |
(vide) |
appName |
Nom de l’application sous laquelle les donnees de cet agent sont regroupees | (vide) |
location |
Label de localisation geographique/logique | (vide) |
tags |
Tags separes par des virgules pour la categorisation | (vide) |
sched |
Intervalle de decouverte | "5MIN" |
schedMonitors |
Intervalle des controles de moniteurs delegues | identique a sched |
processes |
Noms de processus separes par des virgules a surveiller | (vide) |
ports |
Ports separes par des virgules a surveiller | (vide) |
Options de planification
| Label | Intervalle |
|---|---|
1MIN |
Toutes les minutes |
2MIN |
Toutes les 2 minutes |
5MIN |
Toutes les 5 minutes |
10MIN |
Toutes les 10 minutes |
30MIN |
Toutes les 30 minutes |
1H |
Toutes les heures |
4H |
Toutes les 4 heures |
8H |
Toutes les 8 heures |
1D |
Quotidien |
Arborescence des repertoires
<install_dir>/
├── discovery_agent(.exe) # Executable
├── discovery_agent.json # Configuration du service
├── config/
│ ├── sec/ # Cles RSA
│ └── ssl/ # Certificats TLS
├── data/
│ ├── process_list.txt # Noms des processus surveilles
│ ├── port_list.txt # Ports reseau surveilles
│ ├── process_thresholds.json # Configuration des seuils par processus
│ ├── system_thresholds.json # Configuration des seuils systeme
│ ├── discover_metrics.json # Dernieres metriques collectees
│ └── alerts.json # Alertes generees
├── dbs/ # Bases de donnees cle-valeur integrees
│ ├── discovery.db # Donnees de decouverte principales
│ ├── metrics.db # Historique des metriques
│ ├── process.db # Donnees des processus
│ ├── system.db # Donnees systeme
│ └── backup/ # Sauvegardes automatisees
└── log/ # Fichiers journaux avec rotation
Mecanismes de decouverte
Decouverte des processus
Le Discovery Agent surveille les processus par nom. Configurez les processus a surveiller :
Methode 1 : Fichier de configuration
{
"processes": "nginx,mysqld,java,python3"
}
Methode 2 : Fichier de liste de processus (data/process_list.txt)
nginx:web,production
mysqld:database,production
java:application
python3.12:scripts
Format : nomprocessus[.exe]:tag1,tag2 (separe par deux-points, avec tags optionnels)
Decouverte des ports
Surveillez quels processus ecoutent sur des ports specifiques :
Fichier de configuration :
{
"ports": "80,443,3306,5432,8080"
}
Fichier de liste de ports (data/port_list.txt) :
80
443
3306
5432
L’agent associe les ecouteurs de ports aux noms de processus via l’enumeration des connexions TCP.
Decouverte du trafic reseau
Utilise la capture de paquets (pcap) via la bibliotheque gopacket pour l’analyse du trafic en direct :
- Capture les paquets sur toutes les interfaces reseau
- Duree configurable via
discoCapInterval - Agrege le trafic par identifiant de processus (PID)
- Calcule la bande passante en kbits/s (entrant/sortant)
- Genere un graphique de topologie reseau au format Cytoscape pour la visualisation
Moniteurs delegues (controles URL / API / port)
Au-dela des metriques de l’hote, un agent de decouverte peut definir des controles synthetiques — urls, apis, pings, nslookups, tcps, dbs et syss — directement dans sa configuration. L’agent n’execute pas ces controles lui-meme ; il les delegue a une ou plusieurs sondes Monitor nommees dans probeEndPoint.
{
"appName": "Shop",
"probeEndPoint": "probe1,probe-win2",
"ports": "80,443,3306",
"urls": [{ "name": "shop-home", "url": "https://shop.example.com/" }],
"apis": [
{
"name": "checkout-api",
"url": "https://api.example.com/health",
"typeApi": "GET"
}
]
}
probeEndPoint est obligatoire des que urls, apis ou ports sont definis. Sans lui, l’agent journalise une erreur et les controles ne sont pas enregistres. L’intervalle de ces controles delegues est pilote par schedMonitors.
Cela permet de decrire toute la surface de service d’un hote (sante systeme et ses endpoints) au meme endroit, tandis que l’execution reelle des URL/API se fait sur une sonde ayant un acces reseau aux cibles.
Metriques collectees
Metriques systeme
| Metrique | Description | Configuration des seuils |
|---|---|---|
| CPU % | Pourcentage d’utilisation CPU global | discoCPUGFixedThreshCri/Maj/Min |
| Memory % | Pourcentage d’utilisation memoire | discoMEMGFixedThreshCri/Maj/Min |
| Load Average (Linux) | Charge moyenne sur 5 minutes | discoLoadAvg5minGFixedThreshCri/Maj/Min |
| Filesystem % | Utilisation disque par point de montage | discoFSGFixedThreshCri/Maj/Min |
| TCP Sockets | Nombre de sockets TCP ouverts | discoTCPSocketsGFixedThreshCri/Maj/Min |
| CPU I/O Wait (Linux) | Temps CPU en attente d’E/S | discoCpuIOWaitGFixedThreshCri/Maj/Min |
| Uptime | Temps de fonctionnement du systeme | (informatif) |
| Boot time | Horodatage du dernier demarrage | (informatif) |
Metriques par processus
| Metrique | Description | Configuration des seuils |
|---|---|---|
| CPU % | Utilisation CPU du processus | discoCPUPFixedThresh* ou discoCPUPAutoThreshold |
| Memory | Utilisation memoire RSS | discoMEMPFixedThresh* ou discoMEMPAutoThreshold |
| Swap | Utilisation du swap | discoSWAPPFixedThresh* ou discoSWAPPAutoThreshold |
| I/O Read | Octets lus sur disque/s | discoIostatReadPFixedThresh* ou auto |
| I/O Write | Octets ecrits sur disque/s | discoIostatWritePFixedThresh* ou auto |
| CPU User % | Temps CPU en mode utilisateur | discoCPUUserPFixedThresh* |
| Threads | Nombre de threads | discoNumThreadsPFixedThresh* |
| File Descriptors (Linux) | Nombre de descripteurs de fichiers ouverts | discoNumFDsPFixedThresh* |
| Network Traffic In | Bande passante entrante (kbits/s) | via trafficThresholds |
| Network Traffic Out | Bande passante sortante (kbits/s) | via trafficThresholds |
Activation/desactivation des metriques
Chaque metrique peut etre activee ou desactivee individuellement :
{
"discoCPUGMonEnabled": "true",
"discoMEMGMonEnabled": "true",
"discoLoadAvg5minGMonEnabled": "true",
"discoCPUPMonEnabled": "true",
"discoMEMPMonEnabled": "true",
"discoSWAPPMonEnabled": "false"
}
Configuration des seuils
Seuils fixes
Definissez des valeurs de seuil explicites par metrique :
{
"discoCPUGFixedThreshCri": "95",
"discoCPUGFixedThreshMaj": "85",
"discoCPUGFixedThreshMin": "75"
}
Seuils automatiques
Laissez l’agent calculer les seuils a partir des donnees historiques :
{
"discoCPUPAutoThreshold": "true",
"discoMEMPAutoThreshold": "true"
}
Les seuils automatiques utilisent une analyse statistique (ecart-type) des metriques historiques pour definir dynamiquement les valeurs de seuil.
Quand le seuil automatique est active pour une metrique, laissez les champs *FixedThresh* correspondants vides (""). L’interface web affiche ces champs avec ∞ : pendant le calcul de la baseline (periode de warm-up), aucune alerte n’est emise pour cette metrique.
999999999999999.00 a cet effet — l’agent normalise desormais automatiquement cette valeur heritee en "" au chargement et a la sauvegarde de sa configuration.
Seuils de trafic
Seuils de trafic reseau par processus avec operateurs directionnels :
{
"trafficThresholds": {
"nginx": {
"operator": ">",
"critical": 10000,
"major": 5000,
"minor": 1000
}
}
}
Operateurs : > (alerter lorsque au-dessus) ou < (alerter lorsque en dessous).
Alertes
Niveaux de statut des alertes
| Niveau | Entier | Description |
|---|---|---|
| OK | 0 | Dans la plage normale |
| MINOR | 1 | Seuil mineur depasse |
| MAJOR | 2 | Seuil majeur depasse |
| CRITICAL | 3 | Seuil critique depasse |
Canaux de notification
Identiques aux autres composants :
| Canal | Configuration |
|---|---|
smtpEnabled, smtpServerName, smtpPort, smtpUsername, smtpPwd, smtpTLS |
|
| Slack | slackChannel, slackToken |
| Teams | teamsWebhook |
| PagerDuty | pagerDutyAPIKey |
| Script personnalise | scriptAction, scriptActionT |
Temporisation des alertes
| Parametre | Description |
|---|---|
notifyAfter |
Attendre N depassements consecutifs de seuil avant la premiere alerte |
notifyFor |
Continuer les alertes pendant N cycles apres le depassement |
notifyStatus |
Niveau de statut minimum pour declencher (ex. : “CRITICAL”) |
Routage des alertes
Les alertes peuvent etre acheminees de deux facons :
- Via l’Integrator (recommande) – le Discovery Agent envoie les metriques a l’Integrator, qui gere les alertes de maniere centralisee
- Alertes locales – le Discovery Agent envoie les alertes directement via les canaux configures (lorsqu’aucun Integrator n’est configure)
La concurrence est controlee par des semaphores : 20 goroutines simultanees pour la communication avec l’Integrator, 10 pour les alertes locales.
Flux d’execution
Cron trigger (every N minutes)
|
v
execDiscovery()
|
v
runDiscoveryMetrics()
├── CollectSystemMetrics() --> CPU, memory, load, FS, sockets
├── CollectProcessMetrics() --> per-process CPU, memory, I/O, traffic
├── CollectNetworkMetrics() --> pcap traffic capture, connections
└── GenerateCytoscapeData() --> network topology graph
|
v
Write data/discover_metrics.json + data/alerts.json
|
v
discoveryDataFile()
├── processMetricsKV() --> evaluate per-process thresholds
├── systemMetricsKV() --> evaluate system thresholds
└── Route alerts:
├── goDataSent2Integrator() (if Integrator configured)
└── goHandleAlerting() (local fallback)
Taches cron en arriere-plan
| Tache | Planification | Objectif |
|---|---|---|
| Decouverte | Configurable par l’utilisateur (1MIN-1D) | Collecte principale des metriques |
| Metriques systeme | Toutes les minutes | Echantillonnage leger CPU/memoire |
| Sauvegarde automatique | Intervalle configurable | Sauvegardes cle-valeur integrees |
| Purge des metriques | Quotidien a 01:00 | Suppression des anciennes metriques |
| Purge des moniteurs | Quotidien a 03:00 | Nettoyage des donnees historiques |
Endpoints de l’API REST
Authentification
| Methode | Chemin | Description |
|---|---|---|
| POST | /api/auth |
Connexion (JWT) |
| POST | /loginComponent |
Jeton composant (15min) |
| POST | /loginComponent1Year |
Jeton d’un an |
| GET | /refresh_token |
Rafraichir le JWT |
Decouverte
| Methode | Chemin | Description |
|---|---|---|
| GET | /runDiscovery |
Declencher la collecte immediate des metriques |
| GET | /getProcessByPort/:port |
Obtenir le processus utilisant un port specifique |
| POST | /computeThreshold |
Calculer les seuils de reference automatiques |
Acces aux donnees
| Methode | Chemin | Description |
|---|---|---|
| GET | /api/db/:dbname/bucket/:bucket/key/:key |
Obtenir une metrique specifique |
| GET | /v1/db/:dbname/bucket/:bucket/all |
Toutes les cles/valeurs |
| GET | /v1/db/:dbname/bucket/:bucket/allJSON |
Toutes les donnees en JSON |
| GET | /api/reportSysMetricsGraph/:start/:end |
Graphique des metriques systeme |
| GET | /:type/reportGraph/:key/:start/:end |
Graphique des metriques de processus |
Parametres
| Methode | Chemin | Description |
|---|---|---|
| GET | /api/setting |
Obtenir la configuration actuelle |
| POST | /updateSetting |
Mettre a jour la configuration |
| GET | /setting |
Obtenir les parametres (chiffres) |
Sante
| Methode | Chemin | Description |
|---|---|---|
| GET | /ping |
Verification de sante |
| GET | /uptime |
Temps de fonctionnement du service |
| GET | /api/metrics |
Metriques systeme actuelles |
| GET | /docs |
Documentation Swagger |
Sauvegarde et restauration
| Methode | Chemin | Description |
|---|---|---|
| POST | /backupDatabase |
Sauvegarde manuelle |
| POST | /reinitDatabase |
Reinitialiser les bases de donnees |
| GET | /api/backupKV |
Sauvegarde via l’API |
| GET | /api/reinitKV |
Reinitialisation via l’API |
Certificats
| Methode | Chemin | Description |
|---|---|---|
| GET | /reloadCertificates |
Recharger les certificats TLS |
| GET | /getCert |
Obtenir le certificat TLS |
| POST | /getCertFile/:filename |
Recevoir un fichier de certificat |
Journaux
| Methode | Chemin | Description |
|---|---|---|
| GET | /discovery/logfile/:key/:filename |
Telecharger un fichier journal |
| GET | /partServerlogfile/:nbbytes |
Diffuser les entrees de journal recentes |
| GET | /serverlogfiles/:filename |
Telecharger une archive de journaux |