InfraGuard

Registrar un recolector de base de datos

Registre un recolector access=database como filas db@alias por host para alimentar Servicio ▸ Base de datos y las alertas, guardando la contraseña con Crypt o reutilizándola mediante cred_ref=env:PREFIX.

Resumen: qué hace

Administración ▸ Recolectores es el registro de recolectores de InfraGuard (la tabla infr_collector). Saca del código las credenciales y los mapas de host escritos a mano y los guarda como datos. Los recolectores se abstraen por método de acceso (access).

access Finalidad Alimenta
web Endpoint del agente remoto (sonda tlx · run_report) Infraestructura ▸ Estado
database Conexión directa a una BD registrada para recolectar métricas de carga Servicio ▸ Base de datos · Infraestructura ▸ Alertas
agent Recolector representante de la red interna (Redis + nginx-vts) Servicio ▸ Sesiones (Redis) · Servicio ▸ Web

Este artículo trata el recolector access=database. La aplicación InfraGuard se conecta periódicamente a una BD registrada y lee SHOW GLOBAL STATUS · information_schema.processlist · information_schema.tables, escribiendo una serie temporal en infr_db_metric. Nunca lee ni escribe las filas de sus datos: solo métricas de carga y de estructura.

Los recolectores de BD son la fuente de la pantalla de monitorización de carga de BD y de las alertas. Registre aquí una BD y aparecerá automáticamente en ambas.

Cuándo usarlo

Disposición

La lista de recolectores muestra tarjetas agrupadas por método de acceso. Las filas access=database se pliegan en una única tarjeta de grupo «Bases de datos» (para evitar la proliferación de tarjetas). El botón [Editar] de la tarjeta de grupo abre el editor agrupado (2 pestañas).

Pestañas del editor agrupado

Pestaña Contenido
Básico (valores de conexión compartidos) driver · port · database · username · umbral de cola (slow_time) · schedule · cred_ref: se aplican a todos los elementos de BD
Bases de datos (array de elementos) Por elemento: alias · nombre visible · host/IP · driver (sobrescritura) · interruptor de ejecución · contraseña (solo escritura)

Aunque la interfaz muestre una sola tarjeta de grupo, al guardar se hace upsert de cada elemento como su propia fila db@{alias} (access=database). La cadena de recolección, Servicio ▸ Base de datos y la asignación de destinos de las alertas funcionan todas por recolector. Quitar un elemento elimina su fila db@.

Campos por recolector (infr_collector)

Columna Significado
key Clave única. Los elementos de BD son db@{alias} (p. ej. db@blue): inmutable (las alertas apuntan por clave)
title Nombre visible (por defecto {alias} DB)
access Fijo en database
kind Fijo en metrics
host_alias El alias del elemento (etiqueta del host)
feeds_table Fijo en infr_db_metric
cred_ref Referencia de credenciales (p. ej. env:STATS_DB): si está vacío recurre a config + secret_enc
config {driver, host, port, database, username, sample:{slow_time_sec, connect_timeout}} (sin el secreto)
secret_enc Contraseña de la BD (Crypt · solo escritura · nunca se devuelve al navegador)
is_run Si la programación está activa

Cómo se usa

1. Registrar una BD nueva (editor agrupado)

  1. Vaya a Administración ▸ Recolectores.
  2. En la tarjeta de grupo «Bases de datos», pulse [Editar] → pestaña Básico y rellene los valores compartidos.
    • driver: mysql o mariadb
    • port: por defecto 3306
    • database: solo el esquema de conexión predeterminado; déjelo vacío para conectar a information_schema (el alcance de la recolección lo deciden los permisos de la cuenta)
    • username: la cuenta de monitorización (p. ej. infra_ro)
    • umbral de cola (slow_time): cuenta como «en espera/atascada» toda consulta que lleve ejecutándose más de estos segundos (1–60 s, por defecto 2)
    • cred_ref: env:PREFIX para reutilizar credenciales de .env
  3. Pestaña Bases de datos → [Añadir BD] → por elemento: alias (obligatorio) · host/IP · contraseña opcional.
  4. [Guardar]. Cada elemento se crea o se actualiza como una fila db@{alias}.

2. Tratamiento del secreto: dos vías

(A) Introducir la contraseña directamente: escrita en el campo de contraseña, se guarda cifrada en secret_enc. La lista y las respuestas de la API nunca exponen el texto plano; solo se devuelven los booleanos has_secret/has_db_pw.

La contraseña es de solo escritura. Al editar, dejar el campo de contraseña vacío conserva el valor existente (no lo sobrescribe). Para eliminarla explícitamente, use la opción de borrado.

(B) Reutilizar credenciales de .env (cred_ref=env:PREFIX): no guarde la contraseña en la BD; haga referencia a un conjunto de credenciales que ya está en .env. DbCollectorService::resolveConn() lee estas claves:

Los valores rellenados en config tienen prioridad; los vacíos se completan desde las variables de entorno PREFIX_* (host/port/database/username/password).

3. Consultas en espera a nivel de servidor: el permiso PROCESS

Las dos métricas principales (saturación de conexiones = Threads_running/Threads_connected/max_connections, y QPS · tasa de lentas = ΔQuestions/ΔSlow_queries) se pueden recolectar con una cuenta simple (USAGE). Sin embargo, la agregación de consultas en espera a nivel de servidor y el análisis del tamaño de todos los esquemas requieren permisos adicionales.

Script de cuenta con privilegios mínimos, para ejecutarlo una vez como root en cada host de BD de destino: sql/infr_db_monitor_grant.sql.

-- Cuenta dedicada de solo lectura (restrinja el host de origen a la IP del servidor de la aplicación InfraGuard)
CREATE USER 'infra_ro'@'%' IDENTIFIED BY 'CHANGE_ME_TO_A_STRONG_SECRET';

-- Permisos globales de observación (NO de acceso a los datos)
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'infra_ro'@'%';

-- Análisis del tamaño de los esquemas (todas las BD, solo lectura). Para una sola BD, restrinja a design.*
GRANT SELECT ON *.* TO 'infra_ro'@'%';

-- Aislamiento del radio de impacto: evita el monopolio de conexiones (lección del incidente [1040] del 2026-08-06)
ALTER USER 'infra_ro'@'%' WITH MAX_USER_CONNECTIONS 5;
FLUSH PRIVILEGES;

MariaDB 10.5+ puede usar BINLOG MONITOR en lugar de REPLICATION CLIENT. PROCESS y SELECT son idénticos.

4. Ejecutar y verificar la recolección

La recolección la realiza el comando artisan infr:collect-db. El panel del planificador del lanzador de desarrollo (composer dev) lo invoca cada minuto.

# Muestrear un recolector una vez de inmediato (omitiendo el control de la política de operaciones)
php artisan infr:collect-db --key=db@blue --force

# Recolectar todas las BD registradas (is_run=1) según la política
php artisan infr:collect-db

Que la recolección se ejecute o no lo decide la Política de operaciones.

Clave de política Valor por defecto Significado
db_collect_mode economy economy = recolectar solo cuando hay un usuario de consola activo (presencia) · always = siempre
db_collect_interval_sec 60 Intervalo de recolección (segundos, mínimo 10)
presence_window_sec — Ventana durante la cual se sigue considerando «usuario presente» tras su última actividad

Use --key para probar un recolector de base de datos concreto. Los botones [Probar] / [Sincronizar código] son solo para recolectores access=web y no se aplican a los recolectores de base de datos: verifíquelo con el comando anterior.

5. Umbrales de estado

DbCollectorService::statusOf() decide entre up y degraded comparando con los umbrales de la Política de operaciones.

Clave de umbral Valor por defecto Al superarse
db_degrade_conn_pct 80 saturación de conexiones (%) igual o mayor → degraded
db_degrade_running 40 threads_running igual o mayor → degraded
db_degrade_waiting 5 número de consultas en espera igual o mayor → degraded
db_degrade_slow_qps 1 tasa de lentas (/s) igual o mayor → degraded

Fuentes de datos

Objetivo Tabla / origen Notas
Registro de recolectores infr_collector (migraciones 000201 + 000680) access · config (JSON) · secret_enc (Crypt)
Serie temporal recolectada infr_db_metric (migración 000681) derivada de SHOW GLOBAL STATUS · deltas de qps/slow_qps
Estado de la BD remota SHOW GLOBAL STATUS · SHOW VARIABLES max_connections conexión directa a cada BD registrada
Consultas en espera information_schema.processlist a nivel de servidor con el permiso PROCESS
Tamaño de los esquemas information_schema.tables caché larga de 30 minutos (evita consultas lentas)

Sin fugas de conexiones. DbCollectorService::withConn() crea una conexión en tiempo de ejecución por muestra y la cierra de inmediato en finally mediante DB::purge. Un tiempo de espera de PDO (5 s por defecto) impide que las peticiones web y las tareas programadas se bloqueen por la latencia remota. Nunca lance un demonio de bucle infinito desde el planificador: agota el pool de conexiones compartido de MySQL (el incidente [1040] Too many connections del 2026-08-06).

Acceso

Consulte los niveles de acceso para ver el esquema completo.

Resolución de problemas y preguntas frecuentes

Relacionado

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