diff --git a/build/integration.tf b/build/integration.tf index fb579fb..e235753 100644 --- a/build/integration.tf +++ b/build/integration.tf @@ -9,8 +9,22 @@ locals { } ) workbook_integration_json = templatefile("${path.module}/templates/integration.tpl.json", { - "kql_integration_apim_resources_details" = jsonencode(local.kql_integration_apim_resources_details) + "kql_integration_apim_resources_details" = jsonencode(local.kql_integration_apim_resources_details) + "kql_integration_servicebus_resources_details" = jsonencode(local.kql_integration_servicebus_resources_details) + "kql_integration_servicebus_resources_details_summary" = jsonencode(local.kql_integration_servicebus_resources_details_summary) }) + kql_integration_servicebus_resources_details = templatefile( + "${path.module}/template_kql/integration/integration_servicebus_resources_details.kql", + { + "extend_resource" = local.kql_extend_resource + } + ) + kql_integration_servicebus_resources_details_summary = templatefile( + "${path.module}/template_kql/integration/integration_servicebus_resources_details_summary.kql", + { + "extend_resource" = local.kql_extend_resource + } + ) } resource "random_uuid" "workbook_name_integration" { keepers = { diff --git a/build/template_kql/common/calculate_score.kql b/build/template_kql/common/calculate_score.kql index 310c604..9c05891 100644 --- a/build/template_kql/common/calculate_score.kql +++ b/build/template_kql/common/calculate_score.kql @@ -45,4 +45,6 @@ extend ReliabilityScore = case( // ASRs contain multiple VM resources that are configured for replication and therefore maintain status in each of them. If none of the VMs are replicated, both the OK status and the NG status will be null. This means that if the OK status is calculated in the same way as other resources, by adding the OK statuses, the score will be zero. // So, for ASR, if even one VM has an NG status, that status is treated as 0 and the score is calculated by subtracting the status of that status from 1. Type == 'microsoft.recoveryservices/vaults', ((1-NoAsrSucceededState) + (1-NoAsrSucceededReplHealth) + (1-NoAsrSucceededFailoverHealth) + (1-NoAsrSucceededProtectionStateDesc) + (1-NoAsrSucceededReplicationAgentUpdate)) * 100 / (5 * UniqueResourceTotal), + // Service Bus - 5 checks // score = (Failed Status + Non-Premium SKU + No Availability Zone + Outdated TLS version + Capacity < 2) + Type == 'microsoft.servicebus/namespaces', (SucceededStateCount + PremiumSkuCount + AvZoneCount + NAAvZoneCount + MeetMinTLSVersionCount + Gt1CapacityCount) * 100 / (5 * ResourceTotal), 0) diff --git a/build/template_kql/common/extend_resource.kql b/build/template_kql/common/extend_resource.kql index 98711c0..987060a 100644 --- a/build/template_kql/common/extend_resource.kql +++ b/build/template_kql/common/extend_resource.kql @@ -37,6 +37,7 @@ on id (type == 'microsoft.dbforpostgresql/flexibleservers') or (type == 'microsoft.cache/redis') or (type == "microsoft.apimanagement/service") or + (type== 'microsoft.servicebus/namespaces') or (type == "microsoft.storage/storageaccounts" or type == "microsoft.classicstorage/storageaccounts") or (type == "microsoft.network/azurefirewalls") or (type == "microsoft.network/frontdoors") or @@ -97,6 +98,7 @@ on id type == 'microsoft.dbforpostgresql/flexibleservers', tostring(properties.state), type == 'microsoft.cache/redis', tostring(properties.provisioningState), type == "microsoft.apimanagement/service", tostring(properties.provisioningState), + type == 'microsoft.servicebus/namespaces',tostring(properties.provisioningState), type contains "storageaccounts", tostring(properties.provisioningState), type == "microsoft.network/azurefirewalls", tostring(properties.provisioningState), type == "microsoft.network/frontdoors", tostring(properties.resourceState), @@ -123,6 +125,7 @@ on id type == 'microsoft.dbforpostgresql/flexibleservers', tostring(sku.tier), type == 'microsoft.cache/redis', tostring(properties.sku.name), type == "microsoft.apimanagement/service", tostring(sku.name), + type == 'microsoft.servicebus/namespaces', tostring(sku.name), type contains 'storageaccounts', tostring(replace('-', '_', tostring(iff(type =~ "microsoft.storage/storageaccounts", sku.name, properties.accountType)))), type == "microsoft.network/azurefirewalls", tostring(properties.sku.name), type == "microsoft.network/frontdoors", "classic_frontdoor", @@ -167,6 +170,7 @@ on id ), (type == 'microsoft.cache/redis'), coalesce(tostring(array_length(parse_json(zones))), 'Not Configured'), (type == "microsoft.apimanagement/service"), coalesce(tostring(array_length(parse_json(zones))), 'Not Configured'), + (type == 'microsoft.servicebus/namespaces'), iff(properties.zoneRedundant == 'true', 'Configured', 'Not Configured'), (type contains 'storageaccounts'), case(split(skuName, '_', 1)[0] contains "zrs", "Configured", "Not Configured"), (type == "microsoft.network/azurefirewalls"), iif(isnotnull(zones), "Configured", "Not Configured"), (type == "microsoft.network/frontdoors"), "Not Applicable", @@ -207,6 +211,7 @@ on id type == 'microsoft.dbforpostgresql/flexibleservers', "Not Applicable", type == 'microsoft.cache/redis', "Not Applicable", type == "microsoft.apimanagement/service", "Not Applicable", + type == "microsoft.servicebus/namespaces", "Not Applicable", type contains "storageaccounts", "Not Applicable", type == "microsoft.network/azurefirewalls", "Not Applicable", type == "microsoft.network/frontdoors", "Not Applicable", @@ -233,6 +238,7 @@ on id type == 'microsoft.dbforpostgresql/flexibleservers', tostring(sku.capacity), type == 'microsoft.cache/redis', strcat(properties.sku.family, properties.sku.capacity), type == "microsoft.apimanagement/service", tostring(sku.capacity), + type == "microsoft.servicebus/namespaces",tostring(iif(isempty(sku.capacity), "Not Applicable", sku.capacity)), type contains "storageaccounts", "Not Applicable", type == "microsoft.network/azurefirewalls", "Not Applicable", type == "microsoft.network/frontdoors", "Not Applicable", @@ -259,6 +265,7 @@ on id type == 'microsoft.dbforpostgresql/flexibleservers', 'Not Applicable', type == 'microsoft.cache/redis', 'Not Applicable', type == "microsoft.apimanagement/service", "Not Applicable", + type == "microsoft.servicebus/namespaces", "Not Applicable", type contains "storageaccounts", "Not Applicable", type == "microsoft.network/azurefirewalls", "Not Applicable", type == "microsoft.network/frontdoors", "Not Applicable", @@ -285,6 +292,7 @@ on id type == 'microsoft.dbforpostgresql/flexibleservers', 'Not Applicable', type == 'microsoft.cache/redis', 'Not Applicable', type == "microsoft.apimanagement/service", tostring(properties.platformVersion), //Field Override + type == "microsoft.servicebus/namespaces", "Not Applicable", type contains "storageaccounts", tostring(split(skuName, '_', 0)[0]), type == "microsoft.network/azurefirewalls", "Not Applicable", type == "microsoft.network/frontdoors", "Not Applicable", @@ -312,6 +320,7 @@ on id type == 'microsoft.dbforpostgresql/flexibleservers', "Not Applicable", type == 'microsoft.cache/redis', 'Not Applicable', type == "microsoft.apimanagement/service", tostring(properties.additionalLocations), + (type == "microsoft.servicebus/namespaces"), "Not Applicable", type contains "storageaccounts", case( // Use the following query to get 3+0 regions: az account list-locations -o table --query '[?availabilityZoneMappings && (!metadata.pairedRegion || length(metadata.pairedRegion) == `0`)]' location in~ ('qatarcentral', 'polandcentral', 'israelcentral', 'italynorth') and split(skuName, '_', 1)[0] startswith "zrs" , 'Configured', @@ -353,6 +362,7 @@ on id type == 'microsoft.dbformysql/flexibleservers', case(properties.haEnabled == "Enabled", "Configured", "Not Applicable"), type == 'microsoft.cache/redis', 'Not Applicable', type == "microsoft.apimanagement/service", "Not Applicable", + (type == "microsoft.servicebus/namespaces"), "Not Applicable", type contains "storageaccounts", "Not Applicable", type == "microsoft.network/azurefirewalls", "Not Applicable", type == "microsoft.network/frontdoors", "Not Applicable", @@ -370,6 +380,7 @@ on id (type == 'microsoft.documentdb/databaseaccounts' and properties.enableMultipleWriteLocations == "true"), "Enabled", (type == 'microsoft.cache/redis'), 'Not Applicable', (type == "microsoft.apimanagement/service"), "Not Applicable", + (type == "microsoft.servicebus/namespaces"), "Not Applicable", (type contains "storageaccounts"), "Not Applicable", (type == "microsoft.network/azurefirewalls"), "Not Applicable", (type == "microsoft.network/frontdoors"), "Not Applicable", @@ -389,6 +400,7 @@ on id (type == 'microsoft.dbforpostgresql/flexibleservers'), "Not Applicable", (type == 'microsoft.cache/redis'), 'Not Applicable', (type == "microsoft.apimanagement/service"), "Not Applicable", + (type == "microsoft.servicebus/namespaces"), "Not Applicable", (type contains "storageaccounts"), "Not Applicable", (type == "microsoft.network/azurefirewalls"), "Not Applicable", (type == "microsoft.network/frontdoors"), "Not Applicable", @@ -410,6 +422,7 @@ on id (type == 'microsoft.dbforpostgresql/flexibleservers'), tostring(properties.replicationRole), (type == 'microsoft.cache/redis'), 'Not Applicable', (type == "microsoft.apimanagement/service"), "Not Applicable", + (type == "microsoft.servicebus/namespaces"), "Not Applicable", (type contains "storageaccounts"), tostring(split(skuName, '_', 1)[0]), (type == "microsoft.network/azurefirewalls"), "Not Applicable", (type == "microsoft.network/frontdoors"), "Not Applicable", @@ -421,6 +434,10 @@ on id (type == "microsoft.recoveryservices/vaults"), "Not Applicable", "Undefined" ) +| extend MinTLSVersion = case( + type == "microsoft.servicebus/namespaces", tostring(properties.minimumTlsVersion), + "Undefined" +) | project Type = tolower(type), SkuName = tolower(skuName), @@ -442,6 +459,7 @@ on id StorageAutogrow = tolower(StorageAutogrow), ReplicationRole = tolower(ReplicationRole), Environment = environment, + MinTLSVersion, properties | join kind = leftouter ( recoveryservicesresources diff --git a/build/template_kql/common/summarize_score.kql b/build/template_kql/common/summarize_score.kql index 3f45362..41f66a6 100644 --- a/build/template_kql/common/summarize_score.kql +++ b/build/template_kql/common/summarize_score.kql @@ -84,4 +84,6 @@ summarize NAGen2VnetGwCount=dcountif(Name, OSDisk == "none" and Type == 'microsoft.network/virtualnetworkgateways'), ActiveActiveVnetGwCount=dcountif(Name, ReadReplica == "true" and Type == 'microsoft.network/virtualnetworkgateways'), NAActiveActiveVnetGwCount=dcountif(Name, ReadReplica == "not applicable" and Type == 'microsoft.network/virtualnetworkgateways'), - Stv2ApimCount=dcountif(Name, OSDisk == "stv2" and Type == 'microsoft.apimanagement/service') + Stv2ApimCount=dcountif(Name, OSDisk == "stv2" and Type == 'microsoft.apimanagement/service'), + MeetMinTLSVersionCount=dcountif(Name, todouble(MinTLSVersion) >= 1.2), + NoMeetMinTLSVersionCount=dcountif(Name, todouble(MinTLSVersion) < 1.2) diff --git a/build/template_kql/integration/integration_servicebus_resources_details.kql b/build/template_kql/integration/integration_servicebus_resources_details.kql new file mode 100644 index 0000000..5dd686a --- /dev/null +++ b/build/template_kql/integration/integration_servicebus_resources_details.kql @@ -0,0 +1,3 @@ +${extend_resource} +| project Type, SkuName, Kind, SubscriptionId, Name, State, Location, ResourceGroup, AvailabilityZone, toint(Capacity), MinTLSVersion, Environment +| where Type == 'microsoft.servicebus/namespaces' diff --git a/build/template_kql/integration/integration_servicebus_resources_details_summary.kql b/build/template_kql/integration/integration_servicebus_resources_details_summary.kql new file mode 100644 index 0000000..77a9ea3 --- /dev/null +++ b/build/template_kql/integration/integration_servicebus_resources_details_summary.kql @@ -0,0 +1,5 @@ +${extend_resource} +| project Type, Name, Zones, SkuName, State, AvailabilityZone, MinTLSVersion, Capacity +| where Type =='microsoft.servicebus/namespaces' +| summarize ResourceTotal=count(Name), NotSucceeded=dcountif(Name, State != "succeeded"), NotPremium=dcountif(Name, SkuName!= "premium"), NoMultipleZones=dcountif(Name, AvailabilityZone == "not configured") +,NoMinimumTLSVersion=dcountif(Name,todouble(MinTLSVersion)<1.2), CapacityNotConfigured=dcountif(Name, toint(Capacity)<2) diff --git a/build/template_kql/summary/summary_reliability_score_by_resource_environment.kql b/build/template_kql/summary/summary_reliability_score_by_resource_environment.kql index 166513d..d057045 100644 --- a/build/template_kql/summary/summary_reliability_score_by_resource_environment.kql +++ b/build/template_kql/summary/summary_reliability_score_by_resource_environment.kql @@ -1,5 +1,5 @@ ${extend_resource} -| project Type, SkuName, Kind, SubscriptionId, Name, State, Location, ResourceGroup, Zones, AvailabilityZone, AvailabilitySet, Capacity, FaultDomain, OSDisk, ReadReplica, AutomaticFailover, MultipleWriteLocations, StorageAutogrow, ReplicationRole, Backup = tolower(Backup), Environment, +| project Type, SkuName, Kind, SubscriptionId, Name, State, Location, ResourceGroup, Zones, AvailabilityZone, AvailabilitySet, Capacity, FaultDomain, OSDisk, ReadReplica, AutomaticFailover, MultipleWriteLocations, StorageAutogrow, ReplicationRole, Backup = tolower(Backup), MinTLSVersion, Environment, vmId, replicationHealth, failoverHealth, protectionStateDescription, isReplicationAgentUpdateRequired // This is for calculating the score for ASRs | ${summarize_score} by Name, Type, Environment diff --git a/build/template_kql/summary/summary_workbook_reliability_score.kql b/build/template_kql/summary/summary_workbook_reliability_score.kql index a8356a8..0f87234 100644 --- a/build/template_kql/summary/summary_workbook_reliability_score.kql +++ b/build/template_kql/summary/summary_workbook_reliability_score.kql @@ -1,5 +1,5 @@ ${extend_resource} -| project Type, SkuName, Kind, SubscriptionId, Name, State, Location, ResourceGroup, Zones, AvailabilityZone, AvailabilitySet, Capacity, FaultDomain, OSDisk, ReadReplica, AutomaticFailover, MultipleWriteLocations, StorageAutogrow, ReplicationRole, Backup = tolower(Backup), Environment, +| project Type, SkuName, Kind, SubscriptionId, Name, State, Location, ResourceGroup, Zones, AvailabilityZone, AvailabilitySet, Capacity, FaultDomain, OSDisk, ReadReplica, AutomaticFailover, MultipleWriteLocations, StorageAutogrow, ReplicationRole, Backup = tolower(Backup), MinTLSVersion, Environment, vmId, replicationHealth, failoverHealth, protectionStateDescription, isReplicationAgentUpdateRequired // This is for calculating the score for ASRs | ${summarize_score} by Type, Environment diff --git a/build/templates/compute.tpl.json b/build/templates/compute.tpl.json index 33d0efc..aa1d038 100644 --- a/build/templates/compute.tpl.json +++ b/build/templates/compute.tpl.json @@ -351,13 +351,14 @@ }, { "operator": "==", - "thresholdValue": "vm deallocated", - "representation": "gray", + "thresholdValue": "vm stopped", + "representation": "redBright", "text": "{0}{1}" }, { "operator": "Default", "thresholdValue": null, + "representation": "gray", "text": "{0}{1}" } ] diff --git a/build/templates/databases.tpl.json b/build/templates/databases.tpl.json index 8d66cee..0e23719 100644 --- a/build/templates/databases.tpl.json +++ b/build/templates/databases.tpl.json @@ -3499,50 +3499,31 @@ "showIcon": true } }, - { - "columnMatch": "Subscription", - "formatter": 13, - "formatOptions": { - "linkTarget": "Resource", - "showIcon": true - } - }, { "columnMatch": "Type", "formatter": 5 }, - - { - "columnMatch": "SubscriptionId", - "formatter": 5 - }, - { - "columnMatch": "Name", - "formatter": 5 - }, - { - "columnMatch": "location", - "formatter": 17 - }, - { - "columnMatch": "Zones", - "formatter": 5 - }, { - "columnMatch": "Status", + "columnMatch": "SkuName", "formatter": 18, "formatOptions": { "thresholdsOptions": "colors", "thresholdsGrid": [ { - "operator": "contains", - "thresholdValue": "Stopped", + "operator": "==", + "thresholdValue": "burstable", "representation": "orange", "text": "{0}{1}" }, { - "operator": "contains", - "thresholdValue": "Available", + "operator": "==", + "thresholdValue": "memoryoptimized", + "representation": "green", + "text": "{0}{1}" + }, + { + "operator": "==", + "thresholdValue": "generalpurpose", "representation": "green", "text": "{0}{1}" }, @@ -3554,6 +3535,14 @@ ] } }, + { + "columnMatch": "SubscriptionId", + "formatter": 5 + }, + { + "columnMatch": "Name", + "formatter": 5 + }, { "columnMatch": "State", "formatter": 18, @@ -3582,27 +3571,35 @@ } }, { - "columnMatch": "SkuName", + "columnMatch": "Location", + "formatter": 17 + }, + { + "columnMatch": "Zones", + "formatter": 5 + }, + { + "columnMatch": "AvailabilityZone", "formatter": 18, "formatOptions": { - "thresholdsOptions": "colors", + "thresholdsOptions": "icons", "thresholdsGrid": [ { "operator": "==", - "thresholdValue": "burstable", - "representation": "orange", + "thresholdValue": "not applicable", + "representation": "more", "text": "{0}{1}" }, { "operator": "==", - "thresholdValue": "memoryoptimized", - "representation": "green", - "text": "{0}{1}" + "thresholdValue": "not configured", + "representation": "2", + "text": "not configured" }, { "operator": "==", - "thresholdValue": "generalpurpose", - "representation": "green", + "thresholdValue": "configured", + "representation": "success", "text": "{0}{1}" }, { @@ -3614,53 +3611,66 @@ } }, { - "columnMatch": "AvailabilityZone", + "columnMatch": "AutomaticFailover", "formatter": 18, "formatOptions": { "thresholdsOptions": "icons", "thresholdsGrid": [ { "operator": "==", - "thresholdValue": "not applicable", - "representation": "more", + "thresholdValue": "not configured", + "representation": "2", "text": "{0}{1}" }, { "operator": "==", - "thresholdValue": "not configured", - "representation": "2", - "text": "not configured" + "thresholdValue": "same zone", + "representation": "success", + "text": "{0}{1}" }, { "operator": "==", - "thresholdValue": "configured", + "thresholdValue": "not applicable", + "representation": "more", + "text": "{0}{1}" + }, + { + "operator": "==", + "thresholdValue": "zone redundant", "representation": "success", "text": "{0}{1}" }, { "operator": "Default", "thresholdValue": null, + "representation": null, "text": "{0}{1}" } ] } }, { - "columnMatch": "Environment", + "columnMatch": "GeoBackup", "formatter": 18, "formatOptions": { - "thresholdsOptions": "colors", + "thresholdsOptions": "icons", "thresholdsGrid": [ { "operator": "contains", - "thresholdValue": "prod", - "representation": "redBright", + "thresholdValue": "enabled", + "representation": "success", "text": "{0}{1}" }, { "operator": "contains", - "thresholdValue": "Prod", - "representation": "redBright", + "thresholdValue": "disabled", + "representation": "2", + "text": "{0}{1}" + }, + { + "operator": "contains", + "thresholdValue": "not applicable", + "representation": "more", "text": "{0}{1}" }, { @@ -3672,66 +3682,55 @@ } }, { - "columnMatch": "AutomaticFailover", + "columnMatch": "Environment", "formatter": 18, "formatOptions": { - "thresholdsOptions": "icons", + "thresholdsOptions": "colors", "thresholdsGrid": [ { - "operator": "==", - "thresholdValue": "not configured", - "representation": "2", - "text": "{0}{1}" - }, - { - "operator": "==", - "thresholdValue": "same zone", - "representation": "success", - "text": "{0}{1}" - }, - { - "operator": "==", - "thresholdValue": "not applicable", - "representation": "more", + "operator": "contains", + "thresholdValue": "prod", + "representation": "redBright", "text": "{0}{1}" }, { - "operator": "==", - "thresholdValue": "zone redundant", - "representation": "success", + "operator": "contains", + "thresholdValue": "Prod", + "representation": "redBright", "text": "{0}{1}" }, { "operator": "Default", "thresholdValue": null, - "representation": null, "text": "{0}{1}" } ] } }, { - "columnMatch": "GeoBackup", + "columnMatch": "Subscription", + "formatter": 13, + "formatOptions": { + "linkTarget": "Resource", + "showIcon": true + } + }, + { + "columnMatch": "Status", "formatter": 18, "formatOptions": { - "thresholdsOptions": "icons", + "thresholdsOptions": "colors", "thresholdsGrid": [ { "operator": "contains", - "thresholdValue": "enabled", - "representation": "success", - "text": "{0}{1}" - }, - { - "operator": "contains", - "thresholdValue": "disabled", - "representation": "2", + "thresholdValue": "Stopped", + "representation": "orange", "text": "{0}{1}" }, { "operator": "contains", - "thresholdValue": "not applicable", - "representation": "more", + "thresholdValue": "Available", + "representation": "green", "text": "{0}{1}" }, { @@ -3760,6 +3759,10 @@ "columnId": "SubscriptionId", "label": "Subscription" }, + { + "columnId": "State", + "label": "Status" + }, { "columnId": "ResourceGroup", "label": "Resource Group" @@ -3768,15 +3771,10 @@ "columnId": "AutomaticFailover", "label": "High Availability" }, - { - "columnId": "State", - "label": "Status" - }, { "columnId": "ReplicationRole", "label": "Replication Role" } - ] } }, @@ -3788,11 +3786,6 @@ "json": "Important\r\n\r\n* Azure Database for PostgreSQL - Single Server is on the retirement path. We strongly recommend for you to upgrade to Azure Database for PostgreSQL - Flexible Server. \r\n\r\n> For more information about migrating to Azure Database for PostgreSQL - Flexible Server, see [What's happening to Azure Database for PostgreSQL Single Server](https://learn.microsoft.com/en-us/azure/postgresql/single-server/whats-happening-to-postgresql-single-server)?", "style": "warning" }, - "conditionalVisibility": { - "parameterName": "Help", - "comparison": "isEqualTo", - "value": "Yes" - }, "name": "postgresql-single-retirement" }, { diff --git a/build/templates/integration.tpl.json b/build/templates/integration.tpl.json index 10bc3a2..a5098ae 100644 --- a/build/templates/integration.tpl.json +++ b/build/templates/integration.tpl.json @@ -155,6 +155,604 @@ }, "name": "parameters - 13" }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "items": [ + { + "type": 11, + "content": { + "version": "LinkItem/1.0", + "style": "tabs", + "links": [ + { + "id": "0f2833bb-ccf9-4292-a3d5-8f3070f906ef", + "cellValue": "selectedTab", + "linkTarget": "parameter", + "linkLabel": "API Management", + "subTarget": "APIM", + "style": "link" + }, + { + "id": "363da150-0a6e-4601-a225-b6d59a1be19e", + "cellValue": "selectedTab", + "linkTarget": "parameter", + "linkLabel": "Service Bus", + "subTarget": "ServiceBus", + "style": "link" + } + ] + }, + "name": "links - 0" + }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "items": [ + { + "type": 1, + "content": { + "json": "[SLA for Service Bus](https://azure.microsoft.com/support/legal/sla/)\r\n* For Service Bus Relays, we guarantee that at least 99.9% of the time, properly configured applications will be able to establish a connection to a deployed Relay.\r\n* For Service Bus Queues and Topics, we guarantee that at least 99.9% of the time , properly configured applications will be able to send or receive messages or perform other operations on a deployed Queue or Topic.", + "style": "upsell" + }, + "conditionalVisibility": { + "parameterName": "SLA", + "comparison": "isEqualTo", + "value": "Yes" + }, + "name": "text - 2 - Copy - Copy" + }, + { + "type": 1, + "content": { + "json": "* Please note the non-Premium tier is for non-production use cases and evaluations. It does not offer an SLA.\r\n* Its highly recommended to use Premium tier for Production environment as it covers High Availability, mission-critical messaging with queues and topics with Geo-Disaster Recovery and zone redundancy.\r\n\r\n", + "style": "info" + }, + "conditionalVisibility": { + "parameterName": "Help", + "comparison": "isEqualTo", + "value": "Yes" + }, + "name": "text - 3 - Copy - Copy - Copy" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": ${kql_integration_servicebus_resources_details_summary}, + "size": 3, + "title": "Service Bus - Recommendation Summary", + "showExportToExcel": true, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources", + "crossComponentResources": [ + "value::all" + ], + "gridSettings": { + "formatters": [ + { + "columnMatch": "Type", + "formatter": 5 + }, + { + "columnMatch": "Kind", + "formatter": 5 + }, + { + "columnMatch": "SubscriptionId", + "formatter": 5 + }, + { + "columnMatch": "Name", + "formatter": 5 + }, + { + "columnMatch": "Location", + "formatter": 17 + }, + { + "columnMatch": "AvailabilityZone", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "==", + "thresholdValue": "not applicable", + "representation": "more", + "text": "{0}{1}" + }, + { + "operator": "==", + "thresholdValue": "not configured", + "representation": "2", + "text": "{0}{1}" + }, + { + "operator": "==", + "thresholdValue": "1", + "representation": "2", + "text": "{0}{1}" + }, + { + "operator": "==", + "thresholdValue": "2", + "representation": "success", + "text": "{0}{1}" + }, + { + "operator": "==", + "thresholdValue": "3", + "representation": "success", + "text": "{0}{1}" + }, + { + "operator": "==", + "thresholdValue": "configured", + "representation": "success", + "text": "{0}{1}" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "Unknown", + "text": "{0}{1}" + } + ] + } + }, + { + "columnMatch": "Environment", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "colors", + "thresholdsGrid": [ + { + "operator": "contains", + "thresholdValue": "prod", + "representation": "redBright", + "text": "{0}{1}" + }, + { + "operator": "contains", + "thresholdValue": "Prod", + "representation": "redBright", + "text": "{0}{1}" + }, + { + "operator": "Default", + "thresholdValue": null, + "text": "{0}{1}" + } + ] + } + }, + { + "columnMatch": "OSDisk", + "formatter": 5 + }, + { + "columnMatch": "ReadReplica", + "formatter": 5 + }, + { + "columnMatch": "AutomaticFailover", + "formatter": 5 + }, + { + "columnMatch": "MultipleWriteLocations", + "formatter": 5 + }, + { + "columnMatch": "StorageAutogrow", + "formatter": 5 + }, + { + "columnMatch": "ReplicationRole", + "formatter": 5 + }, + { + "columnMatch": "properties", + "formatter": 5 + }, + { + "columnMatch": "Backup", + "formatter": 5 + }, + { + "columnMatch": "SubscriptionName", + "formatter": 5 + }, + { + "columnMatch": "Tier", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "==", + "thresholdValue": "Premium", + "representation": "success", + "text": "{0}{1}" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "2", + "text": "{0}{1}" + } + ] + } + } + ], + "labelSettings": [ + { + "columnId": "ResourceTotal", + "label": "Resource Total" + }, + { + "columnId": "NotPremium", + "label": "Non-Premium SKU" + }, + { + "columnId": "NoMultipleZones", + "label": "No Availability Zone" + }, + { + "columnId": "NotSucceeded", + "label": "Failed Status" + }, + { + "columnId": "NoMinimumTLSVersion", + "label": "Outdated TLS version" + }, + { + "columnId": "CapacityNotConfigured", + "label": "Capacity < 2" + } + ] + }, + "sortBy": [] + }, + "name": "kql_integration_servicebus_resources_details_summary" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": ${kql_integration_servicebus_resources_details}, + "size": 3, + "title": "Service Bus", + "showExportToExcel": true, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources", + "crossComponentResources": [ + "{Subscriptions}" + ], + "gridSettings": { + "formatters": [ + { + "columnMatch": "$gen_group", + "formatter": 13, + "formatOptions": { + "linkTarget": "Resource", + "showIcon": true + } + }, + { + "columnMatch": "Type", + "formatter": 5 + }, + { + "columnMatch": "SkuName", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "==", + "thresholdValue": "developer", + "representation": "2", + "text": "{0}{1}" + }, + { + "operator": "==", + "thresholdValue": "basic", + "representation": "2", + "text": "{0}{1}" + }, + { + "operator": "==", + "thresholdValue": "standard", + "representation": "2", + "text": "{0}{1}" + }, + { + "operator": "==", + "thresholdValue": "premium", + "representation": "success", + "text": "{0}{1}" + }, + { + "operator": "==", + "thresholdValue": "isolated", + "representation": "success", + "text": "{0}{1}" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "unknown", + "text": "{0}{1}" + } + ] + } + }, + { + "columnMatch": "Kind", + "formatter": 5 + }, + { + "columnMatch": "SubscriptionId", + "formatter": 5 + }, + { + "columnMatch": "Name", + "formatter": 5 + }, + { + "columnMatch": "State", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "colors", + "thresholdsGrid": [ + { + "operator": "==", + "thresholdValue": "succeeded", + "representation": "green", + "text": "{0}{1}" + }, + { + "operator": "!=", + "thresholdValue": "succeeded", + "representation": "orange", + "text": "{0}{1}" + }, + { + "operator": "Default", + "thresholdValue": null, + "text": "{0}{1}" + } + ] + } + }, + { + "columnMatch": "Location", + "formatter": 17 + }, + { + "columnMatch": "AvailabilityZone", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "==", + "thresholdValue": "not configured", + "representation": "2", + "text": "{0}{1}" + }, + { + "operator": "==", + "thresholdValue": "not applicable", + "representation": "more", + "text": "{0}{1}" + }, + { + "operator": "==", + "thresholdValue": "configured", + "representation": "success", + "text": "{0}{1}" + }, + { + "operator": "==", + "thresholdValue": "undefined", + "representation": "unknown", + "text": "{0}{1}" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "more", + "text": "{0}{1}" + } + ] + } + }, + { + "columnMatch": "Capacity", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": ">=", + "thresholdValue": "2", + "representation": "success", + "text": "{0}{1}" + }, + { + "operator": "==", + "thresholdValue": "1", + "representation": "2", + "text": "{0}{1}" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "more", + "text": "{0}not applicable" + } + ] + } + }, + { + "columnMatch": "MinTLSVersion", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "==", + "thresholdValue": "1.2", + "representation": "success", + "text": "{0}{1}" + }, + { + "operator": "!=", + "thresholdValue": "1.2", + "representation": "2", + "text": "{0}{1}" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "more", + "text": "{0}{1}" + } + ] + } + }, + { + "columnMatch": "Environment", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "colors", + "thresholdsGrid": [ + { + "operator": "contains", + "thresholdValue": "Prod", + "representation": "redBright", + "text": "{0}{1}" + }, + { + "operator": "contains", + "thresholdValue": "prod", + "representation": "redBright", + "text": "{0}{1}" + }, + { + "operator": "Default", + "thresholdValue": null, + "text": "{0}{1}" + } + ] + } + }, + { + "columnMatch": "Zones", + "formatter": 5 + }, + { + "columnMatch": "OSDisk", + "formatter": 5 + }, + { + "columnMatch": "ReadReplica", + "formatter": 5 + }, + { + "columnMatch": "AutomaticFailover", + "formatter": 5 + }, + { + "columnMatch": "MultipleWriteLocations", + "formatter": 5 + }, + { + "columnMatch": "StorageAutogrow", + "formatter": 5 + }, + { + "columnMatch": "ReplicationRole", + "formatter": 5 + }, + { + "columnMatch": "Backup", + "formatter": 5 + }, + { + "columnMatch": "SubscriptionName", + "formatter": 5 + }, + { + "columnMatch": "Tier", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "==", + "thresholdValue": "Premium", + "representation": "success", + "text": "{0}{1}" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "2", + "text": "{0}{1}" + } + ] + } + } + ], + "hierarchySettings": { + "treeType": 1, + "groupBy": [ + "SubscriptionId" + ], + "expandTopLevel": false, + "finalBy": "Name" + }, + "labelSettings": [ + { + "columnId": "SkuName", + "label": "SKU" + }, + { + "columnId": "SubscriptionId", + "label": "Subscription" + }, + { + "columnId": "ResourceGroup", + "label": "Resource Group" + } + ] + }, + "sortBy": [] + }, + "name": "kql_integration_servicebus_resources_details" + } + ] + }, + "conditionalVisibility": { + "parameterName": "selectedTab", + "comparison": "isEqualTo", + "value": "ServiceBus" + }, + "name": "Service Bus" + }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "items": [ { "type": 1, "content": { @@ -526,4 +1124,21 @@ "name": "kql_integration_apim_resources_details" } ] + }, + "conditionalVisibility": { + "parameterName": "selectedTab", + "comparison": "isEqualTo", + "value": "APIM" + }, + "name": "API Management" + } + ] + }, + "name": "Integration" + } + ], + "fallbackResourceIds": [ + "Azure Monitor" + ], + "$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json" }