Artículo
· 26 abr, 2024 Lectura de 5 min

Rastreos de OpenTelemetry implementados por Servicios Web SOAP en IRIS

Un cliente preguntó recientemente si IRIS soporta OpenTelemetry, dado que estaban buscando medir el tiempo que los servicios SOAP implementados por IRIS tardan en completarse, y  el cliente ya tenía varias otras tecnologías que soportan OpenTelemetry para el seguimiento de procesos.

Si bien, a día de hoy, InterSystems IRIS (IRIS) no soporta de forma nativa OpenTelemetry, es justo decir que la plataforma de datos IRIS tiene varias maneras de capturar, registrar y analizar el rendimiento de una instancia en ejecución. Esta información no fluye fuera de IRIS a través de otros componentes, como serían los Agentes o Colectores dentro de una arquitectura OpenTelemetry implementada. Lo cierto es que OpenTelemetry parece estar convirtiéndose en un estándar de facto para la observabilidad.

Aunque ya hay un desarrollo en curso para apoyar de forma nativa esta capacidad en futuras versiones de IRIS, este artículo explica cómo, con la ayuda de Python embebido y las correspondientes bibliotecas de Python, los desarrolladores de aplicaciones IRIS pueden empezar a publicar eventos de rastreo a su OpenTelemetry back-ends con el mínimo esfuerzo. Más importante aún, esto le da a mi cliente algo para ponerse en marcha con el día de hoy. 

 

Observabilidad. 


En general, la observabilidad comprende tres aspectos principales:

  • Captura de métricas, que es la captura de medidas cuantitativas sobre el rendimiento y el comportamiento de un sistema, similar a lo que IRIS publica a través de su /api/monitor/metrics api
  • Logging, que consiste en capturar y almacenar información relevante generada por una aplicación o sistema, como la que aparece en las salidas de System Log, o en el fichero messages.log generado por las instancias IRIS.
  • Tracing o Rastreo: que implica seguir el flujo de una solicitud de servicio o transacción a medida que se mueve a través de varios componentes de una solución. El rastreo distribuido permite seguir la ruta de una solicitud a través de múltiples servicios, proporcionando una representación visual de todo el flujo de la transacción.

Este artículo y la aplicación que lo acompaña se centran únicamente en el rastreo o tracing de servicios SOAP.

 

Un Trace (rastreo) identifica una operación dentro de una solución que, de hecho, puede satisfacerse a través de múltiples tecnologías en una arquitectura, como navegador, balanceador de carga, servidor web, servidor de base de datos, etc.
Un Span representa una única unidad de trabajo, como una actualización o consulta de una base de datos. Un Span es el bloque de construcción de un rastreo, y un rastreo comienza con un Span raíz, y opcionalmente spans anidados, o spans hermanos.

En esta implementación, que sólo utiliza IRIS como tecnología para generar telemetría, se inicia un Rastreo y un Span raíz cuando se inicia el Servicio SOAP.

Enfoque para la aplicación

Transformar la clase IRIS %SOAP.WebService con la lógica de implementación de OpenTelemetry y las funciones de la librería Python en una nueva clase llamada SOAP.WebService. Incluir macros que se pueden utilizar en el código de usuario para contribuir aún más a la observabilidad y la trazabilidad. 
Solo deberían ser necesarios cambios mínimos en la implementación SOAP existente (sustituir el uso de %SOAP.WebService por SOAP.WebService como superclase de servicio web para implementar SOAP.
El siguiente diagrama ilustra este enfoque:

 

Características de esta aplicación:

  • Por defecto, cada servicio SOAP será rastreado y reportará información de seguimiento.
  • Cuando se utiliza un servicio SOAP por primera vez, la implementación inicializará un objeto de rastreo OpenTelemetry. Una combinación del nombre del servidor IRIS y la instancia se proporciona como la fuente de telemetría, y la acción SOAP se utiliza como el nombre del span raíz por defecto que rastrea el servicio SOAP.
  • Los rastreos de telemetría y el span por defecto se cerrarán automáticamente cuando finalice la llamada al método SOAP.
  • En el momento de la creación, pueden añadirse pares de atributos clave/valor al span raiz predeterminado, como el identificador de sesión CSP o el número de trabajo.
  • Los usuarios pueden usar $$$OTELLog(...), para añadir un registro manual arbitrario en un span, usando una simple cadena o array de pares clave-valor.
  • Los usuarios pueden utilizar $$$OTELPushChildSpan(...)/$$$OTELPopChildSpan(...) para crear spans no raíz alrededor de secciones de código que quieran identificar independientemente con su lógica.

 

Instalación y prueba

  • Con clone/git extraed el repositorio en cualquier directorio local
$ git clone https://github.com/pisani/opentelemetry-trace-soap.git
  • Abrid una ventana de terminal en este directorio y escribid lo siguiente para construir las imágenes IRIS con código de ejemplo:
$ docker-compose build
  • Una vez construida la imagen iris, en el mismo directorio escribid lo siguiente para iniciar los contenedores Jaeger e IRIS:
$ docker-compose up -d

Esto pondrá en marcha dos contenedores - el contenedor de Jaeger OpenTelemetry back-end objetivo (también la exposición de una interfaz de usuario), y, una instancia de IRIS que servirá como punto final del servidor de servicios web SOAP.  Tres servicios web simples se han desarrollado en la instancia IRIS para probar la solución.

 

  • Utilizad vuestro navegador para acceder a las páginas de información y pruebas de SOAP a través de esta URL, iniciando sesión como superusuario/SYS si se os solicita:
http://localhost:52773/csp/irisapp/SOAP.MyService.cls

(Nota: Estas páginas no están habilitadas por defecto y la seguridad dentro de la instancia IRIS en ejecución tuvo que ser relajada para habilitar esta característica, para facilitar las pruebas)

Seleccionad cada uno de los métodos web que deseáis probar, con el fin de generar actividad SOAP.  Para ver cómo esta implementación genera un Error en los rastreos observados, utilizad cero (0) como segundo número en el método SOAP Divide() para forzar un error <DIVDE>.

  • Abrid otra pestaña del navegador y acceded a la interfaz de usuario de Jaeger a través de la siguiente URL
http://localhost:16686
  • La página de destino resultante muestra todos los servicios que contribuyen con lecturas de telemetría y debería parecerse a la siguiente captura de pantalla:  

 

Conclusión

En resumen, este artículo demuestra cómo Embedded Python, podría ser utilizado para añadir características adicionales a IRIS, en mi caso, para implementar rastreo de observabilidad para servicios SOAP.  Las opciones disponibles a través de Python y la capacidad de IRIS para aprovechar estas bibliotecas de Python es verdaderamente potente.

Se puede trabajar para crear una clase de soporte OpenTelemetry más genérica que implemente lo mismo para los servicios REST, así como extender las firmas de los métodos de clase para rastrear el tiempo de cualquier método de clase por este marco.

Comentarios (0)1
Inicie sesión o regístrese para continuar