Pular para o conteúdo principal

Desafio 07: Monitorar Recursos do Azure AI

Tempo Estimado

45-60 min | Custo: ~$0.50 (ingestão do Log Analytics) | Domínio: Planejar e Gerenciar Soluções de IA (20-25%)

Habilidades do exame cobertas

  • Monitorar um recurso do Azure AI
  • Configurar definições de diagnóstico para Azure AI Services
  • Consultar métricas e logs usando Azure Monitor e KQL

Visão Geral

Monitorar recursos do Azure AI é essencial para manter a confiabilidade, rastrear padrões de uso e detectar problemas antes que impactem os usuários. O Azure Monitor fornece uma plataforma unificada para coletar métricas, logs e rastreamentos de serviços de IA, incluindo latência, contagem de requisições, taxas de erro e consumo de tokens.

Neste desafio, você vai configurar definições de diagnóstico para rotear logs e métricas para um workspace do Log Analytics, escrever consultas KQL para analisar o comportamento do serviço e configurar regras de alerta para limites críticos. Você vai trabalhar com métricas-chave como TotalCalls, TotalErrors, Latency e TokenTransaction.

Entender o pipeline de monitoramento — desde as definições de diagnóstico, passando pelo Log Analytics até os alertas — é uma habilidade essencial para gerenciar implantações de IA em produção em escala.

Arquitetura

As definições de diagnóstico roteiam métricas e logs dos Azure AI Services para o Log Analytics, permitindo consultas KQL e regras de alerta.

Challenge 07 topology

Pré-requisitos

  • Assinatura Azure com um recurso Azure AI Services
  • Workspace do Log Analytics (ou será criado um)
  • Azure CLI instalado
  • Role de Contributor no grupo de recursos

Implementação

Tarefa 1: Criar Workspace do Log Analytics e Habilitar Definições de Diagnóstico

from azure.identity import DefaultAzureCredential
from azure.mgmt.loganalytics import LogAnalyticsManagementClient
from azure.mgmt.monitor import MonitorManagementClient
from azure.mgmt.monitor.models import (
DiagnosticSettingsResource,
LogSettings,
MetricSettings,
RetentionPolicy
)

credential = DefaultAzureCredential()
subscription_id = "<your-subscription-id>"
resource_group = "rg-ai102-challenge07"

# Create Log Analytics workspace
la_client = LogAnalyticsManagementClient(credential, subscription_id)
workspace = la_client.workspaces.begin_create_or_update(
resource_group_name=resource_group,
workspace_name="law-ai102-monitor",
parameters={
"location": "eastus",
"properties": {
"sku": {"name": "PerGB2018"},
"retention_in_days": 30
}
}
).result()
print(f"Workspace created: {workspace.id}")

# Enable diagnostic settings on AI services resource
monitor_client = MonitorManagementClient(credential, subscription_id)
ai_resource_id = (
f"/subscriptions/{subscription_id}/resourceGroups/{resource_group}"
f"/providers/Microsoft.CognitiveServices/accounts/ai-monitor-demo"
)

diagnostic_settings = monitor_client.diagnostic_settings.create_or_update(
resource_uri=ai_resource_id,
name="ai-diagnostics",
parameters=DiagnosticSettingsResource(
workspace_id=workspace.id,
logs=[
LogSettings(
category="Audit",
enabled=True,
retention_policy=RetentionPolicy(enabled=True, days=30)
),
LogSettings(
category="RequestResponse",
enabled=True,
retention_policy=RetentionPolicy(enabled=True, days=30)
)
],
metrics=[
MetricSettings(
category="AllMetrics",
enabled=True,
retention_policy=RetentionPolicy(enabled=True, days=30)
)
]
)
)
print(f"Diagnostic settings created: {diagnostic_settings.name}")

Tarefa 2: Consultar Métricas via Azure Monitor REST API

from azure.identity import DefaultAzureCredential
from azure.mgmt.monitor import MonitorManagementClient
from datetime import datetime, timedelta

credential = DefaultAzureCredential()
subscription_id = "<your-subscription-id>"
monitor_client = MonitorManagementClient(credential, subscription_id)

resource_id = (
f"/subscriptions/{subscription_id}/resourceGroups/rg-ai102-challenge07"
f"/providers/Microsoft.CognitiveServices/accounts/ai-monitor-demo"
)

# Query TotalCalls metric for the last 24 hours
end_time = datetime.utcnow()
start_time = end_time - timedelta(hours=24)
timespan = f"{start_time.isoformat()}Z/{end_time.isoformat()}Z"

# Get total calls
metrics_response = monitor_client.metrics.list(
resource_uri=resource_id,
timespan=timespan,
interval="PT1H",
metricnames="TotalCalls,TotalErrors,Latency,TokenTransaction",
aggregation="Total,Average"
)

for metric in metrics_response.value:
print(f"\n=== {metric.name.value} ===")
for timeseries in metric.timeseries:
for data_point in timeseries.data:
if data_point.total is not None:
print(f" {data_point.time_stamp}: Total={data_point.total}")
if data_point.average is not None:
print(f" {data_point.time_stamp}: Avg={data_point.average:.2f}ms")

Tarefa 3: Escrever Consultas KQL para Logs do Azure AI Service

from azure.identity import DefaultAzureCredential
from azure.monitor.query import LogsQueryClient
from datetime import timedelta

credential = DefaultAzureCredential()
logs_client = LogsQueryClient(credential)

workspace_id = "<your-workspace-id>"

# KQL: Top operations by count and average duration
kql_operations = """
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.COGNITIVESERVICES"
| where TimeGenerated > ago(24h)
| summarize
RequestCount = count(),
AvgDuration = avg(DurationMs),
P95Duration = percentile(DurationMs, 95),
ErrorCount = countif(ResultType == "Failed")
by OperationName
| sort by RequestCount desc
"""

response = logs_client.query_workspace(
workspace_id=workspace_id,
query=kql_operations,
timespan=timedelta(days=1)
)

print("=== Operations Summary ===")
for row in response.tables[0].rows:
print(f" {row[0]}: {row[1]} calls, Avg: {row[2]:.0f}ms, P95: {row[3]:.0f}ms, Errors: {row[4]}")

# KQL: Error analysis
kql_errors = """
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.COGNITIVESERVICES"
| where ResultType == "Failed"
| where TimeGenerated > ago(24h)
| summarize ErrorCount = count() by ResultSignature, OperationName
| sort by ErrorCount desc
| take 10
"""

error_response = logs_client.query_workspace(
workspace_id=workspace_id,
query=kql_errors,
timespan=timedelta(days=1)
)

print("\n=== Error Analysis ===")
for row in error_response.tables[0].rows:
print(f" {row[1]} - {row[0]}: {row[2]} errors")

# KQL: Token usage over time (for Azure OpenAI)
kql_tokens = """
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.COGNITIVESERVICES"
| where Category == "RequestResponse"
| where TimeGenerated > ago(24h)
| extend promptTokens = toint(properties_s.promptTokens)
| extend completionTokens = toint(properties_s.completionTokens)
| summarize
TotalPromptTokens = sum(promptTokens),
TotalCompletionTokens = sum(completionTokens),
TotalTokens = sum(promptTokens) + sum(completionTokens)
by bin(TimeGenerated, 1h)
| sort by TimeGenerated asc
"""

token_response = logs_client.query_workspace(
workspace_id=workspace_id,
query=kql_tokens,
timespan=timedelta(days=1)
)

print("\n=== Token Usage (Hourly) ===")
for row in token_response.tables[0].rows:
print(f" {row[0]}: Prompt={row[1]}, Completion={row[2]}, Total={row[3]}")

Tarefa 4: Criar Regra de Alerta para Alta Latência

from azure.identity import DefaultAzureCredential
from azure.mgmt.monitor import MonitorManagementClient
from azure.mgmt.monitor.models import (
MetricAlertResource,
MetricAlertSingleResourceMultipleMetricCriteria,
MetricCriteria,
MetricAlertAction
)

credential = DefaultAzureCredential()
subscription_id = "<your-subscription-id>"
monitor_client = MonitorManagementClient(credential, subscription_id)

resource_id = (
f"/subscriptions/{subscription_id}/resourceGroups/rg-ai102-challenge07"
f"/providers/Microsoft.CognitiveServices/accounts/ai-monitor-demo"
)

# Create metric alert for high latency (> 2000ms average)
alert = monitor_client.metric_alerts.create_or_update(
resource_group_name="rg-ai102-challenge07",
rule_name="high-latency-alert",
parameters=MetricAlertResource(
location="global",
description="Alert when average latency exceeds 2000ms",
severity=2,
enabled=True,
scopes=[resource_id],
evaluation_frequency="PT5M",
window_size="PT15M",
criteria=MetricAlertSingleResourceMultipleMetricCriteria(
all_of=[
MetricCriteria(
name="HighLatency",
metric_name="Latency",
metric_namespace="Microsoft.CognitiveServices/accounts",
operator="GreaterThan",
threshold=2000,
time_aggregation="Average"
)
]
),
actions=[
MetricAlertAction(
action_group_id=(
f"/subscriptions/{subscription_id}/resourceGroups/rg-ai102-challenge07"
f"/providers/Microsoft.Insights/actionGroups/ai-ops-team"
)
)
]
)
)
print(f"Alert rule created: {alert.name}")

# Create alert for high error rate (> 5% of total calls)
error_alert = monitor_client.metric_alerts.create_or_update(
resource_group_name="rg-ai102-challenge07",
rule_name="high-error-rate-alert",
parameters=MetricAlertResource(
location="global",
description="Alert when error rate exceeds 5%",
severity=1,
enabled=True,
scopes=[resource_id],
evaluation_frequency="PT5M",
window_size="PT5M",
criteria=MetricAlertSingleResourceMultipleMetricCriteria(
all_of=[
MetricCriteria(
name="HighErrors",
metric_name="TotalErrors",
metric_namespace="Microsoft.CognitiveServices/accounts",
operator="GreaterThan",
threshold=10,
time_aggregation="Total"
)
]
),
actions=[]
)
)
print(f"Error alert created: {error_alert.name}")

Saída Esperada

=== Operations Summary ===
TextAnalytics.Analyze: 1247 calls, Avg: 342ms, P95: 890ms, Errors: 3
OpenAI.ChatCompletions: 856 calls, Avg: 1205ms, P95: 3400ms, Errors: 12
TextAnalytics.DetectLanguage: 432 calls, Avg: 156ms, P95: 340ms, Errors: 0

=== Error Analysis ===
OpenAI.ChatCompletions - 429: 8 errors
OpenAI.ChatCompletions - 500: 4 errors
TextAnalytics.Analyze - 400: 3 errors

=== Alert Rules ===
Name Severity Enabled Condition
high-latency-alert 2 True avg Latency > 2000
high-error-rate-alert 1 True total TotalErrors > 10
token-spike-alert 3 True total TokenTransaction > 100000

Quebra & conserta

CenárioSintomaCausa RaizCorreção
Nenhum log aparecendo no Log AnalyticsConsultas KQL retornam resultados vaziosDefinições de diagnóstico não habilitadas ou recentes (atraso de ingestão de 5-15 min)Verifique se as definições de diagnóstico existem; aguarde o atraso de ingestão
Alerta de métrica nunca disparaNenhuma notificação de alerta apesar da alta latênciaNamespace de métrica ou tipo de agregação incorretoVerifique o namespace Microsoft.CognitiveServices/accounts e a agregação correta
Erro "No access" na consulta do Log Analytics403 ao consultar o workspaceRole Log Analytics Reader ausente no workspaceAtribua a role Log Analytics Reader à identidade que está consultando
Dados de métricas incompletosAlgumas métricas mostram lacunasO SKU do recurso não emite todas as métricasVerifique o tier S0; o tier gratuito tem emissão limitada de métricas
Alerta dispara com muita frequênciaRuído/fadiga de alertasTamanho da janela muito pequeno ou limite muito baixoAumente o window-size ou ajuste o limite para reduzir falsos positivos

Verificação de Conhecimento

1. Qual métrica do Azure Monitor rastreia o número total de tokens processados por um recurso Azure OpenAI?

2. Qual é o atraso típico de ingestão para logs aparecerem em um workspace do Log Analytics após as definições de diagnóstico serem habilitadas?

3. Qual tabela KQL contém logs de diagnóstico dos recursos Azure Cognitive Services?

4. Ao criar uma regra de alerta de métrica, o que o parâmetro 'window size' controla?

5. Qual categoria de log deve ser habilitada nas definições de diagnóstico para capturar detalhes de requisição e resposta da API para Azure AI Services?

Limpeza

az group delete --name rg-ai102-challenge07 --yes --no-wait

Saiba Mais