Профилировщики Java, которые отображают статистику запросов и поток программ
Я ищу профилировщики, которые поддерживают статистику профилирования по запросу, в идеале вдоль потока программ (не обычный стек вызовов потоков). Таким образом, в основном стек вызовов профилировщика + представление последовательных вызовов для каждого отдельного запроса, что-то вроде этого:
doGet 100ms
+ doFilter 95ms
+ doFilter2 90ms
+ validateValues 20ms
+ calculateX 40ms
+ calc1 10ms
+ calc2 30ms
+ renderResponse 30ms
Какие профили классов / методов настраиваются каким-либо образом, для профилировщика трассировки, который обрабатывает каждый вызов метода, это, конечно, не используется.
Я знаю и использовал dynaTrace, его функция "PurePath" ( http://www.dynatrace.com/en/architecture-tame-complexity-with-purepath.aspx) поддерживает это, но я ищу инструменты, которые может использоваться в небольших проектах и требует меньше первоначальных инвестиций и настройки.
Поддерживает ли это какой-нибудь "классический" профилировщик (YourKit и т. Д.), И я пропустил эту функцию?
Приложение: Чтобы предоставить некоторую справочную информацию: Основная цель - получить статистику для мониторинга и анализа системы в производстве. Прежде всего, идея состоит в том, чтобы получить оперативную статистику о том, сколько времени занимают запросы, и, если время отклика увеличивается, чтобы получить данные для определенных (типов) запросов (например, JETM + x).
Статистика профилирования по запросу позволяет детально проанализировать, почему только некоторые запросы являются медленными, например, если 10% запросов занимают в десять раз больше среднего значения. С агрегированной статистикой это AFAIK очень трудно решить.
То же самое касается статистики профилирования, которая отображает вызовы по ходу программы, потому что легко определить, где в запросе находится проблема, например, метод выполняет десять запросов к БД, каждый вызов рассматривается как один, а не только десять. агрегированные звонки.
В идеале точки измерения настраиваются и включаются / отключаются во время выполнения.
3 ответа
Вы можете попробовать btrace сделать выборочные измерения. Это несколько похоже на dtrace, который вы также можете использовать, если вы находитесь на поддерживаемой платформе, Solaris, BSD, OS X.
Мой подход похож на подход Питера, но вместо использования локальных потоков и вычислений в сети я записываю в файл журнала, когда выполнение достигает интересных этапов. Кроме того, я использовал AspectJ для генерации строк журнала, что оказалось очень удобным для добавления / удаления строк журнала прихоти без необходимости изменения остальной части исходного кода.
Если ваше приложение рассчитывает время в миллисекундах, вы можете просто составить карту времени для создания TreeMap, которую вы можете суммировать и записывать в файл. Это наиболее гибкий способ, который подходит для миллисекундных таймингов.
Для микросекундных таймингов у меня есть значение enum для каждого этапа, а затем записывается текущее время (System.nanoTime()), когда эта стадия достигается в массиве ThreadLocal. (Нет выделения объектов). Когда запрос завершен, запишите временные разницы в файл, например, в формате CSV.