Obtener información sobre la Azure Function que se está ejecutando
En determinadas circunstancias, puede sernos de mucha utilidad obtener información sobre la Azure Function que está en ejecución en un momento dado.
Dentro del Azure WebJobs SDK Extensions, encontramos un ensamblado de nombre Microsoft.Azure.WebJobs.Extensions.
Dentro de las extensiones, encontramos las Core extensions que contiene algunas elementos que pueden resultarnos útiles. Entre ellos, encontramos la clase ExecutionContext.
A través de esta clase, podremos conocer, en tiempo de ejecución, detalles acerca de la Azure Function que estamos ejecutando.
El proceso de ejecución de la Azure Function, proporcionará automáticamente una instancia del contexto en ejecución que expondrá una serie de datos como son:
- InvocationId, de tipo Guid y que corresponde con el identificador único de invocación a la Azure Function.
- FunctionName, de tipo string y que proporciona el nombre de la Azure Function que estamos ejecutando.
- FunctionDirectory, de tipo string y que proporciona el directorio en el que se encuentra la Azure Function que estamos ejecutando.
Toda esta información puede resultar útil de cara a definir detalle o datos de interés sobre el proceso en ejecución. Sobre todo si estamos volcando datos de log a sistemas externos como por ejemplo, un volcado de log a Application Insights.
Imaginemos por lo tanto, el inicio de una llamada a la Azure Function y la llamada dentro de ésta a diferentes procesos. Ese identificador, podríamos irlo pasando entre los diferentes métodos que forman parte del proceso global que estamos ejecutando, e ir registrando en log los procesos con ese identificador, de forma que podamos hacer un seguimiento o traza completa del proceso global sin perder detalle de por donde ha ido, ha entrado, ha salido, etc.
Ahora bien, ¿cómo podemos hacer esto realmente dentro de nuestra Azure Function?.
Supongamos que creamos una Azure Funtion.
A partir de ella escribamos el siguiente ejemplo de código de nuestra Azure Function:
using System.Net; public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log, ExecutionContext executionContext) { var message = $"{executionContext.FunctionName} as {executionContext.InvocationId} from {executionContext.FunctionDirectory}"; log.Info($"{DateTime.Now.ToString()} {message}"); return req.CreateResponse(System.Net.HttpStatusCode.OK, message); }
Como podemos observar, definimos ExecutionContext en la firma del método, y la aplicación resolverá por nosotros el objeto pasándole la información que necesitaremos.
El log de nuestro ejemplo en ejecución es el que se indica en la siguiente imagen:
La salida que obtengo en la herramienta de Test de Azure, es la siguiente:
«RegisterUser as afcdffcc-0f20-4132-a772-fe31587e7f09 from D:\\home\\site\\wwwroot\\RegisterUser»
Por otro lado, indicar como aviso, que si en los using de nuestra Azure Function indicamos System.Threading, tendremos un problema, ya que dentro de ese namespace, existen también una clase llamada ExecutionContext, por lo que tendremos problema a la hora de identificar correctamente la procedencia de la clase y dará errores de compilación.
Para forzar y comprobar esto último que comento, basta con poner using System.Threading; al principio del código de nuestra Azure Function y guardarla para que veamos en el log los errores de compilación que se producen.
¡Happy Coding!