Squzy: sistema de monitoreo de autohospedaje gratuito de código abierto con incidentes y notificaciones

Una calurosa noche de invierno, se nos ocurrió la idea de escribir una aplicación para consultar el mapa del sitio de la empresa para la que trabajamos, con la capacidad de notificar cuando ocurre un error.



Gradualmente, esta idea se trasladó a la implementación, hubo pensamientos de mejora, apareció el monitoreo de los hosts, luego el monitoreo de las aplicaciones y, como la guinda del pastel, los incidentes con notificación.



Como resultado, obtuvimos un sistema de monitoreo completo, que es una solución de autohospedaje completamente de código abierto que no tiene comunicaciones externas, con incidentes completamente definidos por el usuario.



Y en este post queremos presentarte el producto resultante.



Detalles técnicos



Se eligió una arquitectura de microservicio para el desarrollo. El backend se desarrolló en GoLang como un lenguaje rápido y conveniente para desarrollar microservicios. Usamos gRPC para comunicarnos entre servicios. Además de que gRPC funciona en HTTP / 2 con todo lo que implica, la descripción de las interfaces de servicio a través de proto les permitirá, como usuarios, crear sus propias implementaciones de partes individuales del sistema, si es necesario.



El proyecto utiliza Mongo como base de datos de acceso rápido y Postgres para almacenar las estadísticas recopiladas.



Bazel se utilizó para el montaje y despliegue. Bazel le permite describir de forma declarativa las dependencias y relaciones entre paquetes en Golang. Además, comenzamos a probar Bazel con un caché remoto, lo que tiene un efecto positivo en la velocidad del sistema. Bazel también recopila todas las aplicaciones en Docker y organiza las pruebas unitarias. Todo esto está integrado en las acciones de Github.



El tablero del sistema está escrito en Angular 9.



Intentamos mantener la barra en pruebas unitarias, en el momento en que se cubren todas las entidades. En un futuro próximo, la implementación de pruebas de integración y E2E para el soporte del sistema más completo



Descripción del sistema



Como se mencionó anteriormente, Squzy es un conjunto de microservicios que interactúan entre sí, cada uno de los cuales se ocupa de una tarea separada.



Lista de servicios:



  • Agent Client — , . , . Agent Server.
  • Agent Server — , . Mongo, Storage.
  • Application Monitoiring — , / Squzy , . GoLang NodeJS, — PHP & Java .
  • Monitoring — external/internal .
  • Storage — . Postgres, ClickHouse.
  • Incident Manager- . ( ). Mongo, Storage.
  • Notification Manager — . Webhook & Slack.
  • API — API Gateway


El esquema de interacción del servicio es el siguiente:







Para demostrar las capacidades de Squzy, se desarrolló una demostración que monitorea su propio servidor y le permite monitorear el sistema en el tablero: https://demo.squzy.app/ .



Algunas funciones, como agregar / eliminar nuevas entidades, están deshabilitadas en la demostración, pero le permite ver y sentir todas las partes del sistema. A continuación, analizaremos con más detalle cada tipo de seguimiento.



Esta parte del sistema es responsable de los controles externos / internos. Por el momento, le permite enviar solicitudes y esperar respuestas a los siguientes tipos de puntos finales:



  1. Tcp - verificación de puerto abierto;
  2. gRPC - verificación de protocolo ;
  3. Http: verifique el cumplimiento del código de estado;
  4. Mapa del sitio: verificar que todas las URL del mapa del sitio respondan con 200 OK ;
  5. JsonValue: colección de valores específicos de la respuesta JSON.


Squzy le permite agregar encabezados personalizados a todo tipo de comprobaciones HTTP.



La interfaz para agregar una verificación a través del tablero de Squzy se ve así:







Aquí, el intervalo es el intervalo entre las verificaciones en segundos, y el tiempo de espera es el tiempo después del cual la verificación se considera infructuosa.



Después de la creación, el usuario tiene acceso a la configuración del verificador:







para cada tipo de verificación, puede escribir una regla de incidente. A continuación se describirán más detalles sobre los incidentes, pero aquí solo daremos un ejemplo:







En este caso, medimos el valor del tipo de cambio del dólar desde el sitio, y si es más de 80 crearemos un incidente.



Enlace a la demostración.



Los incidentes se pueden crear en:



  • Duración de la verificación (tiempo de recibir una respuesta del servidor);
  • Estado (código de estado devuelto);
  • Valor (información transmitida en el verificador).


Agente blando



El Squzy Agent instalado en el servidor se usa para monitorear hosts en el sistema. Actualmente está recopilando las siguientes estadísticas:



  • CPU - carga del procesador;
  • Memoria - Usado / Libre / Total / Compartido;
  • Disco - Usado / Libre / Total para cada uno de los discos;
  • Net: para cada interfaz de red.


Cronología del agente:



  1. El agente se registra en el servidor de agentes y recibe una identificación (durante el registro es posible especificar el intervalo de monitoreo y el nombre del agente);
  2. El agente envía estadísticas al servidor en un cierto intervalo;
  3. ….
  4. El agente notifica al servidor sobre el apagado.


Si no hay conexión con el servidor, el agente continúa recopilando estadísticas y se enviarán cuando se restablezca la conexión.



La versión de demostración del agente se puede ver aquí: https://demo.squzy.app/agents/5f142b6141a1c6518723483a/live El



agente también puede tener un conjunto de reglas para verificar incidentes:





Monitoreo de aplicaciones Squzy



Para las aplicaciones de monitoreo, se han desarrollado integraciones con marcos populares para Go / NodeJs (más aún, como dicen los comercializadores exitosos). Las integraciones definen el tipo de transacción ( Http / Router / gRPC / WebSocket / etc) y analizan las respuestas de los motores / solicitudes.



Squzy también admite Transaction Tracing, que le permite monitorear transacciones relacionadas de múltiples servidores / servicios. Un ejemplo de monitoreo de tales transacciones en el Tablero: https://demo.squzy.app/transactions/om8l8LP96PRsvx67UxkES .



Bibliotecas para la integración en Go y Node Js.





En esencia, las bibliotecas son middleware que cronometran el tiempo antes de enviar una transacción y el tiempo después de que se procesó, y analiza la respuesta. También escribimos una aplicación de monitoreo de GO de muestra: https://github.com/squzy/test_tracing.



Puede crear sus propias transacciones y medir sus tiempos de ejecución, estados y errores. Para hacer esto, use el paquete Core. Para facilitar el soporte del producto, todos los idiomas utilizarán el mismo nombre para los paquetes que definen el comportamiento.



Puede crear incidencias por transacción en función de los siguientes datos:



  • Duración de la transacción;
  • Estado de la transacción;
  • Errores recibidos;
  • Tipo de transacción.


Administrador de incidentes Squzy + Administrador de notificaciones



Los incidentes en Squzy se basan en reglas. Al agregar una nueva entidad a Storage, se marca la regla descrita y, si es así, se crea un incidente (si aún no se ha creado).



Las reglas son una versión extendida de expr , a la que se han agregado reglas específicas, teniendo en cuenta la especificación del sistema, como Último (toma los últimos n registros del Almacenamiento), Uso (usa un filtro específico para esto), y así sucesivamente. Puede encontrar una descripción detallada de todas las reglas en https://squzy.app/usage/squzy-incident/incident-rules , aquí nos centraremos en un ejemplo ilustrativo.



Supongamos que tiene un servidor con 1792 procesadores, 256 GB de RAM y 16 TB de espacio en el disco duro. Y realmente desea verificar que su devops no esté ejecutando Doom en el monitor de carga de la CPU. Usted sabe que mantener un sitio de una página que sirve a su servidor nunca carga un 100 por ciento más de 8 procesadores durante más de un minuto. Además, la RAM es más de la mitad libre. Mientras que el disco duro tiene un TB entero de espacio libre en reserva (si no almacena archivos conocidos en casa, su esposa lo verá). En este caso, sabiendo que las métricas se recopilan cada 10 segundos, puede definir la siguiente regla para verificar que su servidor esté funcionando correctamente:



any(Last(7, UseType(All)), 
    {all(.CpuInfo.Cpus, {.Load > 80}) &&
    .MemoryInfo.Mem.UsedPercent < 50 &&
    .DiskInfo.Disks["System"].Free > 1000000000000}
)


De manera similar, Squzy le permite describir varios patrones de comportamiento no deseado del sistema.



Una vez que la verificación de la regla es exitosa (o más bien fracasa), se crea un incidente y se notifica al usuario, si está configurado.



Una incidencia activa, es decir, una incidencia que aún no ha sido verificada por el usuario, se puede cerrar automáticamente, es decir, si no ha pasado la verificación en algún momento, si se selecciona la opción adecuada.



Para cada entidad marcada, ya sea una aplicación / verificador / agente, puede crear sus propias notificaciones sobre incidentes.



Conclusión



Ahora estamos en el proceso de recopilar comentarios y opiniones de la comunidad de TI.



Ya tenemos varios planes para el desarrollo de productos:



  1. agregar integraciones Java / PHP;
  2. verificadores de bases de datos;
  3. migración de Postgres a ClickHouse;
  4. más métodos de notificación;
  5. integración con kubernetes;
  6. mejora de la documentación;
  7. API de GQL;
  8. Pruebas de integración y E2E;
  9. seguimiento de aplicaciones móviles.
  10. Autocompletar para reglas de incidentes en la interfaz de usuario


Estaremos encantados de recibir comentarios o sugerencias.



Enlaces





PD:

Gracias por el artículo Vonotirax



Try in 1 click



All Articles