Domain 5 · 5–10%

Implement an instrumentation strategy

The smallest domain, and the cheapest to earn marks on: knowing which Azure Monitor feature collects which signal, how to alert on it, how a request is traced across services, and enough KQL to read the data.

Two objectives:

The July 2026 refresh flagged both Domain 5 objectives as minor updates — expect a little more GitHub-side monitoring and the current Azure Monitor naming.

5.1 Configure monitoring for a DevOps environment

Azure Monitor — the platform

Azure Monitor is the single pane through which all telemetry flows. Everything else in this domain is a feature of it.

flowchart LR subgraph SRC[Sources] APP[Applications] INF[VMs / containers] AZ[Azure resources] ADO[Azure DevOps] GH[GitHub] end subgraph STORE[Data stores] MET[(Metrics
time-series)] LOG[(Logs
Log Analytics)] end SRC --> MET SRC --> LOG MET --> OUT LOG --> OUT subgraph OUT[Consume] DASH[Dashboards / Workbooks] AL[Alerts + action groups] KQL[KQL queries] PBI[Power BI / Grafana] end
Two pillars — Metrics (numeric time-series) and Logs (Log Analytics) — feed dashboards, alerts and KQL.
Data typeStored inQueried withExamples
MetricsAzure Monitor Metrics (time-series DB)Metrics explorerCPU %, request count, response time
LogsLog Analytics workspaceKQLApp logs, audit events, traces
TracesApplication Insights (in Log Analytics)KQL / transaction viewDistributed request spans
ChangesChange AnalysisPortalResource/config change history

Caveat — metrics vs logs

Metrics are lightweight, pre-aggregated numeric time-series — cheap, fast, near-real-time, ideal for alerting and dashboards. Logs are rich, structured/unstructured records in Log Analytics you query with KQL — flexible but higher latency and cost. "Alert when CPU > 80% for 5 minutes" is a metric alert; "find every request that returned 500 in the last hour" is a log query.

Agents — use the Azure Monitor Agent

The Azure Monitor Agent (AMA) is the current agent for VMs and Arc servers, configured via Data Collection Rules (DCRs). The Log Analytics agent (MMA) is retired — if it appears as an answer for a new deployment, it is wrong.

Application Insights (APM)

CapabilityAnswers
Live MetricsWhat's happening right now (sub-second)?
Application MapHow do my services connect, and where's the slow/failing hop?
FailuresWhich requests/exceptions are failing and why?
PerformanceWhich operations and dependencies are slowest?
Availability testsIs the app reachable from around the world?
Usage (users, sessions, funnels)How are people actually using it?
Smart DetectionHas something anomalous started happening automatically?
Distributed tracingWhat was the end-to-end path of this one request?
Instrumentation approachHow
Auto-instrumentation (codeless)Enable in the App Service / Functions / AKS portal — no code change; .NET, Java, Node, Python (varies)
SDK / OpenTelemetry (code-based)Add the Azure Monitor OpenTelemetry distro for custom events, metrics and full control
C# connect + custom telemetry
// Modern approach: Azure Monitor OpenTelemetry distro
builder.Services.AddOpenTelemetry().UseAzureMonitor(o =>
    o.ConnectionString = builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]);

// Custom signals
_telemetryClient.TrackEvent("OrderPlaced",
    new Dictionary<string,string> { ["orderId"] = order.Id },
    new Dictionary<string,double> { ["orderValue"] = order.Total });
_telemetryClient.TrackMetric("ActiveUsers", userCount);
try { /* ... */ }
catch (Exception ex) { _telemetryClient.TrackException(ex); throw; }

Caveat — connection string, not instrumentation key

Application Insights now uses a connection string (which embeds the key and the regional endpoints). The bare instrumentation key is deprecated — an answer that configures only an instrumentation key is dated. For "enable monitoring with no code change", the answer is auto-instrumentation on the App Service.

The Insights family

InsightMonitorsKey signals
Application InsightsApplications (APM)Requests, dependencies, exceptions, traces
VM InsightsVMs & scale setsCPU, memory, disk, network, process & connection map
Container InsightsAKS & Container InstancesNode/pod/container CPU & memory, restarts, K8s events
Storage InsightsStorage accountsTransactions, availability, latency, capacity (agentless)
Network InsightsNetwork resourcesTopology, traffic, connectivity (Network Watcher, Connection Monitor)
azure cli enable Container Insights on AKS
az aks enable-addons \
  --resource-group myRG --name myAKS \
  --addons monitoring \
  --workspace-resource-id "$LOG_ANALYTICS_WORKSPACE_ID"

Caveat — pick the Insight by resource type

These are almost pure recognition questions: AKS podsContainer Insights; VM CPU/memoryVM Insights; custom app events / dependency latencyApplication Insights; storage account transactionsStorage Insights; network topology/connectivityNetwork Insights.

Monitoring in GitHub

Creating and configuring charts

The skills measured call out "enabling insights and creating and configuring charts" — that's GitHub Projects → Insights, where you add a chart, choose the metric (e.g. items completed over time), filter, and group. Enabling the dependency graph is the prerequisite for Dependabot (see Domain 4).

Alerts for GitHub Actions and Azure Pipelines

SignalMechanism
Azure Pipelines run failedNotifications (Project Settings) or Service hooks → Teams/Slack, filtered to failures
GitHub Actions run failedif: failure() step posting to Teams/Slack; watch/notification settings
Azure resource metric crossed a thresholdAzure Monitor metric alert → action group
A log condition occurredAzure Monitor log (scheduled query) alert
Auto-remediationAction group webhook → Azure DevOps REST API to trigger a pipeline
azure cli metric alert + action group
az monitor metrics alert create \
  --name "High CPU" --resource-group myRG \
  --scopes "$VM_ID" \
  --condition "avg Percentage CPU > 80" \
  --window-size 5m --evaluation-frequency 1m \
  --action "$ACTION_GROUP_ID" \
  --description "CPU over 80% for 5 minutes"

Action groups are the fan-out

An action group is a reusable set of notification and action targets — email/SMS/push, webhook, Logic App, Azure Function, ITSM, runbook. One alert points at an action group so the same response (notify + auto-remediate) is reused across many alerts. Wiring a webhook to the Azure DevOps REST API is how "an alert triggers a remediation pipeline".

5.2 Analyze metrics from instrumentation

Infrastructure performance indicators

IndicatorWatch whenUsually means
CPU %> 80% sustainedScale up/out
Memory %> 85% sustainedLeak or undersized
Disk I/O latency> 20 msStorage bottleneck
Disk space> 85% usedImminent outage
Network throughputNear NIC/bandwidth limitThrottling / cost

Application metrics and usage

MetricExample alert threshold
Server response time> 2 s average
Failed request rate> 5% (HTTP 5xx / exceptions)
Request rateAnomaly vs baseline (Smart Detection)
Availability< 99.9% from availability tests
Dependency duration/failuresSlow DB/API calls in the Application Map

The Four Golden Signals / RED / USE

Frameworks worth recognising: Four Golden Signals (latency, traffic, errors, saturation), RED for services (Rate, Errors, Duration), and USE for resources (Utilization, Saturation, Errors). They map cleanly onto Application Insights (RED) and VM/Container Insights (USE).

Distributed tracing

flowchart LR R[Request
operation_Id: abc-123] --> A[Service A
span 50ms] A --> B[Service B
span 200ms] B --> D[(Database
span 120ms)]
One operation_Id ties every span together, so you can reconstruct the whole request across services.

Caveat — the Application Map is for cross-service problems

"A request touches five microservices and one is slow — find which" → distributed tracing / Application Map, correlated by operation_Id. "Find the slowest database call in one app" → Application Insights Performance → Dependencies. Both are Application Insights, but the map is the answer whenever the problem spans services.

Kusto Query Language (KQL) basics

KQL queries Log Analytics, Application Insights, Microsoft Sentinel and Azure Data Explorer. The exam expects you to read and lightly write it — a table name, then a pipeline of operators.

OperatorDoesExample
whereFilter rowswhere success == false
project / project-awayChoose/drop columnsproject name, duration
summarizeAggregate, usually by a key or time binsummarize count() by bin(timestamp, 1h)
extendAdd a computed columnextend sec = duration / 1000
order by / sort bySortorder by duration desc
take / topLimit / top-Ntop 10 by duration desc
joinCombine tablesjoin kind=inner (exceptions) on operation_Id
renderVisualiserender timechart
KQL the queries the exam reuses
// Failed requests over the last 24h, charted
requests
| where timestamp > ago(24h)
| where success == false
| summarize failures = count() by bin(timestamp, 1h), resultCode
| render timechart

// Slowest operations — p95 is what SLOs care about
requests
| where timestamp > ago(1h)
| summarize avg(duration), p95 = percentile(duration, 95), count() by name
| order by p95 desc
| take 20

// Exceptions grouped by type
exceptions
| where timestamp > ago(24h)
| summarize count() by type
| order by count_ desc

// Availability % by location
availabilityResults
| where timestamp > ago(7d)
| summarize availability = round(100.0 * countif(success == true) / count(), 2)
    by location, bin(timestamp, 1d)
| render timechart

Caveat — the KQL patterns that show up

Recognise these on sight: where timestamp > ago(1h) (time filter), summarize ... by bin(timestamp, 1h) (bucket by hour), percentile(duration, 95) (p95 latency), render timechart (time-series chart). "Group results by hour" is bin() inside summarize; "show as a chart" is render.

Availability tests

TypeDoes
Standard testHTTP GET from multiple regions with SSL, status-code and content checks (the current recommended test)
URL ping testSimple reachability check (classic; being retired in favour of Standard)
Custom TrackAvailability()Multi-step / authenticated flows run from a Function or pipeline reporting via the SDK

Test from multiple locations

Configure at least five geographic locations so a single region's blip doesn't page you, and alert when a threshold number of locations fail. "Monitor the app's availability from around the world" → Application Insights availability (Standard) test.

Domain 5 rapid recap

The requirement says…Answer
Alert when CPU > 80% for 5 minutesAzure Monitor metric alert → action group
Find every 500 in the last hourKQL log query on requests
Monitor AKS pod CPU/memoryContainer Insights
Monitor VM CPU and memoryVM Insights
Track a custom business eventApplication Insights TrackEvent()
Find the slowest dependency in one appApp Insights Performance → Dependencies
Trace a request across five servicesDistributed tracing / Application Map
Enable monitoring with no code changeAuto-instrumentation on App Service
Reduce telemetry cost but keep whole tracesAdaptive sampling
Monitor availability from around the worldApp Insights availability (Standard) test
Group KQL results by hoursummarize ... by bin(timestamp, 1h)
Show a KQL result as a time chart| render timechart
Get the 95th-percentile response timepercentile(duration, 95)
Reuse one response across many alertsAction group
An alert should trigger a remediation pipelineAction group webhook → Azure DevOps REST API
Modern agent for VM telemetryAzure Monitor Agent (MMA is retired)