InfraGuard

Enregistrer un collecteur de base de données

Enregistrez un collecteur access=database sous forme de lignes db@alias par hôte pour alimenter Service ▸ Base de données et les alertes, en stockant le mot de passe avec Crypt ou en le réutilisant via cred_ref=env:PREFIX.

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

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 ligne db@.

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é)

  1. Allez dans Administration ▸ Collecteurs.
  2. Sur la carte de groupe « Bases de données », cliquez sur [Modifier] → onglet Général et renseignez les valeurs partagées.
    • driver : mysql ou mariadb
    • port : 3306 par défaut
    • database : 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:PREFIX pour réutiliser les identifiants de .env
  3. Onglet Bases de données → [Ajouter une BD] → par entrée : alias (obligatoire) · host/IP · mot de passe facultatif.
  4. [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.

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 de REPLICATION CLIENT. PROCESS et SELECT sont 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 --key pour tester un collecteur de base de données précis. Les boutons [Tester] / [Synchroniser le code] ne concernent que les collecteurs access=web et 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 dans finally via DB::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 connections du 2026-08-06).

Accès

Voir les niveaux d’accès pour le schéma complet.

Dépannage et FAQ

Voir aussi

수집기 관리 — 데이터베이스 그룹
수집기 관리 — 데이터베이스 그룹