Generate a comprehensive weekly telemetry report for the Azure Backup MCP toolset by:
ddazureclients.kusto.windows.net)AzureDevExp database on the Kusto clustermicrosoft/mcp repository (for PR/release correlation)Run the following KQL queries against the Kusto cluster using the MCP Kusto tool. All queries use:
https://ddazureclients.kusto.windows.net
AzureDevExp
getAzureMcpEvents_ToolCalls
This is the primary query. It classifies every call into one of four categories:
AggregateException, RequestFailedException with 5xx)FormatException, ArgumentNullException, ArgumentException, etc.Refer to kql-queries.md for the full query.
Compare total calls, success rate, customer errors, Azure service errors, and MCP tool bugs between
the current week and the previous week. See kql-queries.md.
Run the error summary query to get per-tool exception types, messages, and stack traces.
Also run the daily error trend query. See kql-queries.md.
Get P50/P95/P99 latency for successful calls. See kql-queries.md.
Query azurebackup/VaultType, azurebackup/WorkloadType, azurebackup/DatasourceType, azurebackup/OperationScope
dimensions to see if users have upgraded to versions with telemetry tags.
Use queries 7, 11, 12, and 13 from kql-queries.md.
Run these git commands against the microsoft/mcp repository:
# Merged PRs this week
git log upstream/main --oneline --since="<week-start>" -- tools/Azure.Mcp.Tools.AzureBackup/
# Releases shipped
git log upstream/main --oneline --since="<week-start>" --grep="Prepare MCP release"
# Open branches
git branch -a --list "*azurebackup*"
# Changes since last release
git diff <last-release-tag>..upstream/main --stat -- tools/Azure.Mcp.Tools.AzureBackup/
Also count tests on main (checkout upstream/main test files first):
# Runnable unit test count = [Fact] + [InlineData] (each InlineData is a separate test run)
$facts = (Select-String "\[Fact\]" tools/Azure.Mcp.Tools.AzureBackup/tests/Azure.Mcp.Tools.AzureBackup.Tests/**/*.cs | Measure-Object).Count
$inlines = (Select-String "\[InlineData" tools/Azure.Mcp.Tools.AzureBackup/tests/Azure.Mcp.Tools.AzureBackup.Tests/**/*.cs | Measure-Object).Count
# Total runnable = $facts + $inlines
# Live test count — count only [Fact] (each method has [Fact]; [LiveTestOnly] is an
# additional attribute on the same method, so counting both would double-count)
Select-String "\[Fact\]" tools/Azure.Mcp.Tools.AzureBackup/tests/Azure.Mcp.Tools.AzureBackup.Tests/*.cs | Measure-Object
# Registered tools
Select-String "AddCommand" tools/Azure.Mcp.Tools.AzureBackup/src/AzureBackupSetup.cs | Measure-Object
Important: Do NOT count
[Fact]+[Theory]as the unit test count — that gives you method count, not runnable test count. Each[InlineData]on a[Theory]is a separate test.
Apply the 3-way error classification:
| Category | Exception Types | What It Means |
|---|---|---|
| Customer (4xx) | RequestFailedException with 400/403/404, KeyNotFoundException |
User error — wrong input, missing permissions, resource doesn't exist |
| Azure Service | AggregateException, RequestFailedException with 5xx |
Azure SDK/API/auth layer failure — tool correctly surfaces it |
| MCP Tool Bug | FormatException, ArgumentNullException, ArgumentException, InvalidOperationException (thrown by our code for unsupported operations) |
Our tool code is wrong — needs a fix |
MCP Tool Success Rate = (Total - MCP Tool Bugs) / Total
For each error cluster, determine:
Use the report-template.html as a starting point.
The report must include these sections in order:
Save the report as azure-backup-telemetry-report-<date>.html (both the styled version and the Outlook-compatible version).
For the Outlook version, apply these rules:
<style> block or CSS classes)border-radius, gradients, or CSS pseudo-elementscellpadding/cellspacing attributes on tablesPixelsPerInch declaration in <head>
border-left on table cells for callout boxes (instead of separate div)Important: MCP bug exception types must be checked before StatusCode. The
HandleExceptionbase class mapsArgumentNullException(inheritsArgumentException) to HTTP 400, which would incorrectly classify MCP bugs as "Customer" errors if StatusCode is checked first.
Is success == true?
└─ YES → "Success"
└─ NO →
Is ExceptionType FormatException / ArgumentNullException / ArgumentException / InvalidOperationException?
└─ YES → "MCP Tool Bug"
└─ NO →
Is StatusCode 400/403/404?
└─ YES → "Customer (4xx)"
└─ NO →
Is ExceptionType Azure.RequestFailedException with 5xx?
└─ YES → "Azure Service"
Is ExceptionType System.AggregateException?
└─ YES → "Azure Service"
Otherwise → "Unknown" (investigate)
These are the bugs triaged from the original telemetry analysis (April 2026):
| Bug | Tool | Description | Fix PR | Release |
|---|---|---|---|---|
| BUG-1 | backup_status, protecteditem_get | ArgumentNullException on null ResourceType in MapArmResourceTypeToBackupDataSourceType | #2518 (partial), #2621 (defense-in-depth) | beta.7 (partial), pending |
| BUG-2 | protecteditem_protect | VM pre-discovery loop timeout | #2470 | beta.6 |
| BUG-3 | protectableitem_list, find-unprotected | Workload normalization ArgumentException in ValidateAndParseResourceTypeFilter | #2518 (partial), #2621 (relaxed regex) | beta.7 (partial), pending |
| BUG-4 | soft-delete | Deprecated BackupResourceVaultConfig API | #2518 | beta.7 |
| BUG-5 | enable-crr | Deprecated BackupResourceConfig API | #2518 | beta.7 |
| BUG-6 | vault_get | FormatException on subscription name (non-GUID) | #2518 | beta.7 |
| BUG-7 | protecteditem_protect | DPP vault missing managed identity | #2470 | beta.6 |
| BUG-8 | recoverypoint_get | Null container in resolution | #2518 | beta.7 |
| NEW-1 | vault_get | AggregateException — pre-existing auth race (Azure Service, not MCP bug) | Not filed | — |
| NEW-2 | job_get | FormatException in DPP SDK — XmlConvert.ToTimeSpan fails during DataProtectionBackupJobProperties.Deserialize (Azure SDK bug, not MCP code) | #2621 (workaround catch), azure-sdk#59306 (upstream) | pending |
Note: PR #2518 title says "Fix 5 telemetry-triaged bugs (BUG-3,4,5,6,8)" but the actual merged code also includes the BUG-1 fix. However, the #2518 fixes for BUG-1 and BUG-3 were incomplete — confirmed by telemetry on beta.8/beta.9. PR #2621 adds defense-in-depth fixes for both. Always verify the diff, not just the title.
When new errors appear, assign the next sequential ID (NEW-2, NEW-3, etc.) and add to this table.
kql-queries.md — All Kusto queries used in the reportreport-template.html — Outlook-compatible HTML template