Как измерить время от начала до конца потока в JMeter

#jmeter #jmeter-5.0 #blazemeter

#jmeter #jmeter-5.0 #blazemeter

Вопрос:

Я пытался выяснить, как измерить количество времени, которое требуется потоку (виртуальному пользователю) в JMeter для полного завершения. На данный момент меня не обязательно интересует время отклика. API, который я пытаюсь загрузить для тестирования, работает асинхронно. Я делаю запрос на запуск задания, мне присваивается идентификатор задания, затем я использую этот идентификатор задания для проверки статуса указанного задания до его завершения. Мне интересно узнать, сколько времени требуется для завершения каждого задания, т.Е. Когда задание запускается (поток создается) и когда задание завершено (поток завершен).

Я видел, как несколько человек предлагали использовать Transaction Controller в подобных ситуациях, но это, если я не ошибаюсь, дает мне общее время отклика на все запросы в «транзакции», что мне не помогает.

Это то, что я настроил до сих пор в JMeter:

введите описание изображения здесь

Что на самом деле отлично работает, я делаю первоначальный запрос на отправку задания и извлекаю идентификатор задания. В цикле while я проверяю статус задания, используя извлеченный идентификатор каждые 10 секунд (постоянный таймер), пока задание не будет завершено.

Вот как выглядит сводный отчет для 5 одновременных пользователей, я также могу сделать метки одинаковыми, чтобы они еще больше уплотнялись, но ни одна из этой информации не говорит мне, сколько времени занял поток. Исходя из количества выборок, я могу предположить, что для завершения половины потоков потребовалось примерно 10 секунд, а остальные я могу умножить на 10 секунд (таймер ожидания) и получить приблизительную оценку того, сколько времени потребовалось для завершения, но это было бы сложно сделать (или, по крайней мере, трудоемко) за пару сотенпотоки. Я действительно надеялся, что у JMeter есть что-то готовое, что даст мне эту информацию в удобном формате отчета.

введите описание изображения здесь

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

Ответ №1:

Ваш вопрос содержит ответ, просто измерьте его

  1. Добавьте пробоотборник JSR223 в начало вашей группы потоков и поместите следующий код в область «Сценарий»:

     SampleResult.setIgnore()
    vars.putObject('startTime', System.currentTimeMillis())
      

    первая строка сообщает JMeter, чтобы он не сохранял результат выборки JSR223 (поскольку я считаю, что вам это не нужно), а вторая строка сохраняет текущую временную метку в ${startTime} переменной JMeter

  2. Добавьте еще один сэмплер JSR223 в конец вашей группы потоков и используйте там следующий код:

     SampleResult.setIgnore()
    def end = System.currentTimeMillis()
    def start = vars.getObject('startTime')
    log.info('Thread '   (ctx.getThreadNum()   1)   ' elapsed time: '   (end - start))
      

    здесь мы получаем текущую временную метку после завершения задания и вычитаем ее из предыдущего хранилища временных меток в первом сэмплере JSR223. Дельта выводится в j meter.однако файл журнала, возможно, вы захотите сохранить его в другой переменной JMeter и предоставить его результатам через свойство Sample Variables, чтобы оно было добавлено.файл результатов jtl

ДЕМОНСТРАЦИЯ:

введите описание изображения здесь

Смотрите 8 лучших классов Java JMeter, которые вы должны использовать с Groovy, чтобы узнать больше о том, что означают эти SampleResult , vars , и ctx сокращения