Плагін CsvLogWriter для JMeter

Введення

Напевно кожен, хто користувався стандартними лістенерами в JMeter, стикався з наступними обмеженнями:

  • стандартні листенери не дозволяють отримати детальну інформацію за всіма підзапитами, прописаними в тест плані;
  • стандартні листенери виводять інформацію в XML - форматі, що ускладнює подальший аналіз логів засобами Excel і Pandas.

Щоб обійти дані обмеження, було прийнято рішення переробити формування лог-файлів за допомогою нового плагіну CsvLogWriter.

Поставлені завдання

Необхідно було розробити плагін для JMeter, який мав би такі функціональні можливості:

  • вивід повного тексту помилки в рядковому форматі;
  • фіксація даних по дочірніх підзапросах.

У стандартних листенерах для JMeter фіксація повного змісту помилки можлива в XML-форматі, що приносить незручності для аналізу. Виникла потреба зберігати текст помилки в рядковому форматі з подальшим записом, наприклад, в CSV-формат для забезпечення можливості побудови графіків в Excel і Pandas. Зазвичай отримувані лог-файли не відображають дані по дочірніх підзапросах. Що вкрай незручно при використанні складної структури тест-плану. Приклад структури продемонстрований на малюнку 1.

Малюнок 1. Структура тест-плану

При використанні стандартних лістенерів ми не зможемо отримати дані підзапросів (вбудованих ресурсів), CSVLogWriter дає нам таку можливість.

Опис функціоналу плагіну pflb @ CsvLogWriter

Під час роботи було написано плагін pflb @ CsvLogWriter для JMeter. До ключових особливостей даного плагіну можна віднести те, що він може фіксувати результати роботи дочірніх підзапросів і записувати повний текст помилки, при її виникненні, у вигляді звичайного тексту, а не в XML-форматі.

Опис полів лога

Формат логу

Дані, що фіксуються в лог-файлі, представлені в таблиці 1.

Таблиця 1. Формат логу

Назва

Тип

Опис

Приклади значень для стовпчика логу

Одиниця вимірювання

1

timeStamp

long

Час початку або кінця запиту

 

мс.

2

elapsed

long

Тривалість обробки запиту: endTime — startTime — idleTime

49, 434

мс.

3

label

String

Найменування компонента JMeter

   

4

responseCode

String

Код відповіді на запит

«200», «Non HTTP response code: java.net.UnknownHostException»

 

5

responseMessage

String

Розшифрування коду відповіді

«OK», «Internal Server Error»

 

6

threadName

String

Назва потоку

«Thread Group 1-1»

 

7

dataType

String

Тип даних у відповіді, на практиці приймає два значення - «bin» або «text»

«bin», «text»

 

8

success

boolean

Стан успішності запиту

true або false

 

9

failureMessage

String

Повідомлення про помилку,

у разі спрацювання Assertion-компонента,

доданого до Sampler-у.

У CsvLogWriter у полі записуються повідомлення

від усіх Assertion-компонентів,

виконання яких згенерувало помилку.

У базовому логері записується тільки перше повідомлення.

   

10

bytes

int

Розмір відповіді.

Значення і алгоритм розрахунку залежать від налаштувань

sampler-а. На значення можуть впливати responseData.length,

headersSize, bodySize.

 

Байт

11

grpThreads

int

Кількість активних потоків у поточній групі

   

12

allThreads

int

Кількість активних віртуальних користувачів всіх груп

   

13

URL

String

Посилання

   

14

Filename

String

Назви файла, до якого записуються відповіді.

Поле заповнюється при використанні Save Response to File Listener.

Цей Listener рідко використовується, зазвичай значення колонки

- порожній рядок

   

15

Latency

int

Час до отримання першої відповіді сервера.

Ця тимчасова затримка включає в себе час,

витрачене на з'єднання з сервером,

затримки, обумовлені встановленням захищеного з'єднання,

і внутрішніми затримками JMeter на отримання

перших байтів відповіді сервера. Якщо з якоїсь причини

робота Sampler-а була припинена, а потім відновлена,

значення Latency буде скориговано

на тривалість припинення Sampler-у.

 

мс.

16

Encoding

String

Кодування. Повертається кодування відповіді,

якщо кодування відповіді не вказано,

Цей параметр повертається до типового кодування.

Типове значення кодування вказано у

«sampleresult.default.encoding».

Для HTTP Request типове значення «ISO-8859-1».

«ISO-8859-1», «UTF-8»

 

17

SampleCount

int

Кількість семплів.

Для HTTP Request значення дорівнює 1.

Для JMS Sampler, який виконує підписку на події

і читання декількох повідомлень за раз,

значення дорівнює кількості циклів опитування

або кількості прочитаних повідомлень.

Значення завжди більше або дорівнює одному.

1, 2

шт

18

ErrorCount

int

Кількість помилок.

Для HTTP Request значення дорівнює 0, якщо success

і дорівнює 1 якщо запит не успішний.

Для інших sampler-ів, які виконують обробку

декількох повідомлень за раз,

значення може бути більше 1.

0, 1

шт

19

Hostname

String

Найменування машини

   

20

IdleTime

int

Час простою

 

мс.

21

Connect

int

Час, витрачений на встановлення з "єднання

 

мс.

22

headersSize

int

Розмір заголовків

 

Байт

23

bodySize

int

Розміри тіла

 

Байт

24

contentType

String

Тип вмісту з заголовка відповіді

   

25

endTime

long

Час завершення запиту

 

мс.

26

isMonitor

boolean

Ознака чи поставлена галочка Use as Monitor

true, false

 

27

threadName_label

String

Найменування треду і компонента JMeter

   

28

parent_threadName_label

String

Найменування треду і компонента JMeter батька

   

29

startTime

long

Час запиту

 

мс.

30

stopTest

boolean

Ознака зупинено тест - кнопка Stop.

Також у параметрах Thread Group є параметр

«Stop Test» при помилці. Якщо у стовпчику «stopTest»

варто true, значить сталася саме така ситуація.

Скрипт перервався на поточному запиті.

true, false

 

31

stopTestNow

boolean

Ознака зупинено тест різко - кнопка Shutdown.

Також у параметрах Thread Group є параметр

«Stop Test Now» при помилці. Якщо у стовпчику «stopTestNow»

варто true, значить сталася саме така ситуація.

Скрипт перервався на поточному запиті.

true, false

 

32

stopThread

boolean

Ознака чи зупинено поточний потік.

У параметрах Thread Group є параметр «Stop Thread»

при помилці. Якщо в колонці «stopThread» стоїть true,

значить сталася саме така ситуація.

Скрипт перервався на поточному запиті.

true, false

 

33

startNextThreadLoop

boolean

Чи стартує повтор.

У параметрах Thread Group є параметр «Start Next Thread Loop»

при помилці. Якщо в колонці «startNextThreadLoop» стоїть true,

значить сталася саме така ситуація.

Скрипт перервався на поточному запиті.

true, false

 

34

isTransactionSampleEvent

boolean

Ознака того, що поточна подія є транзакцією (Transac^ Controller). Тобто, це лише групуючий елемент.

true, false

 

35

transactionLevel

int

Рівень вкладеності запиту.

Якщо використовується ієрархія Transaction Controller

або у підзапросів є підзапити,

у цьому стовпчику буде рівень вкладеності.

0 для кореневого запиту або кореневого Transaction Controller.

1 для підзапиту, батько якого є кореневим.

 

36

responseDataAsString

String

Повний вміст помилки у форматі рядка

у разі її виникнення, якщо success = = false,

responseData буде містити повне тіло відповіді

   

37

requestHeaders

String

Заголовки запиту

   

38

responseData

String

Повний зміст помилки у разі її виникнення,

якщо success = = false, то responseData буде міститися

повне тіло відповіді, перекодоване в base64

   

39

responseHeaders

String

Заголовки відповіді

   

40

< Назва змінної >

String

Змінні JMeter

   

Структура лога розширює базовий формат CSV лога. З базовим набором параметрів можна ознайомитися за посиланням jmeter.apache.org/usermanual/listeners.html#csvlogformat

Отриманий CSV-лог можна завантажити будь-яким базовим Listener-ом JMeter, що підтримує завантаження CSV-лога.

Також у лозі з'явилися додаткові колонки, які можуть стати в нагоді при аналізі (буд. 22-35 таблиці Формат лога).

Тіла і заголовки відповідей і запитів записуються тільки при помилках (стр. 36-39 таблиці Формат лога).

Також у лог запишуться колонки для змінних: jmeter.apache.org/usermanual/listeners.html#sample_variables - опис можливості логувати значення змінних.

Інтерфейс

Для запуску плагіну необхідно заповнити поле Filename. Поле Filename містить шлях до файла, в якому буде вестися фіксація результатів роботи. Можна прописати теку вручну або вибрати файл за допомогою кнопки «Browse». Якщо файл існує, створюється новий файл. Найменування нового лог-файлу формується додаванням постфіксу з номером лог-файлу до оригінального найменування.

Так само на формі розташовані прапорці. За допомогою позначок можна маніпулювати даними, що фіксуються в лозі. Позначка Additional parameters відповідає за фіксацію додаткових параметрів (22-35 рядка в таблиці Формат лога), Response data відповідає за фіксацію тексту помилок (36-39 рядка в таблиці Формат лога), User variables відповідає за фіксацію змінних користувача.

Інтерфейс плагіну представлений на малюнку 2.

Малюнок 2. Інтерфейс плагіну CSVLogWriter

Порівняння плагіну CSVLogWriter і Simple Data Writer

У цьому розділі спробуємо порівняти плагін CsvLogWriter і стандартний лістенер Simple Data Writer.

Склад логованих даних

Лістенер Simple Data Writer дає користувачеві можливість налаштувати список фіксованих даних. На зображенні 3 показано діалогове вікно налаштування даних.

Малюнок 3. Діалогове вікно налаштування даних листенера Simple Data Writer

Плагін CsvLogWriter завжди виводить базовий перелік параметрів (аналогічний Simple Data Writer) і дозволяє налаштувати вивід списку додаткових даних за допомогою 3 прапорців на формі:

  • Additional parameters - додаткові параметри (22-35 рядка в таблиці Формат лога);
  • Response data - тексти помилок (36-39 рядка в таблиці Формат лога);
  • User variables - власні змінні (для виводу необхідно запускати JMeter з ключем -Jsample_variables).

Детальний перелік фіксованих даних жорстко прописаний в коді. Але, як видно на малюнку 3, Simple Data Writer не може виводити текст помилки в рядковому форматі. Повний текст помилки фіксується лише у форматі XML. З цієї причини у випадку, коли нам необхідний текст помилок доводиться вести 2 логи - 1 в CSV-форматі (якщо необхідна подальша обробка лога з побудовою графіків в Excel або Pandas) і 1 в XML-форматі.

Логування підзапросів

Так само, лістенер Simple Data Writer не фіксує результати роботи дочірніх підзапросів, відповідно, такий лог-файл не можна назвати вичерпним. Для наочного порівняння обсягу виводимих даних запустимо тест, відповідний тест-плану на малюнку 1, і подивимося на лог-файли. Лог-файл Sim^ DataWriter представлений на малюнку 4.

Малюнок 4. Лог-файл Simple Data Writer

Як видно на малюнку 4, Sim^ DataWriter не виводить інформацію щодо вбудованих ресурсів. У свою чергу, плагін CsvLogWriter за рахунок обробки дочірніх підзапросів виводить більше інформації. Вміст лог-файлу плагіну CsvLogWriter представлено на малюнку 5.

Малюнок 5. Лог-файл CsvLogWriter

Порівняння швидкодії

Так само проводився аналіз швидкодії методу Sim^ Occured, що відповідає за обробку подій. Профілювання велося в Java VisualVM. У тест плані не використовувалися підзапити. Для Sim^ DataWriter тестування запускалося з записом в 1 CSV-файл і з записом у 2 файли - CSV і XML. Кількість віртуальних користувачів становила 10, кількість повторення 100. Підсумки порівняння наведено в таблиці 2.

Таблиця 2. Порівняння швидкодії Sim  DataWriter і плагіну CsvLogWriter

CsvLogWriter

SimpleDataWriter (CSV+XML)

SimpleDataWriter (CSV)

Тривалість (мс), кількість викликів

Тривалість (мс), кількість викликів

Тривалість (мс), кількість викликів

215, 2000

23076, 4000

101, 2000

Висновки:

  • CsvLogWriter у 10 разів швидший за Sim^ DataWriter (XML з максимальною деталізацією);
  • CsvLogWriter в 2 рази повільніше Sim^ DataWriter (CSV з максимальною деталізацією);
  • Sim^ DataWriter (XML з максимальною деталізацією) в 20 разів повільніше Sim^ DataWriter (CSV з максимальною деталізацією).

Посилання на плагін

github.com/pflb/Jmeter.Plugin.CsvLogWriter

logo