Vue d’ensemble — à quoi cela sert
Administration ▸ Collecteurs est le registre des collecteurs d’InfraGuard (la table infr_collector). Il sort du code les identifiants et les tables de correspondance d’hôtes codés en dur et les stocke sous forme de données. Les collecteurs sont abstraits par méthode d’accès (access).
| access | Objet | Alimente |
|---|---|---|
web |
Point de terminaison de l’agent distant (sonde tlx · run_report) | Infrastructure ▸ Santé |
database |
Connexion directe à une BD enregistrée pour collecter des métriques de charge | Service ▸ Base de données · Infrastructure ▸ Alertes |
agent |
Collecteur représentant du réseau interne (Redis + nginx-vts) | Service ▸ Sessions (Redis) · Service ▸ Web |
Cet article traite du collecteur access=database. L’application InfraGuard se connecte périodiquement à une BD enregistrée et lit SHOW GLOBAL STATUS · information_schema.processlist · information_schema.tables, en écrivant une série temporelle dans infr_db_metric. Elle ne lit ni n’écrit jamais vos lignes de données — uniquement des métriques de charge et de structure.
Les collecteurs de BD sont la source de l’écran de supervision de la charge BD et des alertes. Enregistrez une BD ici et elle apparaît automatiquement dans les deux.
Quand l’utiliser
- Vous voulez surveiller la saturation des connexions, le débit, les requêtes lentes et la taille des schémas d’instances MySQL / MariaDB en production depuis une console unique.
- Vous intégrez un nouveau serveur de BD à la supervision.
- Vous voulez réutiliser des identifiants de BD déjà présents dans
.envsans ressaisir le secret (cred_ref=env:PREFIX). - Vous gérez plusieurs BD à la fois (valeurs partagées + tableau d’entrées) — utilisez l’éditeur groupé.
Disposition
La liste des collecteurs affiche des cartes regroupées par méthode d’accès. Les lignes access=database sont repliées dans une seule carte de groupe « Bases de données » (pour éviter la prolifération de cartes). Le bouton [Modifier] de la carte de groupe ouvre l’éditeur groupé (2 onglets).
Onglets de l’éditeur groupé
| Onglet | Contenu |
|---|---|
| Général (valeurs de connexion partagées) | driver · port · database · username · seuil de file d’attente (slow_time) · schedule · cred_ref — appliqués à chaque entrée de BD |
| Bases de données (tableau d’entrées) | Par entrée : alias · nom affiché · host/IP · driver (surcharge) · bascule d’exécution · mot de passe (écriture seule) |
Bien que l’interface n’affiche qu’une seule carte de groupe, l’enregistrement fait un upsert de chaque entrée en tant que ligne
db@{alias}distincte (access=database). La chaîne de collecte, Service ▸ Base de données et le ciblage des alertes fonctionnent tous par collecteur. Supprimer une entrée supprime sa lignedb@.
Champs par collecteur (infr_collector)
| Colonne | Signification |
|---|---|
key |
Clé unique. Les entrées de BD sont db@{alias} (p. ex. db@blue) — immuable (les alertes ciblent par clé) |
title |
Nom affiché (par défaut {alias} DB) |
access |
Fixé à database |
kind |
Fixé à metrics |
host_alias |
L’alias de l’entrée (libellé de l’hôte) |
feeds_table |
Fixé à infr_db_metric |
cred_ref |
Référence d’identifiants (p. ex. env:STATS_DB) — si vide, repli sur config + secret_enc |
config |
{driver, host, port, database, username, sample:{slow_time_sec, connect_timeout}} (sans le secret) |
secret_enc |
Mot de passe de la BD (Crypt · écriture seule · jamais renvoyé au navigateur) |
is_run |
Indique si la planification est active |
Utilisation
1. Enregistrer une nouvelle BD (éditeur groupé)
- Allez dans Administration ▸ Collecteurs.
- Sur la carte de groupe « Bases de données », cliquez sur [Modifier] → onglet Général et renseignez les valeurs partagées.
driver:mysqloumariadbport:3306par défautdatabase: uniquement le schéma de connexion par défaut — laissez vide pour vous connecter àinformation_schema(la portée de la collecte est décidée par les droits du compte)username: le compte de supervision (p. ex.infra_ro)- seuil de file d’attente (
slow_time) : compte comme « en attente / accumulée » toute requête s’exécutant depuis plus de ce nombre de secondes (1–60 s, 2 par défaut) cred_ref:env:PREFIXpour réutiliser les identifiants de.env
- Onglet Bases de données → [Ajouter une BD] → par entrée :
alias(obligatoire) ·host/IP · mot de passe facultatif. - [Enregistrer]. Chaque entrée est créée ou mise à jour en tant que ligne
db@{alias}.
2. Gérer le secret — deux voies
(A) Saisir directement le mot de passe — saisi dans le champ de mot de passe, il est stocké chiffré dans secret_enc. La liste et les réponses de l’API n’exposent jamais le texte en clair ; seuls les booléens has_secret/has_db_pw sont renvoyés.
Le mot de passe est en écriture seule. À la modification, laisser le champ de mot de passe vide conserve la valeur existante (aucun écrasement). Pour la supprimer explicitement, utilisez l’option d’effacement.
(B) Réutiliser les identifiants de .env (cred_ref=env:PREFIX) — ne stockez pas le mot de passe dans la BD ; référencez un jeu d’identifiants déjà présent dans .env. DbCollectorService::resolveConn() lit ces clés :
Les valeurs renseignées dans config sont prioritaires ; celles qui sont vides sont complétées depuis les variables d’environnement PREFIX_* (host/port/database/username/password).
3. Requêtes en attente à l’échelle du serveur — le droit PROCESS
Les deux métriques essentielles (saturation des connexions = Threads_running/Threads_connected/max_connections, et QPS · taux de requêtes lentes = ΔQuestions/ΔSlow_queries) sont collectables avec un compte simple (USAGE). En revanche, l’agrégation des requêtes en attente à l’échelle du serveur et l’analyse de la taille de tous les schémas exigent des droits supplémentaires.
- Sans
PROCESS→ seule la processlist de votre propre connexion est visible (waiting_scope=0). - Avec
PROCESS→ toutes les sessions sont agrégées (waiting_scope=1, à l’échelle du serveur).
Script de compte à moindre privilège, à exécuter une fois en tant que root sur chaque hôte de BD cible : sql/infr_db_monitor_grant.sql.
-- Compte dédié en lecture seule (restreignez l’hôte source à l’IP du serveur applicatif InfraGuard)
CREATE USER 'infra_ro'@'%' IDENTIFIED BY 'CHANGE_ME_TO_A_STRONG_SECRET';
-- Droits d’observation globaux (PAS d’accès aux données)
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'infra_ro'@'%';
-- Analyse de la taille des schémas (toutes les BD · lecture seule). Pour une seule BD, restreignez à design.*
GRANT SELECT ON *.* TO 'infra_ro'@'%';
-- Isolation du rayon d’impact — empêche la monopolisation des connexions (leçon de l’incident [1040] du 2026-08-06)
ALTER USER 'infra_ro'@'%' WITH MAX_USER_CONNECTIONS 5;
FLUSH PRIVILEGES;
MariaDB 10.5+ peut utiliser
BINLOG MONITORà la place deREPLICATION CLIENT.PROCESSetSELECTsont identiques.
4. Exécuter et vérifier la collecte
La collecte est réalisée par la commande artisan infr:collect-db. Le panneau du planificateur du lanceur de développement (composer dev) l’appelle chaque minute.
# Échantillonner immédiatement un collecteur une fois (en contournant le contrôle de la politique d’exploitation)
php artisan infr:collect-db --key=db@blue --force
# Collecter toutes les BD enregistrées (is_run=1) selon la politique
php artisan infr:collect-db
Le déclenchement de la collecte est décidé par la Politique d’exploitation.
| Clé de politique | Valeur par défaut | Signification |
|---|---|---|
db_collect_mode |
economy |
economy = collecter uniquement quand un utilisateur de la console est actif (présence) · always = toujours |
db_collect_interval_sec |
60 |
Intervalle de collecte (secondes, minimum 10) |
presence_window_sec |
— | Fenêtre pendant laquelle l’utilisateur reste « présent » après sa dernière activité |
Utilisez
--keypour tester un collecteur de base de données précis. Les boutons [Tester] / [Synchroniser le code] ne concernent que les collecteursaccess=webet ne s’appliquent pas aux collecteurs de base de données — vérifiez avec la commande ci-dessus.
5. Seuils d’état
DbCollectorService::statusOf() tranche entre up et degraded en comparant aux seuils de la Politique d’exploitation.
| Clé de seuil | Valeur par défaut | En cas de dépassement |
|---|---|---|
db_degrade_conn_pct |
80 |
saturation des connexions (%) supérieure ou égale → degraded |
db_degrade_running |
40 |
threads_running supérieur ou égal → degraded |
db_degrade_waiting |
5 |
nombre de requêtes en attente supérieur ou égal → degraded |
db_degrade_slow_qps |
1 |
taux de requêtes lentes (/s) supérieur ou égal → degraded |
Sources de données
| Cible | Table / source | Remarques |
|---|---|---|
| Registre des collecteurs | infr_collector (migrations 000201 + 000680) |
access · config (JSON) · secret_enc (Crypt) |
| Série temporelle collectée | infr_db_metric (migration 000681) |
dérivée de SHOW GLOBAL STATUS · deltas qps/slow_qps |
| État de la BD distante | SHOW GLOBAL STATUS · SHOW VARIABLES max_connections |
connexion directe à chaque BD enregistrée |
| Requêtes en attente | information_schema.processlist |
à l’échelle du serveur avec le droit PROCESS |
| Taille des schémas | information_schema.tables |
cache long de 30 minutes (contournement des requêtes lentes) |
Aucune fuite de connexions.
DbCollectorService::withConn()crée une connexion d’exécution par échantillon et la ferme immédiatement dansfinallyviaDB::purge. Un délai d’expiration PDO (5 s par défaut) empêche les requêtes web et les tâches planifiées d’être bloquées par la latence distante. Ne lancez jamais un démon à boucle infinie depuis le planificateur — il épuise le pool de connexions MySQL partagé (l’incident[1040] Too many connectionsdu 2026-08-06).
Accès
- Accès à l’écran et tout le CRUD : administrateur (niveau ≥ 10) —
CollectorController::isAdmin()vérifieinfr_user_level >= 10en session (demo=1 et staff=5 ne peuvent pas entrer). - En cas d’échec, 403. L’enregistrement, la suppression et
fillsont tous journalisés dansinfr_audit_log/les logs. fill/{key}(injection de la configuration dans un mash-up d’Inventaire ▸ Outils) est une exception d’injection de secrets (documentée §Option B) — administrateurs uniquement et avec audit.
Voir les niveaux d’accès pour le schéma complet.
Dépannage et FAQ
- Les requêtes en attente n’affichent que ma propre connexion — le droit
PROCESSest absent, doncwaiting_scope=0. Accordez-le viasql/infr_db_monitor_grant.sql. - La taille des schémas n’affiche que certaines BD — il vous faut un droit
SELECTglobal (ouSELECTsur la BD concernée). - J’ai changé le mot de passe mais cela n’a pas été pris en compte — à la modification, un champ de mot de passe vide conserve la valeur existante. Saisissez une nouvelle valeur pour la remplacer.
- La carte affiche brièvement down (rouge) en mode economy — la collecte a pris du retard parce qu’aucun utilisateur de console n’est présent. Ouvrir l’écran déclenche un échantillonnage à la demande (ensureFresh), ou passez en mode
always(voir l’évitement du faux rouge dans Service ▸ Base de données). - Je veux changer la clé — la clé
db@{alias}est immuable à la modification (pour la stabilité du ciblage des alertes). Ajoutez une entrée avec un nouvel alias pour créer une nouvelle clé. - Je suis niveau 5 mais l’accès m’est refusé — certains textes indiquent « niveau 5 et plus », mais le contrôle réel est administrateur (niveau ≥ 10).
Voir aussi
- Service ▸ Base de données — l’écran de supervision de la charge et de la structure de la BD
- Concepts de réglage BD — notions de verrous, de cache et d’index
- Infrastructure ▸ Alertes — alertes sur conditions BD (file d’attente · requêtes lentes)
- Politique d’exploitation — mode de collecte, intervalle, seuils d’état
- Niveaux d’accès — le contrôle par niveau administrateur
- Journal d’audit — historique des modifications des collecteurs
