From 5371a118f4324d52eae217eb2fb4311736e33343 Mon Sep 17 00:00:00 2001 From: tmalhotra2428 <108122940+tmalhotra2428@users.noreply.github.com> Date: Wed, 6 Mar 2024 11:20:55 +0530 Subject: [PATCH 01/10] Create ASR Job History.workbook --- Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook | 1 + 1 file changed, 1 insertion(+) create mode 100644 Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook diff --git a/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook b/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook @@ -0,0 +1 @@ + From 11a15c09b68b0b61d1f44fb490375d158d13aee0 Mon Sep 17 00:00:00 2001 From: tmalhotra2428 <108122940+tmalhotra2428@users.noreply.github.com> Date: Wed, 6 Mar 2024 11:23:02 +0530 Subject: [PATCH 02/10] Update ASR Job History.workbook --- .../ASR Job History/ASR Job History.workbook | 1252 +++++++++++++++++ 1 file changed, 1252 insertions(+) diff --git a/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook b/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook index 8b13789179..89045f6be9 100644 --- a/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook +++ b/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook @@ -1 +1,1253 @@ +{ + "version": "Notebook/1.0", + "items": [ + { + "type": 1, + "content": { + "json": "## Workspace details" + }, + "name": "Heading1" + }, + { + "type": 11, + "content": { + "version": "LinkItem/1.0", + "style": "paragraph", + "links": [ + { + "id": "bac30f99-eaf9-4c7f-8705-cc263b8e1e88", + "cellValue": "https://aka.ms/BCDRAuditReportTemplates", + "linkTarget": "Url", + "linkLabel": "follow these steps", + "preText": "As this report involves historical data, you will need to have reporting data stored in a Log Analytics workspace to view the report. If you have not set up a workspace yet,", + "postText": "to get started.", + "style": "link", + "workbookContext": { + "componentIdSource": "workbook", + "resourceIdsSource": "workbook", + "templateIdSource": "static", + "templateId": "Community-Workbooks/Azure Backup/Backup Audit Reporting Templates", + "typeSource": "workbook", + "gallerySource": "workbook", + "locationSource": "default" + } + } + ] + }, + "name": "Text1" + }, + { + "type": 1, + "content": { + "json": "*Note - This template is currently scoped to items that are protected using Azure Site Recovery*" + }, + "name": "text - 11" + }, + { + "type": 9, + "content": { + "version": "KqlParameterItem/1.0", + "parameters": [ + { + "id": "d1f42f81-eb8f-4653-a0ff-38564d7487b4", + "version": "KqlParameterItem/1.0", + "name": "Subscriptions", + "type": 6, + "description": "Subscriptions to filter the list of workspaces", + "isRequired": true, + "multiSelect": true, + "quote": "'", + "delimiter": ",", + "value": [ + "value::all" + ], + "typeSettings": { + "additionalResourceOptions": [ + "value::all" + ], + "includeAll": false, + "selectAllValue": "" + }, + "label": "Workspace Subscription" + }, + { + "id": "2373a24f-ad32-4909-a7f6-59b373dcde6c", + "version": "KqlParameterItem/1.0", + "name": "Workspaces", + "type": 5, + "description": "LA Workspaces configured in vault diagnostic settings", + "isRequired": true, + "multiSelect": true, + "quote": "'", + "delimiter": ",", + "query": "where type =~ 'microsoft.operationalinsights/workspaces' | project id", + "crossComponentResources": [ + "{Subscriptions}" + ], + "typeSettings": { + "additionalResourceOptions": [ + "value::all" + ], + "showDefault": false + }, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources", + "value": [], + "label": "Workspace" + }, + { + "id": "254167f1-3459-455a-9bc9-9df92ed8044b", + "version": "KqlParameterItem/1.0", + "name": "ReplicationScenario", + "label": "Replication Scenario", + "type": 2, + "description": "Filter for replication scenario", + "isRequired": true, + "typeSettings": { + "additionalResourceOptions": [] + }, + "jsonData": "[ \r\n{ \"value\": \"Azure\", \t\t\t\t\t\t\"label\": \"Azure\" },\r\n{ \"value\": \"Hybrid\", \t\t\t\"label\": \"Hybrid\" }\r\n]", + "value": "Azure" + } + ], + "style": "above", + "doNotRunWhenHidden": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces" + }, + "customWidth": "100", + "name": "Filters1" + }, + { + "type": 1, + "content": { + "json": "_____________________" + }, + "name": "Line1" + }, + { + "type": 1, + "content": { + "json": "## ASR job history" + }, + "conditionalVisibility": { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + "name": "Heading2" + }, + { + "type": 1, + "content": { + "json": "This report helps you view information on your successful and failed ASR jobs over a specified duration of time. Currently only jobs triggered on replicated items and recovery plans are shown in this report. [Learn more](https://go.microsoft.com/fwlink/?linkid=2211463&clcid=0x409)" + }, + "conditionalVisibility": { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + "name": "Text2" + }, + { + "type": 9, + "content": { + "version": "KqlParameterItem/1.0", + "crossComponentResources": [ + "/subscriptions/378e5be3-6163-4ae6-9b38-9f10c1429f24/resourceGroups/ingestion_e2e/providers/microsoft.operationalinsights/workspaces/canaryinestiontest" + ], + "parameters": [ + { + "id": "2965ad33-1401-47c9-8f4b-9b7126f87014", + "version": "KqlParameterItem/1.0", + "name": "TimeRangeAzure", + "label": "Time Range", + "type": 4, + "description": "Period of time for which reports should be viewed", + "isRequired": true, + "typeSettings": { + "selectableValues": [ + { + "durationMs": 259200000 + }, + { + "durationMs": 604800000 + }, + { + "durationMs": 1209600000 + }, + { + "durationMs": 2419200000 + }, + { + "durationMs": 2592000000 + }, + { + "durationMs": 5184000000 + }, + { + "durationMs": 7776000000 + } + ], + "allowCustom": true + }, + "value": { + "durationMs": 259200000 + } + }, + { + "id": "efede5fa-f577-4766-b9b6-6ba4e525f844", + "version": "KqlParameterItem/1.0", + "name": "DatasourceSubscription", + "label": "Datasource Subscription", + "type": 6, + "description": "Use to filter for datasources within a specific subscription", + "isRequired": true, + "multiSelect": true, + "quote": "", + "delimiter": ",", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where SourceResourceId contains \"microsoft.compute\"\r\n| distinct tostring(split(tostring(todynamic(SourceResourceId)),\"/\")[2])", + "crossComponentResources": [ + "{Workspaces}" + ], + "typeSettings": { + "additionalResourceOptions": [ + "value::all" + ], + "selectAllValue": "*", + "showDefault": false + }, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "value": [ + "value::all" + ] + }, + { + "id": "256c7e33-df90-4956-aaf3-699aeaad912f", + "version": "KqlParameterItem/1.0", + "name": "DatasourceResourceGroup", + "label": "Datasource Resource Group", + "type": 2, + "description": "Use to filter for datasources within a specific resource group", + "isRequired": true, + "multiSelect": true, + "quote": "", + "delimiter": ",", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where SourceResourceId contains \"microsoft.compute\"\r\n| distinct tostring(split(SourceResourceId,'/')[4])", + "crossComponentResources": [ + "{Workspaces}" + ], + "typeSettings": { + "additionalResourceOptions": [ + "value::all" + ], + "selectAllValue": "*", + "showDefault": false + }, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "value": [ + "value::all" + ] + }, + { + "id": "16ad110f-4ea3-44d6-826b-4ea3bbd68c93", + "version": "KqlParameterItem/1.0", + "name": "JobOperationAzure", + "label": "Job Operation", + "type": 2, + "description": "Use to filter for a particular operation type", + "isRequired": true, + "multiSelect": true, + "quote": "", + "delimiter": ",", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where SourceResourceId contains \"microsoft.compute\"\r\n| distinct Operation", + "crossComponentResources": [ + "/subscriptions/378e5be3-6163-4ae6-9b38-9f10c1429f24/resourceGroups/ingestion_e2e/providers/microsoft.operationalinsights/workspaces/canaryinestiontest" + ], + "typeSettings": { + "additionalResourceOptions": [ + "value::all" + ], + "selectAllValue": "*", + "showDefault": false + }, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "value": [ + "value::all" + ] + }, + { + "id": "6a6222bf-a28a-4c98-9d74-838e74497167", + "version": "KqlParameterItem/1.0", + "name": "JobStatusAzure", + "label": "Job Status", + "type": 2, + "description": "Use to filter for a particular job status", + "isRequired": true, + "multiSelect": true, + "quote": "", + "delimiter": ",", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where SourceResourceId contains \"microsoft.compute\"\r\n| distinct Status", + "crossComponentResources": [ + "/subscriptions/378e5be3-6163-4ae6-9b38-9f10c1429f24/resourceGroups/ingestion_e2e/providers/microsoft.operationalinsights/workspaces/canaryinestiontest" + ], + "typeSettings": { + "additionalResourceOptions": [ + "value::all" + ], + "selectAllValue": "*", + "showDefault": false + }, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "value": [ + "value::all" + ] + }, + { + "id": "849a6401-cbaf-44b9-a733-0819f8923791", + "version": "KqlParameterItem/1.0", + "name": "SearchItemAzure", + "label": "Search Item", + "type": 1, + "description": "Use to search for an item by name", + "value": "" + } + ], + "style": "above", + "doNotRunWhenHidden": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces" + }, + "conditionalVisibilities": [ + { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + { + "parameterName": "ReplicationScenario", + "comparison": "isEqualTo", + "value": "Azure" + } + ], + "customWidth": "100", + "name": "Filters2" + }, + { + "type": 9, + "content": { + "version": "KqlParameterItem/1.0", + "crossComponentResources": [ + "/subscriptions/378e5be3-6163-4ae6-9b38-9f10c1429f24/resourceGroups/ingestion_e2e/providers/microsoft.operationalinsights/workspaces/canaryinestiontest" + ], + "parameters": [ + { + "id": "2965ad33-1401-47c9-8f4b-9b7126f87014", + "version": "KqlParameterItem/1.0", + "name": "TimeRangeHybrid", + "label": "Time Range", + "type": 4, + "description": "Period of time for which reports should be viewed", + "isRequired": true, + "typeSettings": { + "selectableValues": [ + { + "durationMs": 259200000 + }, + { + "durationMs": 604800000 + }, + { + "durationMs": 1209600000 + }, + { + "durationMs": 2419200000 + }, + { + "durationMs": 2592000000 + }, + { + "durationMs": 5184000000 + }, + { + "durationMs": 7776000000 + } + ], + "allowCustom": true + }, + "value": { + "durationMs": 259200000 + } + }, + { + "id": "efede5fa-f577-4766-b9b6-6ba4e525f844", + "version": "KqlParameterItem/1.0", + "name": "VaultSubscription", + "label": "Vault Subscription", + "type": 6, + "description": "Use to filter for datasources within a specific subscription", + "isRequired": true, + "multiSelect": true, + "quote": "", + "delimiter": ",", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| distinct tostring(split(tostring(todynamic(ResourceId)),\"/\")[2])", + "crossComponentResources": [ + "{Workspaces}" + ], + "typeSettings": { + "additionalResourceOptions": [ + "value::all" + ], + "selectAllValue": "*", + "showDefault": false + }, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "value": [ + "value::all" + ] + }, + { + "id": "256c7e33-df90-4956-aaf3-699aeaad912f", + "version": "KqlParameterItem/1.0", + "name": "VaultResourceGroup", + "label": "Vault Resource Group", + "type": 2, + "description": "Use to filter for datasources within a specific resource group", + "isRequired": true, + "multiSelect": true, + "quote": "", + "delimiter": ",", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| distinct tostring(split(ResourceId,'/')[4])", + "crossComponentResources": [ + "{Workspaces}" + ], + "typeSettings": { + "additionalResourceOptions": [ + "value::all" + ], + "selectAllValue": "*", + "showDefault": false + }, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "value": [ + "value::all" + ] + }, + { + "id": "16ad110f-4ea3-44d6-826b-4ea3bbd68c93", + "version": "KqlParameterItem/1.0", + "name": "JobOperationHybrid", + "label": "Job Operation", + "type": 2, + "description": "Use to filter for a particular operation type", + "isRequired": true, + "multiSelect": true, + "quote": "", + "delimiter": ",", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| distinct Operation", + "crossComponentResources": [ + "/subscriptions/378e5be3-6163-4ae6-9b38-9f10c1429f24/resourceGroups/ingestion_e2e/providers/microsoft.operationalinsights/workspaces/canaryinestiontest" + ], + "typeSettings": { + "additionalResourceOptions": [ + "value::all" + ], + "selectAllValue": "*", + "showDefault": false + }, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "value": [ + "value::all" + ] + }, + { + "id": "6a6222bf-a28a-4c98-9d74-838e74497167", + "version": "KqlParameterItem/1.0", + "name": "JobStatusHybrid", + "label": "Job Status", + "type": 2, + "description": "Use to filter for a particular job status", + "isRequired": true, + "multiSelect": true, + "quote": "", + "delimiter": ",", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| distinct Status", + "crossComponentResources": [ + "/subscriptions/378e5be3-6163-4ae6-9b38-9f10c1429f24/resourceGroups/ingestion_e2e/providers/microsoft.operationalinsights/workspaces/canaryinestiontest" + ], + "typeSettings": { + "additionalResourceOptions": [ + "value::all" + ], + "selectAllValue": "*", + "showDefault": false + }, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "value": [ + "value::all" + ] + }, + { + "id": "849a6401-cbaf-44b9-a733-0819f8923791", + "version": "KqlParameterItem/1.0", + "name": "SearchItemHybrid", + "label": "Search Item", + "type": 1, + "description": "Use to search for an item by name", + "value": "" + } + ], + "style": "above", + "doNotRunWhenHidden": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces" + }, + "conditionalVisibilities": [ + { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + { + "parameterName": "ReplicationScenario", + "comparison": "isEqualTo", + "value": "Hybrid" + } + ], + "customWidth": "100", + "name": "Filters3" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList = \"*\"; \r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\"); \r\nlet DatasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusAzure}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationAzure}\"); \r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemAzure}'),'{SearchItemAzure}',ReplicatedItemFriendlyName)\r\n| mv-expand DatasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(DatasourceSubscriptionList)) or tostring(DatasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n| sort by ReplicatedItemId\r\n| summarize count() by Status", + "size": 3, + "showAnalytics": true, + "title": "Jobs by Status", + "noDataMessage": "No record found for the selected time and scope.", + "showRefreshButton": true, + "showExportToExcel": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "crossComponentResources": [ + "{Workspaces}" + ], + "visualization": "piechart", + "tileSettings": { + "showBorder": false, + "titleContent": { + "columnMatch": "UniqueId", + "formatter": 1 + }, + "leftContent": { + "columnMatch": "DurationInSecs", + "formatter": 12, + "formatOptions": { + "palette": "auto" + }, + "numberFormat": { + "unit": 17, + "options": { + "maximumSignificantDigits": 3, + "maximumFractionDigits": 2 + } + } + } + } + }, + "conditionalVisibilities": [ + { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + { + "parameterName": "ReplicationScenario", + "comparison": "isEqualTo", + "value": "Azure" + } + ], + "customWidth": "35", + "showPin": true, + "name": "Chart1", + "styleSettings": { + "showBorder": true + } + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultLocationList = \"*\"; \r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusHybrid}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationHybrid}\"); \r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemHybrid}'),'{SearchItemHybrid}',ReplicatedItemFriendlyName)\r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n| sort by ReplicatedItemId\r\n| summarize count() by Status", + "size": 3, + "showAnalytics": true, + "title": "Jobs by Status", + "noDataMessage": "No record found for the selected time and scope.", + "showRefreshButton": true, + "showExportToExcel": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "crossComponentResources": [ + "{Workspaces}" + ], + "visualization": "piechart", + "tileSettings": { + "showBorder": false, + "titleContent": { + "columnMatch": "UniqueId", + "formatter": 1 + }, + "leftContent": { + "columnMatch": "DurationInSecs", + "formatter": 12, + "formatOptions": { + "palette": "auto" + }, + "numberFormat": { + "unit": 17, + "options": { + "maximumSignificantDigits": 3, + "maximumFractionDigits": 2 + } + } + } + } + }, + "conditionalVisibilities": [ + { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + { + "parameterName": "ReplicationScenario", + "comparison": "isEqualTo", + "value": "Hybrid" + } + ], + "customWidth": "35", + "showPin": true, + "name": "Chart2", + "styleSettings": { + "showBorder": true + } + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList = \"*\"; \r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\"); \r\nlet DatasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusAzure}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationAzure}\"); \r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemAzure}'),'{SearchItemAzure}',ReplicatedItemFriendlyName)\r\n| mv-expand DatasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(DatasourceSubscriptionList)) or tostring(DatasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n| sort by ReplicatedItemId\r\n| summarize count() by Operation", + "size": 3, + "showAnalytics": true, + "title": "Jobs by Operation", + "showRefreshButton": true, + "showExportToExcel": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "crossComponentResources": [ + "{Workspaces}" + ], + "visualization": "piechart", + "chartSettings": { + "createOtherGroup": 5 + } + }, + "conditionalVisibilities": [ + { + "parameterName": "Workspace ", + "comparison": "isNotEqualTo", + "value": "not set" + }, + { + "parameterName": "ReplicationScenario", + "comparison": "isEqualTo", + "value": "Azure" + } + ], + "customWidth": "35", + "showPin": true, + "name": "Chart3", + "styleSettings": { + "showBorder": true + } + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultLocationList = \"*\"; \r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusHybrid}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationHybrid}\"); \r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemHybrid}'),'{SearchItemHybrid}',ReplicatedItemFriendlyName)\r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n| sort by ReplicatedItemId\r\n| summarize count() by Operation", + "size": 3, + "showAnalytics": true, + "title": "Jobs by Operation", + "showRefreshButton": true, + "showExportToExcel": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "crossComponentResources": [ + "{Workspaces}" + ], + "visualization": "piechart", + "chartSettings": { + "createOtherGroup": 5 + } + }, + "conditionalVisibilities": [ + { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo", + "value": "not set" + }, + { + "parameterName": "ReplicationScenario", + "comparison": "isEqualTo", + "value": "Hybrid" + } + ], + "customWidth": "35", + "showPin": true, + "name": "Chart4", + "styleSettings": { + "showBorder": true + } + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "{\"version\":\"1.0.0\",\"content\":\"[{\\\"Question\\\": \\\"How can I add more columns to the grid?\\\",\\\"Answer\\\":\\\"Community-Workbooks/Azure Backup/FAQ/Customize LA Queries\\\"},\\r\\n{\\\"Question\\\": \\\"I want to re-use some of these views and create a custom report. How can I achieve that?\\\",\\\"Answer\\\":\\\"Community-Workbooks/Azure Backup/FAQ/Reuse a View\\\"},\\r\\n{\\\"Question\\\": \\\"How can I export a grid as Excel?\\\", \\\"Answer\\\":\\\"Community-Workbooks/Azure Backup/FAQ/Export as Excel\\\"},\\r\\n{\\\"Question\\\": \\\"What resources are shown in this report?\\\", \\\"Answer\\\":\\\"Community-Workbooks/Azure Backup/FAQ/Resources Shown\\\"},\\r\\n{\\\"Question\\\": \\\"I am not able view certain jobs in this report. How do I troubleshoot?\\\", \\\"Answer\\\":\\\"Community-Workbooks/Azure Backup/FAQ/Troubleshoot\\\"}]\",\"transformers\":null}", + "size": 3, + "title": "Frequently asked questions", + "queryType": 8, + "visualization": "table", + "gridSettings": { + "formatters": [ + { + "columnMatch": "Question", + "formatter": 1, + "formatOptions": { + "linkColumn": "Answer", + "linkTarget": "WorkbookTemplate", + "linkIsContextBlade": true, + "customColumnWidthSetting": "100%" + } + }, + { + "columnMatch": "A", + "formatter": 5 + } + ] + } + }, + "conditionalVisibility": { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + "customWidth": "30", + "name": "FAQ1", + "styleSettings": { + "showBorder": true + } + }, + { + "type": 9, + "content": { + "version": "KqlParameterItem/1.0", + "crossComponentResources": [ + "{Workspaces}" + ], + "parameters": [ + { + "id": "7a64467f-eec7-495b-9099-233fb7bceb08", + "version": "KqlParameterItem/1.0", + "name": "RowsPerPageAzure", + "label": "Rows Per Page", + "type": 2, + "description": "Number of rows to display in a single page", + "typeSettings": { + "additionalResourceOptions": [], + "showDefault": false + }, + "jsonData": "[\r\n { \"value\":10, \"label\":\"10\", \"selected\":true },\r\n { \"value\":25, \"label\":\"25\" },\r\n { \"value\":50, \"label\":\"50\" },\r\n { \"value\":100, \"label\":\"100\" },\r\n { \"value\":250, \"label\":\"250\" },\r\n { \"value\":500, \"label\":\"500\" },\r\n { \"value\":1000, \"label\":\"1000\" }\r\n]" + }, + { + "id": "5c65bc61-a721-42b7-960b-3fe7a6170eb6", + "version": "KqlParameterItem/1.0", + "name": "PageAzure", + "type": 2, + "description": "Page number", + "isRequired": true, + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList = \"*\";\r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\");\r\nlet datasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusAzure}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationAzure}\"); \r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\" \r\n| mv-expand datasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(datasourceSubscriptionList)) or tostring(datasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n|where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemAzure}'),'{SearchItemAzure}',ReplicatedItemFriendlyName)\r\n| sort by ReplicatedItemId\r\n| summarize c=count()\r\n| project num = (c-1)/toint('{RowsPerPageAzure}') + 1\r\n| project nums = range(1,num,1), num\r\n| mvexpand nums\r\n| project nums = tostring(nums), num = strcat(tostring(nums),\" of \",tostring(num))\r\n\r\n", + "crossComponentResources": [ + "{Workspaces}" + ], + "typeSettings": { + "additionalResourceOptions": [], + "showDefault": false + }, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "value": "1", + "label": "Page" + } + ], + "style": "above", + "doNotRunWhenHidden": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces" + }, + "conditionalVisibilities": [ + { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + { + "parameterName": "ReplicationScenario", + "comparison": "isEqualTo", + "value": "Azure" + } + ], + "customWidth": "100", + "name": "Filters3" + }, + { + "type": 9, + "content": { + "version": "KqlParameterItem/1.0", + "crossComponentResources": [ + "{Workspaces}" + ], + "parameters": [ + { + "id": "7a64467f-eec7-495b-9099-233fb7bceb08", + "version": "KqlParameterItem/1.0", + "name": "RowsPerPageHybrid", + "label": "Rows Per Page", + "type": 2, + "description": "Number of rows to display in a single page", + "typeSettings": { + "additionalResourceOptions": [], + "showDefault": false + }, + "jsonData": "[\r\n { \"value\":10, \"label\":\"10\", \"selected\":true },\r\n { \"value\":25, \"label\":\"25\" },\r\n { \"value\":50, \"label\":\"50\" },\r\n { \"value\":100, \"label\":\"100\" },\r\n { \"value\":250, \"label\":\"250\" },\r\n { \"value\":500, \"label\":\"500\" },\r\n { \"value\":1000, \"label\":\"1000\" }\r\n]" + }, + { + "id": "5c65bc61-a721-42b7-960b-3fe7a6170eb6", + "version": "KqlParameterItem/1.0", + "name": "PageHybrid", + "label": "Page", + "type": 2, + "description": "Page number2", + "isRequired": true, + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultLocationList = \"*\";\r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusHybrid}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationHybrid}\"); \r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\" \r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n|where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemHybrid}'),'{SearchItemHybrid}',ReplicatedItemFriendlyName)\r\n| sort by ReplicatedItemId\r\n| summarize c=count()\r\n| project num = (c-1)/toint('{RowsPerPageHybrid}') + 1\r\n| project nums = range(1,num,1), num\r\n| mvexpand nums\r\n| project nums = tostring(nums), num = strcat(tostring(nums),\" of \",tostring(num))\r\n\r\n", + "crossComponentResources": [ + "{Workspaces}" + ], + "typeSettings": { + "additionalResourceOptions": [], + "showDefault": false + }, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "value": "1" + } + ], + "style": "above", + "doNotRunWhenHidden": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces" + }, + "conditionalVisibilities": [ + { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + { + "parameterName": "ReplicationScenario", + "comparison": "isEqualTo", + "value": "Hybrid" + } + ], + "customWidth": "100", + "name": "Filters3" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList = \"*\";\r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\"); \r\nlet DatasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusAzure}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationAzure}\"); \r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| mv-expand DatasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(DatasourceSubscriptionList)) or tostring(DatasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemAzure}'),'{SearchItemAzure}',ReplicatedItemFriendlyName)\r\n| extend ReplicatedItemFinalName = iff(isempty(ReplicatedItemFriendlyName), \"N/A\", tostring(ReplicatedItemFriendlyName))\r\n| extend JobDurationMins = round(JobDurationMs/60000,2)\r\n| sort by ReplicatedItemId\r\n| extend row_num = row_number()\r\n| extend page_num = tostring(((row_num-1)/toint('{RowsPerPageAzure}') + 1))\r\n| where page_num has ('{PageAzure}')\r\n| project ReplicatedItemName = ReplicatedItemFinalName,Vault = ResourceId,SubscriptionId,Location = VaultLocation,JobStartTime = StartTime,JobOperation = Operation,JobDurationMins,JobStatus = Status\r\n\r\n", + "size": 3, + "showAnalytics": true, + "title": "List of jobs in period", + "noDataMessage": "No record found for the selected time and scope.", + "showRefreshButton": true, + "showExportToExcel": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "crossComponentResources": [ + "{Workspaces}" + ], + "visualization": "table", + "gridSettings": { + "formatters": [ + { + "columnMatch": "Vault", + "formatter": 0, + "formatOptions": { + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "Subscription", + "formatter": 15, + "formatOptions": { + "linkTarget": "Resource", + "showIcon": true, + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "JobDurationMins", + "formatter": 4, + "formatOptions": { + "min": 0, + "palette": "blue" + }, + "numberFormat": { + "unit": 0, + "options": { + "style": "decimal", + "minimumFractionDigits": 2, + "maximumFractionDigits": 2 + } + } + }, + { + "columnMatch": "JobStatus", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "contains", + "thresholdValue": "Warning", + "representation": "2", + "text": "{0}{1}" + }, + { + "operator": "contains", + "thresholdValue": "Cancelled", + "representation": "cancelled", + "text": "{0}{1}" + }, + { + "operator": "contains", + "thresholdValue": "Completed", + "representation": "success" + }, + { + "operator": "contains", + "thresholdValue": "Failed", + "representation": "3", + "text": "{0}{1}" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "Blank", + "text": "{0}{1}" + } + ] + } + }, + { + "columnMatch": "Job Start Time", + "formatter": 0, + "formatOptions": { + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "Job Status", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "contains", + "thresholdValue": "Warning", + "representation": "2", + "text": "{0}{1}" + }, + { + "operator": "contains", + "thresholdValue": "Failed", + "representation": "failed", + "text": "{0}{1}" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "Blank", + "text": "{0}{1}" + } + ], + "customColumnWidthSetting": "10%" + } + } + ], + "rowLimit": 1000, + "labelSettings": [ + { + "columnId": "ReplicatedItemName", + "label": "Replicated Item" + }, + { + "columnId": "Vault", + "label": "Vault" + }, + { + "columnId": "SubscriptionId", + "label": "Subscription" + }, + { + "columnId": "Location", + "label": "Location" + }, + { + "columnId": "JobStartTime", + "label": "Job Start Time (UTC)" + }, + { + "columnId": "JobOperation", + "label": "Job Operation" + }, + { + "columnId": "JobDurationMins", + "label": "Job Duration (mins)" + }, + { + "columnId": "JobStatus", + "label": "Job Status" + } + ] + }, + "sortBy": [] + }, + "conditionalVisibilities": [ + { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + { + "parameterName": "ReplicationScenario", + "comparison": "isEqualTo", + "value": "Azure" + } + ], + "customWidth": "100", + "showPin": true, + "name": "Grid1", + "styleSettings": { + "margin": "5px", + "padding": "5px", + "showBorder": true + } + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultLocationList = \"*\";\r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusHybrid}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationHybrid}\"); \r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemHybrid}'),'{SearchItemHybrid}',ReplicatedItemFriendlyName)\r\n| extend ReplicatedItemFinalName = iff(isempty(ReplicatedItemFriendlyName), \"N/A\", tostring(ReplicatedItemFriendlyName))\r\n| extend JobDurationMins = round(JobDurationMs/60000,2)\r\n| sort by ReplicatedItemId\r\n| extend row_num = row_number()\r\n| extend page_num = tostring(((row_num-1)/toint('{RowsPerPageHybrid}') + 1))\r\n| where page_num has ('{PageHybrid}')\r\n| project ReplicatedItemName = ReplicatedItemFinalName,Vault = ResourceId,SubscriptionId,Location = VaultLocation,JobStartTime = StartTime,JobOperation = Operation,JobDurationMins,JobStatus = Status\r\n", + "size": 3, + "showAnalytics": true, + "title": "List of jobs in period", + "noDataMessage": "No record found for the selected time and scope.", + "showRefreshButton": true, + "showExportToExcel": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "crossComponentResources": [ + "{Workspaces}" + ], + "visualization": "table", + "gridSettings": { + "formatters": [ + { + "columnMatch": "Vault", + "formatter": 0, + "formatOptions": { + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "Subscription", + "formatter": 15, + "formatOptions": { + "linkTarget": "Resource", + "showIcon": true, + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "JobDurationMins", + "formatter": 4, + "formatOptions": { + "min": 0, + "palette": "blue" + }, + "numberFormat": { + "unit": 0, + "options": { + "style": "decimal", + "minimumFractionDigits": 2, + "maximumFractionDigits": 2 + } + } + }, + { + "columnMatch": "JobStatus", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "contains", + "thresholdValue": "Warning", + "representation": "2", + "text": "{0}{1}" + }, + { + "operator": "contains", + "thresholdValue": "Cancelled", + "representation": "cancelled", + "text": "{0}{1}" + }, + { + "operator": "contains", + "thresholdValue": "Failed", + "representation": "3", + "text": "{0}{1}" + }, + { + "operator": "contains", + "thresholdValue": "Completed", + "representation": "success", + "text": "{0}{1}" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "Blank", + "text": "{0}{1}" + } + ] + } + }, + { + "columnMatch": "Job Start Time", + "formatter": 0, + "formatOptions": { + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "Job Status", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "contains", + "thresholdValue": "Warning", + "representation": "2", + "text": "{0}{1}" + }, + { + "operator": "contains", + "thresholdValue": "Cancelled", + "representation": "cancelled", + "text": "{0}{1}" + }, + { + "operator": "contains", + "thresholdValue": "Completed", + "representation": "success", + "text": "{0}{1}" + }, + { + "operator": "contains", + "thresholdValue": "Failed", + "representation": "failed", + "text": "{0}{1}" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "Blank", + "text": "{0}{1}" + } + ], + "customColumnWidthSetting": "10%" + } + } + ], + "rowLimit": 1000, + "labelSettings": [ + { + "columnId": "ReplicatedItemName", + "label": "Replicated Item" + }, + { + "columnId": "SubscriptionId", + "label": "Subscription" + }, + { + "columnId": "JobStartTime", + "label": "Job Start Time (UTC)" + }, + { + "columnId": "JobOperation", + "label": "Job Operation" + }, + { + "columnId": "JobDurationMins", + "label": "Job Duration (mins)" + }, + { + "columnId": "JobStatus", + "label": "Job Status" + } + ] + }, + "sortBy": [] + }, + "conditionalVisibilities": [ + { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + { + "parameterName": "ReplicationScenario", + "comparison": "isEqualTo", + "value": "Hybrid" + } + ], + "customWidth": "100", + "showPin": true, + "name": "Grid2", + "styleSettings": { + "margin": "5px", + "padding": "5px", + "showBorder": true + } + } + ], + "fallbackResourceIds": [ + "microsoft_azure_dataprotection" + ], + "$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json" +} From 0d173674ea6c029be06a1bb76ba6342409af7d06 Mon Sep 17 00:00:00 2001 From: tmalhotra2428 <108122940+tmalhotra2428@users.noreply.github.com> Date: Wed, 6 Mar 2024 11:25:57 +0530 Subject: [PATCH 03/10] Create ASR ReplicatedItems.workbook --- .../ASR ReplicatedItems/ASR ReplicatedItems.workbook | 1 + 1 file changed, 1 insertion(+) create mode 100644 Workbooks/Azure Backup/ASR ReplicatedItems/ASR ReplicatedItems.workbook diff --git a/Workbooks/Azure Backup/ASR ReplicatedItems/ASR ReplicatedItems.workbook b/Workbooks/Azure Backup/ASR ReplicatedItems/ASR ReplicatedItems.workbook new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/Workbooks/Azure Backup/ASR ReplicatedItems/ASR ReplicatedItems.workbook @@ -0,0 +1 @@ + From b9145cf6811c140e70bf064cf8684442ecaf430a Mon Sep 17 00:00:00 2001 From: tmalhotra2428 <108122940+tmalhotra2428@users.noreply.github.com> Date: Wed, 6 Mar 2024 11:29:44 +0530 Subject: [PATCH 04/10] Update ASR ReplicatedItems.workbook --- .../ASR ReplicatedItems.workbook | 1220 ++++++++++++++++- 1 file changed, 1219 insertions(+), 1 deletion(-) diff --git a/Workbooks/Azure Backup/ASR ReplicatedItems/ASR ReplicatedItems.workbook b/Workbooks/Azure Backup/ASR ReplicatedItems/ASR ReplicatedItems.workbook index 8b13789179..8c9de3ecf5 100644 --- a/Workbooks/Azure Backup/ASR ReplicatedItems/ASR ReplicatedItems.workbook +++ b/Workbooks/Azure Backup/ASR ReplicatedItems/ASR ReplicatedItems.workbook @@ -1 +1,1219 @@ - +{ + "version": "Notebook/1.0", + "items": [ + { + "type": 1, + "content": { + "json": "## Workspace details" + }, + "name": "Heading1" + }, + { + "type": 11, + "content": { + "version": "LinkItem/1.0", + "style": "paragraph", + "links": [ + { + "id": "bac30f99-eaf9-4c7f-8705-cc263b8e1e88", + "cellValue": "https://aka.ms/BCDRAuditReportTemplates", + "linkTarget": "Url", + "linkLabel": "follow these steps", + "preText": "As this report involves historical data, you will need to have reporting data stored in a Log Analytics workspace to view the report. If you have not set up a workspace yet,", + "postText": "to get started.", + "style": "link", + "workbookContext": { + "componentIdSource": "workbook", + "resourceIdsSource": "workbook", + "templateIdSource": "static", + "templateId": "Community-Workbooks/Azure Backup/Backup Audit Reporting Templates", + "typeSource": "workbook", + "gallerySource": "workbook", + "locationSource": "default" + } + } + ] + }, + "name": "Text1" + }, + { + "type": 1, + "content": { + "json": "*Note - This template is currently scoped to items that are protected using Azure Site Recovery*" + }, + "name": "text - 11" + }, + { + "type": 9, + "content": { + "version": "KqlParameterItem/1.0", + "crossComponentResources": [ + "{Subscriptions}" + ], + "parameters": [ + { + "id": "d1f42f81-eb8f-4653-a0ff-38564d7487b4", + "version": "KqlParameterItem/1.0", + "name": "Subscriptions", + "type": 6, + "description": "Subscriptions to filter the list of workspaces", + "isRequired": true, + "multiSelect": true, + "quote": "'", + "delimiter": ",", + "value": [ + "value::all" + ], + "typeSettings": { + "additionalResourceOptions": [ + "value::all" + ], + "includeAll": false, + "selectAllValue": "" + }, + "label": "Workspace Subscription" + }, + { + "id": "2373a24f-ad32-4909-a7f6-59b373dcde6c", + "version": "KqlParameterItem/1.0", + "name": "Workspaces", + "label": "Workspace", + "type": 5, + "description": "LA Workspaces configured in vault diagnostic settings", + "isRequired": true, + "multiSelect": true, + "quote": "'", + "delimiter": ",", + "query": "where type =~ 'microsoft.operationalinsights/workspaces' | project id", + "crossComponentResources": [ + "{Subscriptions}" + ], + "typeSettings": { + "additionalResourceOptions": [], + "showDefault": false + }, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources" + }, + { + "id": "101b128c-36de-4a8f-a0c9-27548aa083ed", + "version": "KqlParameterItem/1.0", + "name": "ReplicationScenario", + "label": "Replication Scenario", + "type": 2, + "description": "Filter for replication scenario", + "isRequired": true, + "typeSettings": { + "additionalResourceOptions": [] + }, + "jsonData": "[ \r\n{ \"value\": \"Azure\", \t\t\t\t\t\t\"label\": \"Azure\" },\r\n{ \"value\": \"Hybrid\", \t\t\t\"label\": \"Hybrid\" }\r\n]", + "value": "Azure" + } + ], + "style": "above", + "doNotRunWhenHidden": true, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources" + }, + "customWidth": "100", + "name": "Filters1" + }, + { + "type": 1, + "content": { + "json": "_____________________" + }, + "name": "Line1" + }, + { + "type": 1, + "content": { + "json": "## Replication Health History" + }, + "conditionalVisibility": { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + "name": "Heading2" + }, + { + "type": 1, + "content": { + "json": "This report helps you view information on your replicated items over a specified duration of time. [Learn more](https://go.microsoft.com/fwlink/?linkid=2211463&clcid=0x409)" + }, + "conditionalVisibility": { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + "name": "Text2" + }, + { + "type": 9, + "content": { + "version": "KqlParameterItem/1.0", + "parameters": [ + { + "id": "2965ad33-1401-47c9-8f4b-9b7126f87014", + "version": "KqlParameterItem/1.0", + "name": "TimeRangeAzure", + "label": "Time Range", + "type": 4, + "description": "Period of time for which reports should be viewed", + "isRequired": true, + "typeSettings": { + "selectableValues": [ + { + "durationMs": 259200000 + }, + { + "durationMs": 604800000 + }, + { + "durationMs": 1209600000 + }, + { + "durationMs": 2419200000 + }, + { + "durationMs": 2592000000 + }, + { + "durationMs": 5184000000 + }, + { + "durationMs": 7776000000 + } + ], + "allowCustom": true + }, + "value": { + "durationMs": 259200000 + } + }, + { + "id": "efede5fa-f577-4766-b9b6-6ba4e525f844", + "version": "KqlParameterItem/1.0", + "name": "DatasourceSubscription", + "label": "Datasource Subscription", + "type": 6, + "description": "Use to filter for datasources within a specific subscription", + "isRequired": true, + "multiSelect": true, + "quote": "", + "delimiter": ",", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType contains \"Azure\" and RecoveryFabricType contains \"Azure\"\r\n| distinct tostring(split(tostring(todynamic(SourceResourceId)),\"/\")[2])", + "crossComponentResources": [ + "{Workspaces}" + ], + "typeSettings": { + "additionalResourceOptions": [ + "value::all" + ], + "selectAllValue": "*", + "showDefault": false + }, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "value": [ + "value::all" + ] + }, + { + "id": "256c7e33-df90-4956-aaf3-699aeaad912f", + "version": "KqlParameterItem/1.0", + "name": "DatasourceResourceGroup", + "label": "Datasource Resource Group", + "type": 2, + "description": "Use to filter for datasources within a specific resource group", + "isRequired": true, + "multiSelect": true, + "quote": "", + "delimiter": ",", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType contains \"Azure\" and RecoveryFabricType contains \"Azure\"\r\n| distinct tostring(split(SourceResourceId,'/')[4])", + "crossComponentResources": [ + "{Workspaces}" + ], + "typeSettings": { + "additionalResourceOptions": [ + "value::all" + ], + "selectAllValue": "*", + "showDefault": false + }, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "value": [ + "value::all" + ] + }, + { + "id": "849a6401-cbaf-44b9-a733-0819f8923791", + "version": "KqlParameterItem/1.0", + "name": "SearchItemAzure", + "label": "Search Item", + "type": 1, + "description": "Use to search for an item by name", + "value": "" + } + ], + "style": "above", + "doNotRunWhenHidden": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces" + }, + "conditionalVisibilities": [ + { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + { + "parameterName": "ReplicationScenario", + "comparison": "isEqualTo", + "value": "Azure" + } + ], + "customWidth": "100", + "name": "Filters2" + }, + { + "type": 9, + "content": { + "version": "KqlParameterItem/1.0", + "crossComponentResources": [ + "{Workspaces}" + ], + "parameters": [ + { + "id": "2965ad33-1401-47c9-8f4b-9b7126f87014", + "version": "KqlParameterItem/1.0", + "name": "TimeRangeHybrid", + "label": "Time Range", + "type": 4, + "description": "Period of time for which reports should be viewed", + "isRequired": true, + "typeSettings": { + "selectableValues": [ + { + "durationMs": 259200000 + }, + { + "durationMs": 604800000 + }, + { + "durationMs": 1209600000 + }, + { + "durationMs": 2419200000 + }, + { + "durationMs": 2592000000 + }, + { + "durationMs": 5184000000 + }, + { + "durationMs": 7776000000 + } + ], + "allowCustom": true + }, + "value": { + "durationMs": 604800000 + } + }, + { + "id": "efede5fa-f577-4766-b9b6-6ba4e525f844", + "version": "KqlParameterItem/1.0", + "name": "VaultSubscription", + "label": "Vault Subscription", + "type": 6, + "description": "Use to filter for vaults within a specific subscription", + "isRequired": true, + "multiSelect": true, + "quote": "", + "delimiter": ",", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType !contains \"Azure\" or RecoveryFabricType !contains \"Azure\"\r\n| distinct tostring(split(tostring(todynamic(ResourceId)),\"/\")[2])", + "crossComponentResources": [ + "{Workspaces}" + ], + "typeSettings": { + "additionalResourceOptions": [ + "value::all" + ], + "selectAllValue": "*", + "showDefault": false + }, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "value": [ + "value::all" + ] + }, + { + "id": "256c7e33-df90-4956-aaf3-699aeaad912f", + "version": "KqlParameterItem/1.0", + "name": "VaultResourceGroup", + "label": "Vault Resource Group", + "type": 2, + "description": "Use to filter for vaults within a specific resource group", + "isRequired": true, + "multiSelect": true, + "quote": "", + "delimiter": ",", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType !contains \"Azure\" or RecoveryFabricType !contains \"Azure\"\r\n| distinct tostring(split(ResourceId,'/')[4])", + "crossComponentResources": [ + "{Workspaces}" + ], + "typeSettings": { + "additionalResourceOptions": [ + "value::all" + ], + "selectAllValue": "*", + "showDefault": false + }, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "value": [ + "value::all" + ] + }, + { + "id": "849a6401-cbaf-44b9-a733-0819f8923791", + "version": "KqlParameterItem/1.0", + "name": "SearchItemHybrid", + "label": "Search Item", + "type": 1, + "description": "Use to search for an item by name", + "value": "" + } + ], + "style": "above", + "doNotRunWhenHidden": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces" + }, + "conditionalVisibilities": [ + { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + { + "parameterName": "ReplicationScenario", + "comparison": "isEqualTo", + "value": "Hybrid" + } + ], + "customWidth": "100", + "name": "Filters2" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\");\r\nlet DatasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultLocationList = \"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet VaultSubscriptionList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet ReplicatedItem = '{SearchItemAzure}';\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType contains \"Azure\" and RecoveryFabricType contains \"Azure\"\r\n| mv-expand DatasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(DatasourceSubscriptionList)) or tostring(DatasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains ReplicatedItem\r\n| summarize healthyCount = countif(ReplicationStatus == \"Normal\"), totalCount = count() by bin(TimeGenerated, 1d)", + "size": 3, + "aggregation": 5, + "showAnalytics": true, + "title": "Count of Items with healthy replication over time", + "noDataMessage": "No record found for the selected time and scope.", + "showRefreshButton": true, + "showExportToExcel": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "crossComponentResources": [ + "{Workspaces}" + ], + "visualization": "timechart", + "tileSettings": { + "showBorder": false, + "titleContent": { + "columnMatch": "UniqueId", + "formatter": 1 + }, + "leftContent": { + "columnMatch": "DurationInSecs", + "formatter": 12, + "formatOptions": { + "palette": "auto" + }, + "numberFormat": { + "unit": 17, + "options": { + "maximumSignificantDigits": 3, + "maximumFractionDigits": 2 + } + } + } + }, + "graphSettings": { + "type": 0, + "topContent": { + "columnMatch": "ReplicationStatus", + "formatter": 1 + }, + "centerContent": { + "columnMatch": "count_", + "formatter": 1, + "numberFormat": { + "unit": 17, + "options": { + "maximumSignificantDigits": 3, + "maximumFractionDigits": 2 + } + } + } + }, + "chartSettings": { + "seriesLabelSettings": [ + { + "seriesName": "healthyCount", + "label": "Healthy Items" + }, + { + "seriesName": "totalCount", + "label": "Total Items" + } + ] + }, + "mapSettings": { + "locInfo": "LatLong", + "sizeSettings": "count_", + "sizeAggregation": "Sum", + "legendMetric": "count_", + "legendAggregation": "Sum", + "itemColorSettings": { + "type": "heatmap", + "colorAggregation": "Sum", + "nodeColorField": "count_", + "heatmapPalette": "greenRed" + } + } + }, + "conditionalVisibilities": [ + { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + { + "parameterName": "DatasourceSubscription", + "comparison": "isNotEqualTo" + }, + { + "parameterName": "DatasourceResourceGroup", + "comparison": "isNotEqualTo", + "value": "not set" + }, + { + "parameterName": "ReplicationScenario", + "comparison": "isEqualTo", + "value": "Azure" + } + ], + "customWidth": "70", + "showPin": true, + "name": "Chart1", + "styleSettings": { + "showBorder": true + } + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultLocationList = \"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet ReplicatedItem = '{SearchItemHybrid}';\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType !contains \"Azure\" or RecoveryFabricType !contains \"Azure\"\r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains ReplicatedItem\r\n| summarize healthyCount = countif(ReplicationStatus == \"Normal\"), totalCount = count() by bin(TimeGenerated, 1d)", + "size": 3, + "aggregation": 5, + "showAnalytics": true, + "title": "Count of Items with healthy replication over time", + "noDataMessage": "No record found for the selected time and scope.", + "showRefreshButton": true, + "showExportToExcel": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "crossComponentResources": [ + "{Workspaces}" + ], + "visualization": "timechart", + "tileSettings": { + "showBorder": false, + "titleContent": { + "columnMatch": "UniqueId", + "formatter": 1 + }, + "leftContent": { + "columnMatch": "DurationInSecs", + "formatter": 12, + "formatOptions": { + "palette": "auto" + }, + "numberFormat": { + "unit": 17, + "options": { + "maximumSignificantDigits": 3, + "maximumFractionDigits": 2 + } + } + } + }, + "graphSettings": { + "type": 0, + "topContent": { + "columnMatch": "ReplicationStatus", + "formatter": 1 + }, + "centerContent": { + "columnMatch": "count_", + "formatter": 1, + "numberFormat": { + "unit": 17, + "options": { + "maximumSignificantDigits": 3, + "maximumFractionDigits": 2 + } + } + } + }, + "chartSettings": { + "seriesLabelSettings": [ + { + "seriesName": "healthyCount", + "label": "Healthy Items" + }, + { + "seriesName": "totalCount", + "label": "Total Items" + } + ] + }, + "mapSettings": { + "locInfo": "LatLong", + "sizeSettings": "count_", + "sizeAggregation": "Sum", + "legendMetric": "count_", + "legendAggregation": "Sum", + "itemColorSettings": { + "type": "heatmap", + "colorAggregation": "Sum", + "nodeColorField": "count_", + "heatmapPalette": "greenRed" + } + } + }, + "conditionalVisibilities": [ + { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + { + "parameterName": "VaultSubscription", + "comparison": "isNotEqualTo", + "value": "not set" + }, + { + "parameterName": "VaultResourceGroup", + "comparison": "isNotEqualTo", + "value": "not set" + }, + { + "parameterName": "ReplicationScenario", + "comparison": "isEqualTo", + "value": "Hybrid" + } + ], + "customWidth": "70", + "showPin": true, + "name": "Chart2", + "styleSettings": { + "showBorder": true + } + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "{\"version\":\"1.0.0\",\"content\":\"[{\\\"Question\\\": \\\"How can I add more columns to the grid?\\\",\\\"Answer\\\":\\\"Community-Workbooks/Azure Backup/FAQ/Customize LA Queries\\\"},\\r\\n{\\\"Question\\\": \\\"I want to re-use some of these views and create a custom report. How can I achieve that?\\\",\\\"Answer\\\":\\\"Community-Workbooks/Azure Backup/FAQ/Reuse a View\\\"},\\r\\n{\\\"Question\\\": \\\"How can I export a grid as Excel?\\\", \\\"Answer\\\":\\\"Community-Workbooks/Azure Backup/FAQ/Export as Excel\\\"},\\r\\n{\\\"Question\\\": \\\"What resources are shown in this report?\\\", \\\"Answer\\\":\\\"Community-Workbooks/Azure Backup/FAQ/Resources Shown\\\"},\\r\\n{\\\"Question\\\": \\\"I am not able view certain jobs in this report. How do I troubleshoot?\\\", \\\"Answer\\\":\\\"Community-Workbooks/Azure Backup/FAQ/Troubleshoot\\\"}]\",\"transformers\":null}", + "size": 3, + "title": "Frequently asked questions", + "queryType": 8, + "visualization": "table", + "gridSettings": { + "formatters": [ + { + "columnMatch": "Question", + "formatter": 1, + "formatOptions": { + "linkColumn": "Answer", + "linkTarget": "WorkbookTemplate", + "linkIsContextBlade": true, + "customColumnWidthSetting": "100%" + } + }, + { + "columnMatch": "A", + "formatter": 5 + } + ] + } + }, + "conditionalVisibility": { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + "customWidth": "30", + "name": "FAQ1", + "styleSettings": { + "showBorder": true + } + }, + { + "type": 9, + "content": { + "version": "KqlParameterItem/1.0", + "crossComponentResources": [ + "{Workspaces}" + ], + "parameters": [ + { + "id": "7a64467f-eec7-495b-9099-233fb7bceb08", + "version": "KqlParameterItem/1.0", + "name": "RowsPerPageAzure", + "label": "Rows Per Page", + "type": 2, + "description": "Number of rows to display in a single page", + "typeSettings": { + "additionalResourceOptions": [], + "showDefault": false + }, + "jsonData": "[\r\n { \"value\":10, \"label\":\"10\", \"selected\":true },\r\n { \"value\":25, \"label\":\"25\" },\r\n { \"value\":50, \"label\":\"50\" },\r\n { \"value\":100, \"label\":\"100\" },\r\n { \"value\":250, \"label\":\"250\" },\r\n { \"value\":500, \"label\":\"500\" },\r\n { \"value\":1000, \"label\":\"1000\" }\r\n]" + }, + { + "id": "5c65bc61-a721-42b7-960b-3fe7a6170eb6", + "version": "KqlParameterItem/1.0", + "name": "PageAzure", + "label": "Page", + "type": 2, + "description": "Page number", + "isRequired": true, + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\"); \r\nlet datasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet ReplicatedItem = '{SearchItemAzure}';\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType contains \"Azure\" and RecoveryFabricType contains \"Azure\"\r\n| mv-expand datasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(datasourceSubscriptionList)) or tostring(datasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains ReplicatedItem\r\n| summarize arg_max(TimeGenerated, *) by ReplicatedItemId\r\n| summarize c=count()\r\n| project num = (c-1)/toint('{RowsPerPageAzure}') + 1\r\n| project nums = range(1,num,1), num\r\n| mvexpand nums\r\n| project nums = tostring(nums), num = strcat(tostring(nums),\" of \",tostring(num))\r\n\r\n", + "crossComponentResources": [ + "{Workspaces}" + ], + "typeSettings": { + "additionalResourceOptions": [], + "showDefault": false + }, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "value": "1" + } + ], + "style": "above", + "doNotRunWhenHidden": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces" + }, + "conditionalVisibilities": [ + { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + { + "parameterName": "ReplicationScenario", + "comparison": "isEqualTo", + "value": "Azure" + } + ], + "customWidth": "100", + "name": "Filters3" + }, + { + "type": 9, + "content": { + "version": "KqlParameterItem/1.0", + "crossComponentResources": [ + "{Workspaces}" + ], + "parameters": [ + { + "id": "7a64467f-eec7-495b-9099-233fb7bceb08", + "version": "KqlParameterItem/1.0", + "name": "RowsPerPageHybrid", + "label": "Rows Per Page", + "type": 2, + "description": "Number of rows to display in a single page", + "typeSettings": { + "additionalResourceOptions": [], + "showDefault": false + }, + "jsonData": "[\r\n { \"value\":10, \"label\":\"10\", \"selected\":true },\r\n { \"value\":25, \"label\":\"25\" },\r\n { \"value\":50, \"label\":\"50\" },\r\n { \"value\":100, \"label\":\"100\" },\r\n { \"value\":250, \"label\":\"250\" },\r\n { \"value\":500, \"label\":\"500\" },\r\n { \"value\":1000, \"label\":\"1000\" }\r\n]" + }, + { + "id": "5c65bc61-a721-42b7-960b-3fe7a6170eb6", + "version": "KqlParameterItem/1.0", + "name": "PageHybrid", + "label": "Page", + "type": 2, + "description": "Page number", + "isRequired": true, + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet ReplicatedItem = '{SearchItemHybrid}';\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType !contains \"Azure\" or RecoveryFabricType !contains \"Azure\"\r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains ReplicatedItem\r\n| summarize arg_max(TimeGenerated, *) by ReplicatedItemId\r\n| summarize c=count()\r\n| project num = (c-1)/toint('{RowsPerPageHybrid}') + 1\r\n| project nums = range(1,num,1), num\r\n| mvexpand nums\r\n| project nums = tostring(nums), num = strcat(tostring(nums),\" of \",tostring(num))\r\n\r\n", + "crossComponentResources": [ + "{Workspaces}" + ], + "typeSettings": { + "additionalResourceOptions": [], + "showDefault": false + }, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "value": "1" + } + ], + "style": "above", + "doNotRunWhenHidden": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces" + }, + "conditionalVisibilities": [ + { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + { + "parameterName": "ReplicationScenario", + "comparison": "isEqualTo", + "value": "Hybrid" + } + ], + "customWidth": "100", + "name": "Filters4" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\"); \r\nlet datasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet ReplicatedItem = '{SearchItemAzure}';\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType contains \"Azure\" and RecoveryFabricType contains \"Azure\"\r\n| mv-expand datasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(datasourceSubscriptionList)) or tostring(datasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains ReplicatedItem\r\n| summarize arg_max(TimeGenerated, *) by ReplicatedItemId\r\n| sort by ReplicatedItemId\r\n| extend row_num = row_number()\r\n| extend page_num = tostring(((row_num-1)/toint('{RowsPerPageAzure}') + 1))\r\n| where page_num has ('{PageAzure}')\r\n| extend LastTestFailoverDate = iff(isnull(LastSuccessfulTestFailoverTime), \"N/A\", tostring(LastSuccessfulTestFailoverTime))\r\n| project ReplicatedItem = ReplicatedItemFriendlyName, SubscriptionId = tostring(split(SourceResourceId,'/')[2]), ResourceGroup = tostring(split(SourceResourceId,'/')[4]),Vault = ResourceId,Location = VaultLocation,ReplicationHealth = ReplicationStatus,LastFailoverDate = LastTestFailoverDate, ReplicationHealthErrors = ReplicationHealthErrors\r\n", + "size": 3, + "showAnalytics": true, + "title": "Items by replication health", + "noDataMessage": "No record found for the selected time and scope.", + "showRefreshButton": true, + "showExportToExcel": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "crossComponentResources": [ + "{Workspaces}" + ], + "visualization": "table", + "gridSettings": { + "formatters": [ + { + "columnMatch": "Subscription", + "formatter": 15, + "formatOptions": { + "linkTarget": "Resource", + "showIcon": true, + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "Vault", + "formatter": 0, + "formatOptions": { + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "ReplicationHealth", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "contains", + "thresholdValue": "Normal", + "representation": "success", + "text": "{0}{1}" + }, + { + "operator": "contains", + "thresholdValue": "Warning", + "representation": "2", + "text": "{0}{1}" + }, + { + "operator": "contains", + "thresholdValue": "Critical", + "representation": "4", + "text": "{0}{1}" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "Blank", + "text": "{0}{1}" + } + ] + } + }, + { + "columnMatch": "ReplicationHealthErrors", + "formatter": 7, + "formatOptions": { + "linkTarget": "CellDetails", + "linkIsContextBlade": true + } + }, + { + "columnMatch": "BackupItem", + "formatter": 5 + }, + { + "columnMatch": "BackupItemFriendlyName", + "formatter": 16, + "formatOptions": { + "linkColumn": "BackupItem", + "linkTarget": "Resource", + "showIcon": true, + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "VaultLocation", + "formatter": 17, + "formatOptions": { + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "JobOperation", + "formatter": 0, + "formatOptions": { + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "JobStartTime", + "formatter": 0, + "formatOptions": { + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "JobDuration", + "formatter": 0, + "formatOptions": { + "customColumnWidthSetting": "10%" + }, + "numberFormat": { + "unit": 0, + "options": { + "style": "decimal", + "minimumFractionDigits": 2, + "maximumFractionDigits": 2 + } + } + }, + { + "columnMatch": "JobStatus", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "contains", + "thresholdValue": "Warning", + "representation": "2", + "text": "{0}{1}" + }, + { + "operator": "contains", + "thresholdValue": "Failed", + "representation": "failed", + "text": "{0}{1}" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "Blank", + "text": "{0}{1}" + } + ], + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "FailureCode", + "formatter": 0, + "formatOptions": { + "customColumnWidthSetting": "10%" + } + } + ], + "rowLimit": 1000, + "labelSettings": [ + { + "columnId": "ReplicatedItem", + "label": "Replicated Item" + }, + { + "columnId": "SubscriptionId", + "label": "Subscription" + }, + { + "columnId": "ResourceGroup", + "label": "Resource Group" + }, + { + "columnId": "ReplicationHealth", + "label": "Replication Health" + }, + { + "columnId": "LastFailoverDate", + "label": "Last Failover Date" + }, + { + "columnId": "ReplicationHealthErrors", + "label": "Replication Health Errors" + } + ] + }, + "sortBy": [] + }, + "conditionalVisibilities": [ + { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + { + "parameterName": "ReplicationScenario", + "comparison": "isEqualTo", + "value": "Azure" + } + ], + "customWidth": "100", + "showPin": true, + "name": "Grid1", + "styleSettings": { + "margin": "5px", + "padding": "5px", + "showBorder": true + } + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet ReplicatedItem = '{SearchItemHybrid}';\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType !contains \"Azure\" or RecoveryFabricType !contains \"Azure\"\r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains ReplicatedItem\r\n| summarize arg_max(TimeGenerated, *) by ReplicatedItemId\r\n| sort by ReplicatedItemId\r\n| extend row_num = row_number()\r\n| extend page_num = tostring(((row_num-1)/toint('{RowsPerPageHybrid}') + 1))\r\n| where page_num has ('{PageHybrid}')\r\n| extend LastTestFailoverDate = iff(isnull(LastSuccessfulTestFailoverTime), \"N/A\", tostring(LastSuccessfulTestFailoverTime))\r\n| project ReplicatedItem = ReplicatedItemFriendlyName, SubscriptionId = tostring(split(ResourceId,'/')[2]), ResourceGroup = tostring(split(ResourceId,'/')[4]),Vault = ResourceId,Location = VaultLocation,ReplicationHealth = ReplicationStatus,LastFailoverDate = LastTestFailoverDate, ReplicationHealthErrors = ReplicationHealthErrors\r\n", + "size": 3, + "showAnalytics": true, + "title": "Items by replication health", + "noDataMessage": "No record found for the selected time and scope.", + "showRefreshButton": true, + "showExportToExcel": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "crossComponentResources": [ + "{Workspaces}" + ], + "visualization": "table", + "gridSettings": { + "formatters": [ + { + "columnMatch": "Subscription", + "formatter": 15, + "formatOptions": { + "linkTarget": "Resource", + "showIcon": true, + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "Vault", + "formatter": 0, + "formatOptions": { + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "ReplicationHealth", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "contains", + "thresholdValue": "Normal", + "representation": "success", + "text": "{0}{1}" + }, + { + "operator": "contains", + "thresholdValue": "Warning", + "representation": "2", + "text": "{0}{1}" + }, + { + "operator": "contains", + "thresholdValue": "Critical", + "representation": "4", + "text": "{0}{1}" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "Blank", + "text": "{0}{1}" + } + ] + } + }, + { + "columnMatch": "ReplicationHealthErrors", + "formatter": 7, + "formatOptions": { + "linkTarget": "CellDetails", + "linkIsContextBlade": true + } + }, + { + "columnMatch": "BackupItem", + "formatter": 5 + }, + { + "columnMatch": "BackupItemFriendlyName", + "formatter": 16, + "formatOptions": { + "linkColumn": "BackupItem", + "linkTarget": "Resource", + "showIcon": true, + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "VaultLocation", + "formatter": 17, + "formatOptions": { + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "JobOperation", + "formatter": 0, + "formatOptions": { + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "JobStartTime", + "formatter": 0, + "formatOptions": { + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "JobDuration", + "formatter": 0, + "formatOptions": { + "customColumnWidthSetting": "10%" + }, + "numberFormat": { + "unit": 0, + "options": { + "style": "decimal", + "minimumFractionDigits": 2, + "maximumFractionDigits": 2 + } + } + }, + { + "columnMatch": "JobStatus", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "contains", + "thresholdValue": "Warning", + "representation": "2", + "text": "{0}{1}" + }, + { + "operator": "contains", + "thresholdValue": "Failed", + "representation": "failed", + "text": "{0}{1}" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "Blank", + "text": "{0}{1}" + } + ], + "customColumnWidthSetting": "10%" + } + }, + { + "columnMatch": "FailureCode", + "formatter": 0, + "formatOptions": { + "customColumnWidthSetting": "10%" + } + } + ], + "rowLimit": 1000, + "labelSettings": [ + { + "columnId": "ReplicatedItem", + "label": "Replicated Item" + }, + { + "columnId": "SubscriptionId", + "label": "Subscription" + }, + { + "columnId": "ResourceGroup", + "label": "Resource Group" + }, + { + "columnId": "ReplicationHealth", + "label": "Replication Health" + }, + { + "columnId": "LastFailoverDate", + "label": "Last Failover Date" + }, + { + "columnId": "ReplicationHealthErrors", + "label": "Replication Health Errors" + } + ] + }, + "sortBy": [] + }, + "conditionalVisibilities": [ + { + "parameterName": "Workspaces", + "comparison": "isNotEqualTo" + }, + { + "parameterName": "ReplicationScenario", + "comparison": "isEqualTo", + "value": "Hybrid" + } + ], + "customWidth": "100", + "showPin": true, + "name": "Grid2", + "styleSettings": { + "margin": "5px", + "padding": "5px", + "showBorder": true + } + } + ], + "fallbackResourceIds": [ + "microsoft_azure_dataprotection" + ], + "$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json" +} From 6fbf605b6aab3b8486d2866404cd1b774776c8d7 Mon Sep 17 00:00:00 2001 From: tmalhotra2428 <108122940+tmalhotra2428@users.noreply.github.com> Date: Wed, 6 Mar 2024 11:54:55 +0530 Subject: [PATCH 05/10] Update ASR Job History.workbook --- .../ASR Job History/ASR Job History.workbook | 35 +++++-------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook b/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook index 89045f6be9..56d1d10323 100644 --- a/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook +++ b/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook @@ -1,4 +1,3 @@ - { "version": "Notebook/1.0", "items": [ @@ -48,6 +47,9 @@ "type": 9, "content": { "version": "KqlParameterItem/1.0", + "crossComponentResources": [ + "{Subscriptions}" + ], "parameters": [ { "id": "d1f42f81-eb8f-4653-a0ff-38564d7487b4", @@ -75,6 +77,7 @@ "id": "2373a24f-ad32-4909-a7f6-59b373dcde6c", "version": "KqlParameterItem/1.0", "name": "Workspaces", + "label": "Workspace", "type": 5, "description": "LA Workspaces configured in vault diagnostic settings", "isRequired": true, @@ -86,15 +89,11 @@ "{Subscriptions}" ], "typeSettings": { - "additionalResourceOptions": [ - "value::all" - ], + "additionalResourceOptions": [], "showDefault": false }, "queryType": 1, - "resourceType": "microsoft.resourcegraph/resources", - "value": [], - "label": "Workspace" + "resourceType": "microsoft.resourcegraph/resources" }, { "id": "254167f1-3459-455a-9bc9-9df92ed8044b", @@ -113,8 +112,8 @@ ], "style": "above", "doNotRunWhenHidden": true, - "queryType": 0, - "resourceType": "microsoft.operationalinsights/workspaces" + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources" }, "customWidth": "100", "name": "Filters1" @@ -152,9 +151,6 @@ "type": 9, "content": { "version": "KqlParameterItem/1.0", - "crossComponentResources": [ - "/subscriptions/378e5be3-6163-4ae6-9b38-9f10c1429f24/resourceGroups/ingestion_e2e/providers/microsoft.operationalinsights/workspaces/canaryinestiontest" - ], "parameters": [ { "id": "2965ad33-1401-47c9-8f4b-9b7126f87014", @@ -262,9 +258,6 @@ "quote": "", "delimiter": ",", "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where SourceResourceId contains \"microsoft.compute\"\r\n| distinct Operation", - "crossComponentResources": [ - "/subscriptions/378e5be3-6163-4ae6-9b38-9f10c1429f24/resourceGroups/ingestion_e2e/providers/microsoft.operationalinsights/workspaces/canaryinestiontest" - ], "typeSettings": { "additionalResourceOptions": [ "value::all" @@ -290,9 +283,6 @@ "quote": "", "delimiter": ",", "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where SourceResourceId contains \"microsoft.compute\"\r\n| distinct Status", - "crossComponentResources": [ - "/subscriptions/378e5be3-6163-4ae6-9b38-9f10c1429f24/resourceGroups/ingestion_e2e/providers/microsoft.operationalinsights/workspaces/canaryinestiontest" - ], "typeSettings": { "additionalResourceOptions": [ "value::all" @@ -339,9 +329,6 @@ "type": 9, "content": { "version": "KqlParameterItem/1.0", - "crossComponentResources": [ - "/subscriptions/378e5be3-6163-4ae6-9b38-9f10c1429f24/resourceGroups/ingestion_e2e/providers/microsoft.operationalinsights/workspaces/canaryinestiontest" - ], "parameters": [ { "id": "2965ad33-1401-47c9-8f4b-9b7126f87014", @@ -449,9 +436,6 @@ "quote": "", "delimiter": ",", "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| distinct Operation", - "crossComponentResources": [ - "/subscriptions/378e5be3-6163-4ae6-9b38-9f10c1429f24/resourceGroups/ingestion_e2e/providers/microsoft.operationalinsights/workspaces/canaryinestiontest" - ], "typeSettings": { "additionalResourceOptions": [ "value::all" @@ -477,9 +461,6 @@ "quote": "", "delimiter": ",", "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| distinct Status", - "crossComponentResources": [ - "/subscriptions/378e5be3-6163-4ae6-9b38-9f10c1429f24/resourceGroups/ingestion_e2e/providers/microsoft.operationalinsights/workspaces/canaryinestiontest" - ], "typeSettings": { "additionalResourceOptions": [ "value::all" From 2f7468e25e8850528da9c12ac521b4a713bd725b Mon Sep 17 00:00:00 2001 From: tmalhotra2428 <108122940+tmalhotra2428@users.noreply.github.com> Date: Wed, 6 Mar 2024 12:04:06 +0530 Subject: [PATCH 06/10] Update ASR Job History.workbook From 336085d11850f081d6b903fc9e86ddb297bbf44d Mon Sep 17 00:00:00 2001 From: tmalhotra2428 <108122940+tmalhotra2428@users.noreply.github.com> Date: Wed, 6 Mar 2024 12:07:46 +0530 Subject: [PATCH 07/10] Update ASR Job History.workbook From d973c05d06a1af71019b3d00040fa32e5dff8fce Mon Sep 17 00:00:00 2001 From: tmalhotra2428 <108122940+tmalhotra2428@users.noreply.github.com> Date: Wed, 6 Mar 2024 12:34:01 +0530 Subject: [PATCH 08/10] Update ASR ReplicatedItems.workbook --- .../ASR ReplicatedItems.workbook | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Workbooks/Azure Backup/ASR ReplicatedItems/ASR ReplicatedItems.workbook b/Workbooks/Azure Backup/ASR ReplicatedItems/ASR ReplicatedItems.workbook index 8c9de3ecf5..b9af49bec2 100644 --- a/Workbooks/Azure Backup/ASR ReplicatedItems/ASR ReplicatedItems.workbook +++ b/Workbooks/Azure Backup/ASR ReplicatedItems/ASR ReplicatedItems.workbook @@ -201,7 +201,7 @@ "multiSelect": true, "quote": "", "delimiter": ",", - "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType contains \"Azure\" and RecoveryFabricType contains \"Azure\"\r\n| distinct tostring(split(tostring(todynamic(SourceResourceId)),\"/\")[2])", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\n_AzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType contains \"Azure\" and RecoveryFabricType contains \"Azure\"\r\n| distinct tostring(split(tostring(todynamic(SourceResourceId)),\"/\")[2])", "crossComponentResources": [ "{Workspaces}" ], @@ -229,7 +229,7 @@ "multiSelect": true, "quote": "", "delimiter": ",", - "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType contains \"Azure\" and RecoveryFabricType contains \"Azure\"\r\n| distinct tostring(split(SourceResourceId,'/')[4])", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\n_AzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType contains \"Azure\" and RecoveryFabricType contains \"Azure\"\r\n| distinct tostring(split(SourceResourceId,'/')[4])", "crossComponentResources": [ "{Workspaces}" ], @@ -332,7 +332,7 @@ "multiSelect": true, "quote": "", "delimiter": ",", - "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType !contains \"Azure\" or RecoveryFabricType !contains \"Azure\"\r\n| distinct tostring(split(tostring(todynamic(ResourceId)),\"/\")[2])", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\n_AzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType !contains \"Azure\" or RecoveryFabricType !contains \"Azure\"\r\n| distinct tostring(split(tostring(todynamic(ResourceId)),\"/\")[2])", "crossComponentResources": [ "{Workspaces}" ], @@ -360,7 +360,7 @@ "multiSelect": true, "quote": "", "delimiter": ",", - "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType !contains \"Azure\" or RecoveryFabricType !contains \"Azure\"\r\n| distinct tostring(split(ResourceId,'/')[4])", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\n_AzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType !contains \"Azure\" or RecoveryFabricType !contains \"Azure\"\r\n| distinct tostring(split(ResourceId,'/')[4])", "crossComponentResources": [ "{Workspaces}" ], @@ -410,7 +410,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\");\r\nlet DatasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultLocationList = \"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet VaultSubscriptionList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet ReplicatedItem = '{SearchItemAzure}';\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType contains \"Azure\" and RecoveryFabricType contains \"Azure\"\r\n| mv-expand DatasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(DatasourceSubscriptionList)) or tostring(DatasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains ReplicatedItem\r\n| summarize healthyCount = countif(ReplicationStatus == \"Normal\"), totalCount = count() by bin(TimeGenerated, 1d)", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\");\r\nlet DatasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultLocationList = \"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet VaultSubscriptionList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet ReplicatedItem = '{SearchItemAzure}';\r\n_AzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType contains \"Azure\" and RecoveryFabricType contains \"Azure\"\r\n| mv-expand DatasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(DatasourceSubscriptionList)) or tostring(DatasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains ReplicatedItem\r\n| summarize healthyCount = countif(ReplicationStatus == \"Normal\"), totalCount = count() by bin(TimeGenerated, 1d)", "size": 3, "aggregation": 5, "showAnalytics": true, @@ -520,7 +520,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultLocationList = \"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet ReplicatedItem = '{SearchItemHybrid}';\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType !contains \"Azure\" or RecoveryFabricType !contains \"Azure\"\r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains ReplicatedItem\r\n| summarize healthyCount = countif(ReplicationStatus == \"Normal\"), totalCount = count() by bin(TimeGenerated, 1d)", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultLocationList = \"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet ReplicatedItem = '{SearchItemHybrid}';\r\n_AzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType !contains \"Azure\" or RecoveryFabricType !contains \"Azure\"\r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains ReplicatedItem\r\n| summarize healthyCount = countif(ReplicationStatus == \"Normal\"), totalCount = count() by bin(TimeGenerated, 1d)", "size": 3, "aggregation": 5, "showAnalytics": true, @@ -694,7 +694,7 @@ "type": 2, "description": "Page number", "isRequired": true, - "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\"); \r\nlet datasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet ReplicatedItem = '{SearchItemAzure}';\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType contains \"Azure\" and RecoveryFabricType contains \"Azure\"\r\n| mv-expand datasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(datasourceSubscriptionList)) or tostring(datasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains ReplicatedItem\r\n| summarize arg_max(TimeGenerated, *) by ReplicatedItemId\r\n| summarize c=count()\r\n| project num = (c-1)/toint('{RowsPerPageAzure}') + 1\r\n| project nums = range(1,num,1), num\r\n| mvexpand nums\r\n| project nums = tostring(nums), num = strcat(tostring(nums),\" of \",tostring(num))\r\n\r\n", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\"); \r\nlet datasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet ReplicatedItem = '{SearchItemAzure}';\r\n_AzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType contains \"Azure\" and RecoveryFabricType contains \"Azure\"\r\n| mv-expand datasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(datasourceSubscriptionList)) or tostring(datasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains ReplicatedItem\r\n| summarize arg_max(TimeGenerated, *) by ReplicatedItemId\r\n| summarize c=count()\r\n| project num = (c-1)/toint('{RowsPerPageAzure}') + 1\r\n| project nums = range(1,num,1), num\r\n| mvexpand nums\r\n| project nums = tostring(nums), num = strcat(tostring(nums),\" of \",tostring(num))\r\n\r\n", "crossComponentResources": [ "{Workspaces}" ], @@ -755,7 +755,7 @@ "type": 2, "description": "Page number", "isRequired": true, - "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet ReplicatedItem = '{SearchItemHybrid}';\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType !contains \"Azure\" or RecoveryFabricType !contains \"Azure\"\r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains ReplicatedItem\r\n| summarize arg_max(TimeGenerated, *) by ReplicatedItemId\r\n| summarize c=count()\r\n| project num = (c-1)/toint('{RowsPerPageHybrid}') + 1\r\n| project nums = range(1,num,1), num\r\n| mvexpand nums\r\n| project nums = tostring(nums), num = strcat(tostring(nums),\" of \",tostring(num))\r\n\r\n", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet ReplicatedItem = '{SearchItemHybrid}';\r\n_AzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType !contains \"Azure\" or RecoveryFabricType !contains \"Azure\"\r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains ReplicatedItem\r\n| summarize arg_max(TimeGenerated, *) by ReplicatedItemId\r\n| summarize c=count()\r\n| project num = (c-1)/toint('{RowsPerPageHybrid}') + 1\r\n| project nums = range(1,num,1), num\r\n| mvexpand nums\r\n| project nums = tostring(nums), num = strcat(tostring(nums),\" of \",tostring(num))\r\n\r\n", "crossComponentResources": [ "{Workspaces}" ], @@ -791,7 +791,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\"); \r\nlet datasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet ReplicatedItem = '{SearchItemAzure}';\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType contains \"Azure\" and RecoveryFabricType contains \"Azure\"\r\n| mv-expand datasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(datasourceSubscriptionList)) or tostring(datasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains ReplicatedItem\r\n| summarize arg_max(TimeGenerated, *) by ReplicatedItemId\r\n| sort by ReplicatedItemId\r\n| extend row_num = row_number()\r\n| extend page_num = tostring(((row_num-1)/toint('{RowsPerPageAzure}') + 1))\r\n| where page_num has ('{PageAzure}')\r\n| extend LastTestFailoverDate = iff(isnull(LastSuccessfulTestFailoverTime), \"N/A\", tostring(LastSuccessfulTestFailoverTime))\r\n| project ReplicatedItem = ReplicatedItemFriendlyName, SubscriptionId = tostring(split(SourceResourceId,'/')[2]), ResourceGroup = tostring(split(SourceResourceId,'/')[4]),Vault = ResourceId,Location = VaultLocation,ReplicationHealth = ReplicationStatus,LastFailoverDate = LastTestFailoverDate, ReplicationHealthErrors = ReplicationHealthErrors\r\n", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\"); \r\nlet datasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet ReplicatedItem = '{SearchItemAzure}';\r\n_AzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType contains \"Azure\" and RecoveryFabricType contains \"Azure\"\r\n| mv-expand datasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(datasourceSubscriptionList)) or tostring(datasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains ReplicatedItem\r\n| summarize arg_max(TimeGenerated, *) by ReplicatedItemId\r\n| sort by ReplicatedItemId\r\n| extend row_num = row_number()\r\n| extend page_num = tostring(((row_num-1)/toint('{RowsPerPageAzure}') + 1))\r\n| where page_num has ('{PageAzure}')\r\n| extend LastTestFailoverDate = iff(isnull(LastSuccessfulTestFailoverTime), \"N/A\", tostring(LastSuccessfulTestFailoverTime))\r\n| project ReplicatedItem = ReplicatedItemFriendlyName, SubscriptionId = tostring(split(SourceResourceId,'/')[2]), ResourceGroup = tostring(split(SourceResourceId,'/')[4]),Vault = ResourceId,Location = VaultLocation,ReplicationHealth = ReplicationStatus,LastFailoverDate = LastTestFailoverDate, ReplicationHealthErrors = ReplicationHealthErrors\r\n", "size": 3, "showAnalytics": true, "title": "Items by replication health", @@ -1003,7 +1003,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet ReplicatedItem = '{SearchItemHybrid}';\r\nAzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType !contains \"Azure\" or RecoveryFabricType !contains \"Azure\"\r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains ReplicatedItem\r\n| summarize arg_max(TimeGenerated, *) by ReplicatedItemId\r\n| sort by ReplicatedItemId\r\n| extend row_num = row_number()\r\n| extend page_num = tostring(((row_num-1)/toint('{RowsPerPageHybrid}') + 1))\r\n| where page_num has ('{PageHybrid}')\r\n| extend LastTestFailoverDate = iff(isnull(LastSuccessfulTestFailoverTime), \"N/A\", tostring(LastSuccessfulTestFailoverTime))\r\n| project ReplicatedItem = ReplicatedItemFriendlyName, SubscriptionId = tostring(split(ResourceId,'/')[2]), ResourceGroup = tostring(split(ResourceId,'/')[4]),Vault = ResourceId,Location = VaultLocation,ReplicationHealth = ReplicationStatus,LastFailoverDate = LastTestFailoverDate, ReplicationHealthErrors = ReplicationHealthErrors\r\n", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet ReplicatedItem = '{SearchItemHybrid}';\r\n_AzureSiteRecovery_GetReplicatedItems(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName)\r\n| where PrimaryFabricType !contains \"Azure\" or RecoveryFabricType !contains \"Azure\"\r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains ReplicatedItem\r\n| summarize arg_max(TimeGenerated, *) by ReplicatedItemId\r\n| sort by ReplicatedItemId\r\n| extend row_num = row_number()\r\n| extend page_num = tostring(((row_num-1)/toint('{RowsPerPageHybrid}') + 1))\r\n| where page_num has ('{PageHybrid}')\r\n| extend LastTestFailoverDate = iff(isnull(LastSuccessfulTestFailoverTime), \"N/A\", tostring(LastSuccessfulTestFailoverTime))\r\n| project ReplicatedItem = ReplicatedItemFriendlyName, SubscriptionId = tostring(split(ResourceId,'/')[2]), ResourceGroup = tostring(split(ResourceId,'/')[4]),Vault = ResourceId,Location = VaultLocation,ReplicationHealth = ReplicationStatus,LastFailoverDate = LastTestFailoverDate, ReplicationHealthErrors = ReplicationHealthErrors\r\n", "size": 3, "showAnalytics": true, "title": "Items by replication health", From bb93b510ec8bfa7ee6a9028be5a18030cd10a84f Mon Sep 17 00:00:00 2001 From: tmalhotra2428 <108122940+tmalhotra2428@users.noreply.github.com> Date: Wed, 6 Mar 2024 12:38:15 +0530 Subject: [PATCH 09/10] Update ASR Job History.workbook --- .../ASR Job History/ASR Job History.workbook | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook b/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook index 56d1d10323..56cc3c028e 100644 --- a/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook +++ b/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook @@ -201,7 +201,7 @@ "multiSelect": true, "quote": "", "delimiter": ",", - "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where SourceResourceId contains \"microsoft.compute\"\r\n| distinct tostring(split(tostring(todynamic(SourceResourceId)),\"/\")[2])", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where SourceResourceId contains \"microsoft.compute\"\r\n| distinct tostring(split(tostring(todynamic(SourceResourceId)),\"/\")[2])", "crossComponentResources": [ "{Workspaces}" ], @@ -229,7 +229,7 @@ "multiSelect": true, "quote": "", "delimiter": ",", - "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where SourceResourceId contains \"microsoft.compute\"\r\n| distinct tostring(split(SourceResourceId,'/')[4])", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where SourceResourceId contains \"microsoft.compute\"\r\n| distinct tostring(split(SourceResourceId,'/')[4])", "crossComponentResources": [ "{Workspaces}" ], @@ -257,7 +257,7 @@ "multiSelect": true, "quote": "", "delimiter": ",", - "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where SourceResourceId contains \"microsoft.compute\"\r\n| distinct Operation", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where SourceResourceId contains \"microsoft.compute\"\r\n| distinct Operation", "typeSettings": { "additionalResourceOptions": [ "value::all" @@ -282,7 +282,7 @@ "multiSelect": true, "quote": "", "delimiter": ",", - "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where SourceResourceId contains \"microsoft.compute\"\r\n| distinct Status", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where SourceResourceId contains \"microsoft.compute\"\r\n| distinct Status", "typeSettings": { "additionalResourceOptions": [ "value::all" @@ -379,7 +379,7 @@ "multiSelect": true, "quote": "", "delimiter": ",", - "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| distinct tostring(split(tostring(todynamic(ResourceId)),\"/\")[2])", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| distinct tostring(split(tostring(todynamic(ResourceId)),\"/\")[2])", "crossComponentResources": [ "{Workspaces}" ], @@ -407,7 +407,7 @@ "multiSelect": true, "quote": "", "delimiter": ",", - "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| distinct tostring(split(ResourceId,'/')[4])", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| distinct tostring(split(ResourceId,'/')[4])", "crossComponentResources": [ "{Workspaces}" ], @@ -435,7 +435,7 @@ "multiSelect": true, "quote": "", "delimiter": ",", - "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| distinct Operation", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| distinct Operation", "typeSettings": { "additionalResourceOptions": [ "value::all" @@ -460,7 +460,7 @@ "multiSelect": true, "quote": "", "delimiter": ",", - "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| distinct Status", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| distinct Status", "typeSettings": { "additionalResourceOptions": [ "value::all" @@ -507,7 +507,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList = \"*\"; \r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\"); \r\nlet DatasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusAzure}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationAzure}\"); \r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemAzure}'),'{SearchItemAzure}',ReplicatedItemFriendlyName)\r\n| mv-expand DatasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(DatasourceSubscriptionList)) or tostring(DatasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n| sort by ReplicatedItemId\r\n| summarize count() by Status", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList = \"*\"; \r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\"); \r\nlet DatasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusAzure}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationAzure}\"); \r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemAzure}'),'{SearchItemAzure}',ReplicatedItemFriendlyName)\r\n| mv-expand DatasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(DatasourceSubscriptionList)) or tostring(DatasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n| sort by ReplicatedItemId\r\n| summarize count() by Status", "size": 3, "showAnalytics": true, "title": "Jobs by Status", @@ -564,7 +564,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultLocationList = \"*\"; \r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusHybrid}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationHybrid}\"); \r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemHybrid}'),'{SearchItemHybrid}',ReplicatedItemFriendlyName)\r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n| sort by ReplicatedItemId\r\n| summarize count() by Status", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultLocationList = \"*\"; \r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusHybrid}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationHybrid}\"); \r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemHybrid}'),'{SearchItemHybrid}',ReplicatedItemFriendlyName)\r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n| sort by ReplicatedItemId\r\n| summarize count() by Status", "size": 3, "showAnalytics": true, "title": "Jobs by Status", @@ -621,7 +621,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList = \"*\"; \r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\"); \r\nlet DatasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusAzure}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationAzure}\"); \r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemAzure}'),'{SearchItemAzure}',ReplicatedItemFriendlyName)\r\n| mv-expand DatasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(DatasourceSubscriptionList)) or tostring(DatasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n| sort by ReplicatedItemId\r\n| summarize count() by Operation", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList = \"*\"; \r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\"); \r\nlet DatasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusAzure}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationAzure}\"); \r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemAzure}'),'{SearchItemAzure}',ReplicatedItemFriendlyName)\r\n| mv-expand DatasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(DatasourceSubscriptionList)) or tostring(DatasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n| sort by ReplicatedItemId\r\n| summarize count() by Operation", "size": 3, "showAnalytics": true, "title": "Jobs by Operation", @@ -660,7 +660,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultLocationList = \"*\"; \r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusHybrid}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationHybrid}\"); \r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemHybrid}'),'{SearchItemHybrid}',ReplicatedItemFriendlyName)\r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n| sort by ReplicatedItemId\r\n| summarize count() by Operation", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultLocationList = \"*\"; \r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusHybrid}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationHybrid}\"); \r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemHybrid}'),'{SearchItemHybrid}',ReplicatedItemFriendlyName)\r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n| sort by ReplicatedItemId\r\n| summarize count() by Operation", "size": 3, "showAnalytics": true, "title": "Jobs by Operation", @@ -761,7 +761,7 @@ "type": 2, "description": "Page number", "isRequired": true, - "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList = \"*\";\r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\");\r\nlet datasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusAzure}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationAzure}\"); \r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\" \r\n| mv-expand datasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(datasourceSubscriptionList)) or tostring(datasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n|where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemAzure}'),'{SearchItemAzure}',ReplicatedItemFriendlyName)\r\n| sort by ReplicatedItemId\r\n| summarize c=count()\r\n| project num = (c-1)/toint('{RowsPerPageAzure}') + 1\r\n| project nums = range(1,num,1), num\r\n| mvexpand nums\r\n| project nums = tostring(nums), num = strcat(tostring(nums),\" of \",tostring(num))\r\n\r\n", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList = \"*\";\r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\");\r\nlet datasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusAzure}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationAzure}\"); \r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\" \r\n| mv-expand datasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(datasourceSubscriptionList)) or tostring(datasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n|where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemAzure}'),'{SearchItemAzure}',ReplicatedItemFriendlyName)\r\n| sort by ReplicatedItemId\r\n| summarize c=count()\r\n| project num = (c-1)/toint('{RowsPerPageAzure}') + 1\r\n| project nums = range(1,num,1), num\r\n| mvexpand nums\r\n| project nums = tostring(nums), num = strcat(tostring(nums),\" of \",tostring(num))\r\n\r\n", "crossComponentResources": [ "{Workspaces}" ], @@ -823,7 +823,7 @@ "type": 2, "description": "Page number2", "isRequired": true, - "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultLocationList = \"*\";\r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusHybrid}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationHybrid}\"); \r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\" \r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n|where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemHybrid}'),'{SearchItemHybrid}',ReplicatedItemFriendlyName)\r\n| sort by ReplicatedItemId\r\n| summarize c=count()\r\n| project num = (c-1)/toint('{RowsPerPageHybrid}') + 1\r\n| project nums = range(1,num,1), num\r\n| mvexpand nums\r\n| project nums = tostring(nums), num = strcat(tostring(nums),\" of \",tostring(num))\r\n\r\n", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultLocationList = \"*\";\r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusHybrid}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationHybrid}\"); \r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\" \r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n|where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemHybrid}'),'{SearchItemHybrid}',ReplicatedItemFriendlyName)\r\n| sort by ReplicatedItemId\r\n| summarize c=count()\r\n| project num = (c-1)/toint('{RowsPerPageHybrid}') + 1\r\n| project nums = range(1,num,1), num\r\n| mvexpand nums\r\n| project nums = tostring(nums), num = strcat(tostring(nums),\" of \",tostring(num))\r\n\r\n", "crossComponentResources": [ "{Workspaces}" ], @@ -859,7 +859,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList = \"*\";\r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\"); \r\nlet DatasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusAzure}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationAzure}\"); \r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| mv-expand DatasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(DatasourceSubscriptionList)) or tostring(DatasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemAzure}'),'{SearchItemAzure}',ReplicatedItemFriendlyName)\r\n| extend ReplicatedItemFinalName = iff(isempty(ReplicatedItemFriendlyName), \"N/A\", tostring(ReplicatedItemFriendlyName))\r\n| extend JobDurationMins = round(JobDurationMs/60000,2)\r\n| sort by ReplicatedItemId\r\n| extend row_num = row_number()\r\n| extend page_num = tostring(((row_num-1)/toint('{RowsPerPageAzure}') + 1))\r\n| where page_num has ('{PageAzure}')\r\n| project ReplicatedItemName = ReplicatedItemFinalName,Vault = ResourceId,SubscriptionId,Location = VaultLocation,JobStartTime = StartTime,JobOperation = Operation,JobDurationMins,JobStatus = Status\r\n\r\n", + "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList = \"*\";\r\nlet DatasourceResourceGroupList = todynamic( @\"{DatasourceResourceGroup}\"); \r\nlet DatasourceSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{DatasourceSubscription}\"));\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusAzure}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationAzure}\"); \r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| mv-expand DatasourceSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[2])) == tolower(tostring(DatasourceSubscriptionList)) or tostring(DatasourceSubscriptionList) == \"*\"\r\n| mv-expand DatasourceResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(SourceResourceId,'/')[4])) == tolower(tostring(DatasourceResourceGroupList)) or tostring(DatasourceResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemAzure}'),'{SearchItemAzure}',ReplicatedItemFriendlyName)\r\n| extend ReplicatedItemFinalName = iff(isempty(ReplicatedItemFriendlyName), \"N/A\", tostring(ReplicatedItemFriendlyName))\r\n| extend JobDurationMins = round(JobDurationMs/60000,2)\r\n| sort by ReplicatedItemId\r\n| extend row_num = row_number()\r\n| extend page_num = tostring(((row_num-1)/toint('{RowsPerPageAzure}') + 1))\r\n| where page_num has ('{PageAzure}')\r\n| project ReplicatedItemName = ReplicatedItemFinalName,Vault = ResourceId,SubscriptionId,Location = VaultLocation,JobStartTime = StartTime,JobOperation = Operation,JobDurationMins,JobStatus = Status\r\n\r\n", "size": 3, "showAnalytics": true, "title": "List of jobs in period", @@ -1042,7 +1042,7 @@ "type": 3, "content": { "version": "KqlItem/1.0", - "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultLocationList = \"*\";\r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusHybrid}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationHybrid}\"); \r\nAzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemHybrid}'),'{SearchItemHybrid}',ReplicatedItemFriendlyName)\r\n| extend ReplicatedItemFinalName = iff(isempty(ReplicatedItemFriendlyName), \"N/A\", tostring(ReplicatedItemFriendlyName))\r\n| extend JobDurationMins = round(JobDurationMs/60000,2)\r\n| sort by ReplicatedItemId\r\n| extend row_num = row_number()\r\n| extend page_num = tostring(((row_num-1)/toint('{RowsPerPageHybrid}') + 1))\r\n| where page_num has ('{PageHybrid}')\r\n| project ReplicatedItemName = ReplicatedItemFinalName,Vault = ResourceId,SubscriptionId,Location = VaultLocation,JobStartTime = StartTime,JobOperation = Operation,JobDurationMins,JobStatus = Status\r\n", + "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultLocationList = \"*\";\r\nlet VaultSubscriptionList = todynamic( replace(\"/subscriptions/\", \"\", @\"{VaultSubscription}\"));\r\nlet VaultResourceGroupList = todynamic( @\"{VaultResourceGroup}\");\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = todynamic( @\"{JobStatusHybrid}\"); \r\nlet JobOperationList = todynamic( @\"{JobOperationHybrid}\"); \r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| mv-expand VaultSubscriptionList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[2])) == tolower(tostring(VaultSubscriptionList)) or tostring(VaultSubscriptionList) == \"*\"\r\n| mv-expand VaultResourceGroupList to typeof(string)\r\n| where tolower(tostring(split(ResourceId,'/')[4])) == tolower(tostring(VaultResourceGroupList)) or tostring(VaultResourceGroupList) == \"*\"\r\n| where ReplicatedItemFriendlyName contains iff(isnotempty('{SearchItemHybrid}'),'{SearchItemHybrid}',ReplicatedItemFriendlyName)\r\n| extend ReplicatedItemFinalName = iff(isempty(ReplicatedItemFriendlyName), \"N/A\", tostring(ReplicatedItemFriendlyName))\r\n| extend JobDurationMins = round(JobDurationMs/60000,2)\r\n| sort by ReplicatedItemId\r\n| extend row_num = row_number()\r\n| extend page_num = tostring(((row_num-1)/toint('{RowsPerPageHybrid}') + 1))\r\n| where page_num has ('{PageHybrid}')\r\n| project ReplicatedItemName = ReplicatedItemFinalName,Vault = ResourceId,SubscriptionId,Location = VaultLocation,JobStartTime = StartTime,JobOperation = Operation,JobDurationMins,JobStatus = Status\r\n", "size": 3, "showAnalytics": true, "title": "List of jobs in period", From 5f87510ae8b04e929229ed24ddd27737a6cbc2cd Mon Sep 17 00:00:00 2001 From: tmalhotra2428 <108122940+tmalhotra2428@users.noreply.github.com> Date: Wed, 6 Mar 2024 13:22:01 +0530 Subject: [PATCH 10/10] Update ASR Job History.workbook --- .../ASR Job History/ASR Job History.workbook | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook b/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook index 56cc3c028e..c7b7bcfb2a 100644 --- a/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook +++ b/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook @@ -93,7 +93,8 @@ "showDefault": false }, "queryType": 1, - "resourceType": "microsoft.resourcegraph/resources" + "resourceType": "microsoft.resourcegraph/resources", + "value": [] }, { "id": "254167f1-3459-455a-9bc9-9df92ed8044b", @@ -151,6 +152,9 @@ "type": 9, "content": { "version": "KqlParameterItem/1.0", + "crossComponentResources": [ + "{Workspaces}" + ], "parameters": [ { "id": "2965ad33-1401-47c9-8f4b-9b7126f87014", @@ -258,6 +262,9 @@ "quote": "", "delimiter": ",", "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where SourceResourceId contains \"microsoft.compute\"\r\n| distinct Operation", + "crossComponentResources": [ + "{Workspaces}" + ], "typeSettings": { "additionalResourceOptions": [ "value::all" @@ -283,6 +290,9 @@ "quote": "", "delimiter": ",", "query": "let RangeStart = startofday({TimeRangeAzure:start});\r\nlet RangeEnd = iff(startofday({TimeRangeAzure:end}) == startofday(now()) ,startofday({TimeRangeAzure:end}) - 1d , startofday({TimeRangeAzure:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Azure\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| where SourceResourceId contains \"microsoft.compute\"\r\n| distinct Status", + "crossComponentResources": [ + "{Workspaces}" + ], "typeSettings": { "additionalResourceOptions": [ "value::all" @@ -329,6 +339,9 @@ "type": 9, "content": { "version": "KqlParameterItem/1.0", + "crossComponentResources": [ + "{Workspaces}" + ], "parameters": [ { "id": "2965ad33-1401-47c9-8f4b-9b7126f87014", @@ -365,7 +378,7 @@ "allowCustom": true }, "value": { - "durationMs": 259200000 + "durationMs": 7776000000 } }, { @@ -436,6 +449,9 @@ "quote": "", "delimiter": ",", "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| distinct Operation", + "crossComponentResources": [ + "{Workspaces}" + ], "typeSettings": { "additionalResourceOptions": [ "value::all" @@ -461,6 +477,9 @@ "quote": "", "delimiter": ",", "query": "let RangeStart = startofday({TimeRangeHybrid:start});\r\nlet RangeEnd = iff(startofday({TimeRangeHybrid:end}) == startofday(now()) ,startofday({TimeRangeHybrid:end}) - 1d , startofday({TimeRangeHybrid:end}));\r\nlet VaultSubscriptionList = \"*\";\r\nlet VaultLocationList =\"*\";\r\nlet VaultList = \"*\";\r\nlet VaultTypeList = \"*\";\r\nlet DatasourceTypeList = \"*\";\r\nlet ReplicatedItemName = \"*\";\r\nlet JobStatusList = \"*\";\r\nlet JobOperationList = \"*\";\r\n_AzureSiteRecovery_GetJobs(RangeStart, RangeEnd, VaultSubscriptionList, VaultLocationList, VaultList, VaultTypeList,DatasourceTypeList,ReplicatedItemName,JobStatusList,JobOperationList)\r\n| where ReplicationScenario contains \"Hybrid\"\r\n| where SourceType contains \"Vm\" or SourceType contains \"RecoveryPlan\"\r\n| distinct Status", + "crossComponentResources": [ + "{Workspaces}" + ], "typeSettings": { "additionalResourceOptions": [ "value::all" @@ -1228,7 +1247,7 @@ } ], "fallbackResourceIds": [ - "microsoft_azure_dataprotection" + "Azure Monitor" ], "$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json" }