Saltar al contenido principal

Guía de Administrador

Esta guía cubre la administración diaria de Integration Hub for Moodle: registrar servicios, crear reglas de eventos, monitorear el dashboard y gestionar la Dead Letter Queue.


Acceder al Plugin

Navega a /local/integrationhub/index.php o usa la pestaña Servicios en la navegación del plugin.

El plugin tiene cuatro secciones principales:

PestañaURLDescripción
Servicios/local/integrationhub/index.phpRegistrar y gestionar servicios externos
Reglas/local/integrationhub/rules.phpCrear reglas del Event Bridge
Cola/local/integrationhub/queue.phpMonitorear la Dead Letter Queue
Eventos/local/integrationhub/events.phpVer el log de eventos enviados

Gestión de Servicios

Agregar un Servicio REST/HTTP

  1. Ve a la pestaña Servicios
  2. Haz clic en Agregar Servicio
  3. Completa el formulario:

Configuración Básica

CampoDescripciónEjemplo
NombreSlug único. Sin espacios. Usado en llamadas PHP: mih::request('este-nombre', ...)api-notificaciones
TipoProtocolo de transporteREST
URL BaseURL raíz. Las rutas de endpoint se añaden a estahttps://api.ejemplo.com/v1
ActivoActivar/desactivar sin borrarmarcado

Autenticación

CampoDescripciónEjemplo
Tipo de AuthBearer envía Authorization: Bearer {token}. API Key envía X-API-Key: {token}Bearer
Token / API KeyEl valor de la credencialeyJhbGci...

Configuración de Resiliencia

CampoDescripciónRecomendado
Timeout (s)Segundos antes de cancelar la petición5
Máx. ReintentosIntentos adicionales tras el primer fallo3
Backoff Inicial (s)Segundos antes del primer reintento. Se duplica en cada intento1
Umbral de Fallos CBFallos consecutivos antes de abrir el circuito5
Cooldown CB (s)Segundos antes de intentar recuperación (HALFOPEN)30

Agregar un Servicio AMQP (RabbitMQ)

Cuando Tipo = AMQP, el formulario muestra un Constructor de Conexión en lugar de un campo de URL simple.

Campos del Constructor de Conexión

CampoDescripciónPor Defecto
HostHostname o IP del broker RabbitMQlocalhost
Puerto5672 para AMQP plano, 5671 para AMQPS (SSL)5672
UsuarioNombre de usuario de RabbitMQguest
ContraseñaContraseña de RabbitMQguest
Virtual HostVHost de RabbitMQ/
ExchangeNombre del exchange destino. Vacío para el exchange por defecto(vacío)
Routing KeyRouting key por defecto para mensajes publicadosevents.moodle
Cola a DeclararCola a auto-declarar al conectar. Útil para desarrollomoodle_events
Dead Letter QueueNombre de cola para mensajes que no se pueden entregarmoodle_dlq

La URL de conexión se construye automáticamente:

amqp://usuario:contraseña@host:5672/vhost?exchange=X&routing_key=Y&queue_declare=Z&dlq=DLQ

Agregar un Servicio SOAP

CampoValor
URL BaseLa URL WSDL: https://servicio.ejemplo.com/api?wsdl
TipoSOAP

Al llamar via API MIH o Event Bridge, el campo endpoint es el nombre del método SOAP:

\local_integrationhub\mih::request('soap-legado', 'CrearUsuario', ['nombre' => 'Juan', 'email' => '[email protected]']);

Gestión de Reglas (Event Bridge)

Agregar una Regla

  1. Ve a la pestaña Reglas
  2. Haz clic en Agregar Regla

Campos de la Regla

CampoDescripciónEjemplo
EventoNombre completo de clase PHP del evento de Moodle\core\event\user_created
ServicioServicio destino (solo aparecen servicios activos)api-notificaciones
Método HTTPPara servicios REST: POST, GET, PUT, PATCH, DELETEPOST
EndpointRuta añadida a la URL base del servicio (opcional). Para AMQP: routing key override/webhooks/usuarios
Template de PayloadTemplate JSON con placeholders {{variable}}Ver abajo
ActivoActivar/desactivar sin borrarmarcado

Sintaxis del Template de Payload

{
"evento": "{{eventname}}",
"id_usuario": {{userid}},
"id_objeto": {{objectid}},
"id_curso": {{courseid}},
"timestamp": {{timecreated}},
"fuente": "moodle"
}

Importante: Los valores numéricos ({{userid}}, {{objectid}}, etc.) NO deben ir entre comillas en el template — se reemplazarán con enteros crudos. Los valores de texto ({{eventname}}, {{ip}}) deben ir entre comillas.

Vista Previa del Payload

Haz clic en Vista Previa del Payload para ver el resultado interpolado con datos de prueba antes de guardar la regla.


Eventos Comunes de Moodle

EventoDescripción
\core\event\user_createdSe creó una nueva cuenta de usuario
\core\event\user_updatedSe actualizó el perfil de un usuario
\core\event\user_deletedSe eliminó un usuario
\core\event\course_createdSe creó un nuevo curso
\core\event\course_completedUn usuario completó un curso
\core\event\user_enrolment_createdUn usuario se matriculó en un curso
\core\event\user_enrolment_deletedUn usuario fue desmatriculado
\core\event\grade_item_updatedSe actualizó una calificación
\core\event\user_loggedinUn usuario inició sesión
\core\event\user_loggedoutUn usuario cerró sesión

Monitoreo del Dashboard

El dashboard principal (/local/integrationhub/index.php) proporciona:

Gráficas

GráficaDescripción
Distribución de EstadoGráfica de pastel mostrando la proporción de peticiones exitosas vs. fallidas
Tendencia de LatenciaGráfica de línea mostrando los tiempos de respuesta de las últimas 200 peticiones

Tabla de Servicios

ColumnaDescripción
NombreSlug del servicio
TipoREST / AMQP / SOAP
CircuitoEstado actual: CLOSED (verde), OPEN (rojo), HALFOPEN (amarillo)
Latencia Prom.Tiempo de respuesta promedio en las últimas 24 horas
Errores (24h)Número de peticiones fallidas en las últimas 24 horas
Último UsoTimestamp de la petición más reciente
AccionesEditar, Eliminar, Resetear Circuito

Resetear un Circuito

Si un servicio se ha recuperado pero su circuito sigue en OPEN:

  1. Haz clic en Resetear Circuito en la fila del servicio
  2. El circuito transiciona a CLOSED y el contador de fallos se resetea

Dead Letter Queue (DLQ)

Cuando un evento falla en despacharse después de 5 intentos, se mueve a la DLQ.

Navega a /local/integrationhub/queue.php para:

  • Ver todos los eventos fallidos con sus mensajes de error y payloads
  • Reenviar eventos individuales (los re-encola como una nueva tarea adhoc)
  • Eliminar eventos que ya no son necesarios

Cuándo Terminan Eventos en la DLQ

  • El servicio destino está permanentemente caído y el circuito nunca se recupera
  • El template de payload produce JSON inválido
  • El servicio fue eliminado después de crear la regla
  • Un error de red persiste más allá de 5 intentos de reintento