Этот пост был первоначально опубликован в нашем блоге Tumblr 20 января 2016 года. Он публикуется здесь с небольшими обновлениями, отражающими последние тестируемые функции.

Тестирование производительности WebSocket за 4 простых шага

Этот пост посвящен тому, как мы можем использовать Testable для тестирования производительности сервера WebSocket, сбора некоторых полезных пользовательских показателей и анализа результатов.

Мы будем использовать пример сервера веб-сокетов, который поддерживает подписку на биржевой символ и получение потоковых обновлений фиктивных цен (фиктивных) раз в секунду. Подробнее об этой услуге можно узнать здесь.

Шаг 1: Создайте тестовый пример

Сначала убедитесь, что вы зарегистрировали учетную запись Testable. После входа в систему нажмите кнопку «Новый тестовый пример», дайте ему имя и укажите URL-адрес (в нашем примере — ws://sample.testable.io/streaming/websocket).

Шаг 2: Напишите тестовый сценарий

Тестируемые скрипты — это просто Javascript, который выполняется в изолированной среде Node.JS. После завершения шага 1 нажмите «Далее» и выберите «Написать сценарий» в качестве типа сценария. В раскрывающемся списке шаблонов выберите Пользовательские показатели > Измерить подписку на задержку первого тика в веб-сокете.

Вы должны увидеть следующий код Javascript, вставленный во вкладку «Код»:

var subscribeSentAt = 0; 
var ws = new WebSocket("ws://sample.testable.io/streaming/websocket"); ws.on('open', function () { 
  subscribeSentAt = moment().valueOf(); 
  ws.send('{ "subscribe": "IBM" }'); 
}); 
ws.on('message', function(data, flags) {
  results('IBM').timing('sub2tick', moment().valueOf() - subscribeSentAt, 'ms'); 
  ws.close(); 
});

Если вы знакомы с Node.js и модулем ws, то этот код уже должен выглядеть довольно ясно. Если нет, давайте пройдемся по каждому блоку.

var ws = new WebSocket("ws://sample.testable.io/streaming/websocket");

Эта строка открывает подключение через веб-сокет к демонстрационному сервису.

ws.on('open', function () { 
  subscribeSentAt = moment().valueOf(); 
  ws.send('{ "subscribe": "IBM" }'); 
});

Слушайте событие открытия веб-сокета. После получения зафиксируйте текущую метку времени (мс) и отправьте запрос на подписку в IBM.

ws.on('message', function(data, flags) {   
  results('IBM').timing('sub2tick', moment().valueOf() - subscribeSentAt, 'ms'); 
  ws.close(); 
});

Здесь происходит несколько вещей:

  1. Подпишитесь на событие сообщения в веб-сокете, которое запускается каждый раз, когда сервер отправляет сообщение.
  2. Получив сообщение (котировку цены), измерьте задержку с момента открытия веб-сокета. Зафиксируйте эту задержку как специальную метрику под названием sub2tick, сгруппированную по символу (IBM), которую можно агрегировать и анализировать при выполнении нашего теста. Если группировка по символу бесполезна, просто замените results('IBM') на results().
  3. Закройте веб-сокет. В противном случае ценовые тики будут продолжаться бесконечно, пока не истечет время теста.

Чтобы увидеть, как выглядит сообщение об обновлении цены, добавьте строку log.info(data) в приведенный выше код для тестирования. Не забудьте удалить его, прежде чем мы запустим нагрузочный тест, иначе вы можете получить много ненужных журналов.

Этот код теперь определяет сценарий для выполнения в масштабе.

Проверьте свой скрипт, нажав кнопку Smoke Test в правом верхнем углу. Это выполняется один раз на общем тестируемом агенте. Любые захваченные метрики и журналы появятся на вкладке Результаты теста дыма.

Пример вывода дымового теста

Обратите внимание, что Testable автоматически фиксирует набор метрик в дополнение к пользовательской метрике, которую мы добавили в наш скрипт.

Шаг 3. Настройте нагрузочный тест

Нажмите Далее, чтобы перейти к шагу Настройка. Теперь мы точно определяем, как выполнить сценарий, который мы определили на шаге 2.

  • 10 одновременных клиентов в регионе. Каждый параллельный клиент похож на пользователя, использующего вашу службу, и работает на тестируемом агенте параллельно.
  • Продолжительность 1 минута.
  • Выполнение в общедоступной общей сети в двух регионах (AWS N Virginia и AWS Oregon).

Нажмите кнопку Начать тест, и ваш тест будет запущен! Поздравляем, вы официально создали и запустили нагрузочный тест. Теперь давайте посмотрим на анализ результатов.

Шаг 4: просмотрите результаты

К настоящему времени вы должны увидеть результаты, поступающие по мере выполнения теста. Панель мониторинга по умолчанию будет отображать сводку, сетку результатов и графики показателей, захваченных системой.

Давайте нарисуем нашу метрику sub2tick и добавим ее в сводную таблицу и таблицу результатов.

Добавить диаграмму в два тика

В правом верхнем углу нажмите кнопку Dashboard.. и выберите Добавить диаграмму.

Дайте ему имя, например, «Подпишитесь на Tick». Выберите Линейный график и начертите sub2tick -> среднее значение, sub2tick -> p95 (95-й процентиль) и sub2tick -> p99 (99-й процентиль).

Добавьте диаграмму, и она появится на панели инструментов.

Добавить sub2tick к сводке

Прокрутите вниз до сводки и нажмите значок настройки. Нажмите Добавить столбец, выберите показатель sub2tick-mean и нажмите Обновить сводку. Вы можете изменить порядок столбцов, перетащив новый столбец вверх или вниз в окне конфигурации.

После обновления конфигурации сводка будет выглядеть следующим образом:

Добавить sub2tick в сетку результатов

То же самое, что добавить его в сводку. Если бы у нас было больше символов, чем просто IBM, было бы полезно добавить его в сетку, чтобы показать результаты по символам.

Теперь сохраните эту информационную панель как новую, используя Панель инструментов.. -> Сохранить как. Прочтите это для получения дополнительной информации о настройке панели инструментов.

И это все! Мы настроили тестовый пример, зафиксировали пользовательские метрики, запустили его в масштабе и проанализировали результаты.

Если вы не хотите писать сценарий самостоятельно, вы также можете записать сценарий веб-сокета.