At least one metric is below 95%. Action required — see recommendations. Lowest weekly average: 94.31%.
GetMWCToken_403_TenantNotAuthorizedForCluster surged 10.3× (27 → 279 events, 7 unique notebooks) — see Save Reliability.Bands: ≥ 99% Healthy 95–99% Watch < 95% Degraded · Y-axis auto-scales to the data range for clearer trend visibility. Hover any dot for the exact daily value.
Daily distinct counts from the same telemetry source as Collab + Save metrics. Notebook instances = browser-session-level (aznbInstanceId). Notebook IDs = artifact-level (artifactId) — one artifact may be opened in multiple instances.
Rolled-out client versions ranked by total join attempts this week. A clearly worse rate on a specific build hints at a regression in that release.
| Component Version | Join Rate | Success | Total |
|---|---|---|---|
1.7.9 | 99.31% | 795,075 | 800,604 |
1.7.8 | 99.49% | 3,300 | 3,317 |
1.7.7 | 100.00% | 130 | 130 |
1.7.5 | 99.06% | 105 | 106 |
1.7.3 | 100.00% | 21 | 21 |
1.7.4 | 94.74% | 18 | 19 |
1.7.6 | 100.00% | 14 | 14 |
Rolling 14-day window: 2026-06-21 → 2026-07-05. Inconsistency rate = % of instances that fired dataIntegrity/error in AzNB.Client events. Lower is better.
| Message | Occurrences | Distinct Instances | Distinct Clients |
|---|---|---|---|
| Cell source mismatch between local and fluid (editor mismatched with fluid) | 52,659 | 697 | 553 |
| Cell source mismatch between local and fluid (editor not mounted) | 9,622 | 119 | 104 |
| Cell count mismatch between local and fluid DDS | 135 | 8 | 8 |
| Local cell doesn't have mapped remote id | 214 | 7 | 7 |
Bands: ≥ 99% Healthy 95–99% Watch < 95% Degraded · Hover any dot for the exact daily value.
Overall: every save attempt counts equally. Excluding user errors: ignores user-side reasons (size limits, capacity inactive, auth). Unique notebook: % of distinct notebooks that saved at least once.
📌 Rows tagged SystemError / Service have an amber background — these are service-side issues we own. Click sample text to expand the full JSON.
| Error Code | Category | Events | Unique Notebooks | Sample Error (click to expand) |
|---|---|---|---|---|
UserDevice_NetworkError | UserError | 22,870 | 3,282 | |
UserDevice_ProxyError | UserError | 12,115 | 32 | |
NotebookSave_ExceedMaximumSize | UserError | 8,818 | 95 | |
CapacityNotActive | UserError | 5,935 | 54 | |
GetMWCToken_Other | UnknownError | 4,436 | 26 | |
MwcRequest_Status404 | UserError | 2,581 | 146 | |
GetMWCToken_401_PowerBINotAuthorizedException | UserError | 1,235 | 25 | |
NotebookSave_ContentError | SystemError | 949 | 2 | |
GetMWCToken_401_TokenExpired | SystemError | 906 | 21 | |
FaileToGetEtagOfNotebook | SystemError | 721 | 56 | |
GetMWCToken_0_SharedNetworkConnectionIssue | UserError | 287 | 52 | |
GetMWCToken_403_TenantNotAuthorizedForCluster | UserError | 279 | 7 | |
ArtifactWrite_Unauthorized | UserError | 247 | 5 | |
MwcRequestError | UnknownError | 107 | 11 | |
GetMWCToken_403_TokenExpired | SystemError | 82 | 7 | |
GetMWCToken_429_Unkown | UserError | 31 | 3 | |
MwcRequest_Status500 | SystemError | 16 | 15 | |
GetMWCToken_404_CapacityNotActive | UserError | 15 | 14 | |
MWCToken_ValidationException | SystemError | 15 | 13 | |
MwcRequestError|NotebookMaxContentLengthExceeded | UnknownError | 11 | 3 |
Both PUT (save) and HEAD (etag pre-fetch) calls are counted at the network layer. The HTTP 500 Deep-Dive section below only covers PUT failures that reached the app-level save-error log path, so its unique-notebook count can legitimately be lower (a HEAD-500 may prevent the PUT from ever being attempted).
| Environment | Status | Unique Notebook URLs |
|---|---|---|
| PROD | 200 | 348,619 |
| PROD | 0 | 1,921 |
| PROD | 412 | 383 |
| PROD | 404 | 185 |
| PROD | 401 | 124 |
| PROD | 403 | 52 |
| PROD | 500 | 28 |
| PROD | 413 | 3 |
| PROD | 400 | 2 |
| PROD | 451 | 2 |
| PROD | 201 | 2 |
| PROD | 408 | 1 |
| PROD | 502 | 1 |
| Message (click to expand) | Status | Unique Notebooks |
|---|---|---|
| TypeError: Failed to fetch (browser thrown this error when response is not returned) | — | 2,505 |
| Failed to fetch [ParentActivityId:<g-u-i-d>] | — | 1,022 |
| Failed to get etag | — | 278 |
| Failed to get etag | 404 | 146 |
| Notebook content size <#> MB exceeds maximum allowed size 32 MB | — | 95 |
| CapacityNotActive | — | 54 |
| — | — | 34 |
| NetworkError when attempting to fetch resource. [ParentActivityId:<g-u-i-d>] | — | 29 |
| Load failed [ParentActivityId:<g-u-i-d>] | — | 24 |
| Failed to get etag | 500 | 15 |
| [MwcTokenValidationException] Internal error MwcTokenValidationException. | 401 | 13 |
| Failed to retrieve MWC token for "Notebook": WorkspaceId=<g-u-i-d> CapacityId=<g-u-i-d> ArtifactId=<g-u-i-d>. | — | 12 |
| Failed to get etag | 403 | 9 |
| Failed to get etag | 401 | 9 |
| [NBSServiceProxyException] Notebook Service failed to response. | 500 | 8 |
401 | 5 | |
| [Metastore/PreconditionFailed/NotebookServiceError] Failed to update entity <g-u-i-d>/<g-u-i-d>. | 412 | 5 |
| NotebookMaxContentLengthExceeded | 413 | 3 |
| The notebook has been deleted. | 404 | 3 |
| System error. The content of this notebook is missing. Artifact Id: <g-u-i-d>. | 500 | 2 |
Server-internal errors during PUT /content. These are service-owned — review correlated logs in the artifact storage service. Use the correlation IDs in the sample response body to trace upstream.
| Error Code | Component Version | Environment | Events | Unique Notebooks | Sample Message + Response Body |
|---|---|---|---|---|---|
MwcRequest_Status500 | — | PROD | 16 | 15 | view samplemessage: Failed to get etag of notebook f5cb310d-4067-4774-b035-68d2865eada6. MwcRequestError: Failed to send HTTP (MWC) request to https://522ba77bd04d4872802f2779188a6a2c.pbidedicated.windows.net/webapi/capacities/522BA77B-D04D-4872-802F-2779188A6A2C/workloads/Notebook/Data/Automatic/api/workspaces/05e9a1f9-286f-49c9-98b2-4abb5dd2ebdd/artifacts/f5cb310d-4067-4774-b035-68d2865eada6/content?v=1782908060514. Status code: 500 Internal Server Error. |
MwcRequestError | — | PROD | 9 | 9 | view samplemessage: [NBSServiceProxyException] Notebook Service failed to response. |
500_NotebookContentIsMissing | — | PROD | 3 | 2 | view samplemessage: System error. The content of this notebook is missing. Artifact Id: 9b3a54c8-1349-4b3c-9e9f-fba8cba8b27c. |
componentVersion — if 500s concentrate on one build, suspect a recent client-side change that triggered a backend regression. (2) Search artifact-storage logs for the CorrelationId in response.body. (3) Compare event count to last week — a 2× surge appears in the WoW banner above.Each save failure mapped to the network call it came from and the HTTP status returned. Use this to trace user-visible errors back to the responsible service layer.
| HTTP Operation | Status | Events | Unique Notebooks | Latest Sample Error |
|---|---|---|---|---|
HEAD /workspaces/{ws}/artifacts/{id}/content | — | 22,765 | 2,746 | UserDevice_NetworkError |
other / uncategorized | — | 18,071 | 106 | UserDevice_ProxyError Timeout fetching MWC token for Notebook. 63851s elapsed. Please retry your operation. |
| HTTP Operation | Status | Events | Unique Notebooks | Latest Sample Error |
|---|---|---|---|---|
PUT /content (generic fetch error) | — | 7,358 | 1,022 | UserDevice_NetworkError Failed to fetch [ParentActivityId:001fffff-56f0-4d5a-bc34-ecc8ecb018b0] |
PUT /content (browser network error) | — | 34 | 29 | UserDevice_NetworkError NetworkError when attempting to fetch resource. [ParentActivityId:001ffe7a-2b29-4156-998a-a3f09ac734fb] |
PUT /content (browser load failed) | — | 29 | 24 | UserDevice_NetworkError Load failed [ParentActivityId:001ffe73-b7c9-4554-8ee5-15336a03fa60] |
| HTTP Operation | Status | Events | Unique Notebooks | Latest Sample Error |
|---|---|---|---|---|
HEAD /workspaces/{ws}/artifacts/{id}/content | 404 | 2,581 | 146 | MwcRequest_Status404 |
other / uncategorized | 412 | 5 | 5 | NotebookSave_PreconditionFailed |
other / uncategorized | 404 | 3 | 3 | NotebookSave_ItemDeleted The notebook has been deleted. |
| HTTP Operation | Status | Events | Unique Notebooks | Latest Sample Error |
|---|---|---|---|---|
PUT /content (rejected client-side, oversize) | — | 8,818 | 95 | NotebookSave_ExceedMaximumSize Notebook content size 90.28 MB exceeds maximum allowed size 32 MB. |
PUT /content (rejected client-side, oversize) | 413 | 11 | 3 | MwcRequestError|NotebookMaxContentLengthExceeded [NotebookMaxContentLengthExceeded] file content size 41902798 is over 33554432 Bytes. |
| HTTP Operation | Status | Events | Unique Notebooks | Latest Sample Error |
|---|---|---|---|---|
other / uncategorized | 401 | 262 | 18 | MWCToken_ValidationException |
HEAD /workspaces/{ws}/artifacts/{id}/content | 403 | 673 | 9 | FaileToGetEtagOfNotebook |
HEAD /workspaces/{ws}/artifacts/{id}/content | 401 | 9 | 9 | MwcRequest_Status401 |
other / uncategorized | 400 | 949 | 2 | NotebookSave_ContentError |
other / uncategorized | 451 | 98 | 2 | MwcRequestError You are not allowed to perform this action. |
other / uncategorized | 403 | 3 | 2 | 500|MwcRequestError|DeniedByPolicy [DeniedByPolicy] An internal error occurred. Access protector failed due to DeniedByPolicy |
HEAD /workspaces/{ws}/artifacts/{id}/content | 408 | 1 | 1 | MwcRequest_Status408 |
| HTTP Operation | Status | Events | Unique Notebooks | Latest Sample Error |
|---|---|---|---|---|
HEAD /workspaces/{ws}/artifacts/{id}/content | 500 | 16 | 15 | MwcRequest_Status500 |
other / uncategorized | 500 | 12 | 11 | MwcRequestError [NBSServiceProxyException] Notebook Service failed to response. |
statusCode + path. AAD / Authorization = token / capacity / workspace permission issue, route to identity team. Client (size limit) = SDK rejected the save before sending; user-side education or limit raise.| Outcome | Detail | Env | Unique Instances | Events |
|---|---|---|---|---|
| NotNeeded | Not needed (isLeader=false / collStatus=joined) | PROD | 3,631 | 37,309 |
| NotNeeded | Not needed (isLeader= / collStatus=) | PROD | 225 | 19,433 |
| NotNeeded | Not needed (isLeader=false / collStatus=inactive) | PROD | 363 | 8,545 |
| YieldFailed | Yield failed | PROD | 69 | 5,014 |
| NotNeeded | Not needed (isLeader=false / collStatus=failed) | PROD | 47 | 808 |
| YieldSucceeded | Yield succeeded | PROD | 50 | 162 |
| NotNeeded | Not needed (isLeader=false / collStatus=in-progress) | PROD | 4 | 4 |
| NotNeeded | Not needed (isLeader=true / collStatus=inactive) | PROD | 1 | 1 |
Counts of File version is updated to … events on the new leader within 20 seconds of yield — the success signal that the handoff actually unblocked the user.
| Env | Unique instances | Unique notebooks | Saves Succeeded |
|---|---|---|---|
| PROD | 13 | 13 | 19 |
Grouped error messages from Failed to yield save leader and Yield save leader completed. Yield success: false events.
| Error message (click to expand) | Env | Unique Instances | Events |
|---|---|---|---|
| No other clients in the session that we can yield to | PROD | 65 | 4,986 |
| New leader is still this client | PROD | 4 | 24 |
| Timeout waiting for new leader | PROD | 3 | 4 |
When a yield succeeds, did the new leader actually save? These rows are SAVE_FAILED events on the new leader within 20 seconds of the yield — grouped by error so you can see the dominant failure modes.
| Error message (click to expand) | Env | Unique instances | Unique notebooks | Save Failures |
|---|---|---|---|---|
| Notebook content size 36.51 MB exceeds maximum allowed size 32 MB. | PROD | 1 | 1 | 29 |
| Unexpected token '<', "<!--# vNFr"... is not valid JSON | PROD | 3 | 1 | 21 |
| Notebook content size 39.8 MB exceeds maximum allowed size 32 MB. | PROD | 2 | 1 | 14 |
| Notebook content size 36.47 MB exceeds maximum allowed size 32 MB. | PROD | 1 | 1 | 10 |
| Notebook content size 66.59 MB exceeds maximum allowed size 32 MB. | PROD | 1 | 1 | 8 |
| Notebook content size 38.28 MB exceeds maximum allowed size 32 MB. | PROD | 2 | 1 | 6 |
| Notebook content size 33.92 MB exceeds maximum allowed size 32 MB. | PROD | 1 | 1 | 6 |
| Unexpected token '<', "<!--# Dj6L"... is not valid JSON | PROD | 2 | 1 | 6 |
| Notebook content size 40.76 MB exceeds maximum allowed size 32 MB. | PROD | 1 | 1 | 5 |
| Notebook content size 38.67 MB exceeds maximum allowed size 32 MB. | PROD | 2 | 1 | 5 |
| Notebook content size 37.21 MB exceeds maximum allowed size 32 MB. | PROD | 1 | 1 | 4 |
| PROD | 1 | 1 | 2 | |
| Failed to fetch [ParentActivityId:001f155e-f5cd-485b-a0be-28a3ee8f7d17] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f1678-4ea5-4a22-940e-ba2cd2a14438] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f5a98-e429-4482-93ed-40edbb53a7f5] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f5995-28d3-4b57-aa21-bc172fc1dda9] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f89d5-6cb3-4a2b-8be4-334082a9576e] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001fc498-0876-403b-a91e-50ea2ed0ce60] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001fb0d8-07a3-4c8c-9b96-d31ec5217b5a] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f1e6e-5a6d-463c-a794-688eb5d19bcb] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001fd1f6-e5be-46e4-b9d8-2e031d5c80d6] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f8ad4-4df4-4f22-93cf-4b8e074f018e] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f2989-b117-4228-be14-8463951e32c6] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f805c-6674-4630-9aa6-88d4cf24936a] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f3cb4-3f9a-4817-b02b-588f2a5a6d63] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f5a76-9ad5-4bcf-9ce1-76fc12f90671] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f41bd-fb92-4e9e-a026-3f4bbc355d60] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f13dd-5961-4054-b500-e4b9fbdddbfe] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f0cff-f517-49cb-9774-28e577f30983] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001fc70a-5186-4dd2-9408-c50391504e23] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f8ae0-684f-46fc-999c-8a13d2faac93] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f9157-871c-4e70-9520-7ca93eb01ad6] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f9e5b-2c19-4de8-8fef-64147e374540] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001fe7e9-51d3-40b9-b363-8681f2b951e3] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f8f6c-2c53-4e84-855f-fe0924b5efc1] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f71a4-7270-4145-a611-beed3d96e468] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f63fa-ca15-4da9-ac63-739b963c2c8a] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f1e91-eaae-4d61-8f90-1fe74113fa39] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f2098-80ef-4600-94ed-167ab36fa167] | PROD | 1 | 1 | 1 |
| PROD | 1 | 1 | 1 | |
| Failed to fetch [ParentActivityId:001f9414-3ef6-42ee-b048-2c54f8b4cd60] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f8ef4-8660-435c-a336-b65ee371d687] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001fae4b-1976-4ef2-9b3a-9d7da0929c37] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f03c3-1dde-4264-a1b2-fc6e73f92a5d] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f3523-f1a3-4e36-9b80-0748062f1b52] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f4248-86df-4b5f-a5ca-0f499c612bc0] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f2bcb-9def-4a69-8d0a-59f79e0f2605] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f84f2-db56-446d-838a-226cddd1b973] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001fd9e9-b6b6-4d86-a19f-aff9d49d1e57] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f67e9-4cc4-414f-b174-4ea04d308877] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001fbc04-00c1-4898-8518-694aa630a8f8] | PROD | 1 | 1 | 1 |
| PROD | 1 | 1 | 1 | |
| Failed to fetch [ParentActivityId:001f9293-43d6-4896-8c09-2b20c12a1b80] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f5f30-e042-4e15-a8b1-22568db18584] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f39b3-2d44-4e6b-ab8e-26f84982f06d] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f57bf-a396-490a-a74e-beeba60bbb08] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f9af0-ca17-46ba-ad04-b2e3fac24cf3] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001fbc44-49ee-4a44-8be5-0adac4330ef0] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001fb76c-7301-4e37-8072-51962f9637ef] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001fde16-cf7a-4345-9ead-5fe1eee28115] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001fd531-f649-4ca8-a28a-678c2930d43f] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f12e5-7157-46a4-970e-40e9729c09d8] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001fde89-3457-4437-a55b-ba9932333ac7] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f713c-2185-4895-8a0c-30419ed9fe62] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001fcd4f-e127-4d54-a15f-7275fecd06f8] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f68c7-ca90-4677-b3a0-04e194998acb] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001fa535-7930-4e9f-b137-18a50dfface4] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001fdd4b-d0e2-461c-b434-7f4fef936205] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001fe3e7-53a0-47ec-81a8-8673716dd139] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001f87c9-c3d1-4cef-aae5-9e57a541fc0d] | PROD | 1 | 1 | 1 |
| Failed to fetch [ParentActivityId:001fc2fe-52c3-4d8b-a631-cda5e1aa3e45] | PROD | 1 | 1 | 1 |
| PROD | 1 | 1 | 1 | |
| PROD | 1 | 1 | 1 |
PUT /content returned 5xx. Service-side regression / dependency outage.
Save exceeded gateway timeout — usually large notebook + slow backing store.
Bad gateway: front-door couldn't reach NBS workload.
Etag fetch returned 404 — artifact deleted/moved mid-save or metadata replication lag.
Browser threw before the response returned — usually corp proxy, VPN drop, or page navigation aborting save.
User notebook exceeded the 32 MB save limit (often due to embedded outputs/widgets).
Tenant's Fabric capacity is paused / suspended. Save cannot proceed until reactivated.
User's MWC token doesn't have write permission for this artifact / capacity.
Pre-filled with the same week range / environment as this dashboard. Click Copy to paste into Kusto Explorer or Azure Data Explorer.
let UXEnvironment = dynamic(['PROD']);
let _startTime = datetime(2026-06-28T00:00:00Z);
let _endTime = datetime(2026-07-05T00:00:00Z);
let tridentItems = cluster('pbiclients.eastus').database('appinsights').customEvents
| union cluster("pbiclientseu.northeurope").database("appinsights").customEvents
| where timestamp >= _startTime and timestamp <= _endTime
| extend customDimensions = parse_json(customDimensions)
| where (customDimensions.TL_componentName == 'Notebook.NotebookFileView' and customDimensions.TL_event contains 'notebook.notebookProfile')
or (customDimensions.TL_componentName == '@synapse/notebook-core:SynapseNotebookConnector' and customDimensions.TL_message contains 'Connect NotebookViewModel with AzureNotebookRef')
| where isempty(['UXEnvironment']) or customDimensions.TL_environment in (['UXEnvironment']) or 'All Prod' in (['UXEnvironment'])
| where customDimensions.browserVersion != "97.0.4692.71"
| extend instanceId = iff(customDimensions.TU_instanceId != '', tostring(customDimensions.TU_instanceId), tostring(customDimensions.TU_aznbInstanceId))
| project timestamp, env = tostring(customDimensions.TL_environment), instanceId;
let targetData = tridentItems
| join kind=inner (
cluster('azurenb.southcentralus').database('Prod').aznbServices
| where TIMESTAMP >= _startTime and TIMESTAMP <= _endTime
| where hostName == "Trident"
| where msg in ("join_session_success", "join_session_error")
| project TIMESTAMP, msg, isSuccess=iff(msg == "join_session_success", 1, 0), isFail=iff(msg == "join_session_error", 1, 0), instanceId, componentVersion
)
on $left.instanceId == $right.instanceId;
let countItemsByDayAndStatus = targetData
| summarize dcount(instanceId) by tostring(msg), bin(timestamp, 1d);
let countItemsByDay = targetData
| summarize totalCount = dcount(instanceId) by bin(timestamp, 1d);
let finalData = countItemsByDayAndStatus | join kind = inner (countItemsByDay) on $left.timestamp == $right.timestamp;
finalData
| where msg == 'join_session_success'
| extend percentageDouble = round(100.0 * dcount_instanceId / (totalCount * 1.0), 2)
| project msg, timestamp, distinct_collabSession = dcount_instanceId, percentage = percentageDouble, totalCount
| order by timestamp asc
let UXEnvironment = dynamic(['PROD']);
let _startTime = datetime(2026-06-28T00:00:00Z);
let _endTime = datetime(2026-07-05T00:00:00Z);
let tridentItems = cluster('pbiclients.eastus').database('appinsights').customEvents
| union cluster("pbiclientseu.northeurope").database("appinsights").customEvents
| where timestamp >= _startTime and timestamp <= _endTime
| extend customDimensions = parse_json(customDimensions)
| where (customDimensions.TL_componentName == 'Notebook.NotebookFileView' and customDimensions.TL_event contains 'notebook.notebookProfile')
or (customDimensions.TL_componentName == '@synapse/notebook-core:SynapseNotebookConnector' and customDimensions.TL_message contains 'Connect NotebookViewModel with AzureNotebookRef')
| where isempty(['UXEnvironment']) or customDimensions.TL_environment in (['UXEnvironment']) or 'All Prod' in (['UXEnvironment'])
| where customDimensions.browserVersion != "97.0.4692.71"
| extend instanceId = iff(customDimensions.TU_instanceId != '', tostring(customDimensions.TU_instanceId), tostring(customDimensions.TU_aznbInstanceId))
| project env = tostring(customDimensions.TL_environment), instanceId;
let targetData = tridentItems
| join kind=inner (
cluster('azurenb.southcentralus').database('Prod').aznbServices
| where TIMESTAMP >= _startTime and TIMESTAMP <= _endTime
| where hostName == "Trident"
| where msg in ("join_session_success", "join_session_error")
| project TIMESTAMP, msg, instanceId, componentVersion
)
on $left.instanceId == $right.instanceId;
let total_distinct_instanceId_byVersion = targetData
| summarize totalDistinct = count_distinct(instanceId) by componentVersion;
let finalTable = targetData
| extend joinStatus = tostring(msg)
| where joinStatus == 'join_session_success'
| summarize successDistinct = count_distinct(instanceId) by componentVersion, joinStatus
| join kind = inner (total_distinct_instanceId_byVersion) on componentVersion;
finalTable
| extend percentageDouble = round(100.0 * successDistinct / (totalDistinct * 1.0), 2)
| project componentVersion, joinRate = percentageDouble, successCount = successDistinct, totalCount = totalDistinct
| order by totalCount desc
let UXEnvironment = dynamic(['PROD']);
let _startTime = datetime(2026-06-28T00:00:00Z);
let _endTime = datetime(2026-07-05T00:00:00Z);
let aznbCollabSessionWithError = cluster("azurenb.southcentralus").database("Prod").aznbServices
| where PreciseTimeStamp >= _startTime and PreciseTimeStamp <= _endTime
| where hostName == "Trident"
| where HttpRequestUserAgent !contains "ThousandEyes"
| where eventName contains "collab"
| extend hasError = iif(level=="error", 1, 0)
| extend datebin=bin(PreciseTimeStamp, 1d)
| summarize hint.shufflekey = instanceId hasError=max(hasError) by datebin, instanceId, documentId, componentVersion
| project datebin, hasError, instanceId, documentId, componentVersion;
let tridentJoinedCollabData = cluster("pbiclients.eastus").database("appinsights").customEvents
| union cluster("pbiclientseu.northeurope").database("appinsights").customEvents
| where timestamp >= _startTime and timestamp <= _endTime
| where customDimensions.TL_extensionName == 'DES'
| where customDimensions.browserVersion != "97.0.4692.71"
| where isempty(['UXEnvironment']) or customDimensions.TL_environment in (['UXEnvironment']) or 'All Prod' in (['UXEnvironment'])
| where customDimensions.TL_message == 'AzNB collaboration: onSessionStatusChange' and customDimensions.TU_sessionStatus == 'joined'
| extend aznbInstanceId = tostring(customDimensions.TU_aznbInstanceId), environment = tostring(customDimensions.TL_environment)
| summarize hint.shufflekey = aznbInstanceId by environment, aznbInstanceId;
let errorCntData = tridentJoinedCollabData
| join hint.strategy = shuffle kind=inner (
aznbCollabSessionWithError
| summarize hint.shufflekey = instanceId errorCnt = sum(hasError) by datebin, instanceId
) on $left.aznbInstanceId == $right.instanceId;
errorCntData
| extend hasError = errorCnt > 0
| summarize dcount(instanceId), totalInstances=count(), unreliableInstances=countif(hasError>0) by datebin, environment
| where dcount_instanceId > 50
| extend sessionReliability = 100 - round(unreliableInstances*100.0/totalInstances, 2)
| project timestamp = datebin, environment, dcount_instanceId, totalInstances, unreliableInstances, sessionReliability
| order by timestamp asc
let UXEnvironment = dynamic(['PROD']);
let _startTime = datetime(2026-06-28T00:00:00Z);
let _endTime = datetime(2026-07-05T00:00:00Z);
let totalData = cluster("pbiclients.eastus").database('appinsights').customEvents
| union cluster("pbiclientseu.northeurope").database("appinsights").customEvents
| where timestamp >= _startTime and timestamp <= _endTime
| extend customDimensions = parse_json(customDimensions)
| where customDimensions.TL_extensionName == 'DES'
| where isempty(['UXEnvironment']) or customDimensions.TL_environment in (['UXEnvironment']) or 'All Prod' in (['UXEnvironment']);
let saveTotalCnt = totalData
| where customDimensions.TL_message contains 'Save is triggered'
| summarize totalCnt = count() by bin(timestamp, 1d);
let saveFailedData = totalData
| where customDimensions.TL_message contains 'Failed when saving notebook content';
let saveFailedCnt = saveFailedData
| summarize failedCnt = count(),
failedCntExcludeUserErr = countif(
customDimensions.TU_code != 'NotebookSave_ExceedMaximumSize'
and customDimensions.TU_code != 'UserDevice_ProxyError'
and customDimensions.TU_code != 'CapacityNotActive'
and customDimensions.TU_code != 'GetMWCToken_404_CapacityNotActive'
and customDimensions.TU_code != 'ArtifactWrite_Unauthorized'
and customDimensions.TU_code != 'GetMWCToken_403_TenantNotAuthorizedForCluster'
) by bin(timestamp, 1d);
let finalData = saveTotalCnt | join kind = inner (saveFailedCnt) on timestamp;
finalData
| extend failureRate = round(100.0 * failedCnt / (totalCnt * 1.0), 2),
failureRateExcludeUserErr = round(100.0 * failedCntExcludeUserErr / (totalCnt * 1.0), 2)
| project timestamp,
successRate = 100.0 - failureRate,
successRateExcludeUserErr = 100.0 - failureRateExcludeUserErr,
totalCnt, failedCnt, failedCntExcludeUserErr
| order by timestamp asc
let UXEnvironment = dynamic(['PROD']);
let _startTime = datetime(2026-06-28T00:00:00Z);
let _endTime = datetime(2026-07-05T00:00:00Z);
let totalData = cluster("pbiclients.eastus").database('appinsights').customEvents
| union cluster("pbiclientseu.northeurope").database("appinsights").customEvents
| where timestamp >= _startTime and timestamp <= _endTime
| extend customDimensions = parse_json(customDimensions)
| where customDimensions.TL_extensionName == 'DES'
| where isempty(['UXEnvironment']) or customDimensions.TL_environment in (['UXEnvironment']) or 'All Prod' in (['UXEnvironment']);
let saveTotalCnt = totalData
| where customDimensions.TL_message contains 'Save is triggered'
| extend artifactId = tostring(customDimensions.TU_artifactId)
| summarize totalCnt = dcount(artifactId) by bin(timestamp, 1d);
let saveFailedCnt = totalData
| where customDimensions.TL_message contains 'Failed when saving notebook content'
| extend artifactId = tostring(customDimensions.TU_artifactId)
| summarize failedCnt = dcount(artifactId) by bin(timestamp, 1d);
let finalData = saveTotalCnt | join kind = inner (saveFailedCnt) on timestamp;
finalData
| extend failureRate = round(100.0 * failedCnt / (totalCnt * 1.0), 2)
| project timestamp, successRate = 100.0 - failureRate, totalCnt, failedCnt
| order by timestamp asc
let UXEnvironment = dynamic(['PROD']);
let _startTime = datetime(2026-06-28T00:00:00Z);
let _endTime = datetime(2026-07-05T00:00:00Z);
let totalData = cluster("pbiclients.eastus").database('appinsights').customEvents
| union cluster("pbiclientseu.northeurope").database("appinsights").customEvents
| where timestamp >= _startTime and timestamp <= _endTime
| extend customDimensions = parse_json(customDimensions)
| where customDimensions.TL_extensionName == 'DES'
| where isempty(['UXEnvironment']) or customDimensions.TL_environment in (['UXEnvironment']) or 'All Prod' in (['UXEnvironment']);
let saveFailedData = totalData
| where customDimensions.TL_message contains 'Failed when saving notebook content'
| extend errorObj = customDimensions.TL_error;
saveFailedData
| extend artifactId = tostring(customDimensions.TU_artifactId), category = tostring(customDimensions.TU_category)
| summarize count_ = count(), uniqueArtifactCnt = dcount(artifactId), sampleError = arg_max(tostring(errorObj), timestamp)
by code = tostring(customDimensions.TU_code), category
| order by count_ desc
let UXEnvironment = dynamic(['PROD']);
let _startTime = datetime(2026-06-28T00:00:00Z);
let _endTime = datetime(2026-07-05T00:00:00Z);
cluster("pbiclients.eastus").database('appinsights').customEvents
| union cluster("pbiclientseu.northeurope").database("appinsights").customEvents
| where timestamp >= _startTime and timestamp <= _endTime
| extend customDimensions = parse_json(customDimensions)
| where customDimensions.TL_extensionName == 'DES'
| where customDimensions.TL_componentName == 'TrackLib.Ajax'
| where isempty(['UXEnvironment']) or customDimensions.TL_environment in (['UXEnvironment']) or 'All Prod' in (['UXEnvironment'])
| where customDimensions.TU_request has 'workloads/Notebook/Data/Automatic/api/workspaces' and customDimensions.TU_request has '/content'
| extend environment = tostring(customDimensions.TL_environment)
| extend requestInfo = parse_json(tostring(customDimensions.TU_request))
| extend url = requestInfo['url']
| extend url = substring(url, 0, strlen(url) - 16)
| extend method = requestInfo.method
| where method == 'PUT' or method == 'HEAD'
| extend responseInfo = parse_json(tostring(customDimensions.TU_response))
| extend statusCode = responseInfo['statusCode']
| where statusCode != ''
| summarize uniqueUrlCnt = dcount(tostring(url)) by environment = tostring(environment), statusCode = tostring(statusCode)
| order by uniqueUrlCnt desc
let UXEnvironment = dynamic(['PROD']);
let _startTime = datetime(2026-06-28T00:00:00Z);
let _endTime = datetime(2026-07-05T00:00:00Z);
let failedToPut = 'Failed to put content';
let typeError = 'TypeError: Failed to fetch (browser thrown this error when response is not returned)';
let failedToGetEtag= 'Failed to get etag';
let failedToAccess = 'Failed to access the artifact metadata';
let noAccess = 'No access to the artifact or the workspace';
cluster("pbiclients.eastus").database('appinsights').customEvents
| union cluster("pbiclientseu.northeurope").database("appinsights").customEvents
| where timestamp >= _startTime and timestamp <= _endTime
| extend customDimensions = parse_json(customDimensions)
| where customDimensions.TL_extensionName == 'DES'
| where isempty(['UXEnvironment']) or customDimensions.TL_environment in (['UXEnvironment']) or 'All Prod' in (['UXEnvironment'])
| where customDimensions.TL_message has 'Failed when saving notebook content' or customDimensions.TL_message has 'Attempt to put notebook content failed'
| extend environment = tostring(customDimensions.TL_environment)
| extend saveType = tostring(customDimensions.TU_saveType)
| extend artifactId = tostring(customDimensions.TU_artifactId)
| extend errorDetail = parse_json(tostring(customDimensions.TL_error))
| extend cause = parse_json(tostring(errorDetail.cause))
| extend causeResponse = parse_json(tostring(cause.response))
| extend response = iff(causeResponse != '', causeResponse, parse_json(errorDetail.response))
| extend statusCode = tostring(response.status)
| extend message = tostring(errorDetail.message)
| extend message = replace_regex(message, "[0-9a-fA-F]{8}(-[0-9a-fA-F]{4,12}){4}", "<g-u-i-d>")
| extend message = replace_regex(message, @"Notebook content size [\d.]+", "Notebook content size <#>")
| extend message = iff(message startswith "Notebook content size <#>", "Notebook content size <#> MB exceeds maximum allowed size 32 MB", message)
| extend message = iff(message has 'TypeError: Failed to fetch', typeError, message)
| extend message = iff(message startswith 'Failed to put content of notebook', failedToPut, message)
| extend message = iff(message startswith 'Failed to get etag of notebook', failedToGetEtag, message)
| extend message = iff(message startswith "Failed to access the artifact metadata.", failedToAccess, message)
| extend message = iff(message startswith "You don't have the access to the artifact or the workspace it belongs to", noAccess, message)
| extend message = iff(message startswith "[NotebookMaxContentLengthExceeded]", "NotebookMaxContentLengthExceeded", message)
| summarize uniqueArtifactCnt = dcount(artifactId) by environment, message, statusCode
| order by uniqueArtifactCnt desc
let UXEnvironment = dynamic(['PROD']);
let _startTime = datetime(2026-06-28T00:00:00Z);
let _endTime = datetime(2026-07-05T00:00:00Z);
cluster("pbiclients.eastus").database('appinsights').customEvents
| union cluster("pbiclientseu.northeurope").database("appinsights").customEvents
| where timestamp >= _startTime and timestamp <= _endTime
| extend customDimensions = parse_json(customDimensions)
| where customDimensions.TL_extensionName == 'DES'
| where isempty(['UXEnvironment']) or customDimensions.TL_environment in (['UXEnvironment']) or 'All Prod' in (['UXEnvironment'])
| where customDimensions.TL_message has 'Failed when saving notebook content' or customDimensions.TL_message has 'Attempt to put notebook content failed'
| extend artifactId = tostring(customDimensions.TU_artifactId)
| extend code = tostring(customDimensions.TU_code)
| extend errorDetail = parse_json(tostring(customDimensions.TL_error))
| extend cause = parse_json(tostring(errorDetail.cause))
| extend causeResp = parse_json(tostring(cause.response))
| extend response = iff(causeResp != '', causeResp, parse_json(errorDetail.response))
| extend statusCode = tostring(response.status)
| extend rawMessage = tostring(errorDetail.message)
| extend httpOp = case(
rawMessage startswith "Failed to put content of notebook"
or rawMessage has "Attempt to put notebook content failed",
"PUT /workspaces/{ws}/artifacts/{id}/content",
rawMessage startswith "Failed to get etag of notebook",
"HEAD /workspaces/{ws}/artifacts/{id}/content",
rawMessage startswith "Failed to access the artifact metadata",
"GET /workspaces/{ws}/artifacts/{id}",
rawMessage startswith "You don't have the access to the artifact",
"AAD /authorization-check",
rawMessage startswith "[NotebookMaxContentLengthExceeded]"
or rawMessage has "exceeds maximum allowed size",
"PUT /content (rejected client-side, oversize)",
rawMessage has "TypeError: Failed to fetch",
"PUT /content (browser aborted before response)",
rawMessage has "NetworkError when attempting to fetch resource",
"PUT /content (browser network error)",
rawMessage has "Load failed",
"PUT /content (browser load failed)",
rawMessage has "Failed to fetch",
"PUT /content (generic fetch error)",
"other / uncategorized")
| extend layer = case(
httpOp has "browser" or httpOp has "fetch error",
"Client (browser/network)",
httpOp has "oversize",
"Client (size limit)",
httpOp startswith "AAD",
"AAD / Authorization",
statusCode startswith "5",
"Backend 5xx",
statusCode == "404" or statusCode == "412" or statusCode == "409",
"Backend 4xx (notebook conflict / not-found)",
statusCode startswith "4",
"Backend 4xx (other)",
statusCode == "" or statusCode == "0",
"No HTTP response captured",
"Other")
| summarize
eventCnt = count(),
uniqueArtifactCnt = dcount(artifactId),
sampleMessage = arg_max(rawMessage, timestamp),
sampleErrorCode = arg_max(code, timestamp)
by layer, httpOp, statusCode
| order by uniqueArtifactCnt desc
let UXEnvironment = dynamic(['PROD']);
let _startTime = datetime(2026-06-28T00:00:00Z);
let _endTime = datetime(2026-07-05T00:00:00Z);
let totalData = cluster("pbiclients.eastus").database('appinsights').customEvents
| union cluster("pbiclientseu.northeurope").database("appinsights").customEvents
| where timestamp >= _startTime and timestamp <= _endTime
| extend customDimensions = parse_json(customDimensions)
| where customDimensions.TL_extensionName == 'DES'
| where isempty(['UXEnvironment']) or customDimensions.TL_environment in (['UXEnvironment']) or 'All Prod' in (['UXEnvironment']);
totalData
| where customDimensions.TL_message has 'Failed when saving notebook content' or customDimensions.TL_message has 'Attempt to put notebook content failed'
| extend artifactId = tostring(customDimensions.TU_artifactId)
| extend code = tostring(customDimensions.TU_code)
| extend environment = tostring(customDimensions.TL_environment)
| extend componentVersion = tostring(customDimensions.TU_componentVersion)
| extend errorDetail = parse_json(tostring(customDimensions.TL_error))
| extend cause = parse_json(tostring(errorDetail.cause))
| extend causeResp = parse_json(tostring(cause.response))
| extend response = iff(causeResp != '', causeResp, parse_json(errorDetail.response))
| extend statusCode = tostring(response.status)
| extend message = tostring(errorDetail.message)
| extend responseBody = tostring(response.body)
| where statusCode == "500"
| summarize
eventCnt = count(),
uniqueArtifactCnt = dcount(artifactId),
sampleMessage = arg_max(message, timestamp),
sampleResponseBody= arg_max(responseBody, timestamp)
by environment, code, componentVersion
| order by eventCnt desc
let UXEnvironment = dynamic(['PROD']);
let _startTime = datetime(2026-06-28T00:00:00Z);
let _endTime = datetime(2026-07-05T00:00:00Z);
let totalData = cluster("pbiclients.eastus").database('appinsights').customEvents
| union cluster("pbiclientseu.northeurope").database("appinsights").customEvents
| where timestamp >= _startTime and timestamp <= _endTime
| extend customDimensions = parse_json(customDimensions)
| where customDimensions.TL_extensionName == 'DES'
| where isempty(['UXEnvironment']) or customDimensions.TL_environment in (['UXEnvironment']) or 'All Prod' in (['UXEnvironment']);
totalData
| extend aznbInstanceId = tostring(customDimensions.TU_aznbInstanceId)
| extend artifactId = tostring(customDimensions.TU_artifactId)
| where isnotempty(aznbInstanceId) or isnotempty(artifactId)
| summarize uniqueInstances = dcountif(aznbInstanceId, isnotempty(aznbInstanceId)),
uniqueNotebooks = dcountif(artifactId, isnotempty(artifactId))
by bin(timestamp, 1d)
| order by timestamp asc
let UXEnvironment = dynamic(['PROD']);
let _startTime = datetime(2026-06-28T00:00:00Z);
let _endTime = datetime(2026-07-05T00:00:00Z);
cluster("pbiclients.eastus").database('appinsights').customEvents
| union cluster("pbiclientseu.northeurope").database("appinsights").customEvents
| where timestamp >= _startTime and timestamp <= _endTime
| extend customDimensions = parse_json(customDimensions)
| where customDimensions.TL_extensionName == 'DES'
| where isempty(['UXEnvironment']) or customDimensions.TL_environment in (['UXEnvironment']) or 'All Prod' in (['UXEnvironment'])
| extend msg = tostring(customDimensions.TL_message)
| where msg startswith 'Yield save leader completed. Yield success:'
or msg == 'Failed to yield save leader'
or msg startswith 'Do not need to yield save leader'
| extend isLeader = tostring(customDimensions.TU_isLeader)
| extend collStatus = tostring(customDimensions.TU_collSessionStatus)
| extend yieldState = case(
msg == 'Yield save leader completed. Yield success: true', 'YieldSucceeded',
msg startswith 'Yield save leader completed. Yield success: false', 'YieldFailed',
msg == 'Failed to yield save leader', 'YieldFailed',
msg startswith 'Do not need to yield save leader', 'NotNeeded',
'Other')
| extend bucket = case(
yieldState == 'YieldSucceeded', 'Yield succeeded',
yieldState == 'YieldFailed', 'Yield failed',
yieldState == 'NotNeeded', strcat('Not needed (isLeader=', isLeader, ' / collStatus=', collStatus, ')'),
'Other')
| extend aznbInstanceId = tostring(customDimensions.TU_aznbInstanceId)
| extend env = tostring(customDimensions.TL_environment)
| summarize uniqueInstances = dcount(aznbInstanceId), events = count() by yieldState, bucket, env
| order by events desc
let UXEnvironment = dynamic(['PROD']);
let _startTime = datetime(2026-06-28T00:00:00Z);
let _endTime = datetime(2026-07-05T00:00:00Z);
cluster("pbiclients.eastus").database('appinsights').customEvents
| union cluster("pbiclientseu.northeurope").database("appinsights").customEvents
| where timestamp >= _startTime and timestamp <= _endTime
| extend customDimensions = parse_json(customDimensions)
| where customDimensions.TL_extensionName == 'DES'
| where isempty(['UXEnvironment']) or customDimensions.TL_environment in (['UXEnvironment']) or 'All Prod' in (['UXEnvironment'])
| extend msg = tostring(customDimensions.TL_message)
| where msg startswith 'Yield save leader completed. Yield success: false'
or msg == 'Failed to yield save leader'
| extend errorMsg = tostring(coalesce(
tostring(customDimensions.TU_errorMessage),
tostring(customDimensions.TU_error),
''))
| extend errorMsg = iff(errorMsg == '', '(no error message)', errorMsg)
| extend aznbInstanceId = tostring(customDimensions.TU_aznbInstanceId)
| extend env = tostring(customDimensions.TL_environment)
| summarize uniqueInstances = dcount(aznbInstanceId), events = count() by errorMsg, env
| order by events desc
let UXEnvironment = dynamic(['PROD']);
let _startTime = datetime(2026-06-28T00:00:00Z);
let _endTime = datetime(2026-07-05T00:00:00Z);
let yieldLeaderData = cluster("pbiclients.eastus").database('appinsights').customEvents
| union cluster("pbiclientseu.northeurope").database("appinsights").customEvents
| where timestamp >= _startTime and timestamp <= _endTime
| extend customDimensions = parse_json(customDimensions)
| where customDimensions.TL_extensionName == 'DES'
| where isempty(['UXEnvironment']) or customDimensions.TL_environment in (['UXEnvironment']) or 'All Prod' in (['UXEnvironment'])
| extend msg = tostring(customDimensions.TL_message)
| where msg == "Yield save leader completed. Yield success: true"
| extend newLeaderId = tostring(customDimensions.TU_leaderId)
| extend env = tostring(customDimensions.TL_environment)
| where newLeaderId != ''
| project yieldTimestamp = timestamp, newLeaderId, env;
let yieldLeaderIds = toscalar(yieldLeaderData | summarize make_set(newLeaderId));
let saveData = cluster("azurenb.southcentralus").database("Prod").aznbServices
| where PreciseTimeStamp >= _startTime and PreciseTimeStamp <= _endTime
| where hostName == "Trident"
| where msg == "SAVE_FAILED"
| where instanceId in (yieldLeaderIds)
| project saveTs = PreciseTimeStamp, instanceId, log;
yieldLeaderData
| join kind = inner (saveData) on $left.newLeaderId == $right.instanceId
| extend gapInSecond = datetime_diff('second', saveTs, yieldTimestamp)
| where gapInSecond > 0 and gapInSecond < 20
| extend logObj = parse_json(log)
| extend errorMsg = tostring(coalesce(tostring(logObj.ErrorMessage), tostring(logObj.message), '(no message)'))
| extend artifactId = tostring(coalesce(
tostring(logObj.ArtifactId), tostring(logObj.artifactId),
tostring(logObj.NotebookId), tostring(logObj.notebookId),
tostring(logObj.ResourceId), tostring(logObj.resourceId), ''))
| summarize failures = count(),
uniqueInstances = dcount(newLeaderId),
uniqueNotebooks = dcountif(artifactId, isnotempty(artifactId))
by errorMsg, env
| order by failures desc
let UXEnvironment = dynamic(['PROD']);
let _startTime = datetime(2026-06-28T00:00:00Z);
let _endTime = datetime(2026-07-05T00:00:00Z);
let yieldLeaderData = cluster("pbiclients.eastus").database('appinsights').customEvents
| union cluster("pbiclientseu.northeurope").database("appinsights").customEvents
| where timestamp >= _startTime and timestamp <= _endTime
| extend customDimensions = parse_json(customDimensions)
| where customDimensions.TL_extensionName == 'DES'
| where isempty(['UXEnvironment']) or customDimensions.TL_environment in (['UXEnvironment']) or 'All Prod' in (['UXEnvironment'])
| extend msg = tostring(customDimensions.TL_message)
| where msg == "Yield save leader completed. Yield success: true"
| extend newLeaderId = tostring(customDimensions.TU_leaderId)
| extend env = tostring(customDimensions.TL_environment)
| where newLeaderId != ''
| project yieldTimestamp = timestamp, newLeaderId, env;
let yieldLeaderIds = toscalar(yieldLeaderData | summarize make_set(newLeaderId));
let saveData = cluster("azurenb.southcentralus").database("Prod").aznbServices
| where PreciseTimeStamp >= _startTime and PreciseTimeStamp <= _endTime
| where hostName == "Trident"
| where msg startswith 'File version is updated to'
| where instanceId in (yieldLeaderIds)
| project saveTs = PreciseTimeStamp, instanceId, log;
yieldLeaderData
| join kind = inner (saveData) on $left.newLeaderId == $right.instanceId
| extend gapInSecond = datetime_diff('second', saveTs, yieldTimestamp)
| where gapInSecond > 0 and gapInSecond < 20
| extend logObj = parse_json(log)
| extend artifactId = tostring(coalesce(
tostring(logObj.ArtifactId), tostring(logObj.artifactId),
tostring(logObj.NotebookId), tostring(logObj.notebookId),
tostring(logObj.ResourceId), tostring(logObj.resourceId), ''))
| summarize savesSucceeded = count(),
uniqueInstances = dcount(newLeaderId),
uniqueNotebooks = dcountif(artifactId, isnotempty(artifactId))
by env
| order by savesSucceeded desc
let _componentVersion = dynamic(null);
let _endTime = datetime(2026-07-05T00:00:00Z);
let _startTime = datetime(2026-06-21T00:00:00Z);
let _tenant = dynamic(null);
cluster("azurenb.southcentralus").database("Prod").aznbServices
| where PreciseTimeStamp between (_startTime .. _endTime)
| where service == "AzNB.Client"
| where eventName contains "dataIntegrity"
| where isempty(['_componentVersion']) or componentVersion in (['_componentVersion'])
| where isempty(['_tenant']) or Tenant in (['_tenant'])
| extend timeBin = bin(PreciseTimeStamp, 1d)
| summarize instances = dcount(instanceId),
instancesWithInconsistency = dcountif(instanceId, eventName endswith "/error")
by timeBin
| extend inconsistencyRate = round(instancesWithInconsistency * 100.0 / instances, 2)
| project timestamp = timeBin, instances, instancesWithInconsistency, inconsistencyRate
| order by timestamp asc
let _componentVersion = dynamic(null);
let _endTime = datetime(2026-07-05T00:00:00Z);
let _startTime = datetime(2026-06-21T00:00:00Z);
let _tenant = dynamic(null);
cluster("azurenb.southcentralus").database("Prod").aznbServices
| where PreciseTimeStamp between (_startTime .. _endTime)
| where service == "AzNB.Client"
| where eventName endswith "dataIntegrity/error"
| where isempty(['_componentVersion']) or componentVersion in (['_componentVersion'])
| where isempty(['_tenant']) or Tenant in (['_tenant'])
| summarize occurrences = count(),
instances = dcount(instanceId),
clients = dcount(fpId)
by msg
| order by instances desc