diff --git a/Workbooks/Failures/Executive-Performance-Failure-Analysis/gallery.json b/Workbooks/Failures/Executive-Performance-Failure-Analysis/gallery.json
new file mode 100644
index 0000000000..21599eee4c
--- /dev/null
+++ b/Workbooks/Failures/Executive-Performance-Failure-Analysis/gallery.json
@@ -0,0 +1,19 @@
+{
+ "$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/gallery.json",
+ "galleryItems": [
+ {
+ "name": "Executive Performance & Failure Analysis",
+ "version": "1.0",
+ "description": "An executive-level dashboard for analyzing failures, performance trends, and baseline deviations across API operations.",
+ "templatePath": "workbook.json",
+ "author": "Kranthi Kumar Kharidu",
+ "tags": [
+ "Performance",
+ "Failures",
+ "Executive Dashboard",
+ "Application Insights",
+ "Azure Monitor"
+ ]
+ }
+ ]
+}
diff --git a/Workbooks/Failures/Executive-Performance-Failure-Analysis/metadata.json b/Workbooks/Failures/Executive-Performance-Failure-Analysis/metadata.json
new file mode 100644
index 0000000000..4bf9e57ae4
--- /dev/null
+++ b/Workbooks/Failures/Executive-Performance-Failure-Analysis/metadata.json
@@ -0,0 +1,7 @@
+{
+ "name": "Executive Performance & Failure Analysis",
+ "description": "Executive dashboard for high-level analysis of failures, response times, and baseline deviations.",
+ "author": "Kranthi Kumar Kharidu",
+ "type": "Workbooks",
+ "category": "Failures"
+}
diff --git a/Workbooks/Failures/Executive-Performance-Failure-Analysis/workbook.json b/Workbooks/Failures/Executive-Performance-Failure-Analysis/workbook.json
new file mode 100644
index 0000000000..f2608a8fff
--- /dev/null
+++ b/Workbooks/Failures/Executive-Performance-Failure-Analysis/workbook.json
@@ -0,0 +1,333 @@
+{
+ "version": "Notebook/1.0",
+ "items": [
+ {
+ "type": 1,
+ "content": {
+ "json": "
{YOUR-APPNAME}_Executive_Performance_and_Failure_Analysis_Dashboard
"
+ },
+ "name": "text - 0"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "84caf619-7585-48e0-a9c3-85c364aaa13b",
+ "version": "KqlParameterItem/1.0",
+ "name": "Show",
+ "type": 2,
+ "description": null,
+ "isRequired": true,
+ "query": "datatable(x:string, y:string)[\r\n\"['New Failure Rate (%)'], ['Existing Failure Rate (%)']\", 'New and Existing Failures',\r\n\"['New Failure Rate (%)']\", 'Only New Failures',\r\n\"['Existing Failure Rate (%)']\", 'Only Existing Failures',\r\n]",
+ "value": "['New Failure Rate (%)']",
+ "resourceType": "microsoft.insights/components"
+ },
+ {
+ "id": "6ab5c1cb-bad0-4d96-8e63-d439d0681c6e",
+ "version": "KqlParameterItem/1.0",
+ "name": "In",
+ "type": 2,
+ "description": null,
+ "isRequired": true,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "requests\n| where timestamp >= ago(1d)\n| summarize Count = count() by operation_Name\n| order by Count desc\n| project v = operation_Name, t = operation_Name, s = false\n| union (datatable(v:string, t:string, s:boolean)[\n'*', 'All Operations', true\n])",
+ "resourceType": "microsoft.insights/components",
+ "value": [
+ "*"
+ ]
+ },
+ {
+ "id": "eac9cbf1-6364-4f28-9c61-a9b038c035d7",
+ "version": "KqlParameterItem/1.0",
+ "name": "OverTimeRange",
+ "type": 4,
+ "isRequired": true,
+ "value": {
+ "durationMs": 86400000
+ },
+ "typeSettings": {
+ "selectableValues": [
+ {
+ "durationMs": 86400000
+ },
+ {
+ "durationMs": 259200000
+ },
+ {
+ "durationMs": 604800000
+ },
+ {
+ "durationMs": 1209600000
+ },
+ {
+ "durationMs": 2419200000
+ },
+ {
+ "durationMs": 2592000000
+ }
+ ],
+ "allowCustom": true
+ }
+ },
+ {
+ "id": "6f0de137-0136-48f0-b463-640de7109c05",
+ "version": "KqlParameterItem/1.0",
+ "name": "UseComparisonTimeRangeOf",
+ "type": 1,
+ "isRequired": true,
+ "query": "let t = {OverTimeRange:seconds};\r\nlet w = case(t <= 86400, '7d', t <= 259200, '14d', t <= 120960, '28d', '60d');\r\nrange i from 1 to 1 step 1\r\n| project x = w",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "value": "31d"
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components"
+ },
+ "name": "parameters - 1"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "\n# Application Failures Analysis\n"
+ },
+ "name": "text - 2"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "7a6716e6-3b5d-426b-a091-76e25325563a",
+ "version": "KqlParameterItem/1.0",
+ "name": "RequestFilters",
+ "type": 2,
+ "isRequired": true,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "requests\r\n| where timestamp {OverTimeRange}\r\n| where operation_Name in ({In}) or '*' in ({In})\r\n| summarize Count = count(), Users = dcount(user_Id) by name\r\n| project v = name, t = name, s=false\r\n| union (datatable(v:string, t:string, s:boolean)[\r\n'*', 'All Requests', true\r\n])",
+ "typeSettings": {
+ "additionalResourceOptions": []
+ },
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "value": [
+ "*"
+ ]
+ },
+ {
+ "id": "fa3ae272-8e65-4b87-a5a6-ef256a8a1956",
+ "version": "KqlParameterItem/1.0",
+ "name": "IncludeResultCodes",
+ "type": 2,
+ "isRequired": true,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "datatable(x:string, y:string, z:boolean)[\r\n'@', 'All 500s', false,\r\n'#', 'All 400s', false\r\n]\r\n| union (requests\r\n| where timestamp {OverTimeRange}\r\n| where success == false\r\n| summarize by resultCode\r\n| order by resultCode asc\r\n| project x = resultCode, y = resultCode, z = false)",
+ "typeSettings": {
+ "additionalResourceOptions": [
+ "value::all"
+ ],
+ "selectAllValue": "*",
+ "showDefault": false
+ },
+ "defaultValue": "value::all",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "value": [
+ "value::all"
+ ]
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components"
+ },
+ "name": "parameters - 3"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "# Failed Requests Volume - Trend Chart\nThis chart displays the total number of failed requests over time.\nIt differentiates between existing and newly observed failures within the last 24 hours, compared against the selected baseline period (e.g., 7 days).\n\n**Note: The numbers shown represent the total volume of failed requests, including repeated occurrences of the same issue.**\n"
+ },
+ "customWidth": "50",
+ "name": "text - 6"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "# Request Details\r\n\r\nThis table highlights only the unique failure patterns detected in the last 24 hours.\r\nEach row represents a distinct combination of request name and result code that did not appear in the baseline period.\r\n\r\n**Note: While the chart counts every individual failure, this table focuses solely on newly observed failure types β resulting in a smaller, more focused list.**\r\n\r\nπΈ New Failure πΉ Existing Failure"
+ },
+ "customWidth": "50",
+ "name": "text - 21"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let startTime = {OverTimeRange:start};\nlet grain = {OverTimeRange:grain};\nlet bigWindowTimeRange = {UseComparisonTimeRangeOf};\n\nlet existingFailures = requests\n| where timestamp >= ago(bigWindowTimeRange) and timestamp < bin(startTime, grain)\n| where operation_Name in ({In}) or '*' in ({In})\n| where name in ({RequestFilters}) or '*' in ({RequestFilters})\n| extend Key = strcat(name, '-', resultCode)\n| summarize makeset(Key, 10000);\n\nrequests\n| where timestamp >= bin(startTime, grain)\n| where operation_Name in ({In}) or '*' in ({In})\n| where name in ({RequestFilters}) or '*' in ({RequestFilters})\n| extend IncludeAsFailure = resultCode in ({IncludeResultCodes}) or '*' in ({IncludeResultCodes}) or iff('@' in ({IncludeResultCodes}), resultCode startswith '5', false) or iff('#' in ({IncludeResultCodes}), resultCode startswith '4', false)\n| extend Key = strcat(name, '-', resultCode)\n| summarize \n NewFailures = countif(success == false and Key !in (existingFailures) and IncludeAsFailure == true), \n ExistingFailures = countif(success == false and Key in (existingFailures) and IncludeAsFailure) \nby bin(timestamp, grain)\n| project timestamp, ['Existing Failures'] = ExistingFailures, ['New Failures'] = NewFailures\n",
+ "size": 0,
+ "showAnnotations": true,
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "visualization": "linechart"
+ },
+ "customWidth": "50",
+ "name": "query - 7"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let startTime = {OverTimeRange:start};\nlet grain = {OverTimeRange:grain};\nlet bigWindowTimeRange = {UseComparisonTimeRangeOf};\nlet bigWindow = requests\n| where timestamp >= ago(bigWindowTimeRange) and timestamp < bin(startTime, grain)\n| where success == false\n| where operation_Name in ({In}) or '*' in ({In})\n| where name in ({RequestFilters}) or '*' in ({RequestFilters})\n| where resultCode in ({IncludeResultCodes}) or '*' in ({IncludeResultCodes}) or iff('@' in ({IncludeResultCodes}), resultCode startswith '5', false) or iff('#' in ({IncludeResultCodes}), resultCode startswith '4', false)\n| summarize by name, resultCode\n| summarize makelist(strcat(name, '-', resultCode), 10000);\nrequests\n| where timestamp {OverTimeRange}\n| where operation_Name in ({In}) or '*' in ({In})\n| where name in ({RequestFilters}) or '*' in ({RequestFilters})\n| where resultCode in ({IncludeResultCodes}) or '*' in ({IncludeResultCodes}) or iff('@' in ({IncludeResultCodes}), resultCode startswith '5', false) or iff('#' in ({IncludeResultCodes}), resultCode startswith '4', false)\n| where success == false\n| summarize Count = count() by name, resultCode\n| extend IsNew = strcat(name, '-', resultCode) !in (bigWindow)\n| where \"{Show}\" == \"['New Failure Rate (%)'], ['Existing Failure Rate (%)']\" or IsNew == true\n| order by Count desc, name asc\n| project ['Request Name'] = iff(IsNew, strcat('πΈ ', name), strcat('πΉ ', name)), ['Result Code'] = resultCode\n",
+ "size": 0,
+ "aggregation": 2,
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "visualization": "table",
+ "gridSettings": {
+ "sortBy": [
+ {
+ "itemKey": "Result Code",
+ "sortOrder": 1
+ }
+ ]
+ },
+ "sortBy": [
+ {
+ "itemKey": "Result Code",
+ "sortOrder": 1
+ }
+ ]
+ },
+ "customWidth": "50",
+ "name": "query - 10"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "# Overall Response Times Trend ( In MilliSeconds)\n"
+ },
+ "name": "text - 0"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "response_time_filter",
+ "version": "KqlParameterItem/1.0",
+ "name": "OverTimeRange",
+ "type": 4,
+ "isRequired": true,
+ "value": {
+ "durationMs": 86400000
+ },
+ "typeSettings": {
+ "selectableValues": [
+ {
+ "durationMs": 86400000
+ },
+ {
+ "durationMs": 259200000
+ },
+ {
+ "durationMs": 604800000
+ },
+ {
+ "durationMs": 1209600000
+ },
+ {
+ "durationMs": 2419200000
+ },
+ {
+ "durationMs": 2592000000
+ }
+ ],
+ "allowCustom": true
+ }
+ },
+ {
+ "id": "comparison_time_filter",
+ "version": "KqlParameterItem/1.0",
+ "name": "UseComparisonTimeRangeOf",
+ "type": 1,
+ "isRequired": true,
+ "query": "let t = {OverTimeRange:seconds};\nlet w = case(t <= 86400, '7d', t <= 259200, '14d', t <= 1209600, '28d', '60d');\nrange i from 1 to 1 step 1\n| project x = w",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components"
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components"
+ },
+ "name": "parameters - response_time"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "// ---- get the two windows from the pills -----------------------\nlet nowWindowSeconds = {OverTimeRange:seconds}; // e.g. 86400\nlet compareWindowText = '{UseComparisonTimeRangeOf}'; // '7d' | '14d' | '28d' | '60d'\n\n// map the text to a timespan literal\nlet compareWindow =\n case(compareWindowText == '7d', 7d,\n compareWindowText == '14d', 14d,\n compareWindowText == '28d', 28d,\n compareWindowText == '60d', 60d,\n 7d); // fallback\n\nlet grain = {OverTimeRange:grain};\n// ----------------------------------------------------------------\n\n// baseline (older) window\nlet comparisonData =\nrequests\n| where timestamp >= ago(compareWindow)\n| summarize AvgRT_Baseline = avg(duration)\n by bin(timestamp, grain);\n\n// current (now) window\nlet currentData =\nrequests\n| where timestamp >= ago(nowWindowSeconds * 1s)\n| summarize AvgRT_Now = avg(duration)\n by bin(timestamp, grain);\n\n// stitch the two series together\ncomparisonData\n| join kind=fullouter (currentData) on timestamp\n| project timestamp, AvgRT_Baseline, AvgRT_Now\n",
+ "size": 0,
+ "aggregation": 3,
+ "exportParameterName": "Operation",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "visualization": "linechart",
+ "gridSettings": {
+ "formatters": [
+ {
+ "columnMatch": "Mean|Median|p80|p95|p99",
+ "formatter": 8,
+ "formatOptions": {
+ "min": 0,
+ "max": null,
+ "palette": "red"
+ }
+ },
+ {
+ "columnMatch": "Count",
+ "formatter": 8,
+ "formatOptions": {
+ "min": 0,
+ "max": null,
+ "palette": "blue"
+ }
+ },
+ {
+ "columnMatch": "Users",
+ "formatter": 8,
+ "formatOptions": {
+ "min": 0,
+ "max": null,
+ "palette": "blueDark"
+ }
+ }
+ ]
+ },
+ "graphSettings": {
+ "type": 0
+ },
+ "chartSettings": {
+ "showDataPoints": true
+ }
+ },
+ "name": "query - 2"
+ }
+ ],
+ "fallbackResourceIds": [
+ "/subscriptions/{YOUR-SUBSCRIPTIONID}/resourcegroups/{YOUR-RESOURCEGROUPNAME}/providers/microsoft.insights/components/{YOUR-RESOURCENAME}"
+ ],
+ "fromTemplateId": "community-Workbooks/Failures/New Failures Analysis",
+ "$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json"
+}
\ No newline at end of file
diff --git a/Workbooks/Performance/Detailed-Performance-Failure-Analysis/gallery.json b/Workbooks/Performance/Detailed-Performance-Failure-Analysis/gallery.json
new file mode 100644
index 0000000000..0d607d0d58
--- /dev/null
+++ b/Workbooks/Performance/Detailed-Performance-Failure-Analysis/gallery.json
@@ -0,0 +1,20 @@
+{
+ "$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/gallery.json",
+ "galleryItems": [
+ {
+ "name": "Detailed Performance & Failure Analysis",
+ "version": "1.0",
+ "description": "A deep-dive engineering workbook for analyzing failures, exceptions, dependencies, and latency insights.",
+ "templatePath": "workbook.json",
+ "author": "Kranthi Kumar Kharidu",
+ "tags": [
+ "Performance",
+ "Failures",
+ "Dependencies",
+ "Latency",
+ "Application Insights",
+ "Azure Monitor"
+ ]
+ }
+ ]
+}
diff --git a/Workbooks/Performance/Detailed-Performance-Failure-Analysis/metadata.json b/Workbooks/Performance/Detailed-Performance-Failure-Analysis/metadata.json
new file mode 100644
index 0000000000..ca13f9fcd6
--- /dev/null
+++ b/Workbooks/Performance/Detailed-Performance-Failure-Analysis/metadata.json
@@ -0,0 +1,7 @@
+{
+ "name": "Detailed Performance & Failure Analysis",
+ "description": "Engineering-level performance insights with failures, exceptions, dependencies, and latency insights.",
+ "author": "Kranthi Kumar Kharidu",
+ "type": "Workbooks",
+ "category": "Performance"
+}
diff --git a/Workbooks/Performance/Detailed-Performance-Failure-Analysis/workbook.json b/Workbooks/Performance/Detailed-Performance-Failure-Analysis/workbook.json
new file mode 100644
index 0000000000..cd4ffadf5b
--- /dev/null
+++ b/Workbooks/Performance/Detailed-Performance-Failure-Analysis/workbook.json
@@ -0,0 +1,1124 @@
+{
+ "version": "Notebook/1.0",
+ "items": [
+ {
+ "type": 1,
+ "content": {
+ "json": "{YOUR-APPNAME}_Detailed_Performance_and_Failure_Analysis_Dashboard
"
+ },
+ "name": "text - 0"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "84caf619-7585-48e0-a9c3-85c364aaa13b",
+ "version": "KqlParameterItem/1.0",
+ "name": "Show",
+ "type": 2,
+ "description": null,
+ "isRequired": true,
+ "query": "datatable(x:string, y:string)[\r\n\"['New Failure Rate (%)'], ['Existing Failure Rate (%)']\", 'New and Existing Failures',\r\n\"['New Failure Rate (%)']\", 'Only New Failures',\r\n\"['Existing Failure Rate (%)']\", 'Only Existing Failures',\r\n]",
+ "value": "['New Failure Rate (%)'], ['Existing Failure Rate (%)']",
+ "resourceType": "microsoft.insights/components"
+ },
+ {
+ "id": "6ab5c1cb-bad0-4d96-8e63-d439d0681c6e",
+ "version": "KqlParameterItem/1.0",
+ "name": "In",
+ "type": 2,
+ "description": null,
+ "isRequired": true,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "requests\n| where timestamp >= ago(1d)\n| summarize Count = count() by operation_Name\n| order by Count desc\n| project v = operation_Name, t = operation_Name, s = false\n| union (datatable(v:string, t:string, s:boolean)[\n'*', 'All Operations', true\n])",
+ "resourceType": "microsoft.insights/components"
+ },
+ {
+ "id": "eac9cbf1-6364-4f28-9c61-a9b038c035d7",
+ "version": "KqlParameterItem/1.0",
+ "name": "OverTimeRange",
+ "type": 4,
+ "isRequired": true,
+ "value": {
+ "durationMs": 86400000
+ },
+ "typeSettings": {
+ "selectableValues": [
+ {
+ "durationMs": 1800000
+ },
+ {
+ "durationMs": 3600000
+ },
+ {
+ "durationMs": 14400000
+ },
+ {
+ "durationMs": 43200000
+ },
+ {
+ "durationMs": 86400000
+ },
+ {
+ "durationMs": 259200000
+ },
+ {
+ "durationMs": 604800000
+ },
+ {
+ "durationMs": 1209600000
+ },
+ {
+ "durationMs": 2419200000
+ },
+ {
+ "durationMs": 2592000000
+ }
+ ],
+ "allowCustom": true
+ }
+ },
+ {
+ "id": "6f0de137-0136-48f0-b463-640de7109c05",
+ "version": "KqlParameterItem/1.0",
+ "name": "UseComparisonTimeRangeOf",
+ "type": 1,
+ "isRequired": true,
+ "query": "let t = {OverTimeRange:seconds};\r\nlet w = case(t <= 86400, '7d', t <= 259200, '14d', t <= 120960, '28d', '60d');\r\nrange i from 1 to 1 step 1\r\n| project x = w",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "value": "31d"
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components"
+ },
+ "name": "parameters - 1"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "\n# Application Traffic\nThis section provides an overview of {YOUR-APPNAME} traffic, illustrating request trends over time. The trend graph helps identify potential issues such as load balancing inefficiencies, misconfigurations, or traffic anomalies."
+ },
+ "name": "text - 2 - Copy"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "71aee4cf-fdef-4496-b096-094f1cfdaa4a",
+ "version": "KqlParameterItem/1.0",
+ "name": "RequestFilters",
+ "type": 2,
+ "isRequired": true,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "requests\r\n| where timestamp {OverTimeRange}\r\n| where operation_Name in ({In}) or '*' in ({In})\r\n| summarize Count = count(), Users = dcount(user_Id) by name\r\n| project v = name, t = name, s=false\r\n| union (datatable(v:string, t:string, s:boolean)[\r\n'*', 'All Requests', true\r\n])",
+ "typeSettings": {
+ "additionalResourceOptions": []
+ },
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components"
+ },
+ {
+ "id": "96c259d4-dc37-40c9-b0b1-26ac8499743a",
+ "version": "KqlParameterItem/1.0",
+ "name": "IncludeResultCodes",
+ "type": 2,
+ "isRequired": true,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "datatable(x:string, y:string, z:boolean)[\r\n'@', 'All 500s', false,\r\n'#', 'All 400s', false\r\n]\r\n| union (requests\r\n| where timestamp {OverTimeRange}\r\n| where success == false\r\n| summarize by resultCode\r\n| order by resultCode asc\r\n| project x = resultCode, y = resultCode, z = false)",
+ "typeSettings": {
+ "additionalResourceOptions": [
+ "value::all"
+ ],
+ "selectAllValue": "*",
+ "showDefault": false
+ },
+ "defaultValue": "value::all",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "value": [
+ "value::all"
+ ]
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components"
+ },
+ "name": "parameters - 3 - Copy"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let startTime = {OverTimeRange:start};\nlet grain = {OverTimeRange:grain};\nrequests\n| where timestamp >= bin(startTime, grain)\n| where operation_Name in ({In}) or '*' in ({In})\n| where name in ({RequestFilters}) or '*' in ({RequestFilters})\n| summarize TotalTraffic = count() by bin(timestamp, grain)\n| project timestamp, TotalTraffic\n",
+ "size": 1,
+ "showAnnotations": true,
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "visualization": "barchart"
+ },
+ "name": "query - 7 - Copy"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "\n# Application Failures Analysis\n"
+ },
+ "name": "text - 2"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "7a6716e6-3b5d-426b-a091-76e25325563a",
+ "version": "KqlParameterItem/1.0",
+ "name": "RequestFilters",
+ "type": 2,
+ "isRequired": true,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "requests\r\n| where timestamp {OverTimeRange}\r\n| where operation_Name in ({In}) or '*' in ({In})\r\n| summarize Count = count(), Users = dcount(user_Id) by name\r\n| project v = name, t = name, s=false\r\n| union (datatable(v:string, t:string, s:boolean)[\r\n'*', 'All Requests', true\r\n])",
+ "typeSettings": {
+ "additionalResourceOptions": []
+ },
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "value": [
+ "*"
+ ]
+ },
+ {
+ "id": "fa3ae272-8e65-4b87-a5a6-ef256a8a1956",
+ "version": "KqlParameterItem/1.0",
+ "name": "IncludeResultCodes",
+ "type": 2,
+ "isRequired": true,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "datatable(x:string, y:string, z:boolean)[\r\n'@', 'All 500s', false,\r\n'#', 'All 400s', false\r\n]\r\n| union (requests\r\n| where timestamp {OverTimeRange}\r\n| where success == false\r\n| summarize by resultCode\r\n| order by resultCode asc\r\n| project x = resultCode, y = resultCode, z = false)",
+ "typeSettings": {
+ "additionalResourceOptions": [
+ "value::all"
+ ],
+ "selectAllValue": "*",
+ "showDefault": false
+ },
+ "defaultValue": "value::all",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "value": [
+ "value::all"
+ ]
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components"
+ },
+ "name": "parameters - 3"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "## Failed Requests Volume\nThis chart tracks failed requests over time, categorized as:\n1οΈβ£ Existing Failures β Ongoing issues.\n2οΈβ£ New Failures β Recently detected issues.\n\nSpikes may indicate service degradation or misconfigurations, requiring investigation.\n"
+ },
+ "customWidth": "50",
+ "name": "text - 6"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "## Request Details\r\nThis table shows failed API requests, including:\r\n- Request Name β Affected endpoint.\r\n- Result Code β HTTP failure reason (422, 404, etc.).\r\n- Failures Count β Number of occurrences.\r\n Use this to identify trends, troubleshoot issues, and prioritize fixes. \r\n\r\nπΈ New Failure πΉ Existing Failure"
+ },
+ "customWidth": "50",
+ "name": "text - 21"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let startTime = {OverTimeRange:start};\nlet grain = {OverTimeRange:grain};\nlet bigWindowTimeRange = {UseComparisonTimeRangeOf};\n\nlet existingFailures = requests\n| where timestamp >= ago(bigWindowTimeRange) and timestamp < bin(startTime, grain)\n| where operation_Name in ({In}) or '*' in ({In})\n| where name in ({RequestFilters}) or '*' in ({RequestFilters})\n| extend Key = strcat(name, '-', resultCode)\n| summarize makeset(Key, 10000);\n\nrequests\n| where timestamp >= bin(startTime, grain)\n| where operation_Name in ({In}) or '*' in ({In})\n| where name in ({RequestFilters}) or '*' in ({RequestFilters})\n| extend IncludeAsFailure = resultCode in ({IncludeResultCodes}) or '*' in ({IncludeResultCodes}) or iff('@' in ({IncludeResultCodes}), resultCode startswith '5', false) or iff('#' in ({IncludeResultCodes}), resultCode startswith '4', false)\n| extend Key = strcat(name, '-', resultCode)\n| summarize \n NewFailures = countif(success == false and Key !in (existingFailures) and IncludeAsFailure == true), \n ExistingFailures = countif(success == false and Key in (existingFailures) and IncludeAsFailure) \nby bin(timestamp, grain)\n| project timestamp, ['Existing Failures'] = ExistingFailures, ['New Failures'] = NewFailures\n",
+ "size": 0,
+ "showAnnotations": true,
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "visualization": "linechart"
+ },
+ "customWidth": "50",
+ "name": "query - 7"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let startTime = {OverTimeRange:start};\nlet grain = {OverTimeRange:grain};\nlet bigWindowTimeRange = {UseComparisonTimeRangeOf};\nlet bigWindow = requests\n| where timestamp >= ago(bigWindowTimeRange) and timestamp < bin(startTime, grain)\n| where success == false\n| where operation_Name in ({In}) or '*' in ({In})\n| where name in ({RequestFilters}) or '*' in ({RequestFilters})\n| where resultCode in ({IncludeResultCodes}) or '*' in ({IncludeResultCodes}) or iff('@' in ({IncludeResultCodes}), resultCode startswith '5', false) or iff('#' in ({IncludeResultCodes}), resultCode startswith '4', false)\n| summarize by name, resultCode\n| summarize makelist(strcat(name, '-', resultCode), 10000);\nrequests\n| where timestamp {OverTimeRange}\n| where operation_Name in ({In}) or '*' in ({In})\n| where name in ({RequestFilters}) or '*' in ({RequestFilters})\n| where resultCode in ({IncludeResultCodes}) or '*' in ({IncludeResultCodes}) or iff('@' in ({IncludeResultCodes}), resultCode startswith '5', false) or iff('#' in ({IncludeResultCodes}), resultCode startswith '4', false)\n| where success == false\n| summarize Count = count() by name, resultCode\n| extend IsNew = strcat(name, '-', resultCode) !in (bigWindow)\n| where \"{Show}\" == \"['New Failure Rate (%)'], ['Existing Failure Rate (%)']\" or IsNew == true\n| order by Count desc, name asc\n| project ['Request Name'] = iff(IsNew, strcat('πΈ ', name), strcat('πΉ ', name)), ['Result Code'] = resultCode, ['Request Failures'] = Count\n",
+ "size": 0,
+ "aggregation": 2,
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "visualization": "table",
+ "gridSettings": {
+ "formatters": [
+ {
+ "columnMatch": "Request Failures",
+ "formatter": 4,
+ "formatOptions": {
+ "min": 0,
+ "max": null,
+ "palette": "yellow"
+ }
+ },
+ {
+ "columnMatch": "Users Affected",
+ "formatter": 4,
+ "formatOptions": {
+ "min": 0,
+ "max": null,
+ "palette": "green"
+ }
+ }
+ ],
+ "sortBy": [
+ {
+ "itemKey": "$gen_bar_Request Failures_2",
+ "sortOrder": 2
+ }
+ ]
+ },
+ "sortBy": [
+ {
+ "itemKey": "$gen_bar_Request Failures_2",
+ "sortOrder": 2
+ }
+ ]
+ },
+ "customWidth": "50",
+ "name": "query - 10"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "481f99f9-eec9-453b-a342-064a91cc4ed6",
+ "version": "KqlParameterItem/1.0",
+ "name": "ProblemFilter",
+ "type": 2,
+ "isRequired": true,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "exceptions\r\n| where timestamp {OverTimeRange}\r\n| where operation_Name in ({In}) or '*' in ({In})\r\n| summarize Count = count() by problemId\r\n| order by Count desc\r\n| project v = problemId, t = problemId, s=false\r\n| union (datatable(v:string, t:string, s:boolean)[\r\n'*', 'All Exceptions', true\r\n])",
+ "typeSettings": {
+ "additionalResourceOptions": []
+ },
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "value": [
+ "*"
+ ]
+ },
+ {
+ "id": "8b14a6a5-f37a-46f9-8438-cef1349478b2",
+ "version": "KqlParameterItem/1.0",
+ "name": "Source",
+ "type": 2,
+ "isRequired": true,
+ "query": "datatable(x:string, y:string)[\r\n'1 == 1', 'Server and Client Exceptions',\r\n'client_Type <> \"Browser\"', 'Only Server Exceptions',\r\n'client_Type == \"Browser\"', 'Only Client Exceptions',\r\n]",
+ "value": "client_Type <> \"Browser\"",
+ "typeSettings": {
+ "additionalResourceOptions": []
+ },
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components"
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components"
+ },
+ "name": "parameters - 12"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "## Exception Trends\r\nThis chart visualizes the frequency of new and existing exceptions over time, helping identify spikes and recurring issues that may impact system stability."
+ },
+ "customWidth": "50",
+ "name": "text - 13"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "## Exception Details\r\nThis table provides a detailed breakdown of exception types and their occurrence count, allowing for quick diagnosis and prioritization of critical errors.\r\n\r\nπΈ New Exception πΉ Existing Exception"
+ },
+ "customWidth": "50",
+ "name": "text - 24"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let startTime = {OverTimeRange:start};\nlet grain = {OverTimeRange:grain};\nlet bigWindowTimeRange = {UseComparisonTimeRangeOf};\nlet bigWindow = exceptions\n| where timestamp >= ago(bigWindowTimeRange) and timestamp < bin(startTime, grain)\n| where operation_Name in ({In}) or '*' in ({In})\n| where {Source}\n| where problemId in ({ProblemFilter}) or '*' in ({ProblemFilter})\n| summarize makeset(problemId, 10000);\nexceptions\n| where timestamp {OverTimeRange}\n| where operation_Name in ({In}) or '*' in ({In})\n| where {Source}\n| summarize Count = count() by bin(timestamp, grain), problemId\n| where problemId in ({ProblemFilter}) or '*' in ({ProblemFilter})\n| extend IsNew = problemId !in (bigWindow)\n| where \"{Show}\" == \"['New Failure Rate (%)'], ['Existing Failure Rate (%)']\" or IsNew\n| project timestamp, problemId, Count\n",
+ "size": 0,
+ "aggregation": 2,
+ "showAnnotations": true,
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "visualization": "barchart"
+ },
+ "customWidth": "50",
+ "name": "query - 14"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let startTime = {OverTimeRange:start};\nlet grain = {OverTimeRange:grain};\nlet bigWindowTimeRange = {UseComparisonTimeRangeOf};\nlet bigWindow = exceptions\n| where timestamp >= ago(bigWindowTimeRange) and timestamp < bin(startTime, grain)\n| where operation_Name in ({In}) or '*' in ({In})\n| where {Source}\n| where problemId in ({ProblemFilter}) or '*' in ({ProblemFilter})\n| summarize makeset(problemId, 10000);\nexceptions\n| where timestamp {OverTimeRange}\n| where operation_Name in ({In}) or '*' in ({In})\n| where {Source}\n| summarize Count = count() by problemId\n| where problemId in ({ProblemFilter}) or '*' in ({ProblemFilter})\n| extend IsNew = iff(problemId !in (bigWindow), true, false)\n| where \"{Show}\" == \"['New Failure Rate (%)'], ['Existing Failure Rate (%)']\" or IsNew\n| order by Count desc, problemId asc\n| project Problem = iff(IsNew, strcat('πΈ ', problemId), strcat('πΉ ', problemId)), ['Exception Count'] = Count\n",
+ "size": 0,
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "gridSettings": {
+ "formatters": [
+ {
+ "columnMatch": "Exception Count",
+ "formatter": 4,
+ "formatOptions": {
+ "min": 0,
+ "max": null,
+ "palette": "yellow"
+ }
+ },
+ {
+ "columnMatch": "Users Affected",
+ "formatter": 4,
+ "formatOptions": {
+ "min": 0,
+ "max": null,
+ "palette": "green"
+ }
+ }
+ ],
+ "sortBy": [
+ {
+ "itemKey": "$gen_bar_Exception Count_1",
+ "sortOrder": 2
+ }
+ ]
+ },
+ "sortBy": [
+ {
+ "itemKey": "$gen_bar_Exception Count_1",
+ "sortOrder": 2
+ }
+ ]
+ },
+ "customWidth": "50",
+ "name": "query - 17"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "42490f33-2004-4535-8e9f-69ede57f2542",
+ "version": "KqlParameterItem/1.0",
+ "name": "DependencyFilters",
+ "type": 2,
+ "isRequired": true,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "dependencies\r\n| where timestamp {OverTimeRange}\r\n| where operation_Name in ({In}) or '*' in ({In})\r\n| summarize Count = count() by name\r\n| order by Count desc\r\n| project v = name, t = name, s=false\r\n| union (datatable(v:string, t:string, s:boolean)[\r\n'*', 'All Dependencies', true\r\n])",
+ "typeSettings": {
+ "additionalResourceOptions": []
+ },
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "value": [
+ "*"
+ ]
+ },
+ {
+ "id": "ac2d6138-9403-41fc-a29c-99857071abc9",
+ "version": "KqlParameterItem/1.0",
+ "name": "IncludeResultCodes",
+ "type": 2,
+ "isRequired": true,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "datatable(x:string, y:string, z:boolean)[\r\n'*', 'All', true,\r\n'@', 'All 500s', false,\r\n'#', 'All 400s', false\r\n]\r\n| union (dependencies\r\n| where timestamp {OverTimeRange}\r\n| where success == false\r\n| summarize by resultCode\r\n| order by resultCode asc\r\n| project x = resultCode, y = resultCode, z = false)",
+ "typeSettings": {
+ "additionalResourceOptions": []
+ },
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "value": [
+ "*"
+ ]
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components"
+ },
+ "name": "parameters - 19"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "## Dependency Volume\nThis chart tracks the volume of successful and failed dependency calls, categorizing them as Existing Failures and New Failures, helping identify potential backend or service integration issues."
+ },
+ "customWidth": "50",
+ "name": "text - 22"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "## Dependency Details\nThis table provides insights into failed dependency calls, displaying the dependency name, result code, and operation, enabling quick diagnosis and troubleshooting of impacted services."
+ },
+ "customWidth": "50",
+ "name": "text - 22 - Copy"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let startTime = {OverTimeRange:start};\nlet grain = {OverTimeRange:grain};\nlet bigWindowTimeRange = {UseComparisonTimeRangeOf};\nlet existingFailures = dependencies\n| where timestamp >= ago(bigWindowTimeRange) and timestamp < bin(startTime, grain)\n| where operation_Name in ({In}) or '*' in ({In})\n| where name in ({RequestFilters}) or '*' in ({RequestFilters})\n| extend Key = strcat(name, '-', resultCode)\n| summarize makeset(Key, 10000);\ndependencies\n| where timestamp >= bin(startTime, grain)\n| where operation_Name in ({In}) or '*' in ({In})\n| where name in ({RequestFilters}) or '*' in ({RequestFilters})\n| extend IncludeAsFailure = resultCode in ({IncludeResultCodes}) or '*' in ({IncludeResultCodes}) or iff('@' in ({IncludeResultCodes}), resultCode startswith '5', false) or iff('#' in ({IncludeResultCodes}), resultCode startswith '4', false)\n| summarize NewFailures = countif(success == false and strcat(name, '-', resultCode) !in (existingFailures) and IncludeAsFailure == true), ExistingFailures = countif(success == false and strcat(name, '-', resultCode) in (existingFailures) and IncludeAsFailure == true), All = count() by bin(timestamp, grain)\n| project timestamp, ['Passing'] = All - NewFailures - ExistingFailures, ['Existing Failures'] = ExistingFailures, ['New Failures'] = NewFailures",
+ "size": 0,
+ "aggregation": 2,
+ "showAnnotations": true,
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "visualization": "barchart"
+ },
+ "customWidth": "50",
+ "name": "query - 23"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let startTime = {OverTimeRange:start};\r\nlet grain = {OverTimeRange:grain};\r\nlet bigWindowTimeRange = {UseComparisonTimeRangeOf};\r\nlet bigWindow = dependencies\r\n| where timestamp >= ago(bigWindowTimeRange) and timestamp < bin(startTime, grain)\r\n| where operation_Name in ({In}) or '*' in ({In})\r\n| where name in ({DependencyFilters}) or '*' in ({DependencyFilters})\r\n| where resultCode in ({IncludeResultCodes}) or '*' in ({IncludeResultCodes}) or iff('@' in ({IncludeResultCodes}), resultCode startswith '5', false) or iff('#' in ({IncludeResultCodes}), resultCode startswith '4', false)\r\n| where success == false\r\n| summarize by name, resultCode\r\n| summarize makelist(strcat(name, '-', resultCode));\r\ndependencies\r\n| where timestamp {OverTimeRange}\r\n| where operation_Name in ({In}) or '*' in ({In})\r\n| where name in ({DependencyFilters}) or '*' in ({DependencyFilters})\r\n| where resultCode in ({IncludeResultCodes}) or '*' in ({IncludeResultCodes}) or iff('@' in ({IncludeResultCodes}), resultCode startswith '5', false) or iff('#' in ({IncludeResultCodes}), resultCode startswith '4', false)\r\n| where success == false\r\n| summarize Count = count(), Users = dcount(user_Id) by name, resultCode, operation_Name\r\n| extend IsNew = iff(strcat(name, '-', resultCode) !in (bigWindow), true, false)\r\n| where \"{Show}\" == \"['New Failure Rate (%)'], ['Existing Failure Rate (%)']\" or IsNew == true\r\n| order by Users desc, Count desc, name asc\r\n| project ['Dependency Name'] = iff(IsNew == true, strcat('πΈ ', name), strcat('πΉ ', name)), ['Result Code'] = resultCode, Operation = operation_Name, ['Dependency Failures'] = Count",
+ "size": 0,
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "gridSettings": {
+ "formatters": [
+ {
+ "columnMatch": "Dependency Failures",
+ "formatter": 4,
+ "formatOptions": {
+ "min": 0,
+ "max": null,
+ "palette": "yellow"
+ }
+ },
+ {
+ "columnMatch": "Users Affected",
+ "formatter": 4,
+ "formatOptions": {
+ "min": 0,
+ "max": null,
+ "palette": "green"
+ }
+ }
+ ]
+ }
+ },
+ "customWidth": "50",
+ "name": "query - 25"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "# Application Performance Insights\nUse this report to identify the slowest operations in your applications. This information can be used to diagnose potential problems or help focus your ongoing development to improve the overall performance of the application.\n\nπ **Metric Definitions for \"Response Times/Duration\":**\n β‘ Median (50%) β Middle value (half requests are faster, half are slower).\n β‘ P95 (95%) β 95% of requests complete faster than this.\n β‘ Mean (Avg) β Total response time / request count."
+ },
+ "name": "text - 0"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "response_time_filter",
+ "version": "KqlParameterItem/1.0",
+ "name": "OverTimeRange",
+ "type": 4,
+ "isRequired": true,
+ "value": {
+ "durationMs": 604800000
+ },
+ "typeSettings": {
+ "selectableValues": [
+ {
+ "durationMs": 1800000
+ },
+ {
+ "durationMs": 3600000
+ },
+ {
+ "durationMs": 14400000
+ },
+ {
+ "durationMs": 43200000
+ },
+ {
+ "durationMs": 86400000
+ },
+ {
+ "durationMs": 259200000
+ },
+ {
+ "durationMs": 604800000
+ },
+ {
+ "durationMs": 1209600000
+ },
+ {
+ "durationMs": 2419200000
+ },
+ {
+ "durationMs": 2592000000
+ }
+ ],
+ "allowCustom": true
+ }
+ },
+ {
+ "id": "comparison_time_filter",
+ "version": "KqlParameterItem/1.0",
+ "name": "UseComparisonTimeRangeOf",
+ "type": 1,
+ "isRequired": true,
+ "query": "let t = {OverTimeRange:seconds};\nlet w = case(t <= 86400, '7d', t <= 259200, '14d', t <= 1209600, '28d', '60d');\nrange i from 1 to 1 step 1\n| project x = w",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "value": "31d"
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components"
+ },
+ "name": "parameters - response_time"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let selectedTimeRange = {OverTimeRange:seconds}; // Get the selected time range in seconds\nlet comparisonTimeRange = case(\n selectedTimeRange <= 86400, 604800, // If <= 1 day, use 7 days (in seconds)\n selectedTimeRange <= 259200, 1209600, // If <= 3 days, use 14 days\n selectedTimeRange <= 1209600, 2419200, // If <= 14 days, use 28 days\n 5184000); // Otherwise, use 60 days\nlet grain = {OverTimeRange:grain}; // Keep the selected granularity\n\nlet comparisonData = requests\n| where timestamp >= ago(comparisonTimeRange * 1s) // Convert seconds to timespan correctly\n| summarize AvgResponseTime_Comparison = avg(duration) by bin(timestamp, grain);\n\nlet currentData = requests\n| where timestamp >= ago(selectedTimeRange * 1s) // Convert seconds to timespan correctly\n| summarize AvgResponseTime_Current = avg(duration) by bin(timestamp, grain);\n\ncomparisonData\n| join kind=fullouter (currentData) on timestamp\n| project timestamp, AvgResponseTime_Current, AvgResponseTime_Comparison\n",
+ "size": 0,
+ "aggregation": 3,
+ "title": "Overall Response Times Trend",
+ "exportParameterName": "Operation",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "visualization": "linechart",
+ "gridSettings": {
+ "formatters": [
+ {
+ "columnMatch": "Mean|Median|p80|p95|p99",
+ "formatter": 8,
+ "formatOptions": {
+ "min": 0,
+ "max": null,
+ "palette": "red"
+ }
+ },
+ {
+ "columnMatch": "Count",
+ "formatter": 8,
+ "formatOptions": {
+ "min": 0,
+ "max": null,
+ "palette": "blue"
+ }
+ },
+ {
+ "columnMatch": "Users",
+ "formatter": 8,
+ "formatOptions": {
+ "min": 0,
+ "max": null,
+ "palette": "blueDark"
+ }
+ }
+ ]
+ },
+ "graphSettings": {
+ "type": 0
+ },
+ "chartSettings": {
+ "showDataPoints": true
+ }
+ },
+ "name": "query - 2"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "fb9d1c28-9c3b-446b-83f1-a28315f0712c",
+ "version": "KqlParameterItem/1.0",
+ "name": "Apps",
+ "type": 5,
+ "isRequired": true,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "typeSettings": {
+ "resourceTypeFilter": {
+ "microsoft.insights/components": true
+ },
+ "additionalResourceOptions": [
+ "value::all"
+ ],
+ "showDefault": false
+ },
+ "value": [
+ "/subscriptions/{YOUR-SUBSCRIPTIONID}/resourceGroups/{YOUR-RESOURCEGROUPNAME}/providers/microsoft.insights/components/{YOUR-RESOURCENAME}"
+ ]
+ },
+ {
+ "id": "67e9c1be-a881-4037-8128-887afe4fda0f",
+ "version": "KqlParameterItem/1.0",
+ "name": "TimeRange",
+ "type": 4,
+ "typeSettings": {
+ "selectableValues": [
+ {
+ "durationMs": 300000,
+ "createdTime": "2018-08-06T23:52:38.870Z",
+ "isInitialTime": false,
+ "grain": 1,
+ "useDashboardTimeRange": false
+ },
+ {
+ "durationMs": 900000,
+ "createdTime": "2018-08-06T23:52:38.871Z",
+ "isInitialTime": false,
+ "grain": 1,
+ "useDashboardTimeRange": false
+ },
+ {
+ "durationMs": 1800000,
+ "createdTime": "2018-08-06T23:52:38.871Z",
+ "isInitialTime": false,
+ "grain": 1,
+ "useDashboardTimeRange": false
+ },
+ {
+ "durationMs": 3600000,
+ "createdTime": "2018-08-06T23:52:38.871Z",
+ "isInitialTime": false,
+ "grain": 1,
+ "useDashboardTimeRange": false
+ },
+ {
+ "durationMs": 14400000,
+ "createdTime": "2018-08-06T23:52:38.871Z",
+ "isInitialTime": false,
+ "grain": 1,
+ "useDashboardTimeRange": false
+ },
+ {
+ "durationMs": 43200000,
+ "createdTime": "2018-08-06T23:52:38.871Z",
+ "isInitialTime": false,
+ "grain": 1,
+ "useDashboardTimeRange": false
+ },
+ {
+ "durationMs": 86400000,
+ "createdTime": "2018-08-06T23:52:38.871Z",
+ "isInitialTime": false,
+ "grain": 1,
+ "useDashboardTimeRange": false
+ },
+ {
+ "durationMs": 172800000,
+ "createdTime": "2018-08-06T23:52:38.871Z",
+ "isInitialTime": false,
+ "grain": 1,
+ "useDashboardTimeRange": false
+ },
+ {
+ "durationMs": 259200000,
+ "createdTime": "2018-08-06T23:52:38.871Z",
+ "isInitialTime": false,
+ "grain": 1,
+ "useDashboardTimeRange": false
+ },
+ {
+ "durationMs": 604800000,
+ "createdTime": "2018-08-06T23:52:38.871Z",
+ "isInitialTime": false,
+ "grain": 1,
+ "useDashboardTimeRange": false
+ }
+ ],
+ "allowCustom": null
+ },
+ "value": {
+ "durationMs": 604800000
+ }
+ },
+ {
+ "id": "2800590b-b6d5-41f2-9ce1-317d183c7723",
+ "version": "KqlParameterItem/1.0",
+ "name": "Operation",
+ "type": 1,
+ "isHiddenWhenLocked": true,
+ "value": "{\"App\":\"\",\"Operation\":\"\"}"
+ },
+ {
+ "id": "e2d0dd11-afa3-412f-bad1-dd3129372053",
+ "version": "KqlParameterItem/1.0",
+ "name": "Columns",
+ "type": 2,
+ "isRequired": true,
+ "multiSelect": true,
+ "quote": "",
+ "delimiter": ",",
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "jsonData": "[\"Mean\", \"Median\", \"p95\", \"Count\"]",
+ "value": [
+ "Count",
+ "Median",
+ "p95"
+ ]
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components"
+ },
+ "name": "parameters - 1 - Copy"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let data = requests\n| where timestamp {TimeRange};\ndata\n| summarize Mean = avg(duration), (Median, p80, p95, p99) = percentiles(duration, 50, 80, 95, 99), Count = count(), Users = dcount(user_Id) by name, appName\n| project App = appName, Operation = name, Mean, Median, p80, p95, p99, Count, Users, rank = 2\n| union (data\n | summarize Mean = avg(duration), (Median, p80, p95, p99) = percentiles(duration, 50, 80, 95, 99), Count = count(), Users = dcount(user_Id)\n | project App = 'πΈ All Apps', Operation = 'πΈ All operations', Mean, Median, p80, p95, p99, Count, Users, rank = 1)\n| extend Relevance = Mean * Count\n| order by rank asc, Relevance desc\n| project-away Relevance, rank\n| extend Mean = round(Mean, 2), Median = round(Median, 1), p80 = round(p80, 2), p95 = round(p95, 2), p99 = round(p99, 2)\n| project App, Operation, {Columns}\n",
+ "size": 0,
+ "title": "Request Details",
+ "exportParameterName": "Operation",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "crossComponentResources": [
+ "{Apps}"
+ ],
+ "gridSettings": {
+ "formatters": [
+ {
+ "columnMatch": "Mean|Median|p80|p95|p99",
+ "formatter": 8,
+ "formatOptions": {
+ "min": 0,
+ "max": null,
+ "palette": "red"
+ }
+ },
+ {
+ "columnMatch": "Count",
+ "formatter": 8,
+ "formatOptions": {
+ "min": 0,
+ "max": null,
+ "palette": "blue"
+ }
+ },
+ {
+ "columnMatch": "Users",
+ "formatter": 8,
+ "formatOptions": {
+ "min": 0,
+ "max": null,
+ "palette": "blueDark"
+ }
+ }
+ ]
+ }
+ },
+ "name": "query - 2 - Copy"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "## * π―π―π―Click on the rows of the table above to see details for other operations π―π―π― *"
+ },
+ "name": "text - 0",
+ "styleSettings": {
+ "margin": "0",
+ "padding": "0"
+ }
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "b09bfb5a-093f-4099-a5fb-e0fca139cc3d",
+ "version": "KqlParameterItem/1.0",
+ "name": "SelectedOperation",
+ "type": 1,
+ "isRequired": true,
+ "query": "let row = dynamic({Operation});\r\nlet operation = tostring(row.Operation);\r\nlet app = tostring(row.App);\r\nrange i from 1 to 1 step 1\r\n| project Operation = iff((operation == '' and app == '') or (operation == 'πΈ All operations' and app == 'πΈ All Apps'), 'all operations', operation)",
+ "isHiddenWhenLocked": true,
+ "jsonData": "",
+ "resourceType": "microsoft.insights/components"
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components"
+ },
+ "name": "parameters - 5"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "## Operation Details -- {SelectedOperation}\n"
+ },
+ "name": "text - 6"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "### Operation Duration (ms)\n"
+ },
+ "customWidth": "50",
+ "name": "text - 7"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "### All Operations"
+ },
+ "customWidth": "50",
+ "name": "text - 8"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "1bbd1900-9445-4ac0-bb5d-f15dbe5f4485",
+ "version": "KqlParameterItem/1.0",
+ "name": "Show",
+ "type": 2,
+ "isRequired": true,
+ "query": "datatable(value:string, label:string)[\n\"avg(duration)\", \"Mean\",\n\"percentile(duration, 50)\", \"Median\",\n\"percentile(duration, 80)\", \"p80\",\n\"percentile(duration, 95)\", \"p95\",\n\"percentile(duration, 99)\", \"p99\"\n]",
+ "value": "percentile(duration, 95)",
+ "resourceType": "microsoft.insights/components"
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components"
+ },
+ "name": "parameters - 9"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let row = dynamic({Operation});\nlet operation = tostring(row.Operation);\nlet app = tostring(row.App);\nrequests\n| where timestamp {TimeRange}\n| where (name == operation and appName == app) or (operation == '' and app == '') or (operation == 'πΈ All operations' and app == 'πΈ All Apps')\n| make-series Duration = {Show} default = 0 on timestamp in range({TimeRange:start}, {TimeRange:end}, {TimeRange:grain})\n| mvexpand timestamp to typeof(datetime), Duration to typeof(long)\n",
+ "size": 1,
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "crossComponentResources": [
+ "{Apps}"
+ ],
+ "visualization": "areachart"
+ },
+ "customWidth": "50",
+ "name": "query - 10"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let row = dynamic({Operation});\nlet operation = tostring(row.Operation);\nlet app = tostring(row.App);\nrequests\n| where timestamp {TimeRange}\n| where (name == operation and appName == app) or (operation == '' and app == '') or (operation == 'πΈ All operations' and app == 'πΈ All Apps')\n| make-series Requests = count() default = 0 on timestamp in range({TimeRange:start}, {TimeRange:end}, {TimeRange:grain})\n| mvexpand timestamp to typeof(datetime), Requests to typeof(long)\n",
+ "size": 1,
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "crossComponentResources": [
+ "{Apps}"
+ ],
+ "visualization": "areachart"
+ },
+ "customWidth": "50",
+ "name": "query - 11"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "### Dependency Performance\n"
+ },
+ "name": "text - 12"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "Select an operation in the table above to see the performance of its dependencies. "
+ },
+ "conditionalVisibility": {
+ "parameterName": "SelectedOperation",
+ "comparison": "isEqualTo",
+ "value": "all operations"
+ },
+ "name": "text - 13"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "a5b7de6f-eb50-49c6-8aaa-556d84ca9e3f",
+ "version": "KqlParameterItem/1.0",
+ "name": "AnalysisSet",
+ "type": 2,
+ "isRequired": true,
+ "query": "datatable(value:string, label:string)[\r\n'{\"from\":93, \"to\":97}', \"p95\",\r\n'{\"from\":77, \"to\":83}', \"p80\",\r\n'{\"from\":45, \"to\":55}', \"p50\",\r\n]",
+ "value": "{\"from\":93, \"to\":97}",
+ "resourceType": "microsoft.insights/components"
+ },
+ {
+ "id": "be711374-a833-44a2-b9a4-5307ebc58253",
+ "version": "KqlParameterItem/1.0",
+ "name": "StartPercentile",
+ "type": 1,
+ "isRequired": true,
+ "query": "let analysisSet = dynamic({AnalysisSet});\r\nlet analysisStart = toreal(analysisSet.from);\r\nrange i from 1 to 1 step 1\r\n| project Start = analysisStart",
+ "resourceType": "microsoft.insights/components"
+ },
+ {
+ "id": "fbca7275-4f5a-407e-84c2-e350f385eb53",
+ "version": "KqlParameterItem/1.0",
+ "name": "EndPercentile",
+ "type": 1,
+ "isRequired": true,
+ "query": "let analysisSet = dynamic({AnalysisSet});\r\nlet analysisStart = toreal(analysisSet[\"to\"]);\r\nrange i from 1 to 1 step 1\r\n| project Start = analysisStart",
+ "resourceType": "microsoft.insights/components"
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components"
+ },
+ "conditionalVisibility": {
+ "parameterName": "SelectedOperation",
+ "comparison": "isNotEqualTo",
+ "value": "all operations"
+ },
+ "name": "parameters - 14"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "The charts below show performance of the dependencies of *{SelectedOperation}*. The data is filtered only to those operations whose durations fall between p{StartPercentile} and p{EndPercentile} of the entire distribution. Change parameters `AnalysisSet`, `StartPercentile` or `EndPercentile` to tweak the percentile window of analysis"
+ },
+ "conditionalVisibility": {
+ "parameterName": "SelectedOperation",
+ "comparison": "isNotEqualTo",
+ "value": "all operations"
+ },
+ "name": "text - 15"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let row = dynamic({Operation});\r\nlet operation = tostring(row.Operation);\r\nlet app = tostring(row.App);\r\nlet data = requests\r\n| where timestamp {TimeRange}\r\n| where (name == operation and appName == app);\r\nlet minDuration = toscalar(data\r\n| summarize Start = percentile(duration, {StartPercentile}));\r\nlet maxDuration = toscalar(data\r\n| summarize End = percentile(duration, {EndPercentile}));\r\nlet operations = data\r\n| where duration >= minDuration and duration <= maxDuration\r\n| summarize by operation_Id\r\n| take 100000; // Limit to 100K operations for perf\r\ndependencies\r\n| where timestamp {TimeRange}\r\n| where operation_Id in (operations)\r\n| summarize Duration = avg(duration) by name, bin(timestamp, {TimeRange:grain})",
+ "size": 0,
+ "title": "Dependency Performance Trend (ms)",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "visualization": "areachart"
+ },
+ "conditionalVisibility": {
+ "parameterName": "SelectedOperation",
+ "comparison": "isNotEqualTo",
+ "value": "all operations"
+ },
+ "customWidth": "55",
+ "name": "query - 16"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "let row = dynamic({Operation});\r\nlet operation = tostring(row.Operation);\r\nlet app = tostring(row.App);\r\nlet data = requests\r\n| where timestamp {TimeRange}\r\n| where (name == operation and appName == app);\r\nlet minDuration = toscalar(data\r\n| summarize Start = percentile(duration, {StartPercentile}));\r\nlet maxDuration = toscalar(data\r\n| summarize End = percentile(duration, {EndPercentile}));\r\nlet operations = data\r\n| where duration >= minDuration and duration <= maxDuration\r\n| summarize by operation_Id\r\n| take 100000; // Limit to 100K operations for perf\r\ndependencies\r\n| where timestamp {TimeRange}\r\n| where operation_Id in (operations)\r\n| summarize Duration = avg(duration), Item = any(itemId) by name\r\n| extend Duration = round(Duration, 2)\r\n| order by Duration desc\r\n| project-rename [\"Mean Duration (ms)\"] = Duration",
+ "size": 0,
+ "title": "Dependency Performance - Summary",
+ "queryType": 0,
+ "resourceType": "microsoft.insights/components",
+ "visualization": "table",
+ "gridSettings": {
+ "formatters": [
+ {
+ "columnMatch": "Mean Duration (ms)",
+ "formatter": 8,
+ "formatOptions": {
+ "min": 0,
+ "max": null,
+ "palette": "red"
+ }
+ },
+ {
+ "columnMatch": "Item",
+ "formatter": 7,
+ "formatOptions": {
+ "linkTarget": "DependencyDetails",
+ "linkLabel": "Sample"
+ }
+ }
+ ]
+ }
+ },
+ "conditionalVisibility": {
+ "parameterName": "SelectedOperation",
+ "comparison": "isNotEqualTo",
+ "value": "all operations"
+ },
+ "customWidth": "45",
+ "name": "query - 17"
+ }
+ ],
+ "fallbackResourceIds": [
+ "/subscriptions/{YOUR-SUBSCRIPTIONID}/resourcegroups/{YOUR-RESOURCEGROUPNAME}/providers/microsoft.insights/components/{YOUR-RESOURCENAME}"
+ ],
+ "fromTemplateId": "community-Workbooks/Failures/New Failures Analysis",
+ "$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json"
+}
\ No newline at end of file