Плагін CsvLogWriter для JMeter

Введення

Напевно кожен, хто користувався стандартними листенерами в JMeter, стикався з наступними обмеженнями:
  • стандартні листенеры не дозволяють отримати детальну інформацію по всім запитам, прописаним в тест плані;
  • стандартні листенеры виводять інформацію в XML — форматі, що ускладнює подальший аналіз логів засобами Excel і IPython.
Щоб обійти ці обмеження, було ухвалено рішення переробити формування лог-файлів за допомогою нового плагина CsvLogWriter.

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

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


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

При використанні стандартних листенеров ми зможемо отримати дані тільки по Transaction Controller1. Виходячи з цього було вирішено додати фіксацію даних по дочірнім подзапросам, таким чином отримати результати ми зможемо Transaction Controller1, Transaction Controller 2 і вкладеним у нього семплерам.

Опис функціоналу плагіна 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 Найменування файлу, в який записуються відповіді.
Поле заповнюється при використанні Response to Save 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 Ознака того, що поточне подія є транзакцією (TransactionController). Тобто, це лише группирующий елемент. 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 або iPython) і 1 в XML-форматі.

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


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

Як видно на рисунку 4, SimpleDataWriter виводить інформацію тільки по Transaction Controller1. У свою чергу, плагін CsvLogWriter за рахунок обробки дочірніх підпорядкованого виводить набагато більше інформації. Зміст лог-файл плагіна CsvLogWriter представлено на малюнку 5.


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

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

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

Таблиця 2. Порівняння швидкодії SimpleDataWriter і плагіна CsvLogWriter
CsvLogWriter SimpleDataWriter (CSV+XML) SimpleDataWriter (CSV)
Тривалість (мс), кількість викликів Тривалість (мс), кількість викликів Тривалість (мс), кількість викликів
215, 2000 23076, 4000 101, 2000
Висновки:
  • CsvLogWriter в 10 разів швидше SimpleDataWriter (XML з максимальною деталізацією);
  • CsvLogWriter в 2 рази повільніше SimpleDataWriter (CSV з максимальною деталізацією);
  • SimpleDataWriter (XML з максимальною деталізацією) в 20 разів повільніше SimpleDataWriter (CSV з максимальною деталізацією).


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

github.com/pflb/Jmeter.Plugin.CsvLogWriter
Джерело: Хабрахабр
  • avatar
  • 0

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.