Skip to content

Hands-on Labs

Bicep-based reproduction environments for each troubleshooting scenario. Deploy to your Azure subscription, trigger the symptom, observe signals, then clean up.

graph TD
    A[Hands-on Labs] --> B[Performance]
    A --> C[Startup or Availability]
    A --> D[Outbound or Network]
    B --> E[Memory Pressure]
    B --> F[Intermittent 5xx]
    B --> G[No Space Left on Device]
    B --> H[Slow Start / Cold Start]
    B --> O[Windows Java Timeout]
    C --> I[Container HTTP Pings]
    C --> J[Deployment Ok Startup Failed]
    C --> K[Failed to Forward Request]
    C --> L[Slot Swap Config Drift]
    C --> P[Missing wwwroot Content]
    C --> Q[ZIP Deploy File Lock]
    D --> M[SNAT Exhaustion]
    D --> N[DNS Resolution VNet]

How Labs Work

Each lab includes:

  1. main.bicep — Infrastructure template (App Service Plan, App Service instance for the lab's target runtime, Log Analytics, Diagnostic Settings)
  2. app/ — Application code (Python/Flask, Node.js, Java, or .NET depending on the lab) designed to reproduce a specific symptom
  3. trigger.sh — Script to trigger the symptom
  4. verify.sh — Script to query Log Analytics and confirm expected signals appeared
  5. Documentation page — Step-by-step walkthrough with KQL queries and expected observations

Available Labs

Performance

Lab Symptom Related Playbook
Memory Pressure Rising memory, worker timeouts, container restarts Memory Pressure & Worker Degradation
Intermittent 5xx Under Load Sporadic 5xx responses during traffic spikes Intermittent 5xx Under Load
No Space Left on Device Disk full errors from /home or /tmp exhaustion No Space Left on Device
Slow Start / Cold Start First request slow after deploy or idle Slow Start / Cold Start vs Regression
Windows Java httpPlatformHandler Timeout 500.121.64 timeout signature under loopback saturation on Windows App Service Java SE No dedicated playbook — see Windows httpPlatformHandler KQL Pack

Startup / Availability

Lab Symptom Related Playbook
Container Didn't Respond to HTTP Pings Container fails to start — no HTTP response on expected port Container Didn't Respond to HTTP Pings
Deployment Succeeded but Startup Failed Deploy green but app down — wrong startup command Deployment Succeeded but Startup Failed
Failed to Forward Request Platform proxy can't reach app — wrong bind address Failed to Forward Request
Slot Swap Config Drift Swap succeeds but production restarts or config breaks Slot Swap Config Drift / Restart Race
Missing wwwroot Content Asset absent from wwwroot and 404; synthetic removal timeline and Run From Package mount Missing wwwroot Files and HTTP 404
ZIP Deploy File Lock, Run From Package, and Serialization Green ZIP deployment leaves a locked file stale on Windows; overlapping deployment is rejected Deployment Failures

Outbound / Network

Lab Symptom Related Playbook
SNAT Exhaustion Outbound connection failures from SNAT port exhaustion SNAT or Application Issue?
DNS Resolution (VNet) DNS resolution failure for private endpoints in VNet-integrated apps DNS Resolution (VNet)
Private Endpoint Route Fault Private endpoint calls time out while DNS resolves correctly Private Endpoint / Custom DNS / Route Confusion

Identity & Deployment

Lab Symptom Related Playbook
CD Reconnect RBAC Conflict RoleAssignmentExists on Deployment Center reconnect for container CD with managed-identity ACR pulls CD RBAC Role Assignment Conflict

Prerequisites

All labs require:

  • Azure subscription with Contributor access
  • Azure CLI installed and logged in (az login)
  • Bash shell (Linux, macOS, or WSL)

General Workflow

# 1. Create resource group
az group create --name rg-lab-<name> --location koreacentral

# 2. Deploy infrastructure
az deployment group create \
  --resource-group rg-lab-<name> \
  --template-file labs/<name>/main.bicep \
  --parameters baseName=lab<short>

# 3. Deploy app code (zip deploy or local git)
# 4. Run trigger script
# 5. Wait 2-5 minutes for logs to appear
# 6. Run verify script or query Log Analytics manually

# 7. Clean up
az group delete --name rg-lab-<name> --yes --no-wait
Command Purpose
az group create --name rg-lab-<name> --location koreacentral Creates the resource group that will contain the lab deployment.
--name rg-lab-<name> --location koreacentral Sets the resource group name for the lab run.
--location koreacentral Places the resource group in Korea Central.
az deployment group create --resource-group rg-lab-<name> --template-file labs/<name>/main.bicep --parameters baseName=lab<short> Deploys the selected lab's infrastructure from its resource-group Bicep template.
--resource-group rg-lab-<name> --template-file labs/<name>/main.bicep --parameters baseName=lab<short> Runs the deployment in the lab resource group.
--template-file labs/<name>/main.bicep --parameters baseName=lab<short> Uses the selected lab's main.bicep template.
--parameters baseName=lab<short> Sets the template's baseName parameter for resource naming.
az group delete --name rg-lab-<name> --yes --no-wait Starts deleting the lab resource group during cleanup.
--name rg-lab-<name> --yes --no-wait Targets the lab resource group for deletion.
--yes --no-wait Skips the confirmation prompt and returns immediately.

Cost

Each lab deploys a B1 App Service Plan. Delete the resource group after completing the lab to avoid ongoing charges.

See Also

Sources