Профилировщики 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.

Другие вопросы по тегам