Этот пост был первоначально опубликован в нашем блоге 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(); });
Здесь происходит несколько вещей:
- Подпишитесь на событие сообщения в веб-сокете, которое запускается каждый раз, когда сервер отправляет сообщение.
- Получив сообщение (котировку цены), измерьте задержку с момента открытия веб-сокета. Зафиксируйте эту задержку как специальную метрику под названием sub2tick, сгруппированную по символу (IBM), которую можно агрегировать и анализировать при выполнении нашего теста. Если группировка по символу бесполезна, просто замените results('IBM') на results().
- Закройте веб-сокет. В противном случае ценовые тики будут продолжаться бесконечно, пока не истечет время теста.
Чтобы увидеть, как выглядит сообщение об обновлении цены, добавьте строку 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, было бы полезно добавить его в сетку, чтобы показать результаты по символам.
Теперь сохраните эту информационную панель как новую, используя Панель инструментов.. -> Сохранить как. Прочтите это для получения дополнительной информации о настройке панели инструментов.
И это все! Мы настроили тестовый пример, зафиксировали пользовательские метрики, запустили его в масштабе и проанализировали результаты.
Если вы не хотите писать сценарий самостоятельно, вы также можете записать сценарий веб-сокета.