Monday, November 30, 2020

Apuntes sobre instrumentación de aplicaciones

Monitoreo e instrumentación

Si te preguntaran por tu estado de salud actual ¿serías capaz de dar una respuesta objetiva? Quizás podrías hacerlo basado en tu estilo de vida o sensaciones físicas que estés experimentando actualmente. Sin embargo, un mejor enfoque sería hacerse una evaluación médica integral, que a través de instrumentos médicos y análisis profesional nos permita conocer si existen factores de riesgo de enfermedades para poder tratarlas o prevenirlas. En este sentido, es fundamental un control periódico de tu salud para su cuidado.


Cambiando de rubro y preguntando con el mismo sentido ¿cuál es el estado de salud de tu aplicación? ¿cuáles son las evidencias sobre su comportamiento en tiempo de ejecución? Conocer las respuestas a estas preguntas puede resultar de gran utilidad. Por ejemplo, cuando algo sale mal será indispensable saber qué y porqué sucedió, además de cualquier pista que nos ayude a solucionar el problema para evitar que vuelva a ocurrir en el futuro.

Para conocer el estado y salud de una aplicación está la actividad de monitoreo, la cual se puede definir como el proceso sistemático de recolectar, analizar y utilizar información para hacer seguimiento del comportamiento de la aplicación con la finalidad de diagnosticar y/o solucionar problemas.


Es evidente que la eficacia de un sistema de monitoreo está en función de la calidad de la información recabada. Para dar soporte a esto está la instrumentación. La palabra instrumentación es un término amplio que adquiere un significado particular según el contexto donde se aplique: procesos industriales, bioingeniería, electrónica, etc. En el campo de la programación se refiere al proceso de incluir código extra (código de instrumentación) a un programa para generar información sobre su comportamiento durante su ejecución.

Entonces, la instrumentación es necesaria para obtener datos que nos permitan entender aspectos como: performance, uso de recursos, comportamiento del usuario, diagnóstico de errores, etc.

Métodos de instrumentación

Dependiendo de si tenemos o no acceso al código fuente, existen dos formas básicas de agregar código de instrumentación a nuestras aplicaciones: source-code instrumentation y binary instrumentation.

Source-code instrumentation

Es el método más directo para capturar información en runtime. Este implica la disponibilidad del código fuente por lo cual se modifica directamente para agregar código de instrumentación. Un ejemplo ilustrativo de su aplicación se muestran en las siguientes imágenes (fuente https://www.slideshare.net/mtekbir/code-instrumentation):





Binary Instrumentation

Se refiere a la técnica de inyectar código de instrumentación a un proceso en ejecución. El código de instrumentación es totalmente transparente para la aplicación en la que se inyecta. Para este tipo de instrumentación existen diversos frameworks tales como Pin, DynamoRIO, Frida, Valgrind, etc.


Mecanismos de instrumentación

Más allá de la forma de agregar código de instrumentación, existen mecanismos específicos para la captura de datos, los cuales son:

  • Logging: Los logs están dirigidos a administradores que supervisan el funcionamiento normal del sistema. Registro de eventos normales o excepcionales.
  • Tracing: Los traces están dirigidos a desarrolladores que necesitan detalles sobre el flujo de control del software. Se utilizan principalmente para la detección de problemas en sistemas productivos (alternativa al debugging).
  • Exception handling: Medida de precaución para tratar errores en tiempo de ejecución. Útil para el seguimiento y corrección de errores.
  • Performance monitoring: A través de performance counters que permiten el seguimiento del rendimiento de la aplicación.

Buenas prácticas de instrumentación

Finalmente, a modo de listado, algunas recomendaciones útiles para poner en práctica en la instrumentación de nuestras aplicaciones (del libro Hardening Azure Applications):

  • Add logging capability for the most critical, if not all, components of your application.
  • Include elaborate/full exception details.
  • Use counters and log details around retry attempts.
  • Log all failures and retries associated with integration to external service.
  • Monitor current and average response time for all cross-component calls.
  • Determine the root component that is causing any failure condition.
  • Ensure that all instrumentation is configurable for production and test environments.

Webgrafía



No comments:

Post a Comment

Cuando el código funciona, pero no tiene tests: ¿y ahora qué?

Seguramente te ha pasado alguna vez. Te dan acceso al repositorio de un nuevo proyecto. Lo abres con curiosidad, esperas encontrar una estru...