Рубрики
Uncategorized

Путешествие на дешевле нагрузки на пожертвование на нагрузке на Heroku с саранчой

Я хочу растянуть каждый доллар, который я провожу на облаке. Я запускаю горстку веб-приложений на герое … Помечено Heroku, Azure, DevOps.

Я хочу растянуть каждый доллар, который я провожу на облаке. Я запускаю несколько веб-приложений на Heroku, и, как и все остальные, запустите набор дымовых испытаний и тесты нагрузки на каждый приращение выпуска в неработающей среде. Тесты нагрузки важны: они помогают нам не только понимать пределы наших систем, но и воспитывают проблемы, возникающие из-за параллелизма, которые часто избегают царств модульных испытаний и тестов интеграции. Но так как мы часто проводим тесты, мы не хотим платить много денег каждый раз, когда тесты бегают.

В этой статье я покажу вам, как настроить экономически эффективные нагрузки. Мы будем использовать саранчу, чтобы пролечить тестирование, а Heroku Чтобы проводить тесты легкими и экономически эффективными. Я также покажу, как вы можете использовать VS Code и Docker для разработки без установки зависимостей Dev в вашей системе.

Что такое саранча?

Саранча Это инструмент тестирования нагрузки на открытый исходный код, написанный на Python. Испытания на саранча могут быть распределены по нескольким машинам для одновременного моделирования миллионов пользователей, помогая определить, сколько пользователей ваш сайт или система может обрабатывать.

Саранча была создана для решения вопросов, которые существуют с двумя другими ведущими решениями — Jmeter и Цун Отказ В частности, он был построен для решения следующих ограничений:

  • CONDULLECHING: JMETR — это связана с нитью, создавая новый поток для каждого пользователя. Это строго ограничивает количество пользователей, которые могут быть смоделированы на машину. Саранча, с другой стороны, на основе событий и может имитировать тысячи пользователей по одному процессу.
  • Простота кодирования: JMeter требует сложных обратных вызовов. Tsung использует DSL на основе XML для определения поведения пользователя. Оба трудно кода. Сценарии саранчи, с другой стороны, написаны на простых Python и легко кода легко.

Терминология

Во-первых, небольшая терминология. С помощью саранчи вы пишете тесты по поведению пользователя в наборе outustfiles, а затем одновременно выполняют сакетфилы на целевой приложении. С точки зрения саранчи, коллекция пользователей саранча (коллективно называется рой, а индивидуально называемая саранчой) будет атаковать целевое приложение и записывать результаты. Каждая саранча выполняется в своем песочнительном процессе под названием Greenlet.

Соображения

Прежде чем продолжить дальше, я рекомендую прочитать Руководство от Heroku На тесты нагрузки, которые перечислены ограничения, которые применяются и последствия. Руководство в этой статье ограничивается исполнением тестов на низкий до среднего уровня (менее 10 000 запросов в секунду). Для выполнения высокомасштабных испытаний вы должны сначала связаться с поддержкой Heroku, чтобы убедиться, что ваши системы предварительно утеплены и будут соответственно масштабироваться или использовать частные пространства для проведения тестирования (приложение под тестом и тестовой платформой). Для испытаний на высокую громкостью я рекомендую моделировать настройку вашего теста на Это пример репозитория приложений Отказ Для новейших деталей ценообразования и оценки стоимости запуска ваших приложений на Heroku, обратитесь к Веб-сайт Heroku Отказ

Предварительные условия

Вот список инструментов и облачных услуг, которые я использовал для создания приложения образца. Моя машина развития работает Windows 10 Профессионал, однако, следующие инструменты также доступны на Mac.

Приложения

Применение образца, которое я подготовил для этой демонстрации, который мы будем ссылаться на Целевое применение API Остаток API написан в ходу. У нас также есть второе приложение, которое мы будем ссылаться на Приложение LoadTest , что содержит тесты нагрузки, написанные в Python, используя Саранча Отказ

  • Целевое приложение API это остальные API, которые мы намерены проверить. Поскольку API требуется для обработки HTTP-запросов, мы разместим его на Web Dynos Отказ
  • Приложение LoadTest Содержит наш Тесты на саранча . Они разделены на две категории, основанные на типе пользователей, поддерживаемых Целевое приложение API Отказ Вы можете выполнить два тестовых люкса параллельно или в последовательности, таким образом, варьируя сумму и характер нагрузки, которую вы применяете на Целевое приложение API Отказ Поскольку Dynos выполняет тесты, требуется только для продолжительности тестовых казней, мы принимаем их в Heroku’s Одноквартирный Dynos Отказ Одноквартирный Dynos выставлен счет только на время и ресурсы, которые они потребляют, и администратор может порождать их, используя Heroku Cli орудие труда.

Ниже приведен диаграмма высокого уровня конструкции приложений и их компонентов.

Heroku предоставляет эфемерное хранилище к применению процессов, выполняющихся на динамике, которые могут или не могут существовать. Кроме того, поскольку хранение локально относится к процессу, мы не можем получить доступ к любым файлам, сгенерированным Heroku CLI, так как он создает еще один песочный процесс со своим собственным хранилищем на динамике. Из-за ограничений доступа, процесс, который генерирует файлы, будет экспортировать их в долговечную службу хранения облака, или в случае веб-динамики, делают их доступными через конечную точку HTTP. Выполняя саранчу с флагом (-CSV), вы можете проинструктировать саранчус, чтобы сохранить результаты теста в файлах CSV локально. Мы используем Азкопия , который является инструментом CLI, используемого для копирования двоичных данных в Azure Storage для экспорта результатов, создаваемых тестами саранда к хранению Azure Blob.

Настройка приложений

Исходный код приложений доступен в моем Репозиторий GitHub Отказ

Целевое применение API

Давайте сначала рассмотрим приложение Target API, которое мы хотим проверить с нашей нагрузкой. Откройте папку с именем API в VS-коде. В файле main.go Я определил три конечных точка API:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
     fmt.Println("Served home request")
     fmt.Fprintf(w, "Server OK")
})

http.HandleFunc("/volatile", func(w http.ResponseWriter, r *http.Request) {
     // For every 10 requests, delay the response by 1 second, up to 5 seconds.
     currentCount := atomic.LoadInt32(&requestCount)
     atomic.AddInt32(&requestCount, 1)
     delay := currentCount / 10
     if delay > 5 {
         atomic.StoreInt32(&requestCount, 0)
         delay = 5
     }

     time.Sleep(time.Duration(delay) * time.Second)
     fmt.Fprintf(w, "Produced response after %d second/s", delay)
     fmt.Printf("Produced response after %d second/s \n", delay)
})

http.HandleFunc("/buggy", func(w http.ResponseWriter, r *http.Request) {
     // After every 5 requests, throw error
     currentCount := atomic.LoadInt32(&requestCount)
     atomic.AddInt32(&requestCount, 1)
     if currentCount%5 == 0 {
         fmt.Printf("Returning error at %d request \n", currentCount)
         http.Error(w, http.StatusText(500), 500)
         return
     }

     fmt.Fprintf(w, "Ok for request %d", currentCount)
})

Поведение трех конечных точек следующим образом:

  • «/»: Возвращает ответ HTTP 200 с текстом OK.
  • «/ Волатильный «: возвращает ответ HTTP 200, но последовательно задерживает ответ на одну секунду за каждые 10 запросов.
  • «/ багги «: Возвращает сообщение неисправности HTTP 500 для каждого пятого запроса.

Расширение удаленного развития для отладки

Вы, вероятно, заметили, что я не упомянул установку Golang или Python в качестве предварительного условия для этого приложения. Мы будем использовать Удаленное развитие Расширение, которое вы установили в VS-код для отладки приложения Target API. Вы можете прочитать об этом расширении в Деталь здесь Отказ Однако в двух словах это расширение позволяет использовать контейнер в качестве среды разработки. Расширение поиска для папки с именем .devcontainer. В корне и использует Dockerfile (определение контейнера) и devcontainer.json (Для настроек контейнера) файлы для создания нового контейнера и установите папку, содержащую свой код в качестве громкости для контейнера. Для отладки расширение прикрепляется отладчик Code VS к процессу, запущенному в контейнере. Я уже настроил ресурсы контейнера для вас, поэтому вам просто нужно нажать клавишу F1, чтобы открыть команду окна и выбрать команду: Удаленные контейнеры: Открыть папку в контейнере Отказ

При запросе открывается папка, выберите папку «API» и продолжить.

В качестве альтернативы вы можете создавать диалог команды, нажав на зеленый значок в левом нижнем углу окна кода VS.

Как только контейнер будет готов, нажмите F5, чтобы начать отладку приложения. Вы заметите, что текст в левом нижнем углу окна VS-кода изменяется в Контейнер Dev : Перейдите для обозначения того, что приложение в настоящее время выполняется в удаленном контейнере. Теперь вы можете получить доступ к конечным точкам приложения из вашего браузера, навигацию на http://localhost: 9000 .

Загрузочное применение

Теперь мы собираемся использовать VS-код для создания тестового набора внутри контейнера и создать скрипт оболочки, который автоматизирует процесс настройки и отрыва от испытательной инфраструктуры. Вы можете использовать этот скрипт для автоматизации вращения и отрыва от тестируемой сетки и добавьте его на ваш Ci \ CD-трубопровод.

1. Запустите нагрузку на приложение DEV контейнер

В другом экземпляре VS кода откройте папку LoadTest и запустите его в контейнере Dev. В этом приложении вы заметите, что создал два набора тестов для моделирования поведения двух типов пользователей целевого применения API.

  • Поведение пользователя типа Апэр Записано в locustfile_scene_1.py. Согласно тесту, пользователь типа Apierer обращается к по умолчанию и летучих конечных точках приложения целевого API после ожидания от пяти до девяти секунд между вызовами.
  • Поведение пользователя типа Админ Записано в jountepile_scene_2.py. Эта категория пользователей обращается к по умолчанию и основные конечные точки целевого применения API после ожидания пяти до 15 секунд между вызовами.

2. Проверьте тесты

Чтобы проверить тестовые сценарии, выполните следующую команду в интегрированном терминале ( Ctrl + ~ ).

$ locust -f locustfile_scene_1.py

Перейдите к http://localhost: 8089 поднять интернет-интерфейс. В форме введите имя хоста и порта приложения Target API вместе с желаемыми конфигурациями рома саранча и нажмите кнопку Начните рояться инициировать тесты.

3. Скрипт оболочки

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

  • Выполните тест без веб-пользовательского интерфейса на одном рабочей узле на фиксированную продолжительность и генерируйте отчеты CSV результатов теста.
  • Используйте AZCOPY, чтобы скопировать файлы результатов теста на хранение Azure. (Конечно, вы можете заменить эту часть для любого поставщика облачного хранения, который вы можете использовать. Вам просто нужно будет изменить следующий скрипт для использования другой утилиты вместо AZCOPY, и вы будете копировать в другое место хранения.)

Run.sh Сценарий в проекте теста нагрузки реализует этот рабочий процесс следующим образом:

#!/bin/bash

locust -f $1 --headless -u 200 -r 10 --host=$TARGET_HOST --csv="$2_$(date +%F_%T)" --run-time 1h -t 2s --stop-timeout 60

for filename in *.csv; do
    [ -e "$filename" ] || continue
    azcopy copy "$filename" "https://locustloadtest.blob.core.windows.net/testresult/$filename\$SAS_TOKEN"
done

exit 0

В предыдущем списке кода после выполнения саранча Команда, которая производит результаты CSV, мы зацикливаемся через файлы CSV и используем утилиту AZCOPY для загрузки каждого файла на место хранения Azure — контейнер с именем TestResult в locustloadtest.blob.core.windows.net учетная запись. Вы должны изменить эти значения с учетной записью хранения, которую вы создали в вашей подписке Azure. Вы можете видеть, что эта команда опирается на токен Shared Access Secret (SAS) для аутентификации, которую мы подали через переменную среды с именем SAS_Token. Мы добавим эту среду переменную в приложение позже. Если вы не знакомы с утилитой AZCOPY, пожалуйста, поймите больше о использовании Azcopy с сасными токенами здесь Отказ

Запустите приложение Target API и создайте Web Dyno

Внутри корневого каталога каждого проекта, API и LoadTest вы найдете файл с именем Procfile Отказ

В Procfile API следующая команда будет проинструктировать Heroku создать веб-динамик и вызвать команду саранча-нагрузка Чтобы запустить приложение.

Веб: саранча-нагрузка

В проекте Loadtest Procfile для испытаний на саранча инструктирует Heroku создавать два рабочих Dynos и вызывать сценарий Run.sh с соответствующими параметрами следующим образом:

Working_scene_1: bash ./run.sh locustfile_scene_1.py stase_1 Working_scene_2: bash ./run.sh locustfile_scene_2.py stase_2.

Создание приложений в Героку

Теперь мы создадим два необходимых приложения в Героку.

Есть два способа, которыми вы можете взаимодействовать с Heroku: пользовательский интерфейс и Heroku CLI. Я буду вести вас через смесь обоих подходов, чтобы вы получили опыт работы с обоими.

Для создания приложений мы будем использовать пользовательский интерфейс Heroku. Сначала мы создадим приложение Target API.

Создать целевое приложение API

В вашем браузере перейдите к https://dashboard.heroku.com/ и нажмите на Новое/создать новое приложение кнопка.

На странице «Создать приложение» введите имя приложения (Locust-Heroku-Target), выберите Общее время выполнения Опция, и желаемый регион. Обратите внимание, что имя приложения должно быть уникальным по всем приложениям Heroku, и поэтому это имя не может быть доступным. Вы можете выбрать свое уникальное имя для этого приложения (и приложение тестового двигателя ниже вниз), гарантируя ссылку на эти новые имена во всех последующих кодах и командах. Если ваши клиенты присутствуют в нескольких географиях, вы можете создать дополнительную тестовую кровать в другом месте и проверить производительность вашего приложения из этого местоположения. Нажмите на Создать приложение Кнопка для создания приложения.

Следующий экран просит вас указать метод развертывания. Поскольку я уже использую Github для контроля источника, я могу проинструктировать Heroku автоматически развернуть всякий раз, когда я вносим изменения в Мастер ветвь. Я рекомендую вам не следовать той же схеме для реальных приложений. Вы должны развернуть до производства из Мастер Ветка и используйте другую ветку, такую как отъемная ветвь для развертывания в средах для тестирования (поток GIT) или от основной ветви после утверждения (поток GitHub).

Создание приложения LoadTest

Теперь давайте настроим приложение LoadTest для наших тестов саранчи. Вы можете создать другое приложение (Locust-Heroku-Testengine) для теста, как это:

Возможно, вы заметили, что я использовал Монорепо Модель, чтобы сохранить целевое применение API и тесты вместе в том же проекте.

На следующем экране подключите развертывание приложения, которое вы только что создали к тому же репозитории. С помощью этой настройки, когда вы вносите изменения в нагрузку либо на приложение LoadTest, либо на целевой API, оба будут развернуты для Heroku, что помогает избежать любых конфликтов между версиями LoadTest и Target API.

По умолчанию работник Dynos этого приложения будет использовать стандарт-1-кратные Dynos, которые являются отличным балансом стоимости и производительности для нашего сценария. Однако вы можете изменить тип Dyno на основе ваших требований к Heroku CLI или через пользовательский интерфейс. Обратитесь к Героку Документация Для команды CLI и типов Dynos, которые вы можете использовать.

Добавление buildpacks через heroku cli

Теперь давайте перейдем к терминалу и подготовим среду с помощью Heroku CLI. Мы пройдем через Buildpacks, которые нужны наши услуги и добавляют их по одному.

Как работают сборки

Heroku buildpacks несут ответственность за преобразование вашего кода в «Slug». В условиях Heroku Slug — это развертываемая копия вашего приложения. Не каждый Buildpack должен генерировать двоичные файлы из вашего прикладного кода — Buildpacks можно связаться, так что каждый SubstPack преобразует код приложения каким-либо образом и подает его к следующему Buildpack в цепочке. Однако после обработки менеджер Dyno должен получить слизню в качестве вывода.

Например, поскольку наш исходный код организован как monorepo, состоящий из целевого применения API и приложения LoadTest, первый Buildpack в цепочке Buildpack, Heroku-Buildpack-MonoRepo Извлекает приложение из монорепо. Второй Buildpack в цепочке создает соответствующее приложение.

Целевые API Buildpacks

Давайте сначала рассмотрим приложение Target API. Использовать Heroku-Buildpack-MonoRepo Чтобы извлечь заявление о наличии на сайте-Героку-целевое из монорепо. Следующий Buildpack, Heroku-Buildpack-Go Создает целевой проект API.

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

$ heroku buildpacks:add -a locust-heroku-target https://github.com/lstoll/heroku-buildpack-monorepo

$ heroku buildpacks:add -a locust-heroku-target https://github.com/heroku/heroku-buildpack-go

Loadtest buildpacks.

Для Лордюр-Эйоку-тестер Проект, нам нужны два стрижка. Первый Buildpack — это тот, который мы использовали ранее, Heroku-Buildpack-MonoRepo Отказ Мы будем изменять параметр, хотя, поэтому он извлечет тестовый проект саранча ( Locust-Heroku-Testengine ) от MonoRepo. Второй строительный пак, Heroku-Buildpack-Python Позволяет выполнять сценарии Python на Heroku.

$ heroku buildpacks:add -a locust-heroku-testengine https://github.com/lstoll/heroku-buildpack-monorepo

$ heroku buildpacks:add -a locust-heroku-testengine https://github.com/heroku/heroku-buildpack-python

Настройка переменных среды

Через Heroku Cli.

Наши приложения требуют установки нескольких переменных среды.

API. Требуется Heroku-Buildpack-MonoRepo для извлечения проекта App_base. Целью саранчи — Героку
нагрузка Требуется Heroku-Buildpack-MonoRepo для извлечения проекта App_base. саранст-эйоку-тестер
/ usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / app / bin Добавляет папку Bin, присутствующую в приложении нагрузки на путь, чтобы Azcopy можно выполнить ДОРОЖКА саранст-эйоку-тестер
Azure Storage SAS токен E.g.?… Требуется AZCOPY для передачи данных для хранения Azure Sas_token. саранст-эйоку-тестер
URL-адрес приложения целевого API Требуется саранча для выполнения тестов нагрузки Target_host. саранст-эйоку-тестер

Выполните следующие команды, чтобы добавить переменные среды в ваши приложения.

$ heroku config:set -a locust-heroku-target APP_BASE=api

$ heroku config:set -a locust-heroku-target GOVERSION=go1.13

$ heroku config:set -a locust-heroku-testengine APP_BASE=loadtest

$ heroku config:set -a locust-heroku-testengine PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/app/bin

$ heroku config:set -a locust-heroku-testengine SAS_TOKEN="?sv=2019-10-10&ss=bfqt&srt=sco&sp=rwdlacupx&se=2025-05-16T11:41:28Z&st=2020-05-15T03:41:28Z&spr=https&sig=\"

$ heroku config:set -a locust-heroku-testengine TARGET_HOST=https://locust-heroku-target.herokuapp.com/

Через пользовательский интерфейс Heroku

Как я уже упоминал выше в этой статье, вы также можете настроить приложения через пользовательский интерфейс также. Вы можете найти настройки, которые мы применяли под Настройки Вкладка, как показано на следующем скриншоте раздела из Целью саранчи — Героку-цель заявление.

Аналогично, следующий скриншот иллюстрирует настройки, которые мы применяли к приложению Locust-Heroku-Testengine.

Разверните приложения

Из-за существующей интеграции GitHub Heroku развертывает наше приложение всякий раз, когда любые изменения подталкиваются на Мастер ветвь. Нажмите на ваше приложение или изменения в GitHub и дождитесь завершения сборки. Вы можете просматривать журналы сборки под Деятельность вкладка вашего приложения.

Целевое применение API

После развертывания вы можете перейти к Ресурсы Вкладка и просмотр Dyno Hosting приложение. Вы можете масштабировать Dyno из этого пользовательского интерфейса. Нажмите на Открытое приложение Кнопка для запуска приложения.

Загрузочное применение

Если вы перейдите к Лордюр-Эйоку-тестер Приложение, вы обнаружите, что Heroku создал двух рабочие динамики, читая инструкции из Proffile Project Project.

Выполнить тесты

Чтобы выполнить тесты, размещенные в Dynos, мы выкладываем их с помощью Heroku CLI со следующими командами. Они запускают одноразовые динамики, которые затем прекращают сразу после завершения выполнения.

$ heroku run worker_scene_1 --app locust-heroku-testengine

$ heroku run worker_scene_2 --app locust-heroku-testengine

После выполнения Azcopy Utility копирует файлы CSV, содержащие результаты теста для хранения Azure, которые вы можете извлечь с помощью Azure Storage Explorer Отказ Следующее изображение иллюстрирует этот процесс в действии.

Вы можете использовать пользовательский визуализатор или открыть файлы CSV в Excel, чтобы прочитать результаты теста. Следующее изображение представляет часть результата, которую я получил от выполнения Dyex_scene_2 Dyno, который выполняет тест, присутствующий в файле locustfile_scene_2.py.

Результаты, достижения

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

  1. FARUES.CSV Файловые перечислены Общее количество сбоев. В результатах сценария 2, мой пробег произвел 28 ошибок из Получить/багги Конечная точка, которые ожидали, как это так, как мы его запрограммировали.

  2. stats.csv Файл перечисляет конечные точки, к которым тесты отправляют запросы и время отклика в миллисекундах. Мой бег для сценария 2 показывает, что рой отправляется 29 и 28 запросов на Получить/ и Получить/багги конечные точки соответственно. В среднем саранчи получили ответ от двух конечных точек в 149 мс и 78 мс соответственно. Процентное расщепление среднего времени отклика — самые ценные части информации, генерируемой тестами нагрузки. Из моего тестового прогона я вижу, что 99% пользователей моего API получит ответ от Получить/ и Получить/багги конечные точки в 430 мс и 270 мс соответственно.

  3. Третий файл, History.csv похож на stats.csv файл, но получает новую строку на каждые 10 секунд прогона теста. Осмотрите результаты этого файла, вы можете найти, будет ли время отклика вашего API ухудшается как пропуски времени.

Давайте также посмотрим на то, насколько это стоит выполнить эти тесты. Я проводил тесты на два стандарта-1x Dynos, который стоит 25 долларов каждый месяц. Поэтому, если бы я позволил тестам выполнять непрерывно в течение месяца, это будет стоить 50 долларов. Поскольку мои индивидуальные тесты продолжались только две минуты, а Героку за время обработки на второе время, мои понесенные расходы были настолько незначительными, что они даже не появились на мою панель инструментов.

Это здорово, но давайте приблизимся к обвинению, которые тестируют реальное применение, могут нести. Допустим, в среднем API требуется около 10 апартаментов тестов, и, следовательно, 10 Dynos. Если эти тесты проводятся каждую ночь, и каждый запуск длится пять минут, каждый диноточный останутся активным для одного Dyno x 300 секунд х 30 000 секунд; Следовательно, каждый димно будет стоить $ 0,086 каждый месяц. Общая стоимость запуска 10 нагрузочных тестов Dynos (одноквартирный динос) на целый месяц составит около $ 0,87.

Заключение

Теперь вы готовы выполнить нагрузочные тесты на Heroku, используя саранчу. Вы сможете проверить стабильность и производительность каждого развертывания. Поскольку одноквартирный Dynos взимается только на время и ресурсы, которые они потребляют, вы получите максимальное значение с каждые цента, которые вы проводите.

Оригинал: «https://dev.to/heroku/cheapskate-s-journey-to-on-demand-load-tests-on-heroku-with-locust-5g5g»