Skip to content

Deploy a locust master and workers on ACI using Bicep. Load test on AFD APIM AppSvc infra,

Notifications You must be signed in to change notification settings

MassimoC/bicep-aci-locust

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Introduction

Last week thanks to this post of Jean-Paul Smit I discovered Locust, a simple and effective tool to perform load tests.

You can already find different examples of IaC scripts to deploy an AzureContainerInstances-based infrastructure to run Locust. Here some examples.

Scenario and Technologies Link
Headless Locust deployed with az CLI ARM template GitHub
Headless Locust deployed with az CLI ARM with VNET connectivity (via appgw) GitHub
Web UI Locust deployed with Terraform GitHub
Headless Locust deployed with Terraform GitHub

The goal of this exercise is to deploy a Locust WebUI test infrastructure using Bicep.

  • a secondary goal was to not use additional scripts (bicep only) but unfortunately ARM do not provide the functionality to copy a file (the python script) to the file share. The ARM DeploymentStripts is used for that purpose.
  • DeploymentStripts introduces a lot of un-necessary complexity. It's crazy to have to create MSI, ACI and a storage to simply upload a file to a share (the same task is extremely simple in Terraform or using the az cli).

Deployment

  • create a resource group.
  • run the az deployment command to target the bicep orcestrator file (00main.bicep) specifying the following parameters.
    • appId : prefix to name the different artifacts.
    • targetHost : hostname of the loadtest target
    • nrOfWorkers : number of locust workers [default value: 4]
    • environment [default value : dev]
    • randomizeLocation : whether to randomize the locations of the locust workers [default value : true

The locust master and all the support artifacts (storage account, deployment scripts, etc..) are created in the same location of the resource group.

$rgname = 'rg-laodtest'
az group create -n $rgname -l "francecentral"

az deployment group create -f ./00main.bicep -g $rgname 
    -p appId=lts 
    -p targetHost=lnl-webfront-afd.azurefd.net

result of the deployment

result

az cli : stop the workers

$rgname = 'ah-loadtest-with-aci'
$workers_names=(az container list --resource-group $rgname --query "[?contains(@.name, 'worker')].name" --output tsv)
foreach ($aci in $workers_names) {
    Write-Output "stopping the instance $aci"
    az container stop --name $aci --resource-group $rgname
}

Run Load Test

The Locus web interface is available at this URL : http://{appId }-{environment}-locust-master.{location}.azurecontainer.io:8089/ (http://lts-dev-locust-master.francecentral.azurecontainer.io:8089/)

For this exercise, I used Locust to test a AFD APIM APPSVC infrastructure.

  • Azure Front Door (Classic - Global service, WAF enabled)
  • Azure API Management (Premium - France Central - 100% logging to Application Insights)
  • Azure App Service (3x P1V2 - France Central)
  • Locust (8 workers : 'francecentral', 'japaneast', 'eastus2', 'westeurope', 'northeurope', 'westus', 'australiaeast', 'southcentralus')

scenario

3 run has been triggered with 2000, 400 and 800 users.

Northeurope have the better total latency (avg)

The metrics are split by 'Client Country'. 3 workers are in the US.

I was not expecting this latency from AFD

Avg duration per component during the run with 800 users.

APIM cpu (10%) during the run with 800 users

Conclusions

Locust on ACI enables you to create a distributed load test architecture in minutes. I was expecting a lower latency from FrontDoor, the test has been triggered with the WAF enabled using a single GET method. This article should be updated with a APIM AppSvc baseline.

About

Deploy a locust master and workers on ACI using Bicep. Load test on AFD APIM AppSvc infra,

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published