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
L’interface web affiche ce graphe avec des couleurs de liens pilotees par la gravite du trafic et des couleurs de libelles pilotees par la famille de protocole — voir Lire le graphe de decouverte.
La capture de paquets est une dependance d’execution
Les valeurs de bande passante proviennent des paquets captures : l’hote doit donc disposer d’un runtime pcap et du privilege permettant de l’ouvrir. C’est une exigence d’execution uniquement — rien n’est necessaire pour compiler ou mettre a jour l’agent.
| Plateforme | Necessite | Privileges |
|---|---|---|
| Windows | L’installeur du runtime Npcap (npcap.com). Ni SDK ni en-tetes : l’agent charge wpcap.dll au demarrage. |
Administrateur / LocalSystem si Npcap a ete installe avec l’option Restrict driver access to Administrators only (valeur par defaut actuelle). |
| Linux | Le runtime libpcap (libpcap0.8 sur Debian/Ubuntu, libpcap sur RHEL). Le paquet -dev ne sert qu’a la compilation. |
CAP_NET_RAW, soit en executant en root, soit via setcap cap_net_raw+ep <binaire agent>. |
Sur RHEL, le binaire livre est lie a libpcap.so.0.8 alors que la distribution fournit libpcap.so.1. Creez le lien une fois pour toutes :
ln -s /usr/lib64/libpcap.so.1 /usr/lib64/libpcap.so.0.8
Ce que l’on perd sans capture
L’echec est silencieux et l’agent reste actif. Il journalise qu’il poursuit sans capturer de paquets et continue de collecter tout le reste :
- Conserve — l’inventaire complet des connexions (IP et port local/distant, PID, nom du processus, sens, interface). La carte de topologie reste intacte.
- Conserve — les libelles de protocole, mais deduits du seul numero de port et du nom de processus, sans preuve sur le fil. Tous relevent du niveau de confiance devine, ce qui explique que la categorie Unidentified du filtre Proto grossisse sur un hote sans capture.
- Perdu — toutes les valeurs en kbits/s. Le trafic entrant / sortant par processus reste a
0, l’usage des liens de la carte reste a0, et les seuils de trafic ne peuvent jamais se declencher.
Les metriques qui ne dependent pas de la capture ne sont pas affectees : netBytesRate et netTxDrops par interface proviennent des compteurs de l’OS, tout comme les metriques CPU, memoire, disque et systeme de fichiers.
Le statut de capture est remonte : un zero n’est jamais ambigu
Une bande passante a 0 a la meme apparence qu’un lien reellement inactif ou qu’une absence de pilote pour la mesurer. Chaque cycle de collecte remonte donc un statut de capture avec les metriques, que l’interface web expose :
- un badge ambre No packet capture dans la barre d’outils du graphe de decouverte, dont l’infobulle reprend telle quelle la raison remontee par l’agent (pas de runtime pcap, permission refusee, aucune interface exploitable) ;
- une ligne en tete du menu deroulant du filtre Proto, qui explique la categorie Unidentified la ou on la rencontre ;
- les infobulles des liens affichent “not measured — no packet capture” au lieu de
0.000 kbits/s, et leur mini-courbe de bande passante est supprimee plutot que tracee a plat a partir d’un historique de zeros ; - dans le rapport processus, les pastilles de seuil Traffic In et Traffic Out ainsi que leurs deux panneaux de graphique portent une icone d’avertissement. Aucune autre metrique de ce rapport n’est concernee.
Lorsque plusieurs agents sont fusionnes sur une meme carte (niveau 2), le badge signifie qu'au moins un agent contributeur n’a pas pu capturer, et le libelle le precise.
Un 0.000 reel reste affiche quand la capture fonctionne — celui-la est une mesure.
Parametres de comportement de la capture
| Cle | Defaut | Effet |
|---|---|---|
discoCapInterval |
"10" |
Secondes de trafic ecoutees par cycle de collecte. |
discoProtocolDetectionEnabled |
"true" |
Identification du protocole applicatif a partir du contenu des paquets. Passez a "false" sur les hotes ou l’inspection du contenu n’est pas souhaitee : la boucle de capture ne touche alors jamais au contenu des paquets, et les protocoles retombent sur la deduction par port et nom de processus. |
discoCaptureLoopbackEnabled |
"false" |
Capture l’interface de bouclage, ou transite l’IPC local a l’hote. Attendez-vous a une hausse des valeurs de bande passante une fois active, puisque le trafic local commence a etre comptabilise — d’ou la valeur par defaut desactivee. |
Les deux drapeaux sont relus au debut de chaque cycle de collecte : une modification prend effet au cycle suivant, sans redemarrage. Une cle absente ou illisible retombe sur le defaut ci-dessus, afin que les configurations ecrites avant l’existence de ces cles conservent leur comportement.
lo) ; les peripheriques pcap Windows s’appellent \Device\NPF_…, le drapeau n’y a donc aucun effet. Si l’adaptateur Npcap Loopback est installe sur un hote Windows, le trafic de bouclage est capture quel que soit le reglage.
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 |
Metriques par element et peripheriques disparus
Les metriques disque et reseau sont stockees par element — une serie par disque, point de montage ou interface. L’agent cree une serie a la premiere apparition de l’element et ne la supprime jamais : un disque USB monte une seule fois, ou une carte reseau que l’OS a depuis renommee, laisse donc une serie qui ne recoit plus d’echantillon.
Deux mecanismes les ecartent :
- Les rapports les excluent. Pour les elements auto-decouverts (disques, interfaces reseau), une serie n’ayant produit aucun echantillon dans la fenetre demandee est entierement omise du rapport : l’interface cesse d’afficher un panneau « aucune donnee » pour un disque qui n’existe pas. Un element simplement inactif continue d’ecrire un echantillon a chaque cycle et n’est pas concerne.
- La retention les supprime. La purge nocturne supprime tout element dont l’echantillon le plus recent precede la fenetre de retention, ainsi que ses entrees de changement et de statut.
La retention couvre toutes les metriques
La purge des metriques parcourt l’ensemble du magasin plutot qu’une liste figee de noms, car le jeu de metriques varie selon la plateforme (ni load average ni I/O wait sous Windows) et s’enrichit a chaque version.
Apres une mise a jour, la premiere purge nocturne peut avoir des mois d’echantillons accumules a supprimer pour les metriques jamais purgees jusqu’ici (sockets TCP, taux de swap, et toutes les series disque et reseau par peripherique). Elle s’execute en une transaction par metrique afin de ne pas bloquer la collecte pendant tout le traitement.
Le fichier de base de donnees ne retrecit pas : les pages liberees sont reutilisees pour les nouveaux echantillons plutot que rendues au systeme de fichiers. Ce qui change, c’est qu’il cesse de grossir.
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 |