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:
- main.bicep — Infrastructure template (App Service Plan, App Service instance for the lab's target runtime, Log Analytics, Diagnostic Settings)
- app/ — Application code (Python/Flask, Node.js, Java, or .NET depending on the lab) designed to reproduce a specific symptom
- trigger.sh — Script to trigger the symptom
- verify.sh — Script to query Log Analytics and confirm expected signals appeared
- 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.