diff --git a/Workbooks/Communication Services/Overview/Overview.workbook b/Workbooks/Communication Services/Overview/Overview.workbook
index 95acd62ed..c2bccbff7 100644
--- a/Workbooks/Communication Services/Overview/Overview.workbook
+++ b/Workbooks/Communication Services/Overview/Overview.workbook
@@ -8,115 +8,12 @@
},
"name": "general-title"
},
- {
- "type": 9,
- "content": {
- "version": "KqlParameterItem/1.0",
- "parameters": [
- {
- "id": "b1841bbb-0dec-444a-9873-ee90e6749e99",
- "version": "KqlParameterItem/1.0",
- "name": "time_range",
- "label": "Time range",
- "type": 4,
- "description": "Define a time range to aggregate logs over",
- "isRequired": true,
- "typeSettings": {
- "selectableValues": [
- {
- "durationMs": 300000
- },
- {
- "durationMs": 900000
- },
- {
- "durationMs": 1800000
- },
- {
- "durationMs": 3600000
- },
- {
- "durationMs": 14400000
- },
- {
- "durationMs": 43200000
- },
- {
- "durationMs": 86400000
- },
- {
- "durationMs": 172800000
- },
- {
- "durationMs": 259200000
- },
- {
- "durationMs": 604800000
- },
- {
- "durationMs": 1209600000
- },
- {
- "durationMs": 2419200000
- },
- {
- "durationMs": 2592000000
- },
- {
- "durationMs": 5184000000
- },
- {
- "durationMs": 7776000000
- }
- ],
- "allowCustom": true
- },
- "timeContext": {
- "durationMs": 86400000
- },
- "value": {
- "durationMs": 604800000
- }
- },
- {
- "id": "83d98c35-4d74-457c-9353-79397fcbfa81",
- "version": "KqlParameterItem/1.0",
- "name": "time_granularity",
- "label": "Time granularity",
- "type": 2,
- "description": "Choose the time granularity to use to aggregate logs",
- "isRequired": true,
- "typeSettings": {
- "additionalResourceOptions": [],
- "showDefault": false
- },
- "jsonData": "[\r\n { \"value\":\"1m\", \"label\":\"1 minute\" },\r\n { \"value\":\"10m\", \"label\":\"10 minutes\" },\r\n { \"value\":\"15m\", \"label\":\"15 minutes\" },\r\n { \"value\":\"30m\", \"label\":\"30 minutes\" },\r\n { \"value\":\"1h\", \"label\":\"1 hour\", \"selected\":true },\r\n { \"value\":\"2h\", \"label\":\"2 hours\" },\r\n { \"value\":\"12h\", \"label\":\"12 hours\" },\r\n { \"value\":\"1d\", \"label\":\"1 day\"},\r\n { \"value\":\"2d\", \"label\":\"2 days\" },\r\n { \"value\":\"3d\", \"label\":\"3 days\" },\r\n { \"value\":\"7d\", \"label\":\"1 week\" }\r\n]",
- "timeContext": {
- "durationMs": 86400000
- },
- "value": "12h"
- }
- ],
- "style": "pills",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "name": "global-params"
- },
{
"type": 11,
"content": {
"version": "LinkItem/1.0",
"style": "tabs",
"links": [
- {
- "id": "bb077035-d197-45dc-bfb4-d872a204bf47",
- "cellValue": "tab",
- "linkTarget": "parameter",
- "linkLabel": "Overview",
- "subTarget": "overview",
- "style": "link"
- },
{
"id": "666e153e-688d-4c46-aa22-958401423542",
"cellValue": "tab",
@@ -124,154 +21,11 @@
"linkLabel": "Voice and video",
"subTarget": "calling",
"style": "link"
- },
- {
- "id": "8c3e53ce-25cd-432e-b9f8-e7201f501111",
- "cellValue": "tab",
- "linkTarget": "parameter",
- "linkLabel": "Authentication",
- "subTarget": "auth",
- "style": "link"
- },
- {
- "id": "ab89abea-8f97-4f27-8c8a-42c91d71d90f",
- "cellValue": "tab",
- "linkTarget": "parameter",
- "linkLabel": "SMS",
- "subTarget": "sms",
- "style": "link"
- },
- {
- "id": "a72508b3-b261-4226-a907-06dd581cd903",
- "cellValue": "tab",
- "linkTarget": "parameter",
- "linkLabel": "Chat",
- "subTarget": "chat",
- "style": "link"
- },
- {
- "id": "bfb30085-cd9e-446d-a38e-cd39c45228a7",
- "cellValue": "tab",
- "linkTarget": "parameter",
- "linkLabel": "Email",
- "subTarget": "email",
- "style": "link"
- },
- {
- "id": "94867372-10b2-4c21-8047-627729da1556",
- "cellValue": "tab",
- "linkTarget": "parameter",
- "linkLabel": "Recording",
- "subTarget": "recording",
- "style": "link"
- },
- {
- "id": "b4317d8b-a2a3-448a-9686-9d438bbadcb8",
- "cellValue": "tab",
- "linkTarget": "parameter",
- "linkLabel": "Call Automation",
- "subTarget": "automation",
- "style": "link"
}
]
},
"name": "nav_menu"
},
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "items": [
- {
- "type": 1,
- "content": {
- "json": "The Overview tab displays counts over time of your key communications services' activity.\r\n\r\n**Click any bar in the chart to display the associated logs (note that this only works for the last bar that is clicked)**"
- },
- "name": "overview-text"
- },
- {
- "type": 9,
- "content": {
- "version": "KqlParameterItem/1.0",
- "parameters": [
- {
- "id": "0cfaad60-33d7-4643-89e3-17cb0b99eb03",
- "version": "KqlParameterItem/1.0",
- "name": "plot_type",
- "label": "Plot type",
- "type": 2,
- "description": "Select the type of plot to visualize the data",
- "isRequired": true,
- "typeSettings": {
- "additionalResourceOptions": []
- },
- "jsonData": "[\r\n {\"value\": \"columnchart\", \"label\": \"Bar chart\", \"selected\":true},\r\n {\"value\": \"areachart\", \"label\": \"Area chart\"}\r\n]",
- "timeContext": {
- "durationMs": 86400000
- }
- }
- ],
- "style": "pills",
- "queryType": 0,
- "resourceType": "Microsoft.Communication/CommunicationServices"
- },
- "name": "overview-params"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let CallStreams = ACSCallDiagnostics\r\n| join kind=inner ACSCallSummary on CorrelationId, ParticipantId, EndpointId\r\n| where CallStartTime {time_range:query}\r\n| project Timestamp=CallStartTime, Operation=tostring(\"CallStreams\");\r\n\r\nlet ChatOperations = ACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| project Timestamp=TimeGenerated, Operation=tostring(\"ChatOperations\");\r\n\r\nlet SMSOperations = ACSSMSIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| project Timestamp=TimeGenerated, Operation=tostring(\"SMSOperations\");\r\n\r\nlet AuthOperations = ACSAuthIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| project Timestamp=TimeGenerated, Operation=tostring(\"AuthOperations\");\r\n\r\nlet EmailOperations = ACSEmailStatusUpdateOperational\r\n| where TimeGenerated {time_range:query}\r\n| project Timestamp=TimeGenerated, Operation=tostring(\"EmailOperations\");\r\n\r\nlet RecordingOperations = ACSCallRecordingSummary\r\n| where TimeGenerated {time_range:query}\r\n| project Timestamp=TimeGenerated, Operation=tostring(\"RecordingOperations\");\r\n\r\nlet CallAutomationOperations = ACSCallAutomationIncomingOperations \r\n| where TimeGenerated {time_range:query}\r\n| project Timestamp=TimeGenerated, Operation=tostring(\"CallAutomationOperations\");\r\n\r\nCallStreams\r\n| union ChatOperations, SMSOperations, AuthOperations, EmailOperations, RecordingOperations, CallAutomationOperations\r\n| extend time_span = floor(Timestamp, {time_granularity})\r\n| make-series count() default=0 on Timestamp from {time_range:start} to {time_range:end} step {time_granularity} by Operation\r\n| render {plot_type}",
- "size": 0,
- "noDataMessage": "No Communication Services operations found in the specified time range",
- "exportedParameters": [
- {
- "fieldName": "series",
- "parameterName": "operation_type",
- "parameterType": 1
- },
- {
- "parameterName": "all_operations",
- "parameterType": 1
- },
- {
- "fieldName": "x",
- "parameterName": "operation_time",
- "parameterType": 1
- }
- ],
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "name": "all-operations-query"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let selected_operations = todynamic('{all_operations}');\r\n\r\nlet CallData = ACSCallDiagnostics | join kind=inner ACSCallSummary on CorrelationId, ParticipantId, EndpointId | extend OperationType = tostring(\"CallStreams\"), Timestamp = CallStartTime;\r\nlet AuthData = ACSAuthIncomingOperations | extend OperationType = tostring(\"AuthOperations\"), Timestamp = TimeGenerated;\r\nlet SMSData = ACSSMSIncomingOperations | extend OperationType = tostring(\"SMSOperations\"), Timestamp = TimeGenerated;\r\nlet ChatData = ACSChatIncomingOperations | extend OperationType = tostring(\"ChatOperations\"), Timestamp = TimeGenerated;\r\n\r\nlet AllData = CallData\r\n| union AuthData, SMSData, ChatData\r\n| where OperationType == '{operation_type}' and Timestamp between (todatetime(selected_operations.x) .. {time_granularity});\r\n\r\nlet all_cols = toscalar(AllData\r\n| extend all_cols = pack_all()\r\n| project all_cols\r\n| extend col_names = bag_keys(all_cols)\r\n| summarize make_set(col_names));\r\n\r\nlet schemas_dict = dynamic({\r\n \"CallStreams\": [\"CorrelationId\", \"CallStartTime\", \"CallType\", \"Identifier\", \"ParticipantId\", \"EndpointId\", \"EndpointType\", \"TeamsThreadId\", \"SdkVersion\", \"OsVersion\", \"ParticipantEndReason\", \"MediaType\", \"StreamId\", \"TransportType\", \"JitterAvg\", \"JitterMax\", \"RoundTripTimeAvg\", \"RoundTripTimeMax\", \"PacketLossRateAvg\", \"PacketLossRateMax\"],\r\n \"ChatOperations\": [\"TimeGenerated\", \"OperationName\", \"CorrelationId\", \"OperationVersion\", \"Category\", \"ResultType\", \"ResultSignature\", \"ResultDescription\", \"DurationMs\", \"CallerIpAddress\", \"Level\", \"URI\", \"UserId\", \"ChatThreadId\", \"ChatMessageId\", \"SdkType\", \"PlatformType\", \"Type\"],\r\n \"SMSOperations\": [\"TimeGenerated\", \"OperationName\", \"CorrelationId\", \"OperationVersion\", \"Category\", \"ResultType\", \"ResultSignature\", \"ResultDescription\", \"DurationMs\", \"CallerIpAddress\", \"Level\", \"URI\", \"OutgoingMessageLength\", \"IncomingMessageLength\", \"DeliveryAttempts\", \"PhoneNumber\", \"SdkType\", \"PlatformType\", \"Method\", \"Type\"],\r\n \"AuthOperations\": [\"TimeGenerated\", \"OperationName\", \"CorrelationId\", \"OperationVersion\", \"Category\", \"ResultType\", \"ResultSignature\", \"ResultDescription\", \"DurationMs\", \"CallerIpAddress\", \"Level\", \"URI\", \"Identity\", \"Scopes\", \"SdkType\", \"PlatformType\", \"Type\"]\r\n});\r\n\r\nlet remove_cols = set_difference(all_cols, todynamic(schemas_dict.{operation_type}));\r\n\r\nAllData\r\n| extend rec = pack_all()\r\n| project filteredRec = bag_remove_keys(rec, remove_cols)\r\n| evaluate bag_unpack(filteredRec)",
- "size": 0,
- "title": "{operation_type} logs at time {operation_time}",
- "noDataMessage": "No operations registered at the specified time",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "conditionalVisibility": {
- "parameterName": "operation_type",
- "comparison": "isNotEqualTo"
- },
- "name": "selected-operation-logs"
- }
- ]
- },
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "overview"
- },
- "name": "overview"
- },
{
"type": 12,
"content": {
@@ -285,35 +39,35 @@
"style": "tabs",
"links": [
{
- "id": "7c2f282b-4005-4f41-ab99-ed720c1e14b7",
+ "id": "8614c8ca-beb7-4cac-9766-119a196393ff",
"cellValue": "calling_tab",
"linkTarget": "parameter",
- "linkLabel": "Summary",
- "subTarget": "general",
+ "linkLabel": "Volume",
+ "subTarget": "usage",
"style": "link"
},
{
- "id": "8614c8ca-beb7-4cac-9766-119a196393ff",
+ "id": "d3577585-4db1-4c7a-9aa8-4be64b42391f",
"cellValue": "calling_tab",
"linkTarget": "parameter",
- "linkLabel": "Volume",
- "subTarget": "usage",
+ "linkLabel": "Reliability",
+ "subTarget": "reliability",
"style": "link"
},
{
- "id": "6747113b-1bd8-42f6-9b83-636e6b6a97a3",
+ "id": "da8f8260-7fe3-4f50-911c-0962829b0953",
"cellValue": "calling_tab",
"linkTarget": "parameter",
- "linkLabel": "Quality",
- "subTarget": "quality",
+ "linkLabel": "User Facing Diagnostics (UFD)",
+ "subTarget": "ufd",
"style": "link"
},
{
- "id": "91fd1f28-5f6f-4c4e-a731-2c7c61cfdf75",
+ "id": "6747113b-1bd8-42f6-9b83-636e6b6a97a3",
"cellValue": "calling_tab",
"linkTarget": "parameter",
- "linkLabel": "Details",
- "subTarget": "details",
+ "linkLabel": "Quality",
+ "subTarget": "quality",
"style": "link"
}
]
@@ -883,4651 +637,1740 @@
"groupType": "editable",
"items": [
{
- "type": 1,
- "content": {
- "json": "The Volume tab within \"Voice and video\" displays counts of calls and participants over time."
- },
- "name": "voice-video-volume-text"
- },
- {
- "type": 9,
+ "type": 12,
"content": {
- "version": "KqlParameterItem/1.0",
- "parameters": [
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "items": [
{
- "id": "d2f5dd7b-1559-4d49-aff9-d7e046049210",
- "version": "KqlParameterItem/1.0",
- "name": "usage_grouping",
- "label": "Grouping",
- "type": 2,
- "value": "by Interop",
- "typeSettings": {
- "additionalResourceOptions": [],
- "showDefault": false
+ "type": 1,
+ "content": {
+ "json": "### Volume tab displays count of calls, count of participants, and call duration over a selected time range
\nPlease note that all presented numbers in all the following visuals may be different from billing record, they are created with server and client logs, which may be prone to data loss"
},
- "jsonData": "[\r\n {\"value\": \"by Interop\", \"label\": \"Interop type\"},\r\n {\"value\": \"by CallType\", \"label\": \"Call type\"}\r\n]",
- "timeContext": {
- "durationMs": 86400000
- }
+ "name": "text - 1"
},
{
- "id": "1ca814c8-26f3-457f-9170-c41449e167a7",
- "version": "KqlParameterItem/1.0",
- "name": "duration_unit",
- "label": "Duration unit",
- "type": 2,
- "isRequired": true,
- "typeSettings": {
- "additionalResourceOptions": []
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "d7b80a34-ff1b-4a3c-bfe3-d06bd232eb39",
+ "version": "KqlParameterItem/1.0",
+ "name": "TimeRange",
+ "type": 4,
+ "description": "Define a time range to aggregate logs over",
+ "isRequired": true,
+ "typeSettings": {
+ "selectableValues": [
+ {
+ "durationMs": 300000
+ },
+ {
+ "durationMs": 900000
+ },
+ {
+ "durationMs": 1800000
+ },
+ {
+ "durationMs": 3600000
+ },
+ {
+ "durationMs": 14400000
+ },
+ {
+ "durationMs": 43200000
+ },
+ {
+ "durationMs": 86400000
+ },
+ {
+ "durationMs": 172800000
+ },
+ {
+ "durationMs": 259200000
+ },
+ {
+ "durationMs": 604800000
+ },
+ {
+ "durationMs": 1209600000
+ },
+ {
+ "durationMs": 2419200000
+ },
+ {
+ "durationMs": 2592000000
+ },
+ {
+ "durationMs": 5184000000
+ },
+ {
+ "durationMs": 7776000000
+ }
+ ],
+ "allowCustom": true
+ },
+ "value": {
+ "durationMs": 2592000000
+ },
+ "label": "Time Range"
+ },
+ {
+ "id": "290d4028-4d6b-4cf0-9ff4-ada0185f1a29",
+ "version": "KqlParameterItem/1.0",
+ "name": "time_granularity",
+ "label": "Duration Unit",
+ "type": 2,
+ "description": "Choose the time granularity to use to aggregate logs",
+ "isRequired": true,
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "jsonData": "[\n { \"value\":\"bin(CallStartTime, 1d)\", \"label\":\"Daily\" },\n { \"value\":\"startofweek(CallStartTime)\", \"label\":\"Weekly\", \"selected\":true },\n { \"value\":\"startofmonth(CallStartTime)\", \"label\":\"Monthly\" }\n]"
+ },
+ {
+ "id": "2458fec0-6d58-4ea2-ae7a-39fad43ab44d",
+ "version": "KqlParameterItem/1.0",
+ "name": "OsVersion",
+ "label": "OS Version",
+ "type": 2,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "ACSCallSummary\n| where CallStartTime {TimeRange:query}\n| extend ['OsVersion'] = case(\n OsVersion in (\"Mac OS X\", \"iOS\", \"Linux\", \"Chrome OS\"), OsVersion,\n OsVersion contains \"Windows\", \"Windows\",\n OsVersion contains 'Android', \"Android\",\n \"Others\"\n ) \n| distinct ['OsVersion']\n",
+ "typeSettings": {
+ "additionalResourceOptions": [
+ "value::all"
+ ],
+ "selectAllValue": "[]",
+ "showDefault": false
+ },
+ "defaultValue": "value::all",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices"
+ },
+ {
+ "id": "4b3eb202-c35a-4e83-b680-752180bc4b1a",
+ "version": "KqlParameterItem/1.0",
+ "name": "EndpointType",
+ "label": "Endpoint Type",
+ "type": 2,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "ACSCallSummary\n| where CallStartTime {TimeRange:query}\n| distinct EndpointType",
+ "typeSettings": {
+ "additionalResourceOptions": [
+ "value::all"
+ ],
+ "selectAllValue": "[]",
+ "showDefault": false
+ },
+ "timeContext": {
+ "durationMs": 0
+ },
+ "timeContextFromParameter": "TimeRange",
+ "defaultValue": "value::all",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "value": [
+ "value::all"
+ ]
+ },
+ {
+ "id": "dc5ee6ce-dd74-4ca9-a73c-afa365a7269a",
+ "version": "KqlParameterItem/1.0",
+ "name": "ParticipantType",
+ "label": "Participant Type",
+ "type": 2,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "ACSCallSummary\r\n| where CallStartTime {TimeRange:query}\r\n| extend ['ACS Participant Type'] = case(\r\n ParticipantType contains \"ACS\", \"ACS\",\r\n ParticipantType contains \"Teams\", \"Teams\",\r\n ParticipantType == 'PSTN', \"PSTN\",\r\n \"Others\"\r\n ) \r\n| distinct ['ACS Participant Type']",
+ "typeSettings": {
+ "additionalResourceOptions": [
+ "value::all"
+ ],
+ "selectAllValue": "[]",
+ "showDefault": false
+ },
+ "defaultValue": "value::all",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices"
+ },
+ {
+ "id": "8225b239-1816-43ff-b363-649f09327faf",
+ "version": "KqlParameterItem/1.0",
+ "name": "SdkVersion",
+ "label": "SDK Version",
+ "type": 2,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "ACSCallClientOperations\n| where TimeGenerated {TimeRange:query}\n| extend SdkVersion = replace_regex(SdkVersion, @'_.*$', '')\n| distinct SdkVersion\n",
+ "typeSettings": {
+ "additionalResourceOptions": [
+ "value::all"
+ ],
+ "selectAllValue": "[]",
+ "showDefault": false
+ },
+ "defaultValue": "value::all",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices"
+ },
+ {
+ "id": "80153e7c-bd17-4d61-baea-bf5963c86540",
+ "version": "KqlParameterItem/1.0",
+ "name": "CallType",
+ "label": "Call Type",
+ "type": 2,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "ACSCallSummary\n| where CallStartTime {TimeRange:query}\n| distinct CallType",
+ "typeSettings": {
+ "additionalResourceOptions": [
+ "value::all"
+ ],
+ "selectAllValue": "[]",
+ "showDefault": false
+ },
+ "defaultValue": "value::all",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices"
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices"
},
- "jsonData": "[\r\n { \"value\":\"1\", \"label\":\"Seconds\" },\r\n { \"value\":\"60\", \"label\":\"Minutes\", \"selected\":true },\r\n { \"value\":\"3600\", \"label\":\"Hours\" },\r\n { \"value\":\"86400\", \"label\":\"Days\" }\r\n]"
- }
- ],
- "style": "pills",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "name": "voice-video-volume-params"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSCallSummary\r\n| distinct CorrelationId, TeamsThreadId, CallStartTime, CallType, CallDuration\r\n//| extend Interop=iff(isnull(TeamsThreadId), \"ACS\", \"Teams Interop\") // Current data might not have the right null format\r\n| extend Interop=iff(isempty(TeamsThreadId), \"ACS\", \"Teams Interop\")\r\n| make-series time_seconds=toreal(sum(CallDuration)) / {duration_unit} default=0 on CallStartTime from {time_range:start} to {time_range:end} step {time_granularity} {usage_grouping}",
- "size": 0,
- "title": "Calling time in {duration_unit:label} {usage_grouping}",
- "noDataMessage": "No calls found in the specified time range",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "visualization": "barchart"
- },
- "customWidth": "50",
- "name": "voice-video-volume-calls"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSCallSummary\r\n| distinct CorrelationId, TeamsThreadId, CallStartTime, CallType, ParticipantId, ParticipantDuration, EndpointId, Identifier\r\n//| extend Interop=iff(isnull(TeamsThreadId), \"ACS\", \"Teams Interop\")\r\n| extend Interop=iff(Identifier startswith \"acs:\", \"ACS\", \"Teams Interop\")\r\n| make-series time_seconds=toreal(sum(ParticipantDuration)) / {duration_unit} default=0 on CallStartTime from {time_range:start} to {time_range:end} step {time_granularity} {usage_grouping}",
- "size": 0,
- "title": "Participant calling time in {duration_unit:label} {usage_grouping}",
- "noDataMessage": "No participant found in the specified time range",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "visualization": "barchart"
- },
- "customWidth": "50",
- "name": "voice-video-volume-participants"
- }
- ]
- },
- "conditionalVisibility": {
- "parameterName": "calling_tab",
- "comparison": "isEqualTo",
- "value": "usage"
- },
- "name": "voice-video-volume"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Call drill-down",
- "items": [
- {
- "type": 1,
- "content": {
- "json": "The Details tab within \"Voice and video\" displays an expandable view of individual calls, broken down to the participant and stream level, with duration and quality metrics.\r\n\r\nTo easily detect problematic calls and participants, the following icons denote specific situations:\r\n- 🛑 indicates a failed participant end reason\r\n- 🚩 indicates a call with at least one stream with unhealthy telemetry values\r\n- 🔀 marks Teams interop calls or participants\r\n- 📞 marks a call that consists entirely of Azure Communication Services (ACS)\r\n\r\nTo search for a specific call, enter the callId below. Note this will be overidden if a callId is selected from the table below."
- },
- "name": "details_info"
- },
- {
- "type": 9,
- "content": {
- "version": "KqlParameterItem/1.0",
- "parameters": [
+ "name": "parameters - volumwe"
+ },
{
- "id": "229e2b8b-5dec-4ec1-b939-49933f704eb7",
- "version": "KqlParameterItem/1.0",
- "name": "call_id",
- "label": "Search by Call Id ",
- "type": 2,
- "description": "Enter a Call Id to show more details below",
- "query": "ACSCallDiagnostics\r\n| join kind=inner ACSCallSummary on CorrelationId, ParticipantId, EndpointId\r\n| where CallStartTime {time_range:query}\r\n| distinct CorrelationId\r\n| project-rename callId = CorrelationId",
- "typeSettings": {
- "additionalResourceOptions": []
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "ACSCallSummary\r\n| summarize ['Total call']=count_distinct(CorrelationId)",
+ "size": 1,
+ "title": "Total number of calls",
+ "noDataMessage": "No volume logs found in the specified time range",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "visualization": "stat",
+ "tileSettings": {
+ "titleContent": {
+ "columnMatch": "Count"
+ },
+ "showBorder": false,
+ "size": "auto"
+ }
},
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "value": null
- }
- ],
- "style": "formHorizontal",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "customWidth": "20",
- "name": "search_by_callId"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let summaryOfLegs = \r\nACSCallDiagnostics\r\n| join kind=inner ACSCallSummary on CorrelationId, ParticipantId, EndpointId\r\n| where CallStartTime {time_range:query} \r\n| summarize take_any(EndpointType) by Identifier, CorrelationId;\r\nlet typeCount = summaryOfLegs | summarize count() by EndpointType, CorrelationId\r\n| extend info = strcat(count_, ' ', EndpointType) | summarize summaryInfo = make_list(info, 100) by CorrelationId | extend user_info = strcat_array(summaryInfo, ', ');\r\nlet totalNumOfUser = summaryOfLegs | summarize Count = count() by CorrelationId;\r\nACSCallDiagnostics\r\n| join kind=inner ACSCallSummary on CorrelationId, ParticipantId, EndpointId\r\n| where CallStartTime {time_range:query}\r\n| order by CallStartTime asc, ParticipantStartTime asc\r\n| extend CallDate=strcat(\"📅\", format_datetime(CallStartTime, 'MM/dd/y'))\r\n| extend CallTime=format_datetime(CallStartTime, 'hh:mm:ss')\r\n| extend UnsuccessfulEndReason = iff((ParticipantEndReason startswith \"0\") or (ParticipantEndReason startswith \"2\"), \"\", \"🛑\")\r\n| extend InteropType = iff(isempty(TeamsThreadId), \"📞 ACS call\", \"🔀 Teams interop\")\r\n| extend JitterQuality = iff(JitterAvg > 30, \"Poor\", \"Good\")\r\n| extend PacketLossRateQuality = iff(PacketLossRateAvg > 0.1, \"Poor\", \"Good\")\r\n| extend RoundTripTimeQuality = iff(RoundTripTimeAvg > 500, \"Poor\", \"Good\")\r\n| extend StreamQuality = iff((JitterQuality == \"Poor\") or (PacketLossRateQuality == \"Poor\") or (RoundTripTimeQuality == \"Poor\"), \"🚩\", \"\")\r\n| extend CallLabel = strcat(UnsuccessfulEndReason, \" \", StreamQuality)\r\n| extend CallEndTime = CallStartTime + totimespan(strcat(tostring(CallDuration), 's'))\r\n| summarize arg_max(CallLabel, *) by CorrelationId\r\n| project CallDate, InteropType, CallLabel, CorrelationId, CallStartTime, CallEndTime\r\n| join kind=inner totalNumOfUser on CorrelationId\r\n| join kind=inner typeCount on CorrelationId\r\n| project CallDate, InteropType, CallLabel, CallId = CorrelationId, CallStartTime, CallEndTime, [\"Total Number of Users\"] = Count, [\"User Type Breakdown\"] = user_info",
- "size": 0,
- "noDataMessage": "No calls found for the specified time range",
- "exportFieldName": "CallId",
- "exportParameterName": "call_id",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Group",
- "formatter": 1
+ "customWidth": "33",
+ "name": "call_volume"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "ACSCallSummary\r\n| summarize ['Total']=count_distinct(ParticipantId)",
+ "size": 1,
+ "title": "Total number of participants",
+ "noDataMessage": "No volume logs found in the specified time range",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "visualization": "stat",
+ "tileSettings": {
+ "titleContent": {
+ "columnMatch": "Count"
+ },
+ "showBorder": false,
+ "size": "auto"
+ }
},
- {
- "columnMatch": "CallDate",
- "formatter": 5
+ "customWidth": "33",
+ "name": "participant_volume"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "ACSCallSummary\r\n| summarize sum(ParticipantDuration)/60",
+ "size": 1,
+ "title": "Total Duration for all participants (minute)",
+ "noDataMessage": "No volume logs found in the specified time range",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "visualization": "stat",
+ "tileSettings": {
+ "titleContent": {
+ "columnMatch": "Column1"
+ },
+ "showBorder": false,
+ "size": "auto"
+ }
},
- {
- "columnMatch": "CallLabel",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "CallDate"
- ],
- "expandTopLevel": true,
- "finalBy": "CallLabel"
- }
- }
- },
- "customWidth": "100",
- "name": "call_ids"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let SIPCodes = datatable(ParticipantEndReason: string, SIPCode: string, Troubleshooting: string)\r\n[\r\n \"0\", \"Success\", \"\",\r\n \"100\", \"Trying\", \"\",\r\n \"180\", \"Ringing\", \"\",\r\n \"181\", \"Call Is Being Forwarded\", \"\",\r\n \"182\", \"Queued\", \"\",\r\n \"183\", \"Session Progress\", \"\",\r\n \"199\", \"Early Dialog Terminated\", \"\",\r\n \"200\", \"Success\", \"\",\r\n \"202\", \"Accepted\", \"\",\r\n \"204\", \"No Notification\", \"\",\r\n \"300\", \"Multiple Choices\", \"\",\r\n \"301\", \"Moved Permanently\", \"\",\r\n \"302\", \"Moved Temporarily\", \"\",\r\n \"305\", \"Use Proxy\", \"\",\r\n \"380\", \"Alternative Service\", \"\",\r\n \"400\", \"Bad Request\", \"\",\r\n \"401\", \"Unauthorized\", \"\",\r\n \"402\", \"Payment Required\", \"\",\r\n \"403\", \"Forbidden / Authentication failure\", \"Ensure that your Communication Services token is valid and not expired.\",\r\n \"404\", \"Call not found\", \"Ensure that the number you're calling (or call you're joining) exists.\",\r\n \"405\", \"Method Not Allowed\", \"\",\r\n \"406\", \"Not Acceptable\", \"\",\r\n \"407\", \"Proxy Authentication Required\", \"\",\r\n \"408\", \"Call controller timed out\", \"Call Controller timed out waiting for protocol messages from user endpoints. Ensure clients are connected and available.\",\r\n \"409\", \"Conflict\", \"\",\r\n \"410\", \"Local media stack or media infrastructure error\", \"Ensure that you're using the latest SDK in a supported environment.\",\r\n \"411\", \"Length Required\", \"\",\r\n \"412\", \"Conditional Request Failed\", \"\",\r\n \"413\", \"Request Entity Too Large\", \"\",\r\n \"414\", \"Request-URI Too Large\", \"\",\r\n \"415\", \"Unsupported Media Type\", \"\",\r\n \"416\", \"Unsupported URI Scheme\", \"\",\r\n \"417\", \"Unknown Resource-Priority\", \"\",\r\n \"420\", \"Bad Extension\", \"\",\r\n \"421\", \"Extension Required\", \"\",\r\n \"422\", \"Session Interval Too Small\", \"\",\r\n \"423\", \"Interval Too Brief\", \"\",\r\n \"424\", \"Bad Location Information\", \"\",\r\n \"428\", \"Use Identity Header\", \"\",\r\n \"429\", \"Provide Referrer Identity\", \"\",\r\n \"430\", \"Unable to deliver message to client application\", \"Ensure that the client application is running and available.\",\r\n \"433\", \"Anonymity Disallowed\", \"\",\r\n \"436\", \"Bad Identity-Info\", \"\",\r\n \"437\", \"Unsupported Certificate\", \"\",\r\n \"438\", \"Invalid Identity Header\", \"\",\r\n \"439\", \"First Hop Lacks Outbound Support\", \"\",\r\n \"440\", \"Max-Breadth Exceeded\", \"\",\r\n \"469\", \"Bad Info Package\", \"\",\r\n \"470\", \"Consent Needed\", \"\",\r\n \"480\", \"Remote client endpoint not registered\", \"Ensure that the remote endpoint is available.\",\r\n \"481\", \"Failed to handle incoming call\", \"File a support request through the Azure portal.\",\r\n \"482\", \"Loop Detected\", \"\",\r\n \"483\", \"Too Many Hops\", \"\",\r\n \"484\", \"Address Incomplete\", \"\",\r\n \"485\", \"Ambiguous\", \"\",\r\n \"486\", \"Busy Here\", \"\",\r\n \"487\", \"Call canceled, locally declined, ended due to an endpoint mismatch issue, or failed to generate media offer\", \"Expected behavior.\",\r\n \"488\", \"Not Acceptable Here\", \"\",\r\n \"489\", \"Bad Event\", \"\",\r\n \"490\", \"Local endpoint network issues\", \"Check your network.\",\r\n \"491\", \"Local endpoint network issues\", \"Check your network.\",\r\n \"493\", \"Undecipherable\", \"\",\r\n \"494\", \"Security Agreement Required\", \"\",\r\n \"496\", \"Local endpoint network issues\", \"Check your network.\",\r\n \"497\", \"Local endpoint network issues\", \"Check your network.\",\r\n \"498\", \"Local endpoint network issues\", \"Check your network.\",\r\n \"500\", \"Communication Services infrastructure error\", \"File a support request through the Azure portal.\",\r\n \"501\", \"Not Implemented\", \"\",\r\n \"502\", \"Bad Gateway\", \"\",\r\n \"503\", \"Communication Services infrastructure error\", \"File a support request through the Azure portal.\",\r\n \"504\", \"Communication Services infrastructure error\", \"File a support request through the Azure portal.\",\r\n \"505\", \"Version Not Supported\", \"\",\r\n \"513\", \"Message Too Large\", \"\",\r\n \"555\", \"Push Notification Service Not Supported\", \"\",\r\n \"580\", \"Precondition Failure\", \"\",\r\n \"600\", \"Busy Everywhere\", \"\",\r\n \"603\", \"Call globally declined by remote Communication Services participant\", \"Expected behavior.\",\r\n \"604\", \"Does Not Exist Anywhere\", \"\",\r\n \"606\", \"Not Acceptable\", \"\",\r\n \"607\", \"Unwanted\", \"\",\r\n \"608\", \"Rejected\", \"\",\r\n];\r\nACSCallDiagnostics\r\n| where CorrelationId == \"{call_id}\"\r\n| join kind=inner ACSCallSummary on CorrelationId, ParticipantId, EndpointId\r\n| join kind=leftouter SIPCodes on ParticipantEndReason\r\n| extend EndReason=strcat(ParticipantEndReason, \": \", SIPCode)\r\n| extend UnsuccessfulEndReason = iff((ParticipantEndReason startswith \"0\") or (ParticipantEndReason startswith \"2\"), \"\", \"🛑\")\r\n| extend EndpointType = case( indexof(EndpointType, \"VoIP\") != -1, strcat(\"🗣️ \", EndpointType),\r\n indexof(EndpointType, \"PSTN\") != -1, strcat(\"📞 \", EndpointType),\r\n indexof(EndpointType, \"Bot\") != -1, strcat(\"🤖 \", EndpointType),\r\n indexof(EndpointType, \"Server\") != -1, strcat(\"🖥️ \", EndpointType),\r\n indexof(EndpointType, \"Unknown\") != -1, strcat(\"👽 \", EndpointType),\r\n EndpointType\r\n )\r\n| extend JitterQuality = iff(JitterAvg > 30, \"Poor\", \"Good\")\r\n| extend PacketLossRateQuality = iff(PacketLossRateAvg > 0.1, \"Poor\", \"Good\")\r\n| extend RoundTripTimeQuality = iff(RoundTripTimeAvg > 500, \"Poor\", \"Good\")\r\n| extend StreamQuality = iff((JitterQuality == \"Poor\") or (PacketLossRateQuality == \"Poor\") or (RoundTripTimeQuality == \"Poor\"), \"🚩\", \"\")\r\n| extend ParticipantId = iff(isnotempty(ParticipantId) and ParticipantId != CorrelationId, ParticipantId, strcat(\"Endpoint ID:\", EndpointId))\r\n| extend Participant = strcat(EndpointType, \" (\", ParticipantType, \") \", UnsuccessfulEndReason, \" \", StreamQuality)\r\n| extend ParticipantEndTime = ParticipantStartTime + totimespan(strcat(tostring(ParticipantDuration), 's'))\r\n| project CallId = CorrelationId, Participant, ParticipantId, EndReason, Identifier, ParticipantStartTime, ParticipantEndTime, ParticipantDuration, TransportType\r\n| summarize ParticipantStartTime = min(ParticipantStartTime), ParticipantEndTime = max(ParticipantEndTime),\r\nParticipantDuration = max(ParticipantDuration), Participant = max(Participant), EndReason = max(EndReason), TransportType = any(TransportType)\r\n by ParticipantId, CallId, Identifier\r\n| sort by ParticipantStartTime asc, Identifier asc\r\n| extend User = row_rank_dense(Identifier)\r\n| project User, ParticipantType=Participant, ParticipantId, EndReason, TransportType, ParticipantStartTime, ParticipantEndTime, ParticipantDuration",
- "size": 0,
- "title": "Participant details for call {call_id}",
- "noDataMessage": "Enter a callId in the search bar or select a call from the top table to visualize its details",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "EndReason",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "startsWith",
- "thresholdValue": "2",
- "representation": "success",
- "text": "{0}{1}"
- },
- {
- "operator": "startsWith",
- "thresholdValue": "0",
- "representation": "success",
- "text": "{0}{1}"
- },
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "error",
- "text": "{0}{1}"
+ "customWidth": "33",
+ "name": "total_call_duration"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let callType_selection = dynamic([{CallType}]);\r\nlet endpointType_selection = dynamic([{EndpointType}]);\r\nlet ParticipantType_selection = dynamic([{ParticipantType}]);\r\nlet OsVersion_selection = dynamic([{OsVersion}]);\r\nlet SdkVersion_selection = dynamic([{SdkVersion}]);\r\nACSCallSummary\r\n| extend ['ACS Participant Type'] = case(\r\n ParticipantType contains \"ACS\", \"ACS\",\r\n ParticipantType contains \"Teams\", \"Teams\",\r\n ParticipantType == 'PSTN', \"PSTN\",\r\n \"Others\"\r\n )\r\n| extend ['OsVersion'] = case(\r\n OsVersion in (\"Mac OS X\", \"iOS\", \"Linux\", \"Chrome OS\"), OsVersion,\r\n OsVersion contains \"Windows\", \"Windows\",\r\n OsVersion contains 'Android', \"Android\",\r\n \"Others\"\r\n )\r\n| where array_length(callType_selection) == 0 or CallType in (callType_selection)\r\n| where array_length(endpointType_selection) == 0 or EndpointType in (endpointType_selection)\r\n| where array_length(ParticipantType_selection) == 0 or ['ACS Participant Type'] in (ParticipantType_selection) \r\n| where array_length(OsVersion_selection) == 0 or ['OsVersion'] in (OsVersion_selection) \r\n| where array_length(SdkVersion_selection) == 0 or SdkVersion in (SdkVersion_selection) \r\n| summarize calls=dcount(CorrelationId), participants=dcount(ParticipantId) by {time_granularity}",
+ "size": 0,
+ "aggregation": 3,
+ "title": "{time_granularity:label} call and participant volume over time",
+ "noDataMessage": "No volume logs found in the specified time range",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "visualization": "linechart",
+ "chartSettings": {
+ "xAxis": "Column1",
+ "showLegend": true,
+ "showDataPoints": true,
+ "xSettings": {
+ "dateFormatSettings": {
+ "formatName": "shortDatePattern",
+ "showUtcTime": true
}
- ]
+ },
+ "ySettings": {
+ "label": "count"
+ }
}
},
- {
- "columnMatch": "ParticipantDuration",
- "formatter": 19,
- "formatOptions": {
- "palette": "bluePurple",
- "timelineSettings": {
- "timelineStartColumn": "ParticipantStartTime"
+ "customWidth": "100",
+ "name": "call_volume_timeseries"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let callType_selection = dynamic([{CallType}]);\r\nlet endpointType_selection = dynamic([{EndpointType}]);\r\nlet ParticipantType_selection = dynamic([{ParticipantType}]);\r\nlet OsVersion_selection = dynamic([{OsVersion}]);\r\nlet SdkVersion_selection = dynamic([{SdkVersion}]);\r\nACSCallSummary\r\n| extend ['ACS Participant Type'] = case(\r\n ParticipantType contains \"ACS\", \"ACS\",\r\n ParticipantType contains \"Teams\", \"Teams\",\r\n ParticipantType == 'PSTN', \"PSTN\",\r\n \"Others\"\r\n )\r\n| extend ['OsVersion'] = case(\r\n OsVersion in (\"Mac OS X\", \"iOS\", \"Linux\", \"Chrome OS\"), OsVersion,\r\n OsVersion contains \"Windows\", \"Windows\",\r\n OsVersion contains 'Android', \"Android\",\r\n \"Others\"\r\n )\r\n| where array_length(callType_selection) == 0 or CallType in (callType_selection)\r\n| where array_length(endpointType_selection) == 0 or EndpointType in (endpointType_selection)\r\n| where array_length(ParticipantType_selection) == 0 or ['ACS Participant Type'] in (ParticipantType_selection) \r\n| where array_length(OsVersion_selection) == 0 or ['OsVersion'] in (OsVersion_selection) \r\n| where array_length(SdkVersion_selection) == 0 or SdkVersion in (SdkVersion_selection)\r\n| summarize call_duration=avg(CallDuration)/60 by {time_granularity}\r\n",
+ "size": 0,
+ "aggregation": 3,
+ "title": "{time_granularity:label} avg call duration (minute) over time",
+ "noDataMessage": "No volume logs found in the specified time range",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "visualization": "linechart",
+ "chartSettings": {
+ "xAxis": "Column1",
+ "yAxis": [
+ "call_duration"
+ ],
+ "showDataPoints": true,
+ "xSettings": {
+ "dateFormatSettings": {
+ "formatName": "shortDatePattern",
+ "showUtcTime": true
+ }
},
- "customColumnWidthSetting": "100ch"
- },
- "numberFormat": {
- "unit": 24,
- "options": {
- "style": "decimal",
- "useGrouping": false,
- "maximumFractionDigits": 0
+ "ySettings": {
+ "label": "count"
}
}
},
- {
- "columnMatch": "Group",
- "formatter": 1
- }
- ]
- }
- },
- "conditionalVisibility": {
- "parameterName": "call_id",
- "comparison": "isNotEqualTo"
- },
- "name": "participant-details"
- },
- {
- "type": 1,
- "content": {
- "json": "Streams are classified as healthy if they exhibit telemetry values within the following ranges:\r\n\r\n- Round trip time under 500 milliseconds\r\n- Packet loss rate of less than 10%\r\n- Jitter under 30 milliseconds"
- },
- "conditionalVisibility": {
- "parameterName": "call_id",
- "comparison": "isNotEqualTo"
- },
- "name": "steam-health-classification"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let SIPCodes = datatable(ParticipantEndReason: string, SIPCode: string, Troubleshooting: string)\r\n[\r\n \"0\", \"Success\", \"\",\r\n \"100\", \"Trying\", \"\",\r\n \"180\", \"Ringing\", \"\",\r\n \"181\", \"Call Is Being Forwarded\", \"\",\r\n \"182\", \"Queued\", \"\",\r\n \"183\", \"Session Progress\", \"\",\r\n \"199\", \"Early Dialog Terminated\", \"\",\r\n \"200\", \"Success\", \"\",\r\n \"202\", \"Accepted\", \"\",\r\n \"204\", \"No Notification\", \"\",\r\n \"300\", \"Multiple Choices\", \"\",\r\n \"301\", \"Moved Permanently\", \"\",\r\n \"302\", \"Moved Temporarily\", \"\",\r\n \"305\", \"Use Proxy\", \"\",\r\n \"380\", \"Alternative Service\", \"\",\r\n \"400\", \"Bad Request\", \"\",\r\n \"401\", \"Unauthorized\", \"\",\r\n \"402\", \"Payment Required\", \"\",\r\n \"403\", \"Forbidden / Authentication failure\", \"Ensure that your Communication Services token is valid and not expired.\",\r\n \"404\", \"Call not found\", \"Ensure that the number you're calling (or call you're joining) exists.\",\r\n \"405\", \"Method Not Allowed\", \"\",\r\n \"406\", \"Not Acceptable\", \"\",\r\n \"407\", \"Proxy Authentication Required\", \"\",\r\n \"408\", \"Call controller timed out\", \"Call Controller timed out waiting for protocol messages from user endpoints. Ensure clients are connected and available.\",\r\n \"409\", \"Conflict\", \"\",\r\n \"410\", \"Local media stack or media infrastructure error\", \"Ensure that you're using the latest SDK in a supported environment.\",\r\n \"411\", \"Length Required\", \"\",\r\n \"412\", \"Conditional Request Failed\", \"\",\r\n \"413\", \"Request Entity Too Large\", \"\",\r\n \"414\", \"Request-URI Too Large\", \"\",\r\n \"415\", \"Unsupported Media Type\", \"\",\r\n \"416\", \"Unsupported URI Scheme\", \"\",\r\n \"417\", \"Unknown Resource-Priority\", \"\",\r\n \"420\", \"Bad Extension\", \"\",\r\n \"421\", \"Extension Required\", \"\",\r\n \"422\", \"Session Interval Too Small\", \"\",\r\n \"423\", \"Interval Too Brief\", \"\",\r\n \"424\", \"Bad Location Information\", \"\",\r\n \"428\", \"Use Identity Header\", \"\",\r\n \"429\", \"Provide Referrer Identity\", \"\",\r\n \"430\", \"Unable to deliver message to client application\", \"Ensure that the client application is running and available.\",\r\n \"433\", \"Anonymity Disallowed\", \"\",\r\n \"436\", \"Bad Identity-Info\", \"\",\r\n \"437\", \"Unsupported Certificate\", \"\",\r\n \"438\", \"Invalid Identity Header\", \"\",\r\n \"439\", \"First Hop Lacks Outbound Support\", \"\",\r\n \"440\", \"Max-Breadth Exceeded\", \"\",\r\n \"469\", \"Bad Info Package\", \"\",\r\n \"470\", \"Consent Needed\", \"\",\r\n \"480\", \"Remote client endpoint not registered\", \"Ensure that the remote endpoint is available.\",\r\n \"481\", \"Failed to handle incoming call\", \"File a support request through the Azure portal.\",\r\n \"482\", \"Loop Detected\", \"\",\r\n \"483\", \"Too Many Hops\", \"\",\r\n \"484\", \"Address Incomplete\", \"\",\r\n \"485\", \"Ambiguous\", \"\",\r\n \"486\", \"Busy Here\", \"\",\r\n \"487\", \"Call canceled, locally declined, ended due to an endpoint mismatch issue, or failed to generate media offer\", \"Expected behavior.\",\r\n \"488\", \"Not Acceptable Here\", \"\",\r\n \"489\", \"Bad Event\", \"\",\r\n \"490\", \"Local endpoint network issues\", \"Check your network.\",\r\n \"491\", \"Local endpoint network issues\", \"Check your network.\",\r\n \"493\", \"Undecipherable\", \"\",\r\n \"494\", \"Security Agreement Required\", \"\",\r\n \"496\", \"Local endpoint network issues\", \"Check your network.\",\r\n \"497\", \"Local endpoint network issues\", \"Check your network.\",\r\n \"498\", \"Local endpoint network issues\", \"Check your network.\",\r\n \"500\", \"Communication Services infrastructure error\", \"File a support request through the Azure portal.\",\r\n \"501\", \"Not Implemented\", \"\",\r\n \"502\", \"Bad Gateway\", \"\",\r\n \"503\", \"Communication Services infrastructure error\", \"File a support request through the Azure portal.\",\r\n \"504\", \"Communication Services infrastructure error\", \"File a support request through the Azure portal.\",\r\n \"505\", \"Version Not Supported\", \"\",\r\n \"513\", \"Message Too Large\", \"\",\r\n \"555\", \"Push Notification Service Not Supported\", \"\",\r\n \"580\", \"Precondition Failure\", \"\",\r\n \"600\", \"Busy Everywhere\", \"\",\r\n \"603\", \"Call globally declined by remote Communication Services participant\", \"Expected behavior.\",\r\n \"604\", \"Does Not Exist Anywhere\", \"\",\r\n \"606\", \"Not Acceptable\", \"\",\r\n \"607\", \"Unwanted\", \"\",\r\n \"608\", \"Rejected\", \"\",\r\n];\r\nACSCallDiagnostics\r\n| where CorrelationId == \"{call_id}\"\r\n| join kind=inner ACSCallSummary on CorrelationId, ParticipantId, EndpointId\r\n| join kind=leftouter SIPCodes on ParticipantEndReason\r\n| extend EndReason=strcat(ParticipantEndReason, \": \", SIPCode)\r\n| extend UnsuccessfulEndReason = iff((ParticipantEndReason startswith \"0\") or (ParticipantEndReason startswith \"2\"), \"\", \"🛑\")\r\n| extend EndpointType = case( indexof(EndpointType, \"VoIP\") != -1, strcat(\"🗣️ \", EndpointType),\r\n indexof(EndpointType, \"PSTN\") != -1, strcat(\"📞 \", EndpointType),\r\n indexof(EndpointType, \"Bot\") != -1, strcat(\"🤖 \", EndpointType),\r\n indexof(EndpointType, \"Server\") != -1, strcat(\"🖥️ \", EndpointType),\r\n indexof(EndpointType, \"Unknown\") != -1, strcat(\"👽 \", EndpointType),\r\n EndpointType\r\n )\r\n| extend JitterQuality = iff(JitterAvg > 30, \"Poor\", \"Good\")\r\n| extend PacketLossRateQuality = iff(PacketLossRateAvg > 0.1, \"Poor\", \"Good\")\r\n| extend RoundTripTimeQuality = iff(RoundTripTimeAvg > 500, \"Poor\", \"Good\")\r\n| extend StreamQuality = iff((JitterQuality == \"Poor\") or (PacketLossRateQuality == \"Poor\") or (RoundTripTimeQuality == \"Poor\"), \"🚩\", \"\")\r\n| extend ParticipantId = iff(isnotempty(ParticipantId) and ParticipantId != CorrelationId, ParticipantId, strcat(\"Endpoint ID:\", EndpointId))\r\n| extend Participant = strcat(EndpointType, \" (\", ParticipantType, \") \", UnsuccessfulEndReason, \" \", \" (\", ParticipantId, \")\")\r\n| extend ParticipantEndTime = ParticipantStartTime + totimespan(strcat(tostring(ParticipantDuration), 's'))\r\n| extend MediaType = case( indexof(MediaType, \"Audio\") != -1, strcat(\"🔊 \", MediaType),\r\n indexof(MediaType, \"Video\") != -1, strcat(\"🎥 \", MediaType),\r\n indexof(MediaType, \"VBSS\") != -1, strcat(\"💻 \", MediaType),\r\n indexof(MediaType, \"AppSharing\") != -1, strcat(\"📲 \", MediaType),\r\n MediaType\r\n )\r\n| extend MediaType = strcat(MediaType, \" \", StreamQuality)\r\n| sort by ParticipantStartTime asc, Identifier asc\r\n| extend User = row_rank_dense(Identifier)\r\n| project Participant, MediaType, User, EndReason, StreamId, JitterAvg, PacketLossRateAvg, RoundTripTimeAvg\r\n| summarize JitterAvg=take_any(JitterAvg), PacketLossRateAvg=take_any(PacketLossRateAvg), RoundTripTimeAvg=take_any(RoundTripTimeAvg) \r\nby Participant, MediaType, User, EndReason, StreamId\r\n| project-away StreamId\r\n",
- "size": 0,
- "title": "Stream details for call {call_id}",
- "noDataMessage": "Enter a callId in the search bar or select a call from the top table to visualize its details",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Group",
- "formatter": 1
- },
- {
- "columnMatch": "Participant",
- "formatter": 5
- },
- {
- "columnMatch": "MediaType",
- "formatter": 5
+ "customWidth": "100",
+ "name": "call_duration_timeseries"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let callType_selection = dynamic([{CallType}]);\r\nlet endpointType_selection = dynamic([{EndpointType}]);\r\nlet ParticipantType_selection = dynamic([{ParticipantType}]);\r\nlet OsVersion_selection = dynamic([{OsVersion}]);\r\nlet SdkVersion_selection = dynamic([{SdkVersion}]);\r\nACSCallSummary\r\n| extend ['ACS Participant Type'] = case(\r\n ParticipantType contains \"ACS\", \"ACS\",\r\n ParticipantType contains \"Teams\", \"Teams\",\r\n ParticipantType == 'PSTN', \"PSTN\",\r\n \"Others\"\r\n )\r\n| extend ['OsVersion'] = case(\r\n OsVersion in (\"Mac OS X\", \"iOS\", \"Linux\", \"Chrome OS\"), OsVersion,\r\n OsVersion contains \"Windows\", \"Windows\",\r\n OsVersion contains 'Android', \"Android\",\r\n \"Others\"\r\n )\r\n| where array_length(callType_selection) == 0 or CallType in (callType_selection)\r\n| where EndpointType == \"VoIP\"\r\n| where array_length(ParticipantType_selection) == 0 or ['ACS Participant Type'] in (ParticipantType_selection) \r\n| where array_length(OsVersion_selection) == 0 or ['OsVersion'] in (OsVersion_selection) \r\n| where array_length(SdkVersion_selection) == 0 or SdkVersion in (SdkVersion_selection)\r\n| summarize \r\n ['Minimum']=round(min(CallDuration)/60,2),\r\n ['Average']=round(avg(CallDuration)/60,2),\r\n ['Maximum']=round(max(CallDuration)/60,2),\r\n //(p50, p90, p95)=percentiles(CallDuration, 50,90,95),\r\n ['Number of Calls']=dcount(CorrelationId) \r\n by Identifier\r\n| extend Identifier = coalesce(Identifier, Identifier, \"Redacted\")\r\n| top 30 by ['Number of Calls'] desc\r\n",
+ "size": 0,
+ "title": "Top 30 VoIP users by average call duration (minute)",
+ "noDataMessage": "No volume logs found in the specified time range",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "gridSettings": {
+ "formatters": [
+ {
+ "columnMatch": "Number of Calls",
+ "formatter": 3,
+ "formatOptions": {
+ "palette": "blue"
+ }
+ }
+ ],
+ "rowLimit": 30
+ },
+ "sortBy": []
},
- {
- "columnMatch": "User",
- "formatter": 1
+ "customWidth": "100",
+ "name": "top 30 users by average"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "### Number of Participant breakdown"
},
- {
- "columnMatch": "EndReason",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "startsWith",
- "thresholdValue": "0",
- "representation": "success",
- "text": "{0}{1}"
- },
- {
- "operator": "startsWith",
- "thresholdValue": "2",
- "representation": "success",
- "text": "{0}{1}"
+ "name": "text - 18"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let callType_selection = dynamic([{CallType}]);\r\nlet endpointType_selection = dynamic([{EndpointType}]);\r\nlet ParticipantType_selection = dynamic([{ParticipantType}]);\r\nlet OsVersion_selection = dynamic([{OsVersion}]);\r\nlet SdkVersion_selection = dynamic([{SdkVersion}]);\r\nACSCallSummary\r\n| extend ['ACS Participant Type'] = case(\r\n ParticipantType contains \"ACS\", \"ACS\",\r\n ParticipantType contains \"Teams\", \"Teams\",\r\n ParticipantType == 'PSTN', \"PSTN\",\r\n \"Others\"\r\n )\r\n| extend ['OsVersion'] = case(\r\n OsVersion in (\"Mac OS X\", \"iOS\", \"Linux\", \"Chrome OS\"), OsVersion,\r\n OsVersion contains \"Windows\", \"Windows\",\r\n OsVersion contains 'Android', \"Android\",\r\n \"Others\"\r\n )\r\n| where array_length(callType_selection) == 0 or CallType in (callType_selection)\r\n| where EndpointType == \"VoIP\"\r\n| where array_length(ParticipantType_selection) == 0 or ['ACS Participant Type'] in (ParticipantType_selection) \r\n| where array_length(OsVersion_selection) == 0 or ['OsVersion'] in (OsVersion_selection) \r\n| where array_length(SdkVersion_selection) == 0 or SdkVersion in (SdkVersion_selection)\r\n| summarize dcount(ParticipantId) by SdkVersion\r\n",
+ "size": 1,
+ "title": "SDK Version with VoIP",
+ "noDataMessage": "No volume logs found in the specified time range",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "visualization": "piechart",
+ "tileSettings": {
+ "showBorder": false,
+ "titleContent": {
+ "columnMatch": "ParticipantType",
+ "formatter": 1
+ },
+ "leftContent": {
+ "columnMatch": "dcount_ParticipantId",
+ "formatter": 12,
+ "formatOptions": {
+ "palette": "auto"
},
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "error",
- "text": "{0}{1}"
+ "numberFormat": {
+ "unit": 17,
+ "options": {
+ "maximumSignificantDigits": 3,
+ "maximumFractionDigits": 2
+ }
}
- ]
+ }
}
},
- {
- "columnMatch": "JitterAvg",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "colors",
- "thresholdsGrid": [
- {
- "operator": ">",
- "thresholdValue": "30",
- "representation": "redBright",
- "text": "{0}{1}"
+ "customWidth": "50",
+ "name": "SDK Version"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let callType_selection = dynamic([{CallType}]);\r\nlet endpointType_selection = dynamic([{EndpointType}]);\r\nlet ParticipantType_selection = dynamic([{ParticipantType}]);\r\nlet OsVersion_selection = dynamic([{OsVersion}]);\r\nlet SdkVersion_selection = dynamic([{SdkVersion}]);\r\nACSCallSummary\r\n| extend ['ACS Participant Type'] = case(\r\n ParticipantType contains \"ACS\", \"ACS\",\r\n ParticipantType contains \"Teams\", \"Teams\",\r\n ParticipantType == 'PSTN', \"PSTN\",\r\n \"Others\"\r\n )\r\n| extend ['OsVersion'] = case(\r\n OsVersion in (\"Mac OS X\", \"iOS\", \"Linux\", \"Chrome OS\"), OsVersion,\r\n OsVersion contains \"Windows\", \"Windows\",\r\n OsVersion contains 'Android', \"Android\",\r\n \"Others\"\r\n )\r\n| where array_length(callType_selection) == 0 or CallType in (callType_selection)\r\n| where array_length(endpointType_selection) == 0 or EndpointType in (endpointType_selection)\r\n| where array_length(ParticipantType_selection) == 0 or ['ACS Participant Type'] in (ParticipantType_selection) \r\n| where array_length(OsVersion_selection) == 0 or ['OsVersion'] in (OsVersion_selection) \r\n| where array_length(SdkVersion_selection) == 0 or SdkVersion in (SdkVersion_selection)\r\n| extend Interop=iff(isempty(TeamsThreadId), \"ACS\", \"Teams Interop\")\r\n| summarize dcount(ParticipantId) by Interop\r\n",
+ "size": 1,
+ "title": "ACS/Teams Interop",
+ "noDataMessage": "No volume logs found in the specified time range",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "visualization": "piechart",
+ "tileSettings": {
+ "showBorder": false,
+ "titleContent": {
+ "columnMatch": "ParticipantType",
+ "formatter": 1
+ },
+ "leftContent": {
+ "columnMatch": "dcount_ParticipantId",
+ "formatter": 12,
+ "formatOptions": {
+ "palette": "auto"
},
- {
- "operator": "Default",
- "thresholdValue": null,
- "text": "{0}{1}"
+ "numberFormat": {
+ "unit": 17,
+ "options": {
+ "maximumSignificantDigits": 3,
+ "maximumFractionDigits": 2
+ }
}
- ]
+ }
}
},
- {
- "columnMatch": "PacketLossRateAvg",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "colors",
- "thresholdsGrid": [
- {
- "operator": ">",
- "thresholdValue": ".1",
- "representation": "redBright",
- "text": "{0}{1}"
+ "customWidth": "50",
+ "name": "ACS/Teams Interop"
+ },
+ {
+ "type": 11,
+ "content": {
+ "version": "LinkItem/1.0",
+ "style": "list",
+ "links": [
+ {
+ "id": "08cdd6fe-b50c-445a-9e26-ad95103ab2c1",
+ "linkTarget": "CopilotNudge",
+ "linkLabel": "Ask Copilot about ACS SDK",
+ "style": "primary",
+ "copilotNudgeActionSettings": {
+ "nudgeContent": "Under 'Calling SDK overview' learn document, give me an overview on ACS calling SDK? Under 'What's new in Azure Communication Services' learn document, what are the latest features in the latest ACS calling SDK version? Can you also provide JavaScript commands to upgrade to the latest ACS calling SDK version?"
+ }
+ }
+ ]
+ },
+ "customWidth": "50",
+ "name": "call type copilot button - Copy"
+ },
+ {
+ "type": 11,
+ "content": {
+ "version": "LinkItem/1.0",
+ "style": "list",
+ "links": [
+ {
+ "id": "71e8c70f-269e-4cef-808a-c160cd62fa55",
+ "linkTarget": "CopilotNudge",
+ "linkLabel": "Ask Copilot about ACS/Interop",
+ "style": "primary",
+ "copilotNudgeActionSettings": {
+ "nudgeContent": "What is Teams interoperability in Azure Communication Services? How is it different from ACS? What are its benefits?"
+ }
+ }
+ ]
+ },
+ "customWidth": "50",
+ "name": "call type copilot button - Copy"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let callType_selection = dynamic([{CallType}]);\r\nlet endpointType_selection = dynamic([{EndpointType}]);\r\nlet ParticipantType_selection = dynamic([{ParticipantType}]);\r\nlet OsVersion_selection = dynamic([{OsVersion}]);\r\nlet SdkVersion_selection = dynamic([{SdkVersion}]);\r\nACSCallSummary\r\n| extend ['ACS Participant Type'] = case(\r\n ParticipantType contains \"ACS\", \"ACS\",\r\n ParticipantType contains \"Teams\", \"Teams\",\r\n ParticipantType == 'PSTN', \"PSTN\",\r\n \"Others\"\r\n )\r\n| extend ['OsVersion'] = case(\r\n OsVersion in (\"Mac OS X\", \"iOS\", \"Linux\", \"Chrome OS\"), OsVersion,\r\n OsVersion contains \"Windows\", \"Windows\",\r\n OsVersion contains 'Android', \"Android\",\r\n \"Others\"\r\n )\r\n| summarize dcount(ParticipantId) by ['ACS Participant Type']",
+ "size": 1,
+ "title": "ACS Participant Type",
+ "noDataMessage": "No volume logs found in the specified time range",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "visualization": "piechart",
+ "tileSettings": {
+ "showBorder": false,
+ "titleContent": {
+ "columnMatch": "ParticipantType",
+ "formatter": 1
+ },
+ "leftContent": {
+ "columnMatch": "dcount_ParticipantId",
+ "formatter": 12,
+ "formatOptions": {
+ "palette": "auto"
},
- {
- "operator": "Default",
- "thresholdValue": null,
- "text": "{0}{1}"
+ "numberFormat": {
+ "unit": 17,
+ "options": {
+ "maximumSignificantDigits": 3,
+ "maximumFractionDigits": 2
+ }
}
- ]
+ }
}
},
- {
- "columnMatch": "RoundTripTimeAvg",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "colors",
- "thresholdsGrid": [
- {
- "operator": ">",
- "thresholdValue": "500",
- "representation": "redBright",
- "text": "{0}{1}"
+ "customWidth": "50",
+ "name": "participant_type"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let callType_selection = dynamic([{CallType}]);\r\nlet endpointType_selection = dynamic([{EndpointType}]);\r\nlet ParticipantType_selection = dynamic([{ParticipantType}]);\r\nlet OsVersion_selection = dynamic([{OsVersion}]);\r\nlet SdkVersion_selection = dynamic([{SdkVersion}]);\r\nACSCallSummary\r\n| extend ['ACS Participant Type'] = case(\r\n ParticipantType contains \"ACS\", \"ACS\",\r\n ParticipantType contains \"Teams\", \"Teams\",\r\n ParticipantType == 'PSTN', \"PSTN\",\r\n \"Others\"\r\n )\r\n| extend ['OsVersion'] = case(\r\n OsVersion in (\"Mac OS X\", \"iOS\", \"Linux\", \"Chrome OS\"), OsVersion,\r\n OsVersion contains \"Windows\", \"Windows\",\r\n OsVersion contains 'Android', \"Android\",\r\n \"Others\"\r\n )\r\n| where array_length(callType_selection) == 0 or CallType in (callType_selection)\r\n| where array_length(endpointType_selection) == 0 or EndpointType in (endpointType_selection)\r\n| where array_length(ParticipantType_selection) == 0 or ['ACS Participant Type'] in (ParticipantType_selection) \r\n| where array_length(OsVersion_selection) == 0 or ['OsVersion'] in (OsVersion_selection) \r\n| where array_length(SdkVersion_selection) == 0 or SdkVersion in (SdkVersion_selection)\r\n| summarize dcount(ParticipantId) by CallType\r\n",
+ "size": 1,
+ "title": "Call Type",
+ "noDataMessage": "No volume logs found in the specified time range",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "visualization": "piechart",
+ "tileSettings": {
+ "showBorder": false,
+ "titleContent": {
+ "columnMatch": "ParticipantType",
+ "formatter": 1
+ },
+ "leftContent": {
+ "columnMatch": "dcount_ParticipantId",
+ "formatter": 12,
+ "formatOptions": {
+ "palette": "auto"
},
+ "numberFormat": {
+ "unit": 17,
+ "options": {
+ "maximumSignificantDigits": 3,
+ "maximumFractionDigits": 2
+ }
+ }
+ }
+ }
+ },
+ "customWidth": "50",
+ "name": "Call Type"
+ },
+ {
+ "type": 11,
+ "content": {
+ "version": "LinkItem/1.0",
+ "style": "list",
+ "links": [
+ {
+ "id": "3e0f02ef-9a82-4487-8f38-f9c3e3ff5f91",
+ "linkTarget": "CopilotNudge",
+ "linkLabel": "Ask Copilot about participant type",
+ "style": "primary",
+ "copilotNudgeActionSettings": {
+ "nudgeContent": "What is the difference among participant type in Azure communication services? what is ACS, teams, and PSTN?"
+ }
+ }
+ ]
+ },
+ "customWidth": "50",
+ "name": "call type copilot button - Copy - Copy"
+ },
+ {
+ "type": 11,
+ "content": {
+ "version": "LinkItem/1.0",
+ "style": "list",
+ "links": [
+ {
+ "id": "ee796005-1214-4324-b4f4-fce09fea7221",
+ "linkTarget": "CopilotNudge",
+ "linkLabel": "Ask Copilot about call type",
+ "style": "primary",
+ "copilotNudgeActionSettings": {
+ "nudgeContent": "what is call type in azure communication services and what is the difference between Group and P2P call type?"
+ }
+ }
+ ]
+ },
+ "customWidth": "50",
+ "name": "call type copilot button"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let callType_selection = dynamic([{CallType}]);\r\nlet endpointType_selection = dynamic([{EndpointType}]);\r\nlet ParticipantType_selection = dynamic([{ParticipantType}]);\r\nlet OsVersion_selection = dynamic([{OsVersion}]);\r\nlet SdkVersion_selection = dynamic([{SdkVersion}]);\r\nACSCallSummary\r\n| extend ['ACS Participant Type'] = case(\r\n ParticipantType contains \"ACS\", \"ACS\",\r\n ParticipantType contains \"Teams\", \"Teams\",\r\n ParticipantType == 'PSTN', \"PSTN\",\r\n \"Others\"\r\n )\r\n| extend ['OsVersion'] = case(\r\n OsVersion in (\"Mac OS X\", \"iOS\", \"Linux\", \"Chrome OS\"), OsVersion,\r\n OsVersion contains \"Windows\", \"Windows\",\r\n OsVersion contains 'Android', \"Android\",\r\n \"Others\"\r\n )\r\n| where array_length(callType_selection) == 0 or CallType in (callType_selection)\r\n| where array_length(endpointType_selection) == 0 or EndpointType in (endpointType_selection)\r\n| where array_length(ParticipantType_selection) == 0 or ['ACS Participant Type'] in (ParticipantType_selection) \r\n| where array_length(OsVersion_selection) == 0 or ['OsVersion'] in (OsVersion_selection) \r\n| where array_length(SdkVersion_selection) == 0 or SdkVersion in (SdkVersion_selection)\r\n| summarize dcount(ParticipantId) by EndpointType",
+ "size": 1,
+ "title": "Endpoint Type",
+ "noDataMessage": "No volume logs found in the specified time range",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "visualization": "piechart"
+ },
+ "customWidth": "50",
+ "name": "endpoint_type"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let callType_selection = dynamic([{CallType}]);\r\nlet endpointType_selection = dynamic([{EndpointType}]);\r\nlet ParticipantType_selection = dynamic([{ParticipantType}]);\r\nlet OsVersion_selection = dynamic([{OsVersion}]);\r\nlet SdkVersion_selection = dynamic([{SdkVersion}]);\r\nACSCallSummary\r\n| extend ['ACS Participant Type'] = case(\r\n ParticipantType contains \"ACS\", \"ACS\",\r\n ParticipantType contains \"Teams\", \"Teams\",\r\n ParticipantType == 'PSTN', \"PSTN\",\r\n \"Others\"\r\n )\r\n| extend ['OsVersion'] = case(\r\n OsVersion in (\"Mac OS X\", \"iOS\", \"Linux\", \"Chrome OS\"), OsVersion,\r\n OsVersion contains \"Windows\", \"Windows\",\r\n OsVersion contains 'Android', \"Android\",\r\n \"Others\"\r\n )\r\n| where array_length(callType_selection) == 0 or CallType in (callType_selection)\r\n| where array_length(endpointType_selection) == 0 or EndpointType in (endpointType_selection)\r\n| where array_length(ParticipantType_selection) == 0 or ['ACS Participant Type'] in (ParticipantType_selection) \r\n| where array_length(OsVersion_selection) == 0 or ['OsVersion'] in (OsVersion_selection) \r\n| where array_length(SdkVersion_selection) == 0 or SdkVersion in (SdkVersion_selection)\r\n| summarize dcount(ParticipantId) by ['OsVersion']\r\n",
+ "size": 1,
+ "title": "OS Version",
+ "noDataMessage": "No volume logs found in the specified time range",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "visualization": "piechart",
+ "gridSettings": {
+ "sortBy": [
{
- "operator": "Default",
- "thresholdValue": null,
- "text": "{0}{1}"
+ "itemKey": "dcount_ParticipantId",
+ "sortOrder": 2
}
]
+ },
+ "sortBy": [
+ {
+ "itemKey": "dcount_ParticipantId",
+ "sortOrder": 2
+ }
+ ],
+ "tileSettings": {
+ "showBorder": false,
+ "titleContent": {
+ "columnMatch": "ParticipantType",
+ "formatter": 1
+ },
+ "leftContent": {
+ "columnMatch": "dcount_ParticipantId",
+ "formatter": 12,
+ "formatOptions": {
+ "palette": "auto"
+ },
+ "numberFormat": {
+ "unit": 17,
+ "options": {
+ "maximumSignificantDigits": 3,
+ "maximumFractionDigits": 2
+ }
+ }
+ }
}
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "Participant"
- ],
- "expandTopLevel": true,
- "finalBy": "MediaType"
+ },
+ "customWidth": "50",
+ "name": "OS Version"
}
- }
- },
- "conditionalVisibility": {
- "parameterName": "call_id",
- "comparison": "isNotEqualTo"
+ ]
},
- "name": "stream-details"
+ "name": "Volume"
}
]
},
"conditionalVisibility": {
"parameterName": "calling_tab",
"comparison": "isEqualTo",
- "value": "details"
+ "value": "usage"
},
- "name": "call-drill-down"
- }
- ]
- },
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "calling"
- },
- "name": "call_quality"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "items": [
- {
- "type": 1,
- "content": {
- "json": "The following visualizations represent data from the Authentication Operational logs.\r\n\r\n**Click on any part of the pie charts below to visualize filtered logs.**"
- },
- "name": "auth-text"
+ "name": "voice-video-volume"
},
{
"type": 12,
"content": {
"version": "NotebookGroup/1.0",
"groupType": "editable",
- "title": "Authentication API Results",
"items": [
{
- "type": 3,
+ "type": 1,
"content": {
- "version": "KqlItem/1.0",
- "query": "ACSAuthIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| summarize count() by ResultType\r\n| render piechart",
- "size": 0,
- "noDataMessage": "No authentication operations found in the specified time range",
- "exportMultipleValues": true,
- "exportedParameters": [
- {
- "fieldName": "series",
- "parameterName": "auth_result",
- "parameterType": 1
- }
- ],
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
+ "json": "# Calling SDK Reliability
\nPlease note that all presented numbers in all the following visuals may be different from billing record, they are created with server and client logs, which may be prone to data loss"
},
- "name": "auth-result-types"
+ "name": "text - 6"
},
{
- "type": 3,
+ "type": 12,
"content": {
- "version": "KqlItem/1.0",
- "query": "let SIPCodesAuth = datatable(ResultSignature: string, SIPCode: string)\r\n[\r\n \"0\", \"Success\",\r\n \"100\", \"Trying\",\r\n \"180\", \"Ringing\",\r\n \"181\", \"Call Is Being Forwarded\",\r\n \"182\", \"Queued\",\r\n \"183\", \"Session Progress\",\r\n \"199\", \"Early Dialog Terminated\",\r\n \"200\", \"Success\",\r\n \"202\", \"Accepted\",\r\n \"204\", \"No Notification\",\r\n \"300\", \"Multiple Choices\",\r\n \"301\", \"Moved Permanently\",\r\n \"302\", \"Moved Temporarily\",\r\n \"305\", \"Use Proxy\",\r\n \"380\", \"Alternative Service\",\r\n \"400\", \"Bad Request\",\r\n \"401\", \"Unauthorized\",\r\n \"402\", \"Payment Required\",\r\n \"403\", \"Forbidden\",\r\n \"404\", \"Not Found\",\r\n \"405\", \"Method Not Allowed\",\r\n \"406\", \"Not Acceptable\",\r\n \"407\", \"Proxy Authentication Required\",\r\n \"408\", \"Request Timeout\",\r\n \"409\", \"Conflict\",\r\n \"410\", \"Gone\",\r\n \"411\", \"Length Required\",\r\n \"412\", \"Conditional Request Failed\",\r\n \"413\", \"Request Entity Too Large\",\r\n \"414\", \"Request-URI Too Large\",\r\n \"415\", \"Unsupported Media Type\",\r\n \"416\", \"Unsupported URI Scheme\",\r\n \"417\", \"Unknown Resource-Priority\",\r\n \"420\", \"Bad Extension\",\r\n \"421\", \"Extension Required\",\r\n \"422\", \"Session Interval Too Small\",\r\n \"423\", \"Interval Too Brief\",\r\n \"424\", \"Bad Location Information\",\r\n \"428\", \"Use Identity Header\",\r\n \"429\", \"Provide Referrer Identity\",\r\n \"430\", \"Flow Failed\",\r\n \"433\", \"Anonymity Disallowed\",\r\n \"436\", \"Bad Identity-Info\",\r\n \"437\", \"Unsupported Certificate\",\r\n \"438\", \"Invalid Identity Header\",\r\n \"439\", \"First Hop Lacks Outbound Support\",\r\n \"440\", \"Max-Breadth Exceeded\",\r\n \"469\", \"Bad Info Package\",\r\n \"470\", \"Consent Needed\",\r\n \"480\", \"Temporarily Unavailable\",\r\n \"481\", \"Call/Transaction Does Not Exist\",\r\n \"482\", \"Loop Detected\",\r\n \"483\", \"Too Many Hops\",\r\n \"484\", \"Address Incomplete\",\r\n \"485\", \"Ambiguous\",\r\n \"486\", \"Busy Here\",\r\n \"487\", \"Request Terminated\",\r\n \"488\", \"Not Acceptable Here\",\r\n \"489\", \"Bad Event\",\r\n \"491\", \"Request Pending\",\r\n \"493\", \"Undecipherable\",\r\n \"494\", \"Security Agreement Required\",\r\n \"500\", \"Internal Server Error\",\r\n \"501\", \"Not Implemented\",\r\n \"502\", \"Bad Gateway\",\r\n \"503\", \"Service Unavailable\",\r\n \"504\", \"Server Time-out\",\r\n \"505\", \"Version Not Supported\",\r\n \"513\", \"Message Too Large\",\r\n \"555\", \"Push Notification Service Not Supported\",\r\n \"580\", \"Precondition Failure\",\r\n \"600\", \"Busy Everywhere\",\r\n \"603\", \"Decline\",\r\n \"604\", \"Does Not Exist Anywhere\",\r\n \"606\", \"Not Acceptable\",\r\n \"607\", \"Unwanted\",\r\n \"608\", \"Rejected\",\r\n];\r\n\r\nlet other_auth_results = ACSAuthIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| summarize operation_count=count() by ResultType\r\n| order by operation_count desc\r\n| extend Rank=row_number()\r\n| where Rank > 5\r\n| project ResultType;\r\n\r\nACSAuthIncomingOperations\r\n| where TimeGenerated {time_range:query} and (ResultType in (dynamic([{auth_result}])) or iff(\"Other\" in (dynamic([{auth_result}])), (ResultType in (other_auth_results)), false))\r\n| join kind=leftouter SIPCodesAuth on ResultSignature\r\n| extend OperationDate=strcat(\"📅\", format_datetime(TimeGenerated, 'MM/dd/y'))\r\n| extend OperationTime=format_datetime(TimeGenerated, 'hh:mm:ss')\r\n| extend ResultIcon=iff(ResultType == \"Succeeded\", \"✔️\", \"❌\")\r\n| extend Result=strcat(ResultIcon, \" \", ResultSignature, \": \", SIPCode)\r\n| order by TimeGenerated\r\n| project OperationName, Level, Result, OperationDate, OperationTime, DurationMs\r\n",
- "size": 0,
- "title": "Authentication operations with result type {auth_result}",
- "noDataMessage": "No authentication operations found for the specified time range and result type",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "items": [
+ {
+ "type": 1,
+ "content": {
+ "json": "## Select Scenario by choosing one from the select box to display detail breakdown. Ask Copilot for assistance in SubCode table\n\n"
+ },
+ "name": "text - 0"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "Scenarios are common actions executed by users in the application. They are measured by correlating an attempt and an outcome of an API call on the SDK. For example, 'Accept Incoming Call' reflects the success rate of calling the accept() API on the IncomingCall object exposed by the SDK. A successful API call is one that returns a result categorized either as Success or ExpectedError. Categorization is made based on 'ResultCategory' . ",
+ "style": "info"
+ },
+ "name": "reliability explanation"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "__Please note that this is estimated reliability and may not be accurate due to data loss. We are continuing to improve the categorization of errors__"
+ },
+ "name": "reliability explanation - Copy"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "7ba0f6c1-8f8c-447a-b616-25e6f748fc7e",
+ "version": "KqlParameterItem/1.0",
+ "name": "TimeRange",
+ "label": "Time Range",
+ "type": 4,
+ "description": "Define a time range to aggregate logs over",
+ "isRequired": true,
+ "typeSettings": {
+ "selectableValues": [
+ {
+ "durationMs": 300000
+ },
+ {
+ "durationMs": 900000
+ },
+ {
+ "durationMs": 1800000
+ },
+ {
+ "durationMs": 3600000
+ },
+ {
+ "durationMs": 14400000
+ },
+ {
+ "durationMs": 43200000
+ },
+ {
+ "durationMs": 86400000
+ },
+ {
+ "durationMs": 172800000
+ },
+ {
+ "durationMs": 259200000
+ },
+ {
+ "durationMs": 604800000
+ },
+ {
+ "durationMs": 1209600000
+ },
+ {
+ "durationMs": 2419200000
+ },
+ {
+ "durationMs": 2592000000
+ },
+ {
+ "durationMs": 5184000000
+ },
+ {
+ "durationMs": 7776000000
+ }
+ ],
+ "allowCustom": true
},
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
+ "value": {
+ "durationMs": 172800000
}
- ]
- }
- },
- {
- "columnMatch": "OperationDate",
- "formatter": 5
+ },
+ {
+ "id": "8caaee6d-fdf7-450f-bcdf-7625dbfc35b8",
+ "version": "KqlParameterItem/1.0",
+ "name": "time_granularity",
+ "label": "Duration Unit",
+ "type": 2,
+ "description": "Choose the time granularity to use to aggregate logs",
+ "isRequired": true,
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "jsonData": "[\n { \"value\":\"bin(timestampBin,startofday(timestampBin))\", \"label\":\"Daily\" },\n { \"value\":\"bin(timestampBin,startofweek(timestampBin))\", \"label\":\"Weekly\", \"selected\":true },\n { \"value\":\"bin(timestampBin,startofmonth(timestampBin))\", \"label\":\"Monthly\" }\n]"
+ },
+ {
+ "id": "53b00664-18c3-4e34-bec9-27924025b70f",
+ "version": "KqlParameterItem/1.0",
+ "name": "MetricName",
+ "label": "API Scenario",
+ "type": 2,
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "jsonData": "[\n { \"value\":\"\", \"label\":\"All\", \"selected\": true},\n { \"value\":\"reliability/api/StartCall\", \"label\":\"StartCall\"},\n { \"value\":\"reliability/api/AcceptIncomingCall\", \"label\":\"AcceptIncomingCall\" },\n { \"value\":\"reliability/api/Join\", \"label\":\"Join\" },\n { \"value\":\"reliability/api/StartVideo\", \"label\":\"StartVideo\" },\n { \"value\":\"reliability/api/StopVideo\", \"label\":\"StopVideo\" },\n { \"value\":\"reliability/api/StartScreenShare\", \"label\":\"StartScreenShare\" },\n { \"value\":\"reliability/api/StopScreenShare\", \"label\":\"StopScreenShare\" },\n { \"value\":\"reliability/api/CreateView\", \"label\":\"CreateView\" }\n]"
+ },
+ {
+ "id": "0dd3bc0b-27e6-42ad-ad84-6656d7b8d7db",
+ "version": "KqlParameterItem/1.0",
+ "name": "SDKVersion",
+ "label": "SDK Version",
+ "type": 2,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "ACSCallClientOperations\n| where CallClientTimeStamp {TimeRange:query}\n| distinct SdkVersion",
+ "typeSettings": {
+ "additionalResourceOptions": [
+ "value::all"
+ ],
+ "selectAllValue": "[]",
+ "showDefault": false
+ },
+ "timeContext": {
+ "durationMs": 2419200000
+ },
+ "timeContextFromParameter": "TimeRange",
+ "defaultValue": "value::all",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices"
+ },
+ {
+ "id": "964c0df4-718d-471f-8cca-0c18d3518f29",
+ "version": "KqlParameterItem/1.0",
+ "name": "platform",
+ "label": "SDK Platform",
+ "type": 2,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "ACSCallClientOperations\n| where CallClientTimeStamp {TimeRange:query}\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| where isnotempty(Platform)\n| distinct Platform",
+ "typeSettings": {
+ "additionalResourceOptions": [
+ "value::all"
+ ],
+ "selectAllValue": "[]",
+ "showDefault": false
+ },
+ "timeContext": {
+ "durationMs": 2419200000
+ },
+ "timeContextFromParameter": "TimeRange",
+ "defaultValue": "value::all",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices"
+ },
+ {
+ "id": "a2405bed-9f8e-43b9-b8d9-7959d21770f7",
+ "version": "KqlParameterItem/1.0",
+ "name": "ResultType",
+ "label": "Result Category",
+ "type": 2,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "let clean_result_type = (result_type:string) {\n case (\n result_type contains 'Success' or result_type contains \"Succeeded\",\n 'Succeeded',\n result_type contains 'ExpectedError',\n 'ExpectedError',\n result_type contains 'UnexpectedServerError',\n 'UnexpectedServerError',\n 'UnexpectedClientError'\n )\n};\nACSCallClientOperations\n| where CallClientTimeStamp {TimeRange:query}\n| extend ResultType = clean_result_type(ResultType)\n| distinct ResultType",
+ "typeSettings": {
+ "additionalResourceOptions": [
+ "value::all"
+ ],
+ "selectAllValue": "[]",
+ "showDefault": false
+ },
+ "timeContext": {
+ "durationMs": 2419200000
+ },
+ "timeContextFromParameter": "TimeRange",
+ "defaultValue": "value::all",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices"
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices"
},
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- }
- },
- "sortBy": []
- },
- "conditionalVisibility": {
- "parameterName": "auth_result",
- "comparison": "isNotEqualTo"
- },
- "name": "auth-by-result"
- }
- ]
- },
- "customWidth": "50",
- "name": "auth-results-group"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Authentication API Result Signatures",
- "items": [
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let SIPCodesAuth = datatable(ResultSignature: string, SIPCode: string)\r\n[\r\n \"0\", \"Success\",\r\n \"100\", \"Trying\",\r\n \"180\", \"Ringing\",\r\n \"181\", \"Call Is Being Forwarded\",\r\n \"182\", \"Queued\",\r\n \"183\", \"Session Progress\",\r\n \"199\", \"Early Dialog Terminated\",\r\n \"200\", \"Success\",\r\n \"202\", \"Accepted\",\r\n \"204\", \"No Notification\",\r\n \"300\", \"Multiple Choices\",\r\n \"301\", \"Moved Permanently\",\r\n \"302\", \"Moved Temporarily\",\r\n \"305\", \"Use Proxy\",\r\n \"380\", \"Alternative Service\",\r\n \"400\", \"Bad Request\",\r\n \"401\", \"Unauthorized\",\r\n \"402\", \"Payment Required\",\r\n \"403\", \"Forbidden\",\r\n \"404\", \"Not Found\",\r\n \"405\", \"Method Not Allowed\",\r\n \"406\", \"Not Acceptable\",\r\n \"407\", \"Proxy Authentication Required\",\r\n \"408\", \"Request Timeout\",\r\n \"409\", \"Conflict\",\r\n \"410\", \"Gone\",\r\n \"411\", \"Length Required\",\r\n \"412\", \"Conditional Request Failed\",\r\n \"413\", \"Request Entity Too Large\",\r\n \"414\", \"Request-URI Too Large\",\r\n \"415\", \"Unsupported Media Type\",\r\n \"416\", \"Unsupported URI Scheme\",\r\n \"417\", \"Unknown Resource-Priority\",\r\n \"420\", \"Bad Extension\",\r\n \"421\", \"Extension Required\",\r\n \"422\", \"Session Interval Too Small\",\r\n \"423\", \"Interval Too Brief\",\r\n \"424\", \"Bad Location Information\",\r\n \"428\", \"Use Identity Header\",\r\n \"429\", \"Provide Referrer Identity\",\r\n \"430\", \"Flow Failed\",\r\n \"433\", \"Anonymity Disallowed\",\r\n \"436\", \"Bad Identity-Info\",\r\n \"437\", \"Unsupported Certificate\",\r\n \"438\", \"Invalid Identity Header\",\r\n \"439\", \"First Hop Lacks Outbound Support\",\r\n \"440\", \"Max-Breadth Exceeded\",\r\n \"469\", \"Bad Info Package\",\r\n \"470\", \"Consent Needed\",\r\n \"480\", \"Temporarily Unavailable\",\r\n \"481\", \"Call/Transaction Does Not Exist\",\r\n \"482\", \"Loop Detected\",\r\n \"483\", \"Too Many Hops\",\r\n \"484\", \"Address Incomplete\",\r\n \"485\", \"Ambiguous\",\r\n \"486\", \"Busy Here\",\r\n \"487\", \"Request Terminated\",\r\n \"488\", \"Not Acceptable Here\",\r\n \"489\", \"Bad Event\",\r\n \"491\", \"Request Pending\",\r\n \"493\", \"Undecipherable\",\r\n \"494\", \"Security Agreement Required\",\r\n \"500\", \"Internal Server Error\",\r\n \"501\", \"Not Implemented\",\r\n \"502\", \"Bad Gateway\",\r\n \"503\", \"Service Unavailable\",\r\n \"504\", \"Server Time-out\",\r\n \"505\", \"Version Not Supported\",\r\n \"513\", \"Message Too Large\",\r\n \"555\", \"Push Notification Service Not Supported\",\r\n \"580\", \"Precondition Failure\",\r\n \"600\", \"Busy Everywhere\",\r\n \"603\", \"Decline\",\r\n \"604\", \"Does Not Exist Anywhere\",\r\n \"606\", \"Not Acceptable\",\r\n \"607\", \"Unwanted\",\r\n \"608\", \"Rejected\",\r\n];\r\n\r\nACSAuthIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n//| summarize count() by ResultSignature\r\n| join kind=leftouter SIPCodesAuth on ResultSignature\r\n| extend ResultIcon=iff(ResultType == \"Succeeded\", \"✔️\", \"❌\")\r\n| extend Result=strcat(ResultIcon, \" \", ResultSignature, \": \", SIPCode)\r\n| summarize count() by Result//Signature\r\n| render piechart",
- "size": 0,
- "noDataMessage": "No authentication operations found in the specified time range",
- "exportMultipleValues": true,
- "exportedParameters": [
+ "name": "reliability parameter"
+ },
{
- "fieldName": "series",
- "parameterName": "auth_signature",
- "parameterType": 1
- }
- ],
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "name": "auth-results-signature"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let SIPCodesAuth = datatable(ResultSignature: string, SIPCode: string)\r\n[\r\n \"0\", \"Success\",\r\n \"100\", \"Trying\",\r\n \"180\", \"Ringing\",\r\n \"181\", \"Call Is Being Forwarded\",\r\n \"182\", \"Queued\",\r\n \"183\", \"Session Progress\",\r\n \"199\", \"Early Dialog Terminated\",\r\n \"200\", \"Success\",\r\n \"202\", \"Accepted\",\r\n \"204\", \"No Notification\",\r\n \"300\", \"Multiple Choices\",\r\n \"301\", \"Moved Permanently\",\r\n \"302\", \"Moved Temporarily\",\r\n \"305\", \"Use Proxy\",\r\n \"380\", \"Alternative Service\",\r\n \"400\", \"Bad Request\",\r\n \"401\", \"Unauthorized\",\r\n \"402\", \"Payment Required\",\r\n \"403\", \"Forbidden\",\r\n \"404\", \"Not Found\",\r\n \"405\", \"Method Not Allowed\",\r\n \"406\", \"Not Acceptable\",\r\n \"407\", \"Proxy Authentication Required\",\r\n \"408\", \"Request Timeout\",\r\n \"409\", \"Conflict\",\r\n \"410\", \"Gone\",\r\n \"411\", \"Length Required\",\r\n \"412\", \"Conditional Request Failed\",\r\n \"413\", \"Request Entity Too Large\",\r\n \"414\", \"Request-URI Too Large\",\r\n \"415\", \"Unsupported Media Type\",\r\n \"416\", \"Unsupported URI Scheme\",\r\n \"417\", \"Unknown Resource-Priority\",\r\n \"420\", \"Bad Extension\",\r\n \"421\", \"Extension Required\",\r\n \"422\", \"Session Interval Too Small\",\r\n \"423\", \"Interval Too Brief\",\r\n \"424\", \"Bad Location Information\",\r\n \"428\", \"Use Identity Header\",\r\n \"429\", \"Provide Referrer Identity\",\r\n \"430\", \"Flow Failed\",\r\n \"433\", \"Anonymity Disallowed\",\r\n \"436\", \"Bad Identity-Info\",\r\n \"437\", \"Unsupported Certificate\",\r\n \"438\", \"Invalid Identity Header\",\r\n \"439\", \"First Hop Lacks Outbound Support\",\r\n \"440\", \"Max-Breadth Exceeded\",\r\n \"469\", \"Bad Info Package\",\r\n \"470\", \"Consent Needed\",\r\n \"480\", \"Temporarily Unavailable\",\r\n \"481\", \"Call/Transaction Does Not Exist\",\r\n \"482\", \"Loop Detected\",\r\n \"483\", \"Too Many Hops\",\r\n \"484\", \"Address Incomplete\",\r\n \"485\", \"Ambiguous\",\r\n \"486\", \"Busy Here\",\r\n \"487\", \"Request Terminated\",\r\n \"488\", \"Not Acceptable Here\",\r\n \"489\", \"Bad Event\",\r\n \"491\", \"Request Pending\",\r\n \"493\", \"Undecipherable\",\r\n \"494\", \"Security Agreement Required\",\r\n \"500\", \"Internal Server Error\",\r\n \"501\", \"Not Implemented\",\r\n \"502\", \"Bad Gateway\",\r\n \"503\", \"Service Unavailable\",\r\n \"504\", \"Server Time-out\",\r\n \"505\", \"Version Not Supported\",\r\n \"513\", \"Message Too Large\",\r\n \"555\", \"Push Notification Service Not Supported\",\r\n \"580\", \"Precondition Failure\",\r\n \"600\", \"Busy Everywhere\",\r\n \"603\", \"Decline\",\r\n \"604\", \"Does Not Exist Anywhere\",\r\n \"606\", \"Not Acceptable\",\r\n \"607\", \"Unwanted\",\r\n \"608\", \"Rejected\",\r\n];\r\n\r\nlet other_auth_signatures = ACSAuthIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| summarize operation_count=count() by ResultSignature\r\n| order by operation_count desc\r\n| extend Rank=row_number()\r\n| where Rank > 5\r\n| project ResultSignature;\r\n\r\nACSAuthIncomingOperations\r\n| where TimeGenerated {time_range:query} // and (ResultSignature in (dynamic([{auth_signature}])) or iff(\"Other\" in (dynamic([{auth_signature}])), (ResultSignature in (other_auth_signatures)), false))\r\n| join kind=leftouter SIPCodesAuth on ResultSignature\r\n| extend OperationDate=strcat(\"📅\", format_datetime(TimeGenerated, 'MM/dd/y'))\r\n| extend OperationTime=format_datetime(TimeGenerated, 'hh:mm:ss')\r\n| extend ResultIcon=iff(ResultType == \"Succeeded\", \"✔️\", \"❌\")\r\n| extend Result=strcat(ResultIcon, \" \", ResultSignature, \": \", SIPCode)\r\n| where (Result in (dynamic([{auth_signature}])) or iff(\"Other\" in (dynamic([{auth_signature}])), (ResultSignature in (other_auth_signatures)), false))\r\n| order by TimeGenerated\r\n| project OperationName, Level, Result, OperationDate, OperationTime, DurationMs",
- "size": 0,
- "title": "Authentication operations with result type {auth_signature}",
- "noDataMessage": "No authentication operations found for the specified time range and result type",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let metricName_to_scenarioDisplayName = (metricName:string) { \n case( \n metricName == 'reliability/api/StartCall', 'StartCall',\n metricName == 'reliability/api/AcceptIncomingCall', 'AcceptIncomingCall',\n metricName == 'reliability/api/Join', 'Join',\n metricName == 'reliability/api/StartVideo', 'StartVideo',\n metricName == 'reliability/api/StopVideo', 'StopVideo',\n metricName == 'reliability/api/StartScreenShare', 'StartScreenShare',\n metricName == 'reliability/api/StopScreenShare', 'StopScreenShare',\n metricName == 'reliability/api/CreateView', 'CreateView',\n ''\n ) \n};\nlet divide = (a:real,b:real) { \n iif(b == 0.0 or isnan(b) or isnull(b), real(null), a / b) \n};\nlet reliability = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good), attempts); \n iff(isnull(ratio), real(null), round(100.00 * ratio, decimals)) \n};\nlet reliability_upperbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_upper = ratio + 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_upper_1 = iff(ratio_upper > 1.0, 1.0, ratio_upper); \n iff(isnull(ratio), real(null), round(100.00 * ratio_upper_1, decimals)) \n};\nlet reliability_lowerbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_lower = ratio - 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_lower_1 = iff(ratio_lower < 0.0, 0.0, ratio_lower); \n iff(isnull(ratio), real(null), round(100.00 * ratio_lower_1, decimals)) \n};\nlet compareMetricWithThreshold = (cmpOperator:string,metricValue:real,threshold:real) { \n case( \n cmpOperator == '==', \n metricValue == threshold, \n cmpOperator == '!=', \n metricValue != threshold, \n cmpOperator == '>', \n metricValue > threshold, \n cmpOperator == '>=', \n metricValue >= threshold, \n cmpOperator == '<', \n metricValue < threshold, \n cmpOperator == '<=', \n metricValue <= threshold, \n bool(null) \n) \n};\nlet metricsMetadata = () {\n\tdatatable (\n metricName: string, \n metadataValidAsOf: datetime, \n enabled: bool, \n targetThresholdLeg: real, \n cmpOperatorLeg: string, \n aggregLegRounding: int, \n aggregLegUnit: string, \n description: string, \n priority: int\n ) \n [\n\t\t\t\"reliability/StopVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StopVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/StopScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StopScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/StartVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/api/StartAudio\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartAudio\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/EnterCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/EnterCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/CreateView\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/CreateView\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/CallAgentInit\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/CallAgentInit\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/api/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t] \n | where enabled\n};\nlet applyGoalsOnLegMetric = (legMetricResult:(timestamp:datetime,metricName:string,localParticipantId:string,metricValue:real,metricValueUpperBound:real,metricValueLowerBound:real,SdkVersion:string,ResultType:string,SubCode:string,Platform:string,CallType:string,callId:string)) {\n // Assumption: there is only one metricName in the legMetricResult\n // Kusto does not support asserts on row context\n //\n metricsMetadata\n | join kind=innerunique legMetricResult on metricName\n | extend cmpOperator = cmpOperatorLeg, threshold=targetThresholdLeg, unit=aggregLegUnit\n | project\n timestamp,\n metricName,\n localParticipantId,\n metricValue,\n metricValueUpperBound,\n metricValueLowerBound,\n goal = strcat(cmpOperator, ' ', threshold),\n succeeded= compareMetricWithThreshold(cmpOperator, metricValueUpperBound, threshold),\n unit,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n};\nlet AttemptSuccessFailureLegMetric = (attempt_and_failure_event:(EventInfo_Time:datetime,localParticipantId:string,metricName:string,kind_of_event:string,SdkVersion:string,ResultType:string,SubCode:string,callId:string,UserAgent:string,Platform:string,CallType:string),startDateTime:datetime,endDateTime:datetime) {\n let metadata = metricsMetadata | project metricName, aggregLegRounding;\n let attempt_and_failure_event_with_meta=attempt_and_failure_event | join kind=inner metadata on metricName;\n let attempt_event=attempt_and_failure_event_with_meta | where kind_of_event == 'attempt';\n let failure_event=attempt_and_failure_event_with_meta | where kind_of_event == 'failure';\n let pool = \n attempt_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | project \n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=1.0 * count(),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n let bad= \n failure_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | join kind=leftsemi pool on localParticipantId, metricName\n | project\n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n failures=1.0 * count(),\n EventInfo_Time=max(EventInfo_Time),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n //\n union hint.spread=2 pool, bad\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=sum(attempts),\n failures=sum(failures),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by localParticipantId, metricName\n | extend successes = max_of(attempts - failures, 0) //protect against failures>attempts\n | project\n timestamp=EventInfo_Time,\n metricName,\n localParticipantId,\n metricValue=reliability(successes, attempts),\n metricValueUpperBound=reliability_upperbound(successes, attempts),\n metricValueLowerBound=reliability_lowerbound(successes, attempts),\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n callId\n | invoke applyGoalsOnLegMetric()\n};\nlet clean_result_type = (result_type:string) {\n case (\n result_type contains 'Success' or result_type contains \"Succeeded\",\n 'Succeeded',\n result_type contains 'ExpectedError',\n 'ExpectedError',\n result_type contains 'UnexpectedServerError',\n 'UnexpectedServerError',\n 'UnexpectedClientError'\n )\n};\nlet ASF_Filter = (d:(EventInfo_Time:datetime,localParticipantId:string),startDateTime:datetime,endDateTime:datetime) { \n d \n | where EventInfo_Time between(startDateTime .. endDateTime) and isnotempty(localParticipantId) \n};\nlet ASF3 = (attempt:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),failure:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),metricName:string,startDateTime:datetime,endDateTime:datetime) {\n let fa = ASF_Filter((attempt), startDateTime, endDateTime);\n union\n (\n ASF_Filter((failure), startDateTime, endDateTime)\n | join kind = leftsemi fa on localParticipantId\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='failure',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n ),\n (\n fa\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='attempt',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n )\n};\nlet argStartDateTime = {TimeRange:start};\nlet argEndDateTime = {TimeRange:end};\n//\n// api reliability\nlet startCall = \nACSCallClientOperations\n| where OperationName == 'StartCall'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet startCall_attempt = startCall;\nlet startCall_failure = startCall_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet accept = \nACSCallClientOperations\n| where OperationName == 'AcceptIncomingCall'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet accept_attempt = accept;\nlet accept_failure = accept_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet callJoin = \nACSCallClientOperations\n| where OperationName == 'Join'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet join_attempt = callJoin;\nlet join_failure = join_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_startVideo = \nACSCallClientOperations\n| where OperationName == 'StartVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_startVideo_attempt = api_startVideo;\nlet api_startVideo_failure = api_startVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_stopVideo = \nACSCallClientOperations\n| where OperationName == 'StopVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_stopVideo_attempt = api_stopVideo;\nlet api_stopVideo_failure = api_stopVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_startScreenshare = \nACSCallClientOperations\n| where OperationName == 'StartScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_startScreenshare_attempt = api_startScreenshare;\nlet api_startScreenshare_failure = api_startScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_stopScreenshare = \nACSCallClientOperations\n| where OperationName == 'StopScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_stopScreenshare_attempt = api_stopScreenshare;\nlet api_stopScreenshare_failure = api_stopScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_createView = \nACSCallClientOperations\n| where OperationName == 'CreateView'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_createView_attempt = api_createView;\nlet api_createView_failure = api_createView_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\n// Leg reliability\n//\nlet callagent_init = \nACSCallClientOperations\n| where OperationName == 'CallAgentInit'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=coalesce(ParticipantId, strcat('using client instance id for out of call context operations: ', ClientInstanceId))\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet callagent_init_attempt = callagent_init;\nlet callagent_init_failure = callagent_init_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_stopVideo = \nACSCallClientOperations\n| where OperationName == 'StopVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_stopVideo_attempt = leg_stopVideo;\nlet leg_stopVideo_failure = leg_stopVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_startVideo = \nACSCallClientOperations\n| where OperationName == 'StartVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_startVideo_attempt = leg_startVideo;\nlet leg_startVideo_failure = leg_startVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_startScreenshare = \nACSCallClientOperations\n| where OperationName == 'StartScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_startScreenshare_attempt = leg_startScreenshare;\nlet leg_startScreenshare_failure = leg_startScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_stopScreenshare = \nACSCallClientOperations\n| where OperationName == 'StopScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_stopScreenshare_attempt = leg_stopScreenshare;\nlet leg_stopScreenshare_failure = leg_stopScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_createView = \nACSCallClientOperations\n| where OperationName == 'CreateView'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_createView_attempt = leg_createView;\nlet leg_createView_failure = leg_createView_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet cdc_metrics_aggregation =\nunion\n ASF3(startCall_attempt, startCall_failure, 'reliability/api/StartCall', argStartDateTime, argEndDateTime),\n ASF3(accept_attempt, accept_failure, 'reliability/api/AcceptIncomingCall', argStartDateTime, argEndDateTime),\n ASF3(join_attempt, join_failure, 'reliability/api/Join', argStartDateTime, argEndDateTime),\n\tASF3(api_startVideo_attempt, api_startVideo_failure, 'reliability/api/StartVideo', argStartDateTime, argEndDateTime),\n\tASF3(api_stopVideo_attempt, api_stopVideo_failure, 'reliability/api/StopVideo', argStartDateTime, argEndDateTime),\n\tASF3(api_startScreenshare_attempt, api_startScreenshare_failure, 'reliability/api/StartScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(api_stopScreenshare_attempt, api_stopScreenshare_failure, 'reliability/api/StopScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(api_createView_attempt, api_createView_failure, 'reliability/api/CreateView', argStartDateTime, argEndDateTime)\n\t//\n //ASF3(callagent_init_attempt, callagent_init_failure, 'reliability/CallAgentInit', argStartDateTime, argEndDateTime),\n\t//ASF3(leg_startVideo_attempt, leg_startVideo_failure, 'reliability/StartVideo', argStartDateTime, argEndDateTime),\n\t//ASF3(leg_stopVideo_attempt, leg_stopVideo_failure, 'reliability/StopVideo', argStartDateTime, argEndDateTime),\n\t//ASF3(leg_startScreenshare_attempt, leg_startScreenshare_failure, 'reliability/StartScreenShare', argStartDateTime, argEndDateTime),\n\t//ASF3(leg_stopScreenshare_attempt, leg_stopScreenshare_failure, 'reliability/StopScreenShare', argStartDateTime, argEndDateTime),\n\t//ASF3(leg_createView_attempt, leg_createView_failure, 'reliability/CreateView', argStartDateTime, argEndDateTime)\n| invoke AttemptSuccessFailureLegMetric(argStartDateTime, argEndDateTime)\n| extend timestampBin = bin(timestamp, 1d)\n| summarize\n legs_dcount = dcount(localParticipantId), \n// calls_dcount = dcount(callId),\n success_legs_dcount= dcountif(localParticipantId, succeeded),\n failed_legs_dcount= dcountif(localParticipantId, not(succeeded)),\n timestamp_max = max(timestamp)\n by \n metricName,\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n timestampBin\n;\nlet sdkversion_selection = dynamic([{SDKVersion}]);\nlet resultType_selection = dynamic([{ResultType}]);\nlet platform_selection = dynamic([{platform}]);\nlet unpivot = \ncdc_metrics_aggregation\n| where array_length(sdkversion_selection) == 0 or SdkVersion in (sdkversion_selection)\n| where array_length(resultType_selection) == 0 or ResultType in (resultType_selection)\n| where array_length(platform_selection) == 0 or Platform in (platform_selection) \n| summarize arg_max(timestamp_max, *) by metricName, SdkVersion, ResultType, SubCode, timestampBin, CallType, Platform\n| summarize success_rate = sum(success_legs_dcount)*100.0/sum(legs_dcount) by metricName, timestampBin={time_granularity}\n| project metricName, timestampBin = format_datetime(timestampBin, \"yyyy-MM-dd \"), round(success_rate,4)\n| order by metricName, timestampBin asc;\nlet pivot_change =\nunpivot\n| extend change = round(iff(metricName == prev(metricName), success_rate - prev(success_rate), 0.0),2)\n| evaluate pivot(timestampBin, sum(change), metricName);\nlet pivot_reliability =\nunpivot\n| evaluate pivot(timestampBin, sum(success_rate), metricName);\npivot_change \n| join kind=inner pivot_reliability on metricName\n| project-away metricName1\n| project PackedRecord = todynamic\n (\n replace_strings(\n tostring(pack_all()),\n dynamic([' 1', ' ']),\n dynamic([' reliability', ' change'])\n )\n )\n| evaluate bag_unpack(PackedRecord)\n| extend Scenario = metricName_to_scenarioDisplayName(metricName)\n| project-away metricName\n| project-reorder Scenario, ['20*'] desc;",
+ "size": 0,
+ "title": "Scenarios Overview {time_granularity:label} Trend",
+ "noDataMessage": "No reliability logs found in the specified time range",
+ "timeContextFromParameter": "TimeRange",
+ "exportFieldName": "Scenario",
+ "exportParameterName": "MetricName",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "gridSettings": {
+ "formatters": [
+ {
+ "columnMatch": "reliability",
+ "formatter": 0,
+ "numberFormat": {
+ "unit": 1,
+ "options": {
+ "style": "decimal"
+ }
+ }
},
{
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
+ "columnMatch": "change",
+ "formatter": 2,
+ "formatOptions": {
+ "compositeBarSettings": {
+ "labelText": "",
+ "columnSettings": []
+ }
+ },
+ "numberFormat": {
+ "unit": 1,
+ "options": {
+ "style": "decimal"
+ }
+ }
}
]
- }
+ },
+ "sortBy": []
},
- {
- "columnMatch": "OperationDate",
- "formatter": 5
+ "conditionalVisibility": {
+ "parameterName": "MetricName",
+ "comparison": "isEqualTo"
},
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- }
- },
- "sortBy": []
- },
- "conditionalVisibility": {
- "parameterName": "auth_signature",
- "comparison": "isNotEqualTo"
- },
- "name": "auth-by-signature"
- }
- ]
- },
- "customWidth": "50",
- "name": "auth-signatures-group"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Authentication Operation Names",
- "items": [
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSAuthIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| summarize count() by OperationName\r\n| render piechart",
- "size": 0,
- "noDataMessage": "No authentication operations found in the specified time range",
- "exportMultipleValues": true,
- "exportedParameters": [
+ "name": "all Scenarios trend"
+ },
{
- "fieldName": "series",
- "parameterName": "auth_operation",
- "parameterType": 1
- }
- ],
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "name": "auth-operation-names"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let SIPCodesChat = datatable(ResultSignature: string, SIPCode: string)\r\n[\r\n \"0\", \"Success\",\r\n \"100\", \"Trying\",\r\n \"180\", \"Ringing\",\r\n \"181\", \"Call Is Being Forwarded\",\r\n \"182\", \"Queued\",\r\n \"183\", \"Session Progress\",\r\n \"199\", \"Early Dialog Terminated\",\r\n \"200\", \"Success\",\r\n \"202\", \"Accepted\",\r\n \"204\", \"No Notification\",\r\n \"300\", \"Multiple Choices\",\r\n \"301\", \"Moved Permanently\",\r\n \"302\", \"Moved Temporarily\",\r\n \"305\", \"Use Proxy\",\r\n \"380\", \"Alternative Service\",\r\n \"400\", \"Bad Request\",\r\n \"401\", \"Unauthorized\",\r\n \"402\", \"Payment Required\",\r\n \"403\", \"Forbidden\",\r\n \"404\", \"Not Found\",\r\n \"405\", \"Method Not Allowed\",\r\n \"406\", \"Not Acceptable\",\r\n \"407\", \"Proxy Authentication Required\",\r\n \"408\", \"Request Timeout\",\r\n \"409\", \"Conflict\",\r\n \"410\", \"Gone\",\r\n \"411\", \"Length Required\",\r\n \"412\", \"Conditional Request Failed\",\r\n \"413\", \"Request Entity Too Large\",\r\n \"414\", \"Request-URI Too Large\",\r\n \"415\", \"Unsupported Media Type\",\r\n \"416\", \"Unsupported URI Scheme\",\r\n \"417\", \"Unknown Resource-Priority\",\r\n \"420\", \"Bad Extension\",\r\n \"421\", \"Extension Required\",\r\n \"422\", \"Session Interval Too Small\",\r\n \"423\", \"Interval Too Brief\",\r\n \"424\", \"Bad Location Information\",\r\n \"428\", \"Use Identity Header\",\r\n \"429\", \"Provide Referrer Identity\",\r\n \"430\", \"Flow Failed\",\r\n \"433\", \"Anonymity Disallowed\",\r\n \"436\", \"Bad Identity-Info\",\r\n \"437\", \"Unsupported Certificate\",\r\n \"438\", \"Invalid Identity Header\",\r\n \"439\", \"First Hop Lacks Outbound Support\",\r\n \"440\", \"Max-Breadth Exceeded\",\r\n \"469\", \"Bad Info Package\",\r\n \"470\", \"Consent Needed\",\r\n \"480\", \"Temporarily Unavailable\",\r\n \"481\", \"Call/Transaction Does Not Exist\",\r\n \"482\", \"Loop Detected\",\r\n \"483\", \"Too Many Hops\",\r\n \"484\", \"Address Incomplete\",\r\n \"485\", \"Ambiguous\",\r\n \"486\", \"Busy Here\",\r\n \"487\", \"Request Terminated\",\r\n \"488\", \"Not Acceptable Here\",\r\n \"489\", \"Bad Event\",\r\n \"491\", \"Request Pending\",\r\n \"493\", \"Undecipherable\",\r\n \"494\", \"Security Agreement Required\",\r\n \"500\", \"Internal Server Error\",\r\n \"501\", \"Not Implemented\",\r\n \"502\", \"Bad Gateway\",\r\n \"503\", \"Service Unavailable\",\r\n \"504\", \"Server Time-out\",\r\n \"505\", \"Version Not Supported\",\r\n \"513\", \"Message Too Large\",\r\n \"555\", \"Push Notification Service Not Supported\",\r\n \"580\", \"Precondition Failure\",\r\n \"600\", \"Busy Everywhere\",\r\n \"603\", \"Decline\",\r\n \"604\", \"Does Not Exist Anywhere\",\r\n \"606\", \"Not Acceptable\",\r\n \"607\", \"Unwanted\",\r\n \"608\", \"Rejected\",\r\n];\r\n\r\nlet other_auth_operations = ACSAuthIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| summarize operation_count=count() by OperationName\r\n| order by operation_count desc\r\n| extend Rank=row_number()\r\n| where Rank > 5\r\n| project OperationName;\r\n\r\nACSAuthIncomingOperations\r\n| where TimeGenerated {time_range:query} and (OperationName in (dynamic([{auth_operation}])) or iff(\"Other\" in (dynamic([{auth_operation}])), (OperationName in (other_auth_operations)), false))\r\n| join kind=leftouter SIPCodesChat on ResultSignature\r\n| extend OperationDate=strcat(\"📅\", format_datetime(TimeGenerated, 'MM/dd/y'))\r\n| extend OperationTime=format_datetime(TimeGenerated, 'hh:mm:ss')\r\n| extend ResultIcon=iff(ResultType == \"Succeeded\", \"✔️\", \"❌\")\r\n| extend Result=strcat(ResultIcon, \" \", ResultSignature, \": \", SIPCode)\r\n| order by TimeGenerated\r\n| project OperationName, Identity, Level, Result, OperationDate, OperationTime, DurationMs",
- "size": 0,
- "title": "Authentication operations with result type {auth_operation}",
- "noDataMessage": "No authentication operations found for the specified time range and result type",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "items": [
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let divide = (a:real,b:real) { \n iif(b == 0.0 or isnan(b) or isnull(b), real(null), a / b) \n};\nlet reliability = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good), attempts); \n iff(isnull(ratio), real(null), round(100.00 * ratio, decimals)) \n};\nlet reliability_upperbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_upper = ratio + 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_upper_1 = iff(ratio_upper > 1.0, 1.0, ratio_upper); \n iff(isnull(ratio), real(null), round(100.00 * ratio_upper_1, decimals)) \n};\nlet reliability_lowerbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_lower = ratio - 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_lower_1 = iff(ratio_lower < 0.0, 0.0, ratio_lower); \n iff(isnull(ratio), real(null), round(100.00 * ratio_lower_1, decimals)) \n};\nlet compareMetricWithThreshold = (cmpOperator:string,metricValue:real,threshold:real) { \n case( \n cmpOperator == '==', \n metricValue == threshold, \n cmpOperator == '!=', \n metricValue != threshold, \n cmpOperator == '>', \n metricValue > threshold, \n cmpOperator == '>=', \n metricValue >= threshold, \n cmpOperator == '<', \n metricValue < threshold, \n cmpOperator == '<=', \n metricValue <= threshold, \n bool(null) \n) \n};\nlet metricsMetadata = () {\n\tdatatable (\n metricName: string, \n metadataValidAsOf: datetime, \n enabled: bool, \n targetThresholdLeg: real, \n cmpOperatorLeg: string, \n aggregLegRounding: int, \n aggregLegUnit: string, \n description: string, \n priority: int\n ) \n [\n\t\t\t\"reliability/CommunicationStartCaptions\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/CommunicationStartCaptions\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/UnmuteMicrophone\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/UnmuteMicrophone\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/SwitchSource\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/SwitchSource\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StopVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StopVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/StopScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StopScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StopAudio\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StopAudio\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/StartVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/api/StartAudio\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartAudio\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/SelectedSpeakerChanged\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/SelectedSpeakerChanged\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/SelectedMicrophoneChanged\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/SelectedMicrophoneChanged\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/Resume\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/Resume\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/RejectIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/RejectIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/MuteMicrophone\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/MuteMicrophone\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/Hold\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/Hold\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/Hangup\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/Hangup\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/EnterCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/EnterCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/DisposeView\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/DisposeView\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/CreateView\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/CreateView\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/CallAgentInit\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/CallAgentInit\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/AskDevicePermission\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/AskDevicePermission\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1)\n\t\t\t// $$$ add your metric name here\n\t\t] \n | where enabled\n};\nlet applyGoalsOnLegMetric = (legMetricResult:(timestamp:datetime,metricName:string,localParticipantId:string,metricValue:real,metricValueUpperBound:real,metricValueLowerBound:real,SdkVersion:string,ResultType:string,SubCode:string,Platform:string,CallType:string,callId:string)) {\n // Assumption: there is only one metricName in the legMetricResult\n // Kusto does not support asserts on row context\n //\n metricsMetadata\n | join kind=innerunique legMetricResult on metricName\n | extend cmpOperator = cmpOperatorLeg, threshold=targetThresholdLeg, unit=aggregLegUnit\n | project\n timestamp,\n metricName,\n localParticipantId,\n metricValue,\n metricValueUpperBound,\n metricValueLowerBound,\n goal = strcat(cmpOperator, ' ', threshold),\n succeeded= compareMetricWithThreshold(cmpOperator, metricValueUpperBound, threshold),\n unit,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n};\nlet AttemptSuccessFailureLegMetric = (attempt_and_failure_event:(EventInfo_Time:datetime,localParticipantId:string,metricName:string,kind_of_event:string,SdkVersion:string,ResultType:string,SubCode:string,callId:string,UserAgent:string,Platform:string,CallType:string),startDateTime:datetime,endDateTime:datetime) {\n let metadata = metricsMetadata | project metricName, aggregLegRounding;\n let attempt_and_failure_event_with_meta=attempt_and_failure_event | join kind=inner metadata on metricName;\n let attempt_event=attempt_and_failure_event_with_meta | where kind_of_event == 'attempt';\n let failure_event=attempt_and_failure_event_with_meta | where kind_of_event == 'failure';\n let pool = \n attempt_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | project \n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=1.0 * count(),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n let bad= \n failure_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | join kind=leftsemi pool on localParticipantId, metricName\n | project\n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n failures=1.0 * count(),\n EventInfo_Time=max(EventInfo_Time),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n //\n union hint.spread=2 pool, bad\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=sum(attempts),\n failures=sum(failures),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by localParticipantId, metricName\n | extend successes = max_of(attempts - failures, 0) //protect against failures>attempts\n | project\n timestamp=EventInfo_Time,\n metricName,\n localParticipantId,\n metricValue=reliability(successes, attempts),\n metricValueUpperBound=reliability_upperbound(successes, attempts),\n metricValueLowerBound=reliability_lowerbound(successes, attempts),\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n callId\n | invoke applyGoalsOnLegMetric()\n};\nlet clean_result_type = (result_type:string) {\n case (\n result_type contains 'Success' or result_type contains \"Succeeded\",\n 'Succeeded',\n result_type contains 'ExpectedError',\n 'ExpectedError',\n result_type contains 'UnexpectedServerError',\n 'UnexpectedServerError',\n 'UnexpectedClientError'\n )\n};\nlet ASF_Filter = (d:(EventInfo_Time:datetime,localParticipantId:string),startDateTime:datetime,endDateTime:datetime) { \n d \n | where EventInfo_Time between(startDateTime .. endDateTime) and isnotempty(localParticipantId) \n};\nlet ASF3 = (attempt:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),failure:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),metricName:string,startDateTime:datetime,endDateTime:datetime) {\n let fa = ASF_Filter((attempt), startDateTime, endDateTime);\n union\n (\n ASF_Filter((failure), startDateTime, endDateTime)\n | join kind = leftsemi fa on localParticipantId\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='failure',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n ),\n (\n fa\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='attempt',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n )\n};\nlet argStartDateTime = {TimeRange:start};\nlet argEndDateTime = {TimeRange:end};\n//\n// api reliability\nlet startCall = \nACSCallClientOperations\n| where OperationName == 'StartCall'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet startCall_attempt = startCall;\nlet startCall_failure = startCall_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet accept = \nACSCallClientOperations\n| where OperationName == 'AcceptIncomingCall'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet accept_attempt = accept;\nlet accept_failure = accept_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet callJoin = \nACSCallClientOperations\n| where OperationName == 'Join'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet join_attempt = callJoin;\nlet join_failure = join_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_startVideo = \nACSCallClientOperations\n| where OperationName == 'StartVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_startVideo_attempt = api_startVideo;\nlet api_startVideo_failure = api_startVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_stopVideo = \nACSCallClientOperations\n| where OperationName == 'StopVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_stopVideo_attempt = api_stopVideo;\nlet api_stopVideo_failure = api_stopVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_startScreenshare = \nACSCallClientOperations\n| where OperationName == 'StartScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_startScreenshare_attempt = api_startScreenshare;\nlet api_startScreenshare_failure = api_startScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_stopScreenshare = \nACSCallClientOperations\n| where OperationName == 'StopScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_stopScreenshare_attempt = api_stopScreenshare;\nlet api_stopScreenshare_failure = api_stopScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_createView = \nACSCallClientOperations\n| where OperationName == 'CreateView'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_createView_attempt = api_createView;\nlet api_createView_failure = api_createView_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\n// Leg reliability\n//\nlet callagent_init = \nACSCallClientOperations\n| where OperationName == 'CallAgentInit'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=coalesce(ParticipantId, strcat('using client instance id for out of call context operations: ', ClientInstanceId))\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet callagent_init_attempt = callagent_init;\nlet callagent_init_failure = callagent_init_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_stopVideo = \nACSCallClientOperations\n| where OperationName == 'StopVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_stopVideo_attempt = leg_stopVideo;\nlet leg_stopVideo_failure = leg_stopVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_startVideo = \nACSCallClientOperations\n| where OperationName == 'StartVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_startVideo_attempt = leg_startVideo;\nlet leg_startVideo_failure = leg_startVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_startScreenshare = \nACSCallClientOperations\n| where OperationName == 'StartScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_startScreenshare_attempt = leg_startScreenshare;\nlet leg_startScreenshare_failure = leg_startScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_stopScreenshare = \nACSCallClientOperations\n| where OperationName == 'StopScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_stopScreenshare_attempt = leg_stopScreenshare;\nlet leg_stopScreenshare_failure = leg_stopScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_createView = \nACSCallClientOperations\n| where OperationName == 'CreateView'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_createView_attempt = leg_createView;\nlet leg_createView_failure = leg_createView_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet cdc_metrics_aggregation =\nunion\n ASF3(startCall_attempt, startCall_failure, 'reliability/api/StartCall', argStartDateTime, argEndDateTime),\n ASF3(accept_attempt, accept_failure, 'reliability/api/AcceptIncomingCall', argStartDateTime, argEndDateTime),\n ASF3(join_attempt, join_failure, 'reliability/api/Join', argStartDateTime, argEndDateTime),\n\tASF3(api_startVideo_attempt, api_startVideo_failure, 'reliability/api/StartVideo', argStartDateTime, argEndDateTime),\n\tASF3(api_stopVideo_attempt, api_stopVideo_failure, 'reliability/api/StopVideo', argStartDateTime, argEndDateTime),\n\tASF3(api_startScreenshare_attempt, api_startScreenshare_failure, 'reliability/api/StartScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(api_stopScreenshare_attempt, api_stopScreenshare_failure, 'reliability/api/StopScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(api_createView_attempt, api_createView_failure, 'reliability/api/CreateView', argStartDateTime, argEndDateTime),\n\t//\n ASF3(callagent_init_attempt, callagent_init_failure, 'reliability/CallAgentInit', argStartDateTime, argEndDateTime),\n\tASF3(leg_startVideo_attempt, leg_startVideo_failure, 'reliability/StartVideo', argStartDateTime, argEndDateTime),\n\tASF3(leg_stopVideo_attempt, leg_stopVideo_failure, 'reliability/StopVideo', argStartDateTime, argEndDateTime),\n\tASF3(leg_startScreenshare_attempt, leg_startScreenshare_failure, 'reliability/StartScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(leg_stopScreenshare_attempt, leg_stopScreenshare_failure, 'reliability/StopScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(leg_createView_attempt, leg_createView_failure, 'reliability/CreateView', argStartDateTime, argEndDateTime)\n| invoke AttemptSuccessFailureLegMetric(argStartDateTime, argEndDateTime)\n| extend timestampBin = bin(timestamp, 1d)\n| summarize\n legs_dcount = dcount(localParticipantId), \n calls_dcount = dcount(callId),\n success_legs_dcount= dcountif(localParticipantId, succeeded),\n failed_legs_dcount= dcountif(localParticipantId, not(succeeded)),\n timestamp_max = max(timestamp)\n by \n metricName,\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n timestampBin\n;\nlet selected_metric_reliability = todynamic('{MetricName}');\nlet sdkversion_selection = dynamic([{SDKVersion}]);\nlet resultType_selection = dynamic([{ResultType}]);\nlet platform_selection = dynamic([{platform}]);\nlet unpivot = \ncdc_metrics_aggregation\n| where array_length(sdkversion_selection) == 0 or SdkVersion in (sdkversion_selection)\n| where array_length(resultType_selection) == 0 or ResultType in (resultType_selection)\n| where array_length(platform_selection) == 0 or Platform in (platform_selection)\n| where isempty(selected_metric_reliability) or metricName == selected_metric_reliability\n| summarize arg_max(timestamp_max, *) by metricName, SdkVersion, ResultType, SubCode, timestampBin, CallType, Platform, calls_dcount\n| summarize success_rate = sum(success_legs_dcount)*100.0/sum(legs_dcount), ['call volume'] = sum(calls_dcount) by metricName, timestampBin={time_granularity}\n| project timestampBin = format_datetime(timestampBin, \"yyyy-MM-dd \"), round(success_rate,4), ['call volume']\n| order by timestampBin asc;\nunpivot\n| extend change = round(success_rate - prev(['success_rate']),2)\n| project ['{time_granularity:label} bucket'] = timestampBin, ['reliability'] = success_rate, change, ['call volume']\n| order by ['{time_granularity:label} bucket'] desc\n\n",
+ "size": 1,
+ "title": "{MetricName:label} {time_granularity:label} trend with volume",
+ "noDataMessage": "No reliability logs found in the specified time range",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "visualization": "table",
+ "gridSettings": {
+ "formatters": [
+ {
+ "columnMatch": "reliability",
+ "formatter": 0,
+ "numberFormat": {
+ "unit": 1,
+ "options": {
+ "style": "decimal"
+ }
+ }
+ },
+ {
+ "columnMatch": "change",
+ "formatter": 0,
+ "numberFormat": {
+ "unit": 1,
+ "options": {
+ "style": "decimal"
+ }
+ }
+ },
+ {
+ "columnMatch": "call volume",
+ "formatter": 3,
+ "formatOptions": {
+ "palette": "lightBlue"
+ }
+ }
+ ]
+ },
+ "sortBy": []
},
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
+ "name": "individual metric trend"
+ }
+ ]
+ },
+ "conditionalVisibility": {
+ "parameterName": "MetricName",
+ "comparison": "isNotEqualTo"
+ },
+ "name": "reliability trend"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let metricName_to_scenarioDisplayName = (metricName:string) { \r\n case( \r\n metricName == 'reliability/api/StartCall', 'StartCall',\r\n metricName == 'reliability/api/AcceptIncomingCall', 'AcceptIncomingCall',\r\n metricName == 'reliability/api/Join', 'Join',\r\n metricName == 'reliability/api/StartVideo', 'StartVideo',\r\n metricName == 'reliability/api/StopVideo', 'StopVideo',\r\n metricName == 'reliability/api/StartScreenShare', 'StartScreenShare',\r\n metricName == 'reliability/api/StopScreenShare', 'StopScreenShare',\r\n metricName == 'reliability/api/CreateView', 'CreateView',\r\n ''\r\n ) \r\n};\r\nlet divide = (a:real,b:real) { \r\n iif(b == 0.0 or isnan(b) or isnull(b), real(null), a / b) \r\n};\r\nlet reliability = (good:int,attempts:int,decimals:int=2) { \r\n let ratio = divide((1.00 * good), attempts); \r\n iff(isnull(ratio), real(null), round(100.00 * ratio, decimals)) \r\n};\r\nlet reliability_upperbound = (good:int,attempts:int,decimals:int=2) { \r\n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \r\n let ratio_upper = ratio + 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \r\n let ratio_upper_1 = iff(ratio_upper > 1.0, 1.0, ratio_upper); \r\n iff(isnull(ratio), real(null), round(100.00 * ratio_upper_1, decimals)) \r\n};\r\nlet reliability_lowerbound = (good:int,attempts:int,decimals:int=2) { \r\n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \r\n let ratio_lower = ratio - 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \r\n let ratio_lower_1 = iff(ratio_lower < 0.0, 0.0, ratio_lower); \r\n iff(isnull(ratio), real(null), round(100.00 * ratio_lower_1, decimals)) \r\n};\r\nlet compareMetricWithThreshold = (cmpOperator:string,metricValue:real,threshold:real) { \r\n case( \r\n cmpOperator == '==', \r\n metricValue == threshold, \r\n cmpOperator == '!=', \r\n metricValue != threshold, \r\n cmpOperator == '>', \r\n metricValue > threshold, \r\n cmpOperator == '>=', \r\n metricValue >= threshold, \r\n cmpOperator == '<', \r\n metricValue < threshold, \r\n cmpOperator == '<=', \r\n metricValue <= threshold, \r\n bool(null) \r\n) \r\n};\r\nlet metricsMetadata = () {\r\n\tdatatable (\r\n metricName: string, \r\n metadataValidAsOf: datetime, \r\n enabled: bool, \r\n targetThresholdLeg: real, \r\n cmpOperatorLeg: string, \r\n aggregLegRounding: int, \r\n aggregLegUnit: string, \r\n description: string, \r\n priority: int\r\n ) \r\n [\r\n\t\t\t\"reliability/StopVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\r\n\t\t\t\"reliability/api/StopVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\r\n\t\t\t\"reliability/StopScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\r\n\t\t\t\"reliability/api/StopScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\r\n\t\t\t\"reliability/api/StartVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\r\n\t\t\t\"reliability/StartVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\r\n\t\t\t\"reliability/api/StartScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\r\n\t\t\t\"reliability/StartScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\r\n\t\t\t\"reliability/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\r\n\t\t\t\"reliability/api/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\r\n\t\t\t\"reliability/api/StartAudio\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\r\n\t\t\t\"reliability/StartAudio\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\r\n\t\t\t\"reliability/api/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\r\n\t\t\t\"reliability/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\r\n\t\t\t\"reliability/api/EnterCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\r\n\t\t\t\"reliability/EnterCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\r\n\t\t\t\"reliability/api/CreateView\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\r\n\t\t\t\"reliability/CreateView\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\r\n\t\t\t\"reliability/CallAgentInit\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\r\n\t\t\t\"reliability/api/CallAgentInit\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\r\n\t\t\t\"reliability/api/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\r\n\t\t\t\"reliability/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\r\n\t\t\t\"performance/api/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(5000),\"<=\",int(1),\"ms\", \"\", int(0),\r\n\t\t\t\"performance/api/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(5000),\"<=\",int(1),\"ms\", \"\", int(0),\r\n\t\t\t\"performance/api/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(5000),\"<=\",int(1),\"ms\", \"\", int(0),\r\n\t\t] \r\n | where enabled\r\n};\r\nlet applyGoalsOnLegMetric = (legMetricResult:(timestamp:datetime,metricName:string,localParticipantId:string,metricValue:real,metricValueUpperBound:real,metricValueLowerBound:real,SdkVersion:string,ResultType:string,SubCode:string,Platform:string,CallType:string,callId:string)) {\r\n // Assumption: there is only one metricName in the legMetricResult\r\n // Kusto does not support asserts on row context\r\n //\r\n metricsMetadata\r\n | join kind=innerunique legMetricResult on metricName\r\n | extend cmpOperator = cmpOperatorLeg, threshold=targetThresholdLeg, unit=aggregLegUnit\r\n | project\r\n timestamp,\r\n metricName,\r\n localParticipantId,\r\n metricValue,\r\n metricValueUpperBound,\r\n metricValueLowerBound,\r\n goal = strcat(cmpOperator, ' ', threshold),\r\n succeeded= compareMetricWithThreshold(cmpOperator, metricValueUpperBound, threshold),\r\n unit,\r\n SdkVersion,\r\n ResultType,\r\n SubCode,\r\n callId,\r\n Platform,\r\n CallType\r\n};\r\nlet AttemptSuccessFailureLegMetric = (attempt_and_failure_event:(EventInfo_Time:datetime,localParticipantId:string,metricName:string,kind_of_event:string,SdkVersion:string,ResultType:string,SubCode:string,callId:string,UserAgent:string,Platform:string,CallType:string),startDateTime:datetime,endDateTime:datetime) {\r\n let metadata = metricsMetadata | project metricName, aggregLegRounding;\r\n let attempt_and_failure_event_with_meta=attempt_and_failure_event | join kind=inner metadata on metricName;\r\n let attempt_event=attempt_and_failure_event_with_meta | where kind_of_event == 'attempt';\r\n let failure_event=attempt_and_failure_event_with_meta | where kind_of_event == 'failure';\r\n let pool = \r\n attempt_event\r\n | where EventInfo_Time between(startDateTime .. endDateTime)\r\n | project \r\n EventInfo_Time, \r\n localParticipantId,\r\n metricName,\r\n SdkVersion,\r\n ResultType,\r\n SubCode,\r\n callId,\r\n Platform,\r\n CallType\r\n | summarize\r\n EventInfo_Time=max(EventInfo_Time),\r\n attempts=1.0 * count(),\r\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\r\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\r\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\r\n callId = take_anyif(callId, isnotempty(callId)),\r\n Platform=take_anyif(Platform, isnotempty(Platform)),\r\n CallType=take_anyif(CallType, isnotempty(CallType))\r\n by\r\n localParticipantId,\r\n metricName;\r\n let bad= \r\n failure_event\r\n | where EventInfo_Time between(startDateTime .. endDateTime)\r\n | join kind=leftsemi pool on localParticipantId, metricName\r\n | project\r\n EventInfo_Time, \r\n localParticipantId,\r\n metricName,\r\n SdkVersion,\r\n ResultType,\r\n SubCode,\r\n callId,\r\n Platform,\r\n CallType\r\n | summarize\r\n failures=1.0 * count(),\r\n EventInfo_Time=max(EventInfo_Time),\r\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\r\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\r\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\r\n callId = take_anyif(callId, isnotempty(callId)),\r\n Platform=take_anyif(Platform, isnotempty(Platform)),\r\n CallType=take_anyif(CallType, isnotempty(CallType))\r\n by\r\n localParticipantId,\r\n metricName;\r\n //\r\n union hint.spread=2 pool, bad\r\n | summarize\r\n EventInfo_Time=max(EventInfo_Time),\r\n attempts=sum(attempts),\r\n failures=sum(failures),\r\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\r\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\r\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\r\n callId = take_anyif(callId, isnotempty(callId)),\r\n Platform=take_anyif(Platform, isnotempty(Platform)),\r\n CallType=take_anyif(CallType, isnotempty(CallType))\r\n by localParticipantId, metricName\r\n | extend successes = max_of(attempts - failures, 0) //protect against failures>attempts\r\n | project\r\n timestamp=EventInfo_Time,\r\n metricName,\r\n localParticipantId,\r\n metricValue=reliability(successes, attempts),\r\n metricValueUpperBound=reliability_upperbound(successes, attempts),\r\n metricValueLowerBound=reliability_lowerbound(successes, attempts),\r\n SdkVersion,\r\n ResultType,\r\n Platform,\r\n CallType,\r\n SubCode,\r\n callId\r\n | invoke applyGoalsOnLegMetric()\r\n};\r\nlet clean_result_type = (result_type:string) {\r\n case (\r\n result_type contains 'Success' or result_type contains \"Succeeded\",\r\n 'Succeeded',\r\n result_type contains 'ExpectedError',\r\n 'ExpectedError',\r\n result_type contains 'UnexpectedServerError',\r\n 'UnexpectedServerError',\r\n 'UnexpectedClientError'\r\n )\r\n};\r\nlet ASF_Filter = (d:(EventInfo_Time:datetime,localParticipantId:string),startDateTime:datetime,endDateTime:datetime) { \r\n d \r\n | where EventInfo_Time between(startDateTime .. endDateTime) and isnotempty(localParticipantId) \r\n};\r\nlet ASF3 = (attempt:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),failure:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),metricName:string,startDateTime:datetime,endDateTime:datetime) {\r\n let fa = ASF_Filter((attempt), startDateTime, endDateTime);\r\n union\r\n (\r\n ASF_Filter((failure), startDateTime, endDateTime)\r\n | join kind = leftsemi fa on localParticipantId\r\n | project\r\n EventInfo_Time,\r\n localParticipantId,\r\n kind_of_event='failure',\r\n metricName,\r\n SdkVersion,\r\n ResultType,\r\n SubCode,\r\n callId,\r\n UserAgent,\r\n Platform,\r\n CallType\r\n ),\r\n (\r\n fa\r\n | project\r\n EventInfo_Time,\r\n localParticipantId,\r\n kind_of_event='attempt',\r\n metricName,\r\n SdkVersion,\r\n ResultType,\r\n SubCode,\r\n callId,\r\n UserAgent,\r\n Platform,\r\n CallType\r\n )\r\n};\r\nlet argStartDateTime = {TimeRange:start};\r\nlet argEndDateTime = {TimeRange:end};\r\n//\r\n// api reliability\r\nlet startCall = \r\nACSCallClientOperations\r\n| where OperationName == 'StartCall'\r\n| extend\r\n EventInfo_Time = CallClientTimeStamp,\r\n localParticipantId=OperationId\r\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\r\n| extend callId = CallId\r\n| extend ResultType = clean_result_type(ResultType)\r\n| extend Platform = tostring(OperationPayload.SdkPlatform) \r\n| extend CallType = tostring(OperationPayload.CallType);\r\nlet startCall_attempt = startCall;\r\nlet startCall_failure = startCall_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\r\n//\r\nlet accept = \r\nACSCallClientOperations\r\n| where OperationName == 'AcceptIncomingCall'\r\n| extend\r\n EventInfo_Time = CallClientTimeStamp,\r\n localParticipantId=OperationId\r\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\r\n| extend callId = CallId\r\n| extend ResultType = clean_result_type(ResultType)\r\n| extend Platform = tostring(OperationPayload.SdkPlatform) \r\n| extend CallType = tostring(OperationPayload.CallType);\r\nlet accept_attempt = accept;\r\nlet accept_failure = accept_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\r\n//\r\nlet callJoin = \r\nACSCallClientOperations\r\n| where OperationName == 'Join'\r\n| extend\r\n EventInfo_Time = CallClientTimeStamp,\r\n localParticipantId=OperationId\r\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\r\n| extend callId = CallId\r\n| extend ResultType = clean_result_type(ResultType)\r\n| extend Platform = tostring(OperationPayload.SdkPlatform) \r\n| extend CallType = tostring(OperationPayload.CallType);\r\nlet join_attempt = callJoin;\r\nlet join_failure = join_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\r\n//\r\nlet api_startVideo = \r\nACSCallClientOperations\r\n| where OperationName == 'StartVideo'\r\n| extend\r\n EventInfo_Time = CallClientTimeStamp,\r\n localParticipantId=OperationId\r\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\r\n| extend callId = CallId\r\n| extend ResultType = clean_result_type(ResultType)\r\n| extend Platform = tostring(OperationPayload.SdkPlatform) \r\n| extend CallType = tostring(OperationPayload.CallType);\r\nlet api_startVideo_attempt = api_startVideo;\r\nlet api_startVideo_failure = api_startVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\r\n//\r\nlet api_stopVideo = \r\nACSCallClientOperations\r\n| where OperationName == 'StopVideo'\r\n| extend\r\n EventInfo_Time = CallClientTimeStamp,\r\n localParticipantId=OperationId\r\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\r\n| extend callId = CallId\r\n| extend ResultType = clean_result_type(ResultType)\r\n| extend Platform = tostring(OperationPayload.SdkPlatform) \r\n| extend CallType = tostring(OperationPayload.CallType);\r\nlet api_stopVideo_attempt = api_stopVideo;\r\nlet api_stopVideo_failure = api_stopVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\r\n//\r\nlet api_startScreenshare = \r\nACSCallClientOperations\r\n| where OperationName == 'StartScreenShare'\r\n| extend\r\n EventInfo_Time = CallClientTimeStamp,\r\n localParticipantId=OperationId\r\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\r\n| extend callId = CallId\r\n| extend ResultType = clean_result_type(ResultType)\r\n| extend Platform = tostring(OperationPayload.SdkPlatform) \r\n| extend CallType = tostring(OperationPayload.CallType);\r\nlet api_startScreenshare_attempt = api_startScreenshare;\r\nlet api_startScreenshare_failure = api_startScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\r\n//\r\nlet api_stopScreenshare = \r\nACSCallClientOperations\r\n| where OperationName == 'StopScreenShare'\r\n| extend\r\n EventInfo_Time = CallClientTimeStamp,\r\n localParticipantId=OperationId\r\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\r\n| extend callId = CallId\r\n| extend ResultType = clean_result_type(ResultType)\r\n| extend Platform = tostring(OperationPayload.SdkPlatform) \r\n| extend CallType = tostring(OperationPayload.CallType);\r\nlet api_stopScreenshare_attempt = api_stopScreenshare;\r\nlet api_stopScreenshare_failure = api_stopScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\r\n//\r\nlet api_createView = \r\nACSCallClientOperations\r\n| where OperationName == 'CreateView'\r\n| extend\r\n EventInfo_Time = CallClientTimeStamp,\r\n localParticipantId=OperationId\r\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\r\n| extend callId = CallId\r\n| extend ResultType = clean_result_type(ResultType)\r\n| extend Platform = tostring(OperationPayload.SdkPlatform) \r\n| extend CallType = tostring(OperationPayload.CallType);\r\nlet api_createView_attempt = api_createView;\r\nlet api_createView_failure = api_createView_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\r\n//\r\n// Leg reliability\r\n//\r\nlet callagent_init = \r\nACSCallClientOperations\r\n| where OperationName == 'CallAgentInit'\r\n| extend\r\n EventInfo_Time = CallClientTimeStamp,\r\n localParticipantId=coalesce(ParticipantId, strcat('using client instance id for out of call context operations: ', ClientInstanceId))\r\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\r\n| extend callId = CallId\r\n| extend ResultType = clean_result_type(ResultType)\r\n| extend Platform = tostring(OperationPayload.SdkPlatform) \r\n| extend CallType = tostring(OperationPayload.CallType);\r\nlet callagent_init_attempt = callagent_init;\r\nlet callagent_init_failure = callagent_init_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\r\n//\r\nlet leg_stopVideo = \r\nACSCallClientOperations\r\n| where OperationName == 'StopVideo'\r\n| extend\r\n EventInfo_Time = CallClientTimeStamp,\r\n localParticipantId=ParticipantId\r\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\r\n| extend callId = CallId\r\n| extend ResultType = clean_result_type(ResultType)\r\n| extend Platform = tostring(OperationPayload.SdkPlatform) \r\n| extend CallType = tostring(OperationPayload.CallType);\r\nlet leg_stopVideo_attempt = leg_stopVideo;\r\nlet leg_stopVideo_failure = leg_stopVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\r\n//\r\nlet leg_startVideo = \r\nACSCallClientOperations\r\n| where OperationName == 'StartVideo'\r\n| extend\r\n EventInfo_Time = CallClientTimeStamp,\r\n localParticipantId=ParticipantId\r\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\r\n| extend callId = CallId\r\n| extend ResultType = clean_result_type(ResultType)\r\n| extend Platform = tostring(OperationPayload.SdkPlatform) \r\n| extend CallType = tostring(OperationPayload.CallType);\r\nlet leg_startVideo_attempt = leg_startVideo;\r\nlet leg_startVideo_failure = leg_startVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\r\n//\r\nlet leg_startScreenshare = \r\nACSCallClientOperations\r\n| where OperationName == 'StartScreenShare'\r\n| extend\r\n EventInfo_Time = CallClientTimeStamp,\r\n localParticipantId=ParticipantId\r\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\r\n| extend callId = CallId\r\n| extend ResultType = clean_result_type(ResultType)\r\n| extend Platform = tostring(OperationPayload.SdkPlatform) \r\n| extend CallType = tostring(OperationPayload.CallType);\r\nlet leg_startScreenshare_attempt = leg_startScreenshare;\r\nlet leg_startScreenshare_failure = leg_startScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\r\n//\r\nlet leg_stopScreenshare = \r\nACSCallClientOperations\r\n| where OperationName == 'StopScreenShare'\r\n| extend\r\n EventInfo_Time = CallClientTimeStamp,\r\n localParticipantId=ParticipantId\r\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\r\n| extend callId = CallId\r\n| extend ResultType = clean_result_type(ResultType)\r\n| extend Platform = tostring(OperationPayload.SdkPlatform) \r\n| extend CallType = tostring(OperationPayload.CallType);\r\nlet leg_stopScreenshare_attempt = leg_stopScreenshare;\r\nlet leg_stopScreenshare_failure = leg_stopScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\r\n//\r\nlet leg_createView = \r\nACSCallClientOperations\r\n| where OperationName == 'CreateView'\r\n| extend\r\n EventInfo_Time = CallClientTimeStamp,\r\n localParticipantId=ParticipantId\r\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\r\n| extend callId = CallId\r\n| extend ResultType = clean_result_type(ResultType)\r\n| extend Platform = tostring(OperationPayload.SdkPlatform) \r\n| extend CallType = tostring(OperationPayload.CallType);\r\nlet leg_createView_attempt = leg_createView;\r\nlet leg_createView_failure = leg_createView_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\r\n//\r\nlet cdc_metrics_aggregation =\r\nunion\r\n ASF3(startCall_attempt, startCall_failure, 'reliability/api/StartCall', argStartDateTime, argEndDateTime),\r\n ASF3(accept_attempt, accept_failure, 'reliability/api/AcceptIncomingCall', argStartDateTime, argEndDateTime),\r\n ASF3(join_attempt, join_failure, 'reliability/api/Join', argStartDateTime, argEndDateTime),\r\n\tASF3(api_startVideo_attempt, api_startVideo_failure, 'reliability/api/StartVideo', argStartDateTime, argEndDateTime),\r\n\tASF3(api_stopVideo_attempt, api_stopVideo_failure, 'reliability/api/StopVideo', argStartDateTime, argEndDateTime),\r\n\tASF3(api_startScreenshare_attempt, api_startScreenshare_failure, 'reliability/api/StartScreenShare', argStartDateTime, argEndDateTime),\r\n\tASF3(api_stopScreenshare_attempt, api_stopScreenshare_failure, 'reliability/api/StopScreenShare', argStartDateTime, argEndDateTime),\r\n\tASF3(api_createView_attempt, api_createView_failure, 'reliability/api/CreateView', argStartDateTime, argEndDateTime)\r\n\t//\r\n// ASF3(callagent_init_attempt, callagent_init_failure, 'reliability/CallAgentInit', argStartDateTime, argEndDateTime),\r\n//\tASF3(leg_startVideo_attempt, leg_startVideo_failure, 'reliability/StartVideo', argStartDateTime, argEndDateTime),\r\n//\tASF3(leg_stopVideo_attempt, leg_stopVideo_failure, 'reliability/StopVideo', argStartDateTime, argEndDateTime),\r\n//\tASF3(leg_startScreenshare_attempt, leg_startScreenshare_failure, 'reliability/StartScreenShare', argStartDateTime, argEndDateTime),\r\n//\tASF3(leg_stopScreenshare_attempt, leg_stopScreenshare_failure, 'reliability/StopScreenShare', argStartDateTime, argEndDateTime),\r\n//\tASF3(leg_createView_attempt, leg_createView_failure, 'reliability/CreateView', argStartDateTime, argEndDateTime)\r\n| invoke AttemptSuccessFailureLegMetric(argStartDateTime, argEndDateTime)\r\n| extend timestampBin = bin(timestamp, 1d)\r\n| summarize\r\n legs_dcount = dcount(localParticipantId), \r\n// calls_dcount = dcount(callId),\r\n success_legs_dcount= dcountif(localParticipantId, succeeded),\r\n failed_legs_dcount= dcountif(localParticipantId, not(succeeded)),\r\n timestamp_max = max(timestamp)\r\n by \r\n metricName,\r\n SdkVersion,\r\n ResultType,\r\n Platform,\r\n CallType,\r\n SubCode,\r\n timestampBin\r\n;\r\nlet selected_metricName = dynamic('{MetricName}');\r\nlet sdkversion_selection = dynamic([{SDKVersion}]);\r\nlet resultType_selection = dynamic([{ResultType}]);\r\nlet platform_selection = dynamic([{platform}]);\r\ncdc_metrics_aggregation\r\n| where isempty(selected_metricName) or metricName in (selected_metricName)\r\n| extend Scenario = metricName_to_scenarioDisplayName(metricName)\r\n| summarize arg_max(timestamp_max, *) by metricName, SdkVersion, ResultType, SubCode, timestampBin, CallType, Platform\r\n| where array_length(sdkversion_selection) == 0 or SdkVersion in (sdkversion_selection)\r\n| where array_length(resultType_selection) == 0 or ResultType in (resultType_selection)\r\n| where array_length(platform_selection) == 0 or Platform in (platform_selection) \r\n| summarize reliability = sum(success_legs_dcount)*100.0/sum(legs_dcount) by {time_granularity}, Scenario\r\n| project {time_granularity}, Scenario, reliability",
+ "size": 0,
+ "aggregation": 3,
+ "title": "Scenario Reliability (Bottom legend shows reliability when hover, and it shows average reliability of the series when unhover)",
+ "noDataMessage": "No Scenario logs found in the specified time range",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "visualization": "linechart",
+ "chartSettings": {
+ "xAxis": "timestampBin",
+ "showLegend": true,
+ "showDataPoints": true,
+ "xSettings": {
+ "dateFormatSettings": {
+ "formatName": "shortDatePattern",
+ "showUtcTime": false
}
- ]
+ },
+ "ySettings": {
+ "numberFormatSettings": {
+ "unit": 1,
+ "options": {
+ "style": "decimal",
+ "useGrouping": false,
+ "maximumFractionDigits": 2
+ }
+ }
+ }
}
},
- {
- "columnMatch": "OperationDate",
- "formatter": 5
+ "name": "base reliability"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "# Issues and proposed improvements"
},
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- }
- },
- "sortBy": []
- },
- "conditionalVisibility": {
- "parameterName": "auth_operation",
- "comparison": "isNotEqualTo"
- },
- "name": "auth-by-operation"
- }
- ]
- },
- "customWidth": "50",
- "name": "auth-operation-names-group"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Authentication Operation Versions",
- "items": [
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSAuthIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| summarize count() by OperationVersion\r\n| render piechart",
- "size": 0,
- "noDataMessage": "No authentication operations found in the specified time range",
- "exportMultipleValues": true,
- "exportedParameters": [
- {
- "fieldName": "series",
- "parameterName": "auth_version",
- "parameterType": 1
- }
- ],
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "showPin": false,
- "name": "auth-operation-versions"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let SIPCodesChat = datatable(ResultSignature: string, SIPCode: string)\r\n[\r\n \"0\", \"Success\",\r\n \"100\", \"Trying\",\r\n \"180\", \"Ringing\",\r\n \"181\", \"Call Is Being Forwarded\",\r\n \"182\", \"Queued\",\r\n \"183\", \"Session Progress\",\r\n \"199\", \"Early Dialog Terminated\",\r\n \"200\", \"Success\",\r\n \"202\", \"Accepted\",\r\n \"204\", \"No Notification\",\r\n \"300\", \"Multiple Choices\",\r\n \"301\", \"Moved Permanently\",\r\n \"302\", \"Moved Temporarily\",\r\n \"305\", \"Use Proxy\",\r\n \"380\", \"Alternative Service\",\r\n \"400\", \"Bad Request\",\r\n \"401\", \"Unauthorized\",\r\n \"402\", \"Payment Required\",\r\n \"403\", \"Forbidden\",\r\n \"404\", \"Not Found\",\r\n \"405\", \"Method Not Allowed\",\r\n \"406\", \"Not Acceptable\",\r\n \"407\", \"Proxy Authentication Required\",\r\n \"408\", \"Request Timeout\",\r\n \"409\", \"Conflict\",\r\n \"410\", \"Gone\",\r\n \"411\", \"Length Required\",\r\n \"412\", \"Conditional Request Failed\",\r\n \"413\", \"Request Entity Too Large\",\r\n \"414\", \"Request-URI Too Large\",\r\n \"415\", \"Unsupported Media Type\",\r\n \"416\", \"Unsupported URI Scheme\",\r\n \"417\", \"Unknown Resource-Priority\",\r\n \"420\", \"Bad Extension\",\r\n \"421\", \"Extension Required\",\r\n \"422\", \"Session Interval Too Small\",\r\n \"423\", \"Interval Too Brief\",\r\n \"424\", \"Bad Location Information\",\r\n \"428\", \"Use Identity Header\",\r\n \"429\", \"Provide Referrer Identity\",\r\n \"430\", \"Flow Failed\",\r\n \"433\", \"Anonymity Disallowed\",\r\n \"436\", \"Bad Identity-Info\",\r\n \"437\", \"Unsupported Certificate\",\r\n \"438\", \"Invalid Identity Header\",\r\n \"439\", \"First Hop Lacks Outbound Support\",\r\n \"440\", \"Max-Breadth Exceeded\",\r\n \"469\", \"Bad Info Package\",\r\n \"470\", \"Consent Needed\",\r\n \"480\", \"Temporarily Unavailable\",\r\n \"481\", \"Call/Transaction Does Not Exist\",\r\n \"482\", \"Loop Detected\",\r\n \"483\", \"Too Many Hops\",\r\n \"484\", \"Address Incomplete\",\r\n \"485\", \"Ambiguous\",\r\n \"486\", \"Busy Here\",\r\n \"487\", \"Request Terminated\",\r\n \"488\", \"Not Acceptable Here\",\r\n \"489\", \"Bad Event\",\r\n \"491\", \"Request Pending\",\r\n \"493\", \"Undecipherable\",\r\n \"494\", \"Security Agreement Required\",\r\n \"500\", \"Internal Server Error\",\r\n \"501\", \"Not Implemented\",\r\n \"502\", \"Bad Gateway\",\r\n \"503\", \"Service Unavailable\",\r\n \"504\", \"Server Time-out\",\r\n \"505\", \"Version Not Supported\",\r\n \"513\", \"Message Too Large\",\r\n \"555\", \"Push Notification Service Not Supported\",\r\n \"580\", \"Precondition Failure\",\r\n \"600\", \"Busy Everywhere\",\r\n \"603\", \"Decline\",\r\n \"604\", \"Does Not Exist Anywhere\",\r\n \"606\", \"Not Acceptable\",\r\n \"607\", \"Unwanted\",\r\n \"608\", \"Rejected\",\r\n];\r\n\r\nlet other_auth_versions = ACSAuthIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| summarize operation_count=count() by OperationVersion\r\n| order by operation_count desc\r\n| extend Rank=row_number()\r\n| where Rank > 5\r\n| project OperationVersion;\r\n\r\nACSAuthIncomingOperations\r\n| where TimeGenerated {time_range:query} and (OperationVersion in (dynamic([{auth_version}])) or iff(\"Other\" in (dynamic([{auth_version}])), (OperationVersion in (other_auth_versions)), false))\r\n| join kind=leftouter SIPCodesChat on ResultSignature\r\n| extend OperationDate=strcat(\"📅\", format_datetime(TimeGenerated, 'MM/dd/y'))\r\n| extend OperationTime=format_datetime(TimeGenerated, 'hh:mm:ss')\r\n| extend ResultIcon=iff(ResultType == \"Succeeded\", \"✔️\", \"❌\")\r\n| extend Result=strcat(ResultIcon, \" \", ResultSignature, \": \", SIPCode)\r\n| order by TimeGenerated\r\n| project OperationName, Identity, Level, Result, OperationDate, OperationTime, DurationMs",
- "size": 0,
- "title": "Authentication operations with result type {auth_version}",
- "noDataMessage": "No authentication operations found for the specified time range and result type",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
- },
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "OperationDate",
- "formatter": 5
+ "conditionalVisibility": {
+ "parameterName": "MetricName",
+ "comparison": "isNotEqualTo"
},
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- }
- },
- "sortBy": []
- },
- "conditionalVisibility": {
- "parameterName": "auth_version",
- "comparison": "isNotEqualTo"
- },
- "name": "auth-by-version"
- }
- ]
- },
- "customWidth": "50",
- "name": "auth-operation-versions-group"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Identity drill-down",
- "items": [
- {
- "type": 9,
- "content": {
- "version": "KqlParameterItem/1.0",
- "parameters": [
+ "name": "text - 8"
+ },
{
- "id": "0c0b56fd-ffd9-4761-b14e-c916660f9ccc",
- "version": "KqlParameterItem/1.0",
- "name": "identity",
- "label": "Identity",
- "type": 2,
- "description": "Choose an identity to visualize",
- "query": "ACSAuthIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| order by TimeGenerated\r\n| distinct Identity\r\n| where isnotempty(Identity)",
- "value": null,
- "typeSettings": {
- "additionalResourceOptions": [],
- "showDefault": false
- },
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- }
- ],
- "style": "pills",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "name": "auth-identity-parameters"
- },
- {
- "type": 1,
- "content": {
- "json": "**Select an identity from the drop-down menu to display its associated data**",
- "style": "info"
- },
- "conditionalVisibility": {
- "parameterName": "identity",
- "comparison": "isEqualTo"
- },
- "name": "identity-drilldown-info"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let SIPCodes = datatable(ParticipantEndReason: string, SIPCode: string)\r\n[\r\n \"0\", \"Success\",\r\n \"100\", \"Trying\",\r\n \"180\", \"Ringing\",\r\n \"181\", \"Call Is Being Forwarded\",\r\n \"182\", \"Queued\",\r\n \"183\", \"Session Progress\",\r\n \"199\", \"Early Dialog Terminated\",\r\n \"200\", \"Success\",\r\n \"202\", \"Accepted\",\r\n \"204\", \"No Notification\",\r\n \"300\", \"Multiple Choices\",\r\n \"301\", \"Moved Permanently\",\r\n \"302\", \"Moved Temporarily\",\r\n \"305\", \"Use Proxy\",\r\n \"380\", \"Alternative Service\",\r\n \"400\", \"Bad Request\",\r\n \"401\", \"Unauthorized\",\r\n \"402\", \"Payment Required\",\r\n \"403\", \"Forbidden\",\r\n \"404\", \"Not Found\",\r\n \"405\", \"Method Not Allowed\",\r\n \"406\", \"Not Acceptable\",\r\n \"407\", \"Proxy Authentication Required\",\r\n \"408\", \"Request Timeout\",\r\n \"409\", \"Conflict\",\r\n \"410\", \"Gone\",\r\n \"411\", \"Length Required\",\r\n \"412\", \"Conditional Request Failed\",\r\n \"413\", \"Request Entity Too Large\",\r\n \"414\", \"Request-URI Too Large\",\r\n \"415\", \"Unsupported Media Type\",\r\n \"416\", \"Unsupported URI Scheme\",\r\n \"417\", \"Unknown Resource-Priority\",\r\n \"420\", \"Bad Extension\",\r\n \"421\", \"Extension Required\",\r\n \"422\", \"Session Interval Too Small\",\r\n \"423\", \"Interval Too Brief\",\r\n \"424\", \"Bad Location Information\",\r\n \"428\", \"Use Identity Header\",\r\n \"429\", \"Provide Referrer Identity\",\r\n \"430\", \"Flow Failed\",\r\n \"433\", \"Anonymity Disallowed\",\r\n \"436\", \"Bad Identity-Info\",\r\n \"437\", \"Unsupported Certificate\",\r\n \"438\", \"Invalid Identity Header\",\r\n \"439\", \"First Hop Lacks Outbound Support\",\r\n \"440\", \"Max-Breadth Exceeded\",\r\n \"469\", \"Bad Info Package\",\r\n \"470\", \"Consent Needed\",\r\n \"480\", \"Temporarily Unavailable\",\r\n \"481\", \"Call/Transaction Does Not Exist\",\r\n \"482\", \"Loop Detected\",\r\n \"483\", \"Too Many Hops\",\r\n \"484\", \"Address Incomplete\",\r\n \"485\", \"Ambiguous\",\r\n \"486\", \"Busy Here\",\r\n \"487\", \"Request Terminated\",\r\n \"488\", \"Not Acceptable Here\",\r\n \"489\", \"Bad Event\",\r\n \"491\", \"Request Pending\",\r\n \"493\", \"Undecipherable\",\r\n \"494\", \"Security Agreement Required\",\r\n \"500\", \"Internal Server Error\",\r\n \"501\", \"Not Implemented\",\r\n \"502\", \"Bad Gateway\",\r\n \"503\", \"Service Unavailable\",\r\n \"504\", \"Server Time-out\",\r\n \"505\", \"Version Not Supported\",\r\n \"513\", \"Message Too Large\",\r\n \"555\", \"Push Notification Service Not Supported\",\r\n \"580\", \"Precondition Failure\",\r\n \"600\", \"Busy Everywhere\",\r\n \"603\", \"Decline\",\r\n \"604\", \"Does Not Exist Anywhere\",\r\n \"606\", \"Not Acceptable\",\r\n \"607\", \"Unwanted\",\r\n \"608\", \"Rejected\",\r\n];\r\n\r\nACSCallDiagnostics\r\n| join kind=inner ACSCallSummary on CorrelationId, ParticipantId, EndpointId\r\n| where CallStartTime {time_range:query} and Identifier == substring(\"{identity}\", indexof(\"{identity}\", \"acs:\"))\r\n| join kind=leftouter SIPCodes on ParticipantEndReason\r\n| extend EndReason=strcat(ParticipantEndReason, \": \", SIPCode)\r\n| extend CallDate=strcat(\"📅\", format_datetime(CallStartTime, 'MM/dd/y'))\r\n| extend UnsuccessfulEndReason = iff((ParticipantEndReason startswith \"0\") or (ParticipantEndReason startswith \"2\"), \"\", \"🛑\")\r\n| extend ParticipantTime=format_datetime(ParticipantStartTime, 'hh:mm:ss')\r\n| extend EndpointType = case( indexof(EndpointType, \"VoIP\") != -1, strcat(\"🗣️ \", EndpointType),\r\n indexof(EndpointType, \"PSTN\") != -1, strcat(\"📞 \", EndpointType),\r\n indexof(EndpointType, \"Bot\") != -1, strcat(\"🤖 \", EndpointType),\r\n indexof(EndpointType, \"Server\") != -1, strcat(\"🖥️ \", EndpointType),\r\n indexof(EndpointType, \"Unknown\") != -1, strcat(\"👽 \", EndpointType),\r\n EndpointType\r\n )\r\n| extend Participant = strcat(EndpointType, \" \", UnsuccessfulEndReason, \" \", ParticipantTime, \" (\", ParticipantId, \")\")\r\n| extend MediaType = case( indexof(MediaType, \"Audio\") != -1, strcat(\"🔊 \", MediaType),\r\n indexof(MediaType, \"Video\") != -1, strcat(\"🎥 \", MediaType),\r\n indexof(MediaType, \"VBSS\") != -1, strcat(\"💻 \", MediaType),\r\n indexof(MediaType, \"AppSharing\") != -1, strcat(\"📲 \", MediaType),\r\n MediaType\r\n )\r\n| project CallDate, CallId = strcat(\"📞 \", CorrelationId), Participant, MediaType, ParticipantDuration, EndReason, JitterAvg, PacketLossRateAvg, RoundTripTimeAvg",
- "size": 0,
- "title": "Calls for identity {identity}",
- "noDataMessage": "No calls found for the specified time range and identity",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "CallDate",
- "formatter": 5
- },
- {
- "columnMatch": "CallId",
- "formatter": 5
- },
- {
- "columnMatch": "Participant",
- "formatter": 5
- },
- {
- "columnMatch": "MediaType",
- "formatter": 5
- },
- {
- "columnMatch": "EndReason",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "startsWith",
- "thresholdValue": "2",
- "representation": "success",
- "text": "{0}{1}"
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "items": [
+ {
+ "type": 1,
+ "content": {
+ "json": "Table below captures key issues present in this scenario for selected time period, please use table and time chart to investigate and correlate spikes with other dimensions like OS, browser, SDK version by selecting filters above.\n\n__Please click on a row in the below table to drill down further__",
+ "style": "info"
},
- {
- "operator": "startsWith",
- "thresholdValue": "0",
- "representation": "success",
- "text": "{0}{1}"
+ "name": "text - 5"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let metricsMetadata = () {\n\tdatatable (\n metricName: string, \n metadataValidAsOf: datetime, \n enabled: bool, \n targetThresholdLeg: real, \n cmpOperatorLeg: string, \n aggregLegRounding: int, \n aggregLegUnit: string, \n description: string, \n priority: int\n ) \n [\n\t\t\t\"reliability/StopVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StopVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/StopScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StopScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/StartVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/api/StartAudio\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartAudio\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/EnterCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/EnterCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/CreateView\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/CreateView\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/CallAgentInit\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/CallAgentInit\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/api/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"performance/api/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(5000),\"<=\",int(1),\"ms\", \"\", int(0),\n\t\t\t\"performance/api/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(5000),\"<=\",int(1),\"ms\", \"\", int(0),\n\t\t\t\"performance/api/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(5000),\"<=\",int(1),\"ms\", \"\", int(0),\n\t\t] \n | where enabled\n};\nlet SubCodes = datatable(\n message: string,\n webConfig_overrideMessage: string,\n webConfig_legacyMessage: string,\n nativeConfig_overrideMessage: string,\n code: real,\n subCode: string,\n resultCategories: string,\n clientOrService: string\n)[\n \"Failed to initialize CallClient. Please try again, if issue persists, gather browser console logs, and contact Azure Communication Services support.\", \"\", \"Failed to initialize CallClient\", \"\", \"500\", \"40000\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent. Please try again, if issue persists, gather browser console logs, and contact Azure Communication Services support.\", \"\", \"Failed to create CallAgent\", \"\", \"409\", \"40001\", \"UnexpectedClientError\", \"client\",\n \"Failed to create TeamsCallAgent. Please try again, if issue persists, gather browser console logs, and contact Azure Communication Services support.\", \"\", \"Failed to create TeamsCallAgent\", \"\", \"409\", \"40002\", \"UnexpectedClientError\", \"client\",\n \"Failed to create a URL object with the ICE server URL provided.\", \"\", \"Error processing relay information. Possibly invalid url: {0}\", \"\", \"400\", \"40003\", \"ExpectedError\", \"client\",\n \"The ICE server url must contain 'turn', 'turns', or 'stun'.\", \"\", \"Error processing relay information. Unrecognized schema\", \"\", \"400\", \"40004\", \"ExpectedError\", \"client\",\n \"Failed setup proxy, the url is too short\", \"\", \"\", \"\", \"400\", \"40005\", \"ExpectedError\", \"client\",\n \"Failed setup proxy, the protocol is not https or http\", \"\", \"\", \"\", \"400\", \"40006\", \"ExpectedError\", \"client\",\n \"Failed to create a URL object with the proxy URL provided.\", \"\", \"Setup failed. Proxy url is invalid: {0}\", \"\", \"400\", \"40007\", \"ExpectedError\", \"client\",\n \"CallClient instance can support only one CallAgent or TeamsCallAgent create new CallClient instance to create new CallAgent or TeamsCallAgent\", \"\", \"\", \"\", \"400\", \"40008\", \"ExpectedError\", \"client\",\n \"EmergencyCountryCode is invalid, max length is 10\", \"\", \"\", \"\", \"400\", \"40009\", \"ExpectedError\", \"client\",\n \"ACS Web Calling SDK must be used through https, file:, or localhost\", \"\", \"\", \"\", \"400\", \"40100\", \"ExpectedError\", \"client\",\n \"Failed to create CallAgent, timeout during initialization of the calling base stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to create stack base due to timeout during initialization\", \"\", \"408\", \"40101\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, failure during initialization of the calling base stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to create stack base due to failure in intialization\", \"\", \"500\", \"40102\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, failure to initialize calling user stack because calling base stack failed to create. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Base stack failed to create\", \"\", \"500\", \"40103\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, timeout during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"User stack init timeout\", \"\", \"408\", \"40104\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, failure during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"User stack init failed\", \"\", \"500\", \"40105\", \"UnexpectedClientError\", \"client\",\n \"Failed to set configurations for the calling stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Unable to parse configuration\", \"\", \"500\", \"40106\", \"UnexpectedClientError\", \"client\",\n \"Failed to set user configurations for calling stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to set configuration for stack\", \"\", \"500\", \"40107\", \"UnexpectedClientError\", \"client\",\n \"Failed to get device manager due to internal call stack undefined. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to get device manager due to internal call stack undefined\", \"\", \"500\", \"40108\", \"UnexpectedClientError\", \"client\",\n \"Failed to set configuration parameters for the calling stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to initialize callclient\", \"\", \"500\", \"40109\", \"UnexpectedClientError\", \"client\",\n \"Fetched undefined configurations for the calling stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Found undefined configs in ECS response: {0}\", \"\", \"500\", \"40110\", \"UnexpectedClientError\", \"client\",\n \"Failed to connect to Azure Communication Services infrastructure. Please try again and check the browser's network requests. If the requests keep failing, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to create trouter service\", \"\", \"500\", \"40111\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize connection to Azure Communication Services infrastructure. Please try again and check the browser's network requests. If the requests keep failing, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Signaling init failed\", \"\", \"500\", \"40112\", \"UnexpectedClientError\", \"client\",\n \"Already connected to Azure Communication Services infrastructure. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Signaling service already initialized\", \"\", \"500\", \"40113\", \"ExpectedError\", \"client\",\n \"Failed to connect to Azure Communication Services infrastructure, timeout during initialization. Please try again and check the browser's network requests. If the requests keep failing, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Signaling init timeout, request took longer than {0} ms\", \"\", \"408\", \"40114\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, unable to initialize connection to Azure Communication Services infrastructure. Please try again and check the browser's network requests. If the requests keep failing, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Signaling failed to initialize.\", \"\", \"412\", \"40115\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, media failure during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"40116\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, signaling failure during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"40117\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, internal stack failure during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"40118\", \"UnexpectedClientError\", \"client\",\n \"Using proxy or custom TURN for calls involving Teams is disabled\", \"\", \"\", \"\", \"403\", \"40200\", \"ExpectedError\", \"client\",\n \"Failed to parse AccessToken\", \"\", \"\", \"\", \"500\", \"40201\", \"UnexpectedClientError\", \"client\",\n \"Call to yourself is not supported.\", \"\", \"\", \"\", \"400\", \"40202\", \"ExpectedError\", \"client\",\n \"Call Agent is already disposed\", \"\", \"\", \"\", \"409\", \"40203\", \"ExpectedError\", \"client\",\n \"Teams Call Agent is already disposed\", \"\", \"\", \"\", \"409\", \"40204\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to CallAgent event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"40205\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from CallAgent event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"40206\", \"ExpectedError\", \"client\",\n \"Device type must be msft-acs-mesh-deviceType-v2 to join immersive call\", \"\", \"\", \"\", \"400\", \"40207\", \"ExpectedError\", \"client\",\n \"Failed to start or join call, call stack did not initialize\", \"\", \"\", \"\", \"500\", \"40208\", \"UnexpectedClientError\", \"client\",\n \"Invalid join locator specified.\", \"\", \"Invalid call configuration\", \"\", \"400\", \"40209\", \"ExpectedError\", \"client\",\n \"The provided Teams meeting link is invalid.\", \"\", \"Invalid meeting link\", \"\", \"400\", \"40210\", \"ExpectedError\", \"client\",\n \"The provided Teams For Life meeting link is invalid.\", \"\", \"Invalid TFL meeting link\", \"\", \"400\", \"40211\", \"ExpectedError\", \"client\",\n \"Starting a group call must include thread ID in StartTeamsGroupCallOptions.\", \"\", \"\", \"\", \"400\", \"40212\", \"ExpectedError\", \"client\",\n \"Starting a one to one with thread ID is invalid.\", \"\", \"\", \"\", \"400\", \"40213\", \"ExpectedError\", \"client\",\n \"Display name is not allowed to be set for Teams users.\", \"\", \"\", \"\", \"400\", \"40214\", \"ExpectedError\", \"client\",\n \"Display name is too long.\", \"\", \"\", \"\", \"400\", \"40215\", \"ExpectedError\", \"client\",\n \"Failed to create CallAgent. Please try again, if issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"40216\", \"UnexpectedClientError\", \"client\",\n \"Attempted to get AccessToken before initialization\", \"\", \"\", \"\", \"422\", \"40217\", \"UnexpectedClientError\", \"client\",\n \"Invalid push notification data provided. No 'incomingCallContext' key found in the PushNotificatitonData.\", \"\", \"Invalid push notification data provided\", \"\", \"400\", \"40218\", \"ExpectedError\", \"client\",\n \"Failed to handle push notification\", \"\", \"\", \"\", \"500\", \"40219\", \"UnexpectedClientError\", \"client\",\n \"Incoming Call push notification payload provided has too many keys. Only 'incomingCallContext' key is expected in the PushNotificatitonData.\", \"\", \"Invalid Incoming Call push notification payload provided\", \"\", \"400\", \"40220\", \"ExpectedError\", \"client\",\n \"Invalid push notification data provided. No 'incomingCallContext' key found in the PushNotificatitonData.\", \"\", \"No 'incomingCallContext' provided in event payload\", \"\", \"400\", \"40221\", \"ExpectedError\", \"client\",\n \"The decoded 'incomingCallContext' data is invalid.\", \"\", \"Invalid Incoming Call push notification payload data provided\", \"\", \"400\", \"40222\", \"ExpectedError\", \"client\",\n \"Incoming Call is already being processed\", \"\", \"\", \"\", \"400\", \"40223\", \"ExpectedError\", \"client\",\n \"Failed to handle Incoming Call push notification\", \"\", \"\", \"\", \"500\", \"40224\", \"UnexpectedClientError\", \"client\",\n \"Missed call\", \"\", \"\", \"\", \"400\", \"40225\", \"ExpectedError\", \"client\",\n \"AssertIsObject failed. : userIds must be object\", \"\", \"\", \"\", \"400\", \"40226\", \"ExpectedError\", \"client\",\n \"AssertNotNull failed. : userIds cannot be null\", \"\", \"\", \"\", \"400\", \"40227\", \"ExpectedError\", \"client\",\n \"Failed to create CallAgent, an instance of CallAgent associated with this identity already exists. Please dispose the existing CallAgent, or create a new one with a different identity.\", \"\", \"Failed to create call agent, call agent for this ACS Id already exists\", \"\", \"409\", \"40228\", \"ExpectedError\", \"client\",\n \"CallAgent must be created only with ACS token\", \"\", \"\", \"\", \"403\", \"40229\", \"ExpectedError\", \"client\",\n \"Failed to create TeamsCallAgent, an instance of TeamsCallAgent associated with this identity already exists. Please dispose the existing TeamsCallAgent before creating a new one.\", \"\", \"Failed to create call agent, call agent for this ACS Id already exists\", \"\", \"409\", \"40230\", \"ExpectedError\", \"client\",\n \"TeamsCallAgent must be created only with Teams token\", \"\", \"\", \"\", \"403\", \"40231\", \"ExpectedError\", \"client\",\n \"Failed to get token\", \"\", \"\", \"\", \"409\", \"40232\", \"UnexpectedClientError\", \"client\",\n \"Refreshed AccessToken User Id doesnt match initial User Id.\", \"\", \"\", \"\", \"400\", \"40233\", \"ExpectedError\", \"client\",\n \"Access token is expired and failed to fetch a valid one after retries.\", \"\", \"\", \"\", \"400\", \"40234\", \"ExpectedError\", \"client\",\n \"AccessToken expired\", \"\", \"\", \"\", \"401\", \"40235\", \"ExpectedError\", \"client\",\n \"Action not allowed.\", \"\", \"\", \"\", \"403\", \"40236\", \"ExpectedError\", \"client\",\n \"Failed to hangup call.\", \"\", \"\", \"\", \"500\", \"40237\", \"UnexpectedServerError\", \"client\",\n \"Joining a Teams for life meeting is not supported\", \"\", \"\", \"\", \"400\", \"40238\", \"ExpectedError\", \"client\",\n \"Failed to get raw device stream track\", \"\", \"\", \"\", \"500\", \"40600\", \"UnexpectedClientError\", \"client\",\n \"Failed to get raw device stream track, make sure there is available device\", \"\", \"\", \"\", \"412\", \"40601\", \"UnexpectedClientError\", \"client\",\n \"Failed to get device manager.\", \"\", \"\", \"\", \"500\", \"40602\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to DeviceManager event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"40603\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from DeviceManager event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"40604\", \"ExpectedError\", \"client\",\n \"Unable to access device manager\", \"\", \"\", \"\", \"500\", \"40605\", \"UnexpectedClientError\", \"client\",\n \"Failed to enumerate speakers, it is not supported to enumerate/select speakers on Android Chrome, iOS Safari, nor MacOS Safari.\", \"\", \"This device does not support speaker enumeration.\", \"\", \"405\", \"40606\", \"ExpectedError\", \"client\",\n \"Microphone selection timed out.\", \"\", \"\", \"\", \"408\", \"40607\", \"UnexpectedClientError\", \"client\",\n \"There was an issue with selecting the microphone\", \"\", \"\", \"\", \"500\", \"40608\", \"UnexpectedClientError\", \"client\",\n \"Speaker selection timed out.\", \"\", \"\", \"\", \"408\", \"40609\", \"UnexpectedClientError\", \"client\",\n \"There was an issue with selecting the speaker\", \"\", \"\", \"\", \"500\", \"40610\", \"UnexpectedClientError\", \"client\",\n \"This device does not support speaker selection.\", \"\", \"\", \"\", \"405\", \"40611\", \"ExpectedError\", \"client\",\n \"At least one permission must be requested\", \"\", \"\", \"\", \"400\", \"40612\", \"ExpectedError\", \"client\",\n \"Failed to obtain permission to use microphone and/or camera, it was denied or it failed. Please ensure to allow the permissions in the browser's setttings and in the OS setttings.\", \"\", \"Permissions not granted or failed: {0}\", \"\", \"400\", \"40613\", \"ExpectedError\", \"client\",\n \"Failed to ask for device permissions Please ensure to allow the permissions in the browser's setttings and in the OS setttings and try again. If issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to get audio video permissions\", \"\", \"500\", \"40614\", \"UnexpectedClientError\", \"client\",\n \"Invalid AudioDeviceInfo object passed in. Ensure it has an Id.\", \"\", \"The device argument is invalid\", \"\", \"400\", \"40615\", \"ExpectedError\", \"client\",\n \"The device is not selectable\", \"\", \"\", \"\", \"400\", \"40616\", \"ExpectedError\", \"client\",\n \"Attempted invalid operation during Emergency Call.\", \"\", \"{0} operation is not allowed during Emergency Call\", \"\", \"500\", \"41000\", \"ExpectedError\", \"client\",\n \"{0} failed\", \"\", \"\", \"\", \"500\", \"41001\", \"UnexpectedClientError\", \"client\",\n \"Unable to get remote audio stream, getMediaStream returned undefined\", \"\", \"\", \"\", \"500\", \"41002\", \"UnexpectedClientError\", \"client\",\n \"Unable to get remote audio stream, getMediaStream returned error\", \"\", \"\", \"\", \"500\", \"41003\", \"UnexpectedClientError\", \"client\",\n \"Getting raw audio media stream is currently disabled by Azure Communication Services.\", \"\", \"Getting raw audio media strema is currently dissabled\", \"\", \"409\", \"41004\", \"ExpectedError\", \"client\",\n \"Failed to accept the Incoming Call\", \"\", \"\", \"\", \"500\", \"41005\", \"UnexpectedClientError\", \"client\",\n \"Failed to accept the incoming call, it is not in the Ringing state. Subcscribe to CallAgent's 'incomingCall' event to accept the incoming call.\", \"\", \"Call cannot be accepted because it is not in Ringing state\", \"\", \"400\", \"41006\", \"ExpectedError\", \"client\",\n \"Failed to reject the incoming call, it is not in the Ringing state. Subcscribe to CallAgent's 'incomingCall' event to reject the incoming call.\", \"\", \"Call cannot be rejectd because it is not in Ringing state\", \"\", \"400\", \"41007\", \"ExpectedError\", \"client\",\n \"Failed to get raw stream from local audio stream\", \"\", \"\", \"\", \"500\", \"41008\", \"UnexpectedClientError\", \"client\",\n \"Failed to set raw input audio stream\", \"\", \"\", \"\", \"500\", \"41009\", \"UnexpectedClientError\", \"client\",\n \"Failed to unset raw input audio stream\", \"\", \"\", \"\", \"500\", \"41010\", \"UnexpectedClientError\", \"client\",\n \"Failed to process audio because the calling stack is undefined. Please collect browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to process audio because of internal call stack error\", \"\", \"500\", \"41011\", \"UnexpectedClientError\", \"client\",\n \"Removing local video stream due to video fail UFD being raised before call connected. Please ensure to allow video permissions in the browser's setttings and in the OS setttings, and ensure the camera device is not being used by another process.\", \"\", \"Removing local video stream due to video fail UFD being raised before call connected. UFD: {0}, value: {1}, call direction: {2}\", \"\", \"409\", \"41012\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop audio on microphone device not functioning or capture mute event {0} with value {1}\", \"\", \"\", \"\", \"400\", \"41013\", \"UnexpectedClientError\", \"client\",\n \"Failed to instantiate the Call\", \"\", \"\", \"\", \"500\", \"41014\", \"UnexpectedClientError\", \"client\",\n \"Failed to mute microphone. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to mute microphone\", \"\", \"500\", \"41015\", \"UnexpectedClientError\", \"client\",\n \"Failed to unmute microphone. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to unmute microphone\", \"\", \"400\", \"41016\", \"UnexpectedClientError\", \"client\",\n \"Failed to recover the microphone audio after bad microphone UFD recovered. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to unmute and start audio, microphone device not functioning\", \"\", \"410\", \"41017\", \"UnexpectedClientError\", \"client\",\n \"Mute other participants is currently disabled by ACS service.\", \"\", \"Mute other participants disabled.\", \"\", \"403\", \"41018\", \"ExpectedError\", \"client\",\n \"Failed to mute all remote participants\", \"\", \"\", \"\", \"500\", \"41019\", \"UnexpectedClientError\", \"client\",\n \"Failed to mute incoming audio\", \"\", \"\", \"\", \"500\", \"41020\", \"UnexpectedClientError\", \"client\",\n \"Failed to unmute incoming audio\", \"\", \"\", \"\", \"500\", \"41021\", \"UnexpectedClientError\", \"client\",\n \"Failed to send DTMF tone\", \"\", \"\", \"\", \"400\", \"41022\", \"UnexpectedClientError\", \"client\",\n \"Invalid value passed to DtfmTone\", \"\", \"\", \"\", \"422\", \"41023\", \"ExpectedError\", \"client\",\n \"Failed to start audio before starting video\", \"\", \"\", \"\", \"500\", \"41024\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video, LocalVideoStream instance is invalid or empty. Please pass in a LocalVideoStream instance.\", \"\", \"Failed to start video, localVideoStream cannot be null\", \"\", \"400\", \"41025\", \"ExpectedError\", \"client\",\n \"Failed to start video, localVideoStream is not an instance of LocalVideoStream\", \"\", \"\", \"\", \"400\", \"41026\", \"ExpectedError\", \"client\",\n \"Failed to start video, video is already started.\", \"\", \"Failed to start video, local video is already on\", \"\", \"400\", \"41027\", \"ExpectedError\", \"client\",\n \"Failed to set media stream\", \"\", \"\", \"\", \"500\", \"41028\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video\", \"\", \"\", \"\", \"500\", \"41029\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop video, video is already stopped.\", \"\", \"Failed to stop video, local video is already off\", \"\", \"400\", \"41030\", \"ExpectedError\", \"client\",\n \"Failed to start video because the calling stack is undefined. Please gether browser console logs, .HAR files, and contact Aure Communication Services support.\", \"\", \"Failed to process video because of internal call stack error\", \"\", \"500\", \"41031\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop video, invalid argument. LocalVideoStream used as an input is currently not being sent.\", \"\", \"Invalid LocalVideoStream, this LocalVideoStream is not being sent\", \"\", \"400\", \"41032\", \"ExpectedError\", \"client\",\n \"Failed to hold the call. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to hold call\", \"\", \"500\", \"41033\", \"UnexpectedClientError\", \"client\",\n \"Failed to resume the call.Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to resume call\", \"\", \"500\", \"41034\", \"UnexpectedClientError\", \"client\",\n \"Failed to start screen share, screen share is already started.\", \"\", \"Failed to start screen share, screen share is already on. Must stop and start again.\", \"\", \"400\", \"41035\", \"ExpectedError\", \"client\",\n \"Failed to start raw screen sharing, localVideoStream is not an instance of LocalVideoStream\", \"\", \"\", \"\", \"400\", \"41036\", \"ExpectedError\", \"client\",\n \"Unable to get media stream from local video stream for raw media screen sharing. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Unable to get media stram from local video stream for screen sharing\", \"\", \"500\", \"41037\", \"UnexpectedClientError\", \"client\",\n \"Failed to set raw media stream for screen sharing. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to set media stream for screen sharing\", \"\", \"422\", \"41038\", \"UnexpectedClientError\", \"client\",\n \"Failed to get raw screen sharing stream. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to get media stream for screen sharing\", \"\", \"422\", \"41039\", \"UnexpectedClientError\", \"client\",\n \"Failed to start screen sharing\", \"\", \"\", \"\", \"500\", \"41040\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop screen share, screen share is already stopped.\", \"\", \"Failed to stop screen share, screen share is already off\", \"\", \"400\", \"41041\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to Call event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"41042\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Call event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"41043\", \"ExpectedError\", \"client\",\n \"Only single LocalVideoStream is supported currently\", \"\", \"\", \"\", \"400\", \"41044\", \"ExpectedError\", \"client\",\n \"Stream is not an instance of LocalVideoStream\", \"\", \"\", \"\", \"400\", \"41045\", \"ExpectedError\", \"client\",\n \"Only single LocalAudioStream is supported currently\", \"\", \"\", \"\", \"400\", \"41046\", \"ExpectedError\", \"client\",\n \"Stream is not an instance of LocalAudioStream\", \"\", \"\", \"\", \"400\", \"41047\", \"ExpectedError\", \"client\",\n \"Failed to start video during call setup process. Please ensure to allow video permissions in the browser's setttings and in the OS setttings, and ensure the camera device is not being used by another process.\", \"\", \"Video failed to start during call-{0} process.\", \"\", \"410\", \"41048\", \"UnexpectedClientError\", \"client\",\n \"Failed to start audio during call setup process. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Audio failed to start during call-{0} process.\", \"\", \"400\", \"41049\", \"UnexpectedClientError\", \"client\",\n \"Failed to force isAvailable flag to False during large meeting\", \"\", \"\", \"\", \"500\", \"41050\", \"UnexpectedClientError\", \"client\",\n \"Failed to dispose view in large meeting\", \"\", \"\", \"\", \"500\", \"41051\", \"UnexpectedClientError\", \"client\",\n \"Not able to add unkown participant.\", \"\", \"\", \"\", \"400\", \"41052\", \"ExpectedError\", \"client\",\n \"Participant is already in the call.\", \"\", \"{0} is already in the call\", \"\", \"400\", \"41053\", \"ExpectedError\", \"client\",\n \"Failed to remove the specified participant. The participant is not in the call.\", \"\", \"{0} is not in the call.\", \"\", \"400\", \"41054\", \"ExpectedError\", \"client\",\n \"Add participant failed: thread ID is missing in options.\", \"\", \"\", \"\", \"400\", \"41055\", \"ExpectedError\", \"client\",\n \"Failed to start or join to the call, Teams Enterprise voice policy is not enabled for this Azure Communication Services resource. Follow the tutorial online to enable it.\", \"\", \"Teams Enterprise voice is not enabled. Teams user is not eligible to make PSTN call\", \"\", \"412\", \"41056\", \"ExpectedError\", \"client\",\n \"Failed to get server call Id\", \"\", \"\", \"\", \"500\", \"41057\", \"UnexpectedClientError\", \"client\",\n \"Failed to get the MediaStream to initialize the Volume indicator. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"failed to getMediaStreamTrack\", \"\", \"500\", \"41058\", \"UnexpectedClientError\", \"client\",\n \"Failed to setup volume calcualtor using AudioContext, please retry getVolumeindicator on a working audio stream with exponential backoff\", \"\", \"\", \"\", \"500\", \"41059\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to Volume Indicator event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"400\", \"41060\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Volume Indicator event, unknown event name.\", \"\", \"Not able to unsubscribe to event {0}, unknown event name\", \"\", \"400\", \"41061\", \"ExpectedError\", \"client\",\n \"Failed to setup volume calculator, please retry after exponential backoff\", \"\", \"\", \"\", \"500\", \"41062\", \"UnexpectedClientError\", \"client\",\n \"Failed to get serverCallId, serverCallId is empty\", \"\", \"\", \"\", \"404\", \"41063\", \"UnexpectedClientError\", \"client\",\n \"Setting call constraint is currently disabled by ACS service.\", \"\", \"Setting call constraints is disabled\", \"\", \"409\", \"41064\", \"ExpectedError\", \"client\",\n \"Error setting call constraints at call setup. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error setting call constraints at call {0}\", \"\", \"500\", \"41065\", \"UnexpectedClientError\", \"client\",\n \"Error setting call constraints during mid-call\", \"\", \"\", \"\", \"500\", \"41066\", \"UnexpectedClientError\", \"client\",\n \"Error settting video constraints during call settup or mid-call. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error setting video constraints during call stage: {0}\", \"\", \"500\", \"41067\", \"UnexpectedClientError\", \"client\",\n \"Error setting video constraints during call accept\", \"\", \"\", \"\", \"500\", \"41068\", \"UnexpectedClientError\", \"client\",\n \"Error setting video constraints during call start\", \"\", \"\", \"\", \"500\", \"41069\", \"UnexpectedClientError\", \"client\",\n \"Failed to set call constraints during mid call\", \"\", \"\", \"\", \"500\", \"41070\", \"UnexpectedClientError\", \"client\",\n \"Failed to start screen share, call is not in Connected state. Subscribe to the Call's 'statteChanged' event to know when the call is connected.\", \"\", \"Failed to start screen sharing. Call must be in connected state\", \"\", \"412\", \"41071\", \"ExpectedError\", \"client\",\n \"Failed to stop screen sharing. Call must be in connected state\", \"\", \"\", \"\", \"412\", \"41072\", \"ExpectedError\", \"client\",\n \"Failed to get or set custom MediaStream, this functionality is currently disabled by Azure Communication Services.\", \"\", \"Accessing raw media stream is currently not enabled\", \"\", \"412\", \"41073\", \"ExpectedError\", \"client\",\n \"The raw media stream function is currently not available\", \"\", \"\", \"\", \"500\", \"41074\", \"UnexpectedClientError\", \"client\",\n \"Failed to start raw screen sharing, localVideoStream doesn't contain a raw media stream\", \"\", \"\", \"\", \"400\", \"41075\", \"ExpectedError\", \"client\",\n \"Failed to start audio stream.\", \"\", \"\", \"\", \"500\", \"41076\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop video.\", \"\", \"\", \"\", \"500\", \"41077\", \"UnexpectedClientError\", \"client\",\n \"Incoming call is already unplaced\", \"\", \"\", \"\", \"400\", \"41078\", \"ExpectedError\", \"client\",\n \"Failed to reject call\", \"\", \"\", \"\", \"500\", \"41079\", \"UnexpectedServerError\", \"client\",\n \"Failed to start local audio device\", \"\", \"\", \"\", \"400\", \"41080\", \"UnexpectedClientError\", \"client\",\n \"Failed to Select Virtual Device.\", \"\", \"\", \"\", \"400\", \"41081\", \"UnexpectedClientError\", \"client\",\n \"Failed to Unselect Virtual Device.\", \"\", \"\", \"\", \"400\", \"41082\", \"UnexpectedClientError\", \"client\",\n \"Failed to start raw audio, localAudioStream doesn't contain a raw media stream. To start raw audio, the LocalAudioStream passed in, must be constructed with a MediaStream object.\", \"\", \"\", \"\", \"400\", \"41083\", \"ExpectedError\", \"client\",\n \"Failed to stop raw audio, localAudioStream doesn't contain a raw media stream. To stop raw audio, the current LocalAudioStream in the call must have a MediaStream as the source.\", \"\", \"\", \"\", \"400\", \"41084\", \"ExpectedError\", \"client\",\n \"Thread ID is invalid.\", \"\", \"\", \"\", \"400\", \"41085\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to Lobby event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"41800\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Lobby event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"41801\", \"ExpectedError\", \"client\",\n \"Current conversation type doesn't support lobby admit and reject\", \"\", \"\", \"\", \"400\", \"41802\", \"ExpectedError\", \"client\",\n \"Participant is already in the meeting.\", \"\", \"{0} is already in the meeting\", \"\", \"400\", \"41803\", \"ExpectedError\", \"client\",\n \"Participant is not in the lobby.\", \"\", \"{0} is not in the lobby\", \"\", \"400\", \"41804\", \"ExpectedError\", \"client\",\n \"only Organizer, Co-organizer or Presenter can admit/reject participants from lobby\", \"\", \"\", \"\", \"403\", \"41805\", \"ExpectedError\", \"client\",\n \"Failed to admit participants in the lobby\", \"\", \"\", \"\", \"500\", \"41806\", \"UnexpectedServerError\", \"client\",\n \"Participant list is empty\", \"\", \"\", \"\", \"400\", \"41807\", \"ExpectedError\", \"client\",\n \"Lobby is not enabled for this meeting\", \"\", \"\", \"\", \"400\", \"41808\", \"ExpectedError\", \"client\",\n \"Failed to reject participants from the lobby\", \"\", \"\", \"\", \"500\", \"41809\", \"UnexpectedServerError\", \"client\",\n \"Failed to fetch Teams user policies and settings cannot proceed, because teams user Id was not found in the AccessToken.\", \"\", \"Caller's MicrosoftTeamsUserIdentifier wasn't provided. Fetching Teams user policies and settings cannot proceed\", \"\", \"400\", \"41900\", \"ExpectedError\", \"client\",\n \"Error Fetching Teams user policy from ACS MiddleTier Service\", \"\", \"\", \"\", \"500\", \"41901\", \"UnexpectedServerError\", \"client\",\n \"Unable to derive emergency policy from ACS MiddleTier Service response\", \"\", \"\", \"\", \"500\", \"41902\", \"UnexpectedServerError\", \"client\",\n \"Unable to fetch Teams calling policy from ACS MiddleTier Service response. Please try again, if the issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Unable to fetch teamsCallingPolicy from ACS MiddleTier Service response\", \"\", \"500\", \"41903\", \"UnexpectedServerError\", \"client\",\n \"Unable to fetch Teams meeting policy from ACS MiddleTier Service response. Please try again, if the issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Unable to fetch teamsMeetingPolicy from ACS MiddleTier Service response\", \"\", \"500\", \"41904\", \"UnexpectedServerError\", \"client\",\n \"Unable to fetch feature types from ACS MiddleTier Service response. Please try again, if the issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Unable to fetch featureTypes from ACS MiddleTier Service response\", \"\", \"500\", \"41905\", \"UnexpectedServerError\", \"client\",\n \"Unable to create thread for the Teams User groupcall from ACS MiddleTier Service response\", \"\", \"\", \"\", \"500\", \"41906\", \"UnexpectedServerError\", \"client\",\n \"Unable to add particpant for the thread for Teams groupcall from ACS MiddleTier Service\", \"\", \"\", \"\", \"500\", \"41907\", \"UnexpectedServerError\", \"client\",\n \"Mute other participants is disabled by ACS service.\", \"\", \"Mute other participants disabled.\", \"\", \"403\", \"42000\", \"ExpectedError\", \"client\",\n \"Failed to mute specific participant\", \"\", \"\", \"\", \"500\", \"42001\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to RemoteParticipant event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"42002\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from RemoteParticipant event, unknown event name.\", \"\", \"Not able to unsubscribe to event {0}, unknown event name\", \"\", \"422\", \"42003\", \"ExpectedError\", \"client\",\n \"The scenario to soft mute a PSTN participant is not supported.\", \"\", \"\", \"\", \"405\", \"42004\", \"ExpectedError\", \"client\",\n \"Failed to start video, video device is being used by another process/application. Stop your camera from being used in the other process/application and try again.\", \"\", \"Video operation failure SourceUnavailableError\", \"\", \"412\", \"43000\", \"ExpectedError\", \"client\",\n \"Failed to start video, permission was not granted to use selected video device. Ensure video device permissions are allowed in the browser's settings and in the system's setttings.\", \"\", \"Video operation failure PermissionDeniedError\", \"\", \"403\", \"43001\", \"ExpectedError\", \"client\",\n \"Failed to start video, unknown error. Please try again. If the issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure UnknownFailureForVideoOperation\", \"\", \"500\", \"43002\", \"UnexpectedClientError\", \"client\",\n \"Failed to create local video stream, source was not of type VideoDeviceInfo or MediaStream\", \"\", \"\", \"\", \"400\", \"43003\", \"ExpectedError\", \"client\",\n \"Failed to switch video device, invalid input. Input must be of a VideoDeviceInfo type.\", \"\", \"Failed to switch source, source was not of type VideoDeviceInfo\", \"\", \"400\", \"43004\", \"ExpectedError\", \"client\",\n \"Failed to switch video device, unable to switch to the same video device, it's already selected.\", \"\", \"Unable to switch to the same source\", \"\", \"400\", \"43005\", \"ExpectedError\", \"client\",\n \"Unable to get device type\", \"\", \"\", \"\", \"500\", \"43006\", \"UnexpectedClientError\", \"client\",\n \"Failed to get raw video stream. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to get media stream\", \"\", \"500\", \"43007\", \"UnexpectedClientError\", \"client\",\n \"Failed to set media stream source is not MediaStream\", \"\", \"\", \"\", \"400\", \"43008\", \"ExpectedError\", \"client\",\n \"Failed to set raw video stream. Found undefined function. Gather browser console logs and contact Azure Communication Services support.\", \"\", \"Unable ot set media stream\", \"\", \"500\", \"43009\", \"UnexpectedClientError\", \"client\",\n \"Failed to set raw video stream. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to set media stream\", \"\", \"500\", \"43010\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to LocalVideoStream event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"43011\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from LocalVideoStream event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"43012\", \"ExpectedError\", \"client\",\n \"Failed to start video, no video devices found. Ensure video devices are plugged in and enabled in the system settings.\", \"\", \"Video operation failure DevicesNotFoundError\", \"\", \"412\", \"43013\", \"ExpectedError\", \"client\",\n \"Failed to start video, error requesting media stream. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure MediaStreamRequestError\", \"\", \"412\", \"43014\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video, media stream request timed out. PLease allow permission on the browser's prompt to access the camera and try again.\", \"\", \"Video operation failure MediaStreamRequestTimedout\", \"\", \"412\", \"43015\", \"ExpectedError\", \"client\",\n \"Failed to start video, permissions denied by system. Ensure video device permissions are allowed in the browser's settings and in the system's setttings.\", \"\", \"Video operation failure PermissionsDeniedBySystem\", \"\", \"412\", \"43016\", \"ExpectedError\", \"client\",\n \"Failed to start video, unsupported stream. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure UnsupportedStream\", \"\", \"412\", \"43017\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video, failed to set constraints. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure ConstraintNotSatisfiedError\", \"\", \"412\", \"43018\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video, no device selected. Please ensure to pass a LocalVideoStream constructed with a VideoDeviceInfo and try again. If issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure noDeviceSelected\", \"\", \"412\", \"43019\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to RemoteVideoStream event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"43100\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from RemoteVideoStream event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"43101\", \"ExpectedError\", \"client\",\n \"Not able to get media stream\", \"\", \"\", \"\", \"500\", \"43102\", \"UnexpectedClientError\", \"client\",\n \"The remote video stream is currently not available, subscribe to the stream's isAvailable property to get notified when it is ready to get the raw media stream.\", \"\", \"The stream is currently not availalbe, subscribe to stream.isAvailable property to get notified when it is ready to get media stream\", \"\", \"400\", \"43103\", \"ExpectedError\", \"client\",\n \"Failed to subscribe to media stream, timeout\", \"\", \"\", \"\", \"408\", \"43104\", \"UnexpectedClientError\", \"client\",\n \"Failed to get media stream\", \"\", \"\", \"\", \"500\", \"43105\", \"UnexpectedClientError\", \"client\",\n \"Failed to subscribe to media stream, muted\", \"\", \"\", \"\", \"408\", \"43106\", \"UnexpectedClientError\", \"client\",\n \"Failed to get raw media stream\", \"\", \"\", \"\", \"500\", \"43107\", \"UnexpectedClientError\", \"client\",\n \"Failed to render video stream, this stream is not available. Subscribe to the stream's isAvailable property to get notified when the remote participant has their video on and the stream is available for rendering.\", \"\", \"Failed to create view, remote stream is not available\", \"\", \"412\", \"43200\", \"ExpectedError\", \"client\",\n \"Failed to start stream, already disposed\", \"\", \"\", \"\", \"405\", \"43201\", \"ExpectedError\", \"client\",\n \"Failed to render video stream, this stream is not longer available. Remote participant turned their video off.\", \"\", \"Failed to start stream, stream became unavailable\", \"\", \"404\", \"43202\", \"ExpectedError\", \"client\",\n \"Failed to render video stream, rendering timed out while waiting for video frames. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Failed to render stream, timeout\", \"\", \"408\", \"43203\", \"UnexpectedClientError\", \"client\",\n \"Failed to render video stream, failed to subscribe to video on the Azure Communication Services infrastructure. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Failed to start stream, fail to subscribe\", \"\", \"500\", \"43204\", \"UnexpectedClientError\", \"client\",\n \"Failed to start stream, internal error\", \"\", \"\", \"\", \"500\", \"43205\", \"UnexpectedClientError\", \"client\",\n \"Failed to updateScalingMode, failed to update\", \"\", \"\", \"\", \"500\", \"43206\", \"UnexpectedClientError\", \"client\",\n \"Failed to start stream, disposing stream because participant is not a dominant speaker in the large meeting\", \"\", \"\", \"\", \"405\", \"43207\", \"ExpectedError\", \"client\",\n \"Failed to start stream, disposing stream because remote video stream is disposing\", \"\", \"\", \"\", \"405\", \"43208\", \"ExpectedError\", \"client\",\n \"Failed to render video stream, VideoStreamRenderer was disposed during initialization process.\", \"\", \"Failed to start stream, disposing stream\", \"\", \"405\", \"43209\", \"ExpectedError\", \"client\",\n \"Failed to dispose VideoStreamRenderer, it is already disposed.\", \"\", \"Failed to dispose stream, already disposed\", \"\", \"400\", \"43210\", \"ExpectedError\", \"client\",\n \"Failed to dispose remote renderer\", \"\", \"\", \"\", \"500\", \"43211\", \"UnexpectedClientError\", \"client\",\n \"Failed to create VideoStreamRendererView, videoStream must be either LocalVideoStream or RemoteVideoStream type\", \"\", \"\", \"\", \"400\", \"43212\", \"ExpectedError\", \"client\",\n \"Failed to dispose, VideoStreamRendererView is disposed\", \"\", \"\", \"\", \"400\", \"43213\", \"ExpectedError\", \"client\",\n \"Failed to render, stream disposed\", \"\", \"\", \"\", \"400\", \"43214\", \"ExpectedError\", \"client\",\n \"Failed to updateScalingMode, VideoStreamRendererView is disposed\", \"\", \"\", \"\", \"400\", \"43215\", \"ExpectedError\", \"client\",\n \"Failed to updateScalingMode, wrong scalingMode value\", \"\", \"\", \"\", \"400\", \"43216\", \"ExpectedError\", \"client\",\n \"Failed to dispose view\", \"\", \"\", \"\", \"500\", \"43217\", \"UnexpectedClientError\", \"client\",\n \"Failed to create VideoStreamRenderer, videoStream must be either LocalVideoStream or RemoteVideoStreamCommon type\", \"\", \"\", \"\", \"400\", \"43218\", \"ExpectedError\", \"client\",\n \"Failed to create view, VideoStreamRenderer is disposed\", \"\", \"\", \"\", \"400\", \"43219\", \"ExpectedError\", \"client\",\n \"Failed to create view, maximum number of active RemoteVideoStream views has been reached. You can dispose of a previous one in order to create new one.\", \"\", \"Failed to create view, maximum number of {0} active RemoteVideoStream has been reached\", \"\", \"400\", \"43220\", \"ExpectedError\", \"client\",\n \"Failed to create view\", \"\", \"\", \"\", \"500\", \"43221\", \"UnexpectedClientError\", \"client\",\n \"Failed to dispose, VideoStreamRendererView is already disposed\", \"\", \"\", \"\", \"400\", \"43222\", \"ExpectedError\", \"client\",\n \"Unknown stream type\", \"\", \"\", \"\", \"400\", \"43223\", \"ExpectedError\", \"client\",\n \"Failed to dispose local renderer\", \"\", \"\", \"\", \"500\", \"43224\", \"UnexpectedClientError\", \"client\",\n \"Failed to create local audio stream, source is not of type AudioDeviceInfo or MediaStream\", \"\", \"\", \"\", \"400\", \"43600\", \"ExpectedError\", \"client\",\n \"Failed to create local audio stream, source is not a microphone\", \"\", \"\", \"\", \"400\", \"43601\", \"ExpectedError\", \"client\",\n \"Failed to get media stream source is not AudioDeviceInfo or MediaStream\", \"\", \"\", \"\", \"500\", \"43602\", \"UnexpectedClientError\", \"client\",\n \"Failed to switch stream on local audio, source is not of type MediaStream\", \"\", \"\", \"\", \"400\", \"43603\", \"ExpectedError\", \"client\",\n \"Failed to create local audio stream, source is not a microphone\", \"\", \"\", \"\", \"400\", \"43604\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to LocalAudioStream event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"43605\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from LocalAudioStream event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"43606\", \"ExpectedError\", \"client\",\n \"Failed to switch audio device, unable to switch to the same audio device, it's already selected.\", \"\", \"\", \"\", \"400\", \"43607\", \"ExpectedError\", \"client\",\n \"Failed to start audio, unknown error. Please try again. If the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"43608\", \"UnexpectedClientError\", \"client\",\n \"Unable to parse PhoneNumberIdentifier object\", \"\", \"\", \"\", \"422\", \"44000\", \"ExpectedError\", \"client\",\n \"Unable to parse MicrosoftTeamsUserIdentifier object\", \"\", \"\", \"\", \"422\", \"44001\", \"ExpectedError\", \"client\",\n \"Unable to parse MicrosoftTeamsAppIdentifier object\", \"\", \"\", \"\", \"422\", \"44002\", \"ExpectedError\", \"client\",\n \"Unable to parse Identifier object, please check the syntax\", \"\", \"\", \"\", \"422\", \"44003\", \"ExpectedError\", \"client\",\n \"Invalid CommunicationUser identifier specified\", \"\", \"\", \"\", \"422\", \"44004\", \"ExpectedError\", \"client\",\n \"Invalid MicrosoftTeamsUser rawId specified\", \"\", \"\", \"\", \"422\", \"44005\", \"ExpectedError\", \"client\",\n \"Invalid MicrosoftTeamsUser microsoftTeamsUserId specified\", \"\", \"\", \"\", \"422\", \"44006\", \"ExpectedError\", \"client\",\n \"Invalid MicrosoftTeamsApp rawId specified\", \"\", \"\", \"\", \"422\", \"44007\", \"ExpectedError\", \"client\",\n \"Invalid MicrosoftTeamsApp teamsAppId specified\", \"\", \"\", \"\", \"422\", \"44008\", \"ExpectedError\", \"client\",\n \"Invalid identifier specified, please specify an id\", \"\", \"\", \"\", \"422\", \"44009\", \"ExpectedError\", \"client\",\n \"Unable to parse Identifier object\", \"\", \"\", \"\", \"422\", \"44010\", \"ExpectedError\", \"client\",\n \"AssertIsArrayOfIdentifiers failed. : userIds must be array of CommunicationIdentifier\", \"\", \"\", \"\", \"422\", \"44011\", \"ExpectedError\", \"client\",\n \"No cloud prefix found in identity\", \"\", \"\", \"\", \"409\", \"44012\", \"ExpectedError\", \"client\",\n \"Config is empty\", \"\", \"\", \"\", \"500\", \"44100\", \"UnexpectedServerError\", \"client\",\n \"Missing ACS config key\", \"\", \"\", \"\", \"500\", \"44101\", \"UnexpectedServerError\", \"client\",\n \"Error while merging config\", \"\", \"\", \"\", \"500\", \"44102\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize telemetry\", \"\", \"\", \"\", \"500\", \"44103\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize telemetry\", \"\", \"\", \"\", \"500\", \"44104\", \"UnexpectedClientError\", \"client\",\n \"Failed to create and initialize telemetry logger for tenant. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to create and initialize telemetry logger for {0}\", \"\", \"500\", \"44105\", \"UnexpectedClientError\", \"client\",\n \"Failed to flush telemetry\", \"\", \"\", \"\", \"500\", \"44106\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize telemetry logger\", \"\", \"\", \"\", \"500\", \"44107\", \"UnexpectedClientError\", \"client\",\n \"No CommunicationTokenCredential provided\", \"\", \"\", \"\", \"401\", \"44108\", \"ExpectedError\", \"client\",\n \"AccessToken is empty\", \"\", \"\", \"\", \"401\", \"44109\", \"ExpectedError\", \"client\",\n \"Failed to get AccessToken\", \"\", \"\", \"\", \"401\", \"44110\", \"UnexpectedClientError\", \"client\",\n \"Invalid token\", \"\", \"\", \"\", \"401\", \"44111\", \"ExpectedError\", \"client\",\n \"Failed to parse AccessToken\", \"\", \"\", \"\", \"401\", \"44112\", \"ExpectedError\", \"client\",\n \"AccessToken does not contain 'voip' or 'voip.join' scope\", \"\", \"\", \"\", \"401\", \"44113\", \"ExpectedError\", \"client\",\n \"Wrong AccessToken scope format. Scope is expected to be a string that contains 'voip'\", \"\", \"\", \"\", \"401\", \"44114\", \"ExpectedError\", \"client\",\n \"AccessToken does not contain ACS resource Id\", \"\", \"\", \"\", \"401\", \"44115\", \"ExpectedError\", \"client\",\n \"AccessToken does not contain ACS user Id\", \"\", \"\", \"\", \"401\", \"44116\", \"ExpectedError\", \"client\",\n \"Failed to parse AccessToken\", \"\", \"\", \"\", \"401\", \"44117\", \"UnexpectedClientError\", \"client\",\n \"Operation timed out\", \"\", \"\", \"\", \"408\", \"44118\", \"UnexpectedClientError\", \"client\",\n \"Error while trying to start or stop echo cancellation. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error while trying to {0} echo cancellation\", \"\", \"500\", \"45000\", \"UnexpectedClientError\", \"client\",\n \"Error while trying to start or stop noise suppression. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error while trying to {0} noise suppression\", \"\", \"500\", \"45001\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to AudioEffects event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"400\", \"45002\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from AudioEffects event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"400\", \"45003\", \"ExpectedError\", \"client\",\n \"Setting audio effects is currently disabled by Azure Communication Services.\", \"\", \"Setting audio effects is disabled.\", \"\", \"403\", \"45004\", \"ExpectedError\", \"client\",\n \"Audio effects feature is disposed. Create a new AudioEffects feature instance.\", \"\", \"\", \"\", \"400\", \"45005\", \"ExpectedError\", \"client\",\n \"Current source is not supported\", \"\", \"\", \"\", \"415\", \"45006\", \"ExpectedError\", \"client\",\n \"Failed to get device manager to start effects.\", \"\", \"\", \"\", \"500\", \"45007\", \"UnexpectedClientError\", \"client\",\n \"Audio effects feature is disposed. Create a new AudioEffects feature instance.\", \"\", \"\", \"\", \"400\", \"45008\", \"ExpectedError\", \"client\",\n \"Failed to get device manager to stop effects.\", \"\", \"\", \"\", \"500\", \"45009\", \"UnexpectedClientError\", \"client\",\n \"Internal error - DM missing\", \"\", \"\", \"\", \"500\", \"45010\", \"UnexpectedClientError\", \"client\",\n \"EffectProvider not available\", \"\", \"\", \"\", \"500\", \"45011\", \"UnexpectedClientError\", \"client\",\n \"Internal error - stack aec provider missing\", \"\", \"\", \"\", \"500\", \"45012\", \"UnexpectedClientError\", \"client\",\n \"Invalid effect provided\", \"\", \"\", \"\", \"400\", \"45013\", \"ExpectedError\", \"client\",\n \"Invalid or no echo cancellation effect provided\", \"\", \"\", \"\", \"400\", \"45014\", \"ExpectedError\", \"client\",\n \"Invalid or no noise suppression effect provided\", \"\", \"\", \"\", \"400\", \"45015\", \"ExpectedError\", \"client\",\n \"Unsupported effect specified. Please specify a supported audio effect.\", \"\", \"{0} is not supported.\", \"\", \"415\", \"45016\", \"UnexpectedClientError\", \"client\",\n \"Error while checking support\", \"\", \"\", \"\", \"501\", \"45017\", \"UnexpectedClientError\", \"client\",\n \"Invalid or no auto gain control effect provided\", \"\", \"\", \"\", \"400\", \"45018\", \"ExpectedError\", \"client\",\n \"Error while trying to start or stop auto gain control. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error while trying to {0} auto gain control\", \"\", \"500\", \"45019\", \"UnexpectedClientError\", \"client\",\n \"Error setting browser audio processing flags\", \"\", \"\", \"\", \"500\", \"45020\", \"UnexpectedClientError\", \"client\",\n \"Error starting audio effects.\", \"\", \"\", \"\", \"500\", \"45021\", \"UnexpectedClientError\", \"client\",\n \"Error stopping audio effects.\", \"\", \"\", \"\", \"500\", \"45022\", \"UnexpectedClientError\", \"client\",\n \"Error disposing audio effects feature.\", \"\", \"\", \"\", \"500\", \"45023\", \"UnexpectedClientError\", \"client\",\n \"Invalid call survey. Please submit a survey options.\", \"\", \"{0}.\", \"\", \"400\", \"45100\", \"ExpectedError\", \"client\",\n \"Failed to submit survery, timedout. Please try again, if issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"\", \"\", \"408\", \"45101\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize Captions.\", \"\", \"\", \"\", \"500\", \"45200\", \"UnexpectedClientError\", \"client\",\n \"Captions feature is currently disabled by Azure Communication services.\", \"\", \"Feature is not enabled.\", \"\", \"412\", \"45201\", \"ExpectedError\", \"client\",\n \"Spoken language requested is not supported.\", \"\", \"\", \"\", \"400\", \"45202\", \"ExpectedError\", \"client\",\n \"Captions feature is disabled in meeting policy.\", \"\", \"\", \"\", \"403\", \"45203\", \"ExpectedError\", \"client\",\n \"Captions feature is disabled in calling policy.\", \"\", \"\", \"\", \"403\", \"45204\", \"ExpectedError\", \"client\",\n \"Could not start captions.\", \"\", \"\", \"\", \"500\", \"45205\", \"UnexpectedClientError\", \"client\",\n \"Cannot update spoken language as captions has not started.\", \"\", \"\", \"\", \"400\", \"45206\", \"ExpectedError\", \"client\",\n \"Set spoken language is currently disabled by Azure Communication Services.\", \"\", \"Set spoken language is not enabled.\", \"\", \"412\", \"45207\", \"ExpectedError\", \"client\",\n \"Unable to update spoken language. Failed to get token.\", \"\", \"\", \"\", \"401\", \"45208\", \"UnexpectedClientError\", \"client\",\n \"Unable to update spoken language.\", \"\", \"\", \"\", \"500\", \"45209\", \"UnexpectedClientError\", \"client\",\n \"Cannot update caption language as captions has not started.\", \"\", \"\", \"\", \"400\", \"45210\", \"ExpectedError\", \"client\",\n \"Set caption language is currently disabled by Azure Communication Services.\", \"\", \"Set caption language is not enabled.\", \"\", \"412\", \"45211\", \"ExpectedError\", \"client\",\n \"Set caption language failed. Teams premium license is needed to use this feature.\", \"\", \"\", \"\", \"401\", \"45212\", \"ExpectedError\", \"client\",\n \"Caption language requested is not supported.\", \"\", \"\", \"\", \"400\", \"45213\", \"ExpectedError\", \"client\",\n \"Null token\", \"\", \"\", \"\", \"401\", \"45214\", \"ExpectedError\", \"client\",\n \"Unable to update caption language.\", \"\", \"\", \"\", \"500\", \"45215\", \"UnexpectedClientError\", \"client\",\n \"Failed to fetch policy for Teams Captions.\", \"\", \"\", \"\", \"500\", \"45216\", \"UnexpectedClientError\", \"client\",\n \"Captions already active\", \"\", \"\", \"\", \"400\", \"45217\", \"ExpectedError\", \"client\",\n \"Captions feature is not active.\", \"\", \"\", \"\", \"400\", \"45218\", \"ExpectedError\", \"client\",\n \"Operation in progress\", \"\", \"\", \"\", \"400\", \"45219\", \"ExpectedError\", \"client\",\n \"Spoken language already set\", \"\", \"\", \"\", \"400\", \"45220\", \"ExpectedError\", \"client\",\n \"Unable to update caption language as Captions is not active.\", \"\", \"\", \"\", \"400\", \"45221\", \"ExpectedError\", \"client\",\n \"Caption language already set.\", \"\", \"\", \"\", \"400\", \"45222\", \"ExpectedError\", \"client\",\n \"Captions status already set.\", \"\", \"\", \"\", \"400\", \"45223\", \"ExpectedError\", \"client\",\n \"Captions is not supported.\", \"\", \"\", \"\", \"400\", \"45224\", \"ExpectedError\", \"client\",\n \"Failed to update endpoint metadata\", \"\", \"\", \"\", \"500\", \"45225\", \"UnexpectedClientError\", \"client\",\n \"Cannot start captions as call state is not connected.\", \"\", \"\", \"\", \"400\", \"45226\", \"ExpectedError\", \"client\",\n \"DataChannel has been disposed\", \"\", \"\", \"\", \"500\", \"45300\", \"UnexpectedClientError\", \"client\",\n \"Sender is not ready\", \"\", \"\", \"\", \"500\", \"45301\", \"UnexpectedClientError\", \"client\",\n \"No available channel id\", \"\", \"\", \"\", \"500\", \"45302\", \"UnexpectedClientError\", \"client\",\n \"Invalid channel id\", \"\", \"\", \"\", \"400\", \"45303\", \"ExpectedError\", \"client\",\n \"Invalid bitrateInKbps\", \"\", \"\", \"\", \"400\", \"45304\", \"ExpectedError\", \"client\",\n \"Invalid participants\", \"\", \"\", \"\", \"400\", \"45305\", \"ExpectedError\", \"client\",\n \"Too many participants\", \"\", \"\", \"\", \"400\", \"45306\", \"ExpectedError\", \"client\",\n \"No valid participant\", \"\", \"\", \"\", \"400\", \"45307\", \"ExpectedError\", \"client\",\n \"Message data is empty\", \"\", \"\", \"\", \"400\", \"45308\", \"ExpectedError\", \"client\",\n \"The size of message data is too large\", \"\", \"\", \"\", \"400\", \"45309\", \"ExpectedError\", \"client\",\n \"Invalid message length\", \"\", \"\", \"\", \"500\", \"45310\", \"UnexpectedClientError\", \"client\",\n \"The buffer is full. Please wait and try again\", \"\", \"\", \"\", \"500\", \"45311\", \"UnexpectedClientError\", \"client\",\n \"The sender has been closed\", \"\", \"\", \"\", \"400\", \"45312\", \"ExpectedError\", \"client\",\n \"Currently there is no available reliable channel\", \"\", \"\", \"\", \"500\", \"45313\", \"UnexpectedClientError\", \"client\",\n \"Currently there is no available unreliable channel\", \"\", \"\", \"\", \"500\", \"45314\", \"UnexpectedClientError\", \"client\",\n \"Unable allocate the channel because a channel with the same channelId has already been allocated\", \"\", \"\", \"\", \"500\", \"45315\", \"UnexpectedClientError\", \"client\",\n \"Invalid bitrate\", \"\", \"\", \"\", \"400\", \"45316\", \"ExpectedError\", \"client\",\n \"Traffic is limited\", \"\", \"\", \"\", \"400\", \"45317\", \"ExpectedError\", \"client\",\n \"Failed to send message.\", \"\", \"\", \"\", \"500\", \"45318\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to DataChannel event, unknown event name.\", \"\", \"Not able to {0} subscribe to event {1}, unknown event name\", \"\", \"422\", \"45319\", \"ExpectedError\", \"client\",\n \"Wrong argument type specified.\", \"\", \"TypeError: Expect '{0}' to be of type '{1}'\", \"\", \"400\", \"45320\", \"ExpectedError\", \"client\",\n \"Wrong value specified.\", \"\", \"ValueError: Expect '{0}' to be '{1}'\", \"\", \"400\", \"45321\", \"ExpectedError\", \"client\",\n \"Cannot find the channelId specified.\", \"\", \"Cannot find the channelId {0}\", \"\", \"400\", \"45322\", \"ExpectedError\", \"client\",\n \"Failed to create the sender.\", \"\", \"\", \"\", \"500\", \"45323\", \"UnexpectedClientError\", \"client\",\n \"Mapped to an incorrect value type. Please gather browser console logs and contact Azure Communication Services support.\", \"\", \"Mapped to an incorrect value type={0}, diagnostic value={1}, for diagnostic {2}\", \"\", \"500\", \"45400\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to UserFacingDiagnostics event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45401\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from UserFacingDiagnostics event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45402\", \"ExpectedError\", \"client\",\n \"Failed to map diagnostic quality level. Please gather browser console logs and contact Azure Communication Services support.\", \"\", \"Cannot map ts quality level {0} for {1}\", \"\", \"500\", \"45403\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to LiveStream event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45500\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribefrom LiveStream event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45501\", \"ExpectedError\", \"client\",\n \"Invalid aggregationInterval value range.\", \"\", \"\", \"\", \"400\", \"45502\", \"ExpectedError\", \"client\",\n \"invalid dataPointsPerAggregation value range.\", \"\", \"\", \"\", \"400\", \"45503\", \"ExpectedError\", \"client\",\n \"MediaStatsCallFeature has been disposed.\", \"\", \"\", \"\", \"400\", \"45504\", \"ExpectedError\", \"client\",\n \"Invalid aggregationInterval value range.\", \"\", \"\", \"\", \"400\", \"45550\", \"ExpectedError\", \"client\",\n \"invalid dataPointsPerAggregation value range.\", \"\", \"\", \"\", \"400\", \"45551\", \"ExpectedError\", \"client\",\n \"MediaStatsCallFeature has been disposed.\", \"\", \"\", \"\", \"400\", \"45552\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to OptimalVideoCount event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45600\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from OptimalVideoCount event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45601\", \"ExpectedError\", \"client\",\n \"Failed to set default microphone or speaker with error\", \"\", \"\", \"\", \"412\", \"45700\", \"UnexpectedClientError\", \"client\",\n \"Unable to return call diagnostic information.\", \"\", \"\", \"\", \"500\", \"45701\", \"UnexpectedClientError\", \"client\",\n \"Timeout in checking media stream status\", \"\", \"\", \"\", \"500\", \"45702\", \"UnexpectedClientError\", \"client\",\n \"Failed to get existing call agent or create a new one\", \"\", \"\", \"\", \"500\", \"45703\", \"UnexpectedClientError\", \"client\",\n \"Test call failed to connect\", \"\", \"\", \"\", \"500\", \"45704\", \"UnexpectedClientError\", \"client\",\n \"Call failed to render video.\", \"\", \"\", \"\", \"500\", \"45705\", \"UnexpectedClientError\", \"client\",\n \"Test call failed hang up the call\", \"\", \"\", \"\", \"500\", \"45706\", \"UnexpectedClientError\", \"client\",\n \"Failed to get video call media stats\", \"\", \"\", \"\", \"500\", \"45707\", \"UnexpectedClientError\", \"client\",\n \"Call timed out to connect. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Call timeout after {0}\", \"\", \"408\", \"45708\", \"UnexpectedClientError\", \"client\",\n \"Could not initialize raise hand feature.\", \"\", \"\", \"\", \"500\", \"45750\", \"UnexpectedClientError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45751\", \"UnexpectedServerError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45752\", \"UnexpectedServerError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45753\", \"UnexpectedServerError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45754\", \"UnexpectedServerError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45755\", \"UnexpectedServerError\", \"client\",\n \"Lower hands request failed because participant list is empty.\", \"\", \"\", \"\", \"400\", \"45756\", \"ExpectedError\", \"client\",\n \"Raise hands request failed because participant list is empty.\", \"\", \"\", \"\", \"400\", \"45757\", \"ExpectedError\", \"client\",\n \"Call is not connected yet to send reaction\", \"\", \"\", \"\", \"400\", \"45800\", \"ExpectedError\", \"client\",\n \"Reaction send is not supported for 1:1 direct calling with teams identity\", \"\", \"\", \"\", \"400\", \"45801\", \"ExpectedError\", \"client\",\n \"Unable to register listener due to meeting policy\", \"\", \"\", \"\", \"403\", \"45802\", \"ExpectedError\", \"client\",\n \"Unable to deregister listener due to meeting policy\", \"\", \"\", \"\", \"403\", \"45803\", \"ExpectedError\", \"client\",\n \"Unable to send reaction due to meeting policy\", \"\", \"\", \"\", \"403\", \"45804\", \"ExpectedError\", \"client\",\n \"Could not create state service proxy web-socket connection\", \"\", \"\", \"\", \"500\", \"45805\", \"UnexpectedServerError\", \"client\",\n \"Could not create sync map to exchange reaction\", \"\", \"\", \"\", \"500\", \"45806\", \"UnexpectedServerError\", \"client\",\n \"Unable to handle send reaction\", \"\", \"\", \"\", \"400\", \"45807\", \"ExpectedError\", \"client\",\n \"Unable to handle send reaction\", \"\", \"\", \"\", \"500\", \"45808\", \"UnexpectedClientError\", \"client\",\n \"Unable to parse reaction\", \"\", \"\", \"\", \"500\", \"45809\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to Reation event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45810\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Reaction event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45811\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to Recording event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45850\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Recording event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45851\", \"ExpectedError\", \"client\",\n \"Recording status already set.\", \"\", \"\", \"\", \"400\", \"45852\", \"ExpectedError\", \"client\",\n \"Bad request. All participants are already spotlighted\", \"\", \"\", \"\", \"400\", \"45900\", \"ExpectedError\", \"client\",\n \"Internal Error. Start spotlight for participants failed\", \"\", \"\", \"\", \"500\", \"45901\", \"UnexpectedServerError\", \"client\",\n \"Failed to start spotlight. Reached the maximum number of participants that can be Spotlighted.\", \"\", \"startSpotlight failed. {0} is the max number of participants that can be Spotlighted\", \"\", \"400\", \"45902\", \"ExpectedError\", \"client\",\n \"Failed to spotlight. User does not have a Presenter or Organizer role.\", \"\", \"{0} spotlight failed. User does not have a Presenter or Organizer role in {1}\", \"\", \"403\", \"45903\", \"ExpectedError\", \"client\",\n \"Spotlight feature is not enabled\", \"\", \"\", \"\", \"400\", \"45904\", \"ExpectedError\", \"client\",\n \"StartSpotlight failed. Participant list is empty\", \"\", \"\", \"\", \"400\", \"45905\", \"ExpectedError\", \"client\",\n \"Teams meeting audio conferencing feature is only available in meetings\", \"\", \"\", \"\", \"400\", \"45950\", \"ExpectedError\", \"client\",\n \"The Teams meeting audio conferencing details feature is disabled by ACS service.\", \"\", \"Teams meeting audio conferencing details feature is disabled\", \"\", \"405\", \"45951\", \"ExpectedError\", \"client\",\n \"Teams meeting audio conferencing details are not available before joining the Teams meeting\", \"\", \"\", \"\", \"400\", \"45952\", \"ExpectedError\", \"client\",\n \"Teams meeting audio conferencing details are not available in Lobby\", \"\", \"\", \"\", \"400\", \"45953\", \"ExpectedError\", \"client\",\n \"Teams meeting audio conferencing details is not configured\", \"\", \"\", \"\", \"400\", \"45954\", \"UnexpectedClientError\", \"client\",\n \"Error retrieving Teams meeting audio conferencing details\", \"\", \"\", \"\", \"500\", \"45955\", \"UnexpectedServerError\", \"client\",\n \"Transcription status already set.\", \"\", \"\", \"\", \"400\", \"46000\", \"ExpectedError\", \"client\",\n \"Transfer to target failed\", \"\", \"\", \"\", \"500\", \"46050\", \"UnexpectedClientError\", \"client\",\n \"Transfer is not supported in this call.\", \"\", \"\", \"\", \"400\", \"46051\", \"ExpectedError\", \"client\",\n \"Transfer target is not recognized.\", \"\", \"\", \"\", \"400\", \"46052\", \"ExpectedError\", \"client\",\n \"Invalid target participant type detected.\", \"\", \"Invalid target participant type detected: {0}.\", \"\", \"400\", \"46053\", \"ExpectedError\", \"client\",\n \"UnmixedAudio is not available.\", \"\", \"\", \"\", \"500\", \"46100\", \"UnexpectedClientError\", \"client\",\n \"The operation cannot be done because there is a pending operation\", \"\", \"\", \"\", \"400\", \"46101\", \"ExpectedError\", \"client\",\n \"The operation is not supported in peer-to-peer call\", \"\", \"\", \"\", \"400\", \"46102\", \"ExpectedError\", \"client\",\n \"Unmixed audio has been enabled\", \"\", \"\", \"\", \"400\", \"46103\", \"ExpectedError\", \"client\",\n \"Unmixed audio has been disabled\", \"\", \"\", \"\", \"400\", \"46104\", \"ExpectedError\", \"client\",\n \"Unmixed audio has been disposed\", \"\", \"\", \"\", \"400\", \"46105\", \"ExpectedError\", \"client\",\n \"Not able to subscribe or unsubscibe to UnmixedAudio event, unknown event name.\", \"\", \"Unable to {0} to event {1}, unknown event name\", \"\", \"422\", \"46106\", \"ExpectedError\", \"client\",\n \"Wrong argument type specified.\", \"\", \"TypeError: Expect '{0}' to be of type '{1}'\", \"\", \"400\", \"46107\", \"ExpectedError\", \"client\",\n \"Wrong value specified.\", \"\", \"ValueError: Expect '{0}' to be '{1}'\", \"\", \"400\", \"46108\", \"ExpectedError\", \"client\",\n \"Invalid state.\", \"\", \"Invalid state: {0}\", \"\", \"400\", \"46109\", \"ExpectedError\", \"client\",\n \"Unknown error\", \"\", \"\", \"\", \"500\", \"46110\", \"UnexpectedClientError\", \"client\",\n \"Failed to enable unmixed audio: AudioContext={0}, UnmixedAudio={1}\", \"\", \"\", \"\", \"500\", \"46111\", \"UnexpectedClientError\", \"client\",\n \"Failed to disable unmixed audio: AudioContext={0}, UnmixedAudio={1}\", \"\", \"\", \"\", \"500\", \"46112\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize unmixed audio.\", \"\", \"\", \"\", \"500\", \"46113\", \"UnexpectedClientError\", \"client\",\n \"Video effects feature is currently disabled by Azure Communication Services.\", \"\", \"Disabled.\", \"\", \"403\", \"46150\", \"ExpectedError\", \"client\",\n \"VideoEffects feature is disposed. Create a new VideoEffects Feature instance.\", \"\", \"\", \"\", \"400\", \"46151\", \"ExpectedError\", \"client\",\n \"Current source is unsupported to use effects\", \"\", \"\", \"\", \"415\", \"46152\", \"ExpectedError\", \"client\",\n \"Failed to get device manager to start effects.\", \"\", \"\", \"\", \"500\", \"46153\", \"UnexpectedClientError\", \"client\",\n \"EffectProvider not available\", \"\", \"\", \"\", \"500\", \"46154\", \"UnexpectedClientError\", \"client\",\n \"Failed to get WebCV provider.\", \"\", \"\", \"\", \"500\", \"46155\", \"UnexpectedClientError\", \"client\",\n \"Effect is not supported.\", \"\", \"\", \"\", \"501\", \"46156\", \"UnexpectedClientError\", \"client\",\n \"VideoEffects feature is disposed. Create a new VideoEffects Feature instance.\", \"\", \"\", \"\", \"400\", \"46157\", \"UnexpectedClientError\", \"client\",\n \"Failed to get device manager to stop effects.\", \"\", \"\", \"\", \"500\", \"46158\", \"UnexpectedClientError\", \"client\",\n \"Invalid effect provided\", \"\", \"\", \"\", \"400\", \"46159\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to event , unknown event name\", \"\", \"\", \"\", \"400\", \"46160\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe event , unknown event name\", \"\", \"\", \"\", \"400\", \"46161\", \"ExpectedError\", \"client\",\n \"Timed promise; rejected.\", \"\", \"\", \"\", \"408\", \"46162\", \"UnexpectedClientError\", \"client\",\n \"Error while checking support\", \"\", \"\", \"\", \"501\", \"46163\", \"UnexpectedClientError\", \"client\",\n \"Error starting video effects\", \"\", \"\", \"\", \"500\", \"46164\", \"UnexpectedClientError\", \"client\",\n \"Error stopping video effects\", \"\", \"\", \"\", \"500\", \"46165\", \"UnexpectedClientError\", \"client\",\n \"Error disposing video effects feature\", \"\", \"\", \"\", \"500\", \"46166\", \"UnexpectedClientError\", \"client\",\n \"Effect is not available. Try again when the effect is initialized and available\", \"\", \"\", \"\", \"500\", \"46167\", \"UnexpectedClientError\", \"client\",\n \"Effect can not be enabled because of Teams Policy\", \"\", \"\", \"\", \"403\", \"46168\", \"ExpectedError\", \"client\",\n \"Local Recording feature is only available in meetings\", \"\", \"\", \"\", \"400\", \"46200\", \"ExpectedError\", \"client\",\n \"Local Recording feature is currently disabled by Azure Communication Service.\", \"\", \"Local Recording feature is disabled\", \"\", \"405\", \"46201\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to LocalRecording event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"46202\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from LocalRecording event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"46203\", \"ExpectedError\", \"client\",\n \"Failed to start video, permission was not granted to use selected video device. Ensure video device permissions are allowed in the browser's settings and in the system's setttings.\", \"\", \"Video operation failure permissionDeniedError\", \"\", \"403\", \"43001\", \"ExpectedError\", \"client\",\n \"Call ended successfully by local participant.\", \"\", \"\", \"\", \"0\", \"0\", \"Success\", \"service\",\n \"Call ended for all users by the meeting organizer.\", \"\", \"\", \"\", \"0\", \"4097\", \"Success\", \"service\",\n \"Call ended because user disconnected from the call abruptly, this may be a result of a user closing the application that hosted the call, eg a user terminated application, closed browser of browser tab without proper hang-up.\", \"\", \"\", \"\", \"0\", \"4521\", \"ExpectedError\", \"service\",\n \"Call ended for this participant as it was removed from the conversation by another participant.\", \"\", \"\", \"\", \"0\", \"5000\", \"Success\", \"service\",\n \"Call ended successfully, as all callee endpoints declined the call.\", \"\", \"\", \"\", \"0\", \"5003\", \"Success\", \"service\",\n \"This conversation has ended as only one participant was remaining in the conversation.\", \"\", \"\", \"\", \"0\", \"5010\", \"Success\", \"service\",\n \"This conversation has ended as no one else has joined the group call.\", \"\", \"\", \"\", \"0\", \"5013\", \"Success\", \"service\",\n \"\", \"\", \"\", \"\", \"0\", \"5014\", \"Success\", \"service\",\n \"Call ended for this participant as it was removed from the conversation by another participant.\", \"\", \"\", \"\", \"0\", \"5300\", \"Success\", \"service\",\n \"Removed from the Teams meeting lobby by another participant.\", \"\", \"\", \"\", \"0\", \"5854\", \"Success\", \"service\",\n \"Removed from Teams meeting lobby due to inactivity timeout.\", \"\", \"\", \"\", \"0\", \"5855\", \"Success\", \"service\",\n \"Call ended by Azure Communication Services platform.\", \"\", \"\", \"\", \"0\", \"7000\", \"Success\", \"service\",\n \"Call ended by service because transfer completed successfully.\", \"\", \"\", \"\", \"0\", \"7015\", \"Success\", \"service\",\n \"Call is ended.\", \"\", \"\", \"\", \"0\", \"540000\", \"\", \"service\",\n \"Call ended successfully by remote PSTN participant.\", \"\", \"\", \"\", \"0\", \"560000\", \"Success\", \"service\",\n \"Error from CreateUsageRequest: User is not entitled to call this destination.\", \"\", \"\", \"\", \"400\", \"580040\", \"ExpectedError\", \"service\",\n \"Unauthenticated identity.\", \"\", \"\", \"\", \"401\", \"10009\", \"UnexpectedClientError\", \"service\",\n \"Call ended, as it has been marked as a spam and got blocked.\", \"\", \"\", \"\", \"403\", \"510403\", \"ExpectedError\", \"service\",\n \"Call was forbidden, cancelled or rejected\", \"\", \"\", \"\", \"403\", \"560403\", \"UnexpectedClientError\", \"service\",\n \"Call failed, unable to start or join to a call with given Id, call does not exist. Please check if provided id is correct, and if the call did not end already and try again.\", \"\", \"\", \"\", \"404\", \"404\", \"UnexpectedClientError\", \"service\",\n \"Call failed, unable to start or join to a call with given Id, call does not exist. Please check if provided id is correct, and if the call did not end already and try again.\", \"\", \"\", \"\", \"404\", \"4500\", \"ExpectedError\", \"service\",\n \"Phone number not found.\", \"\", \"\", \"\", \"404\", \"560404\", \"ExpectedError\", \"service\",\n \"Call failed, callee failed to finalize call setup, most likely callee lost network or terminated the application abruptly. Ensure clients are connected and available.\", \"\", \"\", \"\", \"408\", \"10057\", \"ExpectedError\", \"service\",\n \"\", \"\", \"\", \"\", \"408\", \"10325\", \"UnexpectedClientError\", \"service\",\n \"Gateway (SBC) failover timer expired.\", \"\", \"\", \"\", \"408\", \"500001\", \"ExpectedError\", \"service\",\n \"The called party did not respond.\", \"\", \"\", \"\", \"408\", \"560408\", \"\", \"service\",\n \"Media dropped during connect.\", \"\", \"\", \"\", \"410\", \"3100\", \"ExpectedError\", \"service\",\n \"\", \"\", \"\", \"\", \"410\", \"3101\", \"\", \"service\",\n \"\", \"\", \"\", \"\", \"410\", \"3112\", \"\", \"service\",\n \"Participant was removed from the call by the Azure Communication Services infrastructure due to loss of media connectivity with Azure Communication Services infrastructure, this usually happens if participant leaves the call abruptly or looses network connectivity. If participant wants to continue the call, it should reconnect.\", \"\", \"\", \"\", \"410\", \"301005\", \"UnexpectedClientError\", \"service\",\n \"\", \"\", \"\", \"\", \"429\", \"5029\", \"ExpectedError\", \"service\",\n \"This call has exceeded the maximum call lifetime.\", \"\", \"\", \"\", \"429\", \"10110\", \"ExpectedError\", \"service\",\n \"Unable to deliver message to client application. Please ensure the client application is successfully sending netwwork requests to Azure Communication Services.\", \"\", \"\", \"\", \"430\", \"10315\", \"\", \"service\",\n \"Unable to deliver message to client application. Please ensure the client application is successfully sending netwwork requests to Azure Communication Services.\", \"\", \"\", \"\", \"430\", \"10317\", \"\", \"service\",\n \"\", \"\", \"\", \"\", \"480\", \"10037\", \"ExpectedError\", \"service\",\n \"Remote client endpoint not registered. Please ensure the client application is successfully sending netwwork requests to Azure Communication Services.\", \"\", \"\", \"\", \"480\", \"10076\", \"ExpectedError\", \"service\",\n \"No answer.\", \"\", \"\", \"\", \"480\", \"560480\", \"UnexpectedServerError\", \"service\",\n \"Incomplete/Invalid callee address.\", \"\", \"\", \"\", \"484\", \"560484\", \"\", \"service\",\n \"Call ended because remote PSTN participant was busy. The number called was already in a call or having technical issues.\", \"\", \"\", \"\", \"486\", \"560486\", \"Success\", \"service\",\n \"Call ended successfully as caller cancelled the call.\", \"\", \"\", \"\", \"487\", \"0\", \"Success\", \"service\",\n \"Call canceled, locally declined, ended due to an endpoint mismatch issue, or failed to generate media offer.\", \"\", \"\", \"\", \"487\", \"4501\", \"\", \"service\",\n \"Call was accepted elsewhere, by another endpoint of this user.\", \"\", \"\", \"\", \"487\", \"10003\", \"Success\", \"service\",\n \"Call was canceled on timeout, no callee endpoint accepted on time. Ensure that user saw the notification and try to initiate that call again.\", \"\", \"\", \"\", \"487\", \"10004\", \"ExpectedError\", \"service\",\n \"Call ended successfully as it was declined by all callee endpoints.\", \"\", \"\", \"\", \"487\", \"10024\", \"Success\", \"service\",\n \"Call canceled, locally declined, ended due to an endpoint mismatch issue, or failed to generate media offer.\", \"\", \"\", \"\", \"487\", \"540200\", \"Success\", \"service\",\n \"Call ended successfully as caller cancelled the call.\", \"\", \"\", \"\", \"487\", \"540487\", \"Success\", \"service\",\n \"Call cancelled by originator.\", \"\", \"\", \"\", \"487\", \"560487\", \"\", \"service\",\n \"Call ended as application did not provide a valid Azure Communication Services token.\", \"\", \"\", \"\", \"495\", \"4507\", \"UnexpectedClientError\", \"service\",\n \"Azure Communication Services infrastructure error. Please gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"10045\", \"\", \"service\",\n \"Unexpected server error\", \"\", \"\", \"\", \"503\", \"560503\", \"UnexpectedServerError\", \"service\",\n \"Call ended successfully as it was declined by callee.\", \"\", \"\", \"\", \"603\", \"0\", \"Success\", \"service\"\n];\nlet divide = (a:real,b:real) { \n iif(b == 0.0 or isnan(b) or isnull(b), real(null), a / b) \n};\nlet reliability = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good), attempts); \n iff(isnull(ratio), real(null), round(100.00 * ratio, decimals)) \n};\nlet reliability_upperbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_upper = ratio + 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_upper_1 = iff(ratio_upper > 1.0, 1.0, ratio_upper); \n iff(isnull(ratio), real(null), round(100.00 * ratio_upper_1, decimals)) \n};\nlet reliability_lowerbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_lower = ratio - 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_lower_1 = iff(ratio_lower < 0.0, 0.0, ratio_lower); \n iff(isnull(ratio), real(null), round(100.00 * ratio_lower_1, decimals)) \n};\nlet compareMetricWithThreshold = (cmpOperator:string,metricValue:real,threshold:real) { \n case( \n cmpOperator == '==', \n metricValue == threshold, \n cmpOperator == '!=', \n metricValue != threshold, \n cmpOperator == '>', \n metricValue > threshold, \n cmpOperator == '>=', \n metricValue >= threshold, \n cmpOperator == '<', \n metricValue < threshold, \n cmpOperator == '<=', \n metricValue <= threshold, \n bool(null) \n) \n};\n//\nlet applyGoalsOnLegMetric = (legMetricResult:(timestamp:datetime,metricName:string,localParticipantId:string,metricValue:real,metricValueUpperBound:real,metricValueLowerBound:real,SdkVersion:string,ResultType:string,SubCode:string,Platform:string,CallType:string,callId:string)) {\n metricsMetadata\n | join kind=innerunique legMetricResult on metricName\n | extend cmpOperator = cmpOperatorLeg, threshold=targetThresholdLeg, unit=aggregLegUnit\n | project\n timestamp,\n metricName,\n localParticipantId,\n metricValue,\n metricValueUpperBound,\n metricValueLowerBound,\n goal = strcat(cmpOperator, ' ', threshold),\n succeeded= compareMetricWithThreshold(cmpOperator, metricValueUpperBound, threshold),\n unit,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n};\nlet AttemptSuccessFailureLegMetric = (attempt_and_failure_event:(EventInfo_Time:datetime,localParticipantId:string,metricName:string,kind_of_event:string,SdkVersion:string,ResultType:string,SubCode:string,callId:string,UserAgent:string,Platform:string,CallType:string),startDateTime:datetime,endDateTime:datetime) {\n let metadata = metricsMetadata | project metricName, aggregLegRounding;\n let attempt_and_failure_event_with_meta=attempt_and_failure_event | join kind=inner metadata on metricName;\n let attempt_event=attempt_and_failure_event_with_meta | where kind_of_event == 'attempt';\n let failure_event=attempt_and_failure_event_with_meta | where kind_of_event == 'failure';\n let pool = \n attempt_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | project \n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=1.0 * count(),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n let bad= \n failure_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | join kind=leftsemi pool on localParticipantId, metricName\n | project\n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n failures=1.0 * count(),\n EventInfo_Time=max(EventInfo_Time),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n //\n union hint.spread=2 pool, bad\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=sum(attempts),\n failures=sum(failures),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by localParticipantId, metricName\n | extend successes = max_of(attempts - failures, 0) //protect against failures>attempts\n | project\n timestamp=EventInfo_Time,\n metricName,\n localParticipantId,\n metricValue=reliability(successes, attempts),\n metricValueUpperBound=reliability_upperbound(successes, attempts),\n metricValueLowerBound=reliability_lowerbound(successes, attempts),\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n callId\n | invoke applyGoalsOnLegMetric()\n};\nlet clean_result_type = (result_type:string) {\n case (\n result_type contains 'Success' or result_type contains \"Succeeded\",\n 'Succeeded',\n result_type contains 'ExpectedError',\n 'ExpectedError',\n result_type contains 'UnexpectedServerError',\n 'UnexpectedServerError',\n 'UnexpectedClientError'\n )\n};\nlet ASF_Filter = (d:(EventInfo_Time:datetime,localParticipantId:string),startDateTime:datetime,endDateTime:datetime) { \n d \n | where EventInfo_Time between(startDateTime .. endDateTime) and isnotempty(localParticipantId) \n};\nlet ASF3 = (attempt:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),failure:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),metricName:string,startDateTime:datetime,endDateTime:datetime) {\n let fa = ASF_Filter((attempt), startDateTime, endDateTime);\n union\n (\n ASF_Filter((failure), startDateTime, endDateTime)\n | join kind = leftsemi fa on localParticipantId\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='failure',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n ),\n (\n fa\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='attempt',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n )\n};\nlet argStartDateTime = {TimeRange:start};\nlet argEndDateTime = {TimeRange:end};\n//\n//\n// api reliability\nlet startCall = \nACSCallClientOperations\n| where OperationName == 'StartCall'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet startCall_attempt = startCall;\nlet startCall_failure = startCall_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet accept = \nACSCallClientOperations\n| where OperationName == 'AcceptIncomingCall'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet accept_attempt = accept;\nlet accept_failure = accept_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet callJoin = \nACSCallClientOperations\n| where OperationName == 'Join'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet join_attempt = callJoin;\nlet join_failure = join_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_startVideo = \nACSCallClientOperations\n| where OperationName == 'StartVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_startVideo_attempt = api_startVideo;\nlet api_startVideo_failure = api_startVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_stopVideo = \nACSCallClientOperations\n| where OperationName == 'StopVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_stopVideo_attempt = api_stopVideo;\nlet api_stopVideo_failure = api_stopVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_startScreenshare = \nACSCallClientOperations\n| where OperationName == 'StartScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_startScreenshare_attempt = api_startScreenshare;\nlet api_startScreenshare_failure = api_startScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_stopScreenshare = \nACSCallClientOperations\n| where OperationName == 'StopScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_stopScreenshare_attempt = api_stopScreenshare;\nlet api_stopScreenshare_failure = api_stopScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_createView = \nACSCallClientOperations\n| where OperationName == 'CreateView'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_createView_attempt = api_createView;\nlet api_createView_failure = api_createView_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\n// Leg reliability\n//\nlet callagent_init = \nACSCallClientOperations\n| where OperationName == 'CallAgentInit'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=coalesce(ParticipantId, strcat('using client instance id for out of call context operations: ', ClientInstanceId))\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet callagent_init_attempt = callagent_init;\nlet callagent_init_failure = callagent_init_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_stopVideo = \nACSCallClientOperations\n| where OperationName == 'StopVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_stopVideo_attempt = leg_stopVideo;\nlet leg_stopVideo_failure = leg_stopVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_startVideo = \nACSCallClientOperations\n| where OperationName == 'StartVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_startVideo_attempt = leg_startVideo;\nlet leg_startVideo_failure = leg_startVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_startScreenshare = \nACSCallClientOperations\n| where OperationName == 'StartScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_startScreenshare_attempt = leg_startScreenshare;\nlet leg_startScreenshare_failure = leg_startScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_stopScreenshare = \nACSCallClientOperations\n| where OperationName == 'StopScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_stopScreenshare_attempt = leg_stopScreenshare;\nlet leg_stopScreenshare_failure = leg_stopScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_createView = \nACSCallClientOperations\n| where OperationName == 'CreateView'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_createView_attempt = leg_createView;\nlet leg_createView_failure = leg_createView_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet cdc_metrics_aggregation =\nunion\n ASF3(startCall_attempt, startCall_failure, 'reliability/api/StartCall', argStartDateTime, argEndDateTime),\n ASF3(accept_attempt, accept_failure, 'reliability/api/AcceptIncomingCall', argStartDateTime, argEndDateTime),\n ASF3(join_attempt, join_failure, 'reliability/api/Join', argStartDateTime, argEndDateTime),\n\tASF3(api_startVideo_attempt, api_startVideo_failure, 'reliability/api/StartVideo', argStartDateTime, argEndDateTime),\n\tASF3(api_stopVideo_attempt, api_stopVideo_failure, 'reliability/api/StopVideo', argStartDateTime, argEndDateTime),\n\tASF3(api_startScreenshare_attempt, api_startScreenshare_failure, 'reliability/api/StartScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(api_stopScreenshare_attempt, api_stopScreenshare_failure, 'reliability/api/StopScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(api_createView_attempt, api_createView_failure, 'reliability/api/CreateView', argStartDateTime, argEndDateTime),\n\t//\n ASF3(callagent_init_attempt, callagent_init_failure, 'reliability/CallAgentInit', argStartDateTime, argEndDateTime),\n\tASF3(leg_startVideo_attempt, leg_startVideo_failure, 'reliability/StartVideo', argStartDateTime, argEndDateTime),\n\tASF3(leg_stopVideo_attempt, leg_stopVideo_failure, 'reliability/StopVideo', argStartDateTime, argEndDateTime),\n\tASF3(leg_startScreenshare_attempt, leg_startScreenshare_failure, 'reliability/StartScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(leg_stopScreenshare_attempt, leg_stopScreenshare_failure, 'reliability/StopScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(leg_createView_attempt, leg_createView_failure, 'reliability/CreateView', argStartDateTime, argEndDateTime)\n| invoke AttemptSuccessFailureLegMetric(argStartDateTime, argEndDateTime)\n| extend timestampBin = bin(timestamp, 1d)\n| summarize\n legs_dcount = dcount(localParticipantId), \n calls_dcount = dcount(callId),\n success_legs_dcount= dcountif(localParticipantId, succeeded),\n failed_legs_dcount= dcountif(localParticipantId, not(succeeded)),\n timestamp_max = max(timestamp)\n by \n metricName,\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n timestampBin\n;\nlet selected_metric_reliability = todynamic('{MetricName}');\nlet sdkversion_selection = dynamic([{SDKVersion}]);\nlet resultType_selection = dynamic([{ResultType}]);\nlet platform_selection = dynamic([{platform}]);\nlet all_count = \ncdc_metrics_aggregation\n| where isempty(selected_metric_reliability) or metricName == selected_metric_reliability\n| where array_length(sdkversion_selection) == 0 or SdkVersion in (sdkversion_selection)\n| where array_length(resultType_selection) == 0 or ResultType in (resultType_selection)\n| where array_length(platform_selection) == 0 or Platform in (platform_selection)\n| summarize arg_max(timestamp_max, *) by metricName, SdkVersion, ResultType, SubCode, timestampBin, CallType, Platform\n| where isempty(selected_metric_reliability) or metricName == selected_metric_reliability\n| summarize all_legs_dcount = sum(legs_dcount) by metricName;\nlet all_failed_count =\ncdc_metrics_aggregation\n| where ResultType != 'Succeeded'\n| where isempty(selected_metric_reliability) or metricName == selected_metric_reliability\n| where array_length(sdkversion_selection) == 0 or SdkVersion in (sdkversion_selection)\n| where array_length(resultType_selection) == 0 or ResultType in (resultType_selection)\n| where array_length(platform_selection) == 0 or Platform in (platform_selection)\n| summarize arg_max(timestamp_max, *) by metricName, SdkVersion, ResultType, SubCode, timestampBin, CallType, Platform\n| summarize failure_legs_dcount = sum(legs_dcount) by SubCode, ResultType, metricName | order by failure_legs_dcount desc;\nlet golden_answers = datatable(\n Code: int,\n SubCode: string,\n Copilot: string,\n message: string,\n Copilot_prompt: string,\n [\"Failure rate\"]: real,\n [\"Failure count\"]: long,\n [\"Attempt count\"]: long\n)[\n 410, '3112', 'Ask Copilot for help', \"Call setup failed due to network configuration problem on the client side, check the client's network configuration, and retry.\", \"Using 'The call ends with 410/3112' learn document, can you share 'How to detect using SDK' by sharing what code and subcode are thrown, and the Reasons behind these failures and how to mitigate the issues? Provide a link to the document.\", '0.012', '1', '3912'\n];\nall_failed_count\n| join kind=leftouter all_count on metricName\n| where isnotempty(SubCode)\n| join kind=leftouter SubCodes\non $left.SubCode == $right.subCode\n| project\n Code = toint(code), \n SubCode,\n Copilot = \"Ask Copilot for help\",\n Copilot_prompt = strcat(\"Using 'Understanding calling codes and subcodes errors' learn document, under 'Azure Communication Services Calling SDK client error codes and subcodes' section and 'Calling End call codes and subcodes' section, can you share what \", toint(code), \"-\", SubCode, \" mean? Can you also share advice to mitigate this issue?\"),\n ['Failure rate'] = round(100.0*toreal(failure_legs_dcount)/toreal(all_legs_dcount), 4),\n ['Failure count']=failure_legs_dcount, \n ['Attempt count']=all_legs_dcount,\n message\n| order by ['Failure rate'] desc",
+ "size": 1,
+ "title": "{MetricName:label}, top issues",
+ "noDataMessage": "No reliability logs found in the specified time range",
+ "timeContextFromParameter": "TimeRange",
+ "exportFieldName": "SubCode",
+ "exportParameterName": "selected_subcode",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "gridSettings": {
+ "formatters": [
+ {
+ "columnMatch": "Copilot",
+ "formatter": 7,
+ "formatOptions": {
+ "linkTarget": "CopilotNudge",
+ "copilotNudgeActionSettings": {
+ "nudgeContent": "[\"Copilot_prompt\"]"
+ }
+ }
+ },
+ {
+ "columnMatch": "Copilot_prompt",
+ "formatter": 5
+ },
+ {
+ "columnMatch": "Failure rate",
+ "formatter": 0,
+ "numberFormat": {
+ "unit": 1,
+ "options": {
+ "style": "decimal"
+ }
+ }
+ },
+ {
+ "columnMatch": "metricName",
+ "formatter": 5
+ }
+ ]
+ },
+ "sortBy": []
},
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "3",
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "JitterAvg",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "colors",
- "thresholdsGrid": [
- {
- "operator": ">",
- "thresholdValue": "30",
- "representation": "redBright",
- "text": "{0}{1}"
+ "name": "subcode breakdown"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let divide = (a:real,b:real) { \n iif(b == 0.0 or isnan(b) or isnull(b), real(null), a / b) \n};\nlet reliability = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good), attempts); \n iff(isnull(ratio), real(null), round(100.00 * ratio, decimals)) \n};\nlet reliability_upperbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_upper = ratio + 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_upper_1 = iff(ratio_upper > 1.0, 1.0, ratio_upper); \n iff(isnull(ratio), real(null), round(100.00 * ratio_upper_1, decimals)) \n};\nlet reliability_lowerbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_lower = ratio - 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_lower_1 = iff(ratio_lower < 0.0, 0.0, ratio_lower); \n iff(isnull(ratio), real(null), round(100.00 * ratio_lower_1, decimals)) \n};\nlet compareMetricWithThreshold = (cmpOperator:string,metricValue:real,threshold:real) { \n case( \n cmpOperator == '==', \n metricValue == threshold, \n cmpOperator == '!=', \n metricValue != threshold, \n cmpOperator == '>', \n metricValue > threshold, \n cmpOperator == '>=', \n metricValue >= threshold, \n cmpOperator == '<', \n metricValue < threshold, \n cmpOperator == '<=', \n metricValue <= threshold, \n bool(null) \n) \n};\nlet metricsMetadata = () {\n\tdatatable (\n metricName: string, \n metadataValidAsOf: datetime, \n enabled: bool, \n targetThresholdLeg: real, \n cmpOperatorLeg: string, \n aggregLegRounding: int, \n aggregLegUnit: string, \n description: string, \n priority: int\n ) \n [\n\t\t\t\"reliability/StopVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StopVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/StopScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StopScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/StartVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/api/StartAudio\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartAudio\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/EnterCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/EnterCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/CreateView\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/CreateView\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/CallAgentInit\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/CallAgentInit\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/api/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t] \n | where enabled\n};\nlet applyGoalsOnLegMetric = (legMetricResult:(timestamp:datetime,metricName:string,localParticipantId:string,metricValue:real,metricValueUpperBound:real,metricValueLowerBound:real,SdkVersion:string,ResultType:string,SubCode:string,Platform:string,CallType:string,callId:string)) {\n // Assumption: there is only one metricName in the legMetricResult\n // Kusto does not support asserts on row context\n //\n metricsMetadata\n | join kind=innerunique legMetricResult on metricName\n | extend cmpOperator = cmpOperatorLeg, threshold=targetThresholdLeg, unit=aggregLegUnit\n | project\n timestamp,\n metricName,\n localParticipantId,\n metricValue,\n metricValueUpperBound,\n metricValueLowerBound,\n goal = strcat(cmpOperator, ' ', threshold),\n succeeded= compareMetricWithThreshold(cmpOperator, metricValueUpperBound, threshold),\n unit,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n};\nlet AttemptSuccessFailureLegMetric = (attempt_and_failure_event:(EventInfo_Time:datetime,localParticipantId:string,metricName:string,kind_of_event:string,SdkVersion:string,ResultType:string,SubCode:string,callId:string,UserAgent:string,Platform:string,CallType:string),startDateTime:datetime,endDateTime:datetime) {\n let metadata = metricsMetadata | project metricName, aggregLegRounding;\n let attempt_and_failure_event_with_meta=attempt_and_failure_event | join kind=inner metadata on metricName;\n let attempt_event=attempt_and_failure_event_with_meta | where kind_of_event == 'attempt';\n let failure_event=attempt_and_failure_event_with_meta | where kind_of_event == 'failure';\n let pool = \n attempt_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | project \n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=1.0 * count(),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n let bad= \n failure_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | join kind=leftsemi pool on localParticipantId, metricName\n | project\n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n failures=1.0 * count(),\n EventInfo_Time=max(EventInfo_Time),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n //\n union hint.spread=2 pool, bad\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=sum(attempts),\n failures=sum(failures),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by localParticipantId, metricName\n | extend successes = max_of(attempts - failures, 0) //protect against failures>attempts\n | project\n timestamp=EventInfo_Time,\n metricName,\n localParticipantId,\n metricValue=reliability(successes, attempts),\n metricValueUpperBound=reliability_upperbound(successes, attempts),\n metricValueLowerBound=reliability_lowerbound(successes, attempts),\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n callId\n | invoke applyGoalsOnLegMetric()\n};\nlet clean_result_type = (result_type:string) {\n case (\n result_type contains 'Success' or result_type contains \"Succeeded\",\n 'Succeeded',\n result_type contains 'ExpectedError',\n 'ExpectedError',\n result_type contains 'UnexpectedServerError',\n 'UnexpectedServerError',\n 'UnexpectedClientError'\n )\n};\nlet ASF_Filter = (d:(EventInfo_Time:datetime,localParticipantId:string),startDateTime:datetime,endDateTime:datetime) { \n d \n | where EventInfo_Time between(startDateTime .. endDateTime) and isnotempty(localParticipantId) \n};\nlet ASF3 = (attempt:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),failure:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),metricName:string,startDateTime:datetime,endDateTime:datetime) {\n let fa = ASF_Filter((attempt), startDateTime, endDateTime);\n union\n (\n ASF_Filter((failure), startDateTime, endDateTime)\n | join kind = leftsemi fa on localParticipantId\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='failure',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n ),\n (\n fa\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='attempt',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n )\n};\nlet argStartDateTime = {TimeRange:start};\nlet argEndDateTime = {TimeRange:end};\n//\n// api reliability\nlet startCall = \nACSCallClientOperations\n| where OperationName == 'StartCall'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet startCall_attempt = startCall;\nlet startCall_failure = startCall_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet accept = \nACSCallClientOperations\n| where OperationName == 'AcceptIncomingCall'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet accept_attempt = accept;\nlet accept_failure = accept_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet callJoin = \nACSCallClientOperations\n| where OperationName == 'Join'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet join_attempt = callJoin;\nlet join_failure = join_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_startVideo = \nACSCallClientOperations\n| where OperationName == 'StartVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_startVideo_attempt = api_startVideo;\nlet api_startVideo_failure = api_startVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_stopVideo = \nACSCallClientOperations\n| where OperationName == 'StopVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_stopVideo_attempt = api_stopVideo;\nlet api_stopVideo_failure = api_stopVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_startScreenshare = \nACSCallClientOperations\n| where OperationName == 'StartScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_startScreenshare_attempt = api_startScreenshare;\nlet api_startScreenshare_failure = api_startScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_stopScreenshare = \nACSCallClientOperations\n| where OperationName == 'StopScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_stopScreenshare_attempt = api_stopScreenshare;\nlet api_stopScreenshare_failure = api_stopScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_createView = \nACSCallClientOperations\n| where OperationName == 'CreateView'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_createView_attempt = api_createView;\nlet api_createView_failure = api_createView_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\n// Leg reliability\n//\nlet callagent_init = \nACSCallClientOperations\n| where OperationName == 'CallAgentInit'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=coalesce(ParticipantId, strcat('using client instance id for out of call context operations: ', ClientInstanceId))\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet callagent_init_attempt = callagent_init;\nlet callagent_init_failure = callagent_init_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_stopVideo = \nACSCallClientOperations\n| where OperationName == 'StopVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_stopVideo_attempt = leg_stopVideo;\nlet leg_stopVideo_failure = leg_stopVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_startVideo = \nACSCallClientOperations\n| where OperationName == 'StartVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_startVideo_attempt = leg_startVideo;\nlet leg_startVideo_failure = leg_startVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_startScreenshare = \nACSCallClientOperations\n| where OperationName == 'StartScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_startScreenshare_attempt = leg_startScreenshare;\nlet leg_startScreenshare_failure = leg_startScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_stopScreenshare = \nACSCallClientOperations\n| where OperationName == 'StopScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_stopScreenshare_attempt = leg_stopScreenshare;\nlet leg_stopScreenshare_failure = leg_stopScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_createView = \nACSCallClientOperations\n| where OperationName == 'CreateView'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_createView_attempt = leg_createView;\nlet leg_createView_failure = leg_createView_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet cdc_metrics_aggregation =\nunion\n ASF3(startCall_attempt, startCall_failure, 'reliability/api/StartCall', argStartDateTime, argEndDateTime),\n ASF3(accept_attempt, accept_failure, 'reliability/api/AcceptIncomingCall', argStartDateTime, argEndDateTime),\n ASF3(join_attempt, join_failure, 'reliability/api/Join', argStartDateTime, argEndDateTime),\n\tASF3(api_startVideo_attempt, api_startVideo_failure, 'reliability/api/StartVideo', argStartDateTime, argEndDateTime),\n\tASF3(api_stopVideo_attempt, api_stopVideo_failure, 'reliability/api/StopVideo', argStartDateTime, argEndDateTime),\n\tASF3(api_startScreenshare_attempt, api_startScreenshare_failure, 'reliability/api/StartScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(api_stopScreenshare_attempt, api_stopScreenshare_failure, 'reliability/api/StopScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(api_createView_attempt, api_createView_failure, 'reliability/api/CreateView', argStartDateTime, argEndDateTime),\n\t//\n ASF3(callagent_init_attempt, callagent_init_failure, 'reliability/CallAgentInit', argStartDateTime, argEndDateTime),\n\tASF3(leg_startVideo_attempt, leg_startVideo_failure, 'reliability/StartVideo', argStartDateTime, argEndDateTime),\n\tASF3(leg_stopVideo_attempt, leg_stopVideo_failure, 'reliability/StopVideo', argStartDateTime, argEndDateTime),\n\tASF3(leg_startScreenshare_attempt, leg_startScreenshare_failure, 'reliability/StartScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(leg_stopScreenshare_attempt, leg_stopScreenshare_failure, 'reliability/StopScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(leg_createView_attempt, leg_createView_failure, 'reliability/CreateView', argStartDateTime, argEndDateTime)\n| invoke AttemptSuccessFailureLegMetric(argStartDateTime, argEndDateTime)\n| extend timestampBin = bin(timestamp, 1d)\n| summarize\n legs_dcount = dcount(localParticipantId), \n timestamp_max = max(timestamp)\n by \n metricName,\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n timestampBin\n;\nlet sdkversion_selection = dynamic([{SDKVersion}]);\nlet resultType_selection = dynamic([{ResultType}]);\nlet platform_selection = dynamic([{platform}]);\nlet selected_metric_reliability = todynamic('{MetricName}');\ncdc_metrics_aggregation\n| where ResultType != 'Succeeded'\n| where array_length(sdkversion_selection) == 0 or SdkVersion in (sdkversion_selection)\n| where array_length(resultType_selection) == 0 or ResultType in (resultType_selection)\n| where array_length(platform_selection) == 0 or Platform in (platform_selection) \n| where isempty(selected_metric_reliability) or metricName == selected_metric_reliability\n| extend resultCategory_subcode = strcat(ResultType, '-', toint(SubCode))\n| summarize arg_max(timestamp_max, *) by metricName, SdkVersion, timestampBin, CallType, Platform, resultCategory_subcode, SubCode\n| summarize volume = sum(legs_dcount) by timestampBin, resultCategory_subcode, SubCode\n",
+ "size": 0,
+ "aggregation": 3,
+ "title": "{MetricName:label} subcode over time (includes expectedError)",
+ "noDataMessage": "No reliability logs found in the specified time range",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "visualization": "linechart",
+ "chartSettings": {
+ "xAxis": "timestampBin",
+ "yAxis": [
+ "volume"
+ ],
+ "showLegend": true,
+ "showDataPoints": true,
+ "xSettings": {
+ "dateFormatSettings": {
+ "formatName": "shortDatePattern",
+ "showUtcTime": false
+ }
+ }
+ }
},
- {
- "operator": "Default",
- "thresholdValue": null,
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "PacketLossRateAvg",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "colors",
- "thresholdsGrid": [
- {
- "operator": ">",
- "thresholdValue": ".1",
- "representation": "redBright",
- "text": "{0}{1}"
+ "name": "subcode time chart"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "### SubCode {selected_subcode} breakdown"
},
- {
- "operator": "Default",
- "thresholdValue": null,
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "RoundTripTimeAvg",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "colors",
- "thresholdsGrid": [
- {
- "operator": ">",
- "thresholdValue": "500",
- "representation": "redBright",
- "text": "{0}{1}"
+ "conditionalVisibility": {
+ "parameterName": "selected_subcode",
+ "comparison": "isNotEqualTo"
},
- {
- "operator": "Default",
- "thresholdValue": null,
- "text": "{0}{1}"
- }
- ]
- }
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "CallDate",
- "CallId",
- "Participant"
- ],
- "expandTopLevel": true,
- "finalBy": "MediaType"
- }
- }
- },
- "customWidth": "50",
- "conditionalVisibility": {
- "parameterName": "identity",
- "comparison": "isNotEqualTo"
- },
- "name": "identity-call-details"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let SIPCodesChat = datatable(ResultSignature: string, SIPCode: string)\r\n[\r\n \"0\", \"Success\",\r\n \"100\", \"Trying\",\r\n \"180\", \"Ringing\",\r\n \"181\", \"Call Is Being Forwarded\",\r\n \"182\", \"Queued\",\r\n \"183\", \"Session Progress\",\r\n \"199\", \"Early Dialog Terminated\",\r\n \"200\", \"Success\",\r\n \"202\", \"Accepted\",\r\n \"204\", \"No Notification\",\r\n \"300\", \"Multiple Choices\",\r\n \"301\", \"Moved Permanently\",\r\n \"302\", \"Moved Temporarily\",\r\n \"305\", \"Use Proxy\",\r\n \"380\", \"Alternative Service\",\r\n \"400\", \"Bad Request\",\r\n \"401\", \"Unauthorized\",\r\n \"402\", \"Payment Required\",\r\n \"403\", \"Forbidden\",\r\n \"404\", \"Not Found\",\r\n \"405\", \"Method Not Allowed\",\r\n \"406\", \"Not Acceptable\",\r\n \"407\", \"Proxy Authentication Required\",\r\n \"408\", \"Request Timeout\",\r\n \"409\", \"Conflict\",\r\n \"410\", \"Gone\",\r\n \"411\", \"Length Required\",\r\n \"412\", \"Conditional Request Failed\",\r\n \"413\", \"Request Entity Too Large\",\r\n \"414\", \"Request-URI Too Large\",\r\n \"415\", \"Unsupported Media Type\",\r\n \"416\", \"Unsupported URI Scheme\",\r\n \"417\", \"Unknown Resource-Priority\",\r\n \"420\", \"Bad Extension\",\r\n \"421\", \"Extension Required\",\r\n \"422\", \"Session Interval Too Small\",\r\n \"423\", \"Interval Too Brief\",\r\n \"424\", \"Bad Location Information\",\r\n \"428\", \"Use Identity Header\",\r\n \"429\", \"Provide Referrer Identity\",\r\n \"430\", \"Flow Failed\",\r\n \"433\", \"Anonymity Disallowed\",\r\n \"436\", \"Bad Identity-Info\",\r\n \"437\", \"Unsupported Certificate\",\r\n \"438\", \"Invalid Identity Header\",\r\n \"439\", \"First Hop Lacks Outbound Support\",\r\n \"440\", \"Max-Breadth Exceeded\",\r\n \"469\", \"Bad Info Package\",\r\n \"470\", \"Consent Needed\",\r\n \"480\", \"Temporarily Unavailable\",\r\n \"481\", \"Call/Transaction Does Not Exist\",\r\n \"482\", \"Loop Detected\",\r\n \"483\", \"Too Many Hops\",\r\n \"484\", \"Address Incomplete\",\r\n \"485\", \"Ambiguous\",\r\n \"486\", \"Busy Here\",\r\n \"487\", \"Request Terminated\",\r\n \"488\", \"Not Acceptable Here\",\r\n \"489\", \"Bad Event\",\r\n \"491\", \"Request Pending\",\r\n \"493\", \"Undecipherable\",\r\n \"494\", \"Security Agreement Required\",\r\n \"500\", \"Internal Server Error\",\r\n \"501\", \"Not Implemented\",\r\n \"502\", \"Bad Gateway\",\r\n \"503\", \"Service Unavailable\",\r\n \"504\", \"Server Time-out\",\r\n \"505\", \"Version Not Supported\",\r\n \"513\", \"Message Too Large\",\r\n \"555\", \"Push Notification Service Not Supported\",\r\n \"580\", \"Precondition Failure\",\r\n \"600\", \"Busy Everywhere\",\r\n \"603\", \"Decline\",\r\n \"604\", \"Does Not Exist Anywhere\",\r\n \"606\", \"Not Acceptable\",\r\n \"607\", \"Unwanted\",\r\n \"608\", \"Rejected\",\r\n];\r\n\r\nACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query} and UserId == \"{identity}\"\r\n| join kind=leftouter SIPCodesChat on ResultSignature\r\n| extend OperationDate=strcat(\"📅\", format_datetime(TimeGenerated, 'MM/dd/y'))\r\n| extend OperationTime=format_datetime(TimeGenerated, 'hh:mm:ss')\r\n| extend ResultIcon=iff(ResultType == \"Succeeded\", \"✔️\", \"❌\")\r\n| extend Result=strcat(ResultIcon, \" \", ResultSignature, \": \", SIPCode)\r\n| order by TimeGenerated\r\n| project OperationName, Level, Result, OperationDate, OperationTime, DurationMs\r\n",
- "size": 0,
- "title": "Chat operations for identity {identity}",
- "noDataMessage": "No chat operations found for the specified time range and identity",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
+ "name": "text - 8"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let metricsMetadata = () {\n\tdatatable (\n metricName: string, \n metadataValidAsOf: datetime, \n enabled: bool, \n targetThresholdLeg: real, \n cmpOperatorLeg: string, \n aggregLegRounding: int, \n aggregLegUnit: string, \n description: string, \n priority: int\n ) \n [\n\t\t\t\"reliability/StopVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StopVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/StopScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StopScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/StartVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/api/StartAudio\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartAudio\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/EnterCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/EnterCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/CreateView\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/CreateView\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/CallAgentInit\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/CallAgentInit\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/api/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"performance/api/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(5000),\"<=\",int(1),\"ms\", \"\", int(0),\n\t\t\t\"performance/api/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(5000),\"<=\",int(1),\"ms\", \"\", int(0),\n\t\t\t\"performance/api/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(5000),\"<=\",int(1),\"ms\", \"\", int(0),\n\t\t] \n | where enabled\n};\nlet SubCodes = datatable(\n message: string,\n webConfig_overrideMessage: string,\n webConfig_legacyMessage: string,\n nativeConfig_overrideMessage: string,\n code: real,\n subCode: string,\n resultCategories: string,\n clientOrService: string\n)[\n \"Failed to initialize CallClient. Please try again, if issue persists, gather browser console logs, and contact Azure Communication Services support.\", \"\", \"Failed to initialize CallClient\", \"\", \"500\", \"40000\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent. Please try again, if issue persists, gather browser console logs, and contact Azure Communication Services support.\", \"\", \"Failed to create CallAgent\", \"\", \"409\", \"40001\", \"UnexpectedClientError\", \"client\",\n \"Failed to create TeamsCallAgent. Please try again, if issue persists, gather browser console logs, and contact Azure Communication Services support.\", \"\", \"Failed to create TeamsCallAgent\", \"\", \"409\", \"40002\", \"UnexpectedClientError\", \"client\",\n \"Failed to create a URL object with the ICE server URL provided.\", \"\", \"Error processing relay information. Possibly invalid url: {0}\", \"\", \"400\", \"40003\", \"ExpectedError\", \"client\",\n \"The ICE server url must contain 'turn', 'turns', or 'stun'.\", \"\", \"Error processing relay information. Unrecognized schema\", \"\", \"400\", \"40004\", \"ExpectedError\", \"client\",\n \"Failed setup proxy, the url is too short\", \"\", \"\", \"\", \"400\", \"40005\", \"ExpectedError\", \"client\",\n \"Failed setup proxy, the protocol is not https or http\", \"\", \"\", \"\", \"400\", \"40006\", \"ExpectedError\", \"client\",\n \"Failed to create a URL object with the proxy URL provided.\", \"\", \"Setup failed. Proxy url is invalid: {0}\", \"\", \"400\", \"40007\", \"ExpectedError\", \"client\",\n \"CallClient instance can support only one CallAgent or TeamsCallAgent create new CallClient instance to create new CallAgent or TeamsCallAgent\", \"\", \"\", \"\", \"400\", \"40008\", \"ExpectedError\", \"client\",\n \"EmergencyCountryCode is invalid, max length is 10\", \"\", \"\", \"\", \"400\", \"40009\", \"ExpectedError\", \"client\",\n \"ACS Web Calling SDK must be used through https, file:, or localhost\", \"\", \"\", \"\", \"400\", \"40100\", \"ExpectedError\", \"client\",\n \"Failed to create CallAgent, timeout during initialization of the calling base stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to create stack base due to timeout during initialization\", \"\", \"408\", \"40101\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, failure during initialization of the calling base stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to create stack base due to failure in intialization\", \"\", \"500\", \"40102\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, failure to initialize calling user stack because calling base stack failed to create. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Base stack failed to create\", \"\", \"500\", \"40103\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, timeout during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"User stack init timeout\", \"\", \"408\", \"40104\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, failure during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"User stack init failed\", \"\", \"500\", \"40105\", \"UnexpectedClientError\", \"client\",\n \"Failed to set configurations for the calling stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Unable to parse configuration\", \"\", \"500\", \"40106\", \"UnexpectedClientError\", \"client\",\n \"Failed to set user configurations for calling stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to set configuration for stack\", \"\", \"500\", \"40107\", \"UnexpectedClientError\", \"client\",\n \"Failed to get device manager due to internal call stack undefined. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to get device manager due to internal call stack undefined\", \"\", \"500\", \"40108\", \"UnexpectedClientError\", \"client\",\n \"Failed to set configuration parameters for the calling stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to initialize callclient\", \"\", \"500\", \"40109\", \"UnexpectedClientError\", \"client\",\n \"Fetched undefined configurations for the calling stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Found undefined configs in ECS response: {0}\", \"\", \"500\", \"40110\", \"UnexpectedClientError\", \"client\",\n \"Failed to connect to Azure Communication Services infrastructure. Please try again and check the browser's network requests. If the requests keep failing, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to create trouter service\", \"\", \"500\", \"40111\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize connection to Azure Communication Services infrastructure. Please try again and check the browser's network requests. If the requests keep failing, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Signaling init failed\", \"\", \"500\", \"40112\", \"UnexpectedClientError\", \"client\",\n \"Already connected to Azure Communication Services infrastructure. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Signaling service already initialized\", \"\", \"500\", \"40113\", \"ExpectedError\", \"client\",\n \"Failed to connect to Azure Communication Services infrastructure, timeout during initialization. Please try again and check the browser's network requests. If the requests keep failing, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Signaling init timeout, request took longer than {0} ms\", \"\", \"408\", \"40114\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, unable to initialize connection to Azure Communication Services infrastructure. Please try again and check the browser's network requests. If the requests keep failing, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Signaling failed to initialize.\", \"\", \"412\", \"40115\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, media failure during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"40116\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, signaling failure during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"40117\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, internal stack failure during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"40118\", \"UnexpectedClientError\", \"client\",\n \"Using proxy or custom TURN for calls involving Teams is disabled\", \"\", \"\", \"\", \"403\", \"40200\", \"ExpectedError\", \"client\",\n \"Failed to parse AccessToken\", \"\", \"\", \"\", \"500\", \"40201\", \"UnexpectedClientError\", \"client\",\n \"Call to yourself is not supported.\", \"\", \"\", \"\", \"400\", \"40202\", \"ExpectedError\", \"client\",\n \"Call Agent is already disposed\", \"\", \"\", \"\", \"409\", \"40203\", \"ExpectedError\", \"client\",\n \"Teams Call Agent is already disposed\", \"\", \"\", \"\", \"409\", \"40204\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to CallAgent event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"40205\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from CallAgent event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"40206\", \"ExpectedError\", \"client\",\n \"Device type must be msft-acs-mesh-deviceType-v2 to join immersive call\", \"\", \"\", \"\", \"400\", \"40207\", \"ExpectedError\", \"client\",\n \"Failed to start or join call, call stack did not initialize\", \"\", \"\", \"\", \"500\", \"40208\", \"UnexpectedClientError\", \"client\",\n \"Invalid join locator specified.\", \"\", \"Invalid call configuration\", \"\", \"400\", \"40209\", \"ExpectedError\", \"client\",\n \"The provided Teams meeting link is invalid.\", \"\", \"Invalid meeting link\", \"\", \"400\", \"40210\", \"ExpectedError\", \"client\",\n \"The provided Teams For Life meeting link is invalid.\", \"\", \"Invalid TFL meeting link\", \"\", \"400\", \"40211\", \"ExpectedError\", \"client\",\n \"Starting a group call must include thread ID in StartTeamsGroupCallOptions.\", \"\", \"\", \"\", \"400\", \"40212\", \"ExpectedError\", \"client\",\n \"Starting a one to one with thread ID is invalid.\", \"\", \"\", \"\", \"400\", \"40213\", \"ExpectedError\", \"client\",\n \"Display name is not allowed to be set for Teams users.\", \"\", \"\", \"\", \"400\", \"40214\", \"ExpectedError\", \"client\",\n \"Display name is too long.\", \"\", \"\", \"\", \"400\", \"40215\", \"ExpectedError\", \"client\",\n \"Failed to create CallAgent. Please try again, if issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"40216\", \"UnexpectedClientError\", \"client\",\n \"Attempted to get AccessToken before initialization\", \"\", \"\", \"\", \"422\", \"40217\", \"UnexpectedClientError\", \"client\",\n \"Invalid push notification data provided. No 'incomingCallContext' key found in the PushNotificatitonData.\", \"\", \"Invalid push notification data provided\", \"\", \"400\", \"40218\", \"ExpectedError\", \"client\",\n \"Failed to handle push notification\", \"\", \"\", \"\", \"500\", \"40219\", \"UnexpectedClientError\", \"client\",\n \"Incoming Call push notification payload provided has too many keys. Only 'incomingCallContext' key is expected in the PushNotificatitonData.\", \"\", \"Invalid Incoming Call push notification payload provided\", \"\", \"400\", \"40220\", \"ExpectedError\", \"client\",\n \"Invalid push notification data provided. No 'incomingCallContext' key found in the PushNotificatitonData.\", \"\", \"No 'incomingCallContext' provided in event payload\", \"\", \"400\", \"40221\", \"ExpectedError\", \"client\",\n \"The decoded 'incomingCallContext' data is invalid.\", \"\", \"Invalid Incoming Call push notification payload data provided\", \"\", \"400\", \"40222\", \"ExpectedError\", \"client\",\n \"Incoming Call is already being processed\", \"\", \"\", \"\", \"400\", \"40223\", \"ExpectedError\", \"client\",\n \"Failed to handle Incoming Call push notification\", \"\", \"\", \"\", \"500\", \"40224\", \"UnexpectedClientError\", \"client\",\n \"Missed call\", \"\", \"\", \"\", \"400\", \"40225\", \"ExpectedError\", \"client\",\n \"AssertIsObject failed. : userIds must be object\", \"\", \"\", \"\", \"400\", \"40226\", \"ExpectedError\", \"client\",\n \"AssertNotNull failed. : userIds cannot be null\", \"\", \"\", \"\", \"400\", \"40227\", \"ExpectedError\", \"client\",\n \"Failed to create CallAgent, an instance of CallAgent associated with this identity already exists. Please dispose the existing CallAgent, or create a new one with a different identity.\", \"\", \"Failed to create call agent, call agent for this ACS Id already exists\", \"\", \"409\", \"40228\", \"ExpectedError\", \"client\",\n \"CallAgent must be created only with ACS token\", \"\", \"\", \"\", \"403\", \"40229\", \"ExpectedError\", \"client\",\n \"Failed to create TeamsCallAgent, an instance of TeamsCallAgent associated with this identity already exists. Please dispose the existing TeamsCallAgent before creating a new one.\", \"\", \"Failed to create call agent, call agent for this ACS Id already exists\", \"\", \"409\", \"40230\", \"ExpectedError\", \"client\",\n \"TeamsCallAgent must be created only with Teams token\", \"\", \"\", \"\", \"403\", \"40231\", \"ExpectedError\", \"client\",\n \"Failed to get token\", \"\", \"\", \"\", \"409\", \"40232\", \"UnexpectedClientError\", \"client\",\n \"Refreshed AccessToken User Id doesnt match initial User Id.\", \"\", \"\", \"\", \"400\", \"40233\", \"ExpectedError\", \"client\",\n \"Access token is expired and failed to fetch a valid one after retries.\", \"\", \"\", \"\", \"400\", \"40234\", \"ExpectedError\", \"client\",\n \"AccessToken expired\", \"\", \"\", \"\", \"401\", \"40235\", \"ExpectedError\", \"client\",\n \"Action not allowed.\", \"\", \"\", \"\", \"403\", \"40236\", \"ExpectedError\", \"client\",\n \"Failed to hangup call.\", \"\", \"\", \"\", \"500\", \"40237\", \"UnexpectedServerError\", \"client\",\n \"Joining a Teams for life meeting is not supported\", \"\", \"\", \"\", \"400\", \"40238\", \"ExpectedError\", \"client\",\n \"Failed to get raw device stream track\", \"\", \"\", \"\", \"500\", \"40600\", \"UnexpectedClientError\", \"client\",\n \"Failed to get raw device stream track, make sure there is available device\", \"\", \"\", \"\", \"412\", \"40601\", \"UnexpectedClientError\", \"client\",\n \"Failed to get device manager.\", \"\", \"\", \"\", \"500\", \"40602\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to DeviceManager event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"40603\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from DeviceManager event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"40604\", \"ExpectedError\", \"client\",\n \"Unable to access device manager\", \"\", \"\", \"\", \"500\", \"40605\", \"UnexpectedClientError\", \"client\",\n \"Failed to enumerate speakers, it is not supported to enumerate/select speakers on Android Chrome, iOS Safari, nor MacOS Safari.\", \"\", \"This device does not support speaker enumeration.\", \"\", \"405\", \"40606\", \"ExpectedError\", \"client\",\n \"Microphone selection timed out.\", \"\", \"\", \"\", \"408\", \"40607\", \"UnexpectedClientError\", \"client\",\n \"There was an issue with selecting the microphone\", \"\", \"\", \"\", \"500\", \"40608\", \"UnexpectedClientError\", \"client\",\n \"Speaker selection timed out.\", \"\", \"\", \"\", \"408\", \"40609\", \"UnexpectedClientError\", \"client\",\n \"There was an issue with selecting the speaker\", \"\", \"\", \"\", \"500\", \"40610\", \"UnexpectedClientError\", \"client\",\n \"This device does not support speaker selection.\", \"\", \"\", \"\", \"405\", \"40611\", \"ExpectedError\", \"client\",\n \"At least one permission must be requested\", \"\", \"\", \"\", \"400\", \"40612\", \"ExpectedError\", \"client\",\n \"Failed to obtain permission to use microphone and/or camera, it was denied or it failed. Please ensure to allow the permissions in the browser's setttings and in the OS setttings.\", \"\", \"Permissions not granted or failed: {0}\", \"\", \"400\", \"40613\", \"ExpectedError\", \"client\",\n \"Failed to ask for device permissions Please ensure to allow the permissions in the browser's setttings and in the OS setttings and try again. If issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to get audio video permissions\", \"\", \"500\", \"40614\", \"UnexpectedClientError\", \"client\",\n \"Invalid AudioDeviceInfo object passed in. Ensure it has an Id.\", \"\", \"The device argument is invalid\", \"\", \"400\", \"40615\", \"ExpectedError\", \"client\",\n \"The device is not selectable\", \"\", \"\", \"\", \"400\", \"40616\", \"ExpectedError\", \"client\",\n \"Attempted invalid operation during Emergency Call.\", \"\", \"{0} operation is not allowed during Emergency Call\", \"\", \"500\", \"41000\", \"ExpectedError\", \"client\",\n \"{0} failed\", \"\", \"\", \"\", \"500\", \"41001\", \"UnexpectedClientError\", \"client\",\n \"Unable to get remote audio stream, getMediaStream returned undefined\", \"\", \"\", \"\", \"500\", \"41002\", \"UnexpectedClientError\", \"client\",\n \"Unable to get remote audio stream, getMediaStream returned error\", \"\", \"\", \"\", \"500\", \"41003\", \"UnexpectedClientError\", \"client\",\n \"Getting raw audio media stream is currently disabled by Azure Communication Services.\", \"\", \"Getting raw audio media strema is currently dissabled\", \"\", \"409\", \"41004\", \"ExpectedError\", \"client\",\n \"Failed to accept the Incoming Call\", \"\", \"\", \"\", \"500\", \"41005\", \"UnexpectedClientError\", \"client\",\n \"Failed to accept the incoming call, it is not in the Ringing state. Subcscribe to CallAgent's 'incomingCall' event to accept the incoming call.\", \"\", \"Call cannot be accepted because it is not in Ringing state\", \"\", \"400\", \"41006\", \"ExpectedError\", \"client\",\n \"Failed to reject the incoming call, it is not in the Ringing state. Subcscribe to CallAgent's 'incomingCall' event to reject the incoming call.\", \"\", \"Call cannot be rejectd because it is not in Ringing state\", \"\", \"400\", \"41007\", \"ExpectedError\", \"client\",\n \"Failed to get raw stream from local audio stream\", \"\", \"\", \"\", \"500\", \"41008\", \"UnexpectedClientError\", \"client\",\n \"Failed to set raw input audio stream\", \"\", \"\", \"\", \"500\", \"41009\", \"UnexpectedClientError\", \"client\",\n \"Failed to unset raw input audio stream\", \"\", \"\", \"\", \"500\", \"41010\", \"UnexpectedClientError\", \"client\",\n \"Failed to process audio because the calling stack is undefined. Please collect browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to process audio because of internal call stack error\", \"\", \"500\", \"41011\", \"UnexpectedClientError\", \"client\",\n \"Removing local video stream due to video fail UFD being raised before call connected. Please ensure to allow video permissions in the browser's setttings and in the OS setttings, and ensure the camera device is not being used by another process.\", \"\", \"Removing local video stream due to video fail UFD being raised before call connected. UFD: {0}, value: {1}, call direction: {2}\", \"\", \"409\", \"41012\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop audio on microphone device not functioning or capture mute event {0} with value {1}\", \"\", \"\", \"\", \"400\", \"41013\", \"UnexpectedClientError\", \"client\",\n \"Failed to instantiate the Call\", \"\", \"\", \"\", \"500\", \"41014\", \"UnexpectedClientError\", \"client\",\n \"Failed to mute microphone. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to mute microphone\", \"\", \"500\", \"41015\", \"UnexpectedClientError\", \"client\",\n \"Failed to unmute microphone. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to unmute microphone\", \"\", \"400\", \"41016\", \"UnexpectedClientError\", \"client\",\n \"Failed to recover the microphone audio after bad microphone UFD recovered. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to unmute and start audio, microphone device not functioning\", \"\", \"410\", \"41017\", \"UnexpectedClientError\", \"client\",\n \"Mute other participants is currently disabled by ACS service.\", \"\", \"Mute other participants disabled.\", \"\", \"403\", \"41018\", \"ExpectedError\", \"client\",\n \"Failed to mute all remote participants\", \"\", \"\", \"\", \"500\", \"41019\", \"UnexpectedClientError\", \"client\",\n \"Failed to mute incoming audio\", \"\", \"\", \"\", \"500\", \"41020\", \"UnexpectedClientError\", \"client\",\n \"Failed to unmute incoming audio\", \"\", \"\", \"\", \"500\", \"41021\", \"UnexpectedClientError\", \"client\",\n \"Failed to send DTMF tone\", \"\", \"\", \"\", \"400\", \"41022\", \"UnexpectedClientError\", \"client\",\n \"Invalid value passed to DtfmTone\", \"\", \"\", \"\", \"422\", \"41023\", \"ExpectedError\", \"client\",\n \"Failed to start audio before starting video\", \"\", \"\", \"\", \"500\", \"41024\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video, LocalVideoStream instance is invalid or empty. Please pass in a LocalVideoStream instance.\", \"\", \"Failed to start video, localVideoStream cannot be null\", \"\", \"400\", \"41025\", \"ExpectedError\", \"client\",\n \"Failed to start video, localVideoStream is not an instance of LocalVideoStream\", \"\", \"\", \"\", \"400\", \"41026\", \"ExpectedError\", \"client\",\n \"Failed to start video, video is already started.\", \"\", \"Failed to start video, local video is already on\", \"\", \"400\", \"41027\", \"ExpectedError\", \"client\",\n \"Failed to set media stream\", \"\", \"\", \"\", \"500\", \"41028\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video\", \"\", \"\", \"\", \"500\", \"41029\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop video, video is already stopped.\", \"\", \"Failed to stop video, local video is already off\", \"\", \"400\", \"41030\", \"ExpectedError\", \"client\",\n \"Failed to start video because the calling stack is undefined. Please gether browser console logs, .HAR files, and contact Aure Communication Services support.\", \"\", \"Failed to process video because of internal call stack error\", \"\", \"500\", \"41031\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop video, invalid argument. LocalVideoStream used as an input is currently not being sent.\", \"\", \"Invalid LocalVideoStream, this LocalVideoStream is not being sent\", \"\", \"400\", \"41032\", \"ExpectedError\", \"client\",\n \"Failed to hold the call. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to hold call\", \"\", \"500\", \"41033\", \"UnexpectedClientError\", \"client\",\n \"Failed to resume the call.Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to resume call\", \"\", \"500\", \"41034\", \"UnexpectedClientError\", \"client\",\n \"Failed to start screen share, screen share is already started.\", \"\", \"Failed to start screen share, screen share is already on. Must stop and start again.\", \"\", \"400\", \"41035\", \"ExpectedError\", \"client\",\n \"Failed to start raw screen sharing, localVideoStream is not an instance of LocalVideoStream\", \"\", \"\", \"\", \"400\", \"41036\", \"ExpectedError\", \"client\",\n \"Unable to get media stream from local video stream for raw media screen sharing. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Unable to get media stram from local video stream for screen sharing\", \"\", \"500\", \"41037\", \"UnexpectedClientError\", \"client\",\n \"Failed to set raw media stream for screen sharing. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to set media stream for screen sharing\", \"\", \"422\", \"41038\", \"UnexpectedClientError\", \"client\",\n \"Failed to get raw screen sharing stream. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to get media stream for screen sharing\", \"\", \"422\", \"41039\", \"UnexpectedClientError\", \"client\",\n \"Failed to start screen sharing\", \"\", \"\", \"\", \"500\", \"41040\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop screen share, screen share is already stopped.\", \"\", \"Failed to stop screen share, screen share is already off\", \"\", \"400\", \"41041\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to Call event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"41042\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Call event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"41043\", \"ExpectedError\", \"client\",\n \"Only single LocalVideoStream is supported currently\", \"\", \"\", \"\", \"400\", \"41044\", \"ExpectedError\", \"client\",\n \"Stream is not an instance of LocalVideoStream\", \"\", \"\", \"\", \"400\", \"41045\", \"ExpectedError\", \"client\",\n \"Only single LocalAudioStream is supported currently\", \"\", \"\", \"\", \"400\", \"41046\", \"ExpectedError\", \"client\",\n \"Stream is not an instance of LocalAudioStream\", \"\", \"\", \"\", \"400\", \"41047\", \"ExpectedError\", \"client\",\n \"Failed to start video during call setup process. Please ensure to allow video permissions in the browser's setttings and in the OS setttings, and ensure the camera device is not being used by another process.\", \"\", \"Video failed to start during call-{0} process.\", \"\", \"410\", \"41048\", \"UnexpectedClientError\", \"client\",\n \"Failed to start audio during call setup process. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Audio failed to start during call-{0} process.\", \"\", \"400\", \"41049\", \"UnexpectedClientError\", \"client\",\n \"Failed to force isAvailable flag to False during large meeting\", \"\", \"\", \"\", \"500\", \"41050\", \"UnexpectedClientError\", \"client\",\n \"Failed to dispose view in large meeting\", \"\", \"\", \"\", \"500\", \"41051\", \"UnexpectedClientError\", \"client\",\n \"Not able to add unkown participant.\", \"\", \"\", \"\", \"400\", \"41052\", \"ExpectedError\", \"client\",\n \"Participant is already in the call.\", \"\", \"{0} is already in the call\", \"\", \"400\", \"41053\", \"ExpectedError\", \"client\",\n \"Failed to remove the specified participant. The participant is not in the call.\", \"\", \"{0} is not in the call.\", \"\", \"400\", \"41054\", \"ExpectedError\", \"client\",\n \"Add participant failed: thread ID is missing in options.\", \"\", \"\", \"\", \"400\", \"41055\", \"ExpectedError\", \"client\",\n \"Failed to start or join to the call, Teams Enterprise voice policy is not enabled for this Azure Communication Services resource. Follow the tutorial online to enable it.\", \"\", \"Teams Enterprise voice is not enabled. Teams user is not eligible to make PSTN call\", \"\", \"412\", \"41056\", \"ExpectedError\", \"client\",\n \"Failed to get server call Id\", \"\", \"\", \"\", \"500\", \"41057\", \"UnexpectedClientError\", \"client\",\n \"Failed to get the MediaStream to initialize the Volume indicator. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"failed to getMediaStreamTrack\", \"\", \"500\", \"41058\", \"UnexpectedClientError\", \"client\",\n \"Failed to setup volume calcualtor using AudioContext, please retry getVolumeindicator on a working audio stream with exponential backoff\", \"\", \"\", \"\", \"500\", \"41059\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to Volume Indicator event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"400\", \"41060\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Volume Indicator event, unknown event name.\", \"\", \"Not able to unsubscribe to event {0}, unknown event name\", \"\", \"400\", \"41061\", \"ExpectedError\", \"client\",\n \"Failed to setup volume calculator, please retry after exponential backoff\", \"\", \"\", \"\", \"500\", \"41062\", \"UnexpectedClientError\", \"client\",\n \"Failed to get serverCallId, serverCallId is empty\", \"\", \"\", \"\", \"404\", \"41063\", \"UnexpectedClientError\", \"client\",\n \"Setting call constraint is currently disabled by ACS service.\", \"\", \"Setting call constraints is disabled\", \"\", \"409\", \"41064\", \"ExpectedError\", \"client\",\n \"Error setting call constraints at call setup. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error setting call constraints at call {0}\", \"\", \"500\", \"41065\", \"UnexpectedClientError\", \"client\",\n \"Error setting call constraints during mid-call\", \"\", \"\", \"\", \"500\", \"41066\", \"UnexpectedClientError\", \"client\",\n \"Error settting video constraints during call settup or mid-call. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error setting video constraints during call stage: {0}\", \"\", \"500\", \"41067\", \"UnexpectedClientError\", \"client\",\n \"Error setting video constraints during call accept\", \"\", \"\", \"\", \"500\", \"41068\", \"UnexpectedClientError\", \"client\",\n \"Error setting video constraints during call start\", \"\", \"\", \"\", \"500\", \"41069\", \"UnexpectedClientError\", \"client\",\n \"Failed to set call constraints during mid call\", \"\", \"\", \"\", \"500\", \"41070\", \"UnexpectedClientError\", \"client\",\n \"Failed to start screen share, call is not in Connected state. Subscribe to the Call's 'statteChanged' event to know when the call is connected.\", \"\", \"Failed to start screen sharing. Call must be in connected state\", \"\", \"412\", \"41071\", \"ExpectedError\", \"client\",\n \"Failed to stop screen sharing. Call must be in connected state\", \"\", \"\", \"\", \"412\", \"41072\", \"ExpectedError\", \"client\",\n \"Failed to get or set custom MediaStream, this functionality is currently disabled by Azure Communication Services.\", \"\", \"Accessing raw media stream is currently not enabled\", \"\", \"412\", \"41073\", \"ExpectedError\", \"client\",\n \"The raw media stream function is currently not available\", \"\", \"\", \"\", \"500\", \"41074\", \"UnexpectedClientError\", \"client\",\n \"Failed to start raw screen sharing, localVideoStream doesn't contain a raw media stream\", \"\", \"\", \"\", \"400\", \"41075\", \"ExpectedError\", \"client\",\n \"Failed to start audio stream.\", \"\", \"\", \"\", \"500\", \"41076\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop video.\", \"\", \"\", \"\", \"500\", \"41077\", \"UnexpectedClientError\", \"client\",\n \"Incoming call is already unplaced\", \"\", \"\", \"\", \"400\", \"41078\", \"ExpectedError\", \"client\",\n \"Failed to reject call\", \"\", \"\", \"\", \"500\", \"41079\", \"UnexpectedServerError\", \"client\",\n \"Failed to start local audio device\", \"\", \"\", \"\", \"400\", \"41080\", \"UnexpectedClientError\", \"client\",\n \"Failed to Select Virtual Device.\", \"\", \"\", \"\", \"400\", \"41081\", \"UnexpectedClientError\", \"client\",\n \"Failed to Unselect Virtual Device.\", \"\", \"\", \"\", \"400\", \"41082\", \"UnexpectedClientError\", \"client\",\n \"Failed to start raw audio, localAudioStream doesn't contain a raw media stream. To start raw audio, the LocalAudioStream passed in, must be constructed with a MediaStream object.\", \"\", \"\", \"\", \"400\", \"41083\", \"ExpectedError\", \"client\",\n \"Failed to stop raw audio, localAudioStream doesn't contain a raw media stream. To stop raw audio, the current LocalAudioStream in the call must have a MediaStream as the source.\", \"\", \"\", \"\", \"400\", \"41084\", \"ExpectedError\", \"client\",\n \"Thread ID is invalid.\", \"\", \"\", \"\", \"400\", \"41085\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to Lobby event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"41800\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Lobby event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"41801\", \"ExpectedError\", \"client\",\n \"Current conversation type doesn't support lobby admit and reject\", \"\", \"\", \"\", \"400\", \"41802\", \"ExpectedError\", \"client\",\n \"Participant is already in the meeting.\", \"\", \"{0} is already in the meeting\", \"\", \"400\", \"41803\", \"ExpectedError\", \"client\",\n \"Participant is not in the lobby.\", \"\", \"{0} is not in the lobby\", \"\", \"400\", \"41804\", \"ExpectedError\", \"client\",\n \"only Organizer, Co-organizer or Presenter can admit/reject participants from lobby\", \"\", \"\", \"\", \"403\", \"41805\", \"ExpectedError\", \"client\",\n \"Failed to admit participants in the lobby\", \"\", \"\", \"\", \"500\", \"41806\", \"UnexpectedServerError\", \"client\",\n \"Participant list is empty\", \"\", \"\", \"\", \"400\", \"41807\", \"ExpectedError\", \"client\",\n \"Lobby is not enabled for this meeting\", \"\", \"\", \"\", \"400\", \"41808\", \"ExpectedError\", \"client\",\n \"Failed to reject participants from the lobby\", \"\", \"\", \"\", \"500\", \"41809\", \"UnexpectedServerError\", \"client\",\n \"Failed to fetch Teams user policies and settings cannot proceed, because teams user Id was not found in the AccessToken.\", \"\", \"Caller's MicrosoftTeamsUserIdentifier wasn't provided. Fetching Teams user policies and settings cannot proceed\", \"\", \"400\", \"41900\", \"ExpectedError\", \"client\",\n \"Error Fetching Teams user policy from ACS MiddleTier Service\", \"\", \"\", \"\", \"500\", \"41901\", \"UnexpectedServerError\", \"client\",\n \"Unable to derive emergency policy from ACS MiddleTier Service response\", \"\", \"\", \"\", \"500\", \"41902\", \"UnexpectedServerError\", \"client\",\n \"Unable to fetch Teams calling policy from ACS MiddleTier Service response. Please try again, if the issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Unable to fetch teamsCallingPolicy from ACS MiddleTier Service response\", \"\", \"500\", \"41903\", \"UnexpectedServerError\", \"client\",\n \"Unable to fetch Teams meeting policy from ACS MiddleTier Service response. Please try again, if the issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Unable to fetch teamsMeetingPolicy from ACS MiddleTier Service response\", \"\", \"500\", \"41904\", \"UnexpectedServerError\", \"client\",\n \"Unable to fetch feature types from ACS MiddleTier Service response. Please try again, if the issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Unable to fetch featureTypes from ACS MiddleTier Service response\", \"\", \"500\", \"41905\", \"UnexpectedServerError\", \"client\",\n \"Unable to create thread for the Teams User groupcall from ACS MiddleTier Service response\", \"\", \"\", \"\", \"500\", \"41906\", \"UnexpectedServerError\", \"client\",\n \"Unable to add particpant for the thread for Teams groupcall from ACS MiddleTier Service\", \"\", \"\", \"\", \"500\", \"41907\", \"UnexpectedServerError\", \"client\",\n \"Mute other participants is disabled by ACS service.\", \"\", \"Mute other participants disabled.\", \"\", \"403\", \"42000\", \"ExpectedError\", \"client\",\n \"Failed to mute specific participant\", \"\", \"\", \"\", \"500\", \"42001\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to RemoteParticipant event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"42002\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from RemoteParticipant event, unknown event name.\", \"\", \"Not able to unsubscribe to event {0}, unknown event name\", \"\", \"422\", \"42003\", \"ExpectedError\", \"client\",\n \"The scenario to soft mute a PSTN participant is not supported.\", \"\", \"\", \"\", \"405\", \"42004\", \"ExpectedError\", \"client\",\n \"Failed to start video, video device is being used by another process/application. Stop your camera from being used in the other process/application and try again.\", \"\", \"Video operation failure SourceUnavailableError\", \"\", \"412\", \"43000\", \"ExpectedError\", \"client\",\n \"Failed to start video, permission was not granted to use selected video device. Ensure video device permissions are allowed in the browser's settings and in the system's setttings.\", \"\", \"Video operation failure PermissionDeniedError\", \"\", \"403\", \"43001\", \"ExpectedError\", \"client\",\n \"Failed to start video, unknown error. Please try again. If the issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure UnknownFailureForVideoOperation\", \"\", \"500\", \"43002\", \"UnexpectedClientError\", \"client\",\n \"Failed to create local video stream, source was not of type VideoDeviceInfo or MediaStream\", \"\", \"\", \"\", \"400\", \"43003\", \"ExpectedError\", \"client\",\n \"Failed to switch video device, invalid input. Input must be of a VideoDeviceInfo type.\", \"\", \"Failed to switch source, source was not of type VideoDeviceInfo\", \"\", \"400\", \"43004\", \"ExpectedError\", \"client\",\n \"Failed to switch video device, unable to switch to the same video device, it's already selected.\", \"\", \"Unable to switch to the same source\", \"\", \"400\", \"43005\", \"ExpectedError\", \"client\",\n \"Unable to get device type\", \"\", \"\", \"\", \"500\", \"43006\", \"UnexpectedClientError\", \"client\",\n \"Failed to get raw video stream. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to get media stream\", \"\", \"500\", \"43007\", \"UnexpectedClientError\", \"client\",\n \"Failed to set media stream source is not MediaStream\", \"\", \"\", \"\", \"400\", \"43008\", \"ExpectedError\", \"client\",\n \"Failed to set raw video stream. Found undefined function. Gather browser console logs and contact Azure Communication Services support.\", \"\", \"Unable ot set media stream\", \"\", \"500\", \"43009\", \"UnexpectedClientError\", \"client\",\n \"Failed to set raw video stream. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to set media stream\", \"\", \"500\", \"43010\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to LocalVideoStream event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"43011\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from LocalVideoStream event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"43012\", \"ExpectedError\", \"client\",\n \"Failed to start video, no video devices found. Ensure video devices are plugged in and enabled in the system settings.\", \"\", \"Video operation failure DevicesNotFoundError\", \"\", \"412\", \"43013\", \"ExpectedError\", \"client\",\n \"Failed to start video, error requesting media stream. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure MediaStreamRequestError\", \"\", \"412\", \"43014\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video, media stream request timed out. PLease allow permission on the browser's prompt to access the camera and try again.\", \"\", \"Video operation failure MediaStreamRequestTimedout\", \"\", \"412\", \"43015\", \"ExpectedError\", \"client\",\n \"Failed to start video, permissions denied by system. Ensure video device permissions are allowed in the browser's settings and in the system's setttings.\", \"\", \"Video operation failure PermissionsDeniedBySystem\", \"\", \"412\", \"43016\", \"ExpectedError\", \"client\",\n \"Failed to start video, unsupported stream. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure UnsupportedStream\", \"\", \"412\", \"43017\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video, failed to set constraints. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure ConstraintNotSatisfiedError\", \"\", \"412\", \"43018\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video, no device selected. Please ensure to pass a LocalVideoStream constructed with a VideoDeviceInfo and try again. If issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure noDeviceSelected\", \"\", \"412\", \"43019\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to RemoteVideoStream event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"43100\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from RemoteVideoStream event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"43101\", \"ExpectedError\", \"client\",\n \"Not able to get media stream\", \"\", \"\", \"\", \"500\", \"43102\", \"UnexpectedClientError\", \"client\",\n \"The remote video stream is currently not available, subscribe to the stream's isAvailable property to get notified when it is ready to get the raw media stream.\", \"\", \"The stream is currently not availalbe, subscribe to stream.isAvailable property to get notified when it is ready to get media stream\", \"\", \"400\", \"43103\", \"ExpectedError\", \"client\",\n \"Failed to subscribe to media stream, timeout\", \"\", \"\", \"\", \"408\", \"43104\", \"UnexpectedClientError\", \"client\",\n \"Failed to get media stream\", \"\", \"\", \"\", \"500\", \"43105\", \"UnexpectedClientError\", \"client\",\n \"Failed to subscribe to media stream, muted\", \"\", \"\", \"\", \"408\", \"43106\", \"UnexpectedClientError\", \"client\",\n \"Failed to get raw media stream\", \"\", \"\", \"\", \"500\", \"43107\", \"UnexpectedClientError\", \"client\",\n \"Failed to render video stream, this stream is not available. Subscribe to the stream's isAvailable property to get notified when the remote participant has their video on and the stream is available for rendering.\", \"\", \"Failed to create view, remote stream is not available\", \"\", \"412\", \"43200\", \"ExpectedError\", \"client\",\n \"Failed to start stream, already disposed\", \"\", \"\", \"\", \"405\", \"43201\", \"ExpectedError\", \"client\",\n \"Failed to render video stream, this stream is not longer available. Remote participant turned their video off.\", \"\", \"Failed to start stream, stream became unavailable\", \"\", \"404\", \"43202\", \"ExpectedError\", \"client\",\n \"Failed to render video stream, rendering timed out while waiting for video frames. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Failed to render stream, timeout\", \"\", \"408\", \"43203\", \"UnexpectedClientError\", \"client\",\n \"Failed to render video stream, failed to subscribe to video on the Azure Communication Services infrastructure. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Failed to start stream, fail to subscribe\", \"\", \"500\", \"43204\", \"UnexpectedClientError\", \"client\",\n \"Failed to start stream, internal error\", \"\", \"\", \"\", \"500\", \"43205\", \"UnexpectedClientError\", \"client\",\n \"Failed to updateScalingMode, failed to update\", \"\", \"\", \"\", \"500\", \"43206\", \"UnexpectedClientError\", \"client\",\n \"Failed to start stream, disposing stream because participant is not a dominant speaker in the large meeting\", \"\", \"\", \"\", \"405\", \"43207\", \"ExpectedError\", \"client\",\n \"Failed to start stream, disposing stream because remote video stream is disposing\", \"\", \"\", \"\", \"405\", \"43208\", \"ExpectedError\", \"client\",\n \"Failed to render video stream, VideoStreamRenderer was disposed during initialization process.\", \"\", \"Failed to start stream, disposing stream\", \"\", \"405\", \"43209\", \"ExpectedError\", \"client\",\n \"Failed to dispose VideoStreamRenderer, it is already disposed.\", \"\", \"Failed to dispose stream, already disposed\", \"\", \"400\", \"43210\", \"ExpectedError\", \"client\",\n \"Failed to dispose remote renderer\", \"\", \"\", \"\", \"500\", \"43211\", \"UnexpectedClientError\", \"client\",\n \"Failed to create VideoStreamRendererView, videoStream must be either LocalVideoStream or RemoteVideoStream type\", \"\", \"\", \"\", \"400\", \"43212\", \"ExpectedError\", \"client\",\n \"Failed to dispose, VideoStreamRendererView is disposed\", \"\", \"\", \"\", \"400\", \"43213\", \"ExpectedError\", \"client\",\n \"Failed to render, stream disposed\", \"\", \"\", \"\", \"400\", \"43214\", \"ExpectedError\", \"client\",\n \"Failed to updateScalingMode, VideoStreamRendererView is disposed\", \"\", \"\", \"\", \"400\", \"43215\", \"ExpectedError\", \"client\",\n \"Failed to updateScalingMode, wrong scalingMode value\", \"\", \"\", \"\", \"400\", \"43216\", \"ExpectedError\", \"client\",\n \"Failed to dispose view\", \"\", \"\", \"\", \"500\", \"43217\", \"UnexpectedClientError\", \"client\",\n \"Failed to create VideoStreamRenderer, videoStream must be either LocalVideoStream or RemoteVideoStreamCommon type\", \"\", \"\", \"\", \"400\", \"43218\", \"ExpectedError\", \"client\",\n \"Failed to create view, VideoStreamRenderer is disposed\", \"\", \"\", \"\", \"400\", \"43219\", \"ExpectedError\", \"client\",\n \"Failed to create view, maximum number of active RemoteVideoStream views has been reached. You can dispose of a previous one in order to create new one.\", \"\", \"Failed to create view, maximum number of {0} active RemoteVideoStream has been reached\", \"\", \"400\", \"43220\", \"ExpectedError\", \"client\",\n \"Failed to create view\", \"\", \"\", \"\", \"500\", \"43221\", \"UnexpectedClientError\", \"client\",\n \"Failed to dispose, VideoStreamRendererView is already disposed\", \"\", \"\", \"\", \"400\", \"43222\", \"ExpectedError\", \"client\",\n \"Unknown stream type\", \"\", \"\", \"\", \"400\", \"43223\", \"ExpectedError\", \"client\",\n \"Failed to dispose local renderer\", \"\", \"\", \"\", \"500\", \"43224\", \"UnexpectedClientError\", \"client\",\n \"Failed to create local audio stream, source is not of type AudioDeviceInfo or MediaStream\", \"\", \"\", \"\", \"400\", \"43600\", \"ExpectedError\", \"client\",\n \"Failed to create local audio stream, source is not a microphone\", \"\", \"\", \"\", \"400\", \"43601\", \"ExpectedError\", \"client\",\n \"Failed to get media stream source is not AudioDeviceInfo or MediaStream\", \"\", \"\", \"\", \"500\", \"43602\", \"UnexpectedClientError\", \"client\",\n \"Failed to switch stream on local audio, source is not of type MediaStream\", \"\", \"\", \"\", \"400\", \"43603\", \"ExpectedError\", \"client\",\n \"Failed to create local audio stream, source is not a microphone\", \"\", \"\", \"\", \"400\", \"43604\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to LocalAudioStream event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"43605\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from LocalAudioStream event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"43606\", \"ExpectedError\", \"client\",\n \"Failed to switch audio device, unable to switch to the same audio device, it's already selected.\", \"\", \"\", \"\", \"400\", \"43607\", \"ExpectedError\", \"client\",\n \"Failed to start audio, unknown error. Please try again. If the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"43608\", \"UnexpectedClientError\", \"client\",\n \"Unable to parse PhoneNumberIdentifier object\", \"\", \"\", \"\", \"422\", \"44000\", \"ExpectedError\", \"client\",\n \"Unable to parse MicrosoftTeamsUserIdentifier object\", \"\", \"\", \"\", \"422\", \"44001\", \"ExpectedError\", \"client\",\n \"Unable to parse MicrosoftTeamsAppIdentifier object\", \"\", \"\", \"\", \"422\", \"44002\", \"ExpectedError\", \"client\",\n \"Unable to parse Identifier object, please check the syntax\", \"\", \"\", \"\", \"422\", \"44003\", \"ExpectedError\", \"client\",\n \"Invalid CommunicationUser identifier specified\", \"\", \"\", \"\", \"422\", \"44004\", \"ExpectedError\", \"client\",\n \"Invalid MicrosoftTeamsUser rawId specified\", \"\", \"\", \"\", \"422\", \"44005\", \"ExpectedError\", \"client\",\n \"Invalid MicrosoftTeamsUser microsoftTeamsUserId specified\", \"\", \"\", \"\", \"422\", \"44006\", \"ExpectedError\", \"client\",\n \"Invalid MicrosoftTeamsApp rawId specified\", \"\", \"\", \"\", \"422\", \"44007\", \"ExpectedError\", \"client\",\n \"Invalid MicrosoftTeamsApp teamsAppId specified\", \"\", \"\", \"\", \"422\", \"44008\", \"ExpectedError\", \"client\",\n \"Invalid identifier specified, please specify an id\", \"\", \"\", \"\", \"422\", \"44009\", \"ExpectedError\", \"client\",\n \"Unable to parse Identifier object\", \"\", \"\", \"\", \"422\", \"44010\", \"ExpectedError\", \"client\",\n \"AssertIsArrayOfIdentifiers failed. : userIds must be array of CommunicationIdentifier\", \"\", \"\", \"\", \"422\", \"44011\", \"ExpectedError\", \"client\",\n \"No cloud prefix found in identity\", \"\", \"\", \"\", \"409\", \"44012\", \"ExpectedError\", \"client\",\n \"Config is empty\", \"\", \"\", \"\", \"500\", \"44100\", \"UnexpectedServerError\", \"client\",\n \"Missing ACS config key\", \"\", \"\", \"\", \"500\", \"44101\", \"UnexpectedServerError\", \"client\",\n \"Error while merging config\", \"\", \"\", \"\", \"500\", \"44102\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize telemetry\", \"\", \"\", \"\", \"500\", \"44103\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize telemetry\", \"\", \"\", \"\", \"500\", \"44104\", \"UnexpectedClientError\", \"client\",\n \"Failed to create and initialize telemetry logger for tenant. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to create and initialize telemetry logger for {0}\", \"\", \"500\", \"44105\", \"UnexpectedClientError\", \"client\",\n \"Failed to flush telemetry\", \"\", \"\", \"\", \"500\", \"44106\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize telemetry logger\", \"\", \"\", \"\", \"500\", \"44107\", \"UnexpectedClientError\", \"client\",\n \"No CommunicationTokenCredential provided\", \"\", \"\", \"\", \"401\", \"44108\", \"ExpectedError\", \"client\",\n \"AccessToken is empty\", \"\", \"\", \"\", \"401\", \"44109\", \"ExpectedError\", \"client\",\n \"Failed to get AccessToken\", \"\", \"\", \"\", \"401\", \"44110\", \"UnexpectedClientError\", \"client\",\n \"Invalid token\", \"\", \"\", \"\", \"401\", \"44111\", \"ExpectedError\", \"client\",\n \"Failed to parse AccessToken\", \"\", \"\", \"\", \"401\", \"44112\", \"ExpectedError\", \"client\",\n \"AccessToken does not contain 'voip' or 'voip.join' scope\", \"\", \"\", \"\", \"401\", \"44113\", \"ExpectedError\", \"client\",\n \"Wrong AccessToken scope format. Scope is expected to be a string that contains 'voip'\", \"\", \"\", \"\", \"401\", \"44114\", \"ExpectedError\", \"client\",\n \"AccessToken does not contain ACS resource Id\", \"\", \"\", \"\", \"401\", \"44115\", \"ExpectedError\", \"client\",\n \"AccessToken does not contain ACS user Id\", \"\", \"\", \"\", \"401\", \"44116\", \"ExpectedError\", \"client\",\n \"Failed to parse AccessToken\", \"\", \"\", \"\", \"401\", \"44117\", \"UnexpectedClientError\", \"client\",\n \"Operation timed out\", \"\", \"\", \"\", \"408\", \"44118\", \"UnexpectedClientError\", \"client\",\n \"Error while trying to start or stop echo cancellation. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error while trying to {0} echo cancellation\", \"\", \"500\", \"45000\", \"UnexpectedClientError\", \"client\",\n \"Error while trying to start or stop noise suppression. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error while trying to {0} noise suppression\", \"\", \"500\", \"45001\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to AudioEffects event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"400\", \"45002\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from AudioEffects event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"400\", \"45003\", \"ExpectedError\", \"client\",\n \"Setting audio effects is currently disabled by Azure Communication Services.\", \"\", \"Setting audio effects is disabled.\", \"\", \"403\", \"45004\", \"ExpectedError\", \"client\",\n \"Audio effects feature is disposed. Create a new AudioEffects feature instance.\", \"\", \"\", \"\", \"400\", \"45005\", \"ExpectedError\", \"client\",\n \"Current source is not supported\", \"\", \"\", \"\", \"415\", \"45006\", \"ExpectedError\", \"client\",\n \"Failed to get device manager to start effects.\", \"\", \"\", \"\", \"500\", \"45007\", \"UnexpectedClientError\", \"client\",\n \"Audio effects feature is disposed. Create a new AudioEffects feature instance.\", \"\", \"\", \"\", \"400\", \"45008\", \"ExpectedError\", \"client\",\n \"Failed to get device manager to stop effects.\", \"\", \"\", \"\", \"500\", \"45009\", \"UnexpectedClientError\", \"client\",\n \"Internal error - DM missing\", \"\", \"\", \"\", \"500\", \"45010\", \"UnexpectedClientError\", \"client\",\n \"EffectProvider not available\", \"\", \"\", \"\", \"500\", \"45011\", \"UnexpectedClientError\", \"client\",\n \"Internal error - stack aec provider missing\", \"\", \"\", \"\", \"500\", \"45012\", \"UnexpectedClientError\", \"client\",\n \"Invalid effect provided\", \"\", \"\", \"\", \"400\", \"45013\", \"ExpectedError\", \"client\",\n \"Invalid or no echo cancellation effect provided\", \"\", \"\", \"\", \"400\", \"45014\", \"ExpectedError\", \"client\",\n \"Invalid or no noise suppression effect provided\", \"\", \"\", \"\", \"400\", \"45015\", \"ExpectedError\", \"client\",\n \"Unsupported effect specified. Please specify a supported audio effect.\", \"\", \"{0} is not supported.\", \"\", \"415\", \"45016\", \"UnexpectedClientError\", \"client\",\n \"Error while checking support\", \"\", \"\", \"\", \"501\", \"45017\", \"UnexpectedClientError\", \"client\",\n \"Invalid or no auto gain control effect provided\", \"\", \"\", \"\", \"400\", \"45018\", \"ExpectedError\", \"client\",\n \"Error while trying to start or stop auto gain control. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error while trying to {0} auto gain control\", \"\", \"500\", \"45019\", \"UnexpectedClientError\", \"client\",\n \"Error setting browser audio processing flags\", \"\", \"\", \"\", \"500\", \"45020\", \"UnexpectedClientError\", \"client\",\n \"Error starting audio effects.\", \"\", \"\", \"\", \"500\", \"45021\", \"UnexpectedClientError\", \"client\",\n \"Error stopping audio effects.\", \"\", \"\", \"\", \"500\", \"45022\", \"UnexpectedClientError\", \"client\",\n \"Error disposing audio effects feature.\", \"\", \"\", \"\", \"500\", \"45023\", \"UnexpectedClientError\", \"client\",\n \"Invalid call survey. Please submit a survey options.\", \"\", \"{0}.\", \"\", \"400\", \"45100\", \"ExpectedError\", \"client\",\n \"Failed to submit survery, timedout. Please try again, if issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"\", \"\", \"408\", \"45101\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize Captions.\", \"\", \"\", \"\", \"500\", \"45200\", \"UnexpectedClientError\", \"client\",\n \"Captions feature is currently disabled by Azure Communication services.\", \"\", \"Feature is not enabled.\", \"\", \"412\", \"45201\", \"ExpectedError\", \"client\",\n \"Spoken language requested is not supported.\", \"\", \"\", \"\", \"400\", \"45202\", \"ExpectedError\", \"client\",\n \"Captions feature is disabled in meeting policy.\", \"\", \"\", \"\", \"403\", \"45203\", \"ExpectedError\", \"client\",\n \"Captions feature is disabled in calling policy.\", \"\", \"\", \"\", \"403\", \"45204\", \"ExpectedError\", \"client\",\n \"Could not start captions.\", \"\", \"\", \"\", \"500\", \"45205\", \"UnexpectedClientError\", \"client\",\n \"Cannot update spoken language as captions has not started.\", \"\", \"\", \"\", \"400\", \"45206\", \"ExpectedError\", \"client\",\n \"Set spoken language is currently disabled by Azure Communication Services.\", \"\", \"Set spoken language is not enabled.\", \"\", \"412\", \"45207\", \"ExpectedError\", \"client\",\n \"Unable to update spoken language. Failed to get token.\", \"\", \"\", \"\", \"401\", \"45208\", \"UnexpectedClientError\", \"client\",\n \"Unable to update spoken language.\", \"\", \"\", \"\", \"500\", \"45209\", \"UnexpectedClientError\", \"client\",\n \"Cannot update caption language as captions has not started.\", \"\", \"\", \"\", \"400\", \"45210\", \"ExpectedError\", \"client\",\n \"Set caption language is currently disabled by Azure Communication Services.\", \"\", \"Set caption language is not enabled.\", \"\", \"412\", \"45211\", \"ExpectedError\", \"client\",\n \"Set caption language failed. Teams premium license is needed to use this feature.\", \"\", \"\", \"\", \"401\", \"45212\", \"ExpectedError\", \"client\",\n \"Caption language requested is not supported.\", \"\", \"\", \"\", \"400\", \"45213\", \"ExpectedError\", \"client\",\n \"Null token\", \"\", \"\", \"\", \"401\", \"45214\", \"ExpectedError\", \"client\",\n \"Unable to update caption language.\", \"\", \"\", \"\", \"500\", \"45215\", \"UnexpectedClientError\", \"client\",\n \"Failed to fetch policy for Teams Captions.\", \"\", \"\", \"\", \"500\", \"45216\", \"UnexpectedClientError\", \"client\",\n \"Captions already active\", \"\", \"\", \"\", \"400\", \"45217\", \"ExpectedError\", \"client\",\n \"Captions feature is not active.\", \"\", \"\", \"\", \"400\", \"45218\", \"ExpectedError\", \"client\",\n \"Operation in progress\", \"\", \"\", \"\", \"400\", \"45219\", \"ExpectedError\", \"client\",\n \"Spoken language already set\", \"\", \"\", \"\", \"400\", \"45220\", \"ExpectedError\", \"client\",\n \"Unable to update caption language as Captions is not active.\", \"\", \"\", \"\", \"400\", \"45221\", \"ExpectedError\", \"client\",\n \"Caption language already set.\", \"\", \"\", \"\", \"400\", \"45222\", \"ExpectedError\", \"client\",\n \"Captions status already set.\", \"\", \"\", \"\", \"400\", \"45223\", \"ExpectedError\", \"client\",\n \"Captions is not supported.\", \"\", \"\", \"\", \"400\", \"45224\", \"ExpectedError\", \"client\",\n \"Failed to update endpoint metadata\", \"\", \"\", \"\", \"500\", \"45225\", \"UnexpectedClientError\", \"client\",\n \"Cannot start captions as call state is not connected.\", \"\", \"\", \"\", \"400\", \"45226\", \"ExpectedError\", \"client\",\n \"DataChannel has been disposed\", \"\", \"\", \"\", \"500\", \"45300\", \"UnexpectedClientError\", \"client\",\n \"Sender is not ready\", \"\", \"\", \"\", \"500\", \"45301\", \"UnexpectedClientError\", \"client\",\n \"No available channel id\", \"\", \"\", \"\", \"500\", \"45302\", \"UnexpectedClientError\", \"client\",\n \"Invalid channel id\", \"\", \"\", \"\", \"400\", \"45303\", \"ExpectedError\", \"client\",\n \"Invalid bitrateInKbps\", \"\", \"\", \"\", \"400\", \"45304\", \"ExpectedError\", \"client\",\n \"Invalid participants\", \"\", \"\", \"\", \"400\", \"45305\", \"ExpectedError\", \"client\",\n \"Too many participants\", \"\", \"\", \"\", \"400\", \"45306\", \"ExpectedError\", \"client\",\n \"No valid participant\", \"\", \"\", \"\", \"400\", \"45307\", \"ExpectedError\", \"client\",\n \"Message data is empty\", \"\", \"\", \"\", \"400\", \"45308\", \"ExpectedError\", \"client\",\n \"The size of message data is too large\", \"\", \"\", \"\", \"400\", \"45309\", \"ExpectedError\", \"client\",\n \"Invalid message length\", \"\", \"\", \"\", \"500\", \"45310\", \"UnexpectedClientError\", \"client\",\n \"The buffer is full. Please wait and try again\", \"\", \"\", \"\", \"500\", \"45311\", \"UnexpectedClientError\", \"client\",\n \"The sender has been closed\", \"\", \"\", \"\", \"400\", \"45312\", \"ExpectedError\", \"client\",\n \"Currently there is no available reliable channel\", \"\", \"\", \"\", \"500\", \"45313\", \"UnexpectedClientError\", \"client\",\n \"Currently there is no available unreliable channel\", \"\", \"\", \"\", \"500\", \"45314\", \"UnexpectedClientError\", \"client\",\n \"Unable allocate the channel because a channel with the same channelId has already been allocated\", \"\", \"\", \"\", \"500\", \"45315\", \"UnexpectedClientError\", \"client\",\n \"Invalid bitrate\", \"\", \"\", \"\", \"400\", \"45316\", \"ExpectedError\", \"client\",\n \"Traffic is limited\", \"\", \"\", \"\", \"400\", \"45317\", \"ExpectedError\", \"client\",\n \"Failed to send message.\", \"\", \"\", \"\", \"500\", \"45318\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to DataChannel event, unknown event name.\", \"\", \"Not able to {0} subscribe to event {1}, unknown event name\", \"\", \"422\", \"45319\", \"ExpectedError\", \"client\",\n \"Wrong argument type specified.\", \"\", \"TypeError: Expect '{0}' to be of type '{1}'\", \"\", \"400\", \"45320\", \"ExpectedError\", \"client\",\n \"Wrong value specified.\", \"\", \"ValueError: Expect '{0}' to be '{1}'\", \"\", \"400\", \"45321\", \"ExpectedError\", \"client\",\n \"Cannot find the channelId specified.\", \"\", \"Cannot find the channelId {0}\", \"\", \"400\", \"45322\", \"ExpectedError\", \"client\",\n \"Failed to create the sender.\", \"\", \"\", \"\", \"500\", \"45323\", \"UnexpectedClientError\", \"client\",\n \"Mapped to an incorrect value type. Please gather browser console logs and contact Azure Communication Services support.\", \"\", \"Mapped to an incorrect value type={0}, diagnostic value={1}, for diagnostic {2}\", \"\", \"500\", \"45400\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to UserFacingDiagnostics event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45401\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from UserFacingDiagnostics event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45402\", \"ExpectedError\", \"client\",\n \"Failed to map diagnostic quality level. Please gather browser console logs and contact Azure Communication Services support.\", \"\", \"Cannot map ts quality level {0} for {1}\", \"\", \"500\", \"45403\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to LiveStream event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45500\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribefrom LiveStream event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45501\", \"ExpectedError\", \"client\",\n \"Invalid aggregationInterval value range.\", \"\", \"\", \"\", \"400\", \"45502\", \"ExpectedError\", \"client\",\n \"invalid dataPointsPerAggregation value range.\", \"\", \"\", \"\", \"400\", \"45503\", \"ExpectedError\", \"client\",\n \"MediaStatsCallFeature has been disposed.\", \"\", \"\", \"\", \"400\", \"45504\", \"ExpectedError\", \"client\",\n \"Invalid aggregationInterval value range.\", \"\", \"\", \"\", \"400\", \"45550\", \"ExpectedError\", \"client\",\n \"invalid dataPointsPerAggregation value range.\", \"\", \"\", \"\", \"400\", \"45551\", \"ExpectedError\", \"client\",\n \"MediaStatsCallFeature has been disposed.\", \"\", \"\", \"\", \"400\", \"45552\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to OptimalVideoCount event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45600\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from OptimalVideoCount event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45601\", \"ExpectedError\", \"client\",\n \"Failed to set default microphone or speaker with error\", \"\", \"\", \"\", \"412\", \"45700\", \"UnexpectedClientError\", \"client\",\n \"Unable to return call diagnostic information.\", \"\", \"\", \"\", \"500\", \"45701\", \"UnexpectedClientError\", \"client\",\n \"Timeout in checking media stream status\", \"\", \"\", \"\", \"500\", \"45702\", \"UnexpectedClientError\", \"client\",\n \"Failed to get existing call agent or create a new one\", \"\", \"\", \"\", \"500\", \"45703\", \"UnexpectedClientError\", \"client\",\n \"Test call failed to connect\", \"\", \"\", \"\", \"500\", \"45704\", \"UnexpectedClientError\", \"client\",\n \"Call failed to render video.\", \"\", \"\", \"\", \"500\", \"45705\", \"UnexpectedClientError\", \"client\",\n \"Test call failed hang up the call\", \"\", \"\", \"\", \"500\", \"45706\", \"UnexpectedClientError\", \"client\",\n \"Failed to get video call media stats\", \"\", \"\", \"\", \"500\", \"45707\", \"UnexpectedClientError\", \"client\",\n \"Call timed out to connect. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Call timeout after {0}\", \"\", \"408\", \"45708\", \"UnexpectedClientError\", \"client\",\n \"Could not initialize raise hand feature.\", \"\", \"\", \"\", \"500\", \"45750\", \"UnexpectedClientError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45751\", \"UnexpectedServerError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45752\", \"UnexpectedServerError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45753\", \"UnexpectedServerError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45754\", \"UnexpectedServerError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45755\", \"UnexpectedServerError\", \"client\",\n \"Lower hands request failed because participant list is empty.\", \"\", \"\", \"\", \"400\", \"45756\", \"ExpectedError\", \"client\",\n \"Raise hands request failed because participant list is empty.\", \"\", \"\", \"\", \"400\", \"45757\", \"ExpectedError\", \"client\",\n \"Call is not connected yet to send reaction\", \"\", \"\", \"\", \"400\", \"45800\", \"ExpectedError\", \"client\",\n \"Reaction send is not supported for 1:1 direct calling with teams identity\", \"\", \"\", \"\", \"400\", \"45801\", \"ExpectedError\", \"client\",\n \"Unable to register listener due to meeting policy\", \"\", \"\", \"\", \"403\", \"45802\", \"ExpectedError\", \"client\",\n \"Unable to deregister listener due to meeting policy\", \"\", \"\", \"\", \"403\", \"45803\", \"ExpectedError\", \"client\",\n \"Unable to send reaction due to meeting policy\", \"\", \"\", \"\", \"403\", \"45804\", \"ExpectedError\", \"client\",\n \"Could not create state service proxy web-socket connection\", \"\", \"\", \"\", \"500\", \"45805\", \"UnexpectedServerError\", \"client\",\n \"Could not create sync map to exchange reaction\", \"\", \"\", \"\", \"500\", \"45806\", \"UnexpectedServerError\", \"client\",\n \"Unable to handle send reaction\", \"\", \"\", \"\", \"400\", \"45807\", \"ExpectedError\", \"client\",\n \"Unable to handle send reaction\", \"\", \"\", \"\", \"500\", \"45808\", \"UnexpectedClientError\", \"client\",\n \"Unable to parse reaction\", \"\", \"\", \"\", \"500\", \"45809\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to Reation event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45810\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Reaction event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45811\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to Recording event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45850\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Recording event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45851\", \"ExpectedError\", \"client\",\n \"Recording status already set.\", \"\", \"\", \"\", \"400\", \"45852\", \"ExpectedError\", \"client\",\n \"Bad request. All participants are already spotlighted\", \"\", \"\", \"\", \"400\", \"45900\", \"ExpectedError\", \"client\",\n \"Internal Error. Start spotlight for participants failed\", \"\", \"\", \"\", \"500\", \"45901\", \"UnexpectedServerError\", \"client\",\n \"Failed to start spotlight. Reached the maximum number of participants that can be Spotlighted.\", \"\", \"startSpotlight failed. {0} is the max number of participants that can be Spotlighted\", \"\", \"400\", \"45902\", \"ExpectedError\", \"client\",\n \"Failed to spotlight. User does not have a Presenter or Organizer role.\", \"\", \"{0} spotlight failed. User does not have a Presenter or Organizer role in {1}\", \"\", \"403\", \"45903\", \"ExpectedError\", \"client\",\n \"Spotlight feature is not enabled\", \"\", \"\", \"\", \"400\", \"45904\", \"ExpectedError\", \"client\",\n \"StartSpotlight failed. Participant list is empty\", \"\", \"\", \"\", \"400\", \"45905\", \"ExpectedError\", \"client\",\n \"Teams meeting audio conferencing feature is only available in meetings\", \"\", \"\", \"\", \"400\", \"45950\", \"ExpectedError\", \"client\",\n \"The Teams meeting audio conferencing details feature is disabled by ACS service.\", \"\", \"Teams meeting audio conferencing details feature is disabled\", \"\", \"405\", \"45951\", \"ExpectedError\", \"client\",\n \"Teams meeting audio conferencing details are not available before joining the Teams meeting\", \"\", \"\", \"\", \"400\", \"45952\", \"ExpectedError\", \"client\",\n \"Teams meeting audio conferencing details are not available in Lobby\", \"\", \"\", \"\", \"400\", \"45953\", \"ExpectedError\", \"client\",\n \"Teams meeting audio conferencing details is not configured\", \"\", \"\", \"\", \"400\", \"45954\", \"UnexpectedClientError\", \"client\",\n \"Error retrieving Teams meeting audio conferencing details\", \"\", \"\", \"\", \"500\", \"45955\", \"UnexpectedServerError\", \"client\",\n \"Transcription status already set.\", \"\", \"\", \"\", \"400\", \"46000\", \"ExpectedError\", \"client\",\n \"Transfer to target failed\", \"\", \"\", \"\", \"500\", \"46050\", \"UnexpectedClientError\", \"client\",\n \"Transfer is not supported in this call.\", \"\", \"\", \"\", \"400\", \"46051\", \"ExpectedError\", \"client\",\n \"Transfer target is not recognized.\", \"\", \"\", \"\", \"400\", \"46052\", \"ExpectedError\", \"client\",\n \"Invalid target participant type detected.\", \"\", \"Invalid target participant type detected: {0}.\", \"\", \"400\", \"46053\", \"ExpectedError\", \"client\",\n \"UnmixedAudio is not available.\", \"\", \"\", \"\", \"500\", \"46100\", \"UnexpectedClientError\", \"client\",\n \"The operation cannot be done because there is a pending operation\", \"\", \"\", \"\", \"400\", \"46101\", \"ExpectedError\", \"client\",\n \"The operation is not supported in peer-to-peer call\", \"\", \"\", \"\", \"400\", \"46102\", \"ExpectedError\", \"client\",\n \"Unmixed audio has been enabled\", \"\", \"\", \"\", \"400\", \"46103\", \"ExpectedError\", \"client\",\n \"Unmixed audio has been disabled\", \"\", \"\", \"\", \"400\", \"46104\", \"ExpectedError\", \"client\",\n \"Unmixed audio has been disposed\", \"\", \"\", \"\", \"400\", \"46105\", \"ExpectedError\", \"client\",\n \"Not able to subscribe or unsubscibe to UnmixedAudio event, unknown event name.\", \"\", \"Unable to {0} to event {1}, unknown event name\", \"\", \"422\", \"46106\", \"ExpectedError\", \"client\",\n \"Wrong argument type specified.\", \"\", \"TypeError: Expect '{0}' to be of type '{1}'\", \"\", \"400\", \"46107\", \"ExpectedError\", \"client\",\n \"Wrong value specified.\", \"\", \"ValueError: Expect '{0}' to be '{1}'\", \"\", \"400\", \"46108\", \"ExpectedError\", \"client\",\n \"Invalid state.\", \"\", \"Invalid state: {0}\", \"\", \"400\", \"46109\", \"ExpectedError\", \"client\",\n \"Unknown error\", \"\", \"\", \"\", \"500\", \"46110\", \"UnexpectedClientError\", \"client\",\n \"Failed to enable unmixed audio: AudioContext={0}, UnmixedAudio={1}\", \"\", \"\", \"\", \"500\", \"46111\", \"UnexpectedClientError\", \"client\",\n \"Failed to disable unmixed audio: AudioContext={0}, UnmixedAudio={1}\", \"\", \"\", \"\", \"500\", \"46112\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize unmixed audio.\", \"\", \"\", \"\", \"500\", \"46113\", \"UnexpectedClientError\", \"client\",\n \"Video effects feature is currently disabled by Azure Communication Services.\", \"\", \"Disabled.\", \"\", \"403\", \"46150\", \"ExpectedError\", \"client\",\n \"VideoEffects feature is disposed. Create a new VideoEffects Feature instance.\", \"\", \"\", \"\", \"400\", \"46151\", \"ExpectedError\", \"client\",\n \"Current source is unsupported to use effects\", \"\", \"\", \"\", \"415\", \"46152\", \"ExpectedError\", \"client\",\n \"Failed to get device manager to start effects.\", \"\", \"\", \"\", \"500\", \"46153\", \"UnexpectedClientError\", \"client\",\n \"EffectProvider not available\", \"\", \"\", \"\", \"500\", \"46154\", \"UnexpectedClientError\", \"client\",\n \"Failed to get WebCV provider.\", \"\", \"\", \"\", \"500\", \"46155\", \"UnexpectedClientError\", \"client\",\n \"Effect is not supported.\", \"\", \"\", \"\", \"501\", \"46156\", \"UnexpectedClientError\", \"client\",\n \"VideoEffects feature is disposed. Create a new VideoEffects Feature instance.\", \"\", \"\", \"\", \"400\", \"46157\", \"UnexpectedClientError\", \"client\",\n \"Failed to get device manager to stop effects.\", \"\", \"\", \"\", \"500\", \"46158\", \"UnexpectedClientError\", \"client\",\n \"Invalid effect provided\", \"\", \"\", \"\", \"400\", \"46159\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to event , unknown event name\", \"\", \"\", \"\", \"400\", \"46160\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe event , unknown event name\", \"\", \"\", \"\", \"400\", \"46161\", \"ExpectedError\", \"client\",\n \"Timed promise; rejected.\", \"\", \"\", \"\", \"408\", \"46162\", \"UnexpectedClientError\", \"client\",\n \"Error while checking support\", \"\", \"\", \"\", \"501\", \"46163\", \"UnexpectedClientError\", \"client\",\n \"Error starting video effects\", \"\", \"\", \"\", \"500\", \"46164\", \"UnexpectedClientError\", \"client\",\n \"Error stopping video effects\", \"\", \"\", \"\", \"500\", \"46165\", \"UnexpectedClientError\", \"client\",\n \"Error disposing video effects feature\", \"\", \"\", \"\", \"500\", \"46166\", \"UnexpectedClientError\", \"client\",\n \"Effect is not available. Try again when the effect is initialized and available\", \"\", \"\", \"\", \"500\", \"46167\", \"UnexpectedClientError\", \"client\",\n \"Effect can not be enabled because of Teams Policy\", \"\", \"\", \"\", \"403\", \"46168\", \"ExpectedError\", \"client\",\n \"Local Recording feature is only available in meetings\", \"\", \"\", \"\", \"400\", \"46200\", \"ExpectedError\", \"client\",\n \"Local Recording feature is currently disabled by Azure Communication Service.\", \"\", \"Local Recording feature is disabled\", \"\", \"405\", \"46201\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to LocalRecording event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"46202\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from LocalRecording event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"46203\", \"ExpectedError\", \"client\",\n \"Failed to start video, permission was not granted to use selected video device. Ensure video device permissions are allowed in the browser's settings and in the system's setttings.\", \"\", \"Video operation failure permissionDeniedError\", \"\", \"403\", \"43001\", \"ExpectedError\", \"client\",\n \"Call ended successfully by local participant.\", \"\", \"\", \"\", \"0\", \"0\", \"Success\", \"service\",\n \"Call ended for all users by the meeting organizer.\", \"\", \"\", \"\", \"0\", \"4097\", \"Success\", \"service\",\n \"Call ended because user disconnected from the call abruptly, this may be a result of a user closing the application that hosted the call, eg a user terminated application, closed browser of browser tab without proper hang-up.\", \"\", \"\", \"\", \"0\", \"4521\", \"ExpectedError\", \"service\",\n \"Call ended for this participant as it was removed from the conversation by another participant.\", \"\", \"\", \"\", \"0\", \"5000\", \"Success\", \"service\",\n \"Call ended successfully, as all callee endpoints declined the call.\", \"\", \"\", \"\", \"0\", \"5003\", \"Success\", \"service\",\n \"This conversation has ended as only one participant was remaining in the conversation.\", \"\", \"\", \"\", \"0\", \"5010\", \"Success\", \"service\",\n \"This conversation has ended as no one else has joined the group call.\", \"\", \"\", \"\", \"0\", \"5013\", \"Success\", \"service\",\n \"\", \"\", \"\", \"\", \"0\", \"5014\", \"Success\", \"service\",\n \"Call ended for this participant as it was removed from the conversation by another participant.\", \"\", \"\", \"\", \"0\", \"5300\", \"Success\", \"service\",\n \"Removed from the Teams meeting lobby by another participant.\", \"\", \"\", \"\", \"0\", \"5854\", \"Success\", \"service\",\n \"Removed from Teams meeting lobby due to inactivity timeout.\", \"\", \"\", \"\", \"0\", \"5855\", \"Success\", \"service\",\n \"Call ended by Azure Communication Services platform.\", \"\", \"\", \"\", \"0\", \"7000\", \"Success\", \"service\",\n \"Call ended by service because transfer completed successfully.\", \"\", \"\", \"\", \"0\", \"7015\", \"Success\", \"service\",\n \"Call is ended.\", \"\", \"\", \"\", \"0\", \"540000\", \"\", \"service\",\n \"Call ended successfully by remote PSTN participant.\", \"\", \"\", \"\", \"0\", \"560000\", \"Success\", \"service\",\n \"Error from CreateUsageRequest: User is not entitled to call this destination.\", \"\", \"\", \"\", \"400\", \"580040\", \"ExpectedError\", \"service\",\n \"Unauthenticated identity.\", \"\", \"\", \"\", \"401\", \"10009\", \"UnexpectedClientError\", \"service\",\n \"Call ended, as it has been marked as a spam and got blocked.\", \"\", \"\", \"\", \"403\", \"510403\", \"ExpectedError\", \"service\",\n \"Call was forbidden, cancelled or rejected\", \"\", \"\", \"\", \"403\", \"560403\", \"UnexpectedClientError\", \"service\",\n \"Call failed, unable to start or join to a call with given Id, call does not exist. Please check if provided id is correct, and if the call did not end already and try again.\", \"\", \"\", \"\", \"404\", \"404\", \"UnexpectedClientError\", \"service\",\n \"Call failed, unable to start or join to a call with given Id, call does not exist. Please check if provided id is correct, and if the call did not end already and try again.\", \"\", \"\", \"\", \"404\", \"4500\", \"ExpectedError\", \"service\",\n \"Phone number not found.\", \"\", \"\", \"\", \"404\", \"560404\", \"ExpectedError\", \"service\",\n \"Call failed, callee failed to finalize call setup, most likely callee lost network or terminated the application abruptly. Ensure clients are connected and available.\", \"\", \"\", \"\", \"408\", \"10057\", \"ExpectedError\", \"service\",\n \"\", \"\", \"\", \"\", \"408\", \"10325\", \"UnexpectedClientError\", \"service\",\n \"Gateway (SBC) failover timer expired.\", \"\", \"\", \"\", \"408\", \"500001\", \"ExpectedError\", \"service\",\n \"The called party did not respond.\", \"\", \"\", \"\", \"408\", \"560408\", \"\", \"service\",\n \"Media dropped during connect.\", \"\", \"\", \"\", \"410\", \"3100\", \"ExpectedError\", \"service\",\n \"\", \"\", \"\", \"\", \"410\", \"3101\", \"\", \"service\",\n \"\", \"\", \"\", \"\", \"410\", \"3112\", \"\", \"service\",\n \"Participant was removed from the call by the Azure Communication Services infrastructure due to loss of media connectivity with Azure Communication Services infrastructure, this usually happens if participant leaves the call abruptly or looses network connectivity. If participant wants to continue the call, it should reconnect.\", \"\", \"\", \"\", \"410\", \"301005\", \"UnexpectedClientError\", \"service\",\n \"\", \"\", \"\", \"\", \"429\", \"5029\", \"ExpectedError\", \"service\",\n \"This call has exceeded the maximum call lifetime.\", \"\", \"\", \"\", \"429\", \"10110\", \"ExpectedError\", \"service\",\n \"Unable to deliver message to client application. Please ensure the client application is successfully sending netwwork requests to Azure Communication Services.\", \"\", \"\", \"\", \"430\", \"10315\", \"\", \"service\",\n \"Unable to deliver message to client application. Please ensure the client application is successfully sending netwwork requests to Azure Communication Services.\", \"\", \"\", \"\", \"430\", \"10317\", \"\", \"service\",\n \"\", \"\", \"\", \"\", \"480\", \"10037\", \"ExpectedError\", \"service\",\n \"Remote client endpoint not registered. Please ensure the client application is successfully sending netwwork requests to Azure Communication Services.\", \"\", \"\", \"\", \"480\", \"10076\", \"ExpectedError\", \"service\",\n \"No answer.\", \"\", \"\", \"\", \"480\", \"560480\", \"UnexpectedServerError\", \"service\",\n \"Incomplete/Invalid callee address.\", \"\", \"\", \"\", \"484\", \"560484\", \"\", \"service\",\n \"Call ended because remote PSTN participant was busy. The number called was already in a call or having technical issues.\", \"\", \"\", \"\", \"486\", \"560486\", \"Success\", \"service\",\n \"Call ended successfully as caller cancelled the call.\", \"\", \"\", \"\", \"487\", \"0\", \"Success\", \"service\",\n \"Call canceled, locally declined, ended due to an endpoint mismatch issue, or failed to generate media offer.\", \"\", \"\", \"\", \"487\", \"4501\", \"\", \"service\",\n \"Call was accepted elsewhere, by another endpoint of this user.\", \"\", \"\", \"\", \"487\", \"10003\", \"Success\", \"service\",\n \"Call was canceled on timeout, no callee endpoint accepted on time. Ensure that user saw the notification and try to initiate that call again.\", \"\", \"\", \"\", \"487\", \"10004\", \"ExpectedError\", \"service\",\n \"Call ended successfully as it was declined by all callee endpoints.\", \"\", \"\", \"\", \"487\", \"10024\", \"Success\", \"service\",\n \"Call canceled, locally declined, ended due to an endpoint mismatch issue, or failed to generate media offer.\", \"\", \"\", \"\", \"487\", \"540200\", \"Success\", \"service\",\n \"Call ended successfully as caller cancelled the call.\", \"\", \"\", \"\", \"487\", \"540487\", \"Success\", \"service\",\n \"Call cancelled by originator.\", \"\", \"\", \"\", \"487\", \"560487\", \"\", \"service\",\n \"Call ended as application did not provide a valid Azure Communication Services token.\", \"\", \"\", \"\", \"495\", \"4507\", \"UnexpectedClientError\", \"service\",\n \"Azure Communication Services infrastructure error. Please gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"10045\", \"\", \"service\",\n \"Unexpected server error\", \"\", \"\", \"\", \"503\", \"560503\", \"UnexpectedServerError\", \"service\",\n \"Call ended successfully as it was declined by callee.\", \"\", \"\", \"\", \"603\", \"0\", \"Success\", \"service\"\n];\nlet divide = (a:real,b:real) { \n iif(b == 0.0 or isnan(b) or isnull(b), real(null), a / b) \n};\nlet reliability = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good), attempts); \n iff(isnull(ratio), real(null), round(100.00 * ratio, decimals)) \n};\nlet reliability_upperbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_upper = ratio + 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_upper_1 = iff(ratio_upper > 1.0, 1.0, ratio_upper); \n iff(isnull(ratio), real(null), round(100.00 * ratio_upper_1, decimals)) \n};\nlet reliability_lowerbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_lower = ratio - 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_lower_1 = iff(ratio_lower < 0.0, 0.0, ratio_lower); \n iff(isnull(ratio), real(null), round(100.00 * ratio_lower_1, decimals)) \n};\nlet compareMetricWithThreshold = (cmpOperator:string,metricValue:real,threshold:real) { \n case( \n cmpOperator == '==', \n metricValue == threshold, \n cmpOperator == '!=', \n metricValue != threshold, \n cmpOperator == '>', \n metricValue > threshold, \n cmpOperator == '>=', \n metricValue >= threshold, \n cmpOperator == '<', \n metricValue < threshold, \n cmpOperator == '<=', \n metricValue <= threshold, \n bool(null) \n) \n};\n//\nlet applyGoalsOnLegMetric = (legMetricResult:(timestamp:datetime,metricName:string,localParticipantId:string,metricValue:real,metricValueUpperBound:real,metricValueLowerBound:real,SdkVersion:string,ResultType:string,SubCode:string,Platform:string,CallType:string,callId:string)) {\n metricsMetadata\n | join kind=innerunique legMetricResult on metricName\n | extend cmpOperator = cmpOperatorLeg, threshold=targetThresholdLeg, unit=aggregLegUnit\n | project\n timestamp,\n metricName,\n localParticipantId,\n metricValue,\n metricValueUpperBound,\n metricValueLowerBound,\n goal = strcat(cmpOperator, ' ', threshold),\n succeeded= compareMetricWithThreshold(cmpOperator, metricValueUpperBound, threshold),\n unit,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n};\nlet AttemptSuccessFailureLegMetric = (attempt_and_failure_event:(EventInfo_Time:datetime,localParticipantId:string,metricName:string,kind_of_event:string,SdkVersion:string,ResultType:string,SubCode:string,callId:string,UserAgent:string,Platform:string,CallType:string),startDateTime:datetime,endDateTime:datetime) {\n let metadata = metricsMetadata | project metricName, aggregLegRounding;\n let attempt_and_failure_event_with_meta=attempt_and_failure_event | join kind=inner metadata on metricName;\n let attempt_event=attempt_and_failure_event_with_meta | where kind_of_event == 'attempt';\n let failure_event=attempt_and_failure_event_with_meta | where kind_of_event == 'failure';\n let pool = \n attempt_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | project \n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=1.0 * count(),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n let bad= \n failure_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | join kind=leftsemi pool on localParticipantId, metricName\n | project\n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n failures=1.0 * count(),\n EventInfo_Time=max(EventInfo_Time),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n //\n union hint.spread=2 pool, bad\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=sum(attempts),\n failures=sum(failures),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by localParticipantId, metricName\n | extend successes = max_of(attempts - failures, 0) //protect against failures>attempts\n | project\n timestamp=EventInfo_Time,\n metricName,\n localParticipantId,\n metricValue=reliability(successes, attempts),\n metricValueUpperBound=reliability_upperbound(successes, attempts),\n metricValueLowerBound=reliability_lowerbound(successes, attempts),\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n callId\n | invoke applyGoalsOnLegMetric()\n};\nlet clean_result_type = (result_type:string) {\n case (\n result_type contains 'Success' or result_type contains \"Succeeded\",\n 'Succeeded',\n result_type contains 'ExpectedError',\n 'ExpectedError',\n result_type contains 'UnexpectedServerError',\n 'UnexpectedServerError',\n 'UnexpectedClientError'\n )\n};\nlet ASF_Filter = (d:(EventInfo_Time:datetime,localParticipantId:string),startDateTime:datetime,endDateTime:datetime) { \n d \n | where EventInfo_Time between(startDateTime .. endDateTime) and isnotempty(localParticipantId) \n};\nlet ASF3 = (attempt:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),failure:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),metricName:string,startDateTime:datetime,endDateTime:datetime) {\n let fa = ASF_Filter((attempt), startDateTime, endDateTime);\n union\n (\n ASF_Filter((failure), startDateTime, endDateTime)\n | join kind = leftsemi fa on localParticipantId\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='failure',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n ),\n (\n fa\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='attempt',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n )\n};\nlet argStartDateTime = {TimeRange:start};\nlet argEndDateTime = {TimeRange:end};\n//\n//\n// api reliability\nlet startCall = \nACSCallClientOperations\n| where OperationName == 'StartCall'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet startCall_attempt = startCall;\nlet startCall_failure = startCall_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet accept = \nACSCallClientOperations\n| where OperationName == 'AcceptIncomingCall'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet accept_attempt = accept;\nlet accept_failure = accept_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet callJoin = \nACSCallClientOperations\n| where OperationName == 'Join'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet join_attempt = callJoin;\nlet join_failure = join_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_startVideo = \nACSCallClientOperations\n| where OperationName == 'StartVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_startVideo_attempt = api_startVideo;\nlet api_startVideo_failure = api_startVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_stopVideo = \nACSCallClientOperations\n| where OperationName == 'StopVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_stopVideo_attempt = api_stopVideo;\nlet api_stopVideo_failure = api_stopVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_startScreenshare = \nACSCallClientOperations\n| where OperationName == 'StartScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_startScreenshare_attempt = api_startScreenshare;\nlet api_startScreenshare_failure = api_startScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_stopScreenshare = \nACSCallClientOperations\n| where OperationName == 'StopScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_stopScreenshare_attempt = api_stopScreenshare;\nlet api_stopScreenshare_failure = api_stopScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_createView = \nACSCallClientOperations\n| where OperationName == 'CreateView'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_createView_attempt = api_createView;\nlet api_createView_failure = api_createView_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\n// Leg reliability\n//\nlet callagent_init = \nACSCallClientOperations\n| where OperationName == 'CallAgentInit'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=coalesce(ParticipantId, strcat('using client instance id for out of call context operations: ', ClientInstanceId))\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet callagent_init_attempt = callagent_init;\nlet callagent_init_failure = callagent_init_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_stopVideo = \nACSCallClientOperations\n| where OperationName == 'StopVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_stopVideo_attempt = leg_stopVideo;\nlet leg_stopVideo_failure = leg_stopVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_startVideo = \nACSCallClientOperations\n| where OperationName == 'StartVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_startVideo_attempt = leg_startVideo;\nlet leg_startVideo_failure = leg_startVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_startScreenshare = \nACSCallClientOperations\n| where OperationName == 'StartScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_startScreenshare_attempt = leg_startScreenshare;\nlet leg_startScreenshare_failure = leg_startScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_stopScreenshare = \nACSCallClientOperations\n| where OperationName == 'StopScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_stopScreenshare_attempt = leg_stopScreenshare;\nlet leg_stopScreenshare_failure = leg_stopScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_createView = \nACSCallClientOperations\n| where OperationName == 'CreateView'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_createView_attempt = leg_createView;\nlet leg_createView_failure = leg_createView_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet cdc_metrics_aggregation =\nunion\n ASF3(startCall_attempt, startCall_failure, 'reliability/api/StartCall', argStartDateTime, argEndDateTime),\n ASF3(accept_attempt, accept_failure, 'reliability/api/AcceptIncomingCall', argStartDateTime, argEndDateTime),\n ASF3(join_attempt, join_failure, 'reliability/api/Join', argStartDateTime, argEndDateTime),\n\tASF3(api_startVideo_attempt, api_startVideo_failure, 'reliability/api/StartVideo', argStartDateTime, argEndDateTime),\n\tASF3(api_stopVideo_attempt, api_stopVideo_failure, 'reliability/api/StopVideo', argStartDateTime, argEndDateTime),\n\tASF3(api_startScreenshare_attempt, api_startScreenshare_failure, 'reliability/api/StartScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(api_stopScreenshare_attempt, api_stopScreenshare_failure, 'reliability/api/StopScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(api_createView_attempt, api_createView_failure, 'reliability/api/CreateView', argStartDateTime, argEndDateTime),\n\t//\n ASF3(callagent_init_attempt, callagent_init_failure, 'reliability/CallAgentInit', argStartDateTime, argEndDateTime),\n\tASF3(leg_startVideo_attempt, leg_startVideo_failure, 'reliability/StartVideo', argStartDateTime, argEndDateTime),\n\tASF3(leg_stopVideo_attempt, leg_stopVideo_failure, 'reliability/StopVideo', argStartDateTime, argEndDateTime),\n\tASF3(leg_startScreenshare_attempt, leg_startScreenshare_failure, 'reliability/StartScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(leg_stopScreenshare_attempt, leg_stopScreenshare_failure, 'reliability/StopScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(leg_createView_attempt, leg_createView_failure, 'reliability/CreateView', argStartDateTime, argEndDateTime)\n| invoke AttemptSuccessFailureLegMetric(argStartDateTime, argEndDateTime)\n| extend timestampBin = bin(timestamp, 1d)\n| summarize\n timestamp_max = max(timestamp)\n by \n localParticipantId,\n callId,\n metricName,\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n timestampBin\n;\nlet selected_metric_reliability = todynamic('{MetricName}');\nlet sdkversion_selection = dynamic([{SDKVersion}]);\nlet resultType_selection = dynamic([{ResultType}]);\nlet platform_selection = dynamic([{platform}]);\nlet selected_subcode = dynamic('{selected_subcode}');\ncdc_metrics_aggregation\n| where isempty(selected_metric_reliability) or metricName == selected_metric_reliability\n| where array_length(sdkversion_selection) == 0 or SdkVersion in (sdkversion_selection)\n| where array_length(resultType_selection) == 0 or ResultType in (resultType_selection)\n| where array_length(platform_selection) == 0 or Platform in (platform_selection)\n| where isempty(selected_subcode) or SubCode == selected_subcode\n| summarize arg_max(timestamp_max, *) by metricName, SdkVersion, ResultType, SubCode, timestampBin, CallType, Platform, localParticipantId, callId\n| join kind=leftouter SubCodes on $left.SubCode == $right.subCode\n| summarize count=count() by Platform\n",
+ "size": 1,
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "visualization": "piechart"
},
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "OperationDate",
- "formatter": 5
- },
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- }
- },
- "sortBy": []
- },
- "customWidth": "50",
- "conditionalVisibility": {
- "parameterName": "identity",
- "comparison": "isNotEqualTo"
- },
- "name": "identity-chat-details"
- }
- ]
- },
- "name": "identity-drill-down-group"
- }
- ]
- },
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "auth"
- },
- "name": "Auth-group"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "items": [
- {
- "type": 1,
- "content": {
- "json": "The following visualizations represent data from the Chat Operational logs.\r\n\r\n**Click on any part of the pie charts below to visualize filtered logs.**"
- },
- "name": "auth-text"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Chat API Results",
- "items": [
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| summarize count() by ResultType\r\n| render piechart",
- "size": 0,
- "noDataMessage": "No chat operations found in the specified time range",
- "exportMultipleValues": true,
- "exportedParameters": [
- {
- "fieldName": "series",
- "parameterName": "chat_result",
- "parameterType": 1
- }
- ],
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "name": "chat-result-types"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let SIPCodesChat = datatable(ResultSignature: string, SIPCode: string)\r\n[\r\n \"0\", \"Success\",\r\n \"100\", \"Trying\",\r\n \"180\", \"Ringing\",\r\n \"181\", \"Call Is Being Forwarded\",\r\n \"182\", \"Queued\",\r\n \"183\", \"Session Progress\",\r\n \"199\", \"Early Dialog Terminated\",\r\n \"200\", \"Success\",\r\n \"202\", \"Accepted\",\r\n \"204\", \"No Notification\",\r\n \"300\", \"Multiple Choices\",\r\n \"301\", \"Moved Permanently\",\r\n \"302\", \"Moved Temporarily\",\r\n \"305\", \"Use Proxy\",\r\n \"380\", \"Alternative Service\",\r\n \"400\", \"Bad Request\",\r\n \"401\", \"Unauthorized\",\r\n \"402\", \"Payment Required\",\r\n \"403\", \"Forbidden\",\r\n \"404\", \"Not Found\",\r\n \"405\", \"Method Not Allowed\",\r\n \"406\", \"Not Acceptable\",\r\n \"407\", \"Proxy Authentication Required\",\r\n \"408\", \"Request Timeout\",\r\n \"409\", \"Conflict\",\r\n \"410\", \"Gone\",\r\n \"411\", \"Length Required\",\r\n \"412\", \"Conditional Request Failed\",\r\n \"413\", \"Request Entity Too Large\",\r\n \"414\", \"Request-URI Too Large\",\r\n \"415\", \"Unsupported Media Type\",\r\n \"416\", \"Unsupported URI Scheme\",\r\n \"417\", \"Unknown Resource-Priority\",\r\n \"420\", \"Bad Extension\",\r\n \"421\", \"Extension Required\",\r\n \"422\", \"Session Interval Too Small\",\r\n \"423\", \"Interval Too Brief\",\r\n \"424\", \"Bad Location Information\",\r\n \"428\", \"Use Identity Header\",\r\n \"429\", \"Provide Referrer Identity\",\r\n \"430\", \"Flow Failed\",\r\n \"433\", \"Anonymity Disallowed\",\r\n \"436\", \"Bad Identity-Info\",\r\n \"437\", \"Unsupported Certificate\",\r\n \"438\", \"Invalid Identity Header\",\r\n \"439\", \"First Hop Lacks Outbound Support\",\r\n \"440\", \"Max-Breadth Exceeded\",\r\n \"469\", \"Bad Info Package\",\r\n \"470\", \"Consent Needed\",\r\n \"480\", \"Temporarily Unavailable\",\r\n \"481\", \"Call/Transaction Does Not Exist\",\r\n \"482\", \"Loop Detected\",\r\n \"483\", \"Too Many Hops\",\r\n \"484\", \"Address Incomplete\",\r\n \"485\", \"Ambiguous\",\r\n \"486\", \"Busy Here\",\r\n \"487\", \"Request Terminated\",\r\n \"488\", \"Not Acceptable Here\",\r\n \"489\", \"Bad Event\",\r\n \"491\", \"Request Pending\",\r\n \"493\", \"Undecipherable\",\r\n \"494\", \"Security Agreement Required\",\r\n \"500\", \"Internal Server Error\",\r\n \"501\", \"Not Implemented\",\r\n \"502\", \"Bad Gateway\",\r\n \"503\", \"Service Unavailable\",\r\n \"504\", \"Server Time-out\",\r\n \"505\", \"Version Not Supported\",\r\n \"513\", \"Message Too Large\",\r\n \"555\", \"Push Notification Service Not Supported\",\r\n \"580\", \"Precondition Failure\",\r\n \"600\", \"Busy Everywhere\",\r\n \"603\", \"Decline\",\r\n \"604\", \"Does Not Exist Anywhere\",\r\n \"606\", \"Not Acceptable\",\r\n \"607\", \"Unwanted\",\r\n \"608\", \"Rejected\",\r\n];\r\n\r\nlet other_chat_results = ACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| summarize operation_count=count() by ResultType\r\n| order by operation_count desc\r\n| extend Rank=row_number()\r\n| where Rank > 5\r\n| project ResultType;\r\n\r\nACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query} and (ResultType in (dynamic([{chat_result}])) or iff(\"Other\" in (dynamic([{chat_result}])), (ResultType in (other_chat_results)), false))\r\n| join kind=leftouter SIPCodesChat on ResultSignature\r\n| extend OperationDate=strcat(\"📅\", format_datetime(TimeGenerated, 'MM/dd/y'))\r\n| extend OperationTime=format_datetime(TimeGenerated, 'hh:mm:ss')\r\n| extend ResultIcon=iff(ResultType == \"Succeeded\", \"✔️\", \"❌\")\r\n| extend Result=strcat(ResultIcon, \" \", ResultSignature, \": \", SIPCode)\r\n| order by TimeGenerated\r\n| project OperationName, Level, Result, ResultDescription, OperationDate, OperationTime, DurationMs\r\n",
- "size": 0,
- "title": "Chat operations with result type {chat_result}",
- "noDataMessage": "No chat operations found for the specified time range and result type",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
+ "customWidth": "50",
+ "conditionalVisibility": {
+ "parameterName": "selected_subcode",
+ "comparison": "isNotEqualTo"
},
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "OperationDate",
- "formatter": 5
- },
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- }
- },
- "sortBy": []
- },
- "conditionalVisibility": {
- "parameterName": "chat_result",
- "comparison": "isNotEqualTo"
- },
- "name": "chat-by-result"
- }
- ]
- },
- "customWidth": "50",
- "name": "chat-results-group"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Chat API Result Signatures",
- "items": [
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let SIPCodesChat = datatable(ResultSignature: string, SIPCode: string, Troubleshooting: string)\r\n[\r\n \"0\", \"Success\", \"\",\r\n \"100\", \"Trying\", \"\",\r\n \"180\", \"Ringing\", \"\",\r\n \"181\", \"Call Is Being Forwarded\", \"\",\r\n \"182\", \"Queued\", \"\",\r\n \"183\", \"Session Progress\", \"\",\r\n \"199\", \"Early Dialog Terminated\", \"\",\r\n \"200\", \"Success\", \"\",\r\n \"202\", \"Accepted\", \"\",\r\n \"204\", \"No Notification\", \"\",\r\n \"300\", \"Multiple Choices\", \"\",\r\n \"301\", \"Moved Permanently\", \"\",\r\n \"302\", \"Moved Temporarily\", \"\",\r\n \"305\", \"Use Proxy\", \"\",\r\n \"380\", \"Alternative Service\", \"\",\r\n \"400\", \"Bad Request\", \"\",\r\n \"401\", \"Unauthorized\", \"Ensure that your Communication Services token is valid and not expired.\",\r\n \"402\", \"Payment Required\", \"\",\r\n \"403\", \"Forbidden\", \"Ensure that the initiator of the request has access to the resource.\",\r\n \"404\", \"Not Found\", \"\",\r\n \"405\", \"Method Not Allowed\", \"\",\r\n \"406\", \"Not Acceptable\", \"\",\r\n \"407\", \"Proxy Authentication Required\", \"\",\r\n \"408\", \"Request Timeout\", \"\",\r\n \"409\", \"Conflict\", \"\",\r\n \"410\", \"Gone\", \"\",\r\n \"411\", \"Length Required\", \"\",\r\n \"412\", \"Conditional Request Failed\", \"\",\r\n \"413\", \"Request Entity Too Large\", \"\",\r\n \"414\", \"Request-URI Too Large\", \"\",\r\n \"415\", \"Unsupported Media Type\", \"\",\r\n \"416\", \"Unsupported URI Scheme\", \"\",\r\n \"417\", \"Unknown Resource-Priority\", \"\",\r\n \"420\", \"Bad Extension\", \"\",\r\n \"421\", \"Extension Required\", \"\",\r\n \"422\", \"Session Interval Too Small\", \"\",\r\n \"423\", \"Interval Too Brief\", \"\",\r\n \"424\", \"Bad Location Information\", \"\",\r\n \"428\", \"Use Identity Header\", \"\",\r\n \"429\", \"Too many requests\", \"Ensure that your client-side application handles this scenario in a user-friendly manner. If the error persists please file a support request.\",\r\n \"430\", \"Flow Failed\", \"\",\r\n \"433\", \"Anonymity Disallowed\", \"\",\r\n \"436\", \"Bad Identity-Info\", \"\",\r\n \"437\", \"Unsupported Certificate\", \"\",\r\n \"438\", \"Invalid Identity Header\", \"\",\r\n \"439\", \"First Hop Lacks Outbound Support\", \"\",\r\n \"440\", \"Max-Breadth Exceeded\", \"\",\r\n \"469\", \"Bad Info Package\", \"\",\r\n \"470\", \"Consent Needed\", \"\",\r\n \"480\", \"Temporarily Unavailable\", \"\",\r\n \"481\", \"Call/Transaction Does Not Exist\", \"\",\r\n \"482\", \"Loop Detected\", \"\",\r\n \"483\", \"Too Many Hops\", \"\",\r\n \"484\", \"Address Incomplete\", \"\",\r\n \"485\", \"Ambiguous\", \"\",\r\n \"486\", \"Busy Here\", \"\",\r\n \"487\", \"Request Terminated\", \"\",\r\n \"488\", \"Not Acceptable Here\", \"\",\r\n \"489\", \"Bad Event\", \"\",\r\n \"491\", \"Request Pending\", \"\",\r\n \"493\", \"Undecipherable\", \"\",\r\n \"494\", \"Security Agreement Required\", \"\",\r\n \"500\", \"Internal Server Error\", \"\",\r\n \"501\", \"Not Implemented\", \"\",\r\n \"502\", \"Bad Gateway\", \"\",\r\n \"503\", \"Service Unavailable\", \"File a support request through the Azure portal.\",\r\n \"504\", \"Server Time-out\", \"\",\r\n \"505\", \"Version Not Supported\", \"\",\r\n \"513\", \"Message Too Large\", \"\",\r\n \"555\", \"Push Notification Service Not Supported\", \"\",\r\n \"580\", \"Precondition Failure\", \"\",\r\n \"600\", \"Busy Everywhere\", \"\",\r\n \"603\", \"Decline\", \"\",\r\n \"604\", \"Does Not Exist Anywhere\", \"\",\r\n \"606\", \"Not Acceptable\", \"\",\r\n \"607\", \"Unwanted\", \"\",\r\n \"608\", \"Rejected\", \"\"\r\n];\r\n\r\nACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| join kind=leftouter SIPCodesChat on ResultSignature\r\n| extend ResultIcon=iff(ResultType == \"Succeeded\", \"✔️\", \"❌\")\r\n| extend Result=strcat(ResultIcon, \" \", ResultSignature, \": \", SIPCode)\r\n| summarize count() by Result//Signature\r\n| render piechart",
- "size": 0,
- "noDataMessage": "No chat operations found in the specified time range",
- "exportMultipleValues": true,
- "exportedParameters": [
- {
- "fieldName": "series",
- "parameterName": "chat_signature",
- "parameterType": 1
- }
- ],
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "name": "sms-results-signature"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let SIPCodesChat = datatable(ResultSignature: string, SIPCode: string, Troubleshooting: string)\r\n[\r\n \"0\", \"Success\", \"\",\r\n \"100\", \"Trying\", \"\",\r\n \"180\", \"Ringing\", \"\",\r\n \"181\", \"Call Is Being Forwarded\", \"\",\r\n \"182\", \"Queued\", \"\",\r\n \"183\", \"Session Progress\", \"\",\r\n \"199\", \"Early Dialog Terminated\", \"\",\r\n \"200\", \"Success\", \"\",\r\n \"202\", \"Accepted\", \"\",\r\n \"204\", \"No Notification\", \"\",\r\n \"300\", \"Multiple Choices\", \"\",\r\n \"301\", \"Moved Permanently\", \"\",\r\n \"302\", \"Moved Temporarily\", \"\",\r\n \"305\", \"Use Proxy\", \"\",\r\n \"380\", \"Alternative Service\", \"\",\r\n \"400\", \"Bad Request\", \"\",\r\n \"401\", \"Unauthorized\", \"Ensure that your Communication Services token is valid and not expired.\",\r\n \"402\", \"Payment Required\", \"\",\r\n \"403\", \"Forbidden\", \"Ensure that the initiator of the request has access to the resource.\",\r\n \"404\", \"Not Found\", \"\",\r\n \"405\", \"Method Not Allowed\", \"\",\r\n \"406\", \"Not Acceptable\", \"\",\r\n \"407\", \"Proxy Authentication Required\", \"\",\r\n \"408\", \"Request Timeout\", \"\",\r\n \"409\", \"Conflict\", \"\",\r\n \"410\", \"Gone\", \"\",\r\n \"411\", \"Length Required\", \"\",\r\n \"412\", \"Conditional Request Failed\", \"\",\r\n \"413\", \"Request Entity Too Large\", \"\",\r\n \"414\", \"Request-URI Too Large\", \"\",\r\n \"415\", \"Unsupported Media Type\", \"\",\r\n \"416\", \"Unsupported URI Scheme\", \"\",\r\n \"417\", \"Unknown Resource-Priority\", \"\",\r\n \"420\", \"Bad Extension\", \"\",\r\n \"421\", \"Extension Required\", \"\",\r\n \"422\", \"Session Interval Too Small\", \"\",\r\n \"423\", \"Interval Too Brief\", \"\",\r\n \"424\", \"Bad Location Information\", \"\",\r\n \"428\", \"Use Identity Header\", \"\",\r\n \"429\", \"Too many requests\", \"Ensure that your client-side application handles this scenario in a user-friendly manner. If the error persists please file a support request.\",\r\n \"430\", \"Flow Failed\", \"\",\r\n \"433\", \"Anonymity Disallowed\", \"\",\r\n \"436\", \"Bad Identity-Info\", \"\",\r\n \"437\", \"Unsupported Certificate\", \"\",\r\n \"438\", \"Invalid Identity Header\", \"\",\r\n \"439\", \"First Hop Lacks Outbound Support\", \"\",\r\n \"440\", \"Max-Breadth Exceeded\", \"\",\r\n \"469\", \"Bad Info Package\", \"\",\r\n \"470\", \"Consent Needed\", \"\",\r\n \"480\", \"Temporarily Unavailable\", \"\",\r\n \"481\", \"Call/Transaction Does Not Exist\", \"\",\r\n \"482\", \"Loop Detected\", \"\",\r\n \"483\", \"Too Many Hops\", \"\",\r\n \"484\", \"Address Incomplete\", \"\",\r\n \"485\", \"Ambiguous\", \"\",\r\n \"486\", \"Busy Here\", \"\",\r\n \"487\", \"Request Terminated\", \"\",\r\n \"488\", \"Not Acceptable Here\", \"\",\r\n \"489\", \"Bad Event\", \"\",\r\n \"491\", \"Request Pending\", \"\",\r\n \"493\", \"Undecipherable\", \"\",\r\n \"494\", \"Security Agreement Required\", \"\",\r\n \"500\", \"Internal Server Error\", \"\",\r\n \"501\", \"Not Implemented\", \"\",\r\n \"502\", \"Bad Gateway\", \"\",\r\n \"503\", \"Service Unavailable\", \"File a support request through the Azure portal.\",\r\n \"504\", \"Server Time-out\", \"\",\r\n \"505\", \"Version Not Supported\", \"\",\r\n \"513\", \"Message Too Large\", \"\",\r\n \"555\", \"Push Notification Service Not Supported\", \"\",\r\n \"580\", \"Precondition Failure\", \"\",\r\n \"600\", \"Busy Everywhere\", \"\",\r\n \"603\", \"Decline\", \"\",\r\n \"604\", \"Does Not Exist Anywhere\", \"\",\r\n \"606\", \"Not Acceptable\", \"\",\r\n \"607\", \"Unwanted\", \"\",\r\n \"608\", \"Rejected\", \"\"\r\n];\r\n\r\nlet other_chat_signature = ACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| summarize operation_count=count() by ResultSignature\r\n| order by operation_count desc\r\n| extend Rank=row_number()\r\n| where Rank > 5\r\n| project ResultSignature;\r\n\r\nACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query} // and (ResultSignature in (dynamic([{chat_signature}])) or iff(\"Other\" in (dynamic([{chat_signature}])), (ResultSignature in (other_chat_signature)), false))\r\n| join kind=leftouter SIPCodesChat on ResultSignature\r\n| extend OperationDate=strcat(\"📅\", format_datetime(TimeGenerated, 'MM/dd/y'))\r\n| extend OperationTime=format_datetime(TimeGenerated, 'hh:mm:ss')\r\n| extend ResultIcon=iff(ResultType == \"Succeeded\", \"✔️\", \"❌\")\r\n| extend Result=strcat(ResultIcon, \" \", ResultSignature, \": \", SIPCode)\r\n| where (Result in (dynamic([{chat_signature}])) or iff(\"Other\" in (dynamic([{chat_signature}])), (ResultSignature in (other_chat_signature)), false))\r\n| order by TimeGenerated\r\n| project OperationName, Level, Result, ResultDescription, Troubleshooting, OperationDate, OperationTime, DurationMs",
- "size": 0,
- "title": "Chat operations with result signature {chat_signature}",
- "noDataMessage": "No chat operations found for the specified time range and result signature",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
+ "name": "query - 6 - Copy"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let metricsMetadata = () {\n\tdatatable (\n metricName: string, \n metadataValidAsOf: datetime, \n enabled: bool, \n targetThresholdLeg: real, \n cmpOperatorLeg: string, \n aggregLegRounding: int, \n aggregLegUnit: string, \n description: string, \n priority: int\n ) \n [\n\t\t\t\"reliability/StopVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StopVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/StopScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StopScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/StartVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/api/StartAudio\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartAudio\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/EnterCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/EnterCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/CreateView\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/CreateView\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/CallAgentInit\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/CallAgentInit\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/api/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"performance/api/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(5000),\"<=\",int(1),\"ms\", \"\", int(0),\n\t\t\t\"performance/api/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(5000),\"<=\",int(1),\"ms\", \"\", int(0),\n\t\t\t\"performance/api/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(5000),\"<=\",int(1),\"ms\", \"\", int(0),\n\t\t] \n | where enabled\n};\nlet SubCodes = datatable(\n message: string,\n webConfig_overrideMessage: string,\n webConfig_legacyMessage: string,\n nativeConfig_overrideMessage: string,\n code: real,\n subCode: string,\n resultCategories: string,\n clientOrService: string\n)[\n \"Failed to initialize CallClient. Please try again, if issue persists, gather browser console logs, and contact Azure Communication Services support.\", \"\", \"Failed to initialize CallClient\", \"\", \"500\", \"40000\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent. Please try again, if issue persists, gather browser console logs, and contact Azure Communication Services support.\", \"\", \"Failed to create CallAgent\", \"\", \"409\", \"40001\", \"UnexpectedClientError\", \"client\",\n \"Failed to create TeamsCallAgent. Please try again, if issue persists, gather browser console logs, and contact Azure Communication Services support.\", \"\", \"Failed to create TeamsCallAgent\", \"\", \"409\", \"40002\", \"UnexpectedClientError\", \"client\",\n \"Failed to create a URL object with the ICE server URL provided.\", \"\", \"Error processing relay information. Possibly invalid url: {0}\", \"\", \"400\", \"40003\", \"ExpectedError\", \"client\",\n \"The ICE server url must contain 'turn', 'turns', or 'stun'.\", \"\", \"Error processing relay information. Unrecognized schema\", \"\", \"400\", \"40004\", \"ExpectedError\", \"client\",\n \"Failed setup proxy, the url is too short\", \"\", \"\", \"\", \"400\", \"40005\", \"ExpectedError\", \"client\",\n \"Failed setup proxy, the protocol is not https or http\", \"\", \"\", \"\", \"400\", \"40006\", \"ExpectedError\", \"client\",\n \"Failed to create a URL object with the proxy URL provided.\", \"\", \"Setup failed. Proxy url is invalid: {0}\", \"\", \"400\", \"40007\", \"ExpectedError\", \"client\",\n \"CallClient instance can support only one CallAgent or TeamsCallAgent create new CallClient instance to create new CallAgent or TeamsCallAgent\", \"\", \"\", \"\", \"400\", \"40008\", \"ExpectedError\", \"client\",\n \"EmergencyCountryCode is invalid, max length is 10\", \"\", \"\", \"\", \"400\", \"40009\", \"ExpectedError\", \"client\",\n \"ACS Web Calling SDK must be used through https, file:, or localhost\", \"\", \"\", \"\", \"400\", \"40100\", \"ExpectedError\", \"client\",\n \"Failed to create CallAgent, timeout during initialization of the calling base stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to create stack base due to timeout during initialization\", \"\", \"408\", \"40101\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, failure during initialization of the calling base stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to create stack base due to failure in intialization\", \"\", \"500\", \"40102\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, failure to initialize calling user stack because calling base stack failed to create. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Base stack failed to create\", \"\", \"500\", \"40103\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, timeout during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"User stack init timeout\", \"\", \"408\", \"40104\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, failure during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"User stack init failed\", \"\", \"500\", \"40105\", \"UnexpectedClientError\", \"client\",\n \"Failed to set configurations for the calling stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Unable to parse configuration\", \"\", \"500\", \"40106\", \"UnexpectedClientError\", \"client\",\n \"Failed to set user configurations for calling stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to set configuration for stack\", \"\", \"500\", \"40107\", \"UnexpectedClientError\", \"client\",\n \"Failed to get device manager due to internal call stack undefined. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to get device manager due to internal call stack undefined\", \"\", \"500\", \"40108\", \"UnexpectedClientError\", \"client\",\n \"Failed to set configuration parameters for the calling stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to initialize callclient\", \"\", \"500\", \"40109\", \"UnexpectedClientError\", \"client\",\n \"Fetched undefined configurations for the calling stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Found undefined configs in ECS response: {0}\", \"\", \"500\", \"40110\", \"UnexpectedClientError\", \"client\",\n \"Failed to connect to Azure Communication Services infrastructure. Please try again and check the browser's network requests. If the requests keep failing, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to create trouter service\", \"\", \"500\", \"40111\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize connection to Azure Communication Services infrastructure. Please try again and check the browser's network requests. If the requests keep failing, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Signaling init failed\", \"\", \"500\", \"40112\", \"UnexpectedClientError\", \"client\",\n \"Already connected to Azure Communication Services infrastructure. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Signaling service already initialized\", \"\", \"500\", \"40113\", \"ExpectedError\", \"client\",\n \"Failed to connect to Azure Communication Services infrastructure, timeout during initialization. Please try again and check the browser's network requests. If the requests keep failing, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Signaling init timeout, request took longer than {0} ms\", \"\", \"408\", \"40114\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, unable to initialize connection to Azure Communication Services infrastructure. Please try again and check the browser's network requests. If the requests keep failing, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Signaling failed to initialize.\", \"\", \"412\", \"40115\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, media failure during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"40116\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, signaling failure during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"40117\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, internal stack failure during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"40118\", \"UnexpectedClientError\", \"client\",\n \"Using proxy or custom TURN for calls involving Teams is disabled\", \"\", \"\", \"\", \"403\", \"40200\", \"ExpectedError\", \"client\",\n \"Failed to parse AccessToken\", \"\", \"\", \"\", \"500\", \"40201\", \"UnexpectedClientError\", \"client\",\n \"Call to yourself is not supported.\", \"\", \"\", \"\", \"400\", \"40202\", \"ExpectedError\", \"client\",\n \"Call Agent is already disposed\", \"\", \"\", \"\", \"409\", \"40203\", \"ExpectedError\", \"client\",\n \"Teams Call Agent is already disposed\", \"\", \"\", \"\", \"409\", \"40204\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to CallAgent event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"40205\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from CallAgent event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"40206\", \"ExpectedError\", \"client\",\n \"Device type must be msft-acs-mesh-deviceType-v2 to join immersive call\", \"\", \"\", \"\", \"400\", \"40207\", \"ExpectedError\", \"client\",\n \"Failed to start or join call, call stack did not initialize\", \"\", \"\", \"\", \"500\", \"40208\", \"UnexpectedClientError\", \"client\",\n \"Invalid join locator specified.\", \"\", \"Invalid call configuration\", \"\", \"400\", \"40209\", \"ExpectedError\", \"client\",\n \"The provided Teams meeting link is invalid.\", \"\", \"Invalid meeting link\", \"\", \"400\", \"40210\", \"ExpectedError\", \"client\",\n \"The provided Teams For Life meeting link is invalid.\", \"\", \"Invalid TFL meeting link\", \"\", \"400\", \"40211\", \"ExpectedError\", \"client\",\n \"Starting a group call must include thread ID in StartTeamsGroupCallOptions.\", \"\", \"\", \"\", \"400\", \"40212\", \"ExpectedError\", \"client\",\n \"Starting a one to one with thread ID is invalid.\", \"\", \"\", \"\", \"400\", \"40213\", \"ExpectedError\", \"client\",\n \"Display name is not allowed to be set for Teams users.\", \"\", \"\", \"\", \"400\", \"40214\", \"ExpectedError\", \"client\",\n \"Display name is too long.\", \"\", \"\", \"\", \"400\", \"40215\", \"ExpectedError\", \"client\",\n \"Failed to create CallAgent. Please try again, if issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"40216\", \"UnexpectedClientError\", \"client\",\n \"Attempted to get AccessToken before initialization\", \"\", \"\", \"\", \"422\", \"40217\", \"UnexpectedClientError\", \"client\",\n \"Invalid push notification data provided. No 'incomingCallContext' key found in the PushNotificatitonData.\", \"\", \"Invalid push notification data provided\", \"\", \"400\", \"40218\", \"ExpectedError\", \"client\",\n \"Failed to handle push notification\", \"\", \"\", \"\", \"500\", \"40219\", \"UnexpectedClientError\", \"client\",\n \"Incoming Call push notification payload provided has too many keys. Only 'incomingCallContext' key is expected in the PushNotificatitonData.\", \"\", \"Invalid Incoming Call push notification payload provided\", \"\", \"400\", \"40220\", \"ExpectedError\", \"client\",\n \"Invalid push notification data provided. No 'incomingCallContext' key found in the PushNotificatitonData.\", \"\", \"No 'incomingCallContext' provided in event payload\", \"\", \"400\", \"40221\", \"ExpectedError\", \"client\",\n \"The decoded 'incomingCallContext' data is invalid.\", \"\", \"Invalid Incoming Call push notification payload data provided\", \"\", \"400\", \"40222\", \"ExpectedError\", \"client\",\n \"Incoming Call is already being processed\", \"\", \"\", \"\", \"400\", \"40223\", \"ExpectedError\", \"client\",\n \"Failed to handle Incoming Call push notification\", \"\", \"\", \"\", \"500\", \"40224\", \"UnexpectedClientError\", \"client\",\n \"Missed call\", \"\", \"\", \"\", \"400\", \"40225\", \"ExpectedError\", \"client\",\n \"AssertIsObject failed. : userIds must be object\", \"\", \"\", \"\", \"400\", \"40226\", \"ExpectedError\", \"client\",\n \"AssertNotNull failed. : userIds cannot be null\", \"\", \"\", \"\", \"400\", \"40227\", \"ExpectedError\", \"client\",\n \"Failed to create CallAgent, an instance of CallAgent associated with this identity already exists. Please dispose the existing CallAgent, or create a new one with a different identity.\", \"\", \"Failed to create call agent, call agent for this ACS Id already exists\", \"\", \"409\", \"40228\", \"ExpectedError\", \"client\",\n \"CallAgent must be created only with ACS token\", \"\", \"\", \"\", \"403\", \"40229\", \"ExpectedError\", \"client\",\n \"Failed to create TeamsCallAgent, an instance of TeamsCallAgent associated with this identity already exists. Please dispose the existing TeamsCallAgent before creating a new one.\", \"\", \"Failed to create call agent, call agent for this ACS Id already exists\", \"\", \"409\", \"40230\", \"ExpectedError\", \"client\",\n \"TeamsCallAgent must be created only with Teams token\", \"\", \"\", \"\", \"403\", \"40231\", \"ExpectedError\", \"client\",\n \"Failed to get token\", \"\", \"\", \"\", \"409\", \"40232\", \"UnexpectedClientError\", \"client\",\n \"Refreshed AccessToken User Id doesnt match initial User Id.\", \"\", \"\", \"\", \"400\", \"40233\", \"ExpectedError\", \"client\",\n \"Access token is expired and failed to fetch a valid one after retries.\", \"\", \"\", \"\", \"400\", \"40234\", \"ExpectedError\", \"client\",\n \"AccessToken expired\", \"\", \"\", \"\", \"401\", \"40235\", \"ExpectedError\", \"client\",\n \"Action not allowed.\", \"\", \"\", \"\", \"403\", \"40236\", \"ExpectedError\", \"client\",\n \"Failed to hangup call.\", \"\", \"\", \"\", \"500\", \"40237\", \"UnexpectedServerError\", \"client\",\n \"Joining a Teams for life meeting is not supported\", \"\", \"\", \"\", \"400\", \"40238\", \"ExpectedError\", \"client\",\n \"Failed to get raw device stream track\", \"\", \"\", \"\", \"500\", \"40600\", \"UnexpectedClientError\", \"client\",\n \"Failed to get raw device stream track, make sure there is available device\", \"\", \"\", \"\", \"412\", \"40601\", \"UnexpectedClientError\", \"client\",\n \"Failed to get device manager.\", \"\", \"\", \"\", \"500\", \"40602\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to DeviceManager event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"40603\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from DeviceManager event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"40604\", \"ExpectedError\", \"client\",\n \"Unable to access device manager\", \"\", \"\", \"\", \"500\", \"40605\", \"UnexpectedClientError\", \"client\",\n \"Failed to enumerate speakers, it is not supported to enumerate/select speakers on Android Chrome, iOS Safari, nor MacOS Safari.\", \"\", \"This device does not support speaker enumeration.\", \"\", \"405\", \"40606\", \"ExpectedError\", \"client\",\n \"Microphone selection timed out.\", \"\", \"\", \"\", \"408\", \"40607\", \"UnexpectedClientError\", \"client\",\n \"There was an issue with selecting the microphone\", \"\", \"\", \"\", \"500\", \"40608\", \"UnexpectedClientError\", \"client\",\n \"Speaker selection timed out.\", \"\", \"\", \"\", \"408\", \"40609\", \"UnexpectedClientError\", \"client\",\n \"There was an issue with selecting the speaker\", \"\", \"\", \"\", \"500\", \"40610\", \"UnexpectedClientError\", \"client\",\n \"This device does not support speaker selection.\", \"\", \"\", \"\", \"405\", \"40611\", \"ExpectedError\", \"client\",\n \"At least one permission must be requested\", \"\", \"\", \"\", \"400\", \"40612\", \"ExpectedError\", \"client\",\n \"Failed to obtain permission to use microphone and/or camera, it was denied or it failed. Please ensure to allow the permissions in the browser's setttings and in the OS setttings.\", \"\", \"Permissions not granted or failed: {0}\", \"\", \"400\", \"40613\", \"ExpectedError\", \"client\",\n \"Failed to ask for device permissions Please ensure to allow the permissions in the browser's setttings and in the OS setttings and try again. If issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to get audio video permissions\", \"\", \"500\", \"40614\", \"UnexpectedClientError\", \"client\",\n \"Invalid AudioDeviceInfo object passed in. Ensure it has an Id.\", \"\", \"The device argument is invalid\", \"\", \"400\", \"40615\", \"ExpectedError\", \"client\",\n \"The device is not selectable\", \"\", \"\", \"\", \"400\", \"40616\", \"ExpectedError\", \"client\",\n \"Attempted invalid operation during Emergency Call.\", \"\", \"{0} operation is not allowed during Emergency Call\", \"\", \"500\", \"41000\", \"ExpectedError\", \"client\",\n \"{0} failed\", \"\", \"\", \"\", \"500\", \"41001\", \"UnexpectedClientError\", \"client\",\n \"Unable to get remote audio stream, getMediaStream returned undefined\", \"\", \"\", \"\", \"500\", \"41002\", \"UnexpectedClientError\", \"client\",\n \"Unable to get remote audio stream, getMediaStream returned error\", \"\", \"\", \"\", \"500\", \"41003\", \"UnexpectedClientError\", \"client\",\n \"Getting raw audio media stream is currently disabled by Azure Communication Services.\", \"\", \"Getting raw audio media strema is currently dissabled\", \"\", \"409\", \"41004\", \"ExpectedError\", \"client\",\n \"Failed to accept the Incoming Call\", \"\", \"\", \"\", \"500\", \"41005\", \"UnexpectedClientError\", \"client\",\n \"Failed to accept the incoming call, it is not in the Ringing state. Subcscribe to CallAgent's 'incomingCall' event to accept the incoming call.\", \"\", \"Call cannot be accepted because it is not in Ringing state\", \"\", \"400\", \"41006\", \"ExpectedError\", \"client\",\n \"Failed to reject the incoming call, it is not in the Ringing state. Subcscribe to CallAgent's 'incomingCall' event to reject the incoming call.\", \"\", \"Call cannot be rejectd because it is not in Ringing state\", \"\", \"400\", \"41007\", \"ExpectedError\", \"client\",\n \"Failed to get raw stream from local audio stream\", \"\", \"\", \"\", \"500\", \"41008\", \"UnexpectedClientError\", \"client\",\n \"Failed to set raw input audio stream\", \"\", \"\", \"\", \"500\", \"41009\", \"UnexpectedClientError\", \"client\",\n \"Failed to unset raw input audio stream\", \"\", \"\", \"\", \"500\", \"41010\", \"UnexpectedClientError\", \"client\",\n \"Failed to process audio because the calling stack is undefined. Please collect browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to process audio because of internal call stack error\", \"\", \"500\", \"41011\", \"UnexpectedClientError\", \"client\",\n \"Removing local video stream due to video fail UFD being raised before call connected. Please ensure to allow video permissions in the browser's setttings and in the OS setttings, and ensure the camera device is not being used by another process.\", \"\", \"Removing local video stream due to video fail UFD being raised before call connected. UFD: {0}, value: {1}, call direction: {2}\", \"\", \"409\", \"41012\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop audio on microphone device not functioning or capture mute event {0} with value {1}\", \"\", \"\", \"\", \"400\", \"41013\", \"UnexpectedClientError\", \"client\",\n \"Failed to instantiate the Call\", \"\", \"\", \"\", \"500\", \"41014\", \"UnexpectedClientError\", \"client\",\n \"Failed to mute microphone. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to mute microphone\", \"\", \"500\", \"41015\", \"UnexpectedClientError\", \"client\",\n \"Failed to unmute microphone. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to unmute microphone\", \"\", \"400\", \"41016\", \"UnexpectedClientError\", \"client\",\n \"Failed to recover the microphone audio after bad microphone UFD recovered. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to unmute and start audio, microphone device not functioning\", \"\", \"410\", \"41017\", \"UnexpectedClientError\", \"client\",\n \"Mute other participants is currently disabled by ACS service.\", \"\", \"Mute other participants disabled.\", \"\", \"403\", \"41018\", \"ExpectedError\", \"client\",\n \"Failed to mute all remote participants\", \"\", \"\", \"\", \"500\", \"41019\", \"UnexpectedClientError\", \"client\",\n \"Failed to mute incoming audio\", \"\", \"\", \"\", \"500\", \"41020\", \"UnexpectedClientError\", \"client\",\n \"Failed to unmute incoming audio\", \"\", \"\", \"\", \"500\", \"41021\", \"UnexpectedClientError\", \"client\",\n \"Failed to send DTMF tone\", \"\", \"\", \"\", \"400\", \"41022\", \"UnexpectedClientError\", \"client\",\n \"Invalid value passed to DtfmTone\", \"\", \"\", \"\", \"422\", \"41023\", \"ExpectedError\", \"client\",\n \"Failed to start audio before starting video\", \"\", \"\", \"\", \"500\", \"41024\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video, LocalVideoStream instance is invalid or empty. Please pass in a LocalVideoStream instance.\", \"\", \"Failed to start video, localVideoStream cannot be null\", \"\", \"400\", \"41025\", \"ExpectedError\", \"client\",\n \"Failed to start video, localVideoStream is not an instance of LocalVideoStream\", \"\", \"\", \"\", \"400\", \"41026\", \"ExpectedError\", \"client\",\n \"Failed to start video, video is already started.\", \"\", \"Failed to start video, local video is already on\", \"\", \"400\", \"41027\", \"ExpectedError\", \"client\",\n \"Failed to set media stream\", \"\", \"\", \"\", \"500\", \"41028\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video\", \"\", \"\", \"\", \"500\", \"41029\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop video, video is already stopped.\", \"\", \"Failed to stop video, local video is already off\", \"\", \"400\", \"41030\", \"ExpectedError\", \"client\",\n \"Failed to start video because the calling stack is undefined. Please gether browser console logs, .HAR files, and contact Aure Communication Services support.\", \"\", \"Failed to process video because of internal call stack error\", \"\", \"500\", \"41031\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop video, invalid argument. LocalVideoStream used as an input is currently not being sent.\", \"\", \"Invalid LocalVideoStream, this LocalVideoStream is not being sent\", \"\", \"400\", \"41032\", \"ExpectedError\", \"client\",\n \"Failed to hold the call. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to hold call\", \"\", \"500\", \"41033\", \"UnexpectedClientError\", \"client\",\n \"Failed to resume the call.Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to resume call\", \"\", \"500\", \"41034\", \"UnexpectedClientError\", \"client\",\n \"Failed to start screen share, screen share is already started.\", \"\", \"Failed to start screen share, screen share is already on. Must stop and start again.\", \"\", \"400\", \"41035\", \"ExpectedError\", \"client\",\n \"Failed to start raw screen sharing, localVideoStream is not an instance of LocalVideoStream\", \"\", \"\", \"\", \"400\", \"41036\", \"ExpectedError\", \"client\",\n \"Unable to get media stream from local video stream for raw media screen sharing. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Unable to get media stram from local video stream for screen sharing\", \"\", \"500\", \"41037\", \"UnexpectedClientError\", \"client\",\n \"Failed to set raw media stream for screen sharing. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to set media stream for screen sharing\", \"\", \"422\", \"41038\", \"UnexpectedClientError\", \"client\",\n \"Failed to get raw screen sharing stream. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to get media stream for screen sharing\", \"\", \"422\", \"41039\", \"UnexpectedClientError\", \"client\",\n \"Failed to start screen sharing\", \"\", \"\", \"\", \"500\", \"41040\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop screen share, screen share is already stopped.\", \"\", \"Failed to stop screen share, screen share is already off\", \"\", \"400\", \"41041\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to Call event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"41042\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Call event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"41043\", \"ExpectedError\", \"client\",\n \"Only single LocalVideoStream is supported currently\", \"\", \"\", \"\", \"400\", \"41044\", \"ExpectedError\", \"client\",\n \"Stream is not an instance of LocalVideoStream\", \"\", \"\", \"\", \"400\", \"41045\", \"ExpectedError\", \"client\",\n \"Only single LocalAudioStream is supported currently\", \"\", \"\", \"\", \"400\", \"41046\", \"ExpectedError\", \"client\",\n \"Stream is not an instance of LocalAudioStream\", \"\", \"\", \"\", \"400\", \"41047\", \"ExpectedError\", \"client\",\n \"Failed to start video during call setup process. Please ensure to allow video permissions in the browser's setttings and in the OS setttings, and ensure the camera device is not being used by another process.\", \"\", \"Video failed to start during call-{0} process.\", \"\", \"410\", \"41048\", \"UnexpectedClientError\", \"client\",\n \"Failed to start audio during call setup process. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Audio failed to start during call-{0} process.\", \"\", \"400\", \"41049\", \"UnexpectedClientError\", \"client\",\n \"Failed to force isAvailable flag to False during large meeting\", \"\", \"\", \"\", \"500\", \"41050\", \"UnexpectedClientError\", \"client\",\n \"Failed to dispose view in large meeting\", \"\", \"\", \"\", \"500\", \"41051\", \"UnexpectedClientError\", \"client\",\n \"Not able to add unkown participant.\", \"\", \"\", \"\", \"400\", \"41052\", \"ExpectedError\", \"client\",\n \"Participant is already in the call.\", \"\", \"{0} is already in the call\", \"\", \"400\", \"41053\", \"ExpectedError\", \"client\",\n \"Failed to remove the specified participant. The participant is not in the call.\", \"\", \"{0} is not in the call.\", \"\", \"400\", \"41054\", \"ExpectedError\", \"client\",\n \"Add participant failed: thread ID is missing in options.\", \"\", \"\", \"\", \"400\", \"41055\", \"ExpectedError\", \"client\",\n \"Failed to start or join to the call, Teams Enterprise voice policy is not enabled for this Azure Communication Services resource. Follow the tutorial online to enable it.\", \"\", \"Teams Enterprise voice is not enabled. Teams user is not eligible to make PSTN call\", \"\", \"412\", \"41056\", \"ExpectedError\", \"client\",\n \"Failed to get server call Id\", \"\", \"\", \"\", \"500\", \"41057\", \"UnexpectedClientError\", \"client\",\n \"Failed to get the MediaStream to initialize the Volume indicator. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"failed to getMediaStreamTrack\", \"\", \"500\", \"41058\", \"UnexpectedClientError\", \"client\",\n \"Failed to setup volume calcualtor using AudioContext, please retry getVolumeindicator on a working audio stream with exponential backoff\", \"\", \"\", \"\", \"500\", \"41059\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to Volume Indicator event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"400\", \"41060\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Volume Indicator event, unknown event name.\", \"\", \"Not able to unsubscribe to event {0}, unknown event name\", \"\", \"400\", \"41061\", \"ExpectedError\", \"client\",\n \"Failed to setup volume calculator, please retry after exponential backoff\", \"\", \"\", \"\", \"500\", \"41062\", \"UnexpectedClientError\", \"client\",\n \"Failed to get serverCallId, serverCallId is empty\", \"\", \"\", \"\", \"404\", \"41063\", \"UnexpectedClientError\", \"client\",\n \"Setting call constraint is currently disabled by ACS service.\", \"\", \"Setting call constraints is disabled\", \"\", \"409\", \"41064\", \"ExpectedError\", \"client\",\n \"Error setting call constraints at call setup. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error setting call constraints at call {0}\", \"\", \"500\", \"41065\", \"UnexpectedClientError\", \"client\",\n \"Error setting call constraints during mid-call\", \"\", \"\", \"\", \"500\", \"41066\", \"UnexpectedClientError\", \"client\",\n \"Error settting video constraints during call settup or mid-call. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error setting video constraints during call stage: {0}\", \"\", \"500\", \"41067\", \"UnexpectedClientError\", \"client\",\n \"Error setting video constraints during call accept\", \"\", \"\", \"\", \"500\", \"41068\", \"UnexpectedClientError\", \"client\",\n \"Error setting video constraints during call start\", \"\", \"\", \"\", \"500\", \"41069\", \"UnexpectedClientError\", \"client\",\n \"Failed to set call constraints during mid call\", \"\", \"\", \"\", \"500\", \"41070\", \"UnexpectedClientError\", \"client\",\n \"Failed to start screen share, call is not in Connected state. Subscribe to the Call's 'statteChanged' event to know when the call is connected.\", \"\", \"Failed to start screen sharing. Call must be in connected state\", \"\", \"412\", \"41071\", \"ExpectedError\", \"client\",\n \"Failed to stop screen sharing. Call must be in connected state\", \"\", \"\", \"\", \"412\", \"41072\", \"ExpectedError\", \"client\",\n \"Failed to get or set custom MediaStream, this functionality is currently disabled by Azure Communication Services.\", \"\", \"Accessing raw media stream is currently not enabled\", \"\", \"412\", \"41073\", \"ExpectedError\", \"client\",\n \"The raw media stream function is currently not available\", \"\", \"\", \"\", \"500\", \"41074\", \"UnexpectedClientError\", \"client\",\n \"Failed to start raw screen sharing, localVideoStream doesn't contain a raw media stream\", \"\", \"\", \"\", \"400\", \"41075\", \"ExpectedError\", \"client\",\n \"Failed to start audio stream.\", \"\", \"\", \"\", \"500\", \"41076\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop video.\", \"\", \"\", \"\", \"500\", \"41077\", \"UnexpectedClientError\", \"client\",\n \"Incoming call is already unplaced\", \"\", \"\", \"\", \"400\", \"41078\", \"ExpectedError\", \"client\",\n \"Failed to reject call\", \"\", \"\", \"\", \"500\", \"41079\", \"UnexpectedServerError\", \"client\",\n \"Failed to start local audio device\", \"\", \"\", \"\", \"400\", \"41080\", \"UnexpectedClientError\", \"client\",\n \"Failed to Select Virtual Device.\", \"\", \"\", \"\", \"400\", \"41081\", \"UnexpectedClientError\", \"client\",\n \"Failed to Unselect Virtual Device.\", \"\", \"\", \"\", \"400\", \"41082\", \"UnexpectedClientError\", \"client\",\n \"Failed to start raw audio, localAudioStream doesn't contain a raw media stream. To start raw audio, the LocalAudioStream passed in, must be constructed with a MediaStream object.\", \"\", \"\", \"\", \"400\", \"41083\", \"ExpectedError\", \"client\",\n \"Failed to stop raw audio, localAudioStream doesn't contain a raw media stream. To stop raw audio, the current LocalAudioStream in the call must have a MediaStream as the source.\", \"\", \"\", \"\", \"400\", \"41084\", \"ExpectedError\", \"client\",\n \"Thread ID is invalid.\", \"\", \"\", \"\", \"400\", \"41085\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to Lobby event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"41800\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Lobby event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"41801\", \"ExpectedError\", \"client\",\n \"Current conversation type doesn't support lobby admit and reject\", \"\", \"\", \"\", \"400\", \"41802\", \"ExpectedError\", \"client\",\n \"Participant is already in the meeting.\", \"\", \"{0} is already in the meeting\", \"\", \"400\", \"41803\", \"ExpectedError\", \"client\",\n \"Participant is not in the lobby.\", \"\", \"{0} is not in the lobby\", \"\", \"400\", \"41804\", \"ExpectedError\", \"client\",\n \"only Organizer, Co-organizer or Presenter can admit/reject participants from lobby\", \"\", \"\", \"\", \"403\", \"41805\", \"ExpectedError\", \"client\",\n \"Failed to admit participants in the lobby\", \"\", \"\", \"\", \"500\", \"41806\", \"UnexpectedServerError\", \"client\",\n \"Participant list is empty\", \"\", \"\", \"\", \"400\", \"41807\", \"ExpectedError\", \"client\",\n \"Lobby is not enabled for this meeting\", \"\", \"\", \"\", \"400\", \"41808\", \"ExpectedError\", \"client\",\n \"Failed to reject participants from the lobby\", \"\", \"\", \"\", \"500\", \"41809\", \"UnexpectedServerError\", \"client\",\n \"Failed to fetch Teams user policies and settings cannot proceed, because teams user Id was not found in the AccessToken.\", \"\", \"Caller's MicrosoftTeamsUserIdentifier wasn't provided. Fetching Teams user policies and settings cannot proceed\", \"\", \"400\", \"41900\", \"ExpectedError\", \"client\",\n \"Error Fetching Teams user policy from ACS MiddleTier Service\", \"\", \"\", \"\", \"500\", \"41901\", \"UnexpectedServerError\", \"client\",\n \"Unable to derive emergency policy from ACS MiddleTier Service response\", \"\", \"\", \"\", \"500\", \"41902\", \"UnexpectedServerError\", \"client\",\n \"Unable to fetch Teams calling policy from ACS MiddleTier Service response. Please try again, if the issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Unable to fetch teamsCallingPolicy from ACS MiddleTier Service response\", \"\", \"500\", \"41903\", \"UnexpectedServerError\", \"client\",\n \"Unable to fetch Teams meeting policy from ACS MiddleTier Service response. Please try again, if the issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Unable to fetch teamsMeetingPolicy from ACS MiddleTier Service response\", \"\", \"500\", \"41904\", \"UnexpectedServerError\", \"client\",\n \"Unable to fetch feature types from ACS MiddleTier Service response. Please try again, if the issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Unable to fetch featureTypes from ACS MiddleTier Service response\", \"\", \"500\", \"41905\", \"UnexpectedServerError\", \"client\",\n \"Unable to create thread for the Teams User groupcall from ACS MiddleTier Service response\", \"\", \"\", \"\", \"500\", \"41906\", \"UnexpectedServerError\", \"client\",\n \"Unable to add particpant for the thread for Teams groupcall from ACS MiddleTier Service\", \"\", \"\", \"\", \"500\", \"41907\", \"UnexpectedServerError\", \"client\",\n \"Mute other participants is disabled by ACS service.\", \"\", \"Mute other participants disabled.\", \"\", \"403\", \"42000\", \"ExpectedError\", \"client\",\n \"Failed to mute specific participant\", \"\", \"\", \"\", \"500\", \"42001\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to RemoteParticipant event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"42002\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from RemoteParticipant event, unknown event name.\", \"\", \"Not able to unsubscribe to event {0}, unknown event name\", \"\", \"422\", \"42003\", \"ExpectedError\", \"client\",\n \"The scenario to soft mute a PSTN participant is not supported.\", \"\", \"\", \"\", \"405\", \"42004\", \"ExpectedError\", \"client\",\n \"Failed to start video, video device is being used by another process/application. Stop your camera from being used in the other process/application and try again.\", \"\", \"Video operation failure SourceUnavailableError\", \"\", \"412\", \"43000\", \"ExpectedError\", \"client\",\n \"Failed to start video, permission was not granted to use selected video device. Ensure video device permissions are allowed in the browser's settings and in the system's setttings.\", \"\", \"Video operation failure PermissionDeniedError\", \"\", \"403\", \"43001\", \"ExpectedError\", \"client\",\n \"Failed to start video, unknown error. Please try again. If the issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure UnknownFailureForVideoOperation\", \"\", \"500\", \"43002\", \"UnexpectedClientError\", \"client\",\n \"Failed to create local video stream, source was not of type VideoDeviceInfo or MediaStream\", \"\", \"\", \"\", \"400\", \"43003\", \"ExpectedError\", \"client\",\n \"Failed to switch video device, invalid input. Input must be of a VideoDeviceInfo type.\", \"\", \"Failed to switch source, source was not of type VideoDeviceInfo\", \"\", \"400\", \"43004\", \"ExpectedError\", \"client\",\n \"Failed to switch video device, unable to switch to the same video device, it's already selected.\", \"\", \"Unable to switch to the same source\", \"\", \"400\", \"43005\", \"ExpectedError\", \"client\",\n \"Unable to get device type\", \"\", \"\", \"\", \"500\", \"43006\", \"UnexpectedClientError\", \"client\",\n \"Failed to get raw video stream. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to get media stream\", \"\", \"500\", \"43007\", \"UnexpectedClientError\", \"client\",\n \"Failed to set media stream source is not MediaStream\", \"\", \"\", \"\", \"400\", \"43008\", \"ExpectedError\", \"client\",\n \"Failed to set raw video stream. Found undefined function. Gather browser console logs and contact Azure Communication Services support.\", \"\", \"Unable ot set media stream\", \"\", \"500\", \"43009\", \"UnexpectedClientError\", \"client\",\n \"Failed to set raw video stream. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to set media stream\", \"\", \"500\", \"43010\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to LocalVideoStream event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"43011\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from LocalVideoStream event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"43012\", \"ExpectedError\", \"client\",\n \"Failed to start video, no video devices found. Ensure video devices are plugged in and enabled in the system settings.\", \"\", \"Video operation failure DevicesNotFoundError\", \"\", \"412\", \"43013\", \"ExpectedError\", \"client\",\n \"Failed to start video, error requesting media stream. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure MediaStreamRequestError\", \"\", \"412\", \"43014\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video, media stream request timed out. PLease allow permission on the browser's prompt to access the camera and try again.\", \"\", \"Video operation failure MediaStreamRequestTimedout\", \"\", \"412\", \"43015\", \"ExpectedError\", \"client\",\n \"Failed to start video, permissions denied by system. Ensure video device permissions are allowed in the browser's settings and in the system's setttings.\", \"\", \"Video operation failure PermissionsDeniedBySystem\", \"\", \"412\", \"43016\", \"ExpectedError\", \"client\",\n \"Failed to start video, unsupported stream. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure UnsupportedStream\", \"\", \"412\", \"43017\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video, failed to set constraints. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure ConstraintNotSatisfiedError\", \"\", \"412\", \"43018\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video, no device selected. Please ensure to pass a LocalVideoStream constructed with a VideoDeviceInfo and try again. If issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure noDeviceSelected\", \"\", \"412\", \"43019\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to RemoteVideoStream event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"43100\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from RemoteVideoStream event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"43101\", \"ExpectedError\", \"client\",\n \"Not able to get media stream\", \"\", \"\", \"\", \"500\", \"43102\", \"UnexpectedClientError\", \"client\",\n \"The remote video stream is currently not available, subscribe to the stream's isAvailable property to get notified when it is ready to get the raw media stream.\", \"\", \"The stream is currently not availalbe, subscribe to stream.isAvailable property to get notified when it is ready to get media stream\", \"\", \"400\", \"43103\", \"ExpectedError\", \"client\",\n \"Failed to subscribe to media stream, timeout\", \"\", \"\", \"\", \"408\", \"43104\", \"UnexpectedClientError\", \"client\",\n \"Failed to get media stream\", \"\", \"\", \"\", \"500\", \"43105\", \"UnexpectedClientError\", \"client\",\n \"Failed to subscribe to media stream, muted\", \"\", \"\", \"\", \"408\", \"43106\", \"UnexpectedClientError\", \"client\",\n \"Failed to get raw media stream\", \"\", \"\", \"\", \"500\", \"43107\", \"UnexpectedClientError\", \"client\",\n \"Failed to render video stream, this stream is not available. Subscribe to the stream's isAvailable property to get notified when the remote participant has their video on and the stream is available for rendering.\", \"\", \"Failed to create view, remote stream is not available\", \"\", \"412\", \"43200\", \"ExpectedError\", \"client\",\n \"Failed to start stream, already disposed\", \"\", \"\", \"\", \"405\", \"43201\", \"ExpectedError\", \"client\",\n \"Failed to render video stream, this stream is not longer available. Remote participant turned their video off.\", \"\", \"Failed to start stream, stream became unavailable\", \"\", \"404\", \"43202\", \"ExpectedError\", \"client\",\n \"Failed to render video stream, rendering timed out while waiting for video frames. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Failed to render stream, timeout\", \"\", \"408\", \"43203\", \"UnexpectedClientError\", \"client\",\n \"Failed to render video stream, failed to subscribe to video on the Azure Communication Services infrastructure. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Failed to start stream, fail to subscribe\", \"\", \"500\", \"43204\", \"UnexpectedClientError\", \"client\",\n \"Failed to start stream, internal error\", \"\", \"\", \"\", \"500\", \"43205\", \"UnexpectedClientError\", \"client\",\n \"Failed to updateScalingMode, failed to update\", \"\", \"\", \"\", \"500\", \"43206\", \"UnexpectedClientError\", \"client\",\n \"Failed to start stream, disposing stream because participant is not a dominant speaker in the large meeting\", \"\", \"\", \"\", \"405\", \"43207\", \"ExpectedError\", \"client\",\n \"Failed to start stream, disposing stream because remote video stream is disposing\", \"\", \"\", \"\", \"405\", \"43208\", \"ExpectedError\", \"client\",\n \"Failed to render video stream, VideoStreamRenderer was disposed during initialization process.\", \"\", \"Failed to start stream, disposing stream\", \"\", \"405\", \"43209\", \"ExpectedError\", \"client\",\n \"Failed to dispose VideoStreamRenderer, it is already disposed.\", \"\", \"Failed to dispose stream, already disposed\", \"\", \"400\", \"43210\", \"ExpectedError\", \"client\",\n \"Failed to dispose remote renderer\", \"\", \"\", \"\", \"500\", \"43211\", \"UnexpectedClientError\", \"client\",\n \"Failed to create VideoStreamRendererView, videoStream must be either LocalVideoStream or RemoteVideoStream type\", \"\", \"\", \"\", \"400\", \"43212\", \"ExpectedError\", \"client\",\n \"Failed to dispose, VideoStreamRendererView is disposed\", \"\", \"\", \"\", \"400\", \"43213\", \"ExpectedError\", \"client\",\n \"Failed to render, stream disposed\", \"\", \"\", \"\", \"400\", \"43214\", \"ExpectedError\", \"client\",\n \"Failed to updateScalingMode, VideoStreamRendererView is disposed\", \"\", \"\", \"\", \"400\", \"43215\", \"ExpectedError\", \"client\",\n \"Failed to updateScalingMode, wrong scalingMode value\", \"\", \"\", \"\", \"400\", \"43216\", \"ExpectedError\", \"client\",\n \"Failed to dispose view\", \"\", \"\", \"\", \"500\", \"43217\", \"UnexpectedClientError\", \"client\",\n \"Failed to create VideoStreamRenderer, videoStream must be either LocalVideoStream or RemoteVideoStreamCommon type\", \"\", \"\", \"\", \"400\", \"43218\", \"ExpectedError\", \"client\",\n \"Failed to create view, VideoStreamRenderer is disposed\", \"\", \"\", \"\", \"400\", \"43219\", \"ExpectedError\", \"client\",\n \"Failed to create view, maximum number of active RemoteVideoStream views has been reached. You can dispose of a previous one in order to create new one.\", \"\", \"Failed to create view, maximum number of {0} active RemoteVideoStream has been reached\", \"\", \"400\", \"43220\", \"ExpectedError\", \"client\",\n \"Failed to create view\", \"\", \"\", \"\", \"500\", \"43221\", \"UnexpectedClientError\", \"client\",\n \"Failed to dispose, VideoStreamRendererView is already disposed\", \"\", \"\", \"\", \"400\", \"43222\", \"ExpectedError\", \"client\",\n \"Unknown stream type\", \"\", \"\", \"\", \"400\", \"43223\", \"ExpectedError\", \"client\",\n \"Failed to dispose local renderer\", \"\", \"\", \"\", \"500\", \"43224\", \"UnexpectedClientError\", \"client\",\n \"Failed to create local audio stream, source is not of type AudioDeviceInfo or MediaStream\", \"\", \"\", \"\", \"400\", \"43600\", \"ExpectedError\", \"client\",\n \"Failed to create local audio stream, source is not a microphone\", \"\", \"\", \"\", \"400\", \"43601\", \"ExpectedError\", \"client\",\n \"Failed to get media stream source is not AudioDeviceInfo or MediaStream\", \"\", \"\", \"\", \"500\", \"43602\", \"UnexpectedClientError\", \"client\",\n \"Failed to switch stream on local audio, source is not of type MediaStream\", \"\", \"\", \"\", \"400\", \"43603\", \"ExpectedError\", \"client\",\n \"Failed to create local audio stream, source is not a microphone\", \"\", \"\", \"\", \"400\", \"43604\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to LocalAudioStream event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"43605\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from LocalAudioStream event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"43606\", \"ExpectedError\", \"client\",\n \"Failed to switch audio device, unable to switch to the same audio device, it's already selected.\", \"\", \"\", \"\", \"400\", \"43607\", \"ExpectedError\", \"client\",\n \"Failed to start audio, unknown error. Please try again. If the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"43608\", \"UnexpectedClientError\", \"client\",\n \"Unable to parse PhoneNumberIdentifier object\", \"\", \"\", \"\", \"422\", \"44000\", \"ExpectedError\", \"client\",\n \"Unable to parse MicrosoftTeamsUserIdentifier object\", \"\", \"\", \"\", \"422\", \"44001\", \"ExpectedError\", \"client\",\n \"Unable to parse MicrosoftTeamsAppIdentifier object\", \"\", \"\", \"\", \"422\", \"44002\", \"ExpectedError\", \"client\",\n \"Unable to parse Identifier object, please check the syntax\", \"\", \"\", \"\", \"422\", \"44003\", \"ExpectedError\", \"client\",\n \"Invalid CommunicationUser identifier specified\", \"\", \"\", \"\", \"422\", \"44004\", \"ExpectedError\", \"client\",\n \"Invalid MicrosoftTeamsUser rawId specified\", \"\", \"\", \"\", \"422\", \"44005\", \"ExpectedError\", \"client\",\n \"Invalid MicrosoftTeamsUser microsoftTeamsUserId specified\", \"\", \"\", \"\", \"422\", \"44006\", \"ExpectedError\", \"client\",\n \"Invalid MicrosoftTeamsApp rawId specified\", \"\", \"\", \"\", \"422\", \"44007\", \"ExpectedError\", \"client\",\n \"Invalid MicrosoftTeamsApp teamsAppId specified\", \"\", \"\", \"\", \"422\", \"44008\", \"ExpectedError\", \"client\",\n \"Invalid identifier specified, please specify an id\", \"\", \"\", \"\", \"422\", \"44009\", \"ExpectedError\", \"client\",\n \"Unable to parse Identifier object\", \"\", \"\", \"\", \"422\", \"44010\", \"ExpectedError\", \"client\",\n \"AssertIsArrayOfIdentifiers failed. : userIds must be array of CommunicationIdentifier\", \"\", \"\", \"\", \"422\", \"44011\", \"ExpectedError\", \"client\",\n \"No cloud prefix found in identity\", \"\", \"\", \"\", \"409\", \"44012\", \"ExpectedError\", \"client\",\n \"Config is empty\", \"\", \"\", \"\", \"500\", \"44100\", \"UnexpectedServerError\", \"client\",\n \"Missing ACS config key\", \"\", \"\", \"\", \"500\", \"44101\", \"UnexpectedServerError\", \"client\",\n \"Error while merging config\", \"\", \"\", \"\", \"500\", \"44102\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize telemetry\", \"\", \"\", \"\", \"500\", \"44103\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize telemetry\", \"\", \"\", \"\", \"500\", \"44104\", \"UnexpectedClientError\", \"client\",\n \"Failed to create and initialize telemetry logger for tenant. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to create and initialize telemetry logger for {0}\", \"\", \"500\", \"44105\", \"UnexpectedClientError\", \"client\",\n \"Failed to flush telemetry\", \"\", \"\", \"\", \"500\", \"44106\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize telemetry logger\", \"\", \"\", \"\", \"500\", \"44107\", \"UnexpectedClientError\", \"client\",\n \"No CommunicationTokenCredential provided\", \"\", \"\", \"\", \"401\", \"44108\", \"ExpectedError\", \"client\",\n \"AccessToken is empty\", \"\", \"\", \"\", \"401\", \"44109\", \"ExpectedError\", \"client\",\n \"Failed to get AccessToken\", \"\", \"\", \"\", \"401\", \"44110\", \"UnexpectedClientError\", \"client\",\n \"Invalid token\", \"\", \"\", \"\", \"401\", \"44111\", \"ExpectedError\", \"client\",\n \"Failed to parse AccessToken\", \"\", \"\", \"\", \"401\", \"44112\", \"ExpectedError\", \"client\",\n \"AccessToken does not contain 'voip' or 'voip.join' scope\", \"\", \"\", \"\", \"401\", \"44113\", \"ExpectedError\", \"client\",\n \"Wrong AccessToken scope format. Scope is expected to be a string that contains 'voip'\", \"\", \"\", \"\", \"401\", \"44114\", \"ExpectedError\", \"client\",\n \"AccessToken does not contain ACS resource Id\", \"\", \"\", \"\", \"401\", \"44115\", \"ExpectedError\", \"client\",\n \"AccessToken does not contain ACS user Id\", \"\", \"\", \"\", \"401\", \"44116\", \"ExpectedError\", \"client\",\n \"Failed to parse AccessToken\", \"\", \"\", \"\", \"401\", \"44117\", \"UnexpectedClientError\", \"client\",\n \"Operation timed out\", \"\", \"\", \"\", \"408\", \"44118\", \"UnexpectedClientError\", \"client\",\n \"Error while trying to start or stop echo cancellation. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error while trying to {0} echo cancellation\", \"\", \"500\", \"45000\", \"UnexpectedClientError\", \"client\",\n \"Error while trying to start or stop noise suppression. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error while trying to {0} noise suppression\", \"\", \"500\", \"45001\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to AudioEffects event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"400\", \"45002\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from AudioEffects event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"400\", \"45003\", \"ExpectedError\", \"client\",\n \"Setting audio effects is currently disabled by Azure Communication Services.\", \"\", \"Setting audio effects is disabled.\", \"\", \"403\", \"45004\", \"ExpectedError\", \"client\",\n \"Audio effects feature is disposed. Create a new AudioEffects feature instance.\", \"\", \"\", \"\", \"400\", \"45005\", \"ExpectedError\", \"client\",\n \"Current source is not supported\", \"\", \"\", \"\", \"415\", \"45006\", \"ExpectedError\", \"client\",\n \"Failed to get device manager to start effects.\", \"\", \"\", \"\", \"500\", \"45007\", \"UnexpectedClientError\", \"client\",\n \"Audio effects feature is disposed. Create a new AudioEffects feature instance.\", \"\", \"\", \"\", \"400\", \"45008\", \"ExpectedError\", \"client\",\n \"Failed to get device manager to stop effects.\", \"\", \"\", \"\", \"500\", \"45009\", \"UnexpectedClientError\", \"client\",\n \"Internal error - DM missing\", \"\", \"\", \"\", \"500\", \"45010\", \"UnexpectedClientError\", \"client\",\n \"EffectProvider not available\", \"\", \"\", \"\", \"500\", \"45011\", \"UnexpectedClientError\", \"client\",\n \"Internal error - stack aec provider missing\", \"\", \"\", \"\", \"500\", \"45012\", \"UnexpectedClientError\", \"client\",\n \"Invalid effect provided\", \"\", \"\", \"\", \"400\", \"45013\", \"ExpectedError\", \"client\",\n \"Invalid or no echo cancellation effect provided\", \"\", \"\", \"\", \"400\", \"45014\", \"ExpectedError\", \"client\",\n \"Invalid or no noise suppression effect provided\", \"\", \"\", \"\", \"400\", \"45015\", \"ExpectedError\", \"client\",\n \"Unsupported effect specified. Please specify a supported audio effect.\", \"\", \"{0} is not supported.\", \"\", \"415\", \"45016\", \"UnexpectedClientError\", \"client\",\n \"Error while checking support\", \"\", \"\", \"\", \"501\", \"45017\", \"UnexpectedClientError\", \"client\",\n \"Invalid or no auto gain control effect provided\", \"\", \"\", \"\", \"400\", \"45018\", \"ExpectedError\", \"client\",\n \"Error while trying to start or stop auto gain control. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error while trying to {0} auto gain control\", \"\", \"500\", \"45019\", \"UnexpectedClientError\", \"client\",\n \"Error setting browser audio processing flags\", \"\", \"\", \"\", \"500\", \"45020\", \"UnexpectedClientError\", \"client\",\n \"Error starting audio effects.\", \"\", \"\", \"\", \"500\", \"45021\", \"UnexpectedClientError\", \"client\",\n \"Error stopping audio effects.\", \"\", \"\", \"\", \"500\", \"45022\", \"UnexpectedClientError\", \"client\",\n \"Error disposing audio effects feature.\", \"\", \"\", \"\", \"500\", \"45023\", \"UnexpectedClientError\", \"client\",\n \"Invalid call survey. Please submit a survey options.\", \"\", \"{0}.\", \"\", \"400\", \"45100\", \"ExpectedError\", \"client\",\n \"Failed to submit survery, timedout. Please try again, if issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"\", \"\", \"408\", \"45101\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize Captions.\", \"\", \"\", \"\", \"500\", \"45200\", \"UnexpectedClientError\", \"client\",\n \"Captions feature is currently disabled by Azure Communication services.\", \"\", \"Feature is not enabled.\", \"\", \"412\", \"45201\", \"ExpectedError\", \"client\",\n \"Spoken language requested is not supported.\", \"\", \"\", \"\", \"400\", \"45202\", \"ExpectedError\", \"client\",\n \"Captions feature is disabled in meeting policy.\", \"\", \"\", \"\", \"403\", \"45203\", \"ExpectedError\", \"client\",\n \"Captions feature is disabled in calling policy.\", \"\", \"\", \"\", \"403\", \"45204\", \"ExpectedError\", \"client\",\n \"Could not start captions.\", \"\", \"\", \"\", \"500\", \"45205\", \"UnexpectedClientError\", \"client\",\n \"Cannot update spoken language as captions has not started.\", \"\", \"\", \"\", \"400\", \"45206\", \"ExpectedError\", \"client\",\n \"Set spoken language is currently disabled by Azure Communication Services.\", \"\", \"Set spoken language is not enabled.\", \"\", \"412\", \"45207\", \"ExpectedError\", \"client\",\n \"Unable to update spoken language. Failed to get token.\", \"\", \"\", \"\", \"401\", \"45208\", \"UnexpectedClientError\", \"client\",\n \"Unable to update spoken language.\", \"\", \"\", \"\", \"500\", \"45209\", \"UnexpectedClientError\", \"client\",\n \"Cannot update caption language as captions has not started.\", \"\", \"\", \"\", \"400\", \"45210\", \"ExpectedError\", \"client\",\n \"Set caption language is currently disabled by Azure Communication Services.\", \"\", \"Set caption language is not enabled.\", \"\", \"412\", \"45211\", \"ExpectedError\", \"client\",\n \"Set caption language failed. Teams premium license is needed to use this feature.\", \"\", \"\", \"\", \"401\", \"45212\", \"ExpectedError\", \"client\",\n \"Caption language requested is not supported.\", \"\", \"\", \"\", \"400\", \"45213\", \"ExpectedError\", \"client\",\n \"Null token\", \"\", \"\", \"\", \"401\", \"45214\", \"ExpectedError\", \"client\",\n \"Unable to update caption language.\", \"\", \"\", \"\", \"500\", \"45215\", \"UnexpectedClientError\", \"client\",\n \"Failed to fetch policy for Teams Captions.\", \"\", \"\", \"\", \"500\", \"45216\", \"UnexpectedClientError\", \"client\",\n \"Captions already active\", \"\", \"\", \"\", \"400\", \"45217\", \"ExpectedError\", \"client\",\n \"Captions feature is not active.\", \"\", \"\", \"\", \"400\", \"45218\", \"ExpectedError\", \"client\",\n \"Operation in progress\", \"\", \"\", \"\", \"400\", \"45219\", \"ExpectedError\", \"client\",\n \"Spoken language already set\", \"\", \"\", \"\", \"400\", \"45220\", \"ExpectedError\", \"client\",\n \"Unable to update caption language as Captions is not active.\", \"\", \"\", \"\", \"400\", \"45221\", \"ExpectedError\", \"client\",\n \"Caption language already set.\", \"\", \"\", \"\", \"400\", \"45222\", \"ExpectedError\", \"client\",\n \"Captions status already set.\", \"\", \"\", \"\", \"400\", \"45223\", \"ExpectedError\", \"client\",\n \"Captions is not supported.\", \"\", \"\", \"\", \"400\", \"45224\", \"ExpectedError\", \"client\",\n \"Failed to update endpoint metadata\", \"\", \"\", \"\", \"500\", \"45225\", \"UnexpectedClientError\", \"client\",\n \"Cannot start captions as call state is not connected.\", \"\", \"\", \"\", \"400\", \"45226\", \"ExpectedError\", \"client\",\n \"DataChannel has been disposed\", \"\", \"\", \"\", \"500\", \"45300\", \"UnexpectedClientError\", \"client\",\n \"Sender is not ready\", \"\", \"\", \"\", \"500\", \"45301\", \"UnexpectedClientError\", \"client\",\n \"No available channel id\", \"\", \"\", \"\", \"500\", \"45302\", \"UnexpectedClientError\", \"client\",\n \"Invalid channel id\", \"\", \"\", \"\", \"400\", \"45303\", \"ExpectedError\", \"client\",\n \"Invalid bitrateInKbps\", \"\", \"\", \"\", \"400\", \"45304\", \"ExpectedError\", \"client\",\n \"Invalid participants\", \"\", \"\", \"\", \"400\", \"45305\", \"ExpectedError\", \"client\",\n \"Too many participants\", \"\", \"\", \"\", \"400\", \"45306\", \"ExpectedError\", \"client\",\n \"No valid participant\", \"\", \"\", \"\", \"400\", \"45307\", \"ExpectedError\", \"client\",\n \"Message data is empty\", \"\", \"\", \"\", \"400\", \"45308\", \"ExpectedError\", \"client\",\n \"The size of message data is too large\", \"\", \"\", \"\", \"400\", \"45309\", \"ExpectedError\", \"client\",\n \"Invalid message length\", \"\", \"\", \"\", \"500\", \"45310\", \"UnexpectedClientError\", \"client\",\n \"The buffer is full. Please wait and try again\", \"\", \"\", \"\", \"500\", \"45311\", \"UnexpectedClientError\", \"client\",\n \"The sender has been closed\", \"\", \"\", \"\", \"400\", \"45312\", \"ExpectedError\", \"client\",\n \"Currently there is no available reliable channel\", \"\", \"\", \"\", \"500\", \"45313\", \"UnexpectedClientError\", \"client\",\n \"Currently there is no available unreliable channel\", \"\", \"\", \"\", \"500\", \"45314\", \"UnexpectedClientError\", \"client\",\n \"Unable allocate the channel because a channel with the same channelId has already been allocated\", \"\", \"\", \"\", \"500\", \"45315\", \"UnexpectedClientError\", \"client\",\n \"Invalid bitrate\", \"\", \"\", \"\", \"400\", \"45316\", \"ExpectedError\", \"client\",\n \"Traffic is limited\", \"\", \"\", \"\", \"400\", \"45317\", \"ExpectedError\", \"client\",\n \"Failed to send message.\", \"\", \"\", \"\", \"500\", \"45318\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to DataChannel event, unknown event name.\", \"\", \"Not able to {0} subscribe to event {1}, unknown event name\", \"\", \"422\", \"45319\", \"ExpectedError\", \"client\",\n \"Wrong argument type specified.\", \"\", \"TypeError: Expect '{0}' to be of type '{1}'\", \"\", \"400\", \"45320\", \"ExpectedError\", \"client\",\n \"Wrong value specified.\", \"\", \"ValueError: Expect '{0}' to be '{1}'\", \"\", \"400\", \"45321\", \"ExpectedError\", \"client\",\n \"Cannot find the channelId specified.\", \"\", \"Cannot find the channelId {0}\", \"\", \"400\", \"45322\", \"ExpectedError\", \"client\",\n \"Failed to create the sender.\", \"\", \"\", \"\", \"500\", \"45323\", \"UnexpectedClientError\", \"client\",\n \"Mapped to an incorrect value type. Please gather browser console logs and contact Azure Communication Services support.\", \"\", \"Mapped to an incorrect value type={0}, diagnostic value={1}, for diagnostic {2}\", \"\", \"500\", \"45400\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to UserFacingDiagnostics event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45401\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from UserFacingDiagnostics event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45402\", \"ExpectedError\", \"client\",\n \"Failed to map diagnostic quality level. Please gather browser console logs and contact Azure Communication Services support.\", \"\", \"Cannot map ts quality level {0} for {1}\", \"\", \"500\", \"45403\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to LiveStream event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45500\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribefrom LiveStream event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45501\", \"ExpectedError\", \"client\",\n \"Invalid aggregationInterval value range.\", \"\", \"\", \"\", \"400\", \"45502\", \"ExpectedError\", \"client\",\n \"invalid dataPointsPerAggregation value range.\", \"\", \"\", \"\", \"400\", \"45503\", \"ExpectedError\", \"client\",\n \"MediaStatsCallFeature has been disposed.\", \"\", \"\", \"\", \"400\", \"45504\", \"ExpectedError\", \"client\",\n \"Invalid aggregationInterval value range.\", \"\", \"\", \"\", \"400\", \"45550\", \"ExpectedError\", \"client\",\n \"invalid dataPointsPerAggregation value range.\", \"\", \"\", \"\", \"400\", \"45551\", \"ExpectedError\", \"client\",\n \"MediaStatsCallFeature has been disposed.\", \"\", \"\", \"\", \"400\", \"45552\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to OptimalVideoCount event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45600\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from OptimalVideoCount event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45601\", \"ExpectedError\", \"client\",\n \"Failed to set default microphone or speaker with error\", \"\", \"\", \"\", \"412\", \"45700\", \"UnexpectedClientError\", \"client\",\n \"Unable to return call diagnostic information.\", \"\", \"\", \"\", \"500\", \"45701\", \"UnexpectedClientError\", \"client\",\n \"Timeout in checking media stream status\", \"\", \"\", \"\", \"500\", \"45702\", \"UnexpectedClientError\", \"client\",\n \"Failed to get existing call agent or create a new one\", \"\", \"\", \"\", \"500\", \"45703\", \"UnexpectedClientError\", \"client\",\n \"Test call failed to connect\", \"\", \"\", \"\", \"500\", \"45704\", \"UnexpectedClientError\", \"client\",\n \"Call failed to render video.\", \"\", \"\", \"\", \"500\", \"45705\", \"UnexpectedClientError\", \"client\",\n \"Test call failed hang up the call\", \"\", \"\", \"\", \"500\", \"45706\", \"UnexpectedClientError\", \"client\",\n \"Failed to get video call media stats\", \"\", \"\", \"\", \"500\", \"45707\", \"UnexpectedClientError\", \"client\",\n \"Call timed out to connect. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Call timeout after {0}\", \"\", \"408\", \"45708\", \"UnexpectedClientError\", \"client\",\n \"Could not initialize raise hand feature.\", \"\", \"\", \"\", \"500\", \"45750\", \"UnexpectedClientError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45751\", \"UnexpectedServerError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45752\", \"UnexpectedServerError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45753\", \"UnexpectedServerError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45754\", \"UnexpectedServerError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45755\", \"UnexpectedServerError\", \"client\",\n \"Lower hands request failed because participant list is empty.\", \"\", \"\", \"\", \"400\", \"45756\", \"ExpectedError\", \"client\",\n \"Raise hands request failed because participant list is empty.\", \"\", \"\", \"\", \"400\", \"45757\", \"ExpectedError\", \"client\",\n \"Call is not connected yet to send reaction\", \"\", \"\", \"\", \"400\", \"45800\", \"ExpectedError\", \"client\",\n \"Reaction send is not supported for 1:1 direct calling with teams identity\", \"\", \"\", \"\", \"400\", \"45801\", \"ExpectedError\", \"client\",\n \"Unable to register listener due to meeting policy\", \"\", \"\", \"\", \"403\", \"45802\", \"ExpectedError\", \"client\",\n \"Unable to deregister listener due to meeting policy\", \"\", \"\", \"\", \"403\", \"45803\", \"ExpectedError\", \"client\",\n \"Unable to send reaction due to meeting policy\", \"\", \"\", \"\", \"403\", \"45804\", \"ExpectedError\", \"client\",\n \"Could not create state service proxy web-socket connection\", \"\", \"\", \"\", \"500\", \"45805\", \"UnexpectedServerError\", \"client\",\n \"Could not create sync map to exchange reaction\", \"\", \"\", \"\", \"500\", \"45806\", \"UnexpectedServerError\", \"client\",\n \"Unable to handle send reaction\", \"\", \"\", \"\", \"400\", \"45807\", \"ExpectedError\", \"client\",\n \"Unable to handle send reaction\", \"\", \"\", \"\", \"500\", \"45808\", \"UnexpectedClientError\", \"client\",\n \"Unable to parse reaction\", \"\", \"\", \"\", \"500\", \"45809\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to Reation event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45810\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Reaction event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45811\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to Recording event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45850\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Recording event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45851\", \"ExpectedError\", \"client\",\n \"Recording status already set.\", \"\", \"\", \"\", \"400\", \"45852\", \"ExpectedError\", \"client\",\n \"Bad request. All participants are already spotlighted\", \"\", \"\", \"\", \"400\", \"45900\", \"ExpectedError\", \"client\",\n \"Internal Error. Start spotlight for participants failed\", \"\", \"\", \"\", \"500\", \"45901\", \"UnexpectedServerError\", \"client\",\n \"Failed to start spotlight. Reached the maximum number of participants that can be Spotlighted.\", \"\", \"startSpotlight failed. {0} is the max number of participants that can be Spotlighted\", \"\", \"400\", \"45902\", \"ExpectedError\", \"client\",\n \"Failed to spotlight. User does not have a Presenter or Organizer role.\", \"\", \"{0} spotlight failed. User does not have a Presenter or Organizer role in {1}\", \"\", \"403\", \"45903\", \"ExpectedError\", \"client\",\n \"Spotlight feature is not enabled\", \"\", \"\", \"\", \"400\", \"45904\", \"ExpectedError\", \"client\",\n \"StartSpotlight failed. Participant list is empty\", \"\", \"\", \"\", \"400\", \"45905\", \"ExpectedError\", \"client\",\n \"Teams meeting audio conferencing feature is only available in meetings\", \"\", \"\", \"\", \"400\", \"45950\", \"ExpectedError\", \"client\",\n \"The Teams meeting audio conferencing details feature is disabled by ACS service.\", \"\", \"Teams meeting audio conferencing details feature is disabled\", \"\", \"405\", \"45951\", \"ExpectedError\", \"client\",\n \"Teams meeting audio conferencing details are not available before joining the Teams meeting\", \"\", \"\", \"\", \"400\", \"45952\", \"ExpectedError\", \"client\",\n \"Teams meeting audio conferencing details are not available in Lobby\", \"\", \"\", \"\", \"400\", \"45953\", \"ExpectedError\", \"client\",\n \"Teams meeting audio conferencing details is not configured\", \"\", \"\", \"\", \"400\", \"45954\", \"UnexpectedClientError\", \"client\",\n \"Error retrieving Teams meeting audio conferencing details\", \"\", \"\", \"\", \"500\", \"45955\", \"UnexpectedServerError\", \"client\",\n \"Transcription status already set.\", \"\", \"\", \"\", \"400\", \"46000\", \"ExpectedError\", \"client\",\n \"Transfer to target failed\", \"\", \"\", \"\", \"500\", \"46050\", \"UnexpectedClientError\", \"client\",\n \"Transfer is not supported in this call.\", \"\", \"\", \"\", \"400\", \"46051\", \"ExpectedError\", \"client\",\n \"Transfer target is not recognized.\", \"\", \"\", \"\", \"400\", \"46052\", \"ExpectedError\", \"client\",\n \"Invalid target participant type detected.\", \"\", \"Invalid target participant type detected: {0}.\", \"\", \"400\", \"46053\", \"ExpectedError\", \"client\",\n \"UnmixedAudio is not available.\", \"\", \"\", \"\", \"500\", \"46100\", \"UnexpectedClientError\", \"client\",\n \"The operation cannot be done because there is a pending operation\", \"\", \"\", \"\", \"400\", \"46101\", \"ExpectedError\", \"client\",\n \"The operation is not supported in peer-to-peer call\", \"\", \"\", \"\", \"400\", \"46102\", \"ExpectedError\", \"client\",\n \"Unmixed audio has been enabled\", \"\", \"\", \"\", \"400\", \"46103\", \"ExpectedError\", \"client\",\n \"Unmixed audio has been disabled\", \"\", \"\", \"\", \"400\", \"46104\", \"ExpectedError\", \"client\",\n \"Unmixed audio has been disposed\", \"\", \"\", \"\", \"400\", \"46105\", \"ExpectedError\", \"client\",\n \"Not able to subscribe or unsubscibe to UnmixedAudio event, unknown event name.\", \"\", \"Unable to {0} to event {1}, unknown event name\", \"\", \"422\", \"46106\", \"ExpectedError\", \"client\",\n \"Wrong argument type specified.\", \"\", \"TypeError: Expect '{0}' to be of type '{1}'\", \"\", \"400\", \"46107\", \"ExpectedError\", \"client\",\n \"Wrong value specified.\", \"\", \"ValueError: Expect '{0}' to be '{1}'\", \"\", \"400\", \"46108\", \"ExpectedError\", \"client\",\n \"Invalid state.\", \"\", \"Invalid state: {0}\", \"\", \"400\", \"46109\", \"ExpectedError\", \"client\",\n \"Unknown error\", \"\", \"\", \"\", \"500\", \"46110\", \"UnexpectedClientError\", \"client\",\n \"Failed to enable unmixed audio: AudioContext={0}, UnmixedAudio={1}\", \"\", \"\", \"\", \"500\", \"46111\", \"UnexpectedClientError\", \"client\",\n \"Failed to disable unmixed audio: AudioContext={0}, UnmixedAudio={1}\", \"\", \"\", \"\", \"500\", \"46112\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize unmixed audio.\", \"\", \"\", \"\", \"500\", \"46113\", \"UnexpectedClientError\", \"client\",\n \"Video effects feature is currently disabled by Azure Communication Services.\", \"\", \"Disabled.\", \"\", \"403\", \"46150\", \"ExpectedError\", \"client\",\n \"VideoEffects feature is disposed. Create a new VideoEffects Feature instance.\", \"\", \"\", \"\", \"400\", \"46151\", \"ExpectedError\", \"client\",\n \"Current source is unsupported to use effects\", \"\", \"\", \"\", \"415\", \"46152\", \"ExpectedError\", \"client\",\n \"Failed to get device manager to start effects.\", \"\", \"\", \"\", \"500\", \"46153\", \"UnexpectedClientError\", \"client\",\n \"EffectProvider not available\", \"\", \"\", \"\", \"500\", \"46154\", \"UnexpectedClientError\", \"client\",\n \"Failed to get WebCV provider.\", \"\", \"\", \"\", \"500\", \"46155\", \"UnexpectedClientError\", \"client\",\n \"Effect is not supported.\", \"\", \"\", \"\", \"501\", \"46156\", \"UnexpectedClientError\", \"client\",\n \"VideoEffects feature is disposed. Create a new VideoEffects Feature instance.\", \"\", \"\", \"\", \"400\", \"46157\", \"UnexpectedClientError\", \"client\",\n \"Failed to get device manager to stop effects.\", \"\", \"\", \"\", \"500\", \"46158\", \"UnexpectedClientError\", \"client\",\n \"Invalid effect provided\", \"\", \"\", \"\", \"400\", \"46159\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to event , unknown event name\", \"\", \"\", \"\", \"400\", \"46160\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe event , unknown event name\", \"\", \"\", \"\", \"400\", \"46161\", \"ExpectedError\", \"client\",\n \"Timed promise; rejected.\", \"\", \"\", \"\", \"408\", \"46162\", \"UnexpectedClientError\", \"client\",\n \"Error while checking support\", \"\", \"\", \"\", \"501\", \"46163\", \"UnexpectedClientError\", \"client\",\n \"Error starting video effects\", \"\", \"\", \"\", \"500\", \"46164\", \"UnexpectedClientError\", \"client\",\n \"Error stopping video effects\", \"\", \"\", \"\", \"500\", \"46165\", \"UnexpectedClientError\", \"client\",\n \"Error disposing video effects feature\", \"\", \"\", \"\", \"500\", \"46166\", \"UnexpectedClientError\", \"client\",\n \"Effect is not available. Try again when the effect is initialized and available\", \"\", \"\", \"\", \"500\", \"46167\", \"UnexpectedClientError\", \"client\",\n \"Effect can not be enabled because of Teams Policy\", \"\", \"\", \"\", \"403\", \"46168\", \"ExpectedError\", \"client\",\n \"Local Recording feature is only available in meetings\", \"\", \"\", \"\", \"400\", \"46200\", \"ExpectedError\", \"client\",\n \"Local Recording feature is currently disabled by Azure Communication Service.\", \"\", \"Local Recording feature is disabled\", \"\", \"405\", \"46201\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to LocalRecording event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"46202\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from LocalRecording event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"46203\", \"ExpectedError\", \"client\",\n \"Failed to start video, permission was not granted to use selected video device. Ensure video device permissions are allowed in the browser's settings and in the system's setttings.\", \"\", \"Video operation failure permissionDeniedError\", \"\", \"403\", \"43001\", \"ExpectedError\", \"client\",\n \"Call ended successfully by local participant.\", \"\", \"\", \"\", \"0\", \"0\", \"Success\", \"service\",\n \"Call ended for all users by the meeting organizer.\", \"\", \"\", \"\", \"0\", \"4097\", \"Success\", \"service\",\n \"Call ended because user disconnected from the call abruptly, this may be a result of a user closing the application that hosted the call, eg a user terminated application, closed browser of browser tab without proper hang-up.\", \"\", \"\", \"\", \"0\", \"4521\", \"ExpectedError\", \"service\",\n \"Call ended for this participant as it was removed from the conversation by another participant.\", \"\", \"\", \"\", \"0\", \"5000\", \"Success\", \"service\",\n \"Call ended successfully, as all callee endpoints declined the call.\", \"\", \"\", \"\", \"0\", \"5003\", \"Success\", \"service\",\n \"This conversation has ended as only one participant was remaining in the conversation.\", \"\", \"\", \"\", \"0\", \"5010\", \"Success\", \"service\",\n \"This conversation has ended as no one else has joined the group call.\", \"\", \"\", \"\", \"0\", \"5013\", \"Success\", \"service\",\n \"\", \"\", \"\", \"\", \"0\", \"5014\", \"Success\", \"service\",\n \"Call ended for this participant as it was removed from the conversation by another participant.\", \"\", \"\", \"\", \"0\", \"5300\", \"Success\", \"service\",\n \"Removed from the Teams meeting lobby by another participant.\", \"\", \"\", \"\", \"0\", \"5854\", \"Success\", \"service\",\n \"Removed from Teams meeting lobby due to inactivity timeout.\", \"\", \"\", \"\", \"0\", \"5855\", \"Success\", \"service\",\n \"Call ended by Azure Communication Services platform.\", \"\", \"\", \"\", \"0\", \"7000\", \"Success\", \"service\",\n \"Call ended by service because transfer completed successfully.\", \"\", \"\", \"\", \"0\", \"7015\", \"Success\", \"service\",\n \"Call is ended.\", \"\", \"\", \"\", \"0\", \"540000\", \"\", \"service\",\n \"Call ended successfully by remote PSTN participant.\", \"\", \"\", \"\", \"0\", \"560000\", \"Success\", \"service\",\n \"Error from CreateUsageRequest: User is not entitled to call this destination.\", \"\", \"\", \"\", \"400\", \"580040\", \"ExpectedError\", \"service\",\n \"Unauthenticated identity.\", \"\", \"\", \"\", \"401\", \"10009\", \"UnexpectedClientError\", \"service\",\n \"Call ended, as it has been marked as a spam and got blocked.\", \"\", \"\", \"\", \"403\", \"510403\", \"ExpectedError\", \"service\",\n \"Call was forbidden, cancelled or rejected\", \"\", \"\", \"\", \"403\", \"560403\", \"UnexpectedClientError\", \"service\",\n \"Call failed, unable to start or join to a call with given Id, call does not exist. Please check if provided id is correct, and if the call did not end already and try again.\", \"\", \"\", \"\", \"404\", \"404\", \"UnexpectedClientError\", \"service\",\n \"Call failed, unable to start or join to a call with given Id, call does not exist. Please check if provided id is correct, and if the call did not end already and try again.\", \"\", \"\", \"\", \"404\", \"4500\", \"ExpectedError\", \"service\",\n \"Phone number not found.\", \"\", \"\", \"\", \"404\", \"560404\", \"ExpectedError\", \"service\",\n \"Call failed, callee failed to finalize call setup, most likely callee lost network or terminated the application abruptly. Ensure clients are connected and available.\", \"\", \"\", \"\", \"408\", \"10057\", \"ExpectedError\", \"service\",\n \"\", \"\", \"\", \"\", \"408\", \"10325\", \"UnexpectedClientError\", \"service\",\n \"Gateway (SBC) failover timer expired.\", \"\", \"\", \"\", \"408\", \"500001\", \"ExpectedError\", \"service\",\n \"The called party did not respond.\", \"\", \"\", \"\", \"408\", \"560408\", \"\", \"service\",\n \"Media dropped during connect.\", \"\", \"\", \"\", \"410\", \"3100\", \"ExpectedError\", \"service\",\n \"\", \"\", \"\", \"\", \"410\", \"3101\", \"\", \"service\",\n \"\", \"\", \"\", \"\", \"410\", \"3112\", \"\", \"service\",\n \"Participant was removed from the call by the Azure Communication Services infrastructure due to loss of media connectivity with Azure Communication Services infrastructure, this usually happens if participant leaves the call abruptly or looses network connectivity. If participant wants to continue the call, it should reconnect.\", \"\", \"\", \"\", \"410\", \"301005\", \"UnexpectedClientError\", \"service\",\n \"\", \"\", \"\", \"\", \"429\", \"5029\", \"ExpectedError\", \"service\",\n \"This call has exceeded the maximum call lifetime.\", \"\", \"\", \"\", \"429\", \"10110\", \"ExpectedError\", \"service\",\n \"Unable to deliver message to client application. Please ensure the client application is successfully sending netwwork requests to Azure Communication Services.\", \"\", \"\", \"\", \"430\", \"10315\", \"\", \"service\",\n \"Unable to deliver message to client application. Please ensure the client application is successfully sending netwwork requests to Azure Communication Services.\", \"\", \"\", \"\", \"430\", \"10317\", \"\", \"service\",\n \"\", \"\", \"\", \"\", \"480\", \"10037\", \"ExpectedError\", \"service\",\n \"Remote client endpoint not registered. Please ensure the client application is successfully sending netwwork requests to Azure Communication Services.\", \"\", \"\", \"\", \"480\", \"10076\", \"ExpectedError\", \"service\",\n \"No answer.\", \"\", \"\", \"\", \"480\", \"560480\", \"UnexpectedServerError\", \"service\",\n \"Incomplete/Invalid callee address.\", \"\", \"\", \"\", \"484\", \"560484\", \"\", \"service\",\n \"Call ended because remote PSTN participant was busy. The number called was already in a call or having technical issues.\", \"\", \"\", \"\", \"486\", \"560486\", \"Success\", \"service\",\n \"Call ended successfully as caller cancelled the call.\", \"\", \"\", \"\", \"487\", \"0\", \"Success\", \"service\",\n \"Call canceled, locally declined, ended due to an endpoint mismatch issue, or failed to generate media offer.\", \"\", \"\", \"\", \"487\", \"4501\", \"\", \"service\",\n \"Call was accepted elsewhere, by another endpoint of this user.\", \"\", \"\", \"\", \"487\", \"10003\", \"Success\", \"service\",\n \"Call was canceled on timeout, no callee endpoint accepted on time. Ensure that user saw the notification and try to initiate that call again.\", \"\", \"\", \"\", \"487\", \"10004\", \"ExpectedError\", \"service\",\n \"Call ended successfully as it was declined by all callee endpoints.\", \"\", \"\", \"\", \"487\", \"10024\", \"Success\", \"service\",\n \"Call canceled, locally declined, ended due to an endpoint mismatch issue, or failed to generate media offer.\", \"\", \"\", \"\", \"487\", \"540200\", \"Success\", \"service\",\n \"Call ended successfully as caller cancelled the call.\", \"\", \"\", \"\", \"487\", \"540487\", \"Success\", \"service\",\n \"Call cancelled by originator.\", \"\", \"\", \"\", \"487\", \"560487\", \"\", \"service\",\n \"Call ended as application did not provide a valid Azure Communication Services token.\", \"\", \"\", \"\", \"495\", \"4507\", \"UnexpectedClientError\", \"service\",\n \"Azure Communication Services infrastructure error. Please gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"10045\", \"\", \"service\",\n \"Unexpected server error\", \"\", \"\", \"\", \"503\", \"560503\", \"UnexpectedServerError\", \"service\",\n \"Call ended successfully as it was declined by callee.\", \"\", \"\", \"\", \"603\", \"0\", \"Success\", \"service\"\n];\nlet divide = (a:real,b:real) { \n iif(b == 0.0 or isnan(b) or isnull(b), real(null), a / b) \n};\nlet reliability = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good), attempts); \n iff(isnull(ratio), real(null), round(100.00 * ratio, decimals)) \n};\nlet reliability_upperbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_upper = ratio + 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_upper_1 = iff(ratio_upper > 1.0, 1.0, ratio_upper); \n iff(isnull(ratio), real(null), round(100.00 * ratio_upper_1, decimals)) \n};\nlet reliability_lowerbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_lower = ratio - 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_lower_1 = iff(ratio_lower < 0.0, 0.0, ratio_lower); \n iff(isnull(ratio), real(null), round(100.00 * ratio_lower_1, decimals)) \n};\nlet compareMetricWithThreshold = (cmpOperator:string,metricValue:real,threshold:real) { \n case( \n cmpOperator == '==', \n metricValue == threshold, \n cmpOperator == '!=', \n metricValue != threshold, \n cmpOperator == '>', \n metricValue > threshold, \n cmpOperator == '>=', \n metricValue >= threshold, \n cmpOperator == '<', \n metricValue < threshold, \n cmpOperator == '<=', \n metricValue <= threshold, \n bool(null) \n) \n};\n//\nlet applyGoalsOnLegMetric = (legMetricResult:(timestamp:datetime,metricName:string,localParticipantId:string,metricValue:real,metricValueUpperBound:real,metricValueLowerBound:real,SdkVersion:string,ResultType:string,SubCode:string,Platform:string,CallType:string,callId:string)) {\n metricsMetadata\n | join kind=innerunique legMetricResult on metricName\n | extend cmpOperator = cmpOperatorLeg, threshold=targetThresholdLeg, unit=aggregLegUnit\n | project\n timestamp,\n metricName,\n localParticipantId,\n metricValue,\n metricValueUpperBound,\n metricValueLowerBound,\n goal = strcat(cmpOperator, ' ', threshold),\n succeeded= compareMetricWithThreshold(cmpOperator, metricValueUpperBound, threshold),\n unit,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n};\nlet AttemptSuccessFailureLegMetric = (attempt_and_failure_event:(EventInfo_Time:datetime,localParticipantId:string,metricName:string,kind_of_event:string,SdkVersion:string,ResultType:string,SubCode:string,callId:string,UserAgent:string,Platform:string,CallType:string),startDateTime:datetime,endDateTime:datetime) {\n let metadata = metricsMetadata | project metricName, aggregLegRounding;\n let attempt_and_failure_event_with_meta=attempt_and_failure_event | join kind=inner metadata on metricName;\n let attempt_event=attempt_and_failure_event_with_meta | where kind_of_event == 'attempt';\n let failure_event=attempt_and_failure_event_with_meta | where kind_of_event == 'failure';\n let pool = \n attempt_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | project \n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=1.0 * count(),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n let bad= \n failure_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | join kind=leftsemi pool on localParticipantId, metricName\n | project\n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n failures=1.0 * count(),\n EventInfo_Time=max(EventInfo_Time),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n //\n union hint.spread=2 pool, bad\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=sum(attempts),\n failures=sum(failures),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by localParticipantId, metricName\n | extend successes = max_of(attempts - failures, 0) //protect against failures>attempts\n | project\n timestamp=EventInfo_Time,\n metricName,\n localParticipantId,\n metricValue=reliability(successes, attempts),\n metricValueUpperBound=reliability_upperbound(successes, attempts),\n metricValueLowerBound=reliability_lowerbound(successes, attempts),\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n callId\n | invoke applyGoalsOnLegMetric()\n};\nlet clean_result_type = (result_type:string) {\n case (\n result_type contains 'Success' or result_type contains \"Succeeded\",\n 'Succeeded',\n result_type contains 'ExpectedError',\n 'ExpectedError',\n result_type contains 'UnexpectedServerError',\n 'UnexpectedServerError',\n 'UnexpectedClientError'\n )\n};\nlet ASF_Filter = (d:(EventInfo_Time:datetime,localParticipantId:string),startDateTime:datetime,endDateTime:datetime) { \n d \n | where EventInfo_Time between(startDateTime .. endDateTime) and isnotempty(localParticipantId) \n};\nlet ASF3 = (attempt:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),failure:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),metricName:string,startDateTime:datetime,endDateTime:datetime) {\n let fa = ASF_Filter((attempt), startDateTime, endDateTime);\n union\n (\n ASF_Filter((failure), startDateTime, endDateTime)\n | join kind = leftsemi fa on localParticipantId\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='failure',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n ),\n (\n fa\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='attempt',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n )\n};\nlet argStartDateTime = {TimeRange:start};\nlet argEndDateTime = {TimeRange:end};\n//\n//\n// api reliability\nlet startCall = \nACSCallClientOperations\n| where OperationName == 'StartCall'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet startCall_attempt = startCall;\nlet startCall_failure = startCall_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet accept = \nACSCallClientOperations\n| where OperationName == 'AcceptIncomingCall'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet accept_attempt = accept;\nlet accept_failure = accept_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet callJoin = \nACSCallClientOperations\n| where OperationName == 'Join'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet join_attempt = callJoin;\nlet join_failure = join_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_startVideo = \nACSCallClientOperations\n| where OperationName == 'StartVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_startVideo_attempt = api_startVideo;\nlet api_startVideo_failure = api_startVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_stopVideo = \nACSCallClientOperations\n| where OperationName == 'StopVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_stopVideo_attempt = api_stopVideo;\nlet api_stopVideo_failure = api_stopVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_startScreenshare = \nACSCallClientOperations\n| where OperationName == 'StartScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_startScreenshare_attempt = api_startScreenshare;\nlet api_startScreenshare_failure = api_startScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_stopScreenshare = \nACSCallClientOperations\n| where OperationName == 'StopScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_stopScreenshare_attempt = api_stopScreenshare;\nlet api_stopScreenshare_failure = api_stopScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_createView = \nACSCallClientOperations\n| where OperationName == 'CreateView'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_createView_attempt = api_createView;\nlet api_createView_failure = api_createView_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\n// Leg reliability\n//\nlet callagent_init = \nACSCallClientOperations\n| where OperationName == 'CallAgentInit'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=coalesce(ParticipantId, strcat('using client instance id for out of call context operations: ', ClientInstanceId))\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet callagent_init_attempt = callagent_init;\nlet callagent_init_failure = callagent_init_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_stopVideo = \nACSCallClientOperations\n| where OperationName == 'StopVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_stopVideo_attempt = leg_stopVideo;\nlet leg_stopVideo_failure = leg_stopVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_startVideo = \nACSCallClientOperations\n| where OperationName == 'StartVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_startVideo_attempt = leg_startVideo;\nlet leg_startVideo_failure = leg_startVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_startScreenshare = \nACSCallClientOperations\n| where OperationName == 'StartScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_startScreenshare_attempt = leg_startScreenshare;\nlet leg_startScreenshare_failure = leg_startScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_stopScreenshare = \nACSCallClientOperations\n| where OperationName == 'StopScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_stopScreenshare_attempt = leg_stopScreenshare;\nlet leg_stopScreenshare_failure = leg_stopScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_createView = \nACSCallClientOperations\n| where OperationName == 'CreateView'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_createView_attempt = leg_createView;\nlet leg_createView_failure = leg_createView_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet cdc_metrics_aggregation =\nunion\n ASF3(startCall_attempt, startCall_failure, 'reliability/api/StartCall', argStartDateTime, argEndDateTime),\n ASF3(accept_attempt, accept_failure, 'reliability/api/AcceptIncomingCall', argStartDateTime, argEndDateTime),\n ASF3(join_attempt, join_failure, 'reliability/api/Join', argStartDateTime, argEndDateTime),\n\tASF3(api_startVideo_attempt, api_startVideo_failure, 'reliability/api/StartVideo', argStartDateTime, argEndDateTime),\n\tASF3(api_stopVideo_attempt, api_stopVideo_failure, 'reliability/api/StopVideo', argStartDateTime, argEndDateTime),\n\tASF3(api_startScreenshare_attempt, api_startScreenshare_failure, 'reliability/api/StartScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(api_stopScreenshare_attempt, api_stopScreenshare_failure, 'reliability/api/StopScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(api_createView_attempt, api_createView_failure, 'reliability/api/CreateView', argStartDateTime, argEndDateTime),\n\t//\n ASF3(callagent_init_attempt, callagent_init_failure, 'reliability/CallAgentInit', argStartDateTime, argEndDateTime),\n\tASF3(leg_startVideo_attempt, leg_startVideo_failure, 'reliability/StartVideo', argStartDateTime, argEndDateTime),\n\tASF3(leg_stopVideo_attempt, leg_stopVideo_failure, 'reliability/StopVideo', argStartDateTime, argEndDateTime),\n\tASF3(leg_startScreenshare_attempt, leg_startScreenshare_failure, 'reliability/StartScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(leg_stopScreenshare_attempt, leg_stopScreenshare_failure, 'reliability/StopScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(leg_createView_attempt, leg_createView_failure, 'reliability/CreateView', argStartDateTime, argEndDateTime)\n| invoke AttemptSuccessFailureLegMetric(argStartDateTime, argEndDateTime)\n| extend timestampBin = bin(timestamp, 1d)\n| summarize\n timestamp_max = max(timestamp)\n by \n localParticipantId,\n callId,\n metricName,\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n timestampBin\n;\nlet selected_metric_reliability = todynamic('{MetricName}');\nlet sdkversion_selection = dynamic([{SDKVersion}]);\nlet resultType_selection = dynamic([{ResultType}]);\nlet platform_selection = dynamic([{platform}]);\nlet selected_subcode = dynamic('{selected_subcode}');\ncdc_metrics_aggregation\n| where isempty(selected_metric_reliability) or metricName == selected_metric_reliability\n| where array_length(sdkversion_selection) == 0 or SdkVersion in (sdkversion_selection)\n| where array_length(resultType_selection) == 0 or ResultType in (resultType_selection)\n| where array_length(platform_selection) == 0 or Platform in (platform_selection)\n| where isempty(selected_subcode) or SubCode == selected_subcode\n| summarize arg_max(timestamp_max, *) by metricName, SdkVersion, ResultType, SubCode, timestampBin, CallType, Platform, localParticipantId, callId\n| join kind=leftouter SubCodes on $left.SubCode == $right.subCode\n| summarize count=count() by SdkVersion\n",
+ "size": 1,
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "visualization": "piechart"
},
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "OperationDate",
- "formatter": 5
- },
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- }
- },
- "sortBy": []
- },
- "conditionalVisibility": {
- "parameterName": "chat_signature",
- "comparison": "isNotEqualTo"
- },
- "name": "chat-by-signature"
- }
- ]
- },
- "customWidth": "50",
- "name": "chat-signatures-group"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Chat Operation Names",
- "items": [
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| summarize count() by OperationName\r\n| render piechart",
- "size": 0,
- "noDataMessage": "No chat operations found in the specified time range",
- "exportMultipleValues": true,
- "exportedParameters": [
- {
- "fieldName": "series",
- "parameterName": "chat_operation",
- "parameterType": 1
- }
- ],
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "name": "chat-operation-names"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let SIPCodesChat = datatable(ResultSignature: string, SIPCode: string)\r\n[\r\n \"0\", \"Success\",\r\n \"100\", \"Trying\",\r\n \"180\", \"Ringing\",\r\n \"181\", \"Call Is Being Forwarded\",\r\n \"182\", \"Queued\",\r\n \"183\", \"Session Progress\",\r\n \"199\", \"Early Dialog Terminated\",\r\n \"200\", \"Success\",\r\n \"202\", \"Accepted\",\r\n \"204\", \"No Notification\",\r\n \"300\", \"Multiple Choices\",\r\n \"301\", \"Moved Permanently\",\r\n \"302\", \"Moved Temporarily\",\r\n \"305\", \"Use Proxy\",\r\n \"380\", \"Alternative Service\",\r\n \"400\", \"Bad Request\",\r\n \"401\", \"Unauthorized\",\r\n \"402\", \"Payment Required\",\r\n \"403\", \"Forbidden\",\r\n \"404\", \"Not Found\",\r\n \"405\", \"Method Not Allowed\",\r\n \"406\", \"Not Acceptable\",\r\n \"407\", \"Proxy Authentication Required\",\r\n \"408\", \"Request Timeout\",\r\n \"409\", \"Conflict\",\r\n \"410\", \"Gone\",\r\n \"411\", \"Length Required\",\r\n \"412\", \"Conditional Request Failed\",\r\n \"413\", \"Request Entity Too Large\",\r\n \"414\", \"Request-URI Too Large\",\r\n \"415\", \"Unsupported Media Type\",\r\n \"416\", \"Unsupported URI Scheme\",\r\n \"417\", \"Unknown Resource-Priority\",\r\n \"420\", \"Bad Extension\",\r\n \"421\", \"Extension Required\",\r\n \"422\", \"Session Interval Too Small\",\r\n \"423\", \"Interval Too Brief\",\r\n \"424\", \"Bad Location Information\",\r\n \"428\", \"Use Identity Header\",\r\n \"429\", \"Provide Referrer Identity\",\r\n \"430\", \"Flow Failed\",\r\n \"433\", \"Anonymity Disallowed\",\r\n \"436\", \"Bad Identity-Info\",\r\n \"437\", \"Unsupported Certificate\",\r\n \"438\", \"Invalid Identity Header\",\r\n \"439\", \"First Hop Lacks Outbound Support\",\r\n \"440\", \"Max-Breadth Exceeded\",\r\n \"469\", \"Bad Info Package\",\r\n \"470\", \"Consent Needed\",\r\n \"480\", \"Temporarily Unavailable\",\r\n \"481\", \"Call/Transaction Does Not Exist\",\r\n \"482\", \"Loop Detected\",\r\n \"483\", \"Too Many Hops\",\r\n \"484\", \"Address Incomplete\",\r\n \"485\", \"Ambiguous\",\r\n \"486\", \"Busy Here\",\r\n \"487\", \"Request Terminated\",\r\n \"488\", \"Not Acceptable Here\",\r\n \"489\", \"Bad Event\",\r\n \"491\", \"Request Pending\",\r\n \"493\", \"Undecipherable\",\r\n \"494\", \"Security Agreement Required\",\r\n \"500\", \"Internal Server Error\",\r\n \"501\", \"Not Implemented\",\r\n \"502\", \"Bad Gateway\",\r\n \"503\", \"Service Unavailable\",\r\n \"504\", \"Server Time-out\",\r\n \"505\", \"Version Not Supported\",\r\n \"513\", \"Message Too Large\",\r\n \"555\", \"Push Notification Service Not Supported\",\r\n \"580\", \"Precondition Failure\",\r\n \"600\", \"Busy Everywhere\",\r\n \"603\", \"Decline\",\r\n \"604\", \"Does Not Exist Anywhere\",\r\n \"606\", \"Not Acceptable\",\r\n \"607\", \"Unwanted\",\r\n \"608\", \"Rejected\",\r\n];\r\n\r\nlet other_chat_operations = ACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| summarize operation_count=count() by OperationName\r\n| order by operation_count desc\r\n| extend Rank=row_number()\r\n| where Rank > 5\r\n| project OperationName;\r\n\r\nACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query} and (OperationName in (dynamic([{chat_operation}])) or iff(\"Other\" in (dynamic([{chat_operation}])), (OperationName in (other_chat_operations)), false))\r\n| join kind=leftouter SIPCodesChat on ResultSignature\r\n| extend OperationDate=strcat(\"📅\", format_datetime(TimeGenerated, 'MM/dd/y'))\r\n| extend OperationTime=format_datetime(TimeGenerated, 'hh:mm:ss')\r\n| extend ResultIcon=iff(ResultType == \"Succeeded\", \"✔️\", \"❌\")\r\n| extend Result=strcat(ResultIcon, \" \", ResultSignature, \": \", SIPCode)\r\n| order by TimeGenerated\r\n| project OperationName, Result, UserId, ChatThreadId, CallerIpAddress, Level, OperationDate, OperationTime, DurationMs",
- "size": 0,
- "title": "Chat operations with operation name {chat_operation}",
- "noDataMessage": "No chat operations found for the specified time range and operation name",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
+ "customWidth": "50",
+ "conditionalVisibility": {
+ "parameterName": "selected_subcode",
+ "comparison": "isNotEqualTo"
},
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "OperationDate",
- "formatter": 5
- },
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- }
- },
- "sortBy": []
- },
- "conditionalVisibility": {
- "parameterName": "chat_operation",
- "comparison": "isNotEqualTo"
- },
- "name": "chat-by-operation"
- }
- ]
- },
- "customWidth": "50",
- "name": "chat-operation-names-group"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Chat Operation Versions",
- "items": [
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| summarize count() by OperationVersion\r\n| render piechart",
- "size": 0,
- "noDataMessage": "No chat operations found in the specified time range",
- "exportMultipleValues": true,
- "exportedParameters": [
- {
- "fieldName": "series",
- "parameterName": "chat_version",
- "parameterType": 1
- }
- ],
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "showPin": false,
- "name": "chat-operation-versions"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let SIPCodesChat = datatable(ResultSignature: string, SIPCode: string)\r\n[\r\n \"0\", \"Success\",\r\n \"100\", \"Trying\",\r\n \"180\", \"Ringing\",\r\n \"181\", \"Call Is Being Forwarded\",\r\n \"182\", \"Queued\",\r\n \"183\", \"Session Progress\",\r\n \"199\", \"Early Dialog Terminated\",\r\n \"200\", \"Success\",\r\n \"202\", \"Accepted\",\r\n \"204\", \"No Notification\",\r\n \"300\", \"Multiple Choices\",\r\n \"301\", \"Moved Permanently\",\r\n \"302\", \"Moved Temporarily\",\r\n \"305\", \"Use Proxy\",\r\n \"380\", \"Alternative Service\",\r\n \"400\", \"Bad Request\",\r\n \"401\", \"Unauthorized\",\r\n \"402\", \"Payment Required\",\r\n \"403\", \"Forbidden\",\r\n \"404\", \"Not Found\",\r\n \"405\", \"Method Not Allowed\",\r\n \"406\", \"Not Acceptable\",\r\n \"407\", \"Proxy Authentication Required\",\r\n \"408\", \"Request Timeout\",\r\n \"409\", \"Conflict\",\r\n \"410\", \"Gone\",\r\n \"411\", \"Length Required\",\r\n \"412\", \"Conditional Request Failed\",\r\n \"413\", \"Request Entity Too Large\",\r\n \"414\", \"Request-URI Too Large\",\r\n \"415\", \"Unsupported Media Type\",\r\n \"416\", \"Unsupported URI Scheme\",\r\n \"417\", \"Unknown Resource-Priority\",\r\n \"420\", \"Bad Extension\",\r\n \"421\", \"Extension Required\",\r\n \"422\", \"Session Interval Too Small\",\r\n \"423\", \"Interval Too Brief\",\r\n \"424\", \"Bad Location Information\",\r\n \"428\", \"Use Identity Header\",\r\n \"429\", \"Provide Referrer Identity\",\r\n \"430\", \"Flow Failed\",\r\n \"433\", \"Anonymity Disallowed\",\r\n \"436\", \"Bad Identity-Info\",\r\n \"437\", \"Unsupported Certificate\",\r\n \"438\", \"Invalid Identity Header\",\r\n \"439\", \"First Hop Lacks Outbound Support\",\r\n \"440\", \"Max-Breadth Exceeded\",\r\n \"469\", \"Bad Info Package\",\r\n \"470\", \"Consent Needed\",\r\n \"480\", \"Temporarily Unavailable\",\r\n \"481\", \"Call/Transaction Does Not Exist\",\r\n \"482\", \"Loop Detected\",\r\n \"483\", \"Too Many Hops\",\r\n \"484\", \"Address Incomplete\",\r\n \"485\", \"Ambiguous\",\r\n \"486\", \"Busy Here\",\r\n \"487\", \"Request Terminated\",\r\n \"488\", \"Not Acceptable Here\",\r\n \"489\", \"Bad Event\",\r\n \"491\", \"Request Pending\",\r\n \"493\", \"Undecipherable\",\r\n \"494\", \"Security Agreement Required\",\r\n \"500\", \"Internal Server Error\",\r\n \"501\", \"Not Implemented\",\r\n \"502\", \"Bad Gateway\",\r\n \"503\", \"Service Unavailable\",\r\n \"504\", \"Server Time-out\",\r\n \"505\", \"Version Not Supported\",\r\n \"513\", \"Message Too Large\",\r\n \"555\", \"Push Notification Service Not Supported\",\r\n \"580\", \"Precondition Failure\",\r\n \"600\", \"Busy Everywhere\",\r\n \"603\", \"Decline\",\r\n \"604\", \"Does Not Exist Anywhere\",\r\n \"606\", \"Not Acceptable\",\r\n \"607\", \"Unwanted\",\r\n \"608\", \"Rejected\",\r\n];\r\n\r\nlet other_chat_versions = ACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| summarize operation_count=count() by OperationVersion\r\n| order by operation_count desc\r\n| extend Rank=row_number()\r\n| where Rank > 5\r\n| project OperationVersion;\r\n\r\nACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query} and (OperationVersion in (dynamic([{chat_version}])) or iff(\"Other\" in (dynamic([{chat_version}])), (OperationVersion in (other_chat_versions)), false))\r\n| join kind=leftouter SIPCodesChat on ResultSignature\r\n| extend OperationDate=strcat(\"📅\", format_datetime(TimeGenerated, 'MM/dd/y'))\r\n| extend OperationTime=format_datetime(TimeGenerated, 'hh:mm:ss')\r\n| extend ResultIcon=iff(ResultType == \"Succeeded\", \"✔️\", \"❌\")\r\n| extend Result=strcat(ResultIcon, \" \", ResultSignature, \": \", SIPCode)\r\n| order by TimeGenerated\r\n| project OperationName, Result, UserId, ChatThreadId, CallerIpAddress, Level, OperationDate, OperationTime, DurationMs",
- "size": 0,
- "title": "Chat operations with operation version {chat_version}",
- "noDataMessage": "No chat operations found for the specified time range and operation version",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
+ "name": "query - 6"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "You can use the Call IDs shown below in [Call Diagnostics tool](https://aka.ms/calldiagnostics) to displayed call timeline visuals and more in-depth call breakdowns"
},
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "OperationDate",
- "formatter": 5
- },
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- }
- },
- "sortBy": []
- },
- "conditionalVisibility": {
- "parameterName": "chat_version",
- "comparison": "isNotEqualTo"
- },
- "name": "chat-by-version"
- }
- ]
- },
- "customWidth": "50",
- "name": "chat-operation-versions-group"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Identity drill-down",
- "items": [
- {
- "type": 9,
- "content": {
- "version": "KqlParameterItem/1.0",
- "parameters": [
- {
- "id": "0c0b56fd-ffd9-4761-b14e-c916660f9ccc",
- "version": "KqlParameterItem/1.0",
- "name": "chat_identity",
- "label": "Identity",
- "type": 2,
- "description": "Choose an identity to visualize",
- "query": "ACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| order by TimeGenerated\r\n| distinct UserId\r\n| where isnotempty(UserId)",
- "value": null,
- "typeSettings": {
- "additionalResourceOptions": [],
- "showDefault": false
- },
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- }
- ],
- "style": "pills",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "name": "chat-identity-parameters"
- },
- {
- "type": 1,
- "content": {
- "json": "**Select an identity from the drop-down menu to display its associated data**",
- "style": "info"
- },
- "conditionalVisibility": {
- "parameterName": "chat_identity",
- "comparison": "isEqualTo"
- },
- "name": "chat-identity-drilldown-info"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let SIPCodes = datatable(ParticipantEndReason: string, SIPCode: string)\r\n[\r\n \"0\", \"Success\",\r\n \"100\", \"Trying\",\r\n \"180\", \"Ringing\",\r\n \"181\", \"Call Is Being Forwarded\",\r\n \"182\", \"Queued\",\r\n \"183\", \"Session Progress\",\r\n \"199\", \"Early Dialog Terminated\",\r\n \"200\", \"Success\",\r\n \"202\", \"Accepted\",\r\n \"204\", \"No Notification\",\r\n \"300\", \"Multiple Choices\",\r\n \"301\", \"Moved Permanently\",\r\n \"302\", \"Moved Temporarily\",\r\n \"305\", \"Use Proxy\",\r\n \"380\", \"Alternative Service\",\r\n \"400\", \"Bad Request\",\r\n \"401\", \"Unauthorized\",\r\n \"402\", \"Payment Required\",\r\n \"403\", \"Forbidden\",\r\n \"404\", \"Not Found\",\r\n \"405\", \"Method Not Allowed\",\r\n \"406\", \"Not Acceptable\",\r\n \"407\", \"Proxy Authentication Required\",\r\n \"408\", \"Request Timeout\",\r\n \"409\", \"Conflict\",\r\n \"410\", \"Gone\",\r\n \"411\", \"Length Required\",\r\n \"412\", \"Conditional Request Failed\",\r\n \"413\", \"Request Entity Too Large\",\r\n \"414\", \"Request-URI Too Large\",\r\n \"415\", \"Unsupported Media Type\",\r\n \"416\", \"Unsupported URI Scheme\",\r\n \"417\", \"Unknown Resource-Priority\",\r\n \"420\", \"Bad Extension\",\r\n \"421\", \"Extension Required\",\r\n \"422\", \"Session Interval Too Small\",\r\n \"423\", \"Interval Too Brief\",\r\n \"424\", \"Bad Location Information\",\r\n \"428\", \"Use Identity Header\",\r\n \"429\", \"Provide Referrer Identity\",\r\n \"430\", \"Flow Failed\",\r\n \"433\", \"Anonymity Disallowed\",\r\n \"436\", \"Bad Identity-Info\",\r\n \"437\", \"Unsupported Certificate\",\r\n \"438\", \"Invalid Identity Header\",\r\n \"439\", \"First Hop Lacks Outbound Support\",\r\n \"440\", \"Max-Breadth Exceeded\",\r\n \"469\", \"Bad Info Package\",\r\n \"470\", \"Consent Needed\",\r\n \"480\", \"Temporarily Unavailable\",\r\n \"481\", \"Call/Transaction Does Not Exist\",\r\n \"482\", \"Loop Detected\",\r\n \"483\", \"Too Many Hops\",\r\n \"484\", \"Address Incomplete\",\r\n \"485\", \"Ambiguous\",\r\n \"486\", \"Busy Here\",\r\n \"487\", \"Request Terminated\",\r\n \"488\", \"Not Acceptable Here\",\r\n \"489\", \"Bad Event\",\r\n \"491\", \"Request Pending\",\r\n \"493\", \"Undecipherable\",\r\n \"494\", \"Security Agreement Required\",\r\n \"500\", \"Internal Server Error\",\r\n \"501\", \"Not Implemented\",\r\n \"502\", \"Bad Gateway\",\r\n \"503\", \"Service Unavailable\",\r\n \"504\", \"Server Time-out\",\r\n \"505\", \"Version Not Supported\",\r\n \"513\", \"Message Too Large\",\r\n \"555\", \"Push Notification Service Not Supported\",\r\n \"580\", \"Precondition Failure\",\r\n \"600\", \"Busy Everywhere\",\r\n \"603\", \"Decline\",\r\n \"604\", \"Does Not Exist Anywhere\",\r\n \"606\", \"Not Acceptable\",\r\n \"607\", \"Unwanted\",\r\n \"608\", \"Rejected\",\r\n];\r\n\r\nACSCallDiagnostics\r\n| join kind=inner ACSCallSummary on CorrelationId, ParticipantId, EndpointId\r\n| where CallStartTime {time_range:query} and Identifier == substring(\"{chat_identity}\", indexof(\"{chat_identity}\", \"acs:\"))\r\n| join kind=leftouter SIPCodes on ParticipantEndReason\r\n| extend EndReason=strcat(ParticipantEndReason, \": \", SIPCode)\r\n| extend CallDate=strcat(\"📅\", format_datetime(CallStartTime, 'MM/dd/y'))\r\n| extend UnsuccessfulEndReason = iff((ParticipantEndReason startswith \"0\") or (ParticipantEndReason startswith \"2\"), \"\", \"🛑\")\r\n| extend ParticipantTime=format_datetime(ParticipantStartTime, 'hh:mm:ss')\r\n| extend EndpointType = case( indexof(EndpointType, \"VoIP\") != -1, strcat(\"🗣️ \", EndpointType),\r\n indexof(EndpointType, \"PSTN\") != -1, strcat(\"📞 \", EndpointType),\r\n indexof(EndpointType, \"Bot\") != -1, strcat(\"🤖 \", EndpointType),\r\n indexof(EndpointType, \"Server\") != -1, strcat(\"🖥️ \", EndpointType),\r\n indexof(EndpointType, \"Unknown\") != -1, strcat(\"👽 \", EndpointType),\r\n EndpointType\r\n )\r\n| extend Participant = strcat(EndpointType, \" \", UnsuccessfulEndReason, \" \", ParticipantTime, \" (\", ParticipantId, \")\")\r\n| extend MediaType = case( indexof(MediaType, \"Audio\") != -1, strcat(\"🔊 \", MediaType),\r\n indexof(MediaType, \"Video\") != -1, strcat(\"🎥 \", MediaType),\r\n indexof(MediaType, \"VBSS\") != -1, strcat(\"💻 \", MediaType),\r\n indexof(MediaType, \"AppSharing\") != -1, strcat(\"📲 \", MediaType),\r\n MediaType\r\n )\r\n| project CallDate, CallId = strcat(\"📞 \", CorrelationId), Participant, MediaType, ParticipantDuration, EndReason, JitterAvg, PacketLossRateAvg, RoundTripTimeAvg",
- "size": 0,
- "title": "Calls for identity {chat_identity}",
- "noDataMessage": "No calls found for the specified time range and identity",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "CallDate",
- "formatter": 5
- },
- {
- "columnMatch": "CallId",
- "formatter": 5
- },
- {
- "columnMatch": "Participant",
- "formatter": 5
- },
- {
- "columnMatch": "MediaType",
- "formatter": 5
- },
- {
- "columnMatch": "EndReason",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "startsWith",
- "thresholdValue": "2",
- "representation": "success",
- "text": "{0}{1}"
- },
- {
- "operator": "startsWith",
- "thresholdValue": "0",
- "representation": "success",
- "text": "{0}{1}"
- },
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "3",
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "JitterAvg",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "colors",
- "thresholdsGrid": [
- {
- "operator": ">",
- "thresholdValue": "30",
- "representation": "redBright",
- "text": "{0}{1}"
- },
- {
- "operator": "Default",
- "thresholdValue": null,
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "PacketLossRateAvg",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "colors",
- "thresholdsGrid": [
- {
- "operator": ">",
- "thresholdValue": ".1",
- "representation": "redBright",
- "text": "{0}{1}"
- },
- {
- "operator": "Default",
- "thresholdValue": null,
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "RoundTripTimeAvg",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "colors",
- "thresholdsGrid": [
- {
- "operator": ">",
- "thresholdValue": "500",
- "representation": "redBright",
- "text": "{0}{1}"
- },
- {
- "operator": "Default",
- "thresholdValue": null,
- "text": "{0}{1}"
- }
- ]
- }
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "CallDate",
- "CallId",
- "Participant"
- ],
- "expandTopLevel": true,
- "finalBy": "MediaType"
- }
- }
- },
- "customWidth": "50",
- "conditionalVisibility": {
- "parameterName": "chat_identity",
- "comparison": "isNotEqualTo"
- },
- "name": "chat-identity-call-details"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let SIPCodesChat = datatable(ResultSignature: string, SIPCode: string)\r\n[\r\n \"0\", \"Success\",\r\n \"100\", \"Trying\",\r\n \"180\", \"Ringing\",\r\n \"181\", \"Call Is Being Forwarded\",\r\n \"182\", \"Queued\",\r\n \"183\", \"Session Progress\",\r\n \"199\", \"Early Dialog Terminated\",\r\n \"200\", \"Success\",\r\n \"202\", \"Accepted\",\r\n \"204\", \"No Notification\",\r\n \"300\", \"Multiple Choices\",\r\n \"301\", \"Moved Permanently\",\r\n \"302\", \"Moved Temporarily\",\r\n \"305\", \"Use Proxy\",\r\n \"380\", \"Alternative Service\",\r\n \"400\", \"Bad Request\",\r\n \"401\", \"Unauthorized\",\r\n \"402\", \"Payment Required\",\r\n \"403\", \"Forbidden\",\r\n \"404\", \"Not Found\",\r\n \"405\", \"Method Not Allowed\",\r\n \"406\", \"Not Acceptable\",\r\n \"407\", \"Proxy Authentication Required\",\r\n \"408\", \"Request Timeout\",\r\n \"409\", \"Conflict\",\r\n \"410\", \"Gone\",\r\n \"411\", \"Length Required\",\r\n \"412\", \"Conditional Request Failed\",\r\n \"413\", \"Request Entity Too Large\",\r\n \"414\", \"Request-URI Too Large\",\r\n \"415\", \"Unsupported Media Type\",\r\n \"416\", \"Unsupported URI Scheme\",\r\n \"417\", \"Unknown Resource-Priority\",\r\n \"420\", \"Bad Extension\",\r\n \"421\", \"Extension Required\",\r\n \"422\", \"Session Interval Too Small\",\r\n \"423\", \"Interval Too Brief\",\r\n \"424\", \"Bad Location Information\",\r\n \"428\", \"Use Identity Header\",\r\n \"429\", \"Provide Referrer Identity\",\r\n \"430\", \"Flow Failed\",\r\n \"433\", \"Anonymity Disallowed\",\r\n \"436\", \"Bad Identity-Info\",\r\n \"437\", \"Unsupported Certificate\",\r\n \"438\", \"Invalid Identity Header\",\r\n \"439\", \"First Hop Lacks Outbound Support\",\r\n \"440\", \"Max-Breadth Exceeded\",\r\n \"469\", \"Bad Info Package\",\r\n \"470\", \"Consent Needed\",\r\n \"480\", \"Temporarily Unavailable\",\r\n \"481\", \"Call/Transaction Does Not Exist\",\r\n \"482\", \"Loop Detected\",\r\n \"483\", \"Too Many Hops\",\r\n \"484\", \"Address Incomplete\",\r\n \"485\", \"Ambiguous\",\r\n \"486\", \"Busy Here\",\r\n \"487\", \"Request Terminated\",\r\n \"488\", \"Not Acceptable Here\",\r\n \"489\", \"Bad Event\",\r\n \"491\", \"Request Pending\",\r\n \"493\", \"Undecipherable\",\r\n \"494\", \"Security Agreement Required\",\r\n \"500\", \"Internal Server Error\",\r\n \"501\", \"Not Implemented\",\r\n \"502\", \"Bad Gateway\",\r\n \"503\", \"Service Unavailable\",\r\n \"504\", \"Server Time-out\",\r\n \"505\", \"Version Not Supported\",\r\n \"513\", \"Message Too Large\",\r\n \"555\", \"Push Notification Service Not Supported\",\r\n \"580\", \"Precondition Failure\",\r\n \"600\", \"Busy Everywhere\",\r\n \"603\", \"Decline\",\r\n \"604\", \"Does Not Exist Anywhere\",\r\n \"606\", \"Not Acceptable\",\r\n \"607\", \"Unwanted\",\r\n \"608\", \"Rejected\",\r\n];\r\n\r\nACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query} and UserId == \"{chat_identity}\"\r\n| join kind=leftouter SIPCodesChat on ResultSignature\r\n| extend OperationDate=strcat(\"📅\", format_datetime(TimeGenerated, 'MM/dd/y'))\r\n| extend OperationTime=format_datetime(TimeGenerated, 'hh:mm:ss')\r\n| extend ResultIcon=iff(ResultType == \"Succeeded\", \"✔️\", \"❌\")\r\n| extend Result=strcat(ResultIcon, \" \", ResultSignature, \": \", SIPCode)\r\n| order by TimeGenerated\r\n| project OperationName, Level, Result, OperationDate, OperationTime, DurationMs\r\n",
- "size": 0,
- "title": "Chat operations for identity {chat_identity}",
- "noDataMessage": "No chat operations found for the specified time range and identity",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
- },
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "OperationDate",
- "formatter": 5
- },
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- }
- },
- "sortBy": []
- },
- "customWidth": "50",
- "conditionalVisibility": {
- "parameterName": "chat_identity",
- "comparison": "isNotEqualTo"
- },
- "name": "chat-identity-chat-details"
- }
- ]
- },
- "name": "chat-identity-drill-down-group"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Chat meeting drill-down",
- "items": [
- {
- "type": 9,
- "content": {
- "version": "KqlParameterItem/1.0",
- "parameters": [
- {
- "id": "0c0b56fd-ffd9-4761-b14e-c916660f9ccc",
- "version": "KqlParameterItem/1.0",
- "name": "chat_meeting",
- "label": "Chat meeting ID",
- "type": 2,
- "description": "Choose a chat meeting ID to visualize",
- "query": "ACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| order by TimeGenerated\r\n| distinct ChatThreadId\r\n| where isnotempty(ChatThreadId)",
- "value": null,
- "typeSettings": {
- "additionalResourceOptions": [],
- "showDefault": false
- },
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- }
- ],
- "style": "pills",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "name": "chat-meeting-parameters"
- },
- {
- "type": 1,
- "content": {
- "json": "**Select a chat meeting ID from the drop-down menu to display its associated data**",
- "style": "info"
- },
- "conditionalVisibility": {
- "parameterName": "chat_meeting",
- "comparison": "isEqualTo"
- },
- "name": "chat-meeting-drilldown-info"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let SIPCodesChat = datatable(ResultSignature: string, SIPCode: string)\r\n[\r\n \"0\", \"Success\",\r\n \"100\", \"Trying\",\r\n \"180\", \"Ringing\",\r\n \"181\", \"Call Is Being Forwarded\",\r\n \"182\", \"Queued\",\r\n \"183\", \"Session Progress\",\r\n \"199\", \"Early Dialog Terminated\",\r\n \"200\", \"Success\",\r\n \"202\", \"Accepted\",\r\n \"204\", \"No Notification\",\r\n \"300\", \"Multiple Choices\",\r\n \"301\", \"Moved Permanently\",\r\n \"302\", \"Moved Temporarily\",\r\n \"305\", \"Use Proxy\",\r\n \"380\", \"Alternative Service\",\r\n \"400\", \"Bad Request\",\r\n \"401\", \"Unauthorized\",\r\n \"402\", \"Payment Required\",\r\n \"403\", \"Forbidden\",\r\n \"404\", \"Not Found\",\r\n \"405\", \"Method Not Allowed\",\r\n \"406\", \"Not Acceptable\",\r\n \"407\", \"Proxy Authentication Required\",\r\n \"408\", \"Request Timeout\",\r\n \"409\", \"Conflict\",\r\n \"410\", \"Gone\",\r\n \"411\", \"Length Required\",\r\n \"412\", \"Conditional Request Failed\",\r\n \"413\", \"Request Entity Too Large\",\r\n \"414\", \"Request-URI Too Large\",\r\n \"415\", \"Unsupported Media Type\",\r\n \"416\", \"Unsupported URI Scheme\",\r\n \"417\", \"Unknown Resource-Priority\",\r\n \"420\", \"Bad Extension\",\r\n \"421\", \"Extension Required\",\r\n \"422\", \"Session Interval Too Small\",\r\n \"423\", \"Interval Too Brief\",\r\n \"424\", \"Bad Location Information\",\r\n \"428\", \"Use Identity Header\",\r\n \"429\", \"Provide Referrer Identity\",\r\n \"430\", \"Flow Failed\",\r\n \"433\", \"Anonymity Disallowed\",\r\n \"436\", \"Bad Identity-Info\",\r\n \"437\", \"Unsupported Certificate\",\r\n \"438\", \"Invalid Identity Header\",\r\n \"439\", \"First Hop Lacks Outbound Support\",\r\n \"440\", \"Max-Breadth Exceeded\",\r\n \"469\", \"Bad Info Package\",\r\n \"470\", \"Consent Needed\",\r\n \"480\", \"Temporarily Unavailable\",\r\n \"481\", \"Call/Transaction Does Not Exist\",\r\n \"482\", \"Loop Detected\",\r\n \"483\", \"Too Many Hops\",\r\n \"484\", \"Address Incomplete\",\r\n \"485\", \"Ambiguous\",\r\n \"486\", \"Busy Here\",\r\n \"487\", \"Request Terminated\",\r\n \"488\", \"Not Acceptable Here\",\r\n \"489\", \"Bad Event\",\r\n \"491\", \"Request Pending\",\r\n \"493\", \"Undecipherable\",\r\n \"494\", \"Security Agreement Required\",\r\n \"500\", \"Internal Server Error\",\r\n \"501\", \"Not Implemented\",\r\n \"502\", \"Bad Gateway\",\r\n \"503\", \"Service Unavailable\",\r\n \"504\", \"Server Time-out\",\r\n \"505\", \"Version Not Supported\",\r\n \"513\", \"Message Too Large\",\r\n \"555\", \"Push Notification Service Not Supported\",\r\n \"580\", \"Precondition Failure\",\r\n \"600\", \"Busy Everywhere\",\r\n \"603\", \"Decline\",\r\n \"604\", \"Does Not Exist Anywhere\",\r\n \"606\", \"Not Acceptable\",\r\n \"607\", \"Unwanted\",\r\n \"608\", \"Rejected\",\r\n];\r\n\r\nACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query} and ChatThreadId == \"{chat_meeting}\"\r\n| join kind=leftouter SIPCodesChat on ResultSignature\r\n| extend OperationDate=strcat(\"📅\", format_datetime(TimeGenerated, 'MM/dd/y'))\r\n| extend OperationTime=format_datetime(TimeGenerated, 'hh:mm:ss')\r\n| extend ResultIcon=iff(ResultType == \"Succeeded\", \"✔️\", \"❌\")\r\n| extend Result=strcat(ResultIcon, \" \", ResultSignature, \": \", SIPCode)\r\n| order by TimeGenerated\r\n| project OperationName, Level, Result, OperationDate, OperationTime, DurationMs\r\n",
- "size": 0,
- "title": "Chat operations for meeting {chat_meeting}",
- "noDataMessage": "No chat operations found for the specified time range and meeting ID",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
- },
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "OperationDate",
- "formatter": 5
- },
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- }
- },
- "sortBy": []
- },
- "conditionalVisibility": {
- "parameterName": "chat_meeting",
- "comparison": "isNotEqualTo"
- },
- "name": "chat-meeting-details"
- }
- ]
- },
- "name": "chat-meeting-drill-down-group"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Chat IP address drill-down",
- "items": [
- {
- "type": 9,
- "content": {
- "version": "KqlParameterItem/1.0",
- "parameters": [
- {
- "id": "0c0b56fd-ffd9-4761-b14e-c916660f9ccc",
- "version": "KqlParameterItem/1.0",
- "name": "chat_ip",
- "label": "IP address",
- "type": 2,
- "description": "Choose an IP address to visualize",
- "query": "ACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| order by TimeGenerated\r\n| distinct CallerIpAddress\r\n| where isnotempty(CallerIpAddress)",
- "value": null,
- "typeSettings": {
- "additionalResourceOptions": [],
- "showDefault": false
- },
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- }
- ],
- "style": "pills",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "name": "chat-ip-parameters"
- },
- {
- "type": 1,
- "content": {
- "json": "**Select an IP address from the drop-down menu to display its associated data**",
- "style": "info"
- },
- "conditionalVisibility": {
- "parameterName": "chat_ip",
- "comparison": "isEqualTo"
- },
- "name": "chat-ip-drilldown-info"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let SIPCodesChat = datatable(ResultSignature: string, SIPCode: string)\r\n[\r\n \"0\", \"Success\",\r\n \"100\", \"Trying\",\r\n \"180\", \"Ringing\",\r\n \"181\", \"Call Is Being Forwarded\",\r\n \"182\", \"Queued\",\r\n \"183\", \"Session Progress\",\r\n \"199\", \"Early Dialog Terminated\",\r\n \"200\", \"Success\",\r\n \"202\", \"Accepted\",\r\n \"204\", \"No Notification\",\r\n \"300\", \"Multiple Choices\",\r\n \"301\", \"Moved Permanently\",\r\n \"302\", \"Moved Temporarily\",\r\n \"305\", \"Use Proxy\",\r\n \"380\", \"Alternative Service\",\r\n \"400\", \"Bad Request\",\r\n \"401\", \"Unauthorized\",\r\n \"402\", \"Payment Required\",\r\n \"403\", \"Forbidden\",\r\n \"404\", \"Not Found\",\r\n \"405\", \"Method Not Allowed\",\r\n \"406\", \"Not Acceptable\",\r\n \"407\", \"Proxy Authentication Required\",\r\n \"408\", \"Request Timeout\",\r\n \"409\", \"Conflict\",\r\n \"410\", \"Gone\",\r\n \"411\", \"Length Required\",\r\n \"412\", \"Conditional Request Failed\",\r\n \"413\", \"Request Entity Too Large\",\r\n \"414\", \"Request-URI Too Large\",\r\n \"415\", \"Unsupported Media Type\",\r\n \"416\", \"Unsupported URI Scheme\",\r\n \"417\", \"Unknown Resource-Priority\",\r\n \"420\", \"Bad Extension\",\r\n \"421\", \"Extension Required\",\r\n \"422\", \"Session Interval Too Small\",\r\n \"423\", \"Interval Too Brief\",\r\n \"424\", \"Bad Location Information\",\r\n \"428\", \"Use Identity Header\",\r\n \"429\", \"Provide Referrer Identity\",\r\n \"430\", \"Flow Failed\",\r\n \"433\", \"Anonymity Disallowed\",\r\n \"436\", \"Bad Identity-Info\",\r\n \"437\", \"Unsupported Certificate\",\r\n \"438\", \"Invalid Identity Header\",\r\n \"439\", \"First Hop Lacks Outbound Support\",\r\n \"440\", \"Max-Breadth Exceeded\",\r\n \"469\", \"Bad Info Package\",\r\n \"470\", \"Consent Needed\",\r\n \"480\", \"Temporarily Unavailable\",\r\n \"481\", \"Call/Transaction Does Not Exist\",\r\n \"482\", \"Loop Detected\",\r\n \"483\", \"Too Many Hops\",\r\n \"484\", \"Address Incomplete\",\r\n \"485\", \"Ambiguous\",\r\n \"486\", \"Busy Here\",\r\n \"487\", \"Request Terminated\",\r\n \"488\", \"Not Acceptable Here\",\r\n \"489\", \"Bad Event\",\r\n \"491\", \"Request Pending\",\r\n \"493\", \"Undecipherable\",\r\n \"494\", \"Security Agreement Required\",\r\n \"500\", \"Internal Server Error\",\r\n \"501\", \"Not Implemented\",\r\n \"502\", \"Bad Gateway\",\r\n \"503\", \"Service Unavailable\",\r\n \"504\", \"Server Time-out\",\r\n \"505\", \"Version Not Supported\",\r\n \"513\", \"Message Too Large\",\r\n \"555\", \"Push Notification Service Not Supported\",\r\n \"580\", \"Precondition Failure\",\r\n \"600\", \"Busy Everywhere\",\r\n \"603\", \"Decline\",\r\n \"604\", \"Does Not Exist Anywhere\",\r\n \"606\", \"Not Acceptable\",\r\n \"607\", \"Unwanted\",\r\n \"608\", \"Rejected\",\r\n];\r\n\r\nACSChatIncomingOperations\r\n| where TimeGenerated {time_range:query} and CallerIpAddress == \"{chat_ip}\"\r\n| join kind=leftouter SIPCodesChat on ResultSignature\r\n| extend OperationDate=strcat(\"📅\", format_datetime(TimeGenerated, 'MM/dd/y'))\r\n| extend OperationTime=format_datetime(TimeGenerated, 'hh:mm:ss')\r\n| extend ResultIcon=iff(ResultType == \"Succeeded\", \"✔️\", \"❌\")\r\n| extend Result=strcat(ResultIcon, \" \", ResultSignature, \": \", SIPCode)\r\n| order by TimeGenerated\r\n| project OperationName, Level, Result, OperationDate, OperationTime, DurationMs\r\n",
- "size": 0,
- "title": "Chat operations for IP address {chat_ip}",
- "noDataMessage": "No chat operations found for the specified time range and IP address",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
- },
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "OperationDate",
- "formatter": 5
- },
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- }
- },
- "sortBy": []
- },
- "conditionalVisibility": {
- "parameterName": "chat_ip",
- "comparison": "isNotEqualTo"
- },
- "name": "chat-ip-details"
- }
- ]
- },
- "name": "chat-ip-drill-down-group"
- }
- ]
- },
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "chat"
- },
- "name": "chat-group"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "items": [
- {
- "type": 11,
- "content": {
- "version": "LinkItem/1.0",
- "style": "tabs",
- "links": [
- {
- "id": "ce0cf675-8b7d-4564-bc03-4a24a7a41de4",
- "cellValue": "tab",
- "linkTarget": "parameter",
- "linkLabel": "Overview",
- "subTarget": "overview",
- "style": "link"
- },
- {
- "id": "8f11c89c-1098-468e-9348-86268f1c97e0",
- "cellValue": "tab",
- "linkTarget": "parameter",
- "linkLabel": "Message Delivery rates",
- "subTarget": "delivery",
- "style": "link"
- },
- {
- "id": "18cbfbc7-0b07-4075-bd91-ccacd0ca7720",
- "cellValue": "tab",
- "linkTarget": "parameter",
- "linkLabel": "Opt-in & opt-out rates",
- "subTarget": "opt",
- "style": "link"
- },
- {
- "id": "339e38a6-37cc-4a0f-90cf-e33eda8e6c44",
- "cellValue": "tab",
- "linkTarget": "parameter",
- "linkLabel": "Response patterns",
- "subTarget": "patterns",
- "preText": "Overview",
- "style": "link"
- }
- ]
- },
- "name": "sms-tabs"
- },
- {
- "type": 9,
- "content": {
- "version": "KqlParameterItem/1.0",
- "parameters": [
- {
- "id": "0a691a68-d70c-4571-8ded-67541fb970db",
- "version": "KqlParameterItem/1.0",
- "name": "number_type",
- "label": "Number type",
- "type": 2,
- "isRequired": true,
- "multiSelect": true,
- "quote": "'",
- "delimiter": ",",
- "query": "ACSSMSIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| extend temp = case(NumberType <> '', NumberType, 'None')\r\n| extend NumberType = temp\r\n| distinct NumberType",
- "typeSettings": {
- "additionalResourceOptions": [
- "value::all"
- ],
- "showDefault": false
- },
- "defaultValue": "value::all",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "value": [
- "value::all"
- ]
- },
- {
- "id": "938da893-f132-445b-a8e6-355865a31d59",
- "version": "KqlParameterItem/1.0",
- "name": "country",
- "label": "Geo",
- "type": 2,
- "isRequired": true,
- "multiSelect": true,
- "quote": "'",
- "delimiter": ",",
- "query": "ACSSMSIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| extend temp = case(Country <> '', Country, 'UNKNOWN')\r\n| extend Country = temp\r\n| distinct Country",
- "typeSettings": {
- "additionalResourceOptions": [
- "value::all"
- ],
- "showDefault": false
- },
- "defaultValue": "value::all",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "value": [
- "value::all"
- ]
- },
- {
- "id": "19168ccb-20ac-46a7-9219-eca8134b40f4",
- "version": "KqlParameterItem/1.0",
- "name": "phone_number",
- "label": "Phone number",
- "type": 2,
- "isRequired": true,
- "multiSelect": true,
- "quote": "'",
- "delimiter": ",",
- "query": "ACSSMSIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| extend temp = case(PhoneNumber <> '', PhoneNumber, 'None')\r\n| extend PhoneNumber = temp\r\n| distinct PhoneNumber",
- "typeSettings": {
- "additionalResourceOptions": [
- "value::all"
- ]
- },
- "defaultValue": "value::all",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- }
- ],
- "style": "pills",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "name": "sms-params"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "items": [
- {
- "type": 1,
- "content": {
- "json": "**Average SMS count during the day**"
- },
- "name": "text - 1"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSSMSIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| where OperationName =='SMSDeliveryReportsReceived'\r\n| extend temp0 = case(NumberType <> '', NumberType, 'None')\r\n| extend NumberType = temp0\r\n| where NumberType in ({number_type})\r\n| extend temp0 = case(Country <> '', Country, 'UNKNOWN')\r\n| extend Country = temp0\r\n| where Country in ({country})\r\n| extend temp0 = case(PhoneNumber <> '', PhoneNumber, 'None')\r\n| extend PhoneNumber = temp0\r\n| where PhoneNumber in ({phone_number})\r\n| extend temp1 = case(ResultDescription in ('ErrorCode: 4005. ErrorMessage: Message is blocked by destination carrier',\r\n'ErrorCode: 4010. ErrorMessage: Message was blocked due to the toll-free number not being verified'), 'Blocked', ResultType)\r\n| extend ResultType = temp1\r\n| extend temp1 = case(ResultType == 'Succeeded', 'Delivered', ResultType)\r\n| extend ResultType = temp1\r\n| extend time_span = floor(TimeGenerated, 30m)\r\n| summarize event_count=count() by time_span, ResultType\r\n| extend time_span = todatetime(strcat(tostring(format_datetime(now(), 'yyyy-MM-dd')),'T', substring(tostring(time_span),11)))\r\n| summarize event_count=avg(event_count) by time_span, ResultType\r\n| union (\r\nACSSMSIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| where OperationName =='SMSMessagesReceived'\r\n| extend temp0 = case(NumberType <> '', NumberType, 'None')\r\n| extend NumberType = temp0\r\n| where NumberType in ({number_type})\r\n| where ResultSignature == '200'\r\n| extend ResultType = 'Received'\r\n| extend time_span = floor(TimeGenerated, 30m)\r\n| summarize event_count=count() by time_span, ResultType\r\n| extend time_span = todatetime(strcat(tostring(format_datetime(now(), 'yyyy-MM-dd')),'T', substring(tostring(time_span),11)))\r\n| summarize event_count=avg(event_count) by time_span, ResultType\r\n)\r\n| render columnchart\r\n",
- "size": 0,
- "aggregation": 3,
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "chartSettings": {
- "xSettings": {
- "numberFormatSettings": {
- "unit": 0,
- "options": {
- "style": "decimal",
- "useGrouping": true,
- "maximumFractionDigits": 0
- }
- }
- },
- "ySettings": {
- "numberFormatSettings": {
- "unit": 0,
- "options": {
- "style": "decimal",
- "useGrouping": true,
- "maximumFractionDigits": 0
- }
- }
- }
- }
- },
- "name": "sms-average-chart"
- }
- ]
- },
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "patterns"
- },
- "name": "sms-overview"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "SMS delivery rate",
- "items": [
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSSMSIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| where OperationName =='SMSDeliveryReportsReceived'\r\n| extend temp0 = case(NumberType <> '', NumberType, 'None')\r\n| extend NumberType = temp0\r\n| where NumberType in ({number_type})\r\n| extend temp0 = case(Country <> '', Country, 'UNKNOWN')\r\n| extend Country = temp0\r\n| where Country in ({country})\r\n| extend temp0 = case(PhoneNumber <> '', PhoneNumber, 'None')\r\n| extend PhoneNumber = temp0\r\n| where PhoneNumber in ({phone_number})\r\n| extend temp1 = case(ResultDescription in ('ErrorCode: 4005. ErrorMessage: Message is blocked by destination carrier',\r\n'ErrorCode: 4010. ErrorMessage: Message was blocked due to the toll-free number not being verified'), 'Blocked', ResultType)\r\n| extend ResultType = temp1\r\n| extend temp1 = case(ResultType == 'Succeeded', 'Delivered', ResultType)\r\n| extend ResultType = temp1\r\n| extend time_span = floor(TimeGenerated, 1d)\r\n| summarize event_count=count() by ResultType, time_span\r\n| project ResultType , time_span, event_count\r\n| extend DeliveryRate = case(ResultType == 'Delivered', event_count, 0)\r\n| extend BlockedRate = case(ResultType == 'Blocked', toint(event_count), 0)\r\n| extend FailedRate = case(ResultType == 'Failed', toint(event_count), 0)\r\n| extend Total = DeliveryRate + BlockedRate + FailedRate\r\n| summarize DeliveryRate = todouble(sum(DeliveryRate))/sum(Total), FailedRate = todouble(sum(FailedRate))/sum(Total), BlockedRate = todouble(sum(BlockedRate))/sum(Total) by time_span\r\n| render barchart",
- "size": 0,
- "aggregation": 3,
- "noDataMessage": "No results for given time range.",
- "exportFieldName": "series",
- "exportParameterName": "time_series",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "chartSettings": {
- "xSettings": {
- "numberFormatSettings": {
- "unit": 0,
- "options": {
- "style": "decimal",
- "useGrouping": true,
- "maximumFractionDigits": 0
- }
- }
- },
- "ySettings": {
- "numberFormatSettings": {
- "unit": 0,
- "options": {
- "style": "percent",
- "useGrouping": true,
- "minimumFractionDigits": 2
- }
- }
- }
- }
- },
- "name": "sms-delivery-rate-main"
- }
- ]
- },
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "delivery"
- },
- "name": "sms-delivery-rate"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "items": [
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSSMSIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| where OperationName =='SMSDeliveryReportsReceived'\r\n| extend temp0 = case(NumberType <> '', NumberType, 'None')\r\n| extend NumberType = temp0\r\n| where NumberType in ({number_type})\r\n| extend temp0 = case(Country <> '', Country, 'UNKNOWN')\r\n| extend Country = temp0\r\n| where Country in ({country})\r\n| extend temp0 = case(PhoneNumber <> '', PhoneNumber, 'None')\r\n| extend PhoneNumber = temp0\r\n| where PhoneNumber in ({phone_number})\r\n| extend temp1 = case(ResultDescription in ('ErrorCode: 4005. ErrorMessage: Message is blocked by destination carrier',\r\n'ErrorCode: 4010. ErrorMessage: Message was blocked due to the toll-free number not being verified'), 'Blocked', ResultType)\r\n| extend ResultType = temp1\r\n| extend temp1 = case(ResultType == 'Succeeded', 'Successfully Sent', ResultType)\r\n| extend ResultType = temp1\r\n| summarize event_count=count() by ResultType\r\n| project ResultType , event_count\r\n| render piechart",
- "size": 3,
- "title": "Total SMS sent",
- "noDataMessage": "No results for given time range.",
- "exportMultipleValues": true,
- "exportedParameters": [
- {
- "fieldName": "series",
- "parameterName": "delivery_result"
- }
- ],
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "customWidth": "33",
- "name": "sms-delivery-rate-main",
- "styleSettings": {
- "margin": "0",
- "padding": "0"
- }
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSSMSIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| where OperationName == 'SMSDeliveryReportsReceived'\r\n| extend temp0 = case(NumberType <> '', NumberType, 'None')\r\n| extend NumberType = temp0\r\n| where NumberType in ({number_type})\r\n| extend temp0 = case(Country <> '', Country, 'UNKNOWN')\r\n| extend Country = temp0\r\n| where Country in ({country})\r\n| extend temp0 = case(PhoneNumber <> '', PhoneNumber, 'None')\r\n| extend PhoneNumber = temp0\r\n| where PhoneNumber in ({phone_number})\r\n| extend temp1 = case(ResultDescription in ('ErrorCode: 4005. ErrorMessage: Message is blocked by destination carrier',\r\n'ErrorCode: 4010. ErrorMessage: Message was blocked due to the toll-free number not being verified'), 'Blocked', ResultType)\r\n| extend ResultType = temp1\r\n| where ResultType == 'Failed'\r\n| extend Description = substring(ResultDescription, 30)\r\n| summarize count_failures=count() by Description\r\n| render piechart",
- "size": 3,
- "title": "Failed SMS",
- "noDataMessage": "No results for given time range.",
- "exportMultipleValues": true,
- "exportedParameters": [
- {
- "fieldName": "series",
- "parameterName": "error",
- "parameterType": 1
- }
- ],
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "customWidth": "34",
- "conditionalVisibilities": [
- {
- "parameterName": "delivery_result",
- "comparison": "isNotEqualTo",
- "value": "\"Successfully Sent\",\"Blocked\""
- },
- {
- "parameterName": "delivery_result",
- "comparison": "isNotEqualTo",
- "value": "\"Blocked\",\"Successfully Sent\""
- },
- {
- "parameterName": "delivery_result",
- "comparison": "isNotEqualTo",
- "value": "\"Successfully Sent\""
- },
- {
- "parameterName": "delivery_result",
- "comparison": "isNotEqualTo",
- "value": "\"Blocked\""
- }
- ],
- "name": "sms-failed"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSSMSIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| where OperationName =='SMSDeliveryReportsReceived'\r\n| extend temp0 = case(NumberType <> '', NumberType, 'None')\r\n| extend NumberType = temp0\r\n| where NumberType in ({number_type})\r\n| extend temp0 = case(Country <> '', Country, 'UNKNOWN')\r\n| extend Country = temp0\r\n| where Country in ({country})\r\n| extend temp0 = case(PhoneNumber <> '', PhoneNumber, 'None')\r\n| extend PhoneNumber = temp0\r\n| where PhoneNumber in ({phone_number})\r\n| extend temp1 = case(ResultDescription in ('ErrorCode: 4005. ErrorMessage: Message is blocked by destination carrier',\r\n'ErrorCode: 4010. ErrorMessage: Message was blocked due to the toll-free number not being verified'), 'Blocked', ResultType)\r\n| extend ResultType = temp1\r\n| where ResultType == 'Blocked'\r\n| extend Description = substring(ResultDescription, 30)\r\n| summarize count_blocked = count() by Description\r\n| render piechart",
- "size": 3,
- "title": "Blocked SMS",
- "exportMultipleValues": true,
- "exportedParameters": [
- {
- "fieldName": "series",
- "parameterName": "blocked",
- "parameterType": 1
- }
- ],
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "customWidth": "33",
- "conditionalVisibilities": [
- {
- "parameterName": "delivery_result",
- "comparison": "isNotEqualTo",
- "value": "\"Failed\",\"Successfully Sent\""
- },
- {
- "parameterName": "delivery_result",
- "comparison": "isNotEqualTo",
- "value": "\"Successfully Sent\",\"Failed\""
- },
- {
- "parameterName": "delivery_result",
- "comparison": "isNotEqualTo",
- "value": "\"Successfully Sent\""
- },
- {
- "parameterName": "delivery_result",
- "comparison": "isNotEqualTo",
- "value": "\"Failed\""
- }
- ],
- "name": "sms-blocked"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSSMSIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| where OperationName == 'SMSDeliveryReportsReceived'\r\n| where ResultType == \"Succeeded\"\r\n| extend temp0 = case(NumberType <> '', NumberType, 'None')\r\n| extend NumberType = temp0\r\n| where NumberType in ({number_type})\r\n| extend temp0 = case(Country <> '', Country, 'UNKNOWN')\r\n| extend Country = temp0\r\n| where Country in ({country})\r\n| project TenantId, MessageId, TimeGenerated, OperationName, CorrelationId, ResultType, ResultDescription, DurationMs, PhoneNumber, NumberType, Country\r\n\r\n",
- "size": 0,
- "title": "Successfully sent logs",
- "showExportToExcel": true,
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "conditionalVisibilities": [
- {
- "parameterName": "delivery_result",
- "comparison": "isNotEqualTo",
- "value": ""
- },
- {
- "parameterName": "delivery_result",
- "comparison": "isNotEqualTo",
- "value": "\"Failed\""
- },
- {
- "parameterName": "delivery_result",
- "comparison": "isNotEqualTo",
- "value": "\"Blocked\""
- },
- {
- "parameterName": "delivery_result",
- "comparison": "isNotEqualTo",
- "value": "\"Failed\",\"Blocked\""
- },
- {
- "parameterName": "delivery_result",
- "comparison": "isNotEqualTo",
- "value": "\"Blocked\",\"Failed\""
- }
- ],
- "name": "sms-success-log"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSSMSIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| where OperationName == 'SMSDeliveryReportsReceived'\r\n| extend temp0 = case(NumberType <> '', NumberType, 'None')\r\n| extend NumberType = temp0\r\n| where NumberType in ({number_type})\r\n| extend temp0 = case(Country <> '', Country, 'UNKNOWN')\r\n| extend Country = temp0\r\n| where Country in ({country})\r\n| where substring(ResultDescription, 30) in({error})\r\n| project TenantId, MessageId, TimeGenerated, OperationName, CorrelationId, ResultType, ResultDescription, DurationMs, PhoneNumber, NumberType, Country\r\n\r\n",
- "size": 0,
- "title": "Error logs {error}",
- "showExportToExcel": true,
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "conditionalVisibility": {
- "parameterName": "error",
- "comparison": "isNotEqualTo"
- },
- "name": "sms-failed-log"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSSMSIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| where OperationName =='SMSDeliveryReportsReceived'\r\n| extend temp0 = case(NumberType <> '', NumberType, 'None')\r\n| extend NumberType = temp0\r\n| where NumberType in ({number_type})\r\n| extend temp0 = case(Country <> '', Country, 'UNKNOWN')\r\n| extend Country = temp0\r\n| where Country in ({country})\r\n| extend temp1 = case(ResultDescription in ('ErrorCode: 4005. ErrorMessage: Message is blocked by destination carrier',\r\n'ErrorCode: 4010. ErrorMessage: Message was blocked due to the toll-free number not being verified'), 'Blocked', ResultType)\r\n| extend ResultType = temp1\r\n| where ResultType == 'Blocked'\r\n| extend Description = substring(ResultDescription, 30)\r\n| where (ResultType == 'Blocked' and DurationMs <32 ) or (ResultType in ('Delivered','Failed'))\r\n| where substring(ResultDescription, 30) in ({blocked})\r\n| project TenantId, MessageId, TimeGenerated, OperationName, CorrelationId, ResultType, ResultDescription, DurationMs, PhoneNumber, NumberType, Country",
- "size": 0,
- "title": "Blocked logs {blocked}",
- "showExportToExcel": true,
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "conditionalVisibility": {
- "parameterName": "blocked",
- "comparison": "isNotEqualTo"
- },
- "name": "sms-blocked-log "
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSSMSIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| where OperationName =='SMSDeliveryReportsReceived'\r\n| extend temp0 = case(NumberType <> '', NumberType, 'None')\r\n| extend NumberType = temp0\r\n| where NumberType in ({number_type})\r\n| extend temp0 = case(Country <> '', Country, 'UNKNOWN')\r\n| extend Country = temp0\r\n| where Country in ({country})\r\n| extend temp0 = case(PhoneNumber <> '', PhoneNumber, 'None')\r\n| extend PhoneNumber = temp0\r\n| where PhoneNumber in ({phone_number})\r\n| summarize event_count=count() by Country\r\n| where Country !in ('UNKNOWN','Unknown')\r\n| project Country , event_count\r\n| render barchart",
- "size": 3,
- "title": "SMS by country",
- "noDataMessage": "No results for given time range.",
- "exportFieldName": "series",
- "exportParameterName": "country",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "name": "sms-country",
- "styleSettings": {
- "margin": "0",
- "padding": "0"
- }
- }
- ]
- },
- "customWidth": "0",
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "overview"
- },
- "name": "sms-overview",
- "styleSettings": {
- "margin": "0"
- }
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "items": [
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSSMSIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| where ResultDescription in ('OptIn', 'OptOut', 'OptHelp')\r\n| where NumberType in ({number_type})\r\n| extend temp0 = case(Country <> '', Country, 'UNKNOWN')\r\n| extend Country = temp0\r\n| where Country in ({country})\r\n| extend temp0 = case(PhoneNumber <> '', PhoneNumber, 'None')\r\n| extend PhoneNumber = temp0\r\n| where PhoneNumber in ({phone_number})\r\n| summarize Total=count() by ResultDescription\r\n| render piechart",
- "size": 3,
- "noDataMessage": "No Opt messages received",
- "exportMultipleValues": true,
- "exportedParameters": [
- {
- "fieldName": "series",
- "parameterName": "opt_value"
- }
- ],
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "name": "sms-opt-pie"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSSMSIncomingOperations\r\n| where TimeGenerated {time_range:query}\r\n| where ResultDescription in ({opt_value})\r\n| where NumberType in ({number_type})\r\n| extend temp0 = case(Country <> '', Country, 'UNKNOWN')\r\n| extend Country = temp0\r\n| where Country in ({country})\r\n| extend Direction = 'Inbound'\r\n| project OperationName = ResultDescription, TimeGenerated, Status=ResultType, PhoneNumber, Direction\r\n| render table",
- "size": 0,
- "title": "Logs for {opt_value}",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "conditionalVisibilities": [
- {
- "parameterName": "opt_value",
- "comparison": "isNotEqualTo"
- },
- {
- "parameterName": "opt_value",
- "comparison": "isNotEqualTo",
- "value": "\"Received with no OptIn, OptOut or OptHelp\""
- }
- ],
- "name": "sms-opt-logs"
- }
- ]
- },
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "opt"
- },
- "name": "sms-opt"
- }
- ]
- },
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "sms"
- },
- "name": "SMS-group"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "items": [
- {
- "type": 11,
- "content": {
- "version": "LinkItem/1.0",
- "style": "tabs",
- "links": [
- {
- "id": "8e2d5862-e7d0-4238-9b61-b1e2b7a0b541",
- "cellValue": "tab",
- "linkTarget": "parameter",
- "linkLabel": "Email Overview",
- "subTarget": "overview",
- "style": "link",
- "linkIsContextBlade": true
- },
- {
- "id": "7667d622-e3a3-46f9-98b4-ecd7f4deee3d",
- "cellValue": "tab",
- "linkTarget": "parameter",
- "linkLabel": "Email Performance",
- "subTarget": "performance",
- "style": "link"
- }
- ]
- },
- "name": "email_workbook_tabs"
- },
- {
- "type": 9,
- "content": {
- "version": "KqlParameterItem/1.0",
- "parameters": [
- {
- "id": "36134be5-8638-4f33-8fcc-0432d0b9cf63",
- "version": "KqlParameterItem/1.0",
- "name": "email_mailfrom",
- "label": "Mail From Address",
- "type": 2,
- "isRequired": true,
- "query": "let empty_sender = datatable(sender:string)[\"All senders\"];\r\nACSEmailStatusUpdateOperational \r\n| where OperationName == \"DeliveryStatusUpdate\" and isnotempty(DeliveryStatus)and isnotempty(RecipientId) and DeliveryStatus != \"OutForDelivery\" \r\n| summarize by sender=strcat(SenderUsername, '@', SenderDomain)\r\n| union (empty_sender | project tostring(sender))\r\n| extend sender_display = sender\r\n| extend IsSelected = (sender == \"All senders\")",
- "typeSettings": {
- "additionalResourceOptions": [],
- "showDefault": false
- },
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- }
- ],
- "style": "pills",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "name": "email_workbook_parameters"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSEmailStatusUpdateOperational \r\n| where OperationName == \"DeliveryStatusUpdate\" and isnotempty(DeliveryStatus) and DeliveryStatus != \"OutForDelivery\"\r\n| where ('{email_mailfrom:value}' == \"All senders\") or (strcat(SenderUsername, '@', SenderDomain) == '{email_mailfrom:value}')\r\n| summarize total=count(), successes=countif(DeliveryStatus == \"Delivered\")\r\n| extend rate=round(((successes * 100.0)/total),2)\r\n| extend label=\"Emails successfully delivered\", TotalMessage=strcat('out of ', total, ', ', rate,'% total Emails sent')",
- "size": 4,
- "timeContextFromParameter": "time_range",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "visualization": "tiles",
- "tileSettings": {
- "titleContent": {
- "columnMatch": "label",
- "formatter": 1
- },
- "leftContent": {
- "columnMatch": "successes",
- "formatter": 12,
- "formatOptions": {
- "palette": "none"
- }
- },
- "secondaryContent": {
- "columnMatch": "TotalMessage",
- "formatter": 1
- },
- "showBorder": true,
- "size": "full"
- }
- },
- "customWidth": "50",
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "performance"
- },
- "name": "email_performance_tile_success"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSEmailStatusUpdateOperational \r\n| where OperationName == \"DeliveryStatusUpdate\" and isnotempty(DeliveryStatus) and DeliveryStatus != \"OutForDelivery\"\r\n| where ('{email_mailfrom:value}' == \"All senders\") or (strcat(SenderUsername, '@', SenderDomain) == '{email_mailfrom:value}')\r\n| summarize total=count(), failures=countif(DeliveryStatus != \"Delivered\")\r\n| extend rate=round(((failures * 100.0)/total),2)\r\n| extend label=\"Emails failed\", TotalMessage=strcat('out of ', total, ', ', rate,'% total Emails sent')",
- "size": 4,
- "timeContextFromParameter": "time_range",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "visualization": "tiles",
- "tileSettings": {
- "titleContent": {
- "columnMatch": "label",
- "formatter": 1
- },
- "leftContent": {
- "columnMatch": "failures",
- "formatter": 12,
- "formatOptions": {
- "palette": "none"
- }
- },
- "secondaryContent": {
- "columnMatch": "TotalMessage",
- "formatter": 1
- },
- "showBorder": true,
- "size": "full"
- }
- },
- "customWidth": "50",
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "performance"
- },
- "name": "email_performance_tile_failed"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSEmailStatusUpdateOperational\r\n| where OperationName == \"DeliveryStatusUpdate\" and isnotempty(DeliveryStatus) and DeliveryStatus != \"OutForDelivery\"\r\n| where ('{email_mailfrom:value}' == \"All senders\") or (strcat(SenderUsername, '@', SenderDomain) == '{email_mailfrom:value}')\r\n| summarize total=count(), successes=countif(DeliveryStatus == \"Delivered\")\r\n| extend rate=round(((successes * 100.0)/total),2)\r\n| extend label=\"Emails successfully delivered\", TotalMessage=strcat('out of ', total, ', ', rate,'% total Emails sent')",
- "size": 4,
- "timeContextFromParameter": "time_range",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "visualization": "tiles",
- "tileSettings": {
- "titleContent": {
- "columnMatch": "label",
- "formatter": 1
- },
- "leftContent": {
- "columnMatch": "successes",
- "formatter": 12,
- "formatOptions": {
- "palette": "none"
- }
- },
- "secondaryContent": {
- "columnMatch": "TotalMessage",
- "formatter": 1
- },
- "showBorder": true,
- "size": "full"
- }
- },
- "customWidth": "33.3",
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "overview"
- },
- "name": "email_overview_tile_success",
- "styleSettings": {
- "margin": "4px"
- }
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSEmailStatusUpdateOperational \r\n| where OperationName == \"DeliveryStatusUpdate\" and isnotempty(DeliveryStatus) and DeliveryStatus != \"OutForDelivery\"\r\n| where ('{email_mailfrom:value}' == \"All senders\") or (strcat(SenderUsername, '@', SenderDomain) == '{email_mailfrom:value}')\r\n| summarize total=count(), failures=countif(DeliveryStatus != \"Delivered\" and DeliveryStatus != \"Suppressed\")\r\n| extend rate=round(((failures * 100.0)/total),2)\r\n| extend label=\"Emails failed\", TotalMessage=strcat('out of ', total, ', ', rate,'% total Emails sent')",
- "size": 4,
- "timeContextFromParameter": "time_range",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "visualization": "tiles",
- "tileSettings": {
- "titleContent": {
- "columnMatch": "label",
- "formatter": 1,
- "tooltipFormat": {
- "tooltip": "Failed count represents the number of emails that didn’t get delivered to the recipient for various reasons"
- }
- },
- "leftContent": {
- "columnMatch": "failures",
- "formatter": 12,
- "formatOptions": {
- "palette": "none"
- }
- },
- "secondaryContent": {
- "columnMatch": "TotalMessage",
- "formatter": 1,
- "tooltipFormat": {
- "tooltip": "Failed count represents the number of emails that didn’t get delivered to the recipient for various reasons"
- }
- },
- "showBorder": true,
- "size": "full"
- }
- },
- "customWidth": "33.3",
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "overview"
- },
- "name": "email_overview_tile_failed",
- "styleSettings": {
- "margin": "4px"
- }
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let totalcount = toscalar(ACSEmailStatusUpdateOperational \r\n| where ('{email_mailfrom:value}' == \"All senders\") or (strcat(SenderUsername, '@', SenderDomain) == '{email_mailfrom:value}')\r\n| where OperationName == \"DeliveryStatusUpdate\" and isnotempty(DeliveryStatus) and DeliveryStatus != \"OutForDelivery\"| summarize value=count());\r\nlet failed = ACSEmailStatusUpdateOperational \r\n| where OperationName == \"DeliveryStatusUpdate\" and isnotempty(DeliveryStatus) and DeliveryStatus != \"OutForDelivery\"\r\n| where ('{email_mailfrom:value}' == \"All senders\") or (strcat(SenderUsername, '@', SenderDomain) == '{email_mailfrom:value}')\r\n| where DeliveryStatus != \"Delivered\" | summarize value=count() | extend label=\"Emails failed\", TotalMessage=strcat('out of ', totalcount, ' total Emails sent'), icon='error';\r\nlet suppressed = ACSEmailStatusUpdateOperational \r\n| where OperationName == \"DeliveryStatusUpdate\" and isnotempty(DeliveryStatus) and DeliveryStatus != \"OutForDelivery\"\r\n| where ('{email_mailfrom:value}' == \"All senders\") or (strcat(SenderUsername, '@', SenderDomain) == '{email_mailfrom:value}')\r\n| where DeliveryStatus == \"Suppressed\" | summarize value=count() | extend label=\"Suppressed\", TotalMessage=strcat('out of ', totalcount, ' total Emails sent'), icon='none';\r\nsuppressed",
- "size": 4,
- "timeContextFromParameter": "time_range",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "visualization": "tiles",
- "tileSettings": {
- "titleContent": {
- "columnMatch": "label",
- "formatter": 1
- },
- "leftContent": {
- "columnMatch": "value",
- "formatter": 12,
- "formatOptions": {
- "palette": "none",
- "compositeBarSettings": {
- "labelText": "",
- "columnSettings": [
- {
- "columnName": "icon",
- "color": "blue"
- },
- {
- "columnName": "label",
- "color": "blue"
- }
- ]
- }
- },
- "numberFormat": {
- "unit": 17,
- "options": {
- "style": "decimal",
- "maximumFractionDigits": 3,
- "maximumSignificantDigits": 6
- }
- },
- "tooltipFormat": {
- "tooltip": "Suppressed count represents the number of recipients who expressed interest and agreed to receive email messages from you but has no valid mailbox with that address anymore or opt-out of receiving emails from you."
- }
- },
- "secondaryContent": {
- "columnMatch": "TotalMessage",
- "formatter": 1
- },
- "showBorder": true,
- "size": "full"
- }
- },
- "customWidth": "33.3",
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "overview"
- },
- "name": "email_overview_tile_suppressed",
- "styleSettings": {
- "margin": "4px"
- }
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let all = ACSEmailStatusUpdateOperational \r\n| where OperationName == \"DeliveryStatusUpdate\" and isnotempty(DeliveryStatus) and DeliveryStatus != \"OutForDelivery\"\r\n| where ('{email_mailfrom:value}' == \"All senders\") or (strcat(SenderUsername, '@', SenderDomain) == '{email_mailfrom:value}')\r\n| project DeliveryStatus, ts=bin(TimeGenerated, iif(\"{time_granularity:label}\" == \"\", 4h, totimespan(\"{time_granularity:value}\")));\r\nall | summarize \r\n total=count(),\r\n success=countif(DeliveryStatus == \"Delivered\"),\r\n failures=countif(DeliveryStatus != \"Delivered\")\r\n by ts",
- "size": 0,
- "noDataMessage": "This view requires to enable the Diagnostic setting as a pre-requisite. Please follow the instructions on this page to do so: https://learn.microsoft.com/en-us/azure/communication-services/concepts/analytics/enable-logging. Make sure to select these logs: \"Email Service Delivery Status Update Logs\", \"Email Service Send Mail logs\", \"Email Service User Engagement Logs\".",
- "timeContextFromParameter": "time_range",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "visualization": "linechart",
- "chartSettings": {
- "xAxis": "ts",
- "yAxis": [
- "failures",
- "success",
- "total"
- ],
- "showLegend": true,
- "seriesLabelSettings": [
- {
- "seriesName": "total",
- "label": "Total emails sent",
- "color": "magenta"
- },
- {
- "seriesName": "success",
- "label": "Successfully delivered emails",
- "color": "greenDark"
- },
- {
- "seriesName": "failures",
- "label": "Failed emails",
- "color": "orange"
- }
- ],
- "showDataPoints": true,
- "ySettings": {
- "numberFormatSettings": {
- "unit": 0,
- "options": {
- "style": "decimal",
- "useGrouping": true,
- "minimumSignificantDigits": 1,
- "maximumSignificantDigits": 21
- }
- }
- }
- }
- },
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "overview"
- },
- "name": "email_overview_linechart_rates",
- "styleSettings": {
- "padding": "0"
- }
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSEmailStatusUpdateOperational \r\n| where DeliveryStatus == \"Quarantined\"\r\n| where ('{email_mailfrom:value}' == \"All senders\") or (strcat(SenderUsername, '@', SenderDomain) == '{email_mailfrom:value}')\r\n| summarize value=count() | extend label=\"Emails quarantined\"\r\n",
- "size": 4,
- "timeContextFromParameter": "time_range",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "visualization": "tiles",
- "tileSettings": {
- "titleContent": {
- "columnMatch": "label",
- "formatter": 1
- },
- "leftContent": {
- "columnMatch": "value",
- "formatter": 12,
- "formatOptions": {
- "palette": "none",
- "compositeBarSettings": {
- "labelText": "",
- "columnSettings": [
- {
- "columnName": "icon",
- "color": "blue"
- },
- {
- "columnName": "label",
- "color": "blue"
- }
- ]
- }
- },
- "numberFormat": {
- "unit": 17,
- "options": {
- "style": "decimal",
- "maximumFractionDigits": 3,
- "maximumSignificantDigits": 6
- }
- }
- },
- "secondaryContent": {
- "columnMatch": "TotalMessage",
- "formatter": 1
- },
- "showBorder": true,
- "size": "full"
- }
- },
- "customWidth": "25",
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "overview"
- },
- "name": "email_overview_tile_quarantined"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSEmailStatusUpdateOperational \r\n| where ('{email_mailfrom:value}' == \"All senders\") or (strcat(SenderUsername, '@', SenderDomain) == '{email_mailfrom:value}')\r\n| where OperationName == \"DeliveryStatusUpdate\" and isnotempty(DeliveryStatus) and DeliveryStatus == \"Failed\" and IsHardBounce == true\r\n| summarize value=count() | extend label=\"Emails bounced\"\r\n",
- "size": 4,
- "timeContextFromParameter": "time_range",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "visualization": "tiles",
- "tileSettings": {
- "titleContent": {
- "columnMatch": "label",
- "formatter": 1
- },
- "leftContent": {
- "columnMatch": "value",
- "formatter": 12,
- "formatOptions": {
- "palette": "none",
- "compositeBarSettings": {
- "labelText": "",
- "columnSettings": [
- {
- "columnName": "icon",
- "color": "blue"
- },
- {
- "columnName": "label",
- "color": "blue"
- }
- ]
- }
- },
- "numberFormat": {
- "unit": 17,
- "options": {
- "style": "decimal",
- "maximumFractionDigits": 3,
- "maximumSignificantDigits": 6
- }
- }
- },
- "secondaryContent": {
- "columnMatch": "TotalMessage",
- "formatter": 1
- },
- "showBorder": true,
- "size": "full"
- }
- },
- "customWidth": "25",
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "overview"
- },
- "name": "email_overview_tile_bounced"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSEmailUserEngagementOperational\r\n| where EngagementType == \"View\"\r\n| summarize value=count() | extend label=\"Emails viewed\"\r\n",
- "size": 4,
- "timeContextFromParameter": "time_range",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "visualization": "tiles",
- "tileSettings": {
- "titleContent": {
- "columnMatch": "label",
- "formatter": 1
- },
- "leftContent": {
- "columnMatch": "value",
- "formatter": 12,
- "formatOptions": {
- "palette": "none",
- "compositeBarSettings": {
- "labelText": "",
- "columnSettings": [
- {
- "columnName": "icon",
- "color": "blue"
- },
- {
- "columnName": "label",
- "color": "blue"
- }
- ]
- }
- },
- "numberFormat": {
- "unit": 17,
- "options": {
- "style": "decimal",
- "maximumFractionDigits": 3,
- "maximumSignificantDigits": 6
- }
- }
- },
- "secondaryContent": {
- "columnMatch": "TotalMessage",
- "formatter": 1
- },
- "showBorder": true,
- "size": "full"
- }
- },
- "customWidth": "25",
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "overview"
- },
- "name": "email_overview_tile_viewed"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSEmailUserEngagementOperational\r\n| where EngagementType == \"Click\"\r\n| summarize value=count() | extend label=\"Emails clicked\"\r\n",
- "size": 4,
- "timeContextFromParameter": "time_range",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "visualization": "tiles",
- "tileSettings": {
- "titleContent": {
- "columnMatch": "label",
- "formatter": 1
- },
- "leftContent": {
- "columnMatch": "value",
- "formatter": 12,
- "formatOptions": {
- "palette": "none",
- "compositeBarSettings": {
- "labelText": "",
- "columnSettings": [
- {
- "columnName": "icon",
- "color": "blue"
- },
- {
- "columnName": "label",
- "color": "blue"
- }
- ]
- }
- },
- "numberFormat": {
- "unit": 17,
- "options": {
- "style": "decimal",
- "maximumFractionDigits": 3,
- "maximumSignificantDigits": 6
- }
- }
- },
- "secondaryContent": {
- "columnMatch": "TotalMessage",
- "formatter": 1
- },
- "showBorder": true,
- "size": "full"
- }
- },
- "customWidth": "25",
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "overview"
- },
- "name": "email_overview_tile_clicked"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSEmailStatusUpdateOperational \r\n| where OperationName == \"DeliveryStatusUpdate\" and isnotempty(DeliveryStatus) and DeliveryStatus != \"OutForDelivery\"\r\n| where ('{email_mailfrom:value}' == \"All senders\") or (strcat(SenderUsername, '@', SenderDomain) == '{email_mailfrom:value}')\r\n| extend ts=bin(TimeGenerated, iif(\"{time_granularity:label}\" == \"\", 4h, totimespan(\"{time_granularity:value}\")))\r\n| summarize successRate=((countif(DeliveryStatus == \"Delivered\") * 100.0)/count()) by ts;",
- "size": 1,
- "noDataMessage": "This view requires to enable the Diagnostic setting as a pre-requisite. Please follow the instructions on this page to do so: https://learn.microsoft.com/en-us/azure/communication-services/concepts/analytics/enable-logging. Make sure to select these logs: \"Email Service Delivery Status Update Logs\", \"Email Service Send Mail logs\", \"Email Service User Engagement Logs\".",
- "aggregation": 3,
- "title": "Delivery Success Rate",
- "timeContextFromParameter": "time_range",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "visualization": "linechart",
- "tileSettings": {
- "titleContent": {
- "columnMatch": "label",
- "formatter": 1
- },
- "leftContent": {
- "columnMatch": "icon",
- "formatter": 11,
- "formatOptions": {
- "compositeBarSettings": {
- "labelText": "",
- "columnSettings": [
- {
- "columnName": "icon",
- "color": "blue"
- },
- {
- "columnName": "TotalMessage",
- "color": "blue"
- },
- {
- "columnName": "value",
- "color": "blue"
- }
- ]
- }
- },
- "numberFormat": {
- "unit": 0,
- "options": {
- "style": "decimal"
- }
- },
- "tooltipFormat": {
- "tooltip": "This is a tooltip."
- }
- },
- "rightContent": {
- "columnMatch": "value",
- "formatter": 12,
- "formatOptions": {
- "palette": "blue"
- }
- },
- "secondaryContent": {
- "columnMatch": "TotalMessage",
- "formatter": 1
- },
- "showBorder": true,
- "size": "full"
- },
- "chartSettings": {
- "xAxis": "ts",
- "yAxis": [
- "successRate"
- ],
- "seriesLabelSettings": [
- {
- "seriesName": "successRate",
- "label": "Success Rate",
- "color": "blue"
- }
- ],
- "ySettings": {
- "max": 100
- }
- }
- },
- "customWidth": "100",
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "performance"
- },
- "name": "email_performance_linechart_successrate",
- "styleSettings": {
- "showBorder": true
- }
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let cvids = ACSEmailStatusUpdateOperational\r\n| where OperationName == \"DeliveryStatusUpdate\" and isnotempty(DeliveryStatus) and DeliveryStatus != \"OutForDelivery\"\r\n| where ('{email_mailfrom:value}' == \"All senders\") or (strcat(SenderUsername, '@', SenderDomain) == '{email_mailfrom:value}')\r\n| summarize by CorrelationId;\r\nACSEmailSendMailOperational\r\n| join cvids on CorrelationId\r\n| extend sizeForAllRecipients=(Size * UniqueRecipientsCount)\r\n| summarize sizeForAllRecipients=sum(sizeForAllRecipients) by bin(TimeGenerated, iif(\"{time_granularity:label}\" == \"\", 4h, totimespan(\"{time_granularity:value}\")))",
- "size": 0,
- "noDataMessage": "This view requires to enable the Diagnostic setting as a pre-requisite. Please follow the instructions on this page to do so: https://learn.microsoft.com/en-us/azure/communication-services/concepts/analytics/enable-logging. Make sure to select these logs: \"Email Service Delivery Status Update Logs\", \"Email Service Send Mail logs\", \"Email Service User Engagement Logs\".",
- "title": "Total Size For Emails Sent",
- "timeContextFromParameter": "time_range",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "visualization": "barchart",
- "tileSettings": {
- "titleContent": {
- "columnMatch": "label",
- "formatter": 1
- },
- "leftContent": {
- "columnMatch": "value",
- "formatter": 12,
- "formatOptions": {
- "palette": "none",
- "compositeBarSettings": {
- "labelText": "",
- "columnSettings": [
- {
- "columnName": "icon",
- "color": "blue"
- },
- {
- "columnName": "label",
- "color": "blue"
- }
- ]
- }
- },
- "numberFormat": {
- "unit": 17,
- "options": {
- "style": "decimal",
- "maximumFractionDigits": 3,
- "maximumSignificantDigits": 6
- }
- }
- },
- "secondaryContent": {
- "columnMatch": "TotalMessage",
- "formatter": 1
- },
- "showBorder": true,
- "size": "full"
- },
- "chartSettings": {
- "seriesLabelSettings": [
- {
- "seriesName": "sizeForAllRecipients",
- "label": "Size Per Email Sent",
- "color": "grayBlue"
- }
- ]
- }
- },
- "customWidth": "50",
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "overview"
- },
- "name": "email_overview_barchart_size",
- "styleSettings": {
- "showBorder": true
- }
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let cvids = ACSEmailStatusUpdateOperational\r\n| where OperationName == \"DeliveryStatusUpdate\" and isnotempty(DeliveryStatus) and DeliveryStatus != \"OutForDelivery\"\r\n| where ('{email_mailfrom:value}' == \"All senders\") or (strcat(SenderUsername, '@', SenderDomain) == '{email_mailfrom:value}')\r\n| summarize by CorrelationId;\r\nACSEmailSendMailOperational\r\n| join cvids on CorrelationId\r\n| extend sizeForAllRecipients=(Size * UniqueRecipientsCount)\r\n| summarize totalMessages=dcount(CorrelationId) by bin(TimeGenerated, iif(\"{time_granularity:label}\" == \"\", 4h, totimespan(\"{time_granularity:value}\")))",
- "size": 0,
- "noDataMessage": "This view requires to enable the Diagnostic setting as a pre-requisite. Please follow the instructions on this page to do so: https://learn.microsoft.com/en-us/azure/communication-services/concepts/analytics/enable-logging. Make sure to select these logs: \"Email Service Delivery Status Update Logs\", \"Email Service Send Mail logs\", \"Email Service User Engagement Logs\".",
- "title": "Total Emails Sent",
- "timeContextFromParameter": "time_range",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "visualization": "barchart",
- "tileSettings": {
- "titleContent": {
- "columnMatch": "label",
- "formatter": 1
- },
- "leftContent": {
- "columnMatch": "value",
- "formatter": 12,
- "formatOptions": {
- "palette": "none",
- "compositeBarSettings": {
- "labelText": "",
- "columnSettings": [
- {
- "columnName": "icon",
- "color": "blue"
- },
- {
- "columnName": "label",
- "color": "blue"
- }
- ]
- }
- },
- "numberFormat": {
- "unit": 17,
- "options": {
- "style": "decimal",
- "maximumFractionDigits": 3,
- "maximumSignificantDigits": 6
- }
- }
- },
- "secondaryContent": {
- "columnMatch": "TotalMessage",
- "formatter": 1
- },
- "showBorder": true,
- "size": "full"
- },
- "chartSettings": {
- "seriesLabelSettings": [
- {
- "seriesName": "totalMessages",
- "label": "Total Emails",
- "color": "grayBlue",
- "comment": "Thisis a comment"
- }
- ]
- }
- },
- "customWidth": "50",
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "overview"
- },
- "name": "email_overview_barchart_totalemails",
- "styleSettings": {
- "showBorder": true
- }
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": " ACSEmailStatusUpdateOperational \r\n| where OperationName == \"DeliveryStatusUpdate\" and isnotempty(DeliveryStatus) and DeliveryStatus != \"OutForDelivery\" and DeliveryStatus != \"Delivered\"\r\n| where ('{email_mailfrom:value}' == \"All senders\") or (strcat(SenderUsername, '@', SenderDomain) == '{email_mailfrom:value}')\r\n| summarize value=count() by DeliveryStatus=iff(DeliveryStatus != \"Failed\", DeliveryStatus, iff(tobool(IsHardBounce), \"Failed (hard bounce)\", \"Failed\")), ts=bin(TimeGenerated, 5m)",
- "size": 3,
- "noDataMessage": "This view requires to enable the Diagnostic setting as a pre-requisite. Please follow the instructions on this page to do so: https://learn.microsoft.com/en-us/azure/communication-services/concepts/analytics/enable-logging. Make sure to select these logs: \"Email Service Delivery Status Update Logs\", \"Email Service Send Mail logs\", \"Email Service User Engagement Logs\".",
- "title": "Error Summary",
- "color": "blueDarkDark",
- "timeContextFromParameter": "time_range",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "visualization": "piechart",
- "chartSettings": {
- "xAxis": "ts"
- }
- },
- "customWidth": "50",
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "performance"
- },
- "name": "email_performance_piechart_errors",
- "styleSettings": {
- "padding": "8px",
- "maxWidth": "50",
- "showBorder": true
- }
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": " ACSEmailStatusUpdateOperational \r\n| where OperationName == \"DeliveryStatusUpdate\" and isnotempty(DeliveryStatus) and DeliveryStatus !in (\"Delivered\", \"OutForDelivery\")\r\n| where ('{email_mailfrom:value}' == \"All senders\") or (strcat(SenderUsername, '@', SenderDomain) == '{email_mailfrom:value}')\r\n| summarize value=count() by SmtpStatusCode, EnhancedSmtpStatusCode",
- "size": 1,
- "noDataMessage": "This view requires to enable the Diagnostic setting as a pre-requisite. Please follow the instructions on this page to do so: https://learn.microsoft.com/en-us/azure/communication-services/concepts/analytics/enable-logging. Make sure to select these logs: \"Email Service Delivery Status Update Logs\", \"Email Service Send Mail logs\", \"Email Service User Engagement Logs\".",
- "title": "Error Code Details",
- "color": "blueDarkDark",
- "timeContextFromParameter": "email_time",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "visualization": "table",
- "gridSettings": {
- "labelSettings": [
- {
- "columnId": "SmtpStatusCode",
- "label": "SMTP Status Code"
- },
- {
- "columnId": "EnhancedSmtpStatusCode",
- "label": "Enhanced SMTP"
- },
- {
- "columnId": "value",
- "label": "Total"
- }
- ]
- },
- "chartSettings": {
- "xAxis": "ts",
- "group": "SmtpStatusCode",
- "createOtherGroup": null
- }
- },
- "customWidth": "50",
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "performance"
- },
- "name": "email_performance_table_errordetails",
- "styleSettings": {
- "padding": "8px",
- "maxWidth": "50",
- "showBorder": true
- }
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSEmailStatusUpdateOperational \r\n| where OperationName == \"DeliveryStatusUpdate\" and isnotempty(DeliveryStatus) and DeliveryStatus != \"OutForDelivery\"\r\n| where ('{email_mailfrom:value}' == \"All senders\") or (strcat(SenderUsername, '@', SenderDomain) == '{email_mailfrom:value}')\r\n| project Id=CorrelationId, [\"Mail To Address\"]=RecipientId, [\"Mail From Address\"]=strcat(SenderUsername, \"@\", SenderDomain), DeliveryStatus, Status=iff(DeliveryStatus == \"Delivered\", \"success\", \"error\"), [\"Date Sent\"]=TimeGenerated",
- "size": 0,
- "noDataMessage": "This view requires to enable the Diagnostic setting as a pre-requisite. Please follow the instructions on this page to do so: https://learn.microsoft.com/en-us/azure/communication-services/concepts/analytics/enable-logging. Make sure to select these logs: \"Email Service Delivery Status Update Logs\", \"Email Service Send Mail logs\", \"Email Service User Engagement Logs\".",
- "title": "Per-recipient Delivery Details",
- "timeContextFromParameter": "time_range",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "visualization": "table",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Status",
- "formatter": 11
- }
- ],
- "rowLimit": 500,
- "filter": true
- }
- },
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "performance"
- },
- "name": "email_performance_table_details",
- "styleSettings": {
- "margin": "8px",
- "padding": "8px"
- }
- }
- ]
- },
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "email"
- },
- "name": "Email-group"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "items": [
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Number of Recordings per {time_granularity} UTC",
- "items": [
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSCallRecordingSummary\r\n| where TimeGenerated {time_range:query}\r\n| extend time_span = floor(TimeGenerated, {time_granularity})\r\n| summarize recordings=count() by time_span\r\n| render barchart\r\n\r\n",
- "size": 0,
- "noDataMessage": "No recordings found in the specified time range",
- "exportedParameters": [
- {
- "fieldName": "",
- "parameterName": "recordings_day",
- "parameterType": 1
- },
- {
- "fieldName": "x",
- "parameterName": "timebin",
- "parameterType": 1
- }
- ],
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "sortBy": []
- },
- "name": "recordings-day"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "let recordings_results = todynamic('{recordings_day}');\r\nACSCallRecordingSummary\r\n| extend OperationDate=strcat(\"📅\", format_datetime(TimeGenerated, 'MM/dd/y'))\r\n| where TimeGenerated between (todatetime(recordings_results.x) .. {time_granularity})\r\n\r\n\r\n\r\n\r\n\r\n",
- "size": 0,
- "title": "Recordings within selected TimeBin ",
- "noDataMessage": "No recordings found for the specified time range",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
- },
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "OperationDate",
- "formatter": 5
- },
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- }
- },
- "sortBy": []
- },
- "conditionalVisibility": {
- "parameterName": "recordings_day",
- "comparison": "isNotEqualTo"
- },
- "name": "recordings-by-date"
- }
- ]
- },
- "customWidth": "100",
- "name": "recordings-day-group"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Recording Duration in Hours per {time_granularity} UTC",
- "items": [
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSCallRecordingSummary\r\n| where TimeGenerated {time_range:query}\r\n| extend time_span = floor(TimeGenerated, {time_granularity})\r\n| summarize recordings=sum(RecordingLength)/3600 by time_span\r\n| render barchart\r\n\r\n",
- "size": 0,
- "noDataMessage": "No recordings found in the specified time range",
- "exportedParameters": [
- {
- "fieldName": "",
- "parameterName": "recordings_day",
- "parameterType": 1
- },
- {
- "fieldName": "x",
- "parameterName": "timebin",
- "parameterType": 1
- }
- ],
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "sortBy": []
- },
- "name": "recordings-day"
- }
- ]
- },
- "customWidth": "100",
- "name": "recordings-hours-day-group"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Recording Usage by Format",
- "items": [
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSCallRecordingSummary\r\n| where TimeGenerated {time_range:query}\r\n| summarize count() by FormatType\r\n| render piechart",
- "size": 0,
- "noDataMessage": "No recordings found in the specified time range",
- "exportMultipleValues": true,
- "exportedParameters": [
- {
- "fieldName": "series",
- "parameterName": "recordings_format",
- "parameterType": 1
- }
- ],
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "name": "recordings-format"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSCallRecordingSummary\r\n| where TimeGenerated {time_range:query}\r\n| where FormatType in ({recordings_format})\r\n| extend OperationDate=strcat(\"📅\", format_datetime(TimeGenerated, 'MM/dd/y'))",
- "size": 0,
- "title": "Recordings with Format {recordings_format}",
- "noDataMessage": "No recordings found for the specified time range and format",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
- },
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "OperationDate",
- "formatter": 5
- },
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- },
- "sortBy": [
- {
- "itemKey": "$gen_count_$gen_group_0",
- "sortOrder": 2
- }
- ]
- },
- "sortBy": [
- {
- "itemKey": "$gen_count_$gen_group_0",
- "sortOrder": 2
- }
- ]
- },
- "conditionalVisibility": {
- "parameterName": "recordings_format",
- "comparison": "isNotEqualTo"
- },
- "name": "recordings-by-format"
- }
- ]
- },
- "customWidth": "50",
- "name": "recordings-format"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Recording Usage by Channel",
- "items": [
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSCallRecordingSummary\r\n| where TimeGenerated {time_range:query}\r\n| summarize count() by ChannelType\r\n| render piechart",
- "size": 0,
- "noDataMessage": "No recordings found in the specified time range",
- "exportMultipleValues": true,
- "exportedParameters": [
- {
- "fieldName": "series",
- "parameterName": "recordings_channel",
- "parameterType": 1
- }
- ],
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "name": "recordings-channel"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSCallRecordingSummary\r\n| where TimeGenerated {time_range:query}\r\n| where ChannelType in ({recordings_channel})\r\n| extend OperationDate=strcat(\"📅\", format_datetime(TimeGenerated, 'MM/dd/y'))",
- "size": 0,
- "title": "Recordings with Channel {recordings_channel}",
- "noDataMessage": "No recordings found for the specified time range and format",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
- },
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "OperationDate",
- "formatter": 5
- },
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- },
- "sortBy": [
- {
- "itemKey": "$gen_count_$gen_group_0",
- "sortOrder": 2
- }
- ]
- },
- "sortBy": [
- {
- "itemKey": "$gen_count_$gen_group_0",
- "sortOrder": 2
- }
- ]
- },
- "conditionalVisibility": {
- "parameterName": "recordings_channel",
- "comparison": "isNotEqualTo"
- },
- "name": "recordings-by-channel"
- }
- ]
- },
- "customWidth": "50",
- "name": "recordings-channel"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Number of Recordings per Call",
- "items": [
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSCallRecordingSummary\r\n| where TimeGenerated {time_range:query}\r\n| distinct CorrelationId, RecordingId\r\n| summarize recordings_by_session = count() by CorrelationId\r\n| summarize count() by bin(recordings_by_session, 1)\r\n| render columnchart\r\n\r\n\r\n",
- "size": 0,
- "noDataMessage": "No recordings found in the specified time range",
- "exportMultipleValues": true,
- "exportedParameters": [
- {
- "fieldName": "series",
- "parameterName": "recordingsession",
- "parameterType": 1
- }
- ],
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "name": "recordings-session"
- }
- ]
- },
- "customWidth": "50",
- "name": "recordings-per-session-group "
- }
- ]
- },
- "conditionalVisibility": {
- "parameterName": "tab",
- "comparison": "isEqualTo",
- "value": "recording"
- },
- "name": "Recording-group"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "items": [
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Summary",
- "items": [
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSCallAutomationIncomingOperations \r\n| where TimeGenerated {time_range:query} \r\n| summarize Calls = count_distinct(CorrelationId) ",
- "size": 0,
- "title": "Count of Calls",
- "noDataMessage": "No operations found for the specified time range and OperationName",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "crossComponentResources": [],
- "visualization": "tiles",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
+ "conditionalVisibility": {
+ "parameterName": "selected_subcode",
+ "comparison": "isNotEqualTo"
},
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "OperationDate",
- "formatter": 5
- },
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- },
- "sortBy": [
- {
- "itemKey": "$gen_count_$gen_group_0",
- "sortOrder": 2
- }
- ]
- },
- "sortBy": [
- {
- "itemKey": "$gen_count_$gen_group_0",
- "sortOrder": 2
- }
- ],
- "tileSettings": {
- "titleContent": {
- "formatter": 1
- },
- "leftContent": {
- "columnMatch": "Calls",
- "formatter": 12,
- "formatOptions": {
- "palette": "blueGreen"
- },
- "numberFormat": {
- "unit": 17,
- "options": {
- "style": "decimal",
- "maximumFractionDigits": 2
- }
- }
- },
- "showBorder": true,
- "sortCriteriaField": "Calls"
- },
- "textSettings": {
- "style": "bignumber"
- }
- },
- "customWidth": "33",
- "name": "count-operations-details"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSCallAutomationIncomingOperations \r\n| where TimeGenerated {time_range:query} \r\n| summarize Operations = count()",
- "size": 0,
- "title": "Count of Operations",
- "noDataMessage": "No operations found for the specified time range and OperationName",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "crossComponentResources": [],
- "visualization": "tiles",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
+ "name": "Call Diagnostics shout up"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let metricsMetadata = () {\n\tdatatable (\n metricName: string, \n metadataValidAsOf: datetime, \n enabled: bool, \n targetThresholdLeg: real, \n cmpOperatorLeg: string, \n aggregLegRounding: int, \n aggregLegUnit: string, \n description: string, \n priority: int\n ) \n [\n\t\t\t\"reliability/StopVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StopVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/StopScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StopScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/StartVideo\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartScreenShare\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/api/StartAudio\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/StartAudio\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/EnterCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/EnterCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/CreateView\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/CreateView\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/CallAgentInit\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"reliability/api/CallAgentInit\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/api/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(0),\n\t\t\t\"reliability/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t\t\"performance/api/StartCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(5000),\"<=\",int(1),\"ms\", \"\", int(0),\n\t\t\t\"performance/api/AcceptIncomingCall\",datetime(2021-01-01T00:00:00Z),bool(true),real(5000),\"<=\",int(1),\"ms\", \"\", int(0),\n\t\t\t\"performance/api/Join\",datetime(2021-01-01T00:00:00Z),bool(true),real(5000),\"<=\",int(1),\"ms\", \"\", int(0),\n\t\t] \n | where enabled\n};\nlet SubCodes = datatable(\n message: string,\n webConfig_overrideMessage: string,\n webConfig_legacyMessage: string,\n nativeConfig_overrideMessage: string,\n code: real,\n subCode: string,\n resultCategories: string,\n clientOrService: string\n)[\n \"Failed to initialize CallClient. Please try again, if issue persists, gather browser console logs, and contact Azure Communication Services support.\", \"\", \"Failed to initialize CallClient\", \"\", \"500\", \"40000\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent. Please try again, if issue persists, gather browser console logs, and contact Azure Communication Services support.\", \"\", \"Failed to create CallAgent\", \"\", \"409\", \"40001\", \"UnexpectedClientError\", \"client\",\n \"Failed to create TeamsCallAgent. Please try again, if issue persists, gather browser console logs, and contact Azure Communication Services support.\", \"\", \"Failed to create TeamsCallAgent\", \"\", \"409\", \"40002\", \"UnexpectedClientError\", \"client\",\n \"Failed to create a URL object with the ICE server URL provided.\", \"\", \"Error processing relay information. Possibly invalid url: {0}\", \"\", \"400\", \"40003\", \"ExpectedError\", \"client\",\n \"The ICE server url must contain 'turn', 'turns', or 'stun'.\", \"\", \"Error processing relay information. Unrecognized schema\", \"\", \"400\", \"40004\", \"ExpectedError\", \"client\",\n \"Failed setup proxy, the url is too short\", \"\", \"\", \"\", \"400\", \"40005\", \"ExpectedError\", \"client\",\n \"Failed setup proxy, the protocol is not https or http\", \"\", \"\", \"\", \"400\", \"40006\", \"ExpectedError\", \"client\",\n \"Failed to create a URL object with the proxy URL provided.\", \"\", \"Setup failed. Proxy url is invalid: {0}\", \"\", \"400\", \"40007\", \"ExpectedError\", \"client\",\n \"CallClient instance can support only one CallAgent or TeamsCallAgent create new CallClient instance to create new CallAgent or TeamsCallAgent\", \"\", \"\", \"\", \"400\", \"40008\", \"ExpectedError\", \"client\",\n \"EmergencyCountryCode is invalid, max length is 10\", \"\", \"\", \"\", \"400\", \"40009\", \"ExpectedError\", \"client\",\n \"ACS Web Calling SDK must be used through https, file:, or localhost\", \"\", \"\", \"\", \"400\", \"40100\", \"ExpectedError\", \"client\",\n \"Failed to create CallAgent, timeout during initialization of the calling base stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to create stack base due to timeout during initialization\", \"\", \"408\", \"40101\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, failure during initialization of the calling base stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to create stack base due to failure in intialization\", \"\", \"500\", \"40102\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, failure to initialize calling user stack because calling base stack failed to create. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Base stack failed to create\", \"\", \"500\", \"40103\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, timeout during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"User stack init timeout\", \"\", \"408\", \"40104\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, failure during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"User stack init failed\", \"\", \"500\", \"40105\", \"UnexpectedClientError\", \"client\",\n \"Failed to set configurations for the calling stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Unable to parse configuration\", \"\", \"500\", \"40106\", \"UnexpectedClientError\", \"client\",\n \"Failed to set user configurations for calling stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to set configuration for stack\", \"\", \"500\", \"40107\", \"UnexpectedClientError\", \"client\",\n \"Failed to get device manager due to internal call stack undefined. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to get device manager due to internal call stack undefined\", \"\", \"500\", \"40108\", \"UnexpectedClientError\", \"client\",\n \"Failed to set configuration parameters for the calling stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to initialize callclient\", \"\", \"500\", \"40109\", \"UnexpectedClientError\", \"client\",\n \"Fetched undefined configurations for the calling stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Found undefined configs in ECS response: {0}\", \"\", \"500\", \"40110\", \"UnexpectedClientError\", \"client\",\n \"Failed to connect to Azure Communication Services infrastructure. Please try again and check the browser's network requests. If the requests keep failing, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Failed to create trouter service\", \"\", \"500\", \"40111\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize connection to Azure Communication Services infrastructure. Please try again and check the browser's network requests. If the requests keep failing, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Signaling init failed\", \"\", \"500\", \"40112\", \"UnexpectedClientError\", \"client\",\n \"Already connected to Azure Communication Services infrastructure. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Signaling service already initialized\", \"\", \"500\", \"40113\", \"ExpectedError\", \"client\",\n \"Failed to connect to Azure Communication Services infrastructure, timeout during initialization. Please try again and check the browser's network requests. If the requests keep failing, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Signaling init timeout, request took longer than {0} ms\", \"\", \"408\", \"40114\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, unable to initialize connection to Azure Communication Services infrastructure. Please try again and check the browser's network requests. If the requests keep failing, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Signaling failed to initialize.\", \"\", \"412\", \"40115\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, media failure during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"40116\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, signaling failure during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"40117\", \"UnexpectedClientError\", \"client\",\n \"Failed to create CallAgent, internal stack failure during initialization of the calling user stack. Please try again, if issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"40118\", \"UnexpectedClientError\", \"client\",\n \"Using proxy or custom TURN for calls involving Teams is disabled\", \"\", \"\", \"\", \"403\", \"40200\", \"ExpectedError\", \"client\",\n \"Failed to parse AccessToken\", \"\", \"\", \"\", \"500\", \"40201\", \"UnexpectedClientError\", \"client\",\n \"Call to yourself is not supported.\", \"\", \"\", \"\", \"400\", \"40202\", \"ExpectedError\", \"client\",\n \"Call Agent is already disposed\", \"\", \"\", \"\", \"409\", \"40203\", \"ExpectedError\", \"client\",\n \"Teams Call Agent is already disposed\", \"\", \"\", \"\", \"409\", \"40204\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to CallAgent event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"40205\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from CallAgent event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"40206\", \"ExpectedError\", \"client\",\n \"Device type must be msft-acs-mesh-deviceType-v2 to join immersive call\", \"\", \"\", \"\", \"400\", \"40207\", \"ExpectedError\", \"client\",\n \"Failed to start or join call, call stack did not initialize\", \"\", \"\", \"\", \"500\", \"40208\", \"UnexpectedClientError\", \"client\",\n \"Invalid join locator specified.\", \"\", \"Invalid call configuration\", \"\", \"400\", \"40209\", \"ExpectedError\", \"client\",\n \"The provided Teams meeting link is invalid.\", \"\", \"Invalid meeting link\", \"\", \"400\", \"40210\", \"ExpectedError\", \"client\",\n \"The provided Teams For Life meeting link is invalid.\", \"\", \"Invalid TFL meeting link\", \"\", \"400\", \"40211\", \"ExpectedError\", \"client\",\n \"Starting a group call must include thread ID in StartTeamsGroupCallOptions.\", \"\", \"\", \"\", \"400\", \"40212\", \"ExpectedError\", \"client\",\n \"Starting a one to one with thread ID is invalid.\", \"\", \"\", \"\", \"400\", \"40213\", \"ExpectedError\", \"client\",\n \"Display name is not allowed to be set for Teams users.\", \"\", \"\", \"\", \"400\", \"40214\", \"ExpectedError\", \"client\",\n \"Display name is too long.\", \"\", \"\", \"\", \"400\", \"40215\", \"ExpectedError\", \"client\",\n \"Failed to create CallAgent. Please try again, if issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"40216\", \"UnexpectedClientError\", \"client\",\n \"Attempted to get AccessToken before initialization\", \"\", \"\", \"\", \"422\", \"40217\", \"UnexpectedClientError\", \"client\",\n \"Invalid push notification data provided. No 'incomingCallContext' key found in the PushNotificatitonData.\", \"\", \"Invalid push notification data provided\", \"\", \"400\", \"40218\", \"ExpectedError\", \"client\",\n \"Failed to handle push notification\", \"\", \"\", \"\", \"500\", \"40219\", \"UnexpectedClientError\", \"client\",\n \"Incoming Call push notification payload provided has too many keys. Only 'incomingCallContext' key is expected in the PushNotificatitonData.\", \"\", \"Invalid Incoming Call push notification payload provided\", \"\", \"400\", \"40220\", \"ExpectedError\", \"client\",\n \"Invalid push notification data provided. No 'incomingCallContext' key found in the PushNotificatitonData.\", \"\", \"No 'incomingCallContext' provided in event payload\", \"\", \"400\", \"40221\", \"ExpectedError\", \"client\",\n \"The decoded 'incomingCallContext' data is invalid.\", \"\", \"Invalid Incoming Call push notification payload data provided\", \"\", \"400\", \"40222\", \"ExpectedError\", \"client\",\n \"Incoming Call is already being processed\", \"\", \"\", \"\", \"400\", \"40223\", \"ExpectedError\", \"client\",\n \"Failed to handle Incoming Call push notification\", \"\", \"\", \"\", \"500\", \"40224\", \"UnexpectedClientError\", \"client\",\n \"Missed call\", \"\", \"\", \"\", \"400\", \"40225\", \"ExpectedError\", \"client\",\n \"AssertIsObject failed. : userIds must be object\", \"\", \"\", \"\", \"400\", \"40226\", \"ExpectedError\", \"client\",\n \"AssertNotNull failed. : userIds cannot be null\", \"\", \"\", \"\", \"400\", \"40227\", \"ExpectedError\", \"client\",\n \"Failed to create CallAgent, an instance of CallAgent associated with this identity already exists. Please dispose the existing CallAgent, or create a new one with a different identity.\", \"\", \"Failed to create call agent, call agent for this ACS Id already exists\", \"\", \"409\", \"40228\", \"ExpectedError\", \"client\",\n \"CallAgent must be created only with ACS token\", \"\", \"\", \"\", \"403\", \"40229\", \"ExpectedError\", \"client\",\n \"Failed to create TeamsCallAgent, an instance of TeamsCallAgent associated with this identity already exists. Please dispose the existing TeamsCallAgent before creating a new one.\", \"\", \"Failed to create call agent, call agent for this ACS Id already exists\", \"\", \"409\", \"40230\", \"ExpectedError\", \"client\",\n \"TeamsCallAgent must be created only with Teams token\", \"\", \"\", \"\", \"403\", \"40231\", \"ExpectedError\", \"client\",\n \"Failed to get token\", \"\", \"\", \"\", \"409\", \"40232\", \"UnexpectedClientError\", \"client\",\n \"Refreshed AccessToken User Id doesnt match initial User Id.\", \"\", \"\", \"\", \"400\", \"40233\", \"ExpectedError\", \"client\",\n \"Access token is expired and failed to fetch a valid one after retries.\", \"\", \"\", \"\", \"400\", \"40234\", \"ExpectedError\", \"client\",\n \"AccessToken expired\", \"\", \"\", \"\", \"401\", \"40235\", \"ExpectedError\", \"client\",\n \"Action not allowed.\", \"\", \"\", \"\", \"403\", \"40236\", \"ExpectedError\", \"client\",\n \"Failed to hangup call.\", \"\", \"\", \"\", \"500\", \"40237\", \"UnexpectedServerError\", \"client\",\n \"Joining a Teams for life meeting is not supported\", \"\", \"\", \"\", \"400\", \"40238\", \"ExpectedError\", \"client\",\n \"Failed to get raw device stream track\", \"\", \"\", \"\", \"500\", \"40600\", \"UnexpectedClientError\", \"client\",\n \"Failed to get raw device stream track, make sure there is available device\", \"\", \"\", \"\", \"412\", \"40601\", \"UnexpectedClientError\", \"client\",\n \"Failed to get device manager.\", \"\", \"\", \"\", \"500\", \"40602\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to DeviceManager event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"40603\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from DeviceManager event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"40604\", \"ExpectedError\", \"client\",\n \"Unable to access device manager\", \"\", \"\", \"\", \"500\", \"40605\", \"UnexpectedClientError\", \"client\",\n \"Failed to enumerate speakers, it is not supported to enumerate/select speakers on Android Chrome, iOS Safari, nor MacOS Safari.\", \"\", \"This device does not support speaker enumeration.\", \"\", \"405\", \"40606\", \"ExpectedError\", \"client\",\n \"Microphone selection timed out.\", \"\", \"\", \"\", \"408\", \"40607\", \"UnexpectedClientError\", \"client\",\n \"There was an issue with selecting the microphone\", \"\", \"\", \"\", \"500\", \"40608\", \"UnexpectedClientError\", \"client\",\n \"Speaker selection timed out.\", \"\", \"\", \"\", \"408\", \"40609\", \"UnexpectedClientError\", \"client\",\n \"There was an issue with selecting the speaker\", \"\", \"\", \"\", \"500\", \"40610\", \"UnexpectedClientError\", \"client\",\n \"This device does not support speaker selection.\", \"\", \"\", \"\", \"405\", \"40611\", \"ExpectedError\", \"client\",\n \"At least one permission must be requested\", \"\", \"\", \"\", \"400\", \"40612\", \"ExpectedError\", \"client\",\n \"Failed to obtain permission to use microphone and/or camera, it was denied or it failed. Please ensure to allow the permissions in the browser's setttings and in the OS setttings.\", \"\", \"Permissions not granted or failed: {0}\", \"\", \"400\", \"40613\", \"ExpectedError\", \"client\",\n \"Failed to ask for device permissions Please ensure to allow the permissions in the browser's setttings and in the OS setttings and try again. If issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to get audio video permissions\", \"\", \"500\", \"40614\", \"UnexpectedClientError\", \"client\",\n \"Invalid AudioDeviceInfo object passed in. Ensure it has an Id.\", \"\", \"The device argument is invalid\", \"\", \"400\", \"40615\", \"ExpectedError\", \"client\",\n \"The device is not selectable\", \"\", \"\", \"\", \"400\", \"40616\", \"ExpectedError\", \"client\",\n \"Attempted invalid operation during Emergency Call.\", \"\", \"{0} operation is not allowed during Emergency Call\", \"\", \"500\", \"41000\", \"ExpectedError\", \"client\",\n \"{0} failed\", \"\", \"\", \"\", \"500\", \"41001\", \"UnexpectedClientError\", \"client\",\n \"Unable to get remote audio stream, getMediaStream returned undefined\", \"\", \"\", \"\", \"500\", \"41002\", \"UnexpectedClientError\", \"client\",\n \"Unable to get remote audio stream, getMediaStream returned error\", \"\", \"\", \"\", \"500\", \"41003\", \"UnexpectedClientError\", \"client\",\n \"Getting raw audio media stream is currently disabled by Azure Communication Services.\", \"\", \"Getting raw audio media strema is currently dissabled\", \"\", \"409\", \"41004\", \"ExpectedError\", \"client\",\n \"Failed to accept the Incoming Call\", \"\", \"\", \"\", \"500\", \"41005\", \"UnexpectedClientError\", \"client\",\n \"Failed to accept the incoming call, it is not in the Ringing state. Subcscribe to CallAgent's 'incomingCall' event to accept the incoming call.\", \"\", \"Call cannot be accepted because it is not in Ringing state\", \"\", \"400\", \"41006\", \"ExpectedError\", \"client\",\n \"Failed to reject the incoming call, it is not in the Ringing state. Subcscribe to CallAgent's 'incomingCall' event to reject the incoming call.\", \"\", \"Call cannot be rejectd because it is not in Ringing state\", \"\", \"400\", \"41007\", \"ExpectedError\", \"client\",\n \"Failed to get raw stream from local audio stream\", \"\", \"\", \"\", \"500\", \"41008\", \"UnexpectedClientError\", \"client\",\n \"Failed to set raw input audio stream\", \"\", \"\", \"\", \"500\", \"41009\", \"UnexpectedClientError\", \"client\",\n \"Failed to unset raw input audio stream\", \"\", \"\", \"\", \"500\", \"41010\", \"UnexpectedClientError\", \"client\",\n \"Failed to process audio because the calling stack is undefined. Please collect browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to process audio because of internal call stack error\", \"\", \"500\", \"41011\", \"UnexpectedClientError\", \"client\",\n \"Removing local video stream due to video fail UFD being raised before call connected. Please ensure to allow video permissions in the browser's setttings and in the OS setttings, and ensure the camera device is not being used by another process.\", \"\", \"Removing local video stream due to video fail UFD being raised before call connected. UFD: {0}, value: {1}, call direction: {2}\", \"\", \"409\", \"41012\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop audio on microphone device not functioning or capture mute event {0} with value {1}\", \"\", \"\", \"\", \"400\", \"41013\", \"UnexpectedClientError\", \"client\",\n \"Failed to instantiate the Call\", \"\", \"\", \"\", \"500\", \"41014\", \"UnexpectedClientError\", \"client\",\n \"Failed to mute microphone. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to mute microphone\", \"\", \"500\", \"41015\", \"UnexpectedClientError\", \"client\",\n \"Failed to unmute microphone. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to unmute microphone\", \"\", \"400\", \"41016\", \"UnexpectedClientError\", \"client\",\n \"Failed to recover the microphone audio after bad microphone UFD recovered. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to unmute and start audio, microphone device not functioning\", \"\", \"410\", \"41017\", \"UnexpectedClientError\", \"client\",\n \"Mute other participants is currently disabled by ACS service.\", \"\", \"Mute other participants disabled.\", \"\", \"403\", \"41018\", \"ExpectedError\", \"client\",\n \"Failed to mute all remote participants\", \"\", \"\", \"\", \"500\", \"41019\", \"UnexpectedClientError\", \"client\",\n \"Failed to mute incoming audio\", \"\", \"\", \"\", \"500\", \"41020\", \"UnexpectedClientError\", \"client\",\n \"Failed to unmute incoming audio\", \"\", \"\", \"\", \"500\", \"41021\", \"UnexpectedClientError\", \"client\",\n \"Failed to send DTMF tone\", \"\", \"\", \"\", \"400\", \"41022\", \"UnexpectedClientError\", \"client\",\n \"Invalid value passed to DtfmTone\", \"\", \"\", \"\", \"422\", \"41023\", \"ExpectedError\", \"client\",\n \"Failed to start audio before starting video\", \"\", \"\", \"\", \"500\", \"41024\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video, LocalVideoStream instance is invalid or empty. Please pass in a LocalVideoStream instance.\", \"\", \"Failed to start video, localVideoStream cannot be null\", \"\", \"400\", \"41025\", \"ExpectedError\", \"client\",\n \"Failed to start video, localVideoStream is not an instance of LocalVideoStream\", \"\", \"\", \"\", \"400\", \"41026\", \"ExpectedError\", \"client\",\n \"Failed to start video, video is already started.\", \"\", \"Failed to start video, local video is already on\", \"\", \"400\", \"41027\", \"ExpectedError\", \"client\",\n \"Failed to set media stream\", \"\", \"\", \"\", \"500\", \"41028\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video\", \"\", \"\", \"\", \"500\", \"41029\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop video, video is already stopped.\", \"\", \"Failed to stop video, local video is already off\", \"\", \"400\", \"41030\", \"ExpectedError\", \"client\",\n \"Failed to start video because the calling stack is undefined. Please gether browser console logs, .HAR files, and contact Aure Communication Services support.\", \"\", \"Failed to process video because of internal call stack error\", \"\", \"500\", \"41031\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop video, invalid argument. LocalVideoStream used as an input is currently not being sent.\", \"\", \"Invalid LocalVideoStream, this LocalVideoStream is not being sent\", \"\", \"400\", \"41032\", \"ExpectedError\", \"client\",\n \"Failed to hold the call. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to hold call\", \"\", \"500\", \"41033\", \"UnexpectedClientError\", \"client\",\n \"Failed to resume the call.Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to resume call\", \"\", \"500\", \"41034\", \"UnexpectedClientError\", \"client\",\n \"Failed to start screen share, screen share is already started.\", \"\", \"Failed to start screen share, screen share is already on. Must stop and start again.\", \"\", \"400\", \"41035\", \"ExpectedError\", \"client\",\n \"Failed to start raw screen sharing, localVideoStream is not an instance of LocalVideoStream\", \"\", \"\", \"\", \"400\", \"41036\", \"ExpectedError\", \"client\",\n \"Unable to get media stream from local video stream for raw media screen sharing. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Unable to get media stram from local video stream for screen sharing\", \"\", \"500\", \"41037\", \"UnexpectedClientError\", \"client\",\n \"Failed to set raw media stream for screen sharing. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to set media stream for screen sharing\", \"\", \"422\", \"41038\", \"UnexpectedClientError\", \"client\",\n \"Failed to get raw screen sharing stream. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to get media stream for screen sharing\", \"\", \"422\", \"41039\", \"UnexpectedClientError\", \"client\",\n \"Failed to start screen sharing\", \"\", \"\", \"\", \"500\", \"41040\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop screen share, screen share is already stopped.\", \"\", \"Failed to stop screen share, screen share is already off\", \"\", \"400\", \"41041\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to Call event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"41042\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Call event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"41043\", \"ExpectedError\", \"client\",\n \"Only single LocalVideoStream is supported currently\", \"\", \"\", \"\", \"400\", \"41044\", \"ExpectedError\", \"client\",\n \"Stream is not an instance of LocalVideoStream\", \"\", \"\", \"\", \"400\", \"41045\", \"ExpectedError\", \"client\",\n \"Only single LocalAudioStream is supported currently\", \"\", \"\", \"\", \"400\", \"41046\", \"ExpectedError\", \"client\",\n \"Stream is not an instance of LocalAudioStream\", \"\", \"\", \"\", \"400\", \"41047\", \"ExpectedError\", \"client\",\n \"Failed to start video during call setup process. Please ensure to allow video permissions in the browser's setttings and in the OS setttings, and ensure the camera device is not being used by another process.\", \"\", \"Video failed to start during call-{0} process.\", \"\", \"410\", \"41048\", \"UnexpectedClientError\", \"client\",\n \"Failed to start audio during call setup process. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Audio failed to start during call-{0} process.\", \"\", \"400\", \"41049\", \"UnexpectedClientError\", \"client\",\n \"Failed to force isAvailable flag to False during large meeting\", \"\", \"\", \"\", \"500\", \"41050\", \"UnexpectedClientError\", \"client\",\n \"Failed to dispose view in large meeting\", \"\", \"\", \"\", \"500\", \"41051\", \"UnexpectedClientError\", \"client\",\n \"Not able to add unkown participant.\", \"\", \"\", \"\", \"400\", \"41052\", \"ExpectedError\", \"client\",\n \"Participant is already in the call.\", \"\", \"{0} is already in the call\", \"\", \"400\", \"41053\", \"ExpectedError\", \"client\",\n \"Failed to remove the specified participant. The participant is not in the call.\", \"\", \"{0} is not in the call.\", \"\", \"400\", \"41054\", \"ExpectedError\", \"client\",\n \"Add participant failed: thread ID is missing in options.\", \"\", \"\", \"\", \"400\", \"41055\", \"ExpectedError\", \"client\",\n \"Failed to start or join to the call, Teams Enterprise voice policy is not enabled for this Azure Communication Services resource. Follow the tutorial online to enable it.\", \"\", \"Teams Enterprise voice is not enabled. Teams user is not eligible to make PSTN call\", \"\", \"412\", \"41056\", \"ExpectedError\", \"client\",\n \"Failed to get server call Id\", \"\", \"\", \"\", \"500\", \"41057\", \"UnexpectedClientError\", \"client\",\n \"Failed to get the MediaStream to initialize the Volume indicator. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"failed to getMediaStreamTrack\", \"\", \"500\", \"41058\", \"UnexpectedClientError\", \"client\",\n \"Failed to setup volume calcualtor using AudioContext, please retry getVolumeindicator on a working audio stream with exponential backoff\", \"\", \"\", \"\", \"500\", \"41059\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to Volume Indicator event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"400\", \"41060\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Volume Indicator event, unknown event name.\", \"\", \"Not able to unsubscribe to event {0}, unknown event name\", \"\", \"400\", \"41061\", \"ExpectedError\", \"client\",\n \"Failed to setup volume calculator, please retry after exponential backoff\", \"\", \"\", \"\", \"500\", \"41062\", \"UnexpectedClientError\", \"client\",\n \"Failed to get serverCallId, serverCallId is empty\", \"\", \"\", \"\", \"404\", \"41063\", \"UnexpectedClientError\", \"client\",\n \"Setting call constraint is currently disabled by ACS service.\", \"\", \"Setting call constraints is disabled\", \"\", \"409\", \"41064\", \"ExpectedError\", \"client\",\n \"Error setting call constraints at call setup. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error setting call constraints at call {0}\", \"\", \"500\", \"41065\", \"UnexpectedClientError\", \"client\",\n \"Error setting call constraints during mid-call\", \"\", \"\", \"\", \"500\", \"41066\", \"UnexpectedClientError\", \"client\",\n \"Error settting video constraints during call settup or mid-call. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error setting video constraints during call stage: {0}\", \"\", \"500\", \"41067\", \"UnexpectedClientError\", \"client\",\n \"Error setting video constraints during call accept\", \"\", \"\", \"\", \"500\", \"41068\", \"UnexpectedClientError\", \"client\",\n \"Error setting video constraints during call start\", \"\", \"\", \"\", \"500\", \"41069\", \"UnexpectedClientError\", \"client\",\n \"Failed to set call constraints during mid call\", \"\", \"\", \"\", \"500\", \"41070\", \"UnexpectedClientError\", \"client\",\n \"Failed to start screen share, call is not in Connected state. Subscribe to the Call's 'statteChanged' event to know when the call is connected.\", \"\", \"Failed to start screen sharing. Call must be in connected state\", \"\", \"412\", \"41071\", \"ExpectedError\", \"client\",\n \"Failed to stop screen sharing. Call must be in connected state\", \"\", \"\", \"\", \"412\", \"41072\", \"ExpectedError\", \"client\",\n \"Failed to get or set custom MediaStream, this functionality is currently disabled by Azure Communication Services.\", \"\", \"Accessing raw media stream is currently not enabled\", \"\", \"412\", \"41073\", \"ExpectedError\", \"client\",\n \"The raw media stream function is currently not available\", \"\", \"\", \"\", \"500\", \"41074\", \"UnexpectedClientError\", \"client\",\n \"Failed to start raw screen sharing, localVideoStream doesn't contain a raw media stream\", \"\", \"\", \"\", \"400\", \"41075\", \"ExpectedError\", \"client\",\n \"Failed to start audio stream.\", \"\", \"\", \"\", \"500\", \"41076\", \"UnexpectedClientError\", \"client\",\n \"Failed to stop video.\", \"\", \"\", \"\", \"500\", \"41077\", \"UnexpectedClientError\", \"client\",\n \"Incoming call is already unplaced\", \"\", \"\", \"\", \"400\", \"41078\", \"ExpectedError\", \"client\",\n \"Failed to reject call\", \"\", \"\", \"\", \"500\", \"41079\", \"UnexpectedServerError\", \"client\",\n \"Failed to start local audio device\", \"\", \"\", \"\", \"400\", \"41080\", \"UnexpectedClientError\", \"client\",\n \"Failed to Select Virtual Device.\", \"\", \"\", \"\", \"400\", \"41081\", \"UnexpectedClientError\", \"client\",\n \"Failed to Unselect Virtual Device.\", \"\", \"\", \"\", \"400\", \"41082\", \"UnexpectedClientError\", \"client\",\n \"Failed to start raw audio, localAudioStream doesn't contain a raw media stream. To start raw audio, the LocalAudioStream passed in, must be constructed with a MediaStream object.\", \"\", \"\", \"\", \"400\", \"41083\", \"ExpectedError\", \"client\",\n \"Failed to stop raw audio, localAudioStream doesn't contain a raw media stream. To stop raw audio, the current LocalAudioStream in the call must have a MediaStream as the source.\", \"\", \"\", \"\", \"400\", \"41084\", \"ExpectedError\", \"client\",\n \"Thread ID is invalid.\", \"\", \"\", \"\", \"400\", \"41085\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to Lobby event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"41800\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Lobby event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"41801\", \"ExpectedError\", \"client\",\n \"Current conversation type doesn't support lobby admit and reject\", \"\", \"\", \"\", \"400\", \"41802\", \"ExpectedError\", \"client\",\n \"Participant is already in the meeting.\", \"\", \"{0} is already in the meeting\", \"\", \"400\", \"41803\", \"ExpectedError\", \"client\",\n \"Participant is not in the lobby.\", \"\", \"{0} is not in the lobby\", \"\", \"400\", \"41804\", \"ExpectedError\", \"client\",\n \"only Organizer, Co-organizer or Presenter can admit/reject participants from lobby\", \"\", \"\", \"\", \"403\", \"41805\", \"ExpectedError\", \"client\",\n \"Failed to admit participants in the lobby\", \"\", \"\", \"\", \"500\", \"41806\", \"UnexpectedServerError\", \"client\",\n \"Participant list is empty\", \"\", \"\", \"\", \"400\", \"41807\", \"ExpectedError\", \"client\",\n \"Lobby is not enabled for this meeting\", \"\", \"\", \"\", \"400\", \"41808\", \"ExpectedError\", \"client\",\n \"Failed to reject participants from the lobby\", \"\", \"\", \"\", \"500\", \"41809\", \"UnexpectedServerError\", \"client\",\n \"Failed to fetch Teams user policies and settings cannot proceed, because teams user Id was not found in the AccessToken.\", \"\", \"Caller's MicrosoftTeamsUserIdentifier wasn't provided. Fetching Teams user policies and settings cannot proceed\", \"\", \"400\", \"41900\", \"ExpectedError\", \"client\",\n \"Error Fetching Teams user policy from ACS MiddleTier Service\", \"\", \"\", \"\", \"500\", \"41901\", \"UnexpectedServerError\", \"client\",\n \"Unable to derive emergency policy from ACS MiddleTier Service response\", \"\", \"\", \"\", \"500\", \"41902\", \"UnexpectedServerError\", \"client\",\n \"Unable to fetch Teams calling policy from ACS MiddleTier Service response. Please try again, if the issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Unable to fetch teamsCallingPolicy from ACS MiddleTier Service response\", \"\", \"500\", \"41903\", \"UnexpectedServerError\", \"client\",\n \"Unable to fetch Teams meeting policy from ACS MiddleTier Service response. Please try again, if the issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Unable to fetch teamsMeetingPolicy from ACS MiddleTier Service response\", \"\", \"500\", \"41904\", \"UnexpectedServerError\", \"client\",\n \"Unable to fetch feature types from ACS MiddleTier Service response. Please try again, if the issue persists, gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"Unable to fetch featureTypes from ACS MiddleTier Service response\", \"\", \"500\", \"41905\", \"UnexpectedServerError\", \"client\",\n \"Unable to create thread for the Teams User groupcall from ACS MiddleTier Service response\", \"\", \"\", \"\", \"500\", \"41906\", \"UnexpectedServerError\", \"client\",\n \"Unable to add particpant for the thread for Teams groupcall from ACS MiddleTier Service\", \"\", \"\", \"\", \"500\", \"41907\", \"UnexpectedServerError\", \"client\",\n \"Mute other participants is disabled by ACS service.\", \"\", \"Mute other participants disabled.\", \"\", \"403\", \"42000\", \"ExpectedError\", \"client\",\n \"Failed to mute specific participant\", \"\", \"\", \"\", \"500\", \"42001\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to RemoteParticipant event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"42002\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from RemoteParticipant event, unknown event name.\", \"\", \"Not able to unsubscribe to event {0}, unknown event name\", \"\", \"422\", \"42003\", \"ExpectedError\", \"client\",\n \"The scenario to soft mute a PSTN participant is not supported.\", \"\", \"\", \"\", \"405\", \"42004\", \"ExpectedError\", \"client\",\n \"Failed to start video, video device is being used by another process/application. Stop your camera from being used in the other process/application and try again.\", \"\", \"Video operation failure SourceUnavailableError\", \"\", \"412\", \"43000\", \"ExpectedError\", \"client\",\n \"Failed to start video, permission was not granted to use selected video device. Ensure video device permissions are allowed in the browser's settings and in the system's setttings.\", \"\", \"Video operation failure PermissionDeniedError\", \"\", \"403\", \"43001\", \"ExpectedError\", \"client\",\n \"Failed to start video, unknown error. Please try again. If the issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure UnknownFailureForVideoOperation\", \"\", \"500\", \"43002\", \"UnexpectedClientError\", \"client\",\n \"Failed to create local video stream, source was not of type VideoDeviceInfo or MediaStream\", \"\", \"\", \"\", \"400\", \"43003\", \"ExpectedError\", \"client\",\n \"Failed to switch video device, invalid input. Input must be of a VideoDeviceInfo type.\", \"\", \"Failed to switch source, source was not of type VideoDeviceInfo\", \"\", \"400\", \"43004\", \"ExpectedError\", \"client\",\n \"Failed to switch video device, unable to switch to the same video device, it's already selected.\", \"\", \"Unable to switch to the same source\", \"\", \"400\", \"43005\", \"ExpectedError\", \"client\",\n \"Unable to get device type\", \"\", \"\", \"\", \"500\", \"43006\", \"UnexpectedClientError\", \"client\",\n \"Failed to get raw video stream. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to get media stream\", \"\", \"500\", \"43007\", \"UnexpectedClientError\", \"client\",\n \"Failed to set media stream source is not MediaStream\", \"\", \"\", \"\", \"400\", \"43008\", \"ExpectedError\", \"client\",\n \"Failed to set raw video stream. Found undefined function. Gather browser console logs and contact Azure Communication Services support.\", \"\", \"Unable ot set media stream\", \"\", \"500\", \"43009\", \"UnexpectedClientError\", \"client\",\n \"Failed to set raw video stream. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to set media stream\", \"\", \"500\", \"43010\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to LocalVideoStream event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"43011\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from LocalVideoStream event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"43012\", \"ExpectedError\", \"client\",\n \"Failed to start video, no video devices found. Ensure video devices are plugged in and enabled in the system settings.\", \"\", \"Video operation failure DevicesNotFoundError\", \"\", \"412\", \"43013\", \"ExpectedError\", \"client\",\n \"Failed to start video, error requesting media stream. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure MediaStreamRequestError\", \"\", \"412\", \"43014\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video, media stream request timed out. PLease allow permission on the browser's prompt to access the camera and try again.\", \"\", \"Video operation failure MediaStreamRequestTimedout\", \"\", \"412\", \"43015\", \"ExpectedError\", \"client\",\n \"Failed to start video, permissions denied by system. Ensure video device permissions are allowed in the browser's settings and in the system's setttings.\", \"\", \"Video operation failure PermissionsDeniedBySystem\", \"\", \"412\", \"43016\", \"ExpectedError\", \"client\",\n \"Failed to start video, unsupported stream. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure UnsupportedStream\", \"\", \"412\", \"43017\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video, failed to set constraints. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure ConstraintNotSatisfiedError\", \"\", \"412\", \"43018\", \"UnexpectedClientError\", \"client\",\n \"Failed to start video, no device selected. Please ensure to pass a LocalVideoStream constructed with a VideoDeviceInfo and try again. If issue persists, contact Azure Communication Services support.\", \"\", \"Video operation failure noDeviceSelected\", \"\", \"412\", \"43019\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to RemoteVideoStream event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"43100\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from RemoteVideoStream event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"43101\", \"ExpectedError\", \"client\",\n \"Not able to get media stream\", \"\", \"\", \"\", \"500\", \"43102\", \"UnexpectedClientError\", \"client\",\n \"The remote video stream is currently not available, subscribe to the stream's isAvailable property to get notified when it is ready to get the raw media stream.\", \"\", \"The stream is currently not availalbe, subscribe to stream.isAvailable property to get notified when it is ready to get media stream\", \"\", \"400\", \"43103\", \"ExpectedError\", \"client\",\n \"Failed to subscribe to media stream, timeout\", \"\", \"\", \"\", \"408\", \"43104\", \"UnexpectedClientError\", \"client\",\n \"Failed to get media stream\", \"\", \"\", \"\", \"500\", \"43105\", \"UnexpectedClientError\", \"client\",\n \"Failed to subscribe to media stream, muted\", \"\", \"\", \"\", \"408\", \"43106\", \"UnexpectedClientError\", \"client\",\n \"Failed to get raw media stream\", \"\", \"\", \"\", \"500\", \"43107\", \"UnexpectedClientError\", \"client\",\n \"Failed to render video stream, this stream is not available. Subscribe to the stream's isAvailable property to get notified when the remote participant has their video on and the stream is available for rendering.\", \"\", \"Failed to create view, remote stream is not available\", \"\", \"412\", \"43200\", \"ExpectedError\", \"client\",\n \"Failed to start stream, already disposed\", \"\", \"\", \"\", \"405\", \"43201\", \"ExpectedError\", \"client\",\n \"Failed to render video stream, this stream is not longer available. Remote participant turned their video off.\", \"\", \"Failed to start stream, stream became unavailable\", \"\", \"404\", \"43202\", \"ExpectedError\", \"client\",\n \"Failed to render video stream, rendering timed out while waiting for video frames. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Failed to render stream, timeout\", \"\", \"408\", \"43203\", \"UnexpectedClientError\", \"client\",\n \"Failed to render video stream, failed to subscribe to video on the Azure Communication Services infrastructure. Please try again, if issue persists, contact Azure Communication Services support.\", \"\", \"Failed to start stream, fail to subscribe\", \"\", \"500\", \"43204\", \"UnexpectedClientError\", \"client\",\n \"Failed to start stream, internal error\", \"\", \"\", \"\", \"500\", \"43205\", \"UnexpectedClientError\", \"client\",\n \"Failed to updateScalingMode, failed to update\", \"\", \"\", \"\", \"500\", \"43206\", \"UnexpectedClientError\", \"client\",\n \"Failed to start stream, disposing stream because participant is not a dominant speaker in the large meeting\", \"\", \"\", \"\", \"405\", \"43207\", \"ExpectedError\", \"client\",\n \"Failed to start stream, disposing stream because remote video stream is disposing\", \"\", \"\", \"\", \"405\", \"43208\", \"ExpectedError\", \"client\",\n \"Failed to render video stream, VideoStreamRenderer was disposed during initialization process.\", \"\", \"Failed to start stream, disposing stream\", \"\", \"405\", \"43209\", \"ExpectedError\", \"client\",\n \"Failed to dispose VideoStreamRenderer, it is already disposed.\", \"\", \"Failed to dispose stream, already disposed\", \"\", \"400\", \"43210\", \"ExpectedError\", \"client\",\n \"Failed to dispose remote renderer\", \"\", \"\", \"\", \"500\", \"43211\", \"UnexpectedClientError\", \"client\",\n \"Failed to create VideoStreamRendererView, videoStream must be either LocalVideoStream or RemoteVideoStream type\", \"\", \"\", \"\", \"400\", \"43212\", \"ExpectedError\", \"client\",\n \"Failed to dispose, VideoStreamRendererView is disposed\", \"\", \"\", \"\", \"400\", \"43213\", \"ExpectedError\", \"client\",\n \"Failed to render, stream disposed\", \"\", \"\", \"\", \"400\", \"43214\", \"ExpectedError\", \"client\",\n \"Failed to updateScalingMode, VideoStreamRendererView is disposed\", \"\", \"\", \"\", \"400\", \"43215\", \"ExpectedError\", \"client\",\n \"Failed to updateScalingMode, wrong scalingMode value\", \"\", \"\", \"\", \"400\", \"43216\", \"ExpectedError\", \"client\",\n \"Failed to dispose view\", \"\", \"\", \"\", \"500\", \"43217\", \"UnexpectedClientError\", \"client\",\n \"Failed to create VideoStreamRenderer, videoStream must be either LocalVideoStream or RemoteVideoStreamCommon type\", \"\", \"\", \"\", \"400\", \"43218\", \"ExpectedError\", \"client\",\n \"Failed to create view, VideoStreamRenderer is disposed\", \"\", \"\", \"\", \"400\", \"43219\", \"ExpectedError\", \"client\",\n \"Failed to create view, maximum number of active RemoteVideoStream views has been reached. You can dispose of a previous one in order to create new one.\", \"\", \"Failed to create view, maximum number of {0} active RemoteVideoStream has been reached\", \"\", \"400\", \"43220\", \"ExpectedError\", \"client\",\n \"Failed to create view\", \"\", \"\", \"\", \"500\", \"43221\", \"UnexpectedClientError\", \"client\",\n \"Failed to dispose, VideoStreamRendererView is already disposed\", \"\", \"\", \"\", \"400\", \"43222\", \"ExpectedError\", \"client\",\n \"Unknown stream type\", \"\", \"\", \"\", \"400\", \"43223\", \"ExpectedError\", \"client\",\n \"Failed to dispose local renderer\", \"\", \"\", \"\", \"500\", \"43224\", \"UnexpectedClientError\", \"client\",\n \"Failed to create local audio stream, source is not of type AudioDeviceInfo or MediaStream\", \"\", \"\", \"\", \"400\", \"43600\", \"ExpectedError\", \"client\",\n \"Failed to create local audio stream, source is not a microphone\", \"\", \"\", \"\", \"400\", \"43601\", \"ExpectedError\", \"client\",\n \"Failed to get media stream source is not AudioDeviceInfo or MediaStream\", \"\", \"\", \"\", \"500\", \"43602\", \"UnexpectedClientError\", \"client\",\n \"Failed to switch stream on local audio, source is not of type MediaStream\", \"\", \"\", \"\", \"400\", \"43603\", \"ExpectedError\", \"client\",\n \"Failed to create local audio stream, source is not a microphone\", \"\", \"\", \"\", \"400\", \"43604\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to LocalAudioStream event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"43605\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from LocalAudioStream event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"43606\", \"ExpectedError\", \"client\",\n \"Failed to switch audio device, unable to switch to the same audio device, it's already selected.\", \"\", \"\", \"\", \"400\", \"43607\", \"ExpectedError\", \"client\",\n \"Failed to start audio, unknown error. Please try again. If the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"43608\", \"UnexpectedClientError\", \"client\",\n \"Unable to parse PhoneNumberIdentifier object\", \"\", \"\", \"\", \"422\", \"44000\", \"ExpectedError\", \"client\",\n \"Unable to parse MicrosoftTeamsUserIdentifier object\", \"\", \"\", \"\", \"422\", \"44001\", \"ExpectedError\", \"client\",\n \"Unable to parse MicrosoftTeamsAppIdentifier object\", \"\", \"\", \"\", \"422\", \"44002\", \"ExpectedError\", \"client\",\n \"Unable to parse Identifier object, please check the syntax\", \"\", \"\", \"\", \"422\", \"44003\", \"ExpectedError\", \"client\",\n \"Invalid CommunicationUser identifier specified\", \"\", \"\", \"\", \"422\", \"44004\", \"ExpectedError\", \"client\",\n \"Invalid MicrosoftTeamsUser rawId specified\", \"\", \"\", \"\", \"422\", \"44005\", \"ExpectedError\", \"client\",\n \"Invalid MicrosoftTeamsUser microsoftTeamsUserId specified\", \"\", \"\", \"\", \"422\", \"44006\", \"ExpectedError\", \"client\",\n \"Invalid MicrosoftTeamsApp rawId specified\", \"\", \"\", \"\", \"422\", \"44007\", \"ExpectedError\", \"client\",\n \"Invalid MicrosoftTeamsApp teamsAppId specified\", \"\", \"\", \"\", \"422\", \"44008\", \"ExpectedError\", \"client\",\n \"Invalid identifier specified, please specify an id\", \"\", \"\", \"\", \"422\", \"44009\", \"ExpectedError\", \"client\",\n \"Unable to parse Identifier object\", \"\", \"\", \"\", \"422\", \"44010\", \"ExpectedError\", \"client\",\n \"AssertIsArrayOfIdentifiers failed. : userIds must be array of CommunicationIdentifier\", \"\", \"\", \"\", \"422\", \"44011\", \"ExpectedError\", \"client\",\n \"No cloud prefix found in identity\", \"\", \"\", \"\", \"409\", \"44012\", \"ExpectedError\", \"client\",\n \"Config is empty\", \"\", \"\", \"\", \"500\", \"44100\", \"UnexpectedServerError\", \"client\",\n \"Missing ACS config key\", \"\", \"\", \"\", \"500\", \"44101\", \"UnexpectedServerError\", \"client\",\n \"Error while merging config\", \"\", \"\", \"\", \"500\", \"44102\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize telemetry\", \"\", \"\", \"\", \"500\", \"44103\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize telemetry\", \"\", \"\", \"\", \"500\", \"44104\", \"UnexpectedClientError\", \"client\",\n \"Failed to create and initialize telemetry logger for tenant. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Failed to create and initialize telemetry logger for {0}\", \"\", \"500\", \"44105\", \"UnexpectedClientError\", \"client\",\n \"Failed to flush telemetry\", \"\", \"\", \"\", \"500\", \"44106\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize telemetry logger\", \"\", \"\", \"\", \"500\", \"44107\", \"UnexpectedClientError\", \"client\",\n \"No CommunicationTokenCredential provided\", \"\", \"\", \"\", \"401\", \"44108\", \"ExpectedError\", \"client\",\n \"AccessToken is empty\", \"\", \"\", \"\", \"401\", \"44109\", \"ExpectedError\", \"client\",\n \"Failed to get AccessToken\", \"\", \"\", \"\", \"401\", \"44110\", \"UnexpectedClientError\", \"client\",\n \"Invalid token\", \"\", \"\", \"\", \"401\", \"44111\", \"ExpectedError\", \"client\",\n \"Failed to parse AccessToken\", \"\", \"\", \"\", \"401\", \"44112\", \"ExpectedError\", \"client\",\n \"AccessToken does not contain 'voip' or 'voip.join' scope\", \"\", \"\", \"\", \"401\", \"44113\", \"ExpectedError\", \"client\",\n \"Wrong AccessToken scope format. Scope is expected to be a string that contains 'voip'\", \"\", \"\", \"\", \"401\", \"44114\", \"ExpectedError\", \"client\",\n \"AccessToken does not contain ACS resource Id\", \"\", \"\", \"\", \"401\", \"44115\", \"ExpectedError\", \"client\",\n \"AccessToken does not contain ACS user Id\", \"\", \"\", \"\", \"401\", \"44116\", \"ExpectedError\", \"client\",\n \"Failed to parse AccessToken\", \"\", \"\", \"\", \"401\", \"44117\", \"UnexpectedClientError\", \"client\",\n \"Operation timed out\", \"\", \"\", \"\", \"408\", \"44118\", \"UnexpectedClientError\", \"client\",\n \"Error while trying to start or stop echo cancellation. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error while trying to {0} echo cancellation\", \"\", \"500\", \"45000\", \"UnexpectedClientError\", \"client\",\n \"Error while trying to start or stop noise suppression. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error while trying to {0} noise suppression\", \"\", \"500\", \"45001\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to AudioEffects event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"400\", \"45002\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from AudioEffects event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"400\", \"45003\", \"ExpectedError\", \"client\",\n \"Setting audio effects is currently disabled by Azure Communication Services.\", \"\", \"Setting audio effects is disabled.\", \"\", \"403\", \"45004\", \"ExpectedError\", \"client\",\n \"Audio effects feature is disposed. Create a new AudioEffects feature instance.\", \"\", \"\", \"\", \"400\", \"45005\", \"ExpectedError\", \"client\",\n \"Current source is not supported\", \"\", \"\", \"\", \"415\", \"45006\", \"ExpectedError\", \"client\",\n \"Failed to get device manager to start effects.\", \"\", \"\", \"\", \"500\", \"45007\", \"UnexpectedClientError\", \"client\",\n \"Audio effects feature is disposed. Create a new AudioEffects feature instance.\", \"\", \"\", \"\", \"400\", \"45008\", \"ExpectedError\", \"client\",\n \"Failed to get device manager to stop effects.\", \"\", \"\", \"\", \"500\", \"45009\", \"UnexpectedClientError\", \"client\",\n \"Internal error - DM missing\", \"\", \"\", \"\", \"500\", \"45010\", \"UnexpectedClientError\", \"client\",\n \"EffectProvider not available\", \"\", \"\", \"\", \"500\", \"45011\", \"UnexpectedClientError\", \"client\",\n \"Internal error - stack aec provider missing\", \"\", \"\", \"\", \"500\", \"45012\", \"UnexpectedClientError\", \"client\",\n \"Invalid effect provided\", \"\", \"\", \"\", \"400\", \"45013\", \"ExpectedError\", \"client\",\n \"Invalid or no echo cancellation effect provided\", \"\", \"\", \"\", \"400\", \"45014\", \"ExpectedError\", \"client\",\n \"Invalid or no noise suppression effect provided\", \"\", \"\", \"\", \"400\", \"45015\", \"ExpectedError\", \"client\",\n \"Unsupported effect specified. Please specify a supported audio effect.\", \"\", \"{0} is not supported.\", \"\", \"415\", \"45016\", \"UnexpectedClientError\", \"client\",\n \"Error while checking support\", \"\", \"\", \"\", \"501\", \"45017\", \"UnexpectedClientError\", \"client\",\n \"Invalid or no auto gain control effect provided\", \"\", \"\", \"\", \"400\", \"45018\", \"ExpectedError\", \"client\",\n \"Error while trying to start or stop auto gain control. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Error while trying to {0} auto gain control\", \"\", \"500\", \"45019\", \"UnexpectedClientError\", \"client\",\n \"Error setting browser audio processing flags\", \"\", \"\", \"\", \"500\", \"45020\", \"UnexpectedClientError\", \"client\",\n \"Error starting audio effects.\", \"\", \"\", \"\", \"500\", \"45021\", \"UnexpectedClientError\", \"client\",\n \"Error stopping audio effects.\", \"\", \"\", \"\", \"500\", \"45022\", \"UnexpectedClientError\", \"client\",\n \"Error disposing audio effects feature.\", \"\", \"\", \"\", \"500\", \"45023\", \"UnexpectedClientError\", \"client\",\n \"Invalid call survey. Please submit a survey options.\", \"\", \"{0}.\", \"\", \"400\", \"45100\", \"ExpectedError\", \"client\",\n \"Failed to submit survery, timedout. Please try again, if issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"\", \"\", \"408\", \"45101\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize Captions.\", \"\", \"\", \"\", \"500\", \"45200\", \"UnexpectedClientError\", \"client\",\n \"Captions feature is currently disabled by Azure Communication services.\", \"\", \"Feature is not enabled.\", \"\", \"412\", \"45201\", \"ExpectedError\", \"client\",\n \"Spoken language requested is not supported.\", \"\", \"\", \"\", \"400\", \"45202\", \"ExpectedError\", \"client\",\n \"Captions feature is disabled in meeting policy.\", \"\", \"\", \"\", \"403\", \"45203\", \"ExpectedError\", \"client\",\n \"Captions feature is disabled in calling policy.\", \"\", \"\", \"\", \"403\", \"45204\", \"ExpectedError\", \"client\",\n \"Could not start captions.\", \"\", \"\", \"\", \"500\", \"45205\", \"UnexpectedClientError\", \"client\",\n \"Cannot update spoken language as captions has not started.\", \"\", \"\", \"\", \"400\", \"45206\", \"ExpectedError\", \"client\",\n \"Set spoken language is currently disabled by Azure Communication Services.\", \"\", \"Set spoken language is not enabled.\", \"\", \"412\", \"45207\", \"ExpectedError\", \"client\",\n \"Unable to update spoken language. Failed to get token.\", \"\", \"\", \"\", \"401\", \"45208\", \"UnexpectedClientError\", \"client\",\n \"Unable to update spoken language.\", \"\", \"\", \"\", \"500\", \"45209\", \"UnexpectedClientError\", \"client\",\n \"Cannot update caption language as captions has not started.\", \"\", \"\", \"\", \"400\", \"45210\", \"ExpectedError\", \"client\",\n \"Set caption language is currently disabled by Azure Communication Services.\", \"\", \"Set caption language is not enabled.\", \"\", \"412\", \"45211\", \"ExpectedError\", \"client\",\n \"Set caption language failed. Teams premium license is needed to use this feature.\", \"\", \"\", \"\", \"401\", \"45212\", \"ExpectedError\", \"client\",\n \"Caption language requested is not supported.\", \"\", \"\", \"\", \"400\", \"45213\", \"ExpectedError\", \"client\",\n \"Null token\", \"\", \"\", \"\", \"401\", \"45214\", \"ExpectedError\", \"client\",\n \"Unable to update caption language.\", \"\", \"\", \"\", \"500\", \"45215\", \"UnexpectedClientError\", \"client\",\n \"Failed to fetch policy for Teams Captions.\", \"\", \"\", \"\", \"500\", \"45216\", \"UnexpectedClientError\", \"client\",\n \"Captions already active\", \"\", \"\", \"\", \"400\", \"45217\", \"ExpectedError\", \"client\",\n \"Captions feature is not active.\", \"\", \"\", \"\", \"400\", \"45218\", \"ExpectedError\", \"client\",\n \"Operation in progress\", \"\", \"\", \"\", \"400\", \"45219\", \"ExpectedError\", \"client\",\n \"Spoken language already set\", \"\", \"\", \"\", \"400\", \"45220\", \"ExpectedError\", \"client\",\n \"Unable to update caption language as Captions is not active.\", \"\", \"\", \"\", \"400\", \"45221\", \"ExpectedError\", \"client\",\n \"Caption language already set.\", \"\", \"\", \"\", \"400\", \"45222\", \"ExpectedError\", \"client\",\n \"Captions status already set.\", \"\", \"\", \"\", \"400\", \"45223\", \"ExpectedError\", \"client\",\n \"Captions is not supported.\", \"\", \"\", \"\", \"400\", \"45224\", \"ExpectedError\", \"client\",\n \"Failed to update endpoint metadata\", \"\", \"\", \"\", \"500\", \"45225\", \"UnexpectedClientError\", \"client\",\n \"Cannot start captions as call state is not connected.\", \"\", \"\", \"\", \"400\", \"45226\", \"ExpectedError\", \"client\",\n \"DataChannel has been disposed\", \"\", \"\", \"\", \"500\", \"45300\", \"UnexpectedClientError\", \"client\",\n \"Sender is not ready\", \"\", \"\", \"\", \"500\", \"45301\", \"UnexpectedClientError\", \"client\",\n \"No available channel id\", \"\", \"\", \"\", \"500\", \"45302\", \"UnexpectedClientError\", \"client\",\n \"Invalid channel id\", \"\", \"\", \"\", \"400\", \"45303\", \"ExpectedError\", \"client\",\n \"Invalid bitrateInKbps\", \"\", \"\", \"\", \"400\", \"45304\", \"ExpectedError\", \"client\",\n \"Invalid participants\", \"\", \"\", \"\", \"400\", \"45305\", \"ExpectedError\", \"client\",\n \"Too many participants\", \"\", \"\", \"\", \"400\", \"45306\", \"ExpectedError\", \"client\",\n \"No valid participant\", \"\", \"\", \"\", \"400\", \"45307\", \"ExpectedError\", \"client\",\n \"Message data is empty\", \"\", \"\", \"\", \"400\", \"45308\", \"ExpectedError\", \"client\",\n \"The size of message data is too large\", \"\", \"\", \"\", \"400\", \"45309\", \"ExpectedError\", \"client\",\n \"Invalid message length\", \"\", \"\", \"\", \"500\", \"45310\", \"UnexpectedClientError\", \"client\",\n \"The buffer is full. Please wait and try again\", \"\", \"\", \"\", \"500\", \"45311\", \"UnexpectedClientError\", \"client\",\n \"The sender has been closed\", \"\", \"\", \"\", \"400\", \"45312\", \"ExpectedError\", \"client\",\n \"Currently there is no available reliable channel\", \"\", \"\", \"\", \"500\", \"45313\", \"UnexpectedClientError\", \"client\",\n \"Currently there is no available unreliable channel\", \"\", \"\", \"\", \"500\", \"45314\", \"UnexpectedClientError\", \"client\",\n \"Unable allocate the channel because a channel with the same channelId has already been allocated\", \"\", \"\", \"\", \"500\", \"45315\", \"UnexpectedClientError\", \"client\",\n \"Invalid bitrate\", \"\", \"\", \"\", \"400\", \"45316\", \"ExpectedError\", \"client\",\n \"Traffic is limited\", \"\", \"\", \"\", \"400\", \"45317\", \"ExpectedError\", \"client\",\n \"Failed to send message.\", \"\", \"\", \"\", \"500\", \"45318\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to DataChannel event, unknown event name.\", \"\", \"Not able to {0} subscribe to event {1}, unknown event name\", \"\", \"422\", \"45319\", \"ExpectedError\", \"client\",\n \"Wrong argument type specified.\", \"\", \"TypeError: Expect '{0}' to be of type '{1}'\", \"\", \"400\", \"45320\", \"ExpectedError\", \"client\",\n \"Wrong value specified.\", \"\", \"ValueError: Expect '{0}' to be '{1}'\", \"\", \"400\", \"45321\", \"ExpectedError\", \"client\",\n \"Cannot find the channelId specified.\", \"\", \"Cannot find the channelId {0}\", \"\", \"400\", \"45322\", \"ExpectedError\", \"client\",\n \"Failed to create the sender.\", \"\", \"\", \"\", \"500\", \"45323\", \"UnexpectedClientError\", \"client\",\n \"Mapped to an incorrect value type. Please gather browser console logs and contact Azure Communication Services support.\", \"\", \"Mapped to an incorrect value type={0}, diagnostic value={1}, for diagnostic {2}\", \"\", \"500\", \"45400\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to UserFacingDiagnostics event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45401\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from UserFacingDiagnostics event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45402\", \"ExpectedError\", \"client\",\n \"Failed to map diagnostic quality level. Please gather browser console logs and contact Azure Communication Services support.\", \"\", \"Cannot map ts quality level {0} for {1}\", \"\", \"500\", \"45403\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to LiveStream event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45500\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribefrom LiveStream event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45501\", \"ExpectedError\", \"client\",\n \"Invalid aggregationInterval value range.\", \"\", \"\", \"\", \"400\", \"45502\", \"ExpectedError\", \"client\",\n \"invalid dataPointsPerAggregation value range.\", \"\", \"\", \"\", \"400\", \"45503\", \"ExpectedError\", \"client\",\n \"MediaStatsCallFeature has been disposed.\", \"\", \"\", \"\", \"400\", \"45504\", \"ExpectedError\", \"client\",\n \"Invalid aggregationInterval value range.\", \"\", \"\", \"\", \"400\", \"45550\", \"ExpectedError\", \"client\",\n \"invalid dataPointsPerAggregation value range.\", \"\", \"\", \"\", \"400\", \"45551\", \"ExpectedError\", \"client\",\n \"MediaStatsCallFeature has been disposed.\", \"\", \"\", \"\", \"400\", \"45552\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to OptimalVideoCount event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45600\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from OptimalVideoCount event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45601\", \"ExpectedError\", \"client\",\n \"Failed to set default microphone or speaker with error\", \"\", \"\", \"\", \"412\", \"45700\", \"UnexpectedClientError\", \"client\",\n \"Unable to return call diagnostic information.\", \"\", \"\", \"\", \"500\", \"45701\", \"UnexpectedClientError\", \"client\",\n \"Timeout in checking media stream status\", \"\", \"\", \"\", \"500\", \"45702\", \"UnexpectedClientError\", \"client\",\n \"Failed to get existing call agent or create a new one\", \"\", \"\", \"\", \"500\", \"45703\", \"UnexpectedClientError\", \"client\",\n \"Test call failed to connect\", \"\", \"\", \"\", \"500\", \"45704\", \"UnexpectedClientError\", \"client\",\n \"Call failed to render video.\", \"\", \"\", \"\", \"500\", \"45705\", \"UnexpectedClientError\", \"client\",\n \"Test call failed hang up the call\", \"\", \"\", \"\", \"500\", \"45706\", \"UnexpectedClientError\", \"client\",\n \"Failed to get video call media stats\", \"\", \"\", \"\", \"500\", \"45707\", \"UnexpectedClientError\", \"client\",\n \"Call timed out to connect. Please try again, if the issue persists, gather browser console logs and contact Azure Communication Services support.\", \"\", \"Call timeout after {0}\", \"\", \"408\", \"45708\", \"UnexpectedClientError\", \"client\",\n \"Could not initialize raise hand feature.\", \"\", \"\", \"\", \"500\", \"45750\", \"UnexpectedClientError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45751\", \"UnexpectedServerError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45752\", \"UnexpectedServerError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45753\", \"UnexpectedServerError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45754\", \"UnexpectedServerError\", \"client\",\n \"Could not change a participant state.\", \"\", \"\", \"\", \"500\", \"45755\", \"UnexpectedServerError\", \"client\",\n \"Lower hands request failed because participant list is empty.\", \"\", \"\", \"\", \"400\", \"45756\", \"ExpectedError\", \"client\",\n \"Raise hands request failed because participant list is empty.\", \"\", \"\", \"\", \"400\", \"45757\", \"ExpectedError\", \"client\",\n \"Call is not connected yet to send reaction\", \"\", \"\", \"\", \"400\", \"45800\", \"ExpectedError\", \"client\",\n \"Reaction send is not supported for 1:1 direct calling with teams identity\", \"\", \"\", \"\", \"400\", \"45801\", \"ExpectedError\", \"client\",\n \"Unable to register listener due to meeting policy\", \"\", \"\", \"\", \"403\", \"45802\", \"ExpectedError\", \"client\",\n \"Unable to deregister listener due to meeting policy\", \"\", \"\", \"\", \"403\", \"45803\", \"ExpectedError\", \"client\",\n \"Unable to send reaction due to meeting policy\", \"\", \"\", \"\", \"403\", \"45804\", \"ExpectedError\", \"client\",\n \"Could not create state service proxy web-socket connection\", \"\", \"\", \"\", \"500\", \"45805\", \"UnexpectedServerError\", \"client\",\n \"Could not create sync map to exchange reaction\", \"\", \"\", \"\", \"500\", \"45806\", \"UnexpectedServerError\", \"client\",\n \"Unable to handle send reaction\", \"\", \"\", \"\", \"400\", \"45807\", \"ExpectedError\", \"client\",\n \"Unable to handle send reaction\", \"\", \"\", \"\", \"500\", \"45808\", \"UnexpectedClientError\", \"client\",\n \"Unable to parse reaction\", \"\", \"\", \"\", \"500\", \"45809\", \"UnexpectedClientError\", \"client\",\n \"Not able to subscribe to Reation event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45810\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Reaction event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45811\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to Recording event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"45850\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from Recording event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"45851\", \"ExpectedError\", \"client\",\n \"Recording status already set.\", \"\", \"\", \"\", \"400\", \"45852\", \"ExpectedError\", \"client\",\n \"Bad request. All participants are already spotlighted\", \"\", \"\", \"\", \"400\", \"45900\", \"ExpectedError\", \"client\",\n \"Internal Error. Start spotlight for participants failed\", \"\", \"\", \"\", \"500\", \"45901\", \"UnexpectedServerError\", \"client\",\n \"Failed to start spotlight. Reached the maximum number of participants that can be Spotlighted.\", \"\", \"startSpotlight failed. {0} is the max number of participants that can be Spotlighted\", \"\", \"400\", \"45902\", \"ExpectedError\", \"client\",\n \"Failed to spotlight. User does not have a Presenter or Organizer role.\", \"\", \"{0} spotlight failed. User does not have a Presenter or Organizer role in {1}\", \"\", \"403\", \"45903\", \"ExpectedError\", \"client\",\n \"Spotlight feature is not enabled\", \"\", \"\", \"\", \"400\", \"45904\", \"ExpectedError\", \"client\",\n \"StartSpotlight failed. Participant list is empty\", \"\", \"\", \"\", \"400\", \"45905\", \"ExpectedError\", \"client\",\n \"Teams meeting audio conferencing feature is only available in meetings\", \"\", \"\", \"\", \"400\", \"45950\", \"ExpectedError\", \"client\",\n \"The Teams meeting audio conferencing details feature is disabled by ACS service.\", \"\", \"Teams meeting audio conferencing details feature is disabled\", \"\", \"405\", \"45951\", \"ExpectedError\", \"client\",\n \"Teams meeting audio conferencing details are not available before joining the Teams meeting\", \"\", \"\", \"\", \"400\", \"45952\", \"ExpectedError\", \"client\",\n \"Teams meeting audio conferencing details are not available in Lobby\", \"\", \"\", \"\", \"400\", \"45953\", \"ExpectedError\", \"client\",\n \"Teams meeting audio conferencing details is not configured\", \"\", \"\", \"\", \"400\", \"45954\", \"UnexpectedClientError\", \"client\",\n \"Error retrieving Teams meeting audio conferencing details\", \"\", \"\", \"\", \"500\", \"45955\", \"UnexpectedServerError\", \"client\",\n \"Transcription status already set.\", \"\", \"\", \"\", \"400\", \"46000\", \"ExpectedError\", \"client\",\n \"Transfer to target failed\", \"\", \"\", \"\", \"500\", \"46050\", \"UnexpectedClientError\", \"client\",\n \"Transfer is not supported in this call.\", \"\", \"\", \"\", \"400\", \"46051\", \"ExpectedError\", \"client\",\n \"Transfer target is not recognized.\", \"\", \"\", \"\", \"400\", \"46052\", \"ExpectedError\", \"client\",\n \"Invalid target participant type detected.\", \"\", \"Invalid target participant type detected: {0}.\", \"\", \"400\", \"46053\", \"ExpectedError\", \"client\",\n \"UnmixedAudio is not available.\", \"\", \"\", \"\", \"500\", \"46100\", \"UnexpectedClientError\", \"client\",\n \"The operation cannot be done because there is a pending operation\", \"\", \"\", \"\", \"400\", \"46101\", \"ExpectedError\", \"client\",\n \"The operation is not supported in peer-to-peer call\", \"\", \"\", \"\", \"400\", \"46102\", \"ExpectedError\", \"client\",\n \"Unmixed audio has been enabled\", \"\", \"\", \"\", \"400\", \"46103\", \"ExpectedError\", \"client\",\n \"Unmixed audio has been disabled\", \"\", \"\", \"\", \"400\", \"46104\", \"ExpectedError\", \"client\",\n \"Unmixed audio has been disposed\", \"\", \"\", \"\", \"400\", \"46105\", \"ExpectedError\", \"client\",\n \"Not able to subscribe or unsubscibe to UnmixedAudio event, unknown event name.\", \"\", \"Unable to {0} to event {1}, unknown event name\", \"\", \"422\", \"46106\", \"ExpectedError\", \"client\",\n \"Wrong argument type specified.\", \"\", \"TypeError: Expect '{0}' to be of type '{1}'\", \"\", \"400\", \"46107\", \"ExpectedError\", \"client\",\n \"Wrong value specified.\", \"\", \"ValueError: Expect '{0}' to be '{1}'\", \"\", \"400\", \"46108\", \"ExpectedError\", \"client\",\n \"Invalid state.\", \"\", \"Invalid state: {0}\", \"\", \"400\", \"46109\", \"ExpectedError\", \"client\",\n \"Unknown error\", \"\", \"\", \"\", \"500\", \"46110\", \"UnexpectedClientError\", \"client\",\n \"Failed to enable unmixed audio: AudioContext={0}, UnmixedAudio={1}\", \"\", \"\", \"\", \"500\", \"46111\", \"UnexpectedClientError\", \"client\",\n \"Failed to disable unmixed audio: AudioContext={0}, UnmixedAudio={1}\", \"\", \"\", \"\", \"500\", \"46112\", \"UnexpectedClientError\", \"client\",\n \"Failed to initialize unmixed audio.\", \"\", \"\", \"\", \"500\", \"46113\", \"UnexpectedClientError\", \"client\",\n \"Video effects feature is currently disabled by Azure Communication Services.\", \"\", \"Disabled.\", \"\", \"403\", \"46150\", \"ExpectedError\", \"client\",\n \"VideoEffects feature is disposed. Create a new VideoEffects Feature instance.\", \"\", \"\", \"\", \"400\", \"46151\", \"ExpectedError\", \"client\",\n \"Current source is unsupported to use effects\", \"\", \"\", \"\", \"415\", \"46152\", \"ExpectedError\", \"client\",\n \"Failed to get device manager to start effects.\", \"\", \"\", \"\", \"500\", \"46153\", \"UnexpectedClientError\", \"client\",\n \"EffectProvider not available\", \"\", \"\", \"\", \"500\", \"46154\", \"UnexpectedClientError\", \"client\",\n \"Failed to get WebCV provider.\", \"\", \"\", \"\", \"500\", \"46155\", \"UnexpectedClientError\", \"client\",\n \"Effect is not supported.\", \"\", \"\", \"\", \"501\", \"46156\", \"UnexpectedClientError\", \"client\",\n \"VideoEffects feature is disposed. Create a new VideoEffects Feature instance.\", \"\", \"\", \"\", \"400\", \"46157\", \"UnexpectedClientError\", \"client\",\n \"Failed to get device manager to stop effects.\", \"\", \"\", \"\", \"500\", \"46158\", \"UnexpectedClientError\", \"client\",\n \"Invalid effect provided\", \"\", \"\", \"\", \"400\", \"46159\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to event , unknown event name\", \"\", \"\", \"\", \"400\", \"46160\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe event , unknown event name\", \"\", \"\", \"\", \"400\", \"46161\", \"ExpectedError\", \"client\",\n \"Timed promise; rejected.\", \"\", \"\", \"\", \"408\", \"46162\", \"UnexpectedClientError\", \"client\",\n \"Error while checking support\", \"\", \"\", \"\", \"501\", \"46163\", \"UnexpectedClientError\", \"client\",\n \"Error starting video effects\", \"\", \"\", \"\", \"500\", \"46164\", \"UnexpectedClientError\", \"client\",\n \"Error stopping video effects\", \"\", \"\", \"\", \"500\", \"46165\", \"UnexpectedClientError\", \"client\",\n \"Error disposing video effects feature\", \"\", \"\", \"\", \"500\", \"46166\", \"UnexpectedClientError\", \"client\",\n \"Effect is not available. Try again when the effect is initialized and available\", \"\", \"\", \"\", \"500\", \"46167\", \"UnexpectedClientError\", \"client\",\n \"Effect can not be enabled because of Teams Policy\", \"\", \"\", \"\", \"403\", \"46168\", \"ExpectedError\", \"client\",\n \"Local Recording feature is only available in meetings\", \"\", \"\", \"\", \"400\", \"46200\", \"ExpectedError\", \"client\",\n \"Local Recording feature is currently disabled by Azure Communication Service.\", \"\", \"Local Recording feature is disabled\", \"\", \"405\", \"46201\", \"ExpectedError\", \"client\",\n \"Not able to subscribe to LocalRecording event, unknown event name.\", \"\", \"Not able to subscribe to event {0}, unknown event name\", \"\", \"422\", \"46202\", \"ExpectedError\", \"client\",\n \"Not able to unsubscribe from LocalRecording event, unknown event name.\", \"\", \"Not able to unsubscribe event {0}, unknown event name\", \"\", \"422\", \"46203\", \"ExpectedError\", \"client\",\n \"Failed to start video, permission was not granted to use selected video device. Ensure video device permissions are allowed in the browser's settings and in the system's setttings.\", \"\", \"Video operation failure permissionDeniedError\", \"\", \"403\", \"43001\", \"ExpectedError\", \"client\",\n \"Call ended successfully by local participant.\", \"\", \"\", \"\", \"0\", \"0\", \"Success\", \"service\",\n \"Call ended for all users by the meeting organizer.\", \"\", \"\", \"\", \"0\", \"4097\", \"Success\", \"service\",\n \"Call ended because user disconnected from the call abruptly, this may be a result of a user closing the application that hosted the call, eg a user terminated application, closed browser of browser tab without proper hang-up.\", \"\", \"\", \"\", \"0\", \"4521\", \"ExpectedError\", \"service\",\n \"Call ended for this participant as it was removed from the conversation by another participant.\", \"\", \"\", \"\", \"0\", \"5000\", \"Success\", \"service\",\n \"Call ended successfully, as all callee endpoints declined the call.\", \"\", \"\", \"\", \"0\", \"5003\", \"Success\", \"service\",\n \"This conversation has ended as only one participant was remaining in the conversation.\", \"\", \"\", \"\", \"0\", \"5010\", \"Success\", \"service\",\n \"This conversation has ended as no one else has joined the group call.\", \"\", \"\", \"\", \"0\", \"5013\", \"Success\", \"service\",\n \"\", \"\", \"\", \"\", \"0\", \"5014\", \"Success\", \"service\",\n \"Call ended for this participant as it was removed from the conversation by another participant.\", \"\", \"\", \"\", \"0\", \"5300\", \"Success\", \"service\",\n \"Removed from the Teams meeting lobby by another participant.\", \"\", \"\", \"\", \"0\", \"5854\", \"Success\", \"service\",\n \"Removed from Teams meeting lobby due to inactivity timeout.\", \"\", \"\", \"\", \"0\", \"5855\", \"Success\", \"service\",\n \"Call ended by Azure Communication Services platform.\", \"\", \"\", \"\", \"0\", \"7000\", \"Success\", \"service\",\n \"Call ended by service because transfer completed successfully.\", \"\", \"\", \"\", \"0\", \"7015\", \"Success\", \"service\",\n \"Call is ended.\", \"\", \"\", \"\", \"0\", \"540000\", \"\", \"service\",\n \"Call ended successfully by remote PSTN participant.\", \"\", \"\", \"\", \"0\", \"560000\", \"Success\", \"service\",\n \"Error from CreateUsageRequest: User is not entitled to call this destination.\", \"\", \"\", \"\", \"400\", \"580040\", \"ExpectedError\", \"service\",\n \"Unauthenticated identity.\", \"\", \"\", \"\", \"401\", \"10009\", \"UnexpectedClientError\", \"service\",\n \"Call ended, as it has been marked as a spam and got blocked.\", \"\", \"\", \"\", \"403\", \"510403\", \"ExpectedError\", \"service\",\n \"Call was forbidden, cancelled or rejected\", \"\", \"\", \"\", \"403\", \"560403\", \"UnexpectedClientError\", \"service\",\n \"Call failed, unable to start or join to a call with given Id, call does not exist. Please check if provided id is correct, and if the call did not end already and try again.\", \"\", \"\", \"\", \"404\", \"404\", \"UnexpectedClientError\", \"service\",\n \"Call failed, unable to start or join to a call with given Id, call does not exist. Please check if provided id is correct, and if the call did not end already and try again.\", \"\", \"\", \"\", \"404\", \"4500\", \"ExpectedError\", \"service\",\n \"Phone number not found.\", \"\", \"\", \"\", \"404\", \"560404\", \"ExpectedError\", \"service\",\n \"Call failed, callee failed to finalize call setup, most likely callee lost network or terminated the application abruptly. Ensure clients are connected and available.\", \"\", \"\", \"\", \"408\", \"10057\", \"ExpectedError\", \"service\",\n \"\", \"\", \"\", \"\", \"408\", \"10325\", \"UnexpectedClientError\", \"service\",\n \"Gateway (SBC) failover timer expired.\", \"\", \"\", \"\", \"408\", \"500001\", \"ExpectedError\", \"service\",\n \"The called party did not respond.\", \"\", \"\", \"\", \"408\", \"560408\", \"\", \"service\",\n \"Media dropped during connect.\", \"\", \"\", \"\", \"410\", \"3100\", \"ExpectedError\", \"service\",\n \"\", \"\", \"\", \"\", \"410\", \"3101\", \"\", \"service\",\n \"\", \"\", \"\", \"\", \"410\", \"3112\", \"\", \"service\",\n \"Participant was removed from the call by the Azure Communication Services infrastructure due to loss of media connectivity with Azure Communication Services infrastructure, this usually happens if participant leaves the call abruptly or looses network connectivity. If participant wants to continue the call, it should reconnect.\", \"\", \"\", \"\", \"410\", \"301005\", \"UnexpectedClientError\", \"service\",\n \"\", \"\", \"\", \"\", \"429\", \"5029\", \"ExpectedError\", \"service\",\n \"This call has exceeded the maximum call lifetime.\", \"\", \"\", \"\", \"429\", \"10110\", \"ExpectedError\", \"service\",\n \"Unable to deliver message to client application. Please ensure the client application is successfully sending netwwork requests to Azure Communication Services.\", \"\", \"\", \"\", \"430\", \"10315\", \"\", \"service\",\n \"Unable to deliver message to client application. Please ensure the client application is successfully sending netwwork requests to Azure Communication Services.\", \"\", \"\", \"\", \"430\", \"10317\", \"\", \"service\",\n \"\", \"\", \"\", \"\", \"480\", \"10037\", \"ExpectedError\", \"service\",\n \"Remote client endpoint not registered. Please ensure the client application is successfully sending netwwork requests to Azure Communication Services.\", \"\", \"\", \"\", \"480\", \"10076\", \"ExpectedError\", \"service\",\n \"No answer.\", \"\", \"\", \"\", \"480\", \"560480\", \"UnexpectedServerError\", \"service\",\n \"Incomplete/Invalid callee address.\", \"\", \"\", \"\", \"484\", \"560484\", \"\", \"service\",\n \"Call ended because remote PSTN participant was busy. The number called was already in a call or having technical issues.\", \"\", \"\", \"\", \"486\", \"560486\", \"Success\", \"service\",\n \"Call ended successfully as caller cancelled the call.\", \"\", \"\", \"\", \"487\", \"0\", \"Success\", \"service\",\n \"Call canceled, locally declined, ended due to an endpoint mismatch issue, or failed to generate media offer.\", \"\", \"\", \"\", \"487\", \"4501\", \"\", \"service\",\n \"Call was accepted elsewhere, by another endpoint of this user.\", \"\", \"\", \"\", \"487\", \"10003\", \"Success\", \"service\",\n \"Call was canceled on timeout, no callee endpoint accepted on time. Ensure that user saw the notification and try to initiate that call again.\", \"\", \"\", \"\", \"487\", \"10004\", \"ExpectedError\", \"service\",\n \"Call ended successfully as it was declined by all callee endpoints.\", \"\", \"\", \"\", \"487\", \"10024\", \"Success\", \"service\",\n \"Call canceled, locally declined, ended due to an endpoint mismatch issue, or failed to generate media offer.\", \"\", \"\", \"\", \"487\", \"540200\", \"Success\", \"service\",\n \"Call ended successfully as caller cancelled the call.\", \"\", \"\", \"\", \"487\", \"540487\", \"Success\", \"service\",\n \"Call cancelled by originator.\", \"\", \"\", \"\", \"487\", \"560487\", \"\", \"service\",\n \"Call ended as application did not provide a valid Azure Communication Services token.\", \"\", \"\", \"\", \"495\", \"4507\", \"UnexpectedClientError\", \"service\",\n \"Azure Communication Services infrastructure error. Please gather browser console logs, .HAR file, and contact Azure Communication Services support.\", \"\", \"\", \"\", \"500\", \"10045\", \"\", \"service\",\n \"Unexpected server error\", \"\", \"\", \"\", \"503\", \"560503\", \"UnexpectedServerError\", \"service\",\n \"Call ended successfully as it was declined by callee.\", \"\", \"\", \"\", \"603\", \"0\", \"Success\", \"service\"\n];\nlet divide = (a:real,b:real) { \n iif(b == 0.0 or isnan(b) or isnull(b), real(null), a / b) \n};\nlet reliability = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good), attempts); \n iff(isnull(ratio), real(null), round(100.00 * ratio, decimals)) \n};\nlet reliability_upperbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_upper = ratio + 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_upper_1 = iff(ratio_upper > 1.0, 1.0, ratio_upper); \n iff(isnull(ratio), real(null), round(100.00 * ratio_upper_1, decimals)) \n};\nlet reliability_lowerbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_lower = ratio - 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_lower_1 = iff(ratio_lower < 0.0, 0.0, ratio_lower); \n iff(isnull(ratio), real(null), round(100.00 * ratio_lower_1, decimals)) \n};\nlet compareMetricWithThreshold = (cmpOperator:string,metricValue:real,threshold:real) { \n case( \n cmpOperator == '==', \n metricValue == threshold, \n cmpOperator == '!=', \n metricValue != threshold, \n cmpOperator == '>', \n metricValue > threshold, \n cmpOperator == '>=', \n metricValue >= threshold, \n cmpOperator == '<', \n metricValue < threshold, \n cmpOperator == '<=', \n metricValue <= threshold, \n bool(null) \n) \n};\n//\nlet applyGoalsOnLegMetric = (legMetricResult:(timestamp:datetime,metricName:string,localParticipantId:string,metricValue:real,metricValueUpperBound:real,metricValueLowerBound:real,SdkVersion:string,ResultType:string,SubCode:string,Platform:string,CallType:string,callId:string)) {\n metricsMetadata\n | join kind=innerunique legMetricResult on metricName\n | extend cmpOperator = cmpOperatorLeg, threshold=targetThresholdLeg, unit=aggregLegUnit\n | project\n timestamp,\n metricName,\n localParticipantId,\n metricValue,\n metricValueUpperBound,\n metricValueLowerBound,\n goal = strcat(cmpOperator, ' ', threshold),\n succeeded= compareMetricWithThreshold(cmpOperator, metricValueUpperBound, threshold),\n unit,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n};\nlet AttemptSuccessFailureLegMetric = (attempt_and_failure_event:(EventInfo_Time:datetime,localParticipantId:string,metricName:string,kind_of_event:string,SdkVersion:string,ResultType:string,SubCode:string,callId:string,UserAgent:string,Platform:string,CallType:string),startDateTime:datetime,endDateTime:datetime) {\n let metadata = metricsMetadata | project metricName, aggregLegRounding;\n let attempt_and_failure_event_with_meta=attempt_and_failure_event | join kind=inner metadata on metricName;\n let attempt_event=attempt_and_failure_event_with_meta | where kind_of_event == 'attempt';\n let failure_event=attempt_and_failure_event_with_meta | where kind_of_event == 'failure';\n let pool = \n attempt_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | project \n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=1.0 * count(),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n let bad= \n failure_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | join kind=leftsemi pool on localParticipantId, metricName\n | project\n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n failures=1.0 * count(),\n EventInfo_Time=max(EventInfo_Time),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n //\n union hint.spread=2 pool, bad\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=sum(attempts),\n failures=sum(failures),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by localParticipantId, metricName\n | extend successes = max_of(attempts - failures, 0) //protect against failures>attempts\n | project\n timestamp=EventInfo_Time,\n metricName,\n localParticipantId,\n metricValue=reliability(successes, attempts),\n metricValueUpperBound=reliability_upperbound(successes, attempts),\n metricValueLowerBound=reliability_lowerbound(successes, attempts),\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n callId\n | invoke applyGoalsOnLegMetric()\n};\nlet clean_result_type = (result_type:string) {\n case (\n result_type contains 'Success' or result_type contains \"Succeeded\",\n 'Succeeded',\n result_type contains 'ExpectedError',\n 'ExpectedError',\n result_type contains 'UnexpectedServerError',\n 'UnexpectedServerError',\n 'UnexpectedClientError'\n )\n};\nlet ASF_Filter = (d:(EventInfo_Time:datetime,localParticipantId:string),startDateTime:datetime,endDateTime:datetime) { \n d \n | where EventInfo_Time between(startDateTime .. endDateTime) and isnotempty(localParticipantId) \n};\nlet ASF3 = (attempt:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),failure:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),metricName:string,startDateTime:datetime,endDateTime:datetime) {\n let fa = ASF_Filter((attempt), startDateTime, endDateTime);\n union\n (\n ASF_Filter((failure), startDateTime, endDateTime)\n | join kind = leftsemi fa on localParticipantId\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='failure',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n ),\n (\n fa\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='attempt',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n )\n};\nlet argStartDateTime = {TimeRange:start};\nlet argEndDateTime = {TimeRange:end};\n//\n//\n// api reliability\nlet startCall = \nACSCallClientOperations\n| where OperationName == 'StartCall'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet startCall_attempt = startCall;\nlet startCall_failure = startCall_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet accept = \nACSCallClientOperations\n| where OperationName == 'AcceptIncomingCall'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet accept_attempt = accept;\nlet accept_failure = accept_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet callJoin = \nACSCallClientOperations\n| where OperationName == 'Join'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet join_attempt = callJoin;\nlet join_failure = join_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_startVideo = \nACSCallClientOperations\n| where OperationName == 'StartVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_startVideo_attempt = api_startVideo;\nlet api_startVideo_failure = api_startVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_stopVideo = \nACSCallClientOperations\n| where OperationName == 'StopVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_stopVideo_attempt = api_stopVideo;\nlet api_stopVideo_failure = api_stopVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_startScreenshare = \nACSCallClientOperations\n| where OperationName == 'StartScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_startScreenshare_attempt = api_startScreenshare;\nlet api_startScreenshare_failure = api_startScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_stopScreenshare = \nACSCallClientOperations\n| where OperationName == 'StopScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_stopScreenshare_attempt = api_stopScreenshare;\nlet api_stopScreenshare_failure = api_stopScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet api_createView = \nACSCallClientOperations\n| where OperationName == 'CreateView'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet api_createView_attempt = api_createView;\nlet api_createView_failure = api_createView_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\n// Leg reliability\n//\nlet callagent_init = \nACSCallClientOperations\n| where OperationName == 'CallAgentInit'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=coalesce(ParticipantId, strcat('using client instance id for out of call context operations: ', ClientInstanceId))\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet callagent_init_attempt = callagent_init;\nlet callagent_init_failure = callagent_init_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_stopVideo = \nACSCallClientOperations\n| where OperationName == 'StopVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_stopVideo_attempt = leg_stopVideo;\nlet leg_stopVideo_failure = leg_stopVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_startVideo = \nACSCallClientOperations\n| where OperationName == 'StartVideo'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_startVideo_attempt = leg_startVideo;\nlet leg_startVideo_failure = leg_startVideo_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_startScreenshare = \nACSCallClientOperations\n| where OperationName == 'StartScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_startScreenshare_attempt = leg_startScreenshare;\nlet leg_startScreenshare_failure = leg_startScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_stopScreenshare = \nACSCallClientOperations\n| where OperationName == 'StopScreenShare'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_stopScreenshare_attempt = leg_stopScreenshare;\nlet leg_stopScreenshare_failure = leg_stopScreenshare_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet leg_createView = \nACSCallClientOperations\n| where OperationName == 'CreateView'\n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=ParticipantId\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform) \n| extend CallType = tostring(OperationPayload.CallType);\nlet leg_createView_attempt = leg_createView;\nlet leg_createView_failure = leg_createView_attempt | where ResultType !in ('Success', 'Succeeded', 'ExpectedError');\n//\nlet cdc_metrics_aggregation =\nunion\n ASF3(startCall_attempt, startCall_failure, 'reliability/api/StartCall', argStartDateTime, argEndDateTime),\n ASF3(accept_attempt, accept_failure, 'reliability/api/AcceptIncomingCall', argStartDateTime, argEndDateTime),\n ASF3(join_attempt, join_failure, 'reliability/api/Join', argStartDateTime, argEndDateTime),\n\tASF3(api_startVideo_attempt, api_startVideo_failure, 'reliability/api/StartVideo', argStartDateTime, argEndDateTime),\n\tASF3(api_stopVideo_attempt, api_stopVideo_failure, 'reliability/api/StopVideo', argStartDateTime, argEndDateTime),\n\tASF3(api_startScreenshare_attempt, api_startScreenshare_failure, 'reliability/api/StartScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(api_stopScreenshare_attempt, api_stopScreenshare_failure, 'reliability/api/StopScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(api_createView_attempt, api_createView_failure, 'reliability/api/CreateView', argStartDateTime, argEndDateTime),\n\t//\n ASF3(callagent_init_attempt, callagent_init_failure, 'reliability/CallAgentInit', argStartDateTime, argEndDateTime),\n\tASF3(leg_startVideo_attempt, leg_startVideo_failure, 'reliability/StartVideo', argStartDateTime, argEndDateTime),\n\tASF3(leg_stopVideo_attempt, leg_stopVideo_failure, 'reliability/StopVideo', argStartDateTime, argEndDateTime),\n\tASF3(leg_startScreenshare_attempt, leg_startScreenshare_failure, 'reliability/StartScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(leg_stopScreenshare_attempt, leg_stopScreenshare_failure, 'reliability/StopScreenShare', argStartDateTime, argEndDateTime),\n\tASF3(leg_createView_attempt, leg_createView_failure, 'reliability/CreateView', argStartDateTime, argEndDateTime)\n| invoke AttemptSuccessFailureLegMetric(argStartDateTime, argEndDateTime)\n| extend timestampBin = bin(timestamp, 1d)\n| summarize\n timestamp_max = max(timestamp)\n by \n localParticipantId,\n callId,\n metricName,\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n timestampBin\n;\nlet selected_metric_reliability = todynamic('{MetricName}');\nlet sdkversion_selection = dynamic([{SDKVersion}]);\nlet resultType_selection = dynamic([{ResultType}]);\nlet platform_selection = dynamic([{platform}]);\nlet selected_subcode = dynamic('{selected_subcode}');\ncdc_metrics_aggregation\n| where isempty(selected_metric_reliability) or metricName == selected_metric_reliability\n| where array_length(sdkversion_selection) == 0 or SdkVersion in (sdkversion_selection)\n| where array_length(resultType_selection) == 0 or ResultType in (resultType_selection)\n| where array_length(platform_selection) == 0 or Platform in (platform_selection)\n| where isempty(selected_subcode) or SubCode == selected_subcode\n| summarize arg_max(timestamp_max, *) by metricName, SdkVersion, ResultType, SubCode, timestampBin, CallType, Platform, localParticipantId, callId\n| join kind=leftouter SubCodes on $left.SubCode == $right.subCode\n| project \n ['Call ID']=callId, ['Participant ID']=localParticipantId, ['Time'] = timestamp_max, message, resultCategories",
+ "size": 1,
+ "title": "Call IDs with Subcode {selected_subcode}",
+ "noDataMessage": "No reliability logs found in the specified time range",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "gridSettings": {
+ "formatters": [
+ {
+ "columnMatch": "Call ID",
+ "formatter": 5
+ }
+ ],
+ "hierarchySettings": {
+ "treeType": 1,
+ "groupBy": [
+ "Call ID"
+ ],
+ "expandTopLevel": false
+ }
+ }
},
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "OperationDate",
- "formatter": 5
- },
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- },
- "sortBy": [
- {
- "itemKey": "$gen_count_$gen_group_0",
- "sortOrder": 2
- }
- ]
- },
- "sortBy": [
- {
- "itemKey": "$gen_count_$gen_group_0",
- "sortOrder": 2
- }
- ],
- "tileSettings": {
- "titleContent": {
- "formatter": 1
- },
- "leftContent": {
- "columnMatch": "Operations",
- "formatter": 12,
- "formatOptions": {
- "palette": "blueGreen"
- },
- "numberFormat": {
- "unit": 17,
- "options": {
- "style": "decimal",
- "maximumFractionDigits": 2
- }
- }
- },
- "showBorder": true,
- "sortCriteriaField": "Calls"
- },
- "textSettings": {
- "style": "bignumber"
- }
- },
- "customWidth": "34",
- "name": "count-operations2-details"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSCallAutomationIncomingOperations \r\n| where TimeGenerated {time_range:query}\r\n| where (ResultSignature >= 500 and ResultSignature < 600)\r\n| summarize Errors = count() \r\n",
- "size": 0,
- "title": "Count of Operational Errors (5xx errors only)",
- "noDataMessage": "No operations found for the specified time range and OperationName",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "crossComponentResources": [],
- "visualization": "tiles",
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
+ "conditionalVisibility": {
+ "parameterName": "selected_subcode",
+ "comparison": "isNotEqualTo"
},
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
- }
- ]
- }
+ "name": "subcode"
+ }
+ ]
},
- {
- "columnMatch": "OperationDate",
- "formatter": 5
+ "conditionalVisibility": {
+ "parameterName": "MetricName",
+ "comparison": "isNotEqualTo"
},
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- },
- "sortBy": [
- {
- "itemKey": "$gen_count_$gen_group_0",
- "sortOrder": 2
- }
- ]
- },
- "sortBy": [
- {
- "itemKey": "$gen_count_$gen_group_0",
- "sortOrder": 2
+ "name": "failure breakdown"
}
],
- "tileSettings": {
- "titleContent": {
- "formatter": 1
- },
- "leftContent": {
- "columnMatch": "Errors",
- "formatter": 12,
- "formatOptions": {
- "palette": "blueGreen"
- },
- "numberFormat": {
- "unit": 17,
- "options": {
- "style": "decimal",
- "maximumFractionDigits": 2
- }
- }
- },
- "showBorder": true,
- "sortCriteriaField": "Calls"
- },
- "textSettings": {
- "style": "bignumber"
- }
+ "exportParameters": true
},
- "customWidth": "33",
- "name": "count-operations3-details"
+ "name": "Metric Reliability"
}
- ]
+ ],
+ "exportParameters": true
},
- "customWidth": "100",
- "name": "count-calls-summary-group "
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Count of Active Calls",
- "items": [
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSCallAutomationIncomingOperations \r\n| where TimeGenerated {time_range:query} \r\n| extend time_span = floor(TimeGenerated, {time_granularity})\r\n| summarize Calls = count_distinct(CorrelationId) by time_span\r\n| render columnchart",
- "size": 0,
- "noDataMessage": "No operations found for the specified time range and OperationName",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "crossComponentResources": [],
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
- },
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "OperationDate",
- "formatter": 5
- },
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- },
- "sortBy": [
- {
- "itemKey": "$gen_count_$gen_group_0",
- "sortOrder": 2
- }
- ]
- },
- "sortBy": [
- {
- "itemKey": "$gen_count_$gen_group_0",
- "sortOrder": 2
- }
- ]
- },
- "customWidth": "100",
- "name": "count-operations-details"
- }
- ]
+ "conditionalVisibility": {
+ "parameterName": "calling_tab",
+ "comparison": "isEqualTo",
+ "value": "reliability"
},
- "customWidth": "100",
- "name": "count-calls-group "
+ "name": "voice-video-reliability"
},
{
"type": 12,
"content": {
"version": "NotebookGroup/1.0",
"groupType": "editable",
- "title": "Count of Operations",
"items": [
- {
- "type": 9,
- "content": {
- "version": "KqlParameterItem/1.0",
- "crossComponentResources": [],
- "parameters": [
- {
- "id": "0c0b56fd-ffd9-4761-b14e-c916660f9ccc",
- "version": "KqlParameterItem/1.0",
- "name": "operation_name",
- "label": "OperationName",
- "type": 2,
- "description": "Choose a delivery status to visualize",
- "multiSelect": true,
- "quote": "'",
- "delimiter": ",",
- "query": "ACSCallAutomationIncomingOperations \r\n| where TimeGenerated {time_range:query}\r\n| order by TimeGenerated\r\n| distinct OperationName\r\n",
- "crossComponentResources": [],
- "typeSettings": {
- "additionalResourceOptions": [
- "value::all"
- ],
- "showDefault": false
- },
- "defaultValue": "value::all",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "value": [
- "value::all"
- ]
- }
- ],
- "style": "pills",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "customWidth": "50",
- "name": "parameters - percentiles"
- },
- {
- "type": 9,
- "content": {
- "version": "KqlParameterItem/1.0",
- "crossComponentResources": [],
- "parameters": [
- {
- "id": "de286d0d-1892-4c99-89db-b8dc1282f296",
- "version": "KqlParameterItem/1.0",
- "name": "operation_version",
- "label": "OperationVersion",
- "type": 2,
- "description": "Choose a delivery status to visualize",
- "multiSelect": true,
- "quote": "'",
- "delimiter": ",",
- "query": "ACSCallAutomationIncomingOperations \r\n| where TimeGenerated {time_range:query}\r\n| where OperationName in ({operation_name})\r\n| order by TimeGenerated\r\n| distinct OperationVersion\r\n",
- "crossComponentResources": [],
- "typeSettings": {
- "additionalResourceOptions": [
- "value::all"
- ],
- "showDefault": false
- },
- "defaultValue": "value::all",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "value": [
- "value::all"
- ]
- }
- ],
- "style": "pills",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "customWidth": "50",
- "name": "parameters - percentiles2 "
- },
{
"type": 1,
"content": {
- "json": "**Select 1 or several OperationNames and OperationVersions from the drop-down menu to display its associated data**",
- "style": "info"
- },
- "conditionalVisibility": {
- "parameterName": "operation_name",
- "comparison": "isEqualTo"
- },
- "name": "operations-percentiles-drilldown-info"
- },
- {
- "type": 3,
- "content": {
- "version": "KqlItem/1.0",
- "query": "ACSCallAutomationIncomingOperations \r\n| where OperationName in ({operation_name}) \r\n| where OperationVersion in ({operation_version}) \r\n| where TimeGenerated {time_range:query} \r\n| extend time_span = floor(TimeGenerated, {time_granularity})\r\n| summarize count() by time_span, OperationName\r\n| render columnchart\r\n",
- "size": 0,
- "noDataMessage": "No operations found for the specified time range and OperationName",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "crossComponentResources": [],
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
- },
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "OperationDate",
- "formatter": 5
- },
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- },
- "sortBy": [
- {
- "itemKey": "$gen_count_$gen_group_0",
- "sortOrder": 2
- }
- ]
- },
- "sortBy": [
- {
- "itemKey": "$gen_count_$gen_group_0",
- "sortOrder": 2
- }
- ]
- },
- "customWidth": "100",
- "conditionalVisibility": {
- "parameterName": "operation_name",
- "comparison": "isNotEqualTo"
- },
- "name": "count-operations-details"
- }
- ]
- },
- "customWidth": "100",
- "name": "operations-percentiles-drill-down-group"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "Count of Operational Result Signatures",
- "items": [
- {
- "type": 9,
- "content": {
- "version": "KqlParameterItem/1.0",
- "crossComponentResources": [],
- "parameters": [
- {
- "id": "0c0b56fd-ffd9-4761-b14e-c916660f9ccc",
- "version": "KqlParameterItem/1.0",
- "name": "operation_name0",
- "label": "OperationName",
- "type": 2,
- "description": "Choose a delivery status to visualize",
- "multiSelect": true,
- "quote": "'",
- "delimiter": ",",
- "query": "ACSCallAutomationIncomingOperations \r\n| where TimeGenerated {time_range:query}\r\n| order by TimeGenerated\r\n| distinct OperationName\r\n",
- "crossComponentResources": [],
- "typeSettings": {
- "additionalResourceOptions": [
- "value::all"
- ],
- "showDefault": false
- },
- "defaultValue": "value::all",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "value": [
- "value::all"
- ]
- }
- ],
- "style": "pills",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
+ "json": "# User Facing Diagnostics \nUFDs help identify issues that may affect call quality for users. They provide a way to examine various properties of a call to determine potential problems, such as poor network conditions or a muted microphone. When a User Facing Diagnostic event is triggered, it indicates that there may be an underlying issue impacting the user's experience. However, it's important to note that the output from User Facing Diagnostics is informational only and does not alter the calling stack or make any changes based on the diagnostics fired\n",
+ "style": "info"
+ },
+ "name": "text - 0"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "Please note that all presented numbers in all the following visuals may be different from billing record, they are created with server and client logs, which may be prone to data loss"
},
- "customWidth": "33",
- "name": "parameters - errors"
+ "name": "disclaimer"
},
{
"type": 9,
"content": {
"version": "KqlParameterItem/1.0",
- "crossComponentResources": [],
"parameters": [
{
- "id": "c923cdd1-82ff-4308-ada1-c1e0a2e31f2b",
+ "id": "7ba0f6c1-8f8c-447a-b616-25e6f748fc7e",
"version": "KqlParameterItem/1.0",
- "name": "result_signature",
- "label": "ResultSignature",
- "type": 2,
- "description": "Choose a delivery status to visualize",
- "multiSelect": true,
- "quote": "'",
- "delimiter": ",",
- "query": "ACSCallAutomationIncomingOperations \r\n| where TimeGenerated {time_range:query}\r\n| order by TimeGenerated\r\n| distinct ResultSignature\r\n",
- "crossComponentResources": [],
+ "name": "TimeRange",
+ "type": 4,
+ "description": "Define a time range to aggregate logs over",
+ "isRequired": true,
"typeSettings": {
- "additionalResourceOptions": [
- "value::all"
+ "selectableValues": [
+ {
+ "durationMs": 300000
+ },
+ {
+ "durationMs": 900000
+ },
+ {
+ "durationMs": 1800000
+ },
+ {
+ "durationMs": 3600000
+ },
+ {
+ "durationMs": 14400000
+ },
+ {
+ "durationMs": 43200000
+ },
+ {
+ "durationMs": 86400000
+ },
+ {
+ "durationMs": 172800000
+ },
+ {
+ "durationMs": 259200000
+ },
+ {
+ "durationMs": 604800000
+ },
+ {
+ "durationMs": 1209600000
+ },
+ {
+ "durationMs": 2419200000
+ },
+ {
+ "durationMs": 2592000000
+ },
+ {
+ "durationMs": 5184000000
+ },
+ {
+ "durationMs": 7776000000
+ }
],
+ "allowCustom": true
+ },
+ "value": {
+ "durationMs": 1209600000
+ },
+ "label": "Time Range"
+ },
+ {
+ "id": "8caaee6d-fdf7-450f-bcdf-7625dbfc35b8",
+ "version": "KqlParameterItem/1.0",
+ "name": "time_granularity",
+ "label": "Duration Unit",
+ "type": 2,
+ "description": "Choose the time granularity to use to aggregate logs",
+ "isRequired": true,
+ "typeSettings": {
+ "additionalResourceOptions": [],
"showDefault": false
},
- "defaultValue": "value::all",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "value": [
- "value::all"
- ]
- }
- ],
- "style": "pills",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
- },
- "customWidth": "34",
- "name": "parameters - errors2"
- },
- {
- "type": 9,
- "content": {
- "version": "KqlParameterItem/1.0",
- "crossComponentResources": [],
- "parameters": [
+ "jsonData": "[\n { \"value\":\"bin(timestampBin,startofday(timestampBin))\", \"label\":\"Daily\" },\n { \"value\":\"bin(timestampBin,startofweek(timestampBin))\", \"label\":\"Weekly\",\"selected\":true },\n { \"value\":\"bin(timestampBin,startofmonth(timestampBin))\", \"label\":\"Monthly\" }\n]"
+ },
{
- "id": "cfc2374f-f1ee-456b-b3a8-a22bea744472",
+ "id": "93c44480-7e8c-495d-a7ed-d299c069c152",
"version": "KqlParameterItem/1.0",
- "name": "operation_version0",
- "label": "OperationVersion",
+ "name": "DiagnosticChangedName",
+ "label": "Diagnostic Changed",
"type": 2,
- "description": "Choose a delivery status to visualize",
- "multiSelect": true,
- "quote": "'",
- "delimiter": ",",
- "query": "ACSCallAutomationIncomingOperations \r\n| where TimeGenerated {time_range:query}\r\n| where OperationName in ({operation_name0})\r\n| order by TimeGenerated\r\n| distinct OperationVersion\r\n",
- "crossComponentResources": [],
+ "query": "ACSCallClientOperations\n| where OperationName == \"UserFacingDiagnostics\"\n| extend DiagnosticChanged = tostring(OperationPayload.DiagnosticChanged)\n| extend DiagnosticChanged = strcat(toupper(substring(DiagnosticChanged,0,1)),substring(DiagnosticChanged,1))\n| distinct DiagnosticChanged\n",
"typeSettings": {
- "additionalResourceOptions": [
- "value::all"
- ],
+ "additionalResourceOptions": [],
"showDefault": false
},
- "defaultValue": "value::all",
+ "timeContext": {
+ "durationMs": 0
+ },
+ "timeContextFromParameter": "TimeRange",
"queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
+ "resourceType": "microsoft.communication/communicationservices",
+ "value": null
}
],
"style": "pills",
"queryType": 0,
"resourceType": "microsoft.communication/communicationservices"
},
- "customWidth": "33",
- "name": "parameters - errors3"
+ "name": "reliability parameter"
},
{
"type": 1,
"content": {
- "json": "**Select 1 or several OperationNames and ResultSignatures from the drop-down menu to display its associated data**",
+ "json": "Ask Copilot for help by selecting UFD in the table below",
"style": "info"
},
- "conditionalVisibilities": [
- {
- "parameterName": "operation_name0",
- "comparison": "isEqualTo"
- },
- {
- "parameterName": "result_signature",
- "comparison": "isEqualTo"
- }
- ],
- "name": "operations-errors-drilldown-info"
+ "name": "text - 4"
},
{
- "type": 3,
+ "type": 12,
"content": {
- "version": "KqlItem/1.0",
- "query": "ACSCallAutomationIncomingOperations \r\n| where TimeGenerated {time_range:query}\r\n| where ResultSignature in ({result_signature})\r\n| where OperationName in ({operation_name0})\r\n| where OperationVersion in ({operation_version0})\r\n| extend time_span = floor(TimeGenerated, {time_granularity})\r\n| summarize count() by time_span, tostring(ResultSignature)\r\n| render columnchart\r\n\r\n",
- "size": 0,
- "noDataMessage": "No operations found for the specified time range and OperationName",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "crossComponentResources": [],
- "gridSettings": {
- "formatters": [
- {
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "items": [
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let ufd_name_map = (ufd:string) { \n case( \n ufd == \"reliability/api/UFD/recovery/CameraFreeze\",\"CameraFreeze\",\n ufd == \"reliability/api/UFD/recovery/CameraPermissionDenied\",\"CameraPermissionDenied\",\n ufd == \"reliability/api/UFD/recovery/CameraStartFailed\",\"CameraStartFailed\",\n ufd == \"reliability/api/UFD/recovery/CameraStartTimedOut\",\"CameraStartTimedOut\",\n ufd == \"reliability/api/UFD/recovery/CameraStoppedUnexpectedly\",\"CameraStoppedUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/CapturerStartFailed\",\"CapturerStartFailed\",\n ufd == \"reliability/api/UFD/recovery/CapturerStoppedUnexpectedly\",\"CapturerStoppedUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/MicrophoneMuteUnexpectedly\",\"MicrophoneMuteUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/MicrophoneMutedUnexpectedly\",\"MicrophoneMutedUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/MicrophoneNotFunctioning\",\"MicrophoneNotFunctioning\",\n ufd == \"reliability/api/UFD/recovery/MicrophonePermissionDenied\",\"MicrophonePermissionDenied\",\n ufd == \"reliability/api/UFD/recovery/NetworkReceiveQuality\",\"NetworkReceiveQuality\",\n ufd == \"reliability/api/UFD/recovery/NetworkReconnect\",\"NetworkReconnect\",\n ufd == \"reliability/api/UFD/recovery/NetworkRelaysNotReachable\",\"NetworkRelaysNotReachable\",\n ufd == \"reliability/api/UFD/recovery/NetworkSendQuality\",\"NetworkSendQuality\",\n ufd == \"reliability/api/UFD/recovery/NoMicrophoneDevicesEnumerated\",\"NoMicrophoneDevicesEnumerated\",\n ufd == \"reliability/api/UFD/recovery/NoNetwork\",\"NoNetwork\",\n ufd == \"reliability/api/UFD/recovery/NoSpeakerDevicesEnumerated\",\"NoSpeakerDevicesEnumerated\",\n ufd == \"reliability/api/UFD/recovery/ScreenshareRecordingDisabled\",\"ScreenshareRecordingDisabled\",\n ufd == \"reliability/api/UFD/recovery/SpeakerMuted\",\"SpeakerMuted\",\n ufd == \"reliability/api/UFD/recovery/SpeakerNotFunctioning\",\"SpeakerNotFunctioning\",\n ufd == \"reliability/api/UFD/recovery/SpeakerVolumeIsZero\",\"SpeakerVolumeIsZero\",\n ''\n ) \n};\nlet divide = (a:real,b:real) { \n iif(b == 0.0 or isnan(b) or isnull(b), real(null), a / b) \n};\nlet reliability = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good), attempts); \n iff(isnull(ratio), real(null), round(100.00 * ratio, decimals)) \n};\nlet reliability_upperbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_upper = ratio + 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_upper_1 = iff(ratio_upper > 1.0, 1.0, ratio_upper); \n iff(isnull(ratio), real(null), round(100.00 * ratio_upper_1, decimals)) \n};\nlet reliability_lowerbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_lower = ratio - 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_lower_1 = iff(ratio_lower < 0.0, 0.0, ratio_lower); \n iff(isnull(ratio), real(null), round(100.00 * ratio_lower_1, decimals)) \n};\nlet compareMetricWithThreshold = (cmpOperator:string,metricValue:real,threshold:real) { \n case( \n cmpOperator == '==', \n metricValue == threshold, \n cmpOperator == '!=', \n metricValue != threshold, \n cmpOperator == '>', \n metricValue > threshold, \n cmpOperator == '>=', \n metricValue >= threshold, \n cmpOperator == '<', \n metricValue < threshold, \n cmpOperator == '<=', \n metricValue <= threshold, \n bool(null) \n) \n};\nlet metricsMetadata = () {\n\tdatatable (\n metricName: string, \n metadataValidAsOf: datetime, \n enabled: bool, \n targetThresholdLeg: real, \n cmpOperatorLeg: string, \n aggregLegRounding: int, \n aggregLegUnit: string, \n description: string, \n priority: int\n ) \n [\n \"reliability/api/UFD/recovery/CameraFreeze\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraPermissionDenied\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraStartFailed\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraStartTimedOut\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraStoppedUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CapturerStartFailed\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CapturerStoppedUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophoneMuteUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophoneMutedUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophoneNotFunctioning\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophonePermissionDenied\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkReceiveQuality\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkReconnect\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkRelaysNotReachable\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkSendQuality\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NoMicrophoneDevicesEnumerated\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NoNetwork\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NoSpeakerDevicesEnumerated\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/ScreenshareRecordingDisabled\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/SpeakerMuted\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/SpeakerNotFunctioning\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/SpeakerVolumeIsZero\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t] \n | where enabled\n};\nlet applyGoalsOnLegMetric = (legMetricResult:(timestamp:datetime,metricName:string,localParticipantId:string,metricValue:real,metricValueUpperBound:real,metricValueLowerBound:real,SdkVersion:string,ResultType:string,SubCode:string,Platform:string,CallType:string,callId:string)) {\n // Assumption: there is only one metricName in the legMetricResult\n // Kusto does not support asserts on row context\n //\n metricsMetadata\n | join kind=innerunique legMetricResult on metricName\n | extend cmpOperator = cmpOperatorLeg, threshold=targetThresholdLeg, unit=aggregLegUnit\n | project\n timestamp,\n metricName,\n localParticipantId,\n metricValue,\n metricValueUpperBound,\n metricValueLowerBound,\n goal = strcat(cmpOperator, ' ', threshold),\n succeeded= compareMetricWithThreshold(cmpOperator, metricValueUpperBound, threshold),\n unit,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n};\nlet AttemptSuccessFailureLegMetric = (attempt_and_failure_event:(EventInfo_Time:datetime,localParticipantId:string,metricName:string,kind_of_event:string,SdkVersion:string,ResultType:string,SubCode:string,callId:string,UserAgent:string,Platform:string,CallType:string),startDateTime:datetime,endDateTime:datetime) {\n let metadata = metricsMetadata | project metricName, aggregLegRounding;\n let attempt_and_failure_event_with_meta=attempt_and_failure_event | join kind=inner metadata on metricName;\n let attempt_event=attempt_and_failure_event_with_meta | where kind_of_event == 'attempt';\n let failure_event=attempt_and_failure_event_with_meta | where kind_of_event == 'failure';\n let pool = \n attempt_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | project \n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=1.0 * count(),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n let bad= \n failure_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | join kind=leftsemi pool on localParticipantId, metricName\n | project\n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n failures=1.0 * count(),\n EventInfo_Time=max(EventInfo_Time),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n //\n union hint.spread=2 pool, bad\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=sum(attempts),\n failures=sum(failures),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by localParticipantId, metricName\n | extend successes = max_of(attempts - failures, 0) //protect against failures>attempts\n | project\n timestamp=EventInfo_Time,\n metricName,\n localParticipantId,\n metricValue=reliability(successes, attempts),\n metricValueUpperBound=reliability_upperbound(successes, attempts),\n metricValueLowerBound=reliability_lowerbound(successes, attempts),\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n callId\n | invoke applyGoalsOnLegMetric()\n};\nlet clean_result_type = (result_type:string) {\n case (\n result_type contains 'Success' or result_type contains \"Succeeded\",\n 'Succeeded',\n result_type contains 'ExpectedError',\n 'ExpectedError',\n result_type contains 'UnexpectedServerError',\n 'UnexpectedServerError',\n 'UnexpectedClientError'\n )\n};\nlet ASF_Filter = (d:(EventInfo_Time:datetime,localParticipantId:string),startDateTime:datetime,endDateTime:datetime) { \n d \n | where EventInfo_Time between(startDateTime .. endDateTime) and isnotempty(localParticipantId) \n};\nlet ASF3 = (attempt:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),failure:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),metricName:string,startDateTime:datetime,endDateTime:datetime) {\n let fa = ASF_Filter((attempt), startDateTime, endDateTime);\n union\n (\n ASF_Filter((failure), startDateTime, endDateTime)\n | join kind = leftsemi fa on localParticipantId\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='failure',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n ),\n (\n fa\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='attempt',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n )\n};\nlet argStartDateTime = {TimeRange:start};\nlet argEndDateTime = {TimeRange:end};\n//\n// API UFD recovery reliability\nlet cameraFreeze = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('cameraFreeze') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraFreeze_attempt = \ncameraFreeze \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraFreeze_failure = cameraFreeze_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraPermissionDenied = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('cameraPermissionDenied') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraPermissionDenied_attempt = \ncameraPermissionDenied \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraPermissionDenied_failure = cameraPermissionDenied_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraStartFailed = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('CameraStartFailed') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraStartFailed_attempt = \ncameraStartFailed \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraStartFailed_failure = cameraStartFailed_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraStartTimedOut = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('cameraStartTimedOut') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraStartTimedOut_attempt = \ncameraStartTimedOut \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraStartTimedOut_failure = cameraStartTimedOut_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraStoppedUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('CameraStoppedUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraStoppedUnexpectedly_attempt = \ncameraStoppedUnexpectedly \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraStoppedUnexpectedly_failure = cameraStoppedUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet capturerStartFailed = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('capturerStartFailed') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet capturerStartFailed_attempt = \ncapturerStartFailed \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet capturerStartFailed_failure = capturerStartFailed_attempt\n| where bad_cnt>good_cnt;\n//\nlet capturerStoppedUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('capturerStoppedUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet capturerStoppedUnexpectedly_attempt = \ncapturerStoppedUnexpectedly\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet capturerStoppedUnexpectedly_failure = capturerStoppedUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphoneMuteUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphoneMuteUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphoneMuteUnexpectedly_attempt = \nmicrophoneMuteUnexpectedly\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphoneMuteUnexpectedly_failure = microphoneMuteUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphoneMutedUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphoneMutedUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphoneMutedUnexpectedly_attempt = \nmicrophoneMutedUnexpectedly\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphoneMutedUnexpectedly_failure = microphoneMutedUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphoneNotFunctioning = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphoneNotFunctioning') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphoneNotFunctioning_attempt = \nmicrophoneNotFunctioning\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphoneNotFunctioning_failure = microphoneNotFunctioning_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphonePermissionDenied = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphonePermissionDenied') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphonePermissionDenied_attempt = \nmicrophonePermissionDenied\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphonePermissionDenied_failure = microphonePermissionDenied_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkReceiveQuality = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkReceiveQuality') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkReceiveQuality_attempt = \nnetworkReceiveQuality\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkReceiveQuality_failure = networkReceiveQuality_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkReconnect = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkReconnect') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkReconnect_attempt = \nnetworkReconnect\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkReconnect_failure = networkReconnect_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkRelaysNotReachable = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkRelaysNotReachable') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkRelaysNotReachable_attempt = \nnetworkRelaysNotReachable\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkRelaysNotReachable_failure = networkRelaysNotReachable_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkSendQuality = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkSendQuality') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkSendQuality_attempt = \nnetworkSendQuality\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkSendQuality_failure = networkSendQuality_attempt\n| where bad_cnt>good_cnt;\n//\nlet noMicrophoneDevicesEnumerated = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('noMicrophoneDevicesEnumerated') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet noMicrophoneDevicesEnumerated_attempt = \nnoMicrophoneDevicesEnumerated\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet noMicrophoneDevicesEnumerated_failure = noMicrophoneDevicesEnumerated_attempt\n| where bad_cnt>good_cnt;\n//\nlet noNetwork = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('noNetwork') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet noNetwork_attempt = \nnoNetwork\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet noNetwork_failure = noNetwork_attempt\n| where bad_cnt>good_cnt;\n//\nlet noSpeakerDevicesEnumerated = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('noSpeakerDevicesEnumerated') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet noSpeakerDevicesEnumerated_attempt = \nnoSpeakerDevicesEnumerated\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet noSpeakerDevicesEnumerated_failure = noSpeakerDevicesEnumerated_attempt\n| where bad_cnt>good_cnt;\n//\nlet screenshareRecordingDisabled = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('screenshareRecordingDisabled') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet screenshareRecordingDisabled_attempt = \nscreenshareRecordingDisabled\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet screenshareRecordingDisabled_failure = screenshareRecordingDisabled_attempt\n| where bad_cnt>good_cnt;\n//\nlet speakerMuted = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('speakerMuted') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet speakerMuted_attempt = \nspeakerMuted\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet speakerMuted_failure = speakerMuted_attempt\n| where bad_cnt>good_cnt;\n//\nlet speakerNotFunctioning = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('speakerNotFunctioning') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet speakerNotFunctioning_attempt = \nspeakerNotFunctioning\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet speakerNotFunctioning_failure = speakerNotFunctioning_attempt\n| where bad_cnt>good_cnt;\n//\nlet speakerVolumeIsZero = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('speakerVolumeIsZero') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet speakerVolumeIsZero_attempt = \nspeakerVolumeIsZero\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet speakerVolumeIsZero_failure = speakerVolumeIsZero_attempt\n| where bad_cnt>good_cnt;\n//\nlet ufd_metric_aggregation =\nunion\n ASF3(cameraFreeze_attempt, cameraFreeze_failure, 'reliability/api/UFD/recovery/CameraFreeze', argStartDateTime, argEndDateTime),\n ASF3(cameraPermissionDenied_attempt, cameraPermissionDenied_failure, 'reliability/api/UFD/recovery/CameraPermissionDenied', argStartDateTime, argEndDateTime),\n ASF3(cameraStartFailed_attempt, cameraStartFailed_failure, 'reliability/api/UFD/recovery/CameraStartFailed', argStartDateTime, argEndDateTime),\n ASF3(cameraStartTimedOut_attempt, cameraStartTimedOut, 'reliability/api/UFD/recovery/CameraStartTimedOut', argStartDateTime, argEndDateTime),\n ASF3(capturerStartFailed_attempt, capturerStartFailed_failure, 'reliability/api/UFD/recovery/CameraStoppedUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(capturerStartFailed_attempt, capturerStartFailed_failure, 'reliability/api/UFD/recovery/CapturerStartFailed', argStartDateTime, argEndDateTime),\n ASF3(capturerStoppedUnexpectedly_attempt, capturerStoppedUnexpectedly_failure, 'reliability/api/UFD/recovery/CapturerStoppedUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(microphoneMuteUnexpectedly_attempt, microphoneMuteUnexpectedly_failure, 'reliability/api/UFD/recovery/MicrophoneMuteUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(microphoneMutedUnexpectedly_attempt, microphoneMutedUnexpectedly_failure, 'reliability/api/UFD/recovery/MicrophoneMutedUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(microphoneNotFunctioning_attempt, microphoneNotFunctioning_failure, 'reliability/api/UFD/recovery/MicrophoneNotFunctioning', argStartDateTime, argEndDateTime),\n ASF3(microphonePermissionDenied_attempt, microphonePermissionDenied_failure, 'reliability/api/UFD/recovery/MicrophonePermissionDenied', argStartDateTime, argEndDateTime),\n ASF3(networkReceiveQuality_attempt, networkReceiveQuality_failure, 'reliability/api/UFD/recovery/NetworkReceiveQuality', argStartDateTime, argEndDateTime),\n ASF3(networkReconnect_attempt, networkReconnect_failure, 'reliability/api/UFD/recovery/NetworkReconnect', argStartDateTime, argEndDateTime),\n ASF3(networkRelaysNotReachable_attempt, networkRelaysNotReachable_failure, 'reliability/api/UFD/recovery/NetworkRelaysNotReachable', argStartDateTime, argEndDateTime),\n ASF3(networkSendQuality_attempt, networkSendQuality_failure, 'reliability/api/UFD/recovery/NetworkSendQuality', argStartDateTime, argEndDateTime),\n ASF3(noMicrophoneDevicesEnumerated_attempt, noMicrophoneDevicesEnumerated_failure, 'reliability/api/UFD/recovery/NoMicrophoneDevicesEnumerated', argStartDateTime, argEndDateTime),\n ASF3(noNetwork_attempt, noNetwork_failure, 'reliability/api/UFD/recovery/NoNetwork', argStartDateTime, argEndDateTime),\n ASF3(noSpeakerDevicesEnumerated_attempt, noSpeakerDevicesEnumerated_failure, 'reliability/api/UFD/recovery/NoSpeakerDevicesEnumerated', argStartDateTime, argEndDateTime),\n ASF3(screenshareRecordingDisabled_attempt, screenshareRecordingDisabled_failure, 'reliability/api/UFD/recovery/ScreenshareRecordingDisabled', argStartDateTime, argEndDateTime),\n ASF3(speakerMuted_attempt, speakerMuted_failure, 'reliability/api/UFD/recovery/SpeakerMuted', argStartDateTime, argEndDateTime),\n ASF3(speakerNotFunctioning_attempt, speakerNotFunctioning_failure, 'reliability/api/UFD/recovery/SpeakerNotFunctioning', argStartDateTime, argEndDateTime),\n ASF3(speakerVolumeIsZero_attempt, speakerVolumeIsZero_failure, 'reliability/api/UFD/recovery/SpeakerVolumeIsZero', argStartDateTime, argEndDateTime)\n| invoke AttemptSuccessFailureLegMetric(argStartDateTime, argEndDateTime)\n| extend timestampBin = bin(timestamp, 1d)\n| summarize\n legs_dcount = dcount(localParticipantId), \n// calls_dcount = dcount(callId),\n success_legs_dcount= dcountif(localParticipantId, succeeded),\n failed_legs_dcount= dcountif(localParticipantId, not(succeeded)),\n timestamp_max = max(timestamp)\n by \n metricName,\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n timestampBin\n;\nlet ufd_volume =\nufd_metric_aggregation\n| summarize arg_max(timestamp_max, *) by metricName, SdkVersion, ResultType, SubCode, timestampBin, CallType, Platform\n| summarize volume = sum(legs_dcount) by metricName, timestampBin={time_granularity}\n| project metricName, timestampBin = format_datetime(timestampBin, \"yyyy-MM-dd \"), volume\n| order by metricName, timestampBin asc;\nlet ufd_recovery_rate =\nufd_metric_aggregation\n| summarize arg_max(timestamp_max, *) by metricName, SdkVersion, ResultType, SubCode, timestampBin, CallType, Platform\n| summarize success_rate = sum(success_legs_dcount)*100.0/sum(legs_dcount) by metricName, timestampBin={time_granularity}\n| project metricName, timestampBin = format_datetime(timestampBin, \"yyyy-MM-dd \"), round(success_rate,4)\n| order by metricName, timestampBin asc;\nlet pivot_recovery_rate =\nufd_recovery_rate\n| evaluate pivot(timestampBin, sum(success_rate), metricName);\nlet pivot_total =\nufd_volume\n| evaluate pivot(timestampBin, sum(volume), metricName);\npivot_total\n| join kind=inner pivot_recovery_rate on metricName\n| project-away metricName1\n| project PackedRecord = todynamic\n (\n replace_strings(\n tostring(pack_all()),\n dynamic([' 1', ' ']),\n dynamic([' Recovery Rate', ' Volume'])\n )\n )\n| evaluate bag_unpack(PackedRecord)\n| extend UFD = ufd_name_map(metricName)\n| project-away metricName\n| project-reorder UFD, ['20*'] desc",
+ "size": 0,
+ "title": "UFDs Overview",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "gridSettings": {
+ "formatters": [
+ {
+ "columnMatch": "UFD",
+ "formatter": 7,
+ "formatOptions": {
+ "linkTarget": "CopilotNudge",
+ "copilotNudgeActionSettings": {
+ "nudgeContent": "Can you share how in my Azure Communication Resource what [\"UFD\"] is in User Facing Diagnostics and how I could subscribe to the diagnosticChanged event to monitor when any user-facing diagnostic changes. Can you share why these should be shown to the user in the application?"
+ }
+ }
+ },
+ {
+ "columnMatch": "2025-01-05 Recovery Rate",
+ "formatter": 0,
+ "numberFormat": {
+ "unit": 1,
+ "options": {
+ "style": "decimal"
+ }
+ }
+ },
+ {
+ "columnMatch": "2024-12-29 Recovery Rate",
+ "formatter": 0,
+ "numberFormat": {
+ "unit": 1,
+ "options": {
+ "style": "decimal"
+ }
+ }
+ },
{
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
+ "columnMatch": "DiagnosticChanged",
+ "formatter": 7,
+ "formatOptions": {
+ "linkTarget": "CopilotNudge",
+ "copilotNudgeActionSettings": {
+ "nudgeContent": "Can you share how in my Azure Communication resource what [\"DiagnosticChanged\"] is in User Facing Diagnostics and how I could subscribe to the diagnosticChanged event to monitor when any user-facing diagnostic changes? Can you share why these should be shown to the user in the application?"
+ }
+ }
},
{
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
+ "columnMatch": "Recovery Rate",
+ "formatter": 0,
+ "numberFormat": {
+ "unit": 1,
+ "options": {
+ "style": "decimal"
+ }
+ }
}
]
}
},
- {
- "columnMatch": "OperationDate",
- "formatter": 5
- },
- {
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
+ "name": "ufd recovery rate"
},
- "sortBy": [
- {
- "itemKey": "$gen_count_$gen_group_0",
- "sortOrder": 2
- }
- ]
- },
- "sortBy": [
{
- "itemKey": "$gen_count_$gen_group_0",
- "sortOrder": 2
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let ufd_name_map = (ufd:string) { \n case( \n ufd == \"reliability/api/UFD/recovery/CameraFreeze\",\"CameraFreeze\",\n ufd == \"reliability/api/UFD/recovery/CameraPermissionDenied\",\"CameraPermissionDenied\",\n ufd == \"reliability/api/UFD/recovery/CameraStartFailed\",\"CameraStartFailed\",\n ufd == \"reliability/api/UFD/recovery/CameraStartTimedOut\",\"CameraStartTimedOut\",\n ufd == \"reliability/api/UFD/recovery/CameraStoppedUnexpectedly\",\"CameraStoppedUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/CapturerStartFailed\",\"CapturerStartFailed\",\n ufd == \"reliability/api/UFD/recovery/CapturerStoppedUnexpectedly\",\"CapturerStoppedUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/MicrophoneMuteUnexpectedly\",\"MicrophoneMuteUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/MicrophoneMutedUnexpectedly\",\"MicrophoneMutedUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/MicrophoneNotFunctioning\",\"MicrophoneNotFunctioning\",\n ufd == \"reliability/api/UFD/recovery/MicrophonePermissionDenied\",\"MicrophonePermissionDenied\",\n ufd == \"reliability/api/UFD/recovery/NetworkReceiveQuality\",\"NetworkReceiveQuality\",\n ufd == \"reliability/api/UFD/recovery/NetworkReconnect\",\"NetworkReconnect\",\n ufd == \"reliability/api/UFD/recovery/NetworkRelaysNotReachable\",\"NetworkRelaysNotReachable\",\n ufd == \"reliability/api/UFD/recovery/NetworkSendQuality\",\"NetworkSendQuality\",\n ufd == \"reliability/api/UFD/recovery/NoMicrophoneDevicesEnumerated\",\"NoMicrophoneDevicesEnumerated\",\n ufd == \"reliability/api/UFD/recovery/NoNetwork\",\"NoNetwork\",\n ufd == \"reliability/api/UFD/recovery/NoSpeakerDevicesEnumerated\",\"NoSpeakerDevicesEnumerated\",\n ufd == \"reliability/api/UFD/recovery/ScreenshareRecordingDisabled\",\"ScreenshareRecordingDisabled\",\n ufd == \"reliability/api/UFD/recovery/SpeakerMuted\",\"SpeakerMuted\",\n ufd == \"reliability/api/UFD/recovery/SpeakerNotFunctioning\",\"SpeakerNotFunctioning\",\n ufd == \"reliability/api/UFD/recovery/SpeakerVolumeIsZero\",\"SpeakerVolumeIsZero\",\n ''\n ) \n};\nlet divide = (a:real,b:real) { \n iif(b == 0.0 or isnan(b) or isnull(b), real(null), a / b) \n};\nlet reliability = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good), attempts); \n iff(isnull(ratio), real(null), round(100.00 * ratio, decimals)) \n};\nlet reliability_upperbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_upper = ratio + 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_upper_1 = iff(ratio_upper > 1.0, 1.0, ratio_upper); \n iff(isnull(ratio), real(null), round(100.00 * ratio_upper_1, decimals)) \n};\nlet reliability_lowerbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_lower = ratio - 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_lower_1 = iff(ratio_lower < 0.0, 0.0, ratio_lower); \n iff(isnull(ratio), real(null), round(100.00 * ratio_lower_1, decimals)) \n};\nlet compareMetricWithThreshold = (cmpOperator:string,metricValue:real,threshold:real) { \n case( \n cmpOperator == '==', \n metricValue == threshold, \n cmpOperator == '!=', \n metricValue != threshold, \n cmpOperator == '>', \n metricValue > threshold, \n cmpOperator == '>=', \n metricValue >= threshold, \n cmpOperator == '<', \n metricValue < threshold, \n cmpOperator == '<=', \n metricValue <= threshold, \n bool(null) \n) \n};\nlet metricsMetadata = () {\n\tdatatable (\n metricName: string, \n metadataValidAsOf: datetime, \n enabled: bool, \n targetThresholdLeg: real, \n cmpOperatorLeg: string, \n aggregLegRounding: int, \n aggregLegUnit: string, \n description: string, \n priority: int\n ) \n [\n \"reliability/api/UFD/recovery/CameraFreeze\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraPermissionDenied\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraStartFailed\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraStartTimedOut\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraStoppedUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CapturerStartFailed\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CapturerStoppedUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophoneMuteUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophoneMutedUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophoneNotFunctioning\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophonePermissionDenied\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkReceiveQuality\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkReconnect\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkRelaysNotReachable\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkSendQuality\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NoMicrophoneDevicesEnumerated\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NoNetwork\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NoSpeakerDevicesEnumerated\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/ScreenshareRecordingDisabled\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/SpeakerMuted\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/SpeakerNotFunctioning\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/SpeakerVolumeIsZero\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t] \n | where enabled\n};\nlet applyGoalsOnLegMetric = (legMetricResult:(timestamp:datetime,metricName:string,localParticipantId:string,metricValue:real,metricValueUpperBound:real,metricValueLowerBound:real,SdkVersion:string,ResultType:string,SubCode:string,Platform:string,CallType:string,callId:string)) {\n // Assumption: there is only one metricName in the legMetricResult\n // Kusto does not support asserts on row context\n //\n metricsMetadata\n | join kind=innerunique legMetricResult on metricName\n | extend cmpOperator = cmpOperatorLeg, threshold=targetThresholdLeg, unit=aggregLegUnit\n | project\n timestamp,\n metricName,\n localParticipantId,\n metricValue,\n metricValueUpperBound,\n metricValueLowerBound,\n goal = strcat(cmpOperator, ' ', threshold),\n succeeded= compareMetricWithThreshold(cmpOperator, metricValueUpperBound, threshold),\n unit,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n};\nlet AttemptSuccessFailureLegMetric = (attempt_and_failure_event:(EventInfo_Time:datetime,localParticipantId:string,metricName:string,kind_of_event:string,SdkVersion:string,ResultType:string,SubCode:string,callId:string,UserAgent:string,Platform:string,CallType:string),startDateTime:datetime,endDateTime:datetime) {\n let metadata = metricsMetadata | project metricName, aggregLegRounding;\n let attempt_and_failure_event_with_meta=attempt_and_failure_event | join kind=inner metadata on metricName;\n let attempt_event=attempt_and_failure_event_with_meta | where kind_of_event == 'attempt';\n let failure_event=attempt_and_failure_event_with_meta | where kind_of_event == 'failure';\n let pool = \n attempt_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | project \n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=1.0 * count(),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n let bad= \n failure_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | join kind=leftsemi pool on localParticipantId, metricName\n | project\n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n failures=1.0 * count(),\n EventInfo_Time=max(EventInfo_Time),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n //\n union hint.spread=2 pool, bad\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=sum(attempts),\n failures=sum(failures),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by localParticipantId, metricName\n | extend successes = max_of(attempts - failures, 0) //protect against failures>attempts\n | project\n timestamp=EventInfo_Time,\n metricName,\n localParticipantId,\n metricValue=reliability(successes, attempts),\n metricValueUpperBound=reliability_upperbound(successes, attempts),\n metricValueLowerBound=reliability_lowerbound(successes, attempts),\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n callId\n | invoke applyGoalsOnLegMetric()\n};\nlet clean_result_type = (result_type:string) {\n case (\n result_type contains 'Success' or result_type contains \"Succeeded\",\n 'Succeeded',\n result_type contains 'ExpectedError',\n 'ExpectedError',\n result_type contains 'UnexpectedServerError',\n 'UnexpectedServerError',\n 'UnexpectedClientError'\n )\n};\nlet ASF_Filter = (d:(EventInfo_Time:datetime,localParticipantId:string),startDateTime:datetime,endDateTime:datetime) { \n d \n | where EventInfo_Time between(startDateTime .. endDateTime) and isnotempty(localParticipantId) \n};\nlet ASF3 = (attempt:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),failure:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),metricName:string,startDateTime:datetime,endDateTime:datetime) {\n let fa = ASF_Filter((attempt), startDateTime, endDateTime);\n union\n (\n ASF_Filter((failure), startDateTime, endDateTime)\n | join kind = leftsemi fa on localParticipantId\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='failure',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n ),\n (\n fa\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='attempt',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n )\n};\nlet argStartDateTime = {TimeRange:start};\nlet argEndDateTime = {TimeRange:end};\n//\n// API UFD recovery reliability\nlet cameraFreeze = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('cameraFreeze') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraFreeze_attempt = \ncameraFreeze \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraFreeze_failure = cameraFreeze_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraPermissionDenied = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('cameraPermissionDenied') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraPermissionDenied_attempt = \ncameraPermissionDenied \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraPermissionDenied_failure = cameraPermissionDenied_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraStartFailed = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('CameraStartFailed') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraStartFailed_attempt = \ncameraStartFailed \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraStartFailed_failure = cameraStartFailed_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraStartTimedOut = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('cameraStartTimedOut') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraStartTimedOut_attempt = \ncameraStartTimedOut \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraStartTimedOut_failure = cameraStartTimedOut_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraStoppedUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('CameraStoppedUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraStoppedUnexpectedly_attempt = \ncameraStoppedUnexpectedly \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraStoppedUnexpectedly_failure = cameraStoppedUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet capturerStartFailed = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('capturerStartFailed') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet capturerStartFailed_attempt = \ncapturerStartFailed \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet capturerStartFailed_failure = capturerStartFailed_attempt\n| where bad_cnt>good_cnt;\n//\nlet capturerStoppedUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('capturerStoppedUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet capturerStoppedUnexpectedly_attempt = \ncapturerStoppedUnexpectedly\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet capturerStoppedUnexpectedly_failure = capturerStoppedUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphoneMuteUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphoneMuteUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphoneMuteUnexpectedly_attempt = \nmicrophoneMuteUnexpectedly\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphoneMuteUnexpectedly_failure = microphoneMuteUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphoneMutedUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphoneMutedUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphoneMutedUnexpectedly_attempt = \nmicrophoneMutedUnexpectedly\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphoneMutedUnexpectedly_failure = microphoneMutedUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphoneNotFunctioning = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphoneNotFunctioning') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphoneNotFunctioning_attempt = \nmicrophoneNotFunctioning\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphoneNotFunctioning_failure = microphoneNotFunctioning_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphonePermissionDenied = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphonePermissionDenied') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphonePermissionDenied_attempt = \nmicrophonePermissionDenied\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphonePermissionDenied_failure = microphonePermissionDenied_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkReceiveQuality = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkReceiveQuality') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkReceiveQuality_attempt = \nnetworkReceiveQuality\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkReceiveQuality_failure = networkReceiveQuality_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkReconnect = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkReconnect') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkReconnect_attempt = \nnetworkReconnect\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkReconnect_failure = networkReconnect_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkRelaysNotReachable = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkRelaysNotReachable') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkRelaysNotReachable_attempt = \nnetworkRelaysNotReachable\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkRelaysNotReachable_failure = networkRelaysNotReachable_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkSendQuality = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkSendQuality') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkSendQuality_attempt = \nnetworkSendQuality\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkSendQuality_failure = networkSendQuality_attempt\n| where bad_cnt>good_cnt;\n//\nlet noMicrophoneDevicesEnumerated = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('noMicrophoneDevicesEnumerated') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet noMicrophoneDevicesEnumerated_attempt = \nnoMicrophoneDevicesEnumerated\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet noMicrophoneDevicesEnumerated_failure = noMicrophoneDevicesEnumerated_attempt\n| where bad_cnt>good_cnt;\n//\nlet noNetwork = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('noNetwork') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet noNetwork_attempt = \nnoNetwork\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet noNetwork_failure = noNetwork_attempt\n| where bad_cnt>good_cnt;\n//\nlet noSpeakerDevicesEnumerated = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('noSpeakerDevicesEnumerated') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet noSpeakerDevicesEnumerated_attempt = \nnoSpeakerDevicesEnumerated\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet noSpeakerDevicesEnumerated_failure = noSpeakerDevicesEnumerated_attempt\n| where bad_cnt>good_cnt;\n//\nlet screenshareRecordingDisabled = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('screenshareRecordingDisabled') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet screenshareRecordingDisabled_attempt = \nscreenshareRecordingDisabled\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet screenshareRecordingDisabled_failure = screenshareRecordingDisabled_attempt\n| where bad_cnt>good_cnt;\n//\nlet speakerMuted = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('speakerMuted') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet speakerMuted_attempt = \nspeakerMuted\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet speakerMuted_failure = speakerMuted_attempt\n| where bad_cnt>good_cnt;\n//\nlet speakerNotFunctioning = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('speakerNotFunctioning') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet speakerNotFunctioning_attempt = \nspeakerNotFunctioning\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet speakerNotFunctioning_failure = speakerNotFunctioning_attempt\n| where bad_cnt>good_cnt;\n//\nlet speakerVolumeIsZero = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('speakerVolumeIsZero') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet speakerVolumeIsZero_attempt = \nspeakerVolumeIsZero\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet speakerVolumeIsZero_failure = speakerVolumeIsZero_attempt\n| where bad_cnt>good_cnt;\n//\nlet ufd_metric_aggregation =\nunion\n ASF3(cameraFreeze_attempt, cameraFreeze_failure, 'reliability/api/UFD/recovery/CameraFreeze', argStartDateTime, argEndDateTime),\n ASF3(cameraPermissionDenied_attempt, cameraPermissionDenied_failure, 'reliability/api/UFD/recovery/CameraPermissionDenied', argStartDateTime, argEndDateTime),\n ASF3(cameraStartFailed_attempt, cameraStartFailed_failure, 'reliability/api/UFD/recovery/CameraStartFailed', argStartDateTime, argEndDateTime),\n ASF3(cameraStartTimedOut_attempt, cameraStartTimedOut, 'reliability/api/UFD/recovery/CameraStartTimedOut', argStartDateTime, argEndDateTime),\n ASF3(capturerStartFailed_attempt, capturerStartFailed_failure, 'reliability/api/UFD/recovery/CameraStoppedUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(capturerStartFailed_attempt, capturerStartFailed_failure, 'reliability/api/UFD/recovery/CapturerStartFailed', argStartDateTime, argEndDateTime),\n ASF3(capturerStoppedUnexpectedly_attempt, capturerStoppedUnexpectedly_failure, 'reliability/api/UFD/recovery/CapturerStoppedUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(microphoneMuteUnexpectedly_attempt, microphoneMuteUnexpectedly_failure, 'reliability/api/UFD/recovery/MicrophoneMuteUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(microphoneMutedUnexpectedly_attempt, microphoneMutedUnexpectedly_failure, 'reliability/api/UFD/recovery/MicrophoneMutedUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(microphoneNotFunctioning_attempt, microphoneNotFunctioning_failure, 'reliability/api/UFD/recovery/MicrophoneNotFunctioning', argStartDateTime, argEndDateTime),\n ASF3(microphonePermissionDenied_attempt, microphonePermissionDenied_failure, 'reliability/api/UFD/recovery/MicrophonePermissionDenied', argStartDateTime, argEndDateTime),\n ASF3(networkReceiveQuality_attempt, networkReceiveQuality_failure, 'reliability/api/UFD/recovery/NetworkReceiveQuality', argStartDateTime, argEndDateTime),\n ASF3(networkReconnect_attempt, networkReconnect_failure, 'reliability/api/UFD/recovery/NetworkReconnect', argStartDateTime, argEndDateTime),\n ASF3(networkRelaysNotReachable_attempt, networkRelaysNotReachable_failure, 'reliability/api/UFD/recovery/NetworkRelaysNotReachable', argStartDateTime, argEndDateTime),\n ASF3(networkSendQuality_attempt, networkSendQuality_failure, 'reliability/api/UFD/recovery/NetworkSendQuality', argStartDateTime, argEndDateTime),\n ASF3(noMicrophoneDevicesEnumerated_attempt, noMicrophoneDevicesEnumerated_failure, 'reliability/api/UFD/recovery/NoMicrophoneDevicesEnumerated', argStartDateTime, argEndDateTime),\n ASF3(noNetwork_attempt, noNetwork_failure, 'reliability/api/UFD/recovery/NoNetwork', argStartDateTime, argEndDateTime),\n ASF3(noSpeakerDevicesEnumerated_attempt, noSpeakerDevicesEnumerated_failure, 'reliability/api/UFD/recovery/NoSpeakerDevicesEnumerated', argStartDateTime, argEndDateTime),\n ASF3(screenshareRecordingDisabled_attempt, screenshareRecordingDisabled_failure, 'reliability/api/UFD/recovery/ScreenshareRecordingDisabled', argStartDateTime, argEndDateTime),\n ASF3(speakerMuted_attempt, speakerMuted_failure, 'reliability/api/UFD/recovery/SpeakerMuted', argStartDateTime, argEndDateTime),\n ASF3(speakerNotFunctioning_attempt, speakerNotFunctioning_failure, 'reliability/api/UFD/recovery/SpeakerNotFunctioning', argStartDateTime, argEndDateTime),\n ASF3(speakerVolumeIsZero_attempt, speakerVolumeIsZero_failure, 'reliability/api/UFD/recovery/SpeakerVolumeIsZero', argStartDateTime, argEndDateTime)\n| invoke AttemptSuccessFailureLegMetric(argStartDateTime, argEndDateTime)\n| extend timestampBin = bin(timestamp, 1d)\n| summarize\n legs_dcount = dcount(localParticipantId), \n// calls_dcount = dcount(callId),\n success_legs_dcount= dcountif(localParticipantId, succeeded),\n failed_legs_dcount= dcountif(localParticipantId, not(succeeded)),\n timestamp_max = max(timestamp)\n by \n metricName,\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n timestampBin\n;\nufd_metric_aggregation\n| summarize arg_max(timestamp_max, *) by metricName, SdkVersion, ResultType, SubCode, timestampBin, CallType, Platform\n| summarize success_rate = sum(success_legs_dcount)*100.0/sum(legs_dcount) by metricName, timestampBin={time_granularity}\n| project UFD=ufd_name_map(metricName), timestampBin = format_datetime(timestampBin, \"yyyy-MM-dd \"), ['Recovery Rate'] = round(success_rate,4)\n| order by UFD, timestampBin asc;\n",
+ "size": 0,
+ "aggregation": 3,
+ "title": "UFDs recovery rate over time",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "visualization": "linechart",
+ "chartSettings": {
+ "xAxis": "timestampBin",
+ "yAxis": [
+ "Recovery Rate"
+ ],
+ "showLegend": true,
+ "showDataPoints": true,
+ "ySettings": {
+ "numberFormatSettings": {
+ "unit": 1,
+ "options": {
+ "style": "decimal",
+ "useGrouping": true,
+ "maximumFractionDigits": 2
+ }
+ }
+ }
+ }
+ },
+ "name": "ufd recovery rate timeseries"
}
]
},
- "customWidth": "100",
- "conditionalVisibilities": [
- {
- "parameterName": "operation_name0",
- "comparison": "isNotEqualTo"
- },
- {
- "parameterName": "result_signature",
- "comparison": "isNotEqualTo"
- }
- ],
- "name": "count-errors-details"
- }
- ]
- },
- "customWidth": "100",
- "name": "Operational-Errors-group"
- },
- {
- "type": 12,
- "content": {
- "version": "NotebookGroup/1.0",
- "groupType": "editable",
- "title": "All Operations done on a Call",
- "items": [
+ "conditionalVisibility": {
+ "parameterName": "DiagnosticChangedName",
+ "comparison": "isEqualTo",
+ "value": ""
+ },
+ "name": "overview"
+ },
{
- "type": 9,
+ "type": 12,
"content": {
- "version": "KqlParameterItem/1.0",
- "crossComponentResources": [],
- "parameters": [
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "items": [
{
- "id": "0c0b56fd-ffd9-4761-b14e-c916660f9ccc",
- "version": "KqlParameterItem/1.0",
- "name": "correlation_id",
- "label": "CorrelationId",
- "type": 2,
- "description": "Choose a delivery status to visualize",
- "query": "ACSCallAutomationIncomingOperations \r\n| where TimeGenerated {time_range:query}\r\n| order by TimeGenerated\r\n| distinct CorrelationId\r\n",
- "crossComponentResources": [],
- "typeSettings": {
- "additionalResourceOptions": [],
- "showDefault": false
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let selected_DiagnosticChangedName = dynamic('{DiagnosticChangedName}');\nlet ufd_name_map = (ufd:string) { \n case( \n ufd == \"reliability/api/UFD/recovery/CameraFreeze\",\"CameraFreeze\",\n ufd == \"reliability/api/UFD/recovery/CameraPermissionDenied\",\"CameraPermissionDenied\",\n ufd == \"reliability/api/UFD/recovery/CameraStartFailed\",\"CameraStartFailed\",\n ufd == \"reliability/api/UFD/recovery/CameraStartTimedOut\",\"CameraStartTimedOut\",\n ufd == \"reliability/api/UFD/recovery/CameraStoppedUnexpectedly\",\"CameraStoppedUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/CapturerStartFailed\",\"CapturerStartFailed\",\n ufd == \"reliability/api/UFD/recovery/CapturerStoppedUnexpectedly\",\"CapturerStoppedUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/MicrophoneMuteUnexpectedly\",\"MicrophoneMuteUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/MicrophoneMutedUnexpectedly\",\"MicrophoneMutedUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/MicrophoneNotFunctioning\",\"MicrophoneNotFunctioning\",\n ufd == \"reliability/api/UFD/recovery/MicrophonePermissionDenied\",\"MicrophonePermissionDenied\",\n ufd == \"reliability/api/UFD/recovery/NetworkReceiveQuality\",\"NetworkReceiveQuality\",\n ufd == \"reliability/api/UFD/recovery/NetworkReconnect\",\"NetworkReconnect\",\n ufd == \"reliability/api/UFD/recovery/NetworkRelaysNotReachable\",\"NetworkRelaysNotReachable\",\n ufd == \"reliability/api/UFD/recovery/NetworkSendQuality\",\"NetworkSendQuality\",\n ufd == \"reliability/api/UFD/recovery/NoMicrophoneDevicesEnumerated\",\"NoMicrophoneDevicesEnumerated\",\n ufd == \"reliability/api/UFD/recovery/NoNetwork\",\"NoNetwork\",\n ufd == \"reliability/api/UFD/recovery/NoSpeakerDevicesEnumerated\",\"NoSpeakerDevicesEnumerated\",\n ufd == \"reliability/api/UFD/recovery/ScreenshareRecordingDisabled\",\"ScreenshareRecordingDisabled\",\n ufd == \"reliability/api/UFD/recovery/SpeakerMuted\",\"SpeakerMuted\",\n ufd == \"reliability/api/UFD/recovery/SpeakerNotFunctioning\",\"SpeakerNotFunctioning\",\n ufd == \"reliability/api/UFD/recovery/SpeakerVolumeIsZero\",\"SpeakerVolumeIsZero\",\n ''\n ) \n};\nlet divide = (a:real,b:real) { \n iif(b == 0.0 or isnan(b) or isnull(b), real(null), a / b) \n};\nlet reliability = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good), attempts); \n iff(isnull(ratio), real(null), round(100.00 * ratio, decimals)) \n};\nlet reliability_upperbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_upper = ratio + 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_upper_1 = iff(ratio_upper > 1.0, 1.0, ratio_upper); \n iff(isnull(ratio), real(null), round(100.00 * ratio_upper_1, decimals)) \n};\nlet reliability_lowerbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_lower = ratio - 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_lower_1 = iff(ratio_lower < 0.0, 0.0, ratio_lower); \n iff(isnull(ratio), real(null), round(100.00 * ratio_lower_1, decimals)) \n};\nlet compareMetricWithThreshold = (cmpOperator:string,metricValue:real,threshold:real) { \n case( \n cmpOperator == '==', \n metricValue == threshold, \n cmpOperator == '!=', \n metricValue != threshold, \n cmpOperator == '>', \n metricValue > threshold, \n cmpOperator == '>=', \n metricValue >= threshold, \n cmpOperator == '<', \n metricValue < threshold, \n cmpOperator == '<=', \n metricValue <= threshold, \n bool(null) \n) \n};\nlet metricsMetadata = () {\n\tdatatable (\n metricName: string, \n metadataValidAsOf: datetime, \n enabled: bool, \n targetThresholdLeg: real, \n cmpOperatorLeg: string, \n aggregLegRounding: int, \n aggregLegUnit: string, \n description: string, \n priority: int\n ) \n [\n \"reliability/api/UFD/recovery/CameraFreeze\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraPermissionDenied\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraStartFailed\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraStartTimedOut\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraStoppedUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CapturerStartFailed\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CapturerStoppedUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophoneMuteUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophoneMutedUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophoneNotFunctioning\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophonePermissionDenied\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkReceiveQuality\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkReconnect\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkRelaysNotReachable\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkSendQuality\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NoMicrophoneDevicesEnumerated\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NoNetwork\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NoSpeakerDevicesEnumerated\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/ScreenshareRecordingDisabled\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/SpeakerMuted\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/SpeakerNotFunctioning\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/SpeakerVolumeIsZero\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t] \n | where enabled\n};\nlet applyGoalsOnLegMetric = (legMetricResult:(timestamp:datetime,metricName:string,localParticipantId:string,metricValue:real,metricValueUpperBound:real,metricValueLowerBound:real,SdkVersion:string,ResultType:string,SubCode:string,Platform:string,CallType:string,callId:string)) {\n // Assumption: there is only one metricName in the legMetricResult\n // Kusto does not support asserts on row context\n //\n metricsMetadata\n | join kind=innerunique legMetricResult on metricName\n | extend cmpOperator = cmpOperatorLeg, threshold=targetThresholdLeg, unit=aggregLegUnit\n | project\n timestamp,\n metricName,\n localParticipantId,\n metricValue,\n metricValueUpperBound,\n metricValueLowerBound,\n goal = strcat(cmpOperator, ' ', threshold),\n succeeded= compareMetricWithThreshold(cmpOperator, metricValueUpperBound, threshold),\n unit,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n};\nlet AttemptSuccessFailureLegMetric = (attempt_and_failure_event:(EventInfo_Time:datetime,localParticipantId:string,metricName:string,kind_of_event:string,SdkVersion:string,ResultType:string,SubCode:string,callId:string,UserAgent:string,Platform:string,CallType:string),startDateTime:datetime,endDateTime:datetime) {\n let metadata = metricsMetadata | project metricName, aggregLegRounding;\n let attempt_and_failure_event_with_meta=attempt_and_failure_event | join kind=inner metadata on metricName;\n let attempt_event=attempt_and_failure_event_with_meta | where kind_of_event == 'attempt';\n let failure_event=attempt_and_failure_event_with_meta | where kind_of_event == 'failure';\n let pool = \n attempt_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | project \n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=1.0 * count(),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n let bad= \n failure_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | join kind=leftsemi pool on localParticipantId, metricName\n | project\n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n failures=1.0 * count(),\n EventInfo_Time=max(EventInfo_Time),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n //\n union hint.spread=2 pool, bad\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=sum(attempts),\n failures=sum(failures),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by localParticipantId, metricName\n | extend successes = max_of(attempts - failures, 0) //protect against failures>attempts\n | project\n timestamp=EventInfo_Time,\n metricName,\n localParticipantId,\n metricValue=reliability(successes, attempts),\n metricValueUpperBound=reliability_upperbound(successes, attempts),\n metricValueLowerBound=reliability_lowerbound(successes, attempts),\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n callId\n | invoke applyGoalsOnLegMetric()\n};\nlet clean_result_type = (result_type:string) {\n case (\n result_type contains 'Success' or result_type contains \"Succeeded\",\n 'Succeeded',\n result_type contains 'ExpectedError',\n 'ExpectedError',\n result_type contains 'UnexpectedServerError',\n 'UnexpectedServerError',\n 'UnexpectedClientError'\n )\n};\nlet ASF_Filter = (d:(EventInfo_Time:datetime,localParticipantId:string),startDateTime:datetime,endDateTime:datetime) { \n d \n | where EventInfo_Time between(startDateTime .. endDateTime) and isnotempty(localParticipantId) \n};\nlet ASF3 = (attempt:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),failure:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),metricName:string,startDateTime:datetime,endDateTime:datetime) {\n let fa = ASF_Filter((attempt), startDateTime, endDateTime);\n union\n (\n ASF_Filter((failure), startDateTime, endDateTime)\n | join kind = leftsemi fa on localParticipantId\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='failure',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n ),\n (\n fa\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='attempt',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n )\n};\nlet argStartDateTime = {TimeRange:start};\nlet argEndDateTime = {TimeRange:end};\n//\n// API UFD recovery reliability\nlet cameraFreeze = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('cameraFreeze') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraFreeze_attempt = \ncameraFreeze \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraFreeze_failure = cameraFreeze_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraPermissionDenied = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('cameraPermissionDenied') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraPermissionDenied_attempt = \ncameraPermissionDenied \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraPermissionDenied_failure = cameraPermissionDenied_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraStartFailed = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('CameraStartFailed') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraStartFailed_attempt = \ncameraStartFailed \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraStartFailed_failure = cameraStartFailed_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraStartTimedOut = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('cameraStartTimedOut') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraStartTimedOut_attempt = \ncameraStartTimedOut \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraStartTimedOut_failure = cameraStartTimedOut_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraStoppedUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('CameraStoppedUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraStoppedUnexpectedly_attempt = \ncameraStoppedUnexpectedly \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraStoppedUnexpectedly_failure = cameraStoppedUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet capturerStartFailed = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('capturerStartFailed') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet capturerStartFailed_attempt = \ncapturerStartFailed \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet capturerStartFailed_failure = capturerStartFailed_attempt\n| where bad_cnt>good_cnt;\n//\nlet capturerStoppedUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('capturerStoppedUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet capturerStoppedUnexpectedly_attempt = \ncapturerStoppedUnexpectedly\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet capturerStoppedUnexpectedly_failure = capturerStoppedUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphoneMuteUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphoneMuteUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphoneMuteUnexpectedly_attempt = \nmicrophoneMuteUnexpectedly\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphoneMuteUnexpectedly_failure = microphoneMuteUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphoneMutedUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphoneMutedUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphoneMutedUnexpectedly_attempt = \nmicrophoneMutedUnexpectedly\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphoneMutedUnexpectedly_failure = microphoneMutedUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphoneNotFunctioning = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphoneNotFunctioning') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphoneNotFunctioning_attempt = \nmicrophoneNotFunctioning\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphoneNotFunctioning_failure = microphoneNotFunctioning_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphonePermissionDenied = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphonePermissionDenied') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphonePermissionDenied_attempt = \nmicrophonePermissionDenied\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphonePermissionDenied_failure = microphonePermissionDenied_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkReceiveQuality = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkReceiveQuality') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkReceiveQuality_attempt = \nnetworkReceiveQuality\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkReceiveQuality_failure = networkReceiveQuality_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkReconnect = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkReconnect') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkReconnect_attempt = \nnetworkReconnect\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkReconnect_failure = networkReconnect_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkRelaysNotReachable = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkRelaysNotReachable') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkRelaysNotReachable_attempt = \nnetworkRelaysNotReachable\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkRelaysNotReachable_failure = networkRelaysNotReachable_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkSendQuality = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkSendQuality') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkSendQuality_attempt = \nnetworkSendQuality\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkSendQuality_failure = networkSendQuality_attempt\n| where bad_cnt>good_cnt;\n//\nlet noMicrophoneDevicesEnumerated = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('noMicrophoneDevicesEnumerated') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet noMicrophoneDevicesEnumerated_attempt = \nnoMicrophoneDevicesEnumerated\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet noMicrophoneDevicesEnumerated_failure = noMicrophoneDevicesEnumerated_attempt\n| where bad_cnt>good_cnt;\n//\nlet noNetwork = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('noNetwork') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet noNetwork_attempt = \nnoNetwork\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet noNetwork_failure = noNetwork_attempt\n| where bad_cnt>good_cnt;\n//\nlet noSpeakerDevicesEnumerated = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('noSpeakerDevicesEnumerated') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet noSpeakerDevicesEnumerated_attempt = \nnoSpeakerDevicesEnumerated\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet noSpeakerDevicesEnumerated_failure = noSpeakerDevicesEnumerated_attempt\n| where bad_cnt>good_cnt;\n//\nlet screenshareRecordingDisabled = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('screenshareRecordingDisabled') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet screenshareRecordingDisabled_attempt = \nscreenshareRecordingDisabled\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet screenshareRecordingDisabled_failure = screenshareRecordingDisabled_attempt\n| where bad_cnt>good_cnt;\n//\nlet speakerMuted = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('speakerMuted') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet speakerMuted_attempt = \nspeakerMuted\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet speakerMuted_failure = speakerMuted_attempt\n| where bad_cnt>good_cnt;\n//\nlet speakerNotFunctioning = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('speakerNotFunctioning') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet speakerNotFunctioning_attempt = \nspeakerNotFunctioning\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet speakerNotFunctioning_failure = speakerNotFunctioning_attempt\n| where bad_cnt>good_cnt;\n//\nlet speakerVolumeIsZero = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('speakerVolumeIsZero') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet speakerVolumeIsZero_attempt = \nspeakerVolumeIsZero\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet speakerVolumeIsZero_failure = speakerVolumeIsZero_attempt\n| where bad_cnt>good_cnt;\n//\nlet ufd_metric_aggregation =\nunion\n ASF3(cameraFreeze_attempt, cameraFreeze_failure, 'reliability/api/UFD/recovery/CameraFreeze', argStartDateTime, argEndDateTime),\n ASF3(cameraPermissionDenied_attempt, cameraPermissionDenied_failure, 'reliability/api/UFD/recovery/CameraPermissionDenied', argStartDateTime, argEndDateTime),\n ASF3(cameraStartFailed_attempt, cameraStartFailed_failure, 'reliability/api/UFD/recovery/CameraStartFailed', argStartDateTime, argEndDateTime),\n ASF3(cameraStartTimedOut_attempt, cameraStartTimedOut, 'reliability/api/UFD/recovery/CameraStartTimedOut', argStartDateTime, argEndDateTime),\n ASF3(capturerStartFailed_attempt, capturerStartFailed_failure, 'reliability/api/UFD/recovery/CameraStoppedUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(capturerStartFailed_attempt, capturerStartFailed_failure, 'reliability/api/UFD/recovery/CapturerStartFailed', argStartDateTime, argEndDateTime),\n ASF3(capturerStoppedUnexpectedly_attempt, capturerStoppedUnexpectedly_failure, 'reliability/api/UFD/recovery/CapturerStoppedUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(microphoneMuteUnexpectedly_attempt, microphoneMuteUnexpectedly_failure, 'reliability/api/UFD/recovery/MicrophoneMuteUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(microphoneMutedUnexpectedly_attempt, microphoneMutedUnexpectedly_failure, 'reliability/api/UFD/recovery/MicrophoneMutedUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(microphoneNotFunctioning_attempt, microphoneNotFunctioning_failure, 'reliability/api/UFD/recovery/MicrophoneNotFunctioning', argStartDateTime, argEndDateTime),\n ASF3(microphonePermissionDenied_attempt, microphonePermissionDenied_failure, 'reliability/api/UFD/recovery/MicrophonePermissionDenied', argStartDateTime, argEndDateTime),\n ASF3(networkReceiveQuality_attempt, networkReceiveQuality_failure, 'reliability/api/UFD/recovery/NetworkReceiveQuality', argStartDateTime, argEndDateTime),\n ASF3(networkReconnect_attempt, networkReconnect_failure, 'reliability/api/UFD/recovery/NetworkReconnect', argStartDateTime, argEndDateTime),\n ASF3(networkRelaysNotReachable_attempt, networkRelaysNotReachable_failure, 'reliability/api/UFD/recovery/NetworkRelaysNotReachable', argStartDateTime, argEndDateTime),\n ASF3(networkSendQuality_attempt, networkSendQuality_failure, 'reliability/api/UFD/recovery/NetworkSendQuality', argStartDateTime, argEndDateTime),\n ASF3(noMicrophoneDevicesEnumerated_attempt, noMicrophoneDevicesEnumerated_failure, 'reliability/api/UFD/recovery/NoMicrophoneDevicesEnumerated', argStartDateTime, argEndDateTime),\n ASF3(noNetwork_attempt, noNetwork_failure, 'reliability/api/UFD/recovery/NoNetwork', argStartDateTime, argEndDateTime),\n ASF3(noSpeakerDevicesEnumerated_attempt, noSpeakerDevicesEnumerated_failure, 'reliability/api/UFD/recovery/NoSpeakerDevicesEnumerated', argStartDateTime, argEndDateTime),\n ASF3(screenshareRecordingDisabled_attempt, screenshareRecordingDisabled_failure, 'reliability/api/UFD/recovery/ScreenshareRecordingDisabled', argStartDateTime, argEndDateTime),\n ASF3(speakerMuted_attempt, speakerMuted_failure, 'reliability/api/UFD/recovery/SpeakerMuted', argStartDateTime, argEndDateTime),\n ASF3(speakerNotFunctioning_attempt, speakerNotFunctioning_failure, 'reliability/api/UFD/recovery/SpeakerNotFunctioning', argStartDateTime, argEndDateTime),\n ASF3(speakerVolumeIsZero_attempt, speakerVolumeIsZero_failure, 'reliability/api/UFD/recovery/SpeakerVolumeIsZero', argStartDateTime, argEndDateTime)\n| invoke AttemptSuccessFailureLegMetric(argStartDateTime, argEndDateTime)\n| extend timestampBin = bin(timestamp, 1d)\n| summarize\n legs_dcount = dcount(localParticipantId), \n// calls_dcount = dcount(callId),\n success_legs_dcount= dcountif(localParticipantId, succeeded),\n failed_legs_dcount= dcountif(localParticipantId, not(succeeded)),\n timestamp_max = max(timestamp)\n by \n metricName,\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n timestampBin\n;\nufd_metric_aggregation\n| extend UFD = ufd_name_map(metricName)\n| where isempty(selected_DiagnosticChangedName) or UFD == selected_DiagnosticChangedName\n| summarize arg_max(timestamp_max, *) by UFD, SdkVersion, ResultType, SubCode, timestampBin, CallType, Platform\n| summarize volume = sum(legs_dcount), recovered = sum(success_legs_dcount), bad = sum(failed_legs_dcount), ['recovery rate'] = sum(success_legs_dcount)*100.0/sum(legs_dcount) by UFD, timestampBin={time_granularity}\n| project UFD, timestampBin = format_datetime(timestampBin, \"yyyy-MM-dd \"), ['recovery rate'], volume, recovered, bad\n| order by UFD, timestampBin asc;\n\n",
+ "size": 0,
+ "aggregation": 3,
+ "title": "{DiagnosticChangedName} Recovery Rate in {time_granularity:label} bucket",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "gridSettings": {
+ "formatters": [
+ {
+ "columnMatch": "UFD",
+ "formatter": 7,
+ "formatOptions": {
+ "linkTarget": "CopilotNudge",
+ "copilotNudgeActionSettings": {
+ "nudgeContent": "Can you share how in my Azure Communication Resource what [\"UFD\"] is in User Facing Diagnostics and how I could subscribe to the diagnosticChanged event to monitor when any user-facing diagnostic changes. Can you share why these should be shown to the user in the application?"
+ }
+ }
+ },
+ {
+ "columnMatch": "recovery rate",
+ "formatter": 0,
+ "numberFormat": {
+ "unit": 1,
+ "options": {
+ "style": "decimal",
+ "maximumFractionDigits": 4
+ }
+ }
+ },
+ {
+ "columnMatch": "Recovery rate",
+ "formatter": 0,
+ "numberFormat": {
+ "unit": 1,
+ "options": {
+ "style": "decimal"
+ }
+ }
+ },
+ {
+ "columnMatch": "Total",
+ "formatter": 4,
+ "formatOptions": {
+ "palette": "amethyst"
+ }
+ },
+ {
+ "columnMatch": "DiagnosticChanged",
+ "formatter": 7,
+ "formatOptions": {
+ "linkTarget": "CopilotNudge",
+ "copilotNudgeActionSettings": {
+ "nudgeContent": "Can you share in my Azure Communication resource what [\"DiagnosticChanged\"] is in User Facing Diagnostics and how I could subscribe to the diagnosticChanged event to monitor when any user-facing diagnostic changes? Can you share why these should be shown to the user in the application?"
+ }
+ }
+ }
+ ]
+ }
},
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices",
- "value": null
+ "customWidth": "70",
+ "name": "ufd recovery rate"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let selected_DiagnosticChangedName = dynamic('{DiagnosticChangedName}');\nlet ufd_name_map = (ufd:string) { \n case( \n ufd == \"reliability/api/UFD/recovery/CameraFreeze\",\"CameraFreeze\",\n ufd == \"reliability/api/UFD/recovery/CameraPermissionDenied\",\"CameraPermissionDenied\",\n ufd == \"reliability/api/UFD/recovery/CameraStartFailed\",\"CameraStartFailed\",\n ufd == \"reliability/api/UFD/recovery/CameraStartTimedOut\",\"CameraStartTimedOut\",\n ufd == \"reliability/api/UFD/recovery/CameraStoppedUnexpectedly\",\"CameraStoppedUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/CapturerStartFailed\",\"CapturerStartFailed\",\n ufd == \"reliability/api/UFD/recovery/CapturerStoppedUnexpectedly\",\"CapturerStoppedUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/MicrophoneMuteUnexpectedly\",\"MicrophoneMuteUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/MicrophoneMutedUnexpectedly\",\"MicrophoneMutedUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/MicrophoneNotFunctioning\",\"MicrophoneNotFunctioning\",\n ufd == \"reliability/api/UFD/recovery/MicrophonePermissionDenied\",\"MicrophonePermissionDenied\",\n ufd == \"reliability/api/UFD/recovery/NetworkReceiveQuality\",\"NetworkReceiveQuality\",\n ufd == \"reliability/api/UFD/recovery/NetworkReconnect\",\"NetworkReconnect\",\n ufd == \"reliability/api/UFD/recovery/NetworkRelaysNotReachable\",\"NetworkRelaysNotReachable\",\n ufd == \"reliability/api/UFD/recovery/NetworkSendQuality\",\"NetworkSendQuality\",\n ufd == \"reliability/api/UFD/recovery/NoMicrophoneDevicesEnumerated\",\"NoMicrophoneDevicesEnumerated\",\n ufd == \"reliability/api/UFD/recovery/NoNetwork\",\"NoNetwork\",\n ufd == \"reliability/api/UFD/recovery/NoSpeakerDevicesEnumerated\",\"NoSpeakerDevicesEnumerated\",\n ufd == \"reliability/api/UFD/recovery/ScreenshareRecordingDisabled\",\"ScreenshareRecordingDisabled\",\n ufd == \"reliability/api/UFD/recovery/SpeakerMuted\",\"SpeakerMuted\",\n ufd == \"reliability/api/UFD/recovery/SpeakerNotFunctioning\",\"SpeakerNotFunctioning\",\n ufd == \"reliability/api/UFD/recovery/SpeakerVolumeIsZero\",\"SpeakerVolumeIsZero\",\n ''\n ) \n};\nlet divide = (a:real,b:real) { \n iif(b == 0.0 or isnan(b) or isnull(b), real(null), a / b) \n};\nlet reliability = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good), attempts); \n iff(isnull(ratio), real(null), round(100.00 * ratio, decimals)) \n};\nlet reliability_upperbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_upper = ratio + 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_upper_1 = iff(ratio_upper > 1.0, 1.0, ratio_upper); \n iff(isnull(ratio), real(null), round(100.00 * ratio_upper_1, decimals)) \n};\nlet reliability_lowerbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_lower = ratio - 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_lower_1 = iff(ratio_lower < 0.0, 0.0, ratio_lower); \n iff(isnull(ratio), real(null), round(100.00 * ratio_lower_1, decimals)) \n};\nlet compareMetricWithThreshold = (cmpOperator:string,metricValue:real,threshold:real) { \n case( \n cmpOperator == '==', \n metricValue == threshold, \n cmpOperator == '!=', \n metricValue != threshold, \n cmpOperator == '>', \n metricValue > threshold, \n cmpOperator == '>=', \n metricValue >= threshold, \n cmpOperator == '<', \n metricValue < threshold, \n cmpOperator == '<=', \n metricValue <= threshold, \n bool(null) \n) \n};\nlet metricsMetadata = () {\n\tdatatable (\n metricName: string, \n metadataValidAsOf: datetime, \n enabled: bool, \n targetThresholdLeg: real, \n cmpOperatorLeg: string, \n aggregLegRounding: int, \n aggregLegUnit: string, \n description: string, \n priority: int\n ) \n [\n \"reliability/api/UFD/recovery/CameraFreeze\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraPermissionDenied\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraStartFailed\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraStartTimedOut\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraStoppedUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CapturerStartFailed\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CapturerStoppedUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophoneMuteUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophoneMutedUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophoneNotFunctioning\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophonePermissionDenied\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkReceiveQuality\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkReconnect\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkRelaysNotReachable\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkSendQuality\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NoMicrophoneDevicesEnumerated\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NoNetwork\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NoSpeakerDevicesEnumerated\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/ScreenshareRecordingDisabled\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/SpeakerMuted\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/SpeakerNotFunctioning\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/SpeakerVolumeIsZero\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t] \n | where enabled\n};\nlet applyGoalsOnLegMetric = (legMetricResult:(timestamp:datetime,metricName:string,localParticipantId:string,metricValue:real,metricValueUpperBound:real,metricValueLowerBound:real,SdkVersion:string,ResultType:string,SubCode:string,Platform:string,CallType:string,callId:string)) {\n // Assumption: there is only one metricName in the legMetricResult\n // Kusto does not support asserts on row context\n //\n metricsMetadata\n | join kind=innerunique legMetricResult on metricName\n | extend cmpOperator = cmpOperatorLeg, threshold=targetThresholdLeg, unit=aggregLegUnit\n | project\n timestamp,\n metricName,\n localParticipantId,\n metricValue,\n metricValueUpperBound,\n metricValueLowerBound,\n goal = strcat(cmpOperator, ' ', threshold),\n succeeded= compareMetricWithThreshold(cmpOperator, metricValueUpperBound, threshold),\n unit,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n};\nlet AttemptSuccessFailureLegMetric = (attempt_and_failure_event:(EventInfo_Time:datetime,localParticipantId:string,metricName:string,kind_of_event:string,SdkVersion:string,ResultType:string,SubCode:string,callId:string,UserAgent:string,Platform:string,CallType:string),startDateTime:datetime,endDateTime:datetime) {\n let metadata = metricsMetadata | project metricName, aggregLegRounding;\n let attempt_and_failure_event_with_meta=attempt_and_failure_event | join kind=inner metadata on metricName;\n let attempt_event=attempt_and_failure_event_with_meta | where kind_of_event == 'attempt';\n let failure_event=attempt_and_failure_event_with_meta | where kind_of_event == 'failure';\n let pool = \n attempt_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | project \n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=1.0 * count(),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n let bad= \n failure_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | join kind=leftsemi pool on localParticipantId, metricName\n | project\n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n failures=1.0 * count(),\n EventInfo_Time=max(EventInfo_Time),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n //\n union hint.spread=2 pool, bad\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=sum(attempts),\n failures=sum(failures),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by localParticipantId, metricName\n | extend successes = max_of(attempts - failures, 0) //protect against failures>attempts\n | project\n timestamp=EventInfo_Time,\n metricName,\n localParticipantId,\n metricValue=reliability(successes, attempts),\n metricValueUpperBound=reliability_upperbound(successes, attempts),\n metricValueLowerBound=reliability_lowerbound(successes, attempts),\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n callId\n | invoke applyGoalsOnLegMetric()\n};\nlet clean_result_type = (result_type:string) {\n case (\n result_type contains 'Success' or result_type contains \"Succeeded\",\n 'Succeeded',\n result_type contains 'ExpectedError',\n 'ExpectedError',\n result_type contains 'UnexpectedServerError',\n 'UnexpectedServerError',\n 'UnexpectedClientError'\n )\n};\nlet ASF_Filter = (d:(EventInfo_Time:datetime,localParticipantId:string),startDateTime:datetime,endDateTime:datetime) { \n d \n | where EventInfo_Time between(startDateTime .. endDateTime) and isnotempty(localParticipantId) \n};\nlet ASF3 = (attempt:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),failure:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),metricName:string,startDateTime:datetime,endDateTime:datetime) {\n let fa = ASF_Filter((attempt), startDateTime, endDateTime);\n union\n (\n ASF_Filter((failure), startDateTime, endDateTime)\n | join kind = leftsemi fa on localParticipantId\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='failure',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n ),\n (\n fa\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='attempt',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n )\n};\nlet argStartDateTime = {TimeRange:start};\nlet argEndDateTime = {TimeRange:end};\n//\n// API UFD recovery reliability\nlet cameraFreeze = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('cameraFreeze') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraFreeze_attempt = \ncameraFreeze \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraFreeze_failure = cameraFreeze_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraPermissionDenied = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('cameraPermissionDenied') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraPermissionDenied_attempt = \ncameraPermissionDenied \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraPermissionDenied_failure = cameraPermissionDenied_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraStartFailed = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('CameraStartFailed') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraStartFailed_attempt = \ncameraStartFailed \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraStartFailed_failure = cameraStartFailed_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraStartTimedOut = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('cameraStartTimedOut') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraStartTimedOut_attempt = \ncameraStartTimedOut \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraStartTimedOut_failure = cameraStartTimedOut_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraStoppedUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('CameraStoppedUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraStoppedUnexpectedly_attempt = \ncameraStoppedUnexpectedly \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraStoppedUnexpectedly_failure = cameraStoppedUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet capturerStartFailed = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('capturerStartFailed') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet capturerStartFailed_attempt = \ncapturerStartFailed \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet capturerStartFailed_failure = capturerStartFailed_attempt\n| where bad_cnt>good_cnt;\n//\nlet capturerStoppedUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('capturerStoppedUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet capturerStoppedUnexpectedly_attempt = \ncapturerStoppedUnexpectedly\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet capturerStoppedUnexpectedly_failure = capturerStoppedUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphoneMuteUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphoneMuteUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphoneMuteUnexpectedly_attempt = \nmicrophoneMuteUnexpectedly\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphoneMuteUnexpectedly_failure = microphoneMuteUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphoneMutedUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphoneMutedUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphoneMutedUnexpectedly_attempt = \nmicrophoneMutedUnexpectedly\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphoneMutedUnexpectedly_failure = microphoneMutedUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphoneNotFunctioning = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphoneNotFunctioning') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphoneNotFunctioning_attempt = \nmicrophoneNotFunctioning\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphoneNotFunctioning_failure = microphoneNotFunctioning_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphonePermissionDenied = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphonePermissionDenied') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphonePermissionDenied_attempt = \nmicrophonePermissionDenied\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphonePermissionDenied_failure = microphonePermissionDenied_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkReceiveQuality = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkReceiveQuality') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkReceiveQuality_attempt = \nnetworkReceiveQuality\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkReceiveQuality_failure = networkReceiveQuality_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkReconnect = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkReconnect') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkReconnect_attempt = \nnetworkReconnect\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkReconnect_failure = networkReconnect_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkRelaysNotReachable = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkRelaysNotReachable') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkRelaysNotReachable_attempt = \nnetworkRelaysNotReachable\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkRelaysNotReachable_failure = networkRelaysNotReachable_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkSendQuality = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkSendQuality') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkSendQuality_attempt = \nnetworkSendQuality\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkSendQuality_failure = networkSendQuality_attempt\n| where bad_cnt>good_cnt;\n//\nlet noMicrophoneDevicesEnumerated = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('noMicrophoneDevicesEnumerated') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet noMicrophoneDevicesEnumerated_attempt = \nnoMicrophoneDevicesEnumerated\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet noMicrophoneDevicesEnumerated_failure = noMicrophoneDevicesEnumerated_attempt\n| where bad_cnt>good_cnt;\n//\nlet noNetwork = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('noNetwork') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet noNetwork_attempt = \nnoNetwork\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet noNetwork_failure = noNetwork_attempt\n| where bad_cnt>good_cnt;\n//\nlet noSpeakerDevicesEnumerated = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('noSpeakerDevicesEnumerated') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet noSpeakerDevicesEnumerated_attempt = \nnoSpeakerDevicesEnumerated\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet noSpeakerDevicesEnumerated_failure = noSpeakerDevicesEnumerated_attempt\n| where bad_cnt>good_cnt;\n//\nlet screenshareRecordingDisabled = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('screenshareRecordingDisabled') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet screenshareRecordingDisabled_attempt = \nscreenshareRecordingDisabled\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet screenshareRecordingDisabled_failure = screenshareRecordingDisabled_attempt\n| where bad_cnt>good_cnt;\n//\nlet speakerMuted = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('speakerMuted') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet speakerMuted_attempt = \nspeakerMuted\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet speakerMuted_failure = speakerMuted_attempt\n| where bad_cnt>good_cnt;\n//\nlet speakerNotFunctioning = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('speakerNotFunctioning') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet speakerNotFunctioning_attempt = \nspeakerNotFunctioning\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet speakerNotFunctioning_failure = speakerNotFunctioning_attempt\n| where bad_cnt>good_cnt;\n//\nlet speakerVolumeIsZero = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('speakerVolumeIsZero') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet speakerVolumeIsZero_attempt = \nspeakerVolumeIsZero\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet speakerVolumeIsZero_failure = speakerVolumeIsZero_attempt\n| where bad_cnt>good_cnt;\n//\nlet ufd_metric_aggregation =\nunion\n ASF3(cameraFreeze_attempt, cameraFreeze_failure, 'reliability/api/UFD/recovery/CameraFreeze', argStartDateTime, argEndDateTime),\n ASF3(cameraPermissionDenied_attempt, cameraPermissionDenied_failure, 'reliability/api/UFD/recovery/CameraPermissionDenied', argStartDateTime, argEndDateTime),\n ASF3(cameraStartFailed_attempt, cameraStartFailed_failure, 'reliability/api/UFD/recovery/CameraStartFailed', argStartDateTime, argEndDateTime),\n ASF3(cameraStartTimedOut_attempt, cameraStartTimedOut, 'reliability/api/UFD/recovery/CameraStartTimedOut', argStartDateTime, argEndDateTime),\n ASF3(capturerStartFailed_attempt, capturerStartFailed_failure, 'reliability/api/UFD/recovery/CameraStoppedUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(capturerStartFailed_attempt, capturerStartFailed_failure, 'reliability/api/UFD/recovery/CapturerStartFailed', argStartDateTime, argEndDateTime),\n ASF3(capturerStoppedUnexpectedly_attempt, capturerStoppedUnexpectedly_failure, 'reliability/api/UFD/recovery/CapturerStoppedUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(microphoneMuteUnexpectedly_attempt, microphoneMuteUnexpectedly_failure, 'reliability/api/UFD/recovery/MicrophoneMuteUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(microphoneMutedUnexpectedly_attempt, microphoneMutedUnexpectedly_failure, 'reliability/api/UFD/recovery/MicrophoneMutedUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(microphoneNotFunctioning_attempt, microphoneNotFunctioning_failure, 'reliability/api/UFD/recovery/MicrophoneNotFunctioning', argStartDateTime, argEndDateTime),\n ASF3(microphonePermissionDenied_attempt, microphonePermissionDenied_failure, 'reliability/api/UFD/recovery/MicrophonePermissionDenied', argStartDateTime, argEndDateTime),\n ASF3(networkReceiveQuality_attempt, networkReceiveQuality_failure, 'reliability/api/UFD/recovery/NetworkReceiveQuality', argStartDateTime, argEndDateTime),\n ASF3(networkReconnect_attempt, networkReconnect_failure, 'reliability/api/UFD/recovery/NetworkReconnect', argStartDateTime, argEndDateTime),\n ASF3(networkRelaysNotReachable_attempt, networkRelaysNotReachable_failure, 'reliability/api/UFD/recovery/NetworkRelaysNotReachable', argStartDateTime, argEndDateTime),\n ASF3(networkSendQuality_attempt, networkSendQuality_failure, 'reliability/api/UFD/recovery/NetworkSendQuality', argStartDateTime, argEndDateTime),\n ASF3(noMicrophoneDevicesEnumerated_attempt, noMicrophoneDevicesEnumerated_failure, 'reliability/api/UFD/recovery/NoMicrophoneDevicesEnumerated', argStartDateTime, argEndDateTime),\n ASF3(noNetwork_attempt, noNetwork_failure, 'reliability/api/UFD/recovery/NoNetwork', argStartDateTime, argEndDateTime),\n ASF3(noSpeakerDevicesEnumerated_attempt, noSpeakerDevicesEnumerated_failure, 'reliability/api/UFD/recovery/NoSpeakerDevicesEnumerated', argStartDateTime, argEndDateTime),\n ASF3(screenshareRecordingDisabled_attempt, screenshareRecordingDisabled_failure, 'reliability/api/UFD/recovery/ScreenshareRecordingDisabled', argStartDateTime, argEndDateTime),\n ASF3(speakerMuted_attempt, speakerMuted_failure, 'reliability/api/UFD/recovery/SpeakerMuted', argStartDateTime, argEndDateTime),\n ASF3(speakerNotFunctioning_attempt, speakerNotFunctioning_failure, 'reliability/api/UFD/recovery/SpeakerNotFunctioning', argStartDateTime, argEndDateTime),\n ASF3(speakerVolumeIsZero_attempt, speakerVolumeIsZero_failure, 'reliability/api/UFD/recovery/SpeakerVolumeIsZero', argStartDateTime, argEndDateTime)\n| invoke AttemptSuccessFailureLegMetric(argStartDateTime, argEndDateTime)\n| extend timestampBin = bin(timestamp, 1d)\n| summarize\n legs_dcount = dcount(localParticipantId), \n// calls_dcount = dcount(callId),\n success_legs_dcount= dcountif(localParticipantId, succeeded),\n failed_legs_dcount= dcountif(localParticipantId, not(succeeded)),\n timestamp_max = max(timestamp)\n by \n metricName,\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n timestampBin\n;\nufd_metric_aggregation\n| extend UFD = ufd_name_map(metricName)\n| where isempty(selected_DiagnosticChangedName) or UFD == selected_DiagnosticChangedName\n| summarize arg_max(timestamp_max, *) by UFD, SdkVersion, ResultType, SubCode, timestampBin, CallType, Platform\n| summarize ['recovery rate'] = sum(success_legs_dcount)*100.0/sum(legs_dcount) by UFD, timestampBin={time_granularity}\n| project UFD, timestampBin = format_datetime(timestampBin, \"yyyy-MM-dd \"), ['recovery rate']\n| order by UFD, timestampBin asc;\n\n",
+ "size": 0,
+ "aggregation": 3,
+ "title": "{DiagnosticChangedName} Recovery Rate over time ",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "visualization": "linechart",
+ "chartSettings": {
+ "xAxis": "timestampBin",
+ "yAxis": [
+ "recovery rate"
+ ],
+ "showDataPoints": true,
+ "ySettings": {
+ "numberFormatSettings": {
+ "unit": 1,
+ "options": {
+ "style": "decimal",
+ "useGrouping": true,
+ "maximumFractionDigits": 2
+ }
+ }
+ }
+ }
+ },
+ "customWidth": "50",
+ "name": "ufd recovery rate timeseries"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let selected_DiagnosticChangedName = dynamic('{DiagnosticChangedName}');\nlet ufd_name_map = (ufd:string) { \n case( \n ufd == \"reliability/api/UFD/recovery/CameraFreeze\",\"CameraFreeze\",\n ufd == \"reliability/api/UFD/recovery/CameraPermissionDenied\",\"CameraPermissionDenied\",\n ufd == \"reliability/api/UFD/recovery/CameraStartFailed\",\"CameraStartFailed\",\n ufd == \"reliability/api/UFD/recovery/CameraStartTimedOut\",\"CameraStartTimedOut\",\n ufd == \"reliability/api/UFD/recovery/CameraStoppedUnexpectedly\",\"CameraStoppedUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/CapturerStartFailed\",\"CapturerStartFailed\",\n ufd == \"reliability/api/UFD/recovery/CapturerStoppedUnexpectedly\",\"CapturerStoppedUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/MicrophoneMuteUnexpectedly\",\"MicrophoneMuteUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/MicrophoneMutedUnexpectedly\",\"MicrophoneMutedUnexpectedly\",\n ufd == \"reliability/api/UFD/recovery/MicrophoneNotFunctioning\",\"MicrophoneNotFunctioning\",\n ufd == \"reliability/api/UFD/recovery/MicrophonePermissionDenied\",\"MicrophonePermissionDenied\",\n ufd == \"reliability/api/UFD/recovery/NetworkReceiveQuality\",\"NetworkReceiveQuality\",\n ufd == \"reliability/api/UFD/recovery/NetworkReconnect\",\"NetworkReconnect\",\n ufd == \"reliability/api/UFD/recovery/NetworkRelaysNotReachable\",\"NetworkRelaysNotReachable\",\n ufd == \"reliability/api/UFD/recovery/NetworkSendQuality\",\"NetworkSendQuality\",\n ufd == \"reliability/api/UFD/recovery/NoMicrophoneDevicesEnumerated\",\"NoMicrophoneDevicesEnumerated\",\n ufd == \"reliability/api/UFD/recovery/NoNetwork\",\"NoNetwork\",\n ufd == \"reliability/api/UFD/recovery/NoSpeakerDevicesEnumerated\",\"NoSpeakerDevicesEnumerated\",\n ufd == \"reliability/api/UFD/recovery/ScreenshareRecordingDisabled\",\"ScreenshareRecordingDisabled\",\n ufd == \"reliability/api/UFD/recovery/SpeakerMuted\",\"SpeakerMuted\",\n ufd == \"reliability/api/UFD/recovery/SpeakerNotFunctioning\",\"SpeakerNotFunctioning\",\n ufd == \"reliability/api/UFD/recovery/SpeakerVolumeIsZero\",\"SpeakerVolumeIsZero\",\n ''\n ) \n};\nlet divide = (a:real,b:real) { \n iif(b == 0.0 or isnan(b) or isnull(b), real(null), a / b) \n};\nlet reliability = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good), attempts); \n iff(isnull(ratio), real(null), round(100.00 * ratio, decimals)) \n};\nlet reliability_upperbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_upper = ratio + 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_upper_1 = iff(ratio_upper > 1.0, 1.0, ratio_upper); \n iff(isnull(ratio), real(null), round(100.00 * ratio_upper_1, decimals)) \n};\nlet reliability_lowerbound = (good:int,attempts:int,decimals:int=2) { \n let ratio = divide((1.00 * good + 2.0), attempts + 4.0); \n let ratio_lower = ratio - 1.96 * sqrt(divide(ratio * (1.00 - ratio), attempts + 4.0)); \n let ratio_lower_1 = iff(ratio_lower < 0.0, 0.0, ratio_lower); \n iff(isnull(ratio), real(null), round(100.00 * ratio_lower_1, decimals)) \n};\nlet compareMetricWithThreshold = (cmpOperator:string,metricValue:real,threshold:real) { \n case( \n cmpOperator == '==', \n metricValue == threshold, \n cmpOperator == '!=', \n metricValue != threshold, \n cmpOperator == '>', \n metricValue > threshold, \n cmpOperator == '>=', \n metricValue >= threshold, \n cmpOperator == '<', \n metricValue < threshold, \n cmpOperator == '<=', \n metricValue <= threshold, \n bool(null) \n) \n};\nlet metricsMetadata = () {\n\tdatatable (\n metricName: string, \n metadataValidAsOf: datetime, \n enabled: bool, \n targetThresholdLeg: real, \n cmpOperatorLeg: string, \n aggregLegRounding: int, \n aggregLegUnit: string, \n description: string, \n priority: int\n ) \n [\n \"reliability/api/UFD/recovery/CameraFreeze\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraPermissionDenied\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraStartFailed\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraStartTimedOut\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CameraStoppedUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CapturerStartFailed\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/CapturerStoppedUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophoneMuteUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophoneMutedUnexpectedly\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophoneNotFunctioning\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/MicrophonePermissionDenied\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkReceiveQuality\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkReconnect\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkRelaysNotReachable\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NetworkSendQuality\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NoMicrophoneDevicesEnumerated\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NoNetwork\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/NoSpeakerDevicesEnumerated\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/ScreenshareRecordingDisabled\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/SpeakerMuted\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/SpeakerNotFunctioning\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n \"reliability/api/UFD/recovery/SpeakerVolumeIsZero\",datetime(2021-01-01T00:00:00Z),bool(true),real(100),\">=\",int(1),\"percentage\", \"\", int(1),\n\t\t] \n | where enabled\n};\nlet applyGoalsOnLegMetric = (legMetricResult:(timestamp:datetime,metricName:string,localParticipantId:string,metricValue:real,metricValueUpperBound:real,metricValueLowerBound:real,SdkVersion:string,ResultType:string,SubCode:string,Platform:string,CallType:string,callId:string)) {\n // Assumption: there is only one metricName in the legMetricResult\n // Kusto does not support asserts on row context\n //\n metricsMetadata\n | join kind=innerunique legMetricResult on metricName\n | extend cmpOperator = cmpOperatorLeg, threshold=targetThresholdLeg, unit=aggregLegUnit\n | project\n timestamp,\n metricName,\n localParticipantId,\n metricValue,\n metricValueUpperBound,\n metricValueLowerBound,\n goal = strcat(cmpOperator, ' ', threshold),\n succeeded= compareMetricWithThreshold(cmpOperator, metricValueUpperBound, threshold),\n unit,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n};\nlet AttemptSuccessFailureLegMetric = (attempt_and_failure_event:(EventInfo_Time:datetime,localParticipantId:string,metricName:string,kind_of_event:string,SdkVersion:string,ResultType:string,SubCode:string,callId:string,UserAgent:string,Platform:string,CallType:string),startDateTime:datetime,endDateTime:datetime) {\n let metadata = metricsMetadata | project metricName, aggregLegRounding;\n let attempt_and_failure_event_with_meta=attempt_and_failure_event | join kind=inner metadata on metricName;\n let attempt_event=attempt_and_failure_event_with_meta | where kind_of_event == 'attempt';\n let failure_event=attempt_and_failure_event_with_meta | where kind_of_event == 'failure';\n let pool = \n attempt_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | project \n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=1.0 * count(),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n let bad= \n failure_event\n | where EventInfo_Time between(startDateTime .. endDateTime)\n | join kind=leftsemi pool on localParticipantId, metricName\n | project\n EventInfo_Time, \n localParticipantId,\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n Platform,\n CallType\n | summarize\n failures=1.0 * count(),\n EventInfo_Time=max(EventInfo_Time),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by\n localParticipantId,\n metricName;\n //\n union hint.spread=2 pool, bad\n | summarize\n EventInfo_Time=max(EventInfo_Time),\n attempts=sum(attempts),\n failures=sum(failures),\n SdkVersion= take_anyif(SdkVersion, isnotempty(SdkVersion)),\n ResultType=take_anyif(ResultType, isnotempty(ResultType)),\n SubCode=take_anyif(SubCode, isnotempty(SubCode)),\n callId = take_anyif(callId, isnotempty(callId)),\n Platform=take_anyif(Platform, isnotempty(Platform)),\n CallType=take_anyif(CallType, isnotempty(CallType))\n by localParticipantId, metricName\n | extend successes = max_of(attempts - failures, 0) //protect against failures>attempts\n | project\n timestamp=EventInfo_Time,\n metricName,\n localParticipantId,\n metricValue=reliability(successes, attempts),\n metricValueUpperBound=reliability_upperbound(successes, attempts),\n metricValueLowerBound=reliability_lowerbound(successes, attempts),\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n callId\n | invoke applyGoalsOnLegMetric()\n};\nlet clean_result_type = (result_type:string) {\n case (\n result_type contains 'Success' or result_type contains \"Succeeded\",\n 'Succeeded',\n result_type contains 'ExpectedError',\n 'ExpectedError',\n result_type contains 'UnexpectedServerError',\n 'UnexpectedServerError',\n 'UnexpectedClientError'\n )\n};\nlet ASF_Filter = (d:(EventInfo_Time:datetime,localParticipantId:string),startDateTime:datetime,endDateTime:datetime) { \n d \n | where EventInfo_Time between(startDateTime .. endDateTime) and isnotempty(localParticipantId) \n};\nlet ASF3 = (attempt:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),failure:(EventInfo_Time:datetime,localParticipantId:string,ResultType:string,SubCode:string,callId:string,SdkVersion:string,UserAgent:string,Platform:string,CallType:string),metricName:string,startDateTime:datetime,endDateTime:datetime) {\n let fa = ASF_Filter((attempt), startDateTime, endDateTime);\n union\n (\n ASF_Filter((failure), startDateTime, endDateTime)\n | join kind = leftsemi fa on localParticipantId\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='failure',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n ),\n (\n fa\n | project\n EventInfo_Time,\n localParticipantId,\n kind_of_event='attempt',\n metricName,\n SdkVersion,\n ResultType,\n SubCode,\n callId,\n UserAgent,\n Platform,\n CallType\n )\n};\nlet argStartDateTime = {TimeRange:start};\nlet argEndDateTime = {TimeRange:end};\n//\n// API UFD recovery reliability\nlet cameraFreeze = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('cameraFreeze') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraFreeze_attempt = \ncameraFreeze \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraFreeze_failure = cameraFreeze_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraPermissionDenied = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('cameraPermissionDenied') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraPermissionDenied_attempt = \ncameraPermissionDenied \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraPermissionDenied_failure = cameraPermissionDenied_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraStartFailed = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('CameraStartFailed') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraStartFailed_attempt = \ncameraStartFailed \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraStartFailed_failure = cameraStartFailed_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraStartTimedOut = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('cameraStartTimedOut') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraStartTimedOut_attempt = \ncameraStartTimedOut \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraStartTimedOut_failure = cameraStartTimedOut_attempt\n| where bad_cnt>good_cnt;\n//\nlet cameraStoppedUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('CameraStoppedUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet cameraStoppedUnexpectedly_attempt = \ncameraStoppedUnexpectedly \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet cameraStoppedUnexpectedly_failure = cameraStoppedUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet capturerStartFailed = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('capturerStartFailed') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet capturerStartFailed_attempt = \ncapturerStartFailed \n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet capturerStartFailed_failure = capturerStartFailed_attempt\n| where bad_cnt>good_cnt;\n//\nlet capturerStoppedUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('capturerStoppedUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet capturerStoppedUnexpectedly_attempt = \ncapturerStoppedUnexpectedly\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet capturerStoppedUnexpectedly_failure = capturerStoppedUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphoneMuteUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphoneMuteUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphoneMuteUnexpectedly_attempt = \nmicrophoneMuteUnexpectedly\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphoneMuteUnexpectedly_failure = microphoneMuteUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphoneMutedUnexpectedly = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphoneMutedUnexpectedly') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphoneMutedUnexpectedly_attempt = \nmicrophoneMutedUnexpectedly\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphoneMutedUnexpectedly_failure = microphoneMutedUnexpectedly_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphoneNotFunctioning = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphoneNotFunctioning') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphoneNotFunctioning_attempt = \nmicrophoneNotFunctioning\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphoneNotFunctioning_failure = microphoneNotFunctioning_attempt\n| where bad_cnt>good_cnt;\n//\nlet microphonePermissionDenied = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('microphonePermissionDenied') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet microphonePermissionDenied_attempt = \nmicrophonePermissionDenied\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet microphonePermissionDenied_failure = microphonePermissionDenied_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkReceiveQuality = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkReceiveQuality') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkReceiveQuality_attempt = \nnetworkReceiveQuality\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkReceiveQuality_failure = networkReceiveQuality_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkReconnect = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkReconnect') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkReconnect_attempt = \nnetworkReconnect\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkReconnect_failure = networkReconnect_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkRelaysNotReachable = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkRelaysNotReachable') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkRelaysNotReachable_attempt = \nnetworkRelaysNotReachable\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkRelaysNotReachable_failure = networkRelaysNotReachable_attempt\n| where bad_cnt>good_cnt;\n//\nlet networkSendQuality = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('networkSendQuality') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet networkSendQuality_attempt = \nnetworkSendQuality\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet networkSendQuality_failure = networkSendQuality_attempt\n| where bad_cnt>good_cnt;\n//\nlet noMicrophoneDevicesEnumerated = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('noMicrophoneDevicesEnumerated') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet noMicrophoneDevicesEnumerated_attempt = \nnoMicrophoneDevicesEnumerated\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet noMicrophoneDevicesEnumerated_failure = noMicrophoneDevicesEnumerated_attempt\n| where bad_cnt>good_cnt;\n//\nlet noNetwork = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('noNetwork') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet noNetwork_attempt = \nnoNetwork\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet noNetwork_failure = noNetwork_attempt\n| where bad_cnt>good_cnt;\n//\nlet noSpeakerDevicesEnumerated = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('noSpeakerDevicesEnumerated') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet noSpeakerDevicesEnumerated_attempt = \nnoSpeakerDevicesEnumerated\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet noSpeakerDevicesEnumerated_failure = noSpeakerDevicesEnumerated_attempt\n| where bad_cnt>good_cnt;\n//\nlet screenshareRecordingDisabled = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('screenshareRecordingDisabled') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet screenshareRecordingDisabled_attempt = \nscreenshareRecordingDisabled\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet screenshareRecordingDisabled_failure = screenshareRecordingDisabled_attempt\n| where bad_cnt>good_cnt;\n//\nlet speakerMuted = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('speakerMuted') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet speakerMuted_attempt = \nspeakerMuted\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet speakerMuted_failure = speakerMuted_attempt\n| where bad_cnt>good_cnt;\n//\nlet speakerNotFunctioning = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('speakerNotFunctioning') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet speakerNotFunctioning_attempt = \nspeakerNotFunctioning\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet speakerNotFunctioning_failure = speakerNotFunctioning_attempt\n| where bad_cnt>good_cnt;\n//\nlet speakerVolumeIsZero = \nACSCallClientOperations\n| extend x = tostring(OperationPayload.DiagnosticChanged) \n| where OperationName == 'UserFacingDiagnostics' and tolower(x) == tolower('speakerVolumeIsZero') \n| extend\n EventInfo_Time = CallClientTimeStamp,\n localParticipantId=OperationId // aggregate on operation id instead of participant id for api level\n| extend SubCode = coalesce(tostring(toint(todecimal(OperationPayload['SubCode']))), '')\n| extend callId = CallId\n| extend ResultType = clean_result_type(ResultType)\n| extend Platform = tostring(OperationPayload.SdkPlatform)\n| extend CallType = tostring(OperationPayload.CallType);\nlet speakerVolumeIsZero_attempt = \nspeakerVolumeIsZero\n| summarize arg_max(CallClientTimeStamp, OperationId, *) by localParticipantId\n| summarize bad_cnt=countif(tostring(OperationPayload.DiagnosticQuality) !in ('good','Good')), good_cnt=countif(tostring(OperationPayload.DiagnosticQuality) in ('good','Good')) by EventInfo_Time, localParticipantId, SubCode, callId, ResultType, SdkVersion, UserAgent, Platform, CallType;\nlet speakerVolumeIsZero_failure = speakerVolumeIsZero_attempt\n| where bad_cnt>good_cnt;\n//\nlet ufd_metric_aggregation =\nunion\n ASF3(cameraFreeze_attempt, cameraFreeze_failure, 'reliability/api/UFD/recovery/CameraFreeze', argStartDateTime, argEndDateTime),\n ASF3(cameraPermissionDenied_attempt, cameraPermissionDenied_failure, 'reliability/api/UFD/recovery/CameraPermissionDenied', argStartDateTime, argEndDateTime),\n ASF3(cameraStartFailed_attempt, cameraStartFailed_failure, 'reliability/api/UFD/recovery/CameraStartFailed', argStartDateTime, argEndDateTime),\n ASF3(cameraStartTimedOut_attempt, cameraStartTimedOut, 'reliability/api/UFD/recovery/CameraStartTimedOut', argStartDateTime, argEndDateTime),\n ASF3(capturerStartFailed_attempt, capturerStartFailed_failure, 'reliability/api/UFD/recovery/CameraStoppedUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(capturerStartFailed_attempt, capturerStartFailed_failure, 'reliability/api/UFD/recovery/CapturerStartFailed', argStartDateTime, argEndDateTime),\n ASF3(capturerStoppedUnexpectedly_attempt, capturerStoppedUnexpectedly_failure, 'reliability/api/UFD/recovery/CapturerStoppedUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(microphoneMuteUnexpectedly_attempt, microphoneMuteUnexpectedly_failure, 'reliability/api/UFD/recovery/MicrophoneMuteUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(microphoneMutedUnexpectedly_attempt, microphoneMutedUnexpectedly_failure, 'reliability/api/UFD/recovery/MicrophoneMutedUnexpectedly', argStartDateTime, argEndDateTime),\n ASF3(microphoneNotFunctioning_attempt, microphoneNotFunctioning_failure, 'reliability/api/UFD/recovery/MicrophoneNotFunctioning', argStartDateTime, argEndDateTime),\n ASF3(microphonePermissionDenied_attempt, microphonePermissionDenied_failure, 'reliability/api/UFD/recovery/MicrophonePermissionDenied', argStartDateTime, argEndDateTime),\n ASF3(networkReceiveQuality_attempt, networkReceiveQuality_failure, 'reliability/api/UFD/recovery/NetworkReceiveQuality', argStartDateTime, argEndDateTime),\n ASF3(networkReconnect_attempt, networkReconnect_failure, 'reliability/api/UFD/recovery/NetworkReconnect', argStartDateTime, argEndDateTime),\n ASF3(networkRelaysNotReachable_attempt, networkRelaysNotReachable_failure, 'reliability/api/UFD/recovery/NetworkRelaysNotReachable', argStartDateTime, argEndDateTime),\n ASF3(networkSendQuality_attempt, networkSendQuality_failure, 'reliability/api/UFD/recovery/NetworkSendQuality', argStartDateTime, argEndDateTime),\n ASF3(noMicrophoneDevicesEnumerated_attempt, noMicrophoneDevicesEnumerated_failure, 'reliability/api/UFD/recovery/NoMicrophoneDevicesEnumerated', argStartDateTime, argEndDateTime),\n ASF3(noNetwork_attempt, noNetwork_failure, 'reliability/api/UFD/recovery/NoNetwork', argStartDateTime, argEndDateTime),\n ASF3(noSpeakerDevicesEnumerated_attempt, noSpeakerDevicesEnumerated_failure, 'reliability/api/UFD/recovery/NoSpeakerDevicesEnumerated', argStartDateTime, argEndDateTime),\n ASF3(screenshareRecordingDisabled_attempt, screenshareRecordingDisabled_failure, 'reliability/api/UFD/recovery/ScreenshareRecordingDisabled', argStartDateTime, argEndDateTime),\n ASF3(speakerMuted_attempt, speakerMuted_failure, 'reliability/api/UFD/recovery/SpeakerMuted', argStartDateTime, argEndDateTime),\n ASF3(speakerNotFunctioning_attempt, speakerNotFunctioning_failure, 'reliability/api/UFD/recovery/SpeakerNotFunctioning', argStartDateTime, argEndDateTime),\n ASF3(speakerVolumeIsZero_attempt, speakerVolumeIsZero_failure, 'reliability/api/UFD/recovery/SpeakerVolumeIsZero', argStartDateTime, argEndDateTime)\n| invoke AttemptSuccessFailureLegMetric(argStartDateTime, argEndDateTime)\n| extend timestampBin = bin(timestamp, 1d)\n| summarize\n legs_dcount = dcount(localParticipantId), \n// calls_dcount = dcount(callId),\n success_legs_dcount= dcountif(localParticipantId, succeeded),\n failed_legs_dcount= dcountif(localParticipantId, not(succeeded)),\n timestamp_max = max(timestamp)\n by \n metricName,\n SdkVersion,\n ResultType,\n Platform,\n CallType,\n SubCode,\n timestampBin\n;\nufd_metric_aggregation\n| extend UFD = ufd_name_map(metricName)\n| where isempty(selected_DiagnosticChangedName) or UFD == selected_DiagnosticChangedName\n| summarize arg_max(timestamp_max, *) by UFD, SdkVersion, ResultType, SubCode, timestampBin, CallType, Platform\n| summarize volume = sum(legs_dcount) by UFD, timestampBin={time_granularity}\n| project UFD, timestampBin = format_datetime(timestampBin, \"yyyy-MM-dd \"), volume\n| order by UFD, timestampBin asc;\n\n",
+ "size": 0,
+ "aggregation": 3,
+ "title": "{DiagnosticChangedName} volume over time ",
+ "timeContextFromParameter": "TimeRange",
+ "queryType": 0,
+ "resourceType": "microsoft.communication/communicationservices",
+ "visualization": "linechart",
+ "chartSettings": {
+ "xAxis": "timestampBin",
+ "yAxis": [
+ "volume"
+ ],
+ "showDataPoints": true,
+ "ySettings": {
+ "numberFormatSettings": {
+ "unit": 0,
+ "options": {
+ "style": "decimal",
+ "useGrouping": true,
+ "maximumFractionDigits": 2
+ }
+ }
+ }
+ }
+ },
+ "customWidth": "50",
+ "name": "ufd recovery rate timeseries - Copy"
}
- ],
- "style": "pills",
- "queryType": 0,
- "resourceType": "microsoft.communication/communicationservices"
+ ]
+ },
+ "conditionalVisibility": {
+ "parameterName": "DiagnosticChangedName",
+ "comparison": "isNotEqualTo",
+ "value": ""
},
- "name": "parameters - correlationid"
+ "name": "UFD drill down"
},
{
"type": 1,
"content": {
- "json": "**Select a CorrelationId from the drop-down menu to display its associated data**",
+ "json": "Overview of each DiagnosticChanged [here](https://learn.microsoft.com/en-us/azure/communication-services/concepts/voice-video-calling/user-facing-diagnostics?pivots=platform-web)\n\nRecovery Rate indicates the rate that UFDs were fired and later stopped. In other words, it calculates how many **Good** DiagnosticQuality flag was fired after **Bad**/**Poor** DiagnosticQuality flags were issued. Recovery rate tells us that how many UFD events have improved. \n\nWhile UFDs help indentify user facing quality issues, resource owners should aim to improve quality by reducing UFD volume, and improve recovery rate. ",
"style": "info"
},
- "conditionalVisibility": {
- "parameterName": "correlation_id",
- "comparison": "isEqualTo"
- },
- "name": "correlation-id-drilldown-info"
+ "customWidth": "15",
+ "name": "UFDs Good/Bad/Poor description"
},
{
"type": 3,
"content": {
"version": "KqlItem/1.0",
- "query": "ACSCallAutomationIncomingOperations \r\n| where CorrelationId == \"{correlation_id}\" \r\n| where TimeGenerated {time_range:query} \r\n| extend OperationDate=strcat(\"📅\", format_datetime(TimeGenerated, 'MM/dd/y'))\r\n| project OperationDate, OperationName, ResultSignature, DurationMs, CallerIpAddress, OperationVersion, SdkType, SdkVersion\r\n",
+ "query": "let ufd_map_doc_url = (ufd:string) { \n case( \n ufd == 'SpeakingWhileMicrophoneIsMuted', 'https://learn.microsoft.com/en-us/azure/communication-services/resources/troubleshooting/voice-video-calling/references/ufd/speaking-while-microphone-is-muted',\n ufd == 'NetworkReceiveQuality', 'https://learn.microsoft.com/en-us/azure/communication-services/resources/troubleshooting/voice-video-calling/references/ufd/network-receive-quality',\n ufd == 'CameraFreeze', 'https://learn.microsoft.com/en-us/azure/communication-services/resources/troubleshooting/voice-video-calling/references/ufd/camera-freeze',\n ufd == 'MicrophonePermissionDenied', 'https://learn.microsoft.com/en-us/azure/communication-services/resources/troubleshooting/voice-video-calling/references/ufd/microphone-permission-denied',\n ufd == 'CameraStoppedUnexpectedly', 'https://learn.microsoft.com/en-us/azure/communication-services/resources/troubleshooting/voice-video-calling/references/ufd/camera-stopped-unexpectedly',\n ufd == 'MicrophoneNotFunctioning', 'https://learn.microsoft.com/en-us/azure/communication-services/resources/troubleshooting/voice-video-calling/references/ufd/microphone-not-functioning',\n ufd == 'CameraPermissionDenied', 'https://learn.microsoft.com/en-us/azure/communication-services/resources/troubleshooting/voice-video-calling/references/ufd/camera-permission-denied',\n ufd == 'CameraStartTimedOut', 'https://learn.microsoft.com/en-us/azure/communication-services/resources/troubleshooting/voice-video-calling/references/ufd/camera-start-timed-out',\n ufd == 'NetworkReconnect', 'https://learn.microsoft.com/en-us/azure/communication-services/resources/troubleshooting/voice-video-calling/references/ufd/network-reconnect',\n ufd == 'MicrophoneMuteUnexpectedly', 'https://learn.microsoft.com/en-us/azure/communication-services/resources/troubleshooting/voice-video-calling/references/ufd/microphone-mute-unexpectedly',\n ufd == 'CapturerStoppedUnexpectedly', 'https://learn.microsoft.com/en-us/azure/communication-services/resources/troubleshooting/voice-video-calling/references/ufd/capturer-stopped-unexpectedly',\n ufd == 'CameraStartFailed', 'https://learn.microsoft.com/en-us/azure/communication-services/resources/troubleshooting/voice-video-calling/references/ufd/camera-start-failed',\n ufd == 'NetworkSendQuality', 'https://learn.microsoft.com/en-us/azure/communication-services/resources/troubleshooting/voice-video-calling/references/ufd/network-send-quality',\n ufd == 'NoMicrophoneDevicesEnumerated', 'https://learn.microsoft.com/en-us/azure/communication-services/resources/troubleshooting/voice-video-calling/references/ufd/no-microphone-devices-enumerated',\n ufd == 'CapturerStartFailed', 'https://learn.microsoft.com/en-us/azure/communication-services/resources/troubleshooting/voice-video-calling/references/ufd/capturer-start-failed',\n ufd == 'NoSpeakerDevicesEnumerated', 'https://learn.microsoft.com/en-us/azure/communication-services/resources/troubleshooting/voice-video-calling/references/ufd/no-speaker-devices-enumerated',\n ufd == 'ScreenshareRecordingDisabled', 'https://learn.microsoft.com/en-us/azure/communication-services/resources/troubleshooting/voice-video-calling/references/ufd/screenshare-recording-disabled',\n ufd == 'NoNetwork', 'https://learn.microsoft.com/en-us/azure/communication-services/resources/troubleshooting/voice-video-calling/references/ufd/no-network',\n ''\n ) \n};\nlet ufd_map_definition = (ufd:string) { \n case( \n ufd == 'SpeakingWhileMicrophoneIsMuted', \"This event with a True value occurs when the SDK detects that the audio input volume isn't muted although the user did mute the microphone.\",\n ufd == 'NetworkReceiveQuality', 'This event with a Bad value indicates the presence of network quality issues for incoming streams, as detected by the ACS Calling SDK.',\n ufd == 'CameraFreeze', 'This event with a True value occurs when the SDK detects that the input framerate goes down to zero, causing the video output to appear frozen or not changing.',\n ufd == 'MicrophonePermissionDenied', 'This event with a True value occurs when the SDK detects that the microphone permission was denied either at browser or OS level.',\n ufd == 'CameraStoppedUnexpectedly', 'This event with a True value occurs when the SDK detects that the camera track was muted.',\n ufd == 'MicrophoneNotFunctioning', 'This event with a True value occurs when the SDK detects that the microphone track was ended.',\n ufd == 'CameraPermissionDenied', 'This event with a True value occurs when the SDK detects that the camera permission was denied either at browser layer or at Operating System level.',\n ufd == 'CameraStartTimedOut', \"This event with a True value occurs when the SDK is unable to acquire the camera stream because the promise returned by getUserMedia browser method doesn't resolve within a certain period of time.\",\n ufd == 'NetworkReconnect', 'This event with a Bad value occurs when the Interactive Connectivity Establishment (ICE) transport state on the connection is failed',\n ufd == 'MicrophoneMuteUnexpectedly', 'This event with a True value occurs when the SDK detects that the microphone track was muted.',\n ufd == 'CapturerStoppedUnexpectedly', 'This event with a True value occurs when the SDK detects that the screen sharing track was muted.',\n ufd == 'CameraStartFailed', 'This event with a True value occurs when the SDK is unable to acquire the camera stream because the source is unavailable.',\n ufd == 'NetworkSendQuality', 'This event with a Bad value indicates that there are network quality issues for outgoing streams, such as packet loss, as detected by the ACS Calling SDK.',\n ufd == 'NoMicrophoneDevicesEnumerated', \"This event with a True value occurs when the browser API navigator.mediaDevices.enumerateDevices doesn't include any audio input devices.\",\n ufd == 'CapturerStartFailed', 'This event with a True value occurs when the SDK is unable to acquire the screen sharing stream because the source is unavailable.',\n ufd == 'NoSpeakerDevicesEnumerated', \"This event with a True value occurs when there's no speaker device presented in the device list returned by the browser API.\",\n ufd == 'ScreenshareRecordingDisabled', 'This event with a True value occurs when the SDK detects that the screen sharing permission was denied in the browser or OS settings on macOS.',\n ufd == 'NoNetwork', \"This event with a True value occurs when there's no network available for ICE candidates being gathered, which means there are network setup issues in the local environment, such as a disconnected Wi-Fi or Ethernet cable.\",\n ''\n ) \n};\nACSCallClientOperations\n| where OperationName == \"UserFacingDiagnostics\"\n| extend DiagnosticChanged = tostring(OperationPayload.DiagnosticChanged)\n| distinct DiagnosticChanged\n| extend UFD = DiagnosticChanged\n| extend ['Learn More'] = ufd_map_doc_url(DiagnosticChanged)\n| extend Definition = ufd_map_definition(DiagnosticChanged)\n",
"size": 0,
- "noDataMessage": "No operations found for the specified time range and CorrelationId",
+ "title": "UFD definitions",
+ "timeContextFromParameter": "TimeRange",
"queryType": 0,
"resourceType": "microsoft.communication/communicationservices",
- "crossComponentResources": [],
"gridSettings": {
"formatters": [
{
- "columnMatch": "Level",
- "formatter": 18,
- "formatOptions": {
- "thresholdsOptions": "icons",
- "thresholdsGrid": [
- {
- "operator": "==",
- "thresholdValue": "Warning",
- "representation": "warning",
- "text": "{0}{1}"
- },
- {
- "operator": "Default",
- "thresholdValue": null,
- "representation": "info",
- "text": "{0}{1}"
- }
- ]
- }
- },
- {
- "columnMatch": "OperationDate",
+ "columnMatch": "DiagnosticChanged",
"formatter": 5
},
{
- "columnMatch": "OperationTime",
- "formatter": 5
- }
- ],
- "hierarchySettings": {
- "treeType": 1,
- "groupBy": [
- "OperationDate"
- ],
- "expandTopLevel": true,
- "finalBy": "OperationTime"
- },
- "sortBy": [
+ "columnMatch": "Learn More",
+ "formatter": 5,
+ "formatOptions": {
+ "linkTarget": "Url",
+ "linkLabel": "Documentation"
+ }
+ },
{
- "itemKey": "$gen_count_$gen_group_0",
- "sortOrder": 2
+ "columnMatch": "Definition",
+ "formatter": 1,
+ "formatOptions": {
+ "customColumnWidthSetting": "80%"
+ }
}
]
- },
- "sortBy": [
- {
- "itemKey": "$gen_count_$gen_group_0",
- "sortOrder": 2
- }
- ]
- },
- "customWidth": "100",
- "conditionalVisibility": {
- "parameterName": "correlation_id",
- "comparison": "isNotEqualTo"
+ }
},
- "name": "correlation-id-details"
+ "customWidth": "85",
+ "name": "UFD definition"
}
]
},
- "customWidth": "100",
- "name": "correlation-id-drill-down-group "
+ "conditionalVisibility": {
+ "parameterName": "calling_tab",
+ "comparison": "isEqualTo",
+ "value": "ufd"
+ },
+ "name": "voice-video-ufd"
}
]
},
"conditionalVisibility": {
"parameterName": "tab",
"comparison": "isEqualTo",
- "value": "automation"
+ "value": "calling"
},
- "name": "Automation-group"
+ "name": "Voice_and_video"
}
],
"$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json"
-}
+}
\ No newline at end of file