Comments 6
Зачем итерироваться по Set-у через toArray(), когда Set сам по себе Iterable? Он может меняться во время исполнения?
Как я понял, стартовый таймстамп сохраняется в статической переменной? Даже если забыть про вопрос многопоточности, если внутри одного класса один инструментированный метод вызывает другой, результат замера внешнего метода будет неправильным.
toArray() создает новый массив в памяти и в принципе норм. Итератор +2 строчки кода.
По второму вашему комментарию:
Вопрос со статичным полем можно решить и сделать локальные переменные, тогда все будет правильно рассчитываться. Как правило, для моих целей, меня интересует только один метод в классе. Корявость расчета отпадает. НО если сделать локальные переменные javaassist addCatch перестает видеть startTime в блоке finally, потому-что объявляется внутри трая.
Не смог разобраться с javaasist как это сделать. Если знаете как, подскажите, буду признателен.
Отсутствие трай кетча тоже можно пережить и пренебречь проблемой отсутствия некоторых замеров в момент возникновения исключений — как статистическая погрешность. Вот пример реально декомпилированного класса.
По второму вашему комментарию:
Вопрос со статичным полем можно решить и сделать локальные переменные, тогда все будет правильно рассчитываться. Как правило, для моих целей, меня интересует только один метод в классе. Корявость расчета отпадает. НО если сделать локальные переменные javaassist addCatch перестает видеть startTime в блоке finally, потому-что объявляется внутри трая.
Не смог разобраться с javaasist как это сделать. Если знаете как, подскажите, буду признателен.
Отсутствие трай кетча тоже можно пережить и пренебречь проблемой отсутствия некоторых замеров в момент возникновения исключений — как статистическая погрешность. Вот пример реально декомпилированного класса.
import ru.ltm.agent.jmx.ClassesMetricsProfiler;
public class RFDataBasesP1S1 extends EXEBaseStep {
public static final ClassesMetricsProfiler metricsProfiler = new ClassesMetricsProfiler();
public static long __metricStartTime = System.currentTimeMillis();
public Object processStep(Object pObject) {
try {
__metricStartTime = System.currentTimeMillis();
} catch (Exception exception) {
throw exception;
} finally {
Object object = null;
metricsProfiler.mark2("com.ssaglobal.scm.wms.service.drfmanagement.RFDataBasesP1S1.processStep", System.currentTimeMillis() - __metricStartTime);
}
return context;
}
}
Цикл for сам по себе поддерживает Iterable (если у вас, конечно, не какая-нибудь древняя версия java)
Замерять начало выполнения можно и перед try, там же создавать переменную. В байт-коде try никак не проявляется, см. статью, раздел «Обработка исключений». В этом случае, по идее, переменная должна быть видна во всей функции. Но я с javaassist не работал, там могут быть свои нюансы.
for (Settings settingObj : methodsToInstrument) {
...
}
Замерять начало выполнения можно и перед try, там же создавать переменную. В байт-коде try никак не проявляется, см. статью, раздел «Обработка исключений». В этом случае, по идее, переменная должна быть видна во всей функции. Но я с javaassist не работал, там могут быть свои нюансы.
Логичный вопрос зачем собирать метрики инструментарием и jmx, когда есть jprofiler?
Sign up to leave a comment.
Сбор метрик с «чужого» класса, с помощью jmx и javaassist в виде javaagent