Buscar/Desarrollar una app web que muestra en vivo los registros y métricas de contenedores

Desarrollar una app web que muestra en vivo los registros y métricas de contenedores

Úsalo al cambiar una aplicación con backend y frontend que transmite registros y métricas de contenedores. Respeta las capas, los límites de flujo y los modos de acceso y despliegue, añade funciones en todas las capas, ejecuta las pruebas y escribe revisiones breves.

Para usar estas reglas de IA
## Escribir revisiones breves que solo señalen errores y bloqueos Utiliza el modo ultrabreve para revisar solicitudes de cambio y responder como responsable de mantenimiento. Informa únicamente de errores, problemas de seguridad y bloqueos. Usa viñetas cortas, añade referencias `file:line` cuando corresponda, omite secciones como Puntos fuertes o Resumen y limita toda la respuesta a unas 10 a 15 líneas. Escribe como una persona responsable del mantenimiento. No utilices rayas em ni en, contrastes retóricos del tipo «no X, sino Y», elogios introductorios vacíos, recapitulaciones finales, etiquetas en negrita dentro de un párrafo ni expresiones evasivas sin contenido. Se permiten minúsculas informales y contracciones. Indica la decisión, da un motivo y termina. ## Pedir a quien informó que pruebe la compilación del cambio Cuando un problema comunicado esté corregido en una solicitud de cambio abierta, pide al informante que pruebe el artefacto de integración continua creado para esa solicitud. Proporciona la referencia exacta de la imagen o el paquete precompilado mediante un patrón genérico como `{registry}/{image}:change-{number}`. Así, el informante puede comprobar la corrección antes de la siguiente versión. Antes de recomendar esta vía, confirma que la automatización publique realmente un artefacto etiquetado por cada solicitud de cambio. ## Entender las capas del backend y el frontend antes de editar Considera el sistema como un backend HTTP compilado junto con un frontend de página única y tipado. El backend se ocupa del enrutamiento, la autenticación, los clientes de contenedores o cargas de trabajo, los flujos de registros y métricas en directo, las acciones, las notificaciones y la comunicación con agentes remotos. El frontend se ocupa de las vistas basadas en archivos, los componentes reutilizables, los almacenes reactivos, las funciones componibles de transmisión, el enrutamiento, la localización y las preferencias de usuario. Admite expresamente cada modo de despliegue documentado, incluidos el servicio independiente o de varios hosts, la orquestación en clúster y el funcionamiento mediante agentes remotos. No presupongas que un cambio que funciona con una implementación de cliente funcionará con todos los backends. Mantén clara la dirección principal de las dependencias: `HTTP handlers -> host service -> per-host service -> domain client -> runtime implementation`. ## Compilar y probar con los objetivos documentados Configura el proyecto instalando las dependencias y ejecutando el objetivo de generación de certificados, esquemas o código de protocolo. Utiliza la tarea de desarrollo completa para coordinar la recarga en caliente del backend y el frontend, o ejecuta los dos procesos de vigilancia por separado cuando aísles un problema. Compila los recursos del frontend antes de integrarlos en una compilación completa del backend. Mantén objetivos distintos para la distribución del frontend, la aplicación completa y la imagen desplegable. Utiliza el objetivo de vista previa para inspeccionar localmente una compilación similar a la de producción. Ejecuta las pruebas del backend, las pruebas unitarias del frontend, la comprobación de tipos y las pruebas de integración en navegador mediante sus objetivos documentados. Usa `TZ=UTC` para las pruebas del frontend sensibles a las marcas de tiempo y reserva el modo de vigilancia para el trabajo local iterativo. ## Separar las capas del backend tras una interfaz de cliente común Mantén el enrutamiento HTTP y los manejadores de transmisión por encima de los servicios de host y de cliente. Coloca las operaciones específicas del entorno de ejecución tras una interfaz compartida de cliente de dominio e implementa después esa interfaz para cada backend compatible de contenedores, clústeres o agentes remotos. Separa los proveedores de autenticación, los modelos de dominio, el análisis de eventos, la evaluación de notificaciones y la entrega de notificaciones de los manejadores de transporte. Conserva el análisis de la línea de comandos y la orquestación de varios hosts en capas de apoyo, en vez de duplicarlos en los manejadores. Para añadir una operación de carga de trabajo, actualiza la interfaz de cliente de dominio, todas las implementaciones de entorno aplicables, el envoltorio de servicio por host y el manejador HTTP con su ruta. No te saltes una capa para conseguir que pase un solo modo de despliegue. ## Mantener los almacenes y tipos de registro del frontend en su papel Mantén las vistas de ruta, los componentes importados automáticamente, los almacenes reactivos, las funciones componibles de transmisión y los complementos de la aplicación en sus funciones establecidas. Considera inmutable la configuración inyectada mediante HTML representado por el backend. Mantén las preferencias persistentes tras una abstracción de almacenamiento reactivo. Representa el texto de una línea, los objetos estructurados y los mensajes agrupados de varias líneas como tipos de entrada de registro distintos. Utiliza el alias compartido de mensaje en vez de repetir un tipo de unión, y crea las entradas mediante una fábrica que elija el tipo correcto para cada evento. Los componentes reutilizados entre cambios de ruta o de carga de trabajo deben actualizar todo el estado derivado. Si un gráfico optimiza las actualizaciones modificando solo su última barra, expón un método de recálculo completo y llámalo cuando se sustituya toda la serie de datos. ## Respetar los límites fijos de los flujos de registros y métricas Utiliza eventos enviados por el servidor para los flujos de registros, eventos del ciclo de vida y métricas, y conexiones WebSocket para las sesiones interactivas de conexión o ejecución. Envía las acciones que cambien el estado de una carga de trabajo mediante solicitudes HTTP explícitas, no a través de flujos de solo lectura. Almacena en búfer los eventos entrantes del frontend durante 250 milisegundos, pero vacíalo como máximo al cabo de 1.000 milisegundos. Agrupa las actualizaciones reactivas y, cuando los mensajes mostrados superen las 400 entradas, sustituye o marca las entradas más antiguas conforme al contrato del visor. Registra el historial de métricas en una ventana móvil de 300 elementos como máximo. Suaviza las métricas con una media móvil exponencial de alfa 0,2, normaliza los valores de CPU según el número de núcleos permitido o el del host y mantén separados los valores porcentuales y absolutos de memoria. Reduce el muestreo de los gráficos al ancho de visualización disponible. La sustitución completa de una serie de datos, como al cambiar de carga de trabajo, debe provocar un recálculo completo aunque las actualizaciones normales modifiquen solo la barra final. ## Tratar por separado cada modo de inicio de sesión y despliegue Admite como modos distintos la ausencia de autenticación, la autenticación mediante archivo local y la autenticación mediante proxy directo. Utiliza credenciales firmadas con caducidad para la autenticación local, valida el archivo de usuarios configurado y mantén la autorización basada en funciones independiente del proveedor de identidad. En modo independiente, combina clientes locales y remotos mediante un gestor con capacidad de reintento. En modo de clúster, descubre los nodos a través de la API de orquestación y conéctate a un agente en cada nodo. En modo nativo del clúster, implementa la misma interfaz de cliente de dominio mediante la API de esa plataforma. En modo de agente remoto, exige un transporte autenticado por certificado. Mantén la selección del modo en el punto de entrada de la aplicación. Una función estará incompleta hasta que se defina su comportamiento para todos los modos aplicables o se rechace expresamente en los modos no compatibles. ## Añadir funciones nuevas en todas las capas afectadas Para una ruta HTTP nueva, registra la ruta, implementa su manejador, resuelve el destino mediante el servicio de host y devuelve datos estructurados o establece el flujo previsto. Para una vista de registros nueva, añade la vista de ruta, crea una función componible de transmisión, construye la URL de la API con los filtros adecuados, gestiona el búfer, devuelve mensajes y controles reactivos, y reutiliza el visor establecido. Para una métrica nueva, amplía el tipo de estadística del backend, extrae y calcula el valor, actualiza el esquema de protocolo, vuelve a generar el código de protocolo y expón el campo en el modelo del frontend cuando la interfaz lo necesite. Los flujos de eventos existentes deben transportar la actualización sin crear un transporte paralelo. Para un canal de notificación nuevo, implementa la interfaz del despachador, regístralo en la fábrica de despachadores, añade su formulario de configuración y conserva el comportamiento persistente de las reglas y del estado de las alertas. ## Limitar las llamadas a herramientas remotas y reintentar solo fallos temporales No te conectes hasta que se haya configurado un despachador remoto. Utiliza un flujo bidireccional para descubrir e invocar herramientas, despacha las llamadas mediante un único registro y limita las ejecuciones simultáneas a cinco con un semáforo ponderado. Vuelve a conectarte tras fallos transitorios con retroceso exponencial de 1 a 30 segundos más una variación aleatoria. Deja de reintentar permanentemente ante respuestas de permiso denegado que indiquen credenciales no válidas o un plan no disponible. Almacena una sola vez en caché las definiciones inmutables de las herramientas para que la operación remota desactivada apenas añada sobrecarga. Para añadir una herramienta, define su nombre, descripción y esquema de parámetros; añade su tipo de respuesta a la unión de resultados del protocolo; vuelve a generar el código de protocolo; registra el caso de despacho; impleméntala tras la interfaz del servicio de host; y añade pruebas enfocadas. ## Clasificar cada evento de registro y transmitirlo sin acumularlo en memoria Analiza los flujos multiplexados del entorno de ejecución leyendo sus cabeceras y cargas útiles y, después, clasifica cada evento sin procesar como datos estructurados, evento agrupado de varias líneas o evento de una línea. Extrae la gravedad mediante patrones explícitos, serializa el evento de dominio y entrégalo a través del flujo en directo. Para los agentes remotos, traduce las llamadas del cliente de dominio a solicitudes de protocolo, delégalas en el cliente local del entorno de ejecución y vuelve a convertir las respuestas en modelos de dominio. Conserva el comportamiento de transmisión de registros, métricas y eventos del ciclo de vida, en vez de acumular resultados sin límite en la memoria. El filtrado por nivel, consulta o expresión regular debe mantener un límite de resultados claro. Las acciones sobre cargas de trabajo deben permanecer tras un control de habilitación explícito. ## Hacer pruebas repetibles y depurar las conexiones en vivo Ejecuta las pruebas del backend con el detector de condiciones de carrera. Utiliza de forma coherente la biblioteca de aserciones del proyecto, ejecuta las pruebas del frontend en UTC y realiza las pruebas de integración en navegador con la configuración de servicios requerida. Vuelve a generar los certificados y artefactos de protocolo necesarios antes de considerar que los fallos de compilación son defectos del código. Para desarrollar con recursos no integrados, habilita el servicio desde el sistema de archivos y la recarga en caliente coordinada. Los cambios del backend deben reiniciar su proceso de vigilancia, mientras que los del frontend deben usar la sustitución de módulos sin forzar un reinicio completo. Para depurar, habilita los registros de depuración del backend, inspecciona el estado del frontend con las herramientas de desarrollo del navegador y revisa en el panel de red las conexiones de eventos enviados por el servidor y WebSocket. Examina la diferencia final para que los archivos generados y las ediciones automatizadas no oculten cambios no relacionados.