13 — Monitoring (AZ-305)
A. Le cerveau du monitoring : Azure Monitor
Azure Monitor c'est l'umbrella qui collecte 2 types de data :
- Metrics (numériques, time-series, near real-time) → stockées dans Azure Monitor Metrics DB
- Logs (texte/JSON structurés) → stockées dans un Log Analytics Workspace (LAW), interrogeable en KQL
Au-dessus, des "Insights" = dashboards préconfigurés pour un type de ressource (App, VM, Container, Network, Cosmos, KV, Storage). Tous écrivent dans le même LAW si bien designé.
Azure Monitor (umbrella)
│
┌──────────────┬───────┴───────┬──────────────┐
▼ ▼ ▼ ▼
Metrics Logs (LAW) Activity Log Diagnostic
(numeric) (KQL) (control plane) Settings
│ (route resource logs)
│
┌─────────┴──────────┬──────────────┬─────────────┐
▼ ▼ ▼ ▼
App Insights VM Insights Container Ins. Network Ins.
(code app interne) (OS guest VM) (AKS/ACI logs) (NSG/topology)
B. Collecte de data : Diagnostic Settings, DCR, AMA ⭐
B.1 Les 3 voies pour faire arriver de la data dans LAW
| Source | Comment | Outil |
|---|---|---|
| Ressources Azure (PaaS) | Diagnostic Settings activées sur la ressource → route vers LAW / Storage / Event Hub | Diagnostic Settings |
| VMs (Azure / Arc / on-prem) | Agent installé sur l'OS → lit perf counters, events, syslog | Azure Monitor Agent (AMA) + DCR |
| Apps custom | SDK / auto-instr dans le code | Application Insights SDK |
B.2 Diagnostic Settings (pour les ressources Azure)
Sur chaque ressource (KV, SQL, Storage, Front Door, App Gateway…) : Resource > Monitoring > Diagnostic settings > + Add.
3 destinations possibles, multi-sélection OK :
| Destination | Use case | Coût |
|---|---|---|
| LAW ⭐ | Analyser KQL, alertes, intégrer Sentinel | Ingestion + retention |
| Storage Account | Archive long-terme (compliance, immutable WORM) | Pas cher |
| Event Hub | Streaming SIEM externe (Splunk, QRadar) | Throughput unit |
🚨 Diagnostic Settings ≠ Activity Log. Activity Log = control plane (créer/modif/delete), auto-collecté 90j. Pour le router → Diagnostic Setting au niveau subscription.
🚨 Diagnostic Settings — cross-subscription OK : Tu peux envoyer les logs d'une ressource Sub A vers un Log Analytics Workspace dans Sub B (même tenant Entra). Pratique pour centraliser monitoring multi-sub sur un LAW unique. ⚠️ Limite : même région recommandée pour éviter coûts egress + même tenant Entra obligatoire (pas cross-tenant). Pattern ALZ : LAW central dans la sub "Platform-LogAnalytics", toutes les ressources des subs workload pointent dessus.
B.3 DCR (Data Collection Rules) — pierre angulaire AMA ⭐⭐
Une DCR dit à l'AMA (agent sur VM) : quoi collecter, comment le transformer, où l'envoyer.
┌──────────────┐
DCR ───▶ │ Azure Monitor│ ─── stocké en sub, associé via DCRA ───▶ AMA on VM
│ (ARM obj) │ │
└──────────────┘ ▼
collecte et envoie
→ LAW / Metrics / Custom table
À retenir :
- Une DCR peut être associée à plusieurs VMs ; une VM peut avoir plusieurs DCRs (CPU+Syslog dans une, custom logs dans une autre).
- DCR définit : sources (perf counters, events Windows, Syslog, IIS, custom text/JSON), transformations KQL (filtrer/enrichir avant ingestion = économies), destinations.
- Azure Policy peut forcer l'association DCR à toutes les VMs d'un scope → design at scale.
B.4 DCE (Data Collection Endpoint) — awareness 305
DCE = endpoint d'ingestion vers Azure Monitor. Tu en as besoin si :
- Tu veux Private Link sur l'ingestion (VM dans VNet sans accès public Azure).
- Tu utilises Logs Ingestion API (envoyer custom logs depuis n'importe où via REST).
- Tes VMs sont dans une région où le DCR par défaut ne va pas.
🎯 Au 305 : sache juste que si la question parle d'ingestion sans accès internet / Private Link sur AMA → c'est DCE.
C. Log Analytics Workspace (LAW) — design
C.1 Combien de LAW ?
Le pattern recommandé MS : 1 LAW central (ou 1 par région si compliance data residency). Évite la dispersion qui complique les queries cross-resource.
Quand multiplier les LAW :
- Data sovereignty (UE doit rester en UE)
- RBAC strict (équipe sécurité ne voit pas data dev)
- Sentinel séparé (LAW dédié SIEM, table-level RBAC alternative)
C.2 Retention & Archive
| Niveau | Coût | Délai accès |
|---|---|---|
| Interactive | 30j inclus gratuit, jusqu'à 730j payant | Immédiat (KQL normal) |
| Archive | Très bas | Jusqu'à 12 ans, mais nécessite Search Job ou Restore pour requêter |
Question typique 305 : "compliance 7 ans, coût mini" → LAW Archive tier (12 ans max, paie ingest + archive très bas).
C.3 Commitment Tiers (cost design)
Au-delà d'un certain volume (100 GB/jour+), souscrire un Commitment Tier réduit le coût ingest jusqu'à 30%. Pour design "high volume" → mentionner.
D. Application Insights (APM)
D.1 C'est quoi
APM dans Azure Monitor. Voit l'app de l'intérieur (code) : requests, dependencies, exceptions, traces, custom events. Vit dans un LAW (workspace-based, le classic est sunset).
D.2 Quand le recommander
- Toute app prod (App Service, Functions, AKS (pas confondre avec le monitor des nods/pods en eux même), custom on-prem/multicloud — juste connection string + HTTPS).
- Besoin distributed tracing (1 requête traverse N microservices, lequel rame ?).
- Besoin Application Map (auto-discovery deps : DB, Storage, externes).
- Availability tests (URL up + content match depuis N régions).
D.3 Comment l'attacher
| Cible | Méthode |
|---|---|
| App Service / Functions | Auto-instrumentation : Settings > App Insights > Enable (zero code) |
| AKS | Auto-instrumentation Java OU OpenTelemetry SDK |
| Custom (on-prem, AWS…) | Manual SDK + APPLICATIONINSIGHTS_CONNECTION_STRING |
D.4 Cost & sampling
Apps high-traffic = volume LAW énorme → Adaptive sampling (auto) ou Fixed-rate. (On garde qu'un pourcentage des log, soit par detection automatique, soit c'est nous qui choisissons ce pourcentage manuellement, en générale lié au type d'event) Question 305 : "reduce monitoring cost without losing critical errors" → sampling.
E. VM Insights — guest OS perf monitoring
E.1 C'est quoi
Insight prêt-à-l'emploi qui :
- Installe AMA sur la VM (On-prem, Cloud via Extension)
- Crée une DCR prédéfinie (CPU, memory, disk, network counters → table
InsightsMetrics) - Optionnel : installe Dependency Agent → feature Map (processus + connexions network entre VMs)
E.2 Quand le recommander
- "Monitorer le système d'exploitation guest de mes VMs Azure/Arc/hybrid" → VM Insights.
- "Voir qui parle à qui entre VMs (deps process-level)" → VM Insights Map.
- "Performance counters host-level seulement" → suffit du VM host metric (auto, gratuit, pas besoin VM Insights).
E.3 VM host vs VM guest ⭐
| Host (Hyper-V) - la ressource | Guest (OS) - l'intérieur de la machine | |
|---|---|---|
| Data | CPU/disk/network du host | RAM dispo, processes, services |
| Setup | Auto, gratuit | AMA + DCR (ou VM Insights) |
| Use case | "VM under load ?" | "Pourquoi mon app rame dans la VM ?" |
F. Container Insights — AKS / ACI
F.1 C'est quoi
Équivalent VM Insights pour AKS / ACI / Arc-K8s. Container AMA (containerized agent) collecte logs/métriques → LAW.
F.2 Architecture moderne (2024+) ⭐
MS recommande de séparer logs et metrics :
- Logs (stdout/stderr containers, KubeEvents) → Container Insights → LAW (table
ContainerLogV2) - Metrics → Managed Prometheus (Azure Monitor Workspace) → visu via Azure Managed Grafana
- Control plane logs → Diagnostic Settings → LAW
F.3 Quand le recommander
- "Monitor pods AKS" → Container Insights (logs) + Managed Prometheus (metrics).
- "Custom dashboards K8s standards" → Managed Grafana.
- "App métier dans le pod" → App Insights dans le pod (complémentaire, pas remplacement).
🎯 Question 305 typique : AKS prod, vous voulez metrics Kubernetes standards + dashboards Grafana communauté → Azure Monitor managed service for Prometheus + Azure Managed Grafana, pas seulement Container Insights.
H. Workbooks & cross-cutting
Azure Workbooks = canvas Markdown + KQL + paramétres pour bâtir des dashboards composites mixant plusieurs LAW / ressources. Use case 305 : "reporting unifié multi-subscription pour compliance" → Workbook (pas Dashboards classiques).
Différence rapide :
| Outil | Quand |
|---|---|
| Azure Workbooks ⭐ | Reporting riche, paramétrable, intégré au portal, multi-source |
| Azure Dashboards | Tuiles épinglées simples (legacy) |
| Managed Grafana | Dashboards Prometheus/Grafana standards, AKS communauté |
| Power BI | Reporting business, audience non-tech, hors-portail |
I. Activity Log vs Resource Graph vs Diagnostic Settings ⭐⭐
Triple confusion classique au 305 :
| Quoi | Retention native | Use case | |
|---|---|---|---|
| Activity Log | Audit control plane (qui a créé/delete/modifié) | 90j | "Qui a supprimé cette VM hier ?" |
| Resource Graph | Snapshot current state (KQL Resource Graph Explorer) | Live, pas d'historique | "Inventaire toutes mes VMs sans tag Owner" |
| Diagnostic Settings | Route resource logs (data plane) vers LAW/Storage/EH | Selon destination | "Logs détaillés Front Door" |
🚨 Resource Graph ≠ historique. Pour historique de l'inventaire → exporter periodiquement vers LAW. Activity Log retention longue → Diagnostic Setting au niveau subscription vers LAW (ou export Storage).
J. Routing des logs — design patterns 305
Le sous-objectif officiel "Recommend a solution for routing logs" → savoir choisir la destination selon besoin.
┌─ LAW (KQL, alertes, Sentinel)
Resource ─Diag─►├─ Storage (archive long-term, WORM compliance)
└─ Event Hub (SIEM externe Splunk/QRadar, streaming)
Hybrid case : multi-destinations simultanées OK
| Besoin business | Destination |
|---|---|
| KQL + Sentinel SIEM Azure | LAW |
| Compliance HIPAA/PCI/SOX archive 7-12 ans | Storage immutable WORM ou LAW Archive tier |
| Forwarder SIEM externe (Splunk, QRadar, Datadog) | Event Hub |
| Stream temps-réel custom (Functions) | Event Hub |
| Cross-tenant aggregation | Event Hub ou Lighthouse |
🚨 Event Hub doit être MÊME RÉGION que la source. LAW = cross-region OK. Storage = même région recommandée.
K. SQL Audit Logs
K.1 SQL Audit (compliance, forensics)
Active sur SQL Server (server-level ⭐ recommandé) ou SQL DB (db-level, additif). Capture : logins (success/fail), DML (SELECT/INSERT/UPDATE/DELETE), DDL schéma, GRANT/REVOKE, backup.
Destinations (multi-OK) :
| Destination | Use case | Région |
|---|---|---|
| LAW ⭐ | Sentinel, KQL, alertes | Cross-region OK |
| Storage | Archive WORM long-term | Même région recommandée |
| Event Hub | SIEM externe | 🚨 Même région obligatoire |
L. Decision tree monitoring AZ-305 ⭐
Par ressource
Custom app code (perf, traces, exceptions) → Application Insights
Azure VMs (OS guest, processes, deps) → VM Insights + AMA + DCR
Azure VMs (host CPU/disk) → Metrics par défaut (rien à faire)
Azure resources control plane (audit) → Activity Log (+ diag setting sub vers LAW pour retention)
Azure resources data plane (logs, perf) → Diagnostic Settings → LAW
Réseau (troubleshoot, flow) → Network Watcher (+ VNet Flow Logs + Traffic Analytics)
AKS (logs containers) → Container Insights
AKS (métriques K8s/Prometheus) → Managed Prometheus + Managed Grafana
SQL audit/compliance → SQL Audit + Defender for SQL
Inventaire snapshot ("qui a quoi") → Resource Graph
Par besoin business
"Compliance 7 ans archive logs" → LAW Archive tier OU Storage immutable WORM
"SIEM externe (Splunk)" → Event Hub (même région que source)
"Sentinel comme SIEM" → LAW central + connector
"Reporting unifié multi-source/sub" → Workbooks (Workbook = canvas riche, pas Dashboard)
"App lente, où ?" → App Insights Application Map + Performance
"Combien d'users actifs ?" → App Insights Custom Events + Funnel
"Trace requête microservices" → App Insights distributed tracing
"VM connectivité KO, NSG ?" → Network Watcher IP Flow Verify
"Monitoring continu latence VM → DB" → Network Watcher Connection Monitor
"VPN ne fonctionne pas" → Network Watcher VPN Troubleshoot
"Quelqu'un attaque ma DB" → Defender for SQL (ATP)
"Audit qui a supprimé le RG ?" → Activity Log (90j) ou archive LAW
"Inventaire toutes VMs sans tag X" → Resource Graph (Resource Graph Explorer)
M. Pattern monitoring complet AZ-305 (carte récap)
┌──────────────────────────────────────────────┐
│ LAW central (KQL hub) │
└──┬────────┬────────┬─────────┬───────────────┘
▲ ▲ ▲ ▲
App Service ──► AppInsights Diag Activity AMA+DCR
Functions ──► AppInsights Settings Log │
AKS ──► Container Insights (sub) │
│ │
Azure SQL ──► Audit ─────────►│ VM Insights
Defender for SQL (VMs)
│
VNet ──► Network Watcher ──► VNet Flow Logs ──────► │
Traffic Analytics │
▼
Action Groups (email/SMS/Logic App/Func/ITSM)
Workbooks (dashboards)
Sentinel rules + SOAR automation
LAW Archive (12 ans compliance)
DEMO
Portail — App Insights workspace-based + App Service
Étape 1 — Créer App Insights workspace-based
Create a resource > Application Insights- Basics :
- Name
appi-myapp-prod - Region = même que App Service
- Resource Mode : Workspace-based ⭐ (sinon Classic legacy)
- Name
- LAW : sélectionner existant OU Create new (
law-monitoring-central) - Review + Create
Étape 2 — Lier à l'App Service (auto-instrumentation)
App Service > Settings > Application Insights- Toggle Application Insights : Enable
- Change your resource →
appi-myapp-prod(créée étape 1) OU Create new - Runtime collection level : Recommended
- Activer Profiler : On + Snapshot Debugger : On
- Apply → confirmer pop-up restart App Service (~1 min)
- View Application Insights data
Étape 3 — Vérifier types de logs collectées
- Générer trafic (ouvrir URL Web App, recharger)
App Insights > Investigate:- Application Map → graph deps auto-découvert
- Live Metrics → stream temps réel 1s
- Failures → exceptions + failed requests
- Performance → top operations lentes P50/P95/P99
- Availability → tests Standard
- Transaction search → operation_Id détaillé
Monitoring > Logs→ KQL :requests | take 10 dependencies | take 10 exceptions | take 10 traces | take 10 customEvents | take 10
SDK manual (Node.js)
const appInsights = require('applicationinsights');
appInsights.setup(process.env.APPLICATIONINSIGHTS_CONNECTION_STRING)
.setAutoCollectExceptions(true)
.setAutoCollectDependencies(true)
.setAutoCollectRequests(true)
.setSendLiveMetrics(true)
.start();
// Custom event
appInsights.defaultClient.trackEvent({
name: 'OrderPlaced',
properties: { orderId: '123', amount: 99.99 }
});
// Custom metric
appInsights.defaultClient.trackMetric({ name: 'QueueLength', value: 42 });
Availability Test (Standard)
- App Insights > Investigate > Availability > + Add Standard test
- Name
myapp-health, URLhttps://myapp.com/health - Frequency 5 min, locations 5+ régions (best practice anti false positive)
- HTTP method GET, SSL validation : ON (alerte X jours avant expiration)
- Content match
"status":"ok" - Alerts : severity, action group, failed if 3/5 locations échouent
- Create
Portail — SQL Auditing
2 niveaux : Server-level ⭐ (toutes DBs du serveur) OU Database-level (DB spécifique, additif).
Server-level (recommandé)
SQL Server > Security > Auditing- Toggle Enable Azure SQL Auditing : On
- Cocher destinations (multi-select OK) :
- Storage : Storage Account + Storage authentication : Managed Identity + Retention Days (ex 365 / 2555)
- Log Analytics ⭐ : LAW (région différente OK)
- Event Hub : namespace + Event Hub instance (🚨 même région que DB)
- Save
Database-level (alternative ou additif)
SQL Database > Security > Auditing- Toggle Enable : On → mêmes options destinations
- Save
Tester
SQLSecurityAuditEvents
| where TimeGenerated > ago(1h)
| project TimeGenerated, server_principal_name_s, action_name_s, statement_s, succeeded_s
| order by TimeGenerated desc
Portail — Defender for SQL
SQL Server > Security section > Defender for Cloud(menu raccourci, page titre = "Microsoft Defender for Cloud")- Cliquer Enable Microsoft Defender for SQL (active ATP + VA)
- Configure :
- Vulnerability Assessment : Storage Account OU Express configuration (sans storage)
- Periodic recurring scans : ON (hebdo)
- Send scan reports to :
[email protected] - Email admins/sub owners : ON
- ATP types : laisser All (SQL injection, anomalous, brute force, exfil)
- Save
- Vérifier :
Microsoft Defender for Cloud > Security alerts
Subscription-level (couvre toutes DBs futures) :
Defender for Cloud > Environment settings > <sub> > Defender plans > Databases : ON.