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..c7b7bcfb2a --- /dev/null +++ b/Workbooks/Azure Backup/ASR Job History/ASR Job History.workbook @@ -0,0 +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", + "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", + "value": [] + }, + { + "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": 1, + "resourceType": "microsoft.resourcegraph/resources" + }, + "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": [ + "{Workspaces}" + ], + "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\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}" + ], + "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\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}" + ], + "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\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" + ], + "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\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" + ], + "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": 7776000000 + } + }, + { + "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\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}" + ], + "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\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}" + ], + "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\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" + ], + "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\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" + ], + "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\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", + "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\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", + "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\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", + "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\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", + "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\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}" + ], + "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\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}" + ], + "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\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", + "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\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", + "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": [ + "Azure Monitor" + ], + "$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json" +} 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..b9af49bec2 --- /dev/null +++ b/Workbooks/Azure Backup/ASR ReplicatedItems/ASR ReplicatedItems.workbook @@ -0,0 +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\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}" + ], + "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\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}" + ], + "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\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}" + ], + "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\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}" + ], + "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\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, + "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\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, + "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\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}" + ], + "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\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}" + ], + "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\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", + "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\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", + "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" +}