java performance aop jmx perf4j

¿Ha utilizado Perf4J para recopilar y analizar métricas de rendimiento en la aplicación Java?



performance aop (3)

Estoy usando Perf4J en una aplicación cliente-servidor para sincronizar llamadas RPC. Fue bastante sencillo de implementar: solo necesitaba incluir unas pocas líneas de código alrededor del servlet de despachador de RPC para medir cada llamada de método RPC. Las mediciones de tiempo se escriben en un archivo de registro independiente, los datos agregados se guardan en la memoria para su uso con el servlet de gráficos. La configuración era cuestión de minutos.

Este es un extracto del método preHandle ():

request.setAttribute("stopWatch", new CommonsLogStopWatch());

Este código del método postHandle ():

LoggingStopWatch stopWatch = (LoggingStopWatch)request.getAttribute("stopWatch"); stopWatch.stop(methodName);

Aquí están las secciones relevantes de mi log4j.cfg:

<logger name="org.perf4j.TimingLogger" additivity="false"> <level value="info"/> <appender-ref ref="CoalescingStatistics"/> <appender-ref ref="statsAppender"/> </logger> <appender name="CoalescingStatistics" class="org.perf4j.log4j.AsyncCoalescingStatisticsAppender"> <param name="TimeSlice" value="60000"/> <appender-ref ref="graphPatientChart"/> </appender> <appender name="graphPatientChart" class="org.perf4j.log4j.GraphingStatisticsAppender"> <param name="GraphType" value="Mean"/> <param name="TagNamesToGraph" value="getPatientChart,idleNotification"/> </appender> <appender name="statsAppender" class="org.apache.log4j.DailyRollingFileAppender"> <param name="datePattern" value="''.''yyyy-MM-dd"/> <param name="file" value="WEB-INF/log/meona-performance.log"/> <param name="append" value="true"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%m%n"/> </layout> </appender>

Me gustaría que el servlet de gráficos fuera más interactivo: sería bueno si pudiera elegir las etiquetas que se incluirán en el gráfico. ¿Ha encontrado una aplicación de UI que se puede usar para analizar los registros de medición de tiempo?

¿Utilizó Perf4J en su aplicación Java para recopilar y analizar estadísticas de rendimiento?

¿Cuál fue el patrón típico (usando archivos de registro, utilidades, UI, JMX, etc.)?

¿Usaste anotaciones y características basadas en AOP?

¿Usaste alguna integración JMX?

¿Cómo manejaste la configuración de producción?

¿Incluyó vistas / informes de estadísticas de rendimiento como una característica en su aplicación?

Por favor, diga si y por qué decidió una alternativa de biblioteca / enfoque.


Estoy utilizando Per4j para monitorear el rendimiento del punto final del servicio web y también el servicio interno y el rendimiento de la clase dao.

Principalmente, solo registro las estadísticas de rendimiento sin procesar en un archivo continuo diario. Luego uso el jar en la línea de comandos para analizar los datos con diferentes intervalos de tiempo como me plazca. A menudo utilizo la opción de línea de comandos -g para generar un archivo html que luego puedo abrir y ver los datos visualmente, lo que es realmente útil.

Disfruto usando Spring AOP con la anotación @Profiled . Hace el tiempo muy limpio. Tenía algunos dudosos con respecto al rendimiento degradante de perf4j, y podía ofrecer fácilmente que podría desactivar el registro eliminando el TimingAspect de mi archivo Spring TimingAspect .

<!-- just remove and all uses of @Profiled do nothing --> <bean id="timingAspect" class="org.perf4j.log4j.aop.TimingAspect"/>

Tenga cuidado con el valor medio y anote el valor máximo. Mientras realizamos la optimización del rendimiento, tuvimos una llamada al método con valores salvajes con una gran desviación estándar. La mayoría de los valores estaban alrededor de la mediana, sin embargo, hubo una serie de llamadas que fueron 100 veces más que el promedio. Más de error de usuario que cualquier otra cosa, pero cuidado.

Utilizo AsyncCoalescingStatisticsAppender con un intervalo de tiempo de 15000, pero casi no leo el registro. Como tengo los registros de rendimiento sin procesar, puedo cortar y cambiar eso ejecutando perf4j en la línea de comandos.

Probé la integración de JMX y funciona según lo prometido en la documentación. Pero no tengo un uso real en este momento para ello.

Tengo planes de exponer los datos mediante SNMP y, si es útil, contribuiré.

En total, recomiendo Perf4j.


He usado Perf4J y, finalmente, lo abandoné porque ya estaba usando Spring AOP. Me encantaría simplemente integrar los dos, pero estaba teniendo problemas con esto (debido a los agregadores de Perf4J).

Intenté usar Perf4j a través de anotaciones y AOP sin JMX. Puede manejar la producción de cfg a través de archivos de configuración.

En general, me gustó el enfoque de Perf4j, pero como ya estaba usando Spring para el monitoreo del rendimiento no necesitaba perf4j. Una cosa que Perf4j da de forma gratuita es el mínimo / máximo / estándar dev; con otras libretas tendrías que hacer las matemáticas tú mismo.

Creo que perf4j es bueno si no tienes ninguna otra lib que pueda proporcionar intercepción (aspectJ o AOP), pero como ya tenía Spring, era más fácil implementar la medición del rendimiento. Puede exponer fácilmente las propiedades de los beans a través de JMX con Spring.