EF 6 Contrib: Performance Interceptors

Como ya hemos dicho, tantas y tantas veces, desde este mismo blog, sin duda, una de las mejores cosas con la llegada de EF6 es la cantidad de puntos de extensibilidad de los que disponemos y que nos permiten jugar con ciertas cosas bastante interesantes. La nueva característica para subscribir código antes y después de cada ejecución, que Entity Framework hace contra la base de datos, es una de estas sobre la que siempre estamos pensando cosas que podemos hacer, en realidad hay muchas cosas que a la mayoría se nos ocurren como por ejemplo auditoria, cache, re-escritura de comandos etc etc etc. En el proyecto de EF 6 Contrib se hace uso de esta característica para darnos cierta información del rendimiento de nuestras aplicaciones haciendo uso de estos interceptores, gracias a los cuales se puede examinar la consulta y/o el plan de ejecución contra el motor de base de datos, por ahora solamente para Sql Server.

Para hacer uso de estos analizadores lo primero será incluir ef6.contrib desde nuestra consola de NuGet

Una vez instalado, este pone a nuestra disposición el interceptor PerformanceInterceptor, que podemos registrar en nuestro archivo de configuración como sigue:

 

El delegado Action<PerformanceReport> nos permite decidir dónde queremos llevar la información generada, a un fichero, base de datos o como en nuestro caso, simplemente a la consola de salida. Amén de este parámetro en el constructor, esta clase nos permite incluir el conjunto de analizadores a usar. PerformanceInterceptor se basa en un conjunto de analizadores, IPerformanceAnalyzer, que podemos ampliar con los nuestros, para realizar el trabajo de revisión de las consultas. Si, como en este caso, no se hace uso de este parámetro el interceptor utilizará solamente el contenedor de dependencias para resolver los analizadores que se desean usar. Con el fin de ver un ejemplo nos crearemos un pequeño resolver que se encargará de registrar un analizador.

 

Como podéis ver en en este  código, se está registrando en este caso, un único analizador llamada ExecutionTimePerformanceAnalyzer, que como os imaginaréis, se encarga de analizar los tiempos de ejecución de cada consulta y para aquellas cuyo tiempo sea superior a 3 segundos enviará un “informe”.  Crearse nuevos analizadores es sencillo, solamente tenemos que implementar la interfaz IPerformanceAnalyzer que es tan sencilla como sigue, por lo que os animo a crear y contribuir nuevos analizadores.

 

Si utilizas SqlServer, EF6 Contrib dispone de otro paquete, EF6.Contrib.SqlServerPerformanceAnalyzers, que contiene analizadores especiales para Sql Server, podríamos por ejemplo ampliar nuestro registro de analizadores como sigue, los nombres son representativos de sus funciones.

 

 

Estos son solo algunos ejemplos de analizadores, hay otros como la revisión de consultas de paginación etc etc etc. pero hay varios puntos de mejora como comentamos que se podrían utilizar, XEvents y el análisis de planes de ejecución, para ello EF6 Contrib está comenzando el trabajo con la clase SqlExecutionPlanPerformanceAnalyzer que servirá de base para todos los analizadores que deseen inspeccionar el plan de ejecución de un determinado comando:

 

 

Si os ha gustado, me gustaría animaros a contribuir de las múltiples formas que se puede hacer…

 

Saludos

Unai