2009-09-02 19 views
8

Estoy buscando una característica o software, que me permita hacer un perfil fácil del tiempo de ejecución de mi método y elegir qué perfil usar para el filtro del paquete.Hacer perfiles de métodos (tiempo de ejecución básico) Con Spring AOP

Lo sé, es profiler 101. Uso el perfilador TPTP. Pero no estoy contento con eso. Para ser sincero, simplemente no entiendo cómo funciona, y cuando perfilo mi aplicación (inicie el servidor en modo de perfil), lleva una eternidad no hacer nada. (bueno, no es lo que esperaba: una simple salida del tiempo de ejecución)

Así que hago los perfiles yo mismo con la hora del sistema (agregue una línea al principio y al final de los métodos). No es tan malo.

Mi pregunta es: Quiero medir el tiempo del sistema antes y después de una llamada a un método con Spring AOP, ¿me pueden dar instrucciones? Es una buena/mala idea? La base del código es bastante grande, y no tenemos muchas pruebas de unidades, ¿no puede ser "peligroso"?

No estoy pidiendo para el código, creo que puedo hacerlo yo mismo con este tipo de enlace: http://static.springsource.org/spring/docs/2.5.x/reference/aop.html

Pero si usted tiene un buen tutorial (nunca hecho AOP antes, sólo conocen el concepto), Lo tomo.

+0

¿Su aplicación ya está impulsada por la primavera? ¿Estás intentando perfilar métodos que son parte de un bean gestionado por Spring? – skaffman

+0

Sí, la mayoría de las aplicaciones son Spring-Driven, y sí, el método que quiero hacer son parte de Spring Bean –

+0

@AntoineClaval, por favor, responda esto: http://stackoverflow.com/questions/44070523/wrap-a- spring-aspectos-with-another-aspect –

Respuesta

13

Existe un soporte integrado para eso en Spring.

Traté de buscar un tutorial pero, sorprendentemente, no he encontrado uno, así que trataré de explicarlo aquí. (EDIT: He añadido este ejemplo para mi blog here)

Básicamente lo que necesita es extender la clase CustomizableTraceInterceptor así:

public class MyTraceInterceptor extends CustomizableTraceInterceptor { 

    protected void writeToLog(Log logger, String message, Throwable ex) { 
    if (ex != null) { 
     logger.info(message, ex); 
    } else { 
     logger.info(message); 
    } 
    } 


    protected boolean isInterceptorEnabled(MethodInvocation invocation, Log logger) { 
    return true; 
    } 
} 

Esta clase envuelve alrededor de su información de frijoles y salidas método de llamada, incluidos los parámetros, devolver los valores y el tiempo de ejecución a un registro. Al cambiar el método writeToLog(), usted controla dónde desea generar los datos y con qué gravedad.

Ahora necesita un poco de XML para seleccionar realmente la que los granos que se va a envolver:

<!-- Tracing --> 

<bean name="traceInterceptor" class="MyTraceInterceptor" dependency-check="none"> 

    <property name="enterMessage" value="ENTER: $[targetClassShortName].$[methodName]($[arguments])"/> 

    <property name="exitMessage" 

       value="EXIT: $[targetClassShortName].$[methodName]() : $[invocationTime]ms : $[returnValue]"/> 

</bean> 

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" dependency-check="none"> 

    <property name="beanNames" value="*RequestListener,*Notifier"/> 

    <property name="proxyTargetClass" value="true"/> 

    <property name="interceptorNames"> 

     <list> 

      <value>traceInterceptor</value> 

     </list> 

    </property> 

    <property name="order" value="2"/> 

</bean> 

Básicamente se definen los granos que desee para envolver con un comodín en "beanNames" y "orden" controla el orden de envoltura: si no tienes otras clases de AOP, puedes eliminarlo. También puede cambiar el formato de salida si cambia las propiedades enterMessage y exitMessage.

Eso debería ser suficiente para comenzar. Si necesita aclaraciones, no dude en preguntar.

+0

Palabra de advertencia aquí, esto está atado al Spring StopWatch que especifica el tiempo de ejecución en ms. No puede cambiarlo a ns AFAIK. – Jon

+0

@Jon, Gregory - ¿Puede contestar esto por favor: http://stackoverflow.com/questions/44070523/wrap-a-spring-aspects-with-another-aspect –

1

El enfoque AOP funcionaría, pero dependiendo de cómo planee iniciar sesión, la información podría afectar el rendimiento. Tenga en cuenta que asegúrese de que el registro sea lo más eficiente posible y asegúrese de que su error en tu aspecto.

Es posible que también desee ver como Visual VM - Me impresionó esta herramienta, es fácil de usar y me brindó la información que necesitaba la última vez que la usé.

+0

puede por favor responde esto: http://stackoverflow.com/questions/44070523/wrap-a-spring-aspects-with-another-aspect –

1

Junto a VisualVM, que Nick mencionó otro software bueno (y gratuito para el desarrollo) es Oracle JRockit Mission Control. Su consola de administración has the ability a llamadas de perfil simple de algunos métodos (además de que hay más opciones de perfiles y definitivamente más rápido que TPTP).

Como con el sistema de medición del tiempo antes/después de las llamadas a los métodos: básicamente funciona, pero tiene algunos "defectos" menores (por ejemplo, las aplicaciones en segundo plano pueden "alterar" el resultado).

Personalmente iría primero con VisualVM o JRockit Mission Control.

1

El problema con "profiler 101" es que incorpora muchas ideas cuya justificación es más una cuestión de popularidad que de pensamiento sensato.

La mayor idea de este tipo es que la mejor forma de encontrar problemas de rendimiento es midiendo el rendimiento.

Eso es pensar de arriba hacia abajo, y es como tratar de encontrar desperdicio en el gobierno mirando el presupuesto de cada departamento. Una alternativa es un enfoque ascendente, como elegir varias unidades aleatorias de dinero o tiempo y (lo más importante) determinar por completo por qué se está gastando.

Si hay desperdicio, esto lo encontrará rápidamente. La razón es simple, si se está desperdiciando un porcentaje (digamos un 40%), entonces ese porcentaje de muestras (en promedio) le mostrará exactamente cómo se está desperdiciando.

This is the language-agnostic method I use.

añadido: Usted puede pensar que una gran fracción igual que 40% no es realista, porque no se puede imaginar, but it's entirely possible.

+0

puede por favor responde esto: http: // stackoverflow. com/questions/44070523/wrap-a-spring-aspects-with-another-aspect –

Cuestiones relacionadas