AZURE_OPENAI_ENDPOINT, DEPLOYMENT_ID, and API_KEY correctly referenced.localhost:3978.docker build -t <image> ..containerapp-params.json.az bicep build.AppContainerAppConsoleLogs_CL \\ | where ContainerAppName_s == "<your-container-app-name>"\\ | sort by TimeGenerated desc
AppContainerAppConsoleLogs_CL | where Log_s contains "500" | summarize Count = count() by bin(TimeGenerated, 5m)
param containerAppResourceId string
param logAnalyticsWorkspaceId string
param actionGroupId string
@description('Create CPU High Usage Alert')
resource cpuAlert 'Microsoft.Insights/metricAlerts@2018-03-01' = {
name: 'cpu-high-usage'
location: 'global'
properties: {
description: 'Alert when CPU usage exceeds 80%'
severity: 3
enabled: true
scopes: [containerAppResourceId]
evaluationFrequency: 'PT1M'
windowSize: 'PT5M'
criteria: {
allOf: [
{
metricName: 'cpuUsagePercentage'
metricNamespace: 'Microsoft.App/containerApps'
operator: 'GreaterThan'
threshold: 80
timeAggregation: 'Average'
}
]
}
actions: [
{
actionGroupId: actionGroupId
}
]
}
}
@description('Create Memory High Usage Alert')
resource memoryAlert 'Microsoft.Insights/metricAlerts@2018-03-01' = {
name: 'memory-high-usage'
location: 'global'
properties: {
description: 'Alert when memory usage exceeds 75%'
severity: 3
enabled: true
scopes: [containerAppResourceId]
evaluationFrequency: 'PT1M'
windowSize: 'PT5M'
criteria: {
allOf: [
{
metricName: 'memoryWorkingSetBytes'
metricNamespace: 'Microsoft.App/containerApps'
operator: 'GreaterThan'
threshold: 75
timeAggregation: 'Average'
}
]
}
actions: [
{
actionGroupId: actionGroupId
}
]
}
}
AppContainerAppConsoleLogs_CL | where Log_s contains "500" | summarize Count=count() by bin(TimeGenerated, 5m) | where Count > 0
param logAnalyticsWorkspaceId string
param actionGroupId string
@description('Create HTTP 500 Error Log Alert')
resource errorLogAlert 'Microsoft.Insights/scheduledQueryRules@2021-08-01' = {
name: 'http-500-error-alert'
location: 'global'
properties: {
description: 'Alert when HTTP 500 errors are detected in logs'
enabled: true
source: {
query: '''
AppContainerAppConsoleLogs_CL
| where Log_s contains "500"
| summarize Count=count() by bin(TimeGenerated, 5m)
| where Count > 0
'''
dataSourceId: logAnalyticsWorkspaceId
queryType: 'ResultCount'
}
schedule: {
frequencyInMinutes: 5
timeWindowInMinutes: 5
}
action: {
severity: 3
trigger: {
thresholdOperator: 'GreaterThan'
threshold: 0
}
actions: [
{
actionGroupId: actionGroupId
}
]
}
}
}
az deployment group create \
--resource-group MyResourceGroup \
--template-file log-alert.bicep \
--parameters \
logAnalyticsWorkspaceId="/subscriptions/<sub-id>/resourceGroups/<rg>/providers/Microsoft.OperationalInsights/workspaces/<workspace-name>" \
actionGroupId="/subscriptions/<sub-id>/resourceGroups/<rg>/providers/Microsoft.Insights/actionGroups/NotifyTeam"
Complete Bicep Bundle
param containerAppResourceId string
param logAnalyticsWorkspaceId string
param actionGroupId string
// CPU High Usage Alert
resource cpuAlert 'Microsoft.Insights/metricAlerts@2018-03-01' = {
name: 'cpu-high-usage'
location: 'global'
properties: {
description: 'Alert when CPU usage exceeds 80%'
severity: 3
enabled: true
scopes: [containerAppResourceId]
evaluationFrequency: 'PT1M'
windowSize: 'PT5M'
criteria: {
allOf: [
{
metricName: 'cpuUsagePercentage'
metricNamespace: 'Microsoft.App/containerApps'
operator: 'GreaterThan'
threshold: 80
timeAggregation: 'Average'
}
]
}
actions: [
{
actionGroupId: actionGroupId
}
]
}
}
// Memory High Usage Alert
resource memoryAlert 'Microsoft.Insights/metricAlerts@2018-03-01' = {
name: 'memory-high-usage'
location: 'global'
properties: {
description: 'Alert when memory usage exceeds 75%'
severity: 3
enabled: true
scopes: [containerAppResourceId]
evaluationFrequency: 'PT1M'
windowSize: 'PT5M'
criteria: {
allOf: [
{
metricName: 'memoryWorkingSetBytes'
metricNamespace: 'Microsoft.App/containerApps'
operator: 'GreaterThan'
threshold: 75
timeAggregation: 'Average'
}
]
}
actions: [
{
actionGroupId: actionGroupId
}
]
}
}
// HTTP 500 Log Alert
resource errorLogAlert 'Microsoft.Insights/scheduledQueryRules@2021-08-01' = {
name: 'http-500-error-alert'
location: 'global'
properties: {
description: 'Alert when HTTP 500 errors are detected in logs'
enabled: true
source: {
query: '''
AppContainerAppConsoleLogs_CL
| where Log_s contains "500"
| summarize Count=count() by bin(TimeGenerated, 5m)
| where Count > 0
'''
dataSourceId: logAnalyticsWorkspaceId
queryType: 'ResultCount'
}
schedule: {
frequencyInMinutes: 5
timeWindowInMinutes: 5
}
action: {
severity: 3
trigger: {
thresholdOperator: 'GreaterThan'
threshold: 0
}
actions: [
{
actionGroupId: actionGroupId
}
]
}
}
}
Deployment Command Example
az deployment group create \
--resource-group MyResourceGroup \
--template-file complete-alerts.bicep \
--parameters \
containerAppResourceId="/subscriptions/<sub-id>/resourceGroups/<rg>/providers/Microsoft.App/containerApps/<app-name>" \
logAnalyticsWorkspaceId="/subscriptions/<sub-id>/resourceGroups/<rg>/providers/Microsoft.OperationalInsights/workspaces/<workspace-name>" \
actionGroupId="/subscriptions/<sub-id>/resourceGroups/<rg>/providers/Microsoft.Insights/actionGroups/NotifyTeam"