вторник, 15 марта 2011 г.

Простой мониторинг времён с помощью JAMon и spring-aop.

Задача классическая - подсчитать какие методы, сколько времени выполняются, и при этом не особо уродуя функциональный код. То есть зафиксировать время перед началом выполнения метода, затем время после выполнения метода, посчитать и куда-нибудь записать разницу.

Мне не хотелось выдумывать велосипед, поэтому я воспользовался простой библиотекой JAMon, где решение этой задачи выглядит тривиально :

Без spring-а (это когда не всё создаётся через IoC) :

Monitor mon = MonitorFactory.start("myMethod");
try {
    myMethod();
} finally {
    mon.stop();
}
System.out.println(MonitorFactory.getReport());


В отчёте (в виде строки с html-таблицей) будет видно количество вызовов метода, общее время, среднее , минимальное, максимальное и т.п. Для каждого значения в методе start() будут отдельные счётчики.

Теперь как это выглядит с использованием spring-aop :

В коде ничего не добавляем (только место где выводим результаты), а в конфиге пишем следующее :

 <bean id="jamonPerformanceMonitorInterceptor" class="org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor" >
   <property name="trackAllInvocations" value="true"></property>
   <property name="useDynamicLogger" value="true"></property>
</bean>

<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="interceptorNames">
        <list>
           <idref bean="jamonPerformanceMonitorInterceptor"/>
        </list>
    </property>
    <property name="beanNames">
        <list>
           <value>idBean1</value>
           <value>idBean2</value>
        </list>
    </property> 

</bean>

Всё. После этого все вызовы наших зарегистрированных бинов idBean1 и idBean2 будут фиксироваться JAMon, и как и в первом случае доступ к этим данным можно получить через MonitorFactory.getReport() (или другие полезные методы этой фабрики)


P.S.: Я использую для ряда объектов прокси CGLIB. При попытке подключить aop-аннотации, я получал ошибки, а в xml-конфигурации выше, всё отрабтало отлично. Впрочем, полагаю, что я просто что-то не докрутил с аннотациями.

P.P.S.: springframework 3.0.5(http://www.springsource.org/), JAMon 2.7(http://jamonapi.sourceforge.net/)

Комментариев нет:

Отправить комментарий