diff --git a/samples/features/azure-arc/workbooks/Azure Arc Sql Servers - Best Practices Assessment.workbook b/samples/features/azure-arc/workbooks/Azure Arc Sql Servers - Best Practices Assessment.workbook index df04edf6..e30077d2 100644 --- a/samples/features/azure-arc/workbooks/Azure Arc Sql Servers - Best Practices Assessment.workbook +++ b/samples/features/azure-arc/workbooks/Azure Arc Sql Servers - Best Practices Assessment.workbook @@ -1,356 +1,530 @@ { - "version": "Notebook/1.0", - "items": [ - { - "type": 1, - "content": { - "json": "# Azure Arc SQL Servers - Best Practices Assessment" + "version": "Notebook/1.0", + "items": [ + { + "type": 1, + "content": { + "json": "# Azure Arc SQL Servers - Best Practices Assessment" + }, + "name": "text - 2" }, - "name": "text - 2" - }, - { - "type": 9, - "content": { - "version": "KqlParameterItem/1.0", - "crossComponentResources": [ - "{Subscription}" - ], - "parameters": [ - { - "id": "5ccbaa77-2a42-4a07-a877-b5a3a6297703", - "version": "KqlParameterItem/1.0", - "name": "Subscription", - "type": 6, - "isRequired": true, - "multiSelect": true, - "quote": "'", - "delimiter": ",", - "typeSettings": { - "additionalResourceOptions": [ + { + "type": 9, + "content": { + "version": "KqlParameterItem/1.0", + "crossComponentResources": [ + "{LogAnalitycsWorkpace}" + ], + "parameters": [ + { + "id": "5ccbaa77-2a42-4a07-a877-b5a3a6297703", + "version": "KqlParameterItem/1.0", + "name": "Subscription", + "type": 6, + "isRequired": true, + "multiSelect": true, + "quote": "'", + "delimiter": ",", + "typeSettings": { + "additionalResourceOptions": [ + "value::all" + ], + "includeAll": true, + "showDefault": false + }, + "timeContext": { + "durationMs": 86400000 + }, + "value": [ "value::all" + ] + }, + { + "id": "f932fba5-395b-423d-a9b0-538714e1e553", + "version": "KqlParameterItem/1.0", + "name": "LogAnalitycsWorkpace", + "type": 5, + "query": "where type =~ 'microsoft.operationalinsights/workspaces'\r\n| project id", + "crossComponentResources": [ + "{Subscription}" ], - "includeAll": true, - "showDefault": false + "typeSettings": { + "additionalResourceOptions": [] + }, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources", + "value": "/subscriptions/71ac1fd6-9ebc-4a20-9667-b873f7cee091/resourceGroups/Arc-Demo/providers/Microsoft.OperationalInsights/workspaces/LA-AzureArc" }, - "timeContext": { - "durationMs": 86400000 - }, - "value": [ - "value::all" + { + "id": "95f19603-3001-41ca-8340-621f3887a3b3", + "version": "KqlParameterItem/1.0", + "name": "ServerName", + "type": 2, + "description": "Azure Arc ServerName", + "multiSelect": true, + "quote": "'", + "delimiter": ",", + "query": "SqlAssessment_CL\r\n| extend asmt = parse_csv(RawData)\r\n| extend ServerName = tostring(split(tostring(asmt[7]),\":\",0)[0])\r\n| distinct ServerName", + "crossComponentResources": [ + "{LogAnalitycsWorkpace}" + ], + "typeSettings": { + "additionalResourceOptions": [ + "value::all" + ], + "showDefault": false + }, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "value": [ + "SQL2014", + "ARC2012R2SQL", + "ARC2016SQL" + ] + } + ], + "style": "pills", + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces" + }, + "name": "parameters - 7" + }, + { + "type": 1, + "content": { + "json": "\"drawing\"\r\n\"drawing\"" + }, + "customWidth": "33", + "name": "text - 9" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "SqlAssessment_CL\r\n| extend asmt = parse_csv(RawData)\r\n| extend\r\n AsmtId=tostring(asmt[1]),\r\n CheckId=tostring(asmt[2]),\r\n DisplayString=asmt[3],\r\n Description=tostring(asmt[4]),\r\n HelpLink=asmt[5],\r\n TargetType=case(asmt[6] == 1, \"Server\", asmt[6] == 2, \"Database\", \"\"),\r\n TargetName=tostring(asmt[7]), \r\n Severity=case(asmt[8] == 30, \"High\", asmt[8] == 20, \"Medium\", asmt[8] == 10, \"Low\", asmt[8] == 0, \"Information\", asmt[8] == 1, \"Warning\", asmt[8] == 2, \"Critical\", \"Passed\"),\r\n Message=tostring(asmt[9]),\r\n TagsArr=split(tostring(asmt[10]), \",\"),\r\n Sev = toint(asmt[8])\r\n | order by CheckId, _ResourceId\r\n | join kind=inner\r\n (\r\n SqlAssessment_CL\r\n | extend asmt = parse_csv(RawData)\r\n | extend\r\n AsmtId=tostring(asmt[1]) \r\n | summarize arg_max(TimeGenerated, *) by _ResourceId\r\n | project AsmtId\r\n ) on AsmtId\r\n |where Sev >= 0\r\n | extend ServerName = split(TargetName,\":\",0)[0]\r\n | where ServerName in ({ServerName})\r\n | summarize count() by Severity, Sev\r\n | order by Sev", + "size": 3, + "title": "Issues by severity", + "exportFieldName": "Severity", + "exportParameterName": "severity", + "exportDefaultValue": "", + "showExportToExcel": true, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "crossComponentResources": [ + "{LogAnalitycsWorkpace}" + ], + "visualization": "table", + "gridSettings": { + "formatters": [ + { + "columnMatch": "Severity", + "formatter": 8, + "formatOptions": { + "min": 0, + "max": 40, + "palette": "coldHot" + } + }, + { + "columnMatch": "Sev", + "formatter": 8, + "formatOptions": { + "min": 0, + "max": 40, + "palette": "coldHot" + } + } ] }, - { - "id": "f932fba5-395b-423d-a9b0-538714e1e553", - "version": "KqlParameterItem/1.0", - "name": "LogAnalitycsWorkpace", - "type": 5, - "query": "where type =~ 'microsoft.operationalinsights/workspaces'\r\n| project id", - "crossComponentResources": [ - "{Subscription}" - ], - "typeSettings": { - "additionalResourceOptions": [] - }, - "queryType": 1, - "resourceType": "microsoft.resourcegraph/resources", - "value": "/subscriptions/71ac1fd6-9ebc-4a20-9667-b873f7cee091/resourceGroups/Arc-Demo/providers/Microsoft.OperationalInsights/workspaces/LA-AzureArc" - } - ], - "style": "pills", - "queryType": 1, - "resourceType": "microsoft.resourcegraph/resources" - }, - "name": "parameters - 7" - }, - { - "type": 3, - "content": { - "version": "KqlItem/1.0", - "query": "SqlAssessment_CL\r\n| extend asmt = parse_csv(RawData)\r\n| extend\r\n AsmtId=tostring(asmt[1]),\r\n CheckId=tostring(asmt[2]),\r\n DisplayString=asmt[3],\r\n Description=tostring(asmt[4]),\r\n HelpLink=asmt[5],\r\n TargetType=case(asmt[6] == 1, \"Server\", asmt[6] == 2, \"Database\", \"\"),\r\n TargetName=tostring(asmt[7]), \r\n Severity=case(asmt[8] == 30, \"High\", asmt[8] == 20, \"Medium\", asmt[8] == 10, \"Low\", asmt[8] == 0, \"Information\", asmt[8] == 1, \"Warning\", asmt[8] == 2, \"Critical\", \"Passed\"),\r\n Message=tostring(asmt[9]),\r\n TagsArr=split(tostring(asmt[10]), \",\"),\r\n Sev = toint(asmt[8])\r\n | order by CheckId, _ResourceId\r\n | join kind=inner\r\n (\r\n SqlAssessment_CL\r\n | extend asmt = parse_csv(RawData)\r\n | extend\r\n AsmtId=tostring(asmt[1]) \r\n | summarize arg_max(TimeGenerated, *) by _ResourceId\r\n | project AsmtId\r\n ) on AsmtId\r\n |where Sev >= 0\r\n | summarize count() by Severity, Sev\r\n | order by Sev", - "size": 3, - "title": "Issues by severity", - "exportFieldName": "Severity", - "exportParameterName": "severity", - "showExportToExcel": true, - "queryType": 0, - "resourceType": "microsoft.operationalinsights/workspaces", - "crossComponentResources": [ - "{LogAnalitycsWorkpace}" - ], - "visualization": "table", - "gridSettings": { - "formatters": [ - { - "columnMatch": "Severity", - "formatter": 8, - "formatOptions": { - "min": 0, - "max": 40, - "palette": "coldHot" + "chartSettings": { + "seriesLabelSettings": [ + { + "seriesName": "Medium", + "color": "orange" + }, + { + "seriesName": "Low", + "color": "blue" + }, + { + "seriesName": "High", + "color": "redBright" + }, + { + "seriesName": "Information", + "color": "blueDark" } + ], + "ySettings": { + "numberFormatSettings": { + "unit": 0, + "options": { + "style": "decimal", + "useGrouping": true + } + } + } + } + }, + "customWidth": "67", + "name": "query - 4" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "SqlAssessment_CL\r\n| extend asmt = parse_csv(RawData)\r\n| extend\r\n AsmtId=tostring(asmt[1]),\r\n CheckId=tostring(asmt[2]),\r\n DisplayString=asmt[3],\r\n Description=tostring(asmt[4]),\r\n HelpLink=asmt[5],\r\n TargetType=case(asmt[6] == 1, \"Server\", asmt[6] == 2, \"Database\", \"\"),\r\n TargetName=tostring(asmt[7]), \r\n Severity=case(asmt[8] == 30, \"High\", asmt[8] == 20, \"Medium\", asmt[8] == 10, \"Low\", asmt[8] == 0, \"Information\", asmt[8] == 1, \"Warning\", asmt[8] == 2, \"Critical\", \"Passed\"),\r\n Message=tostring(asmt[9]),\r\n TagsArr=split(tostring(asmt[10]), \",\"),\r\n Sev = toint(asmt[8])\r\n | order by CheckId, _ResourceId\r\n | join kind=inner\r\n (\r\n SqlAssessment_CL\r\n | extend asmt = parse_csv(RawData)\r\n | extend\r\n AsmtId=tostring(asmt[1]) \r\n | summarize arg_max(TimeGenerated, *) by _ResourceId\r\n | project AsmtId\r\n ) on AsmtId\r\n |where Sev >= 0 \r\n and TargetType == \"Server\"\r\n | extend ServerName = split(TargetName,\":\",0)[0]\r\n | where ServerName in ({ServerName})\r\n | order by Sev, CheckId\r\n | summarize count() by TargetName \r\n", + "size": 3, + "title": "Issues by server", + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "crossComponentResources": [ + "{LogAnalitycsWorkpace}" + ], + "visualization": "piechart", + "chartSettings": { + "seriesLabelSettings": [ + { + "seriesName": "Protected", + "color": "green" + }, + { + "seriesName": "Unknown", + "color": "gray" + }, + { + "seriesName": "Not Protected", + "color": "redBright" + } + ] + } + }, + "customWidth": "33", + "name": "query - 4 - Copy" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "SqlAssessment_CL\r\n| extend asmt = parse_csv(RawData)\r\n| extend\r\n AsmtId=tostring(asmt[1]),\r\n CheckId=tostring(asmt[2]),\r\n DisplayString=asmt[3],\r\n Description=tostring(asmt[4]),\r\n HelpLink=asmt[5],\r\n TargetType=case(asmt[6] == 1, \"Server\", asmt[6] == 2, \"Database\", \"\"),\r\n TargetName=tostring(asmt[7]), \r\n Severity=case(asmt[8] == 30, \"High\", asmt[8] == 20, \"Medium\", asmt[8] == 10, \"Low\", asmt[8] == 0, \"Information\", asmt[8] == 1, \"Warning\", asmt[8] == 2, \"Critical\", \"Passed\"),\r\n Message=tostring(asmt[9]),\r\n TagsArr=split(tostring(asmt[10]), \",\"),\r\n Sev = toint(asmt[8])\r\n | order by CheckId, _ResourceId\r\n | join kind=inner\r\n (\r\n SqlAssessment_CL\r\n | extend asmt = parse_csv(RawData)\r\n | extend\r\n AsmtId=tostring(asmt[1]) \r\n | summarize arg_max(TimeGenerated, *) by _ResourceId\r\n | project AsmtId\r\n ) on AsmtId\r\n |where Sev >= 0 \r\n and TargetType == \"Database\"\r\n | extend ServerName = split(TargetName,\":\",0)[0]\r\n | where ServerName in ({ServerName})\r\n | order by Sev, CheckId\r\n | summarize count() by TargetName \r\n", + "size": 3, + "title": "Issues by Database", + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "crossComponentResources": [ + "{LogAnalitycsWorkpace}" + ], + "visualization": "piechart" + }, + "customWidth": "33", + "name": "query - 4 - Copy - Copy" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "\r\nSqlAssessment_CL\r\n| extend asmt = parse_csv(RawData)\r\n| extend\r\n AsmtId=tostring(asmt[1]),\r\n CheckId=tostring(asmt[2]),\r\n DisplayString=asmt[3],\r\n Description=tostring(asmt[4]),\r\n HelpLink=asmt[5],\r\n TargetType=case(asmt[6] == 1, \"Server\", asmt[6] == 2, \"Database\", \"\"),\r\n TargetName=tostring(asmt[7]), \r\n Severity=case(asmt[8] == 30, \"High\", asmt[8] == 20, \"Medium\", asmt[8] == 10, \"Low\", asmt[8] == 0, \"Information\", asmt[8] == 1, \"Warning\", asmt[8] == 2, \"Critical\", \"Passed\"),\r\n Message=tostring(asmt[9]),\r\n TagsArr=split(tostring(asmt[10]), \",\"),\r\n Sev = toint(asmt[8])\r\n | order by CheckId, _ResourceId\r\n | join kind=inner\r\n (\r\n SqlAssessment_CL\r\n | extend asmt = parse_csv(RawData)\r\n | extend\r\n AsmtId=tostring(asmt[1]) \r\n | summarize arg_max(TimeGenerated, *) by _ResourceId\r\n | project AsmtId\r\n ) on AsmtId\r\n |where Sev >= 0\r\n | extend ServerName = split(TargetName,\":\",0)[0]\r\n | where ServerName in ({ServerName})\r\n and Severity == \"{severity}\"\r\n | order by Sev, CheckId\r\n | project CheckId, Description, _ResourceId, AsmtId, Sev, Severity \r\n", + "size": 3, + "title": "Issues by Severity Level: {severity}", + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "crossComponentResources": [ + "{LogAnalitycsWorkpace}" + ] + }, + "name": "query - 8" + }, + { + "type": 9, + "content": { + "version": "KqlParameterItem/1.0", + "crossComponentResources": [ + "{LogAnalitycsWorkpace}" + ], + "parameters": [ + { + "id": "ced45d66-52da-4f9c-b473-6781309a78cc", + "version": "KqlParameterItem/1.0", + "name": "CheckId", + "type": 2, + "isRequired": true, + "query": "\r\nSqlAssessment_CL\r\n| extend asmt = parse_csv(RawData)\r\n| extend\r\n AsmtId=tostring(asmt[1]),\r\n CheckId=tostring(asmt[2]),\r\n DisplayString=asmt[3],\r\n Description=tostring(asmt[4]),\r\n HelpLink=asmt[5],\r\n TargetType=case(asmt[6] == 1, \"Server\", asmt[6] == 2, \"Database\", \"\"),\r\n TargetName=tostring(asmt[7]), \r\n Severity=case(asmt[8] == 30, \"High\", asmt[8] == 20, \"Medium\", asmt[8] == 10, \"Low\", asmt[8] == 0, \"Information\", asmt[8] == 1, \"Warning\", asmt[8] == 2, \"Critical\", \"Passed\"),\r\n Message=tostring(asmt[9]),\r\n TagsArr=split(tostring(asmt[10]), \",\"),\r\n Sev = toint(asmt[8])\r\n | order by CheckId, _ResourceId\r\n | join kind=inner\r\n (\r\n SqlAssessment_CL\r\n | extend asmt = parse_csv(RawData)\r\n | extend\r\n AsmtId=tostring(asmt[1]) \r\n | summarize arg_max(TimeGenerated, *) by _ResourceId\r\n | project AsmtId\r\n ) on AsmtId\r\n |where Sev >= 0\r\n | extend ServerName = split(TargetName,\":\",0)[0]\r\n | where ServerName in ({ServerName})\r\n and Severity == \"{severity}\"\r\n | distinct (CheckId)\r\n|order by CheckId asc\r\n\r\n\r\n ", + "crossComponentResources": [ + "{LogAnalitycsWorkpace}" + ], + "typeSettings": { + "additionalResourceOptions": [], + "showDefault": false + }, + "timeContext": { + "durationMs": 2592000000 + }, + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "value": null + } + ], + "style": "pills", + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces" + }, + "name": "paarameter_CheckId" + }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "items": [ + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "SqlAssessment_CL\r\n| extend asmt = parse_csv(RawData)\r\n| extend\r\n AsmtId=tostring(asmt[1]),\r\n CheckId=tostring(asmt[2]),\r\n DisplayString=asmt[3],\r\n Description=tostring(asmt[4]),\r\n HelpLink=asmt[5],\r\n TargetType=case(asmt[6] == 1, \"Server\", asmt[6] == 2, \"Database\", \"\"),\r\n TargetName=tostring(asmt[7]), \r\n Severity=case(asmt[8] == 30, \"High\", asmt[8] == 20, \"Medium\", asmt[8] == 10, \"Low\", asmt[8] == 0, \"Information\", asmt[8] == 1, \"Warning\", asmt[8] == 2, \"Critical\", \"Passed\"),\r\n Message=tostring(asmt[9]),\r\n TagsArr=split(tostring(asmt[10]), \",\"),\r\n Sev = toint(asmt[8])\r\n | order by CheckId, _ResourceId\r\n | join kind=inner\r\n (\r\n SqlAssessment_CL\r\n | extend asmt = parse_csv(RawData)\r\n | extend\r\n AsmtId=tostring(asmt[1]) \r\n | summarize arg_max(TimeGenerated, *) by _ResourceId\r\n | project AsmtId\r\n ) on AsmtId\r\n | extend ServerName = split(TargetName,\":\",0)[0]\r\n | where ServerName in ({ServerName})\r\n | where CheckId == \"{CheckId}\"\r\n |where Sev >= 0\r\n | order by Sev, CheckId\r\n| project TimeGenerated, CheckId,DisplayString,TargetName,Severity,TargetType,Description,Message,HelpLink,TagsArr", + "size": 0, + "exportedParameters": [ + { + "fieldName": "Description", + "parameterName": "Description", + "parameterType": 1 + }, + { + "fieldName": "Message", + "parameterName": "Message", + "parameterType": 1 + }, + { + "fieldName": "HelpLink", + "parameterName": "HelpLink", + "parameterType": 1 + }, + { + "fieldName": "TagsArr", + "parameterName": "TagsArr", + "parameterType": 1 + } + ], + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces", + "crossComponentResources": [ + "{LogAnalitycsWorkpace}" + ], + "gridSettings": { + "formatters": [ + { + "columnMatch": "TimeGenerated", + "formatter": 0, + "formatOptions": { + "customColumnWidthSetting": "22.2851ch" + } + }, + { + "columnMatch": "CheckId", + "formatter": 18, + "formatOptions": { + "linkColumn": "HelpLink", + "linkTarget": "Url", + "linkLabel": "", + "linkIsContextBlade": false, + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "Default", + "thresholdValue": null, + "representation": "Hyperlink", + "text": "{0}{1}" + } + ], + "customColumnWidthSetting": "14.8566ch" + } + }, + { + "columnMatch": "DisplayString", + "formatter": 0, + "formatOptions": { + "customColumnWidthSetting": "29.7131ch" + } + }, + { + "columnMatch": "TargetName", + "formatter": 0, + "formatOptions": { + "customColumnWidthSetting": "20.5706ch" + } + }, + { + "columnMatch": "Severity", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "==", + "thresholdValue": "High", + "representation": "Sev0", + "text": "{0}" + }, + { + "operator": "==", + "thresholdValue": "Medium", + "representation": "Sev1", + "text": "{0}" + }, + { + "operator": "==", + "thresholdValue": "Low", + "representation": "Sev2", + "text": "{0}" + }, + { + "operator": "==", + "thresholdValue": "Information", + "representation": "Sev3", + "text": "{0}" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "success", + "text": "{0}{1}" + } + ], + "customColumnWidthSetting": "16.2846ch" + } + }, + { + "columnMatch": "TargetType", + "formatter": 0, + "formatOptions": { + "customColumnWidthSetting": "16ch" + } + }, + { + "columnMatch": "Description", + "formatter": 5 + }, + { + "columnMatch": "Message", + "formatter": 5 + }, + { + "columnMatch": "HelpLink", + "formatter": 5 + }, + { + "columnMatch": "TagsArr", + "formatter": 5 + } + ] + } + }, + "customWidth": "65", + "name": "query - 0" }, { - "columnMatch": "Sev", - "formatter": 8, - "formatOptions": { - "min": 0, - "max": 40, - "palette": "coldHot" + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "items": [ + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "title": " Description", + "items": [ + { + "type": 1, + "content": { + "json": "{Description}", + "style": "info" + }, + "name": "Description", + "styleSettings": { + "showBorder": true + } + } + ] + }, + "name": "Description" + }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "title": " Message", + "items": [ + { + "type": 1, + "content": { + "json": "{Message}", + "style": "warning" + }, + "name": "text - 1" + } + ] + }, + "name": "Message" + }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "title": "Tags", + "items": [ + { + "type": 1, + "content": { + "json": "{TagsArr}" + }, + "name": "Tags" + } + ] + }, + "name": "Tags" + }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "title": " Help Link", + "items": [ + { + "type": 1, + "content": { + "json": "{HelpLink}" + }, + "name": "text - 2" + } + ] + }, + "name": "HelpLink" + } + ] + }, + "customWidth": "35", + "conditionalVisibility": { + "parameterName": "Message", + "comparison": "isNotEqualTo", + "value": "" + }, + "name": "Details", + "styleSettings": { + "showBorder": true } } ] }, - "chartSettings": { - "seriesLabelSettings": [ - { - "seriesName": "Medium", - "color": "orange" - }, - { - "seriesName": "Low", - "color": "blue" - }, - { - "seriesName": "High", - "color": "redBright" - }, - { - "seriesName": "Information", - "color": "blueDark" - } - ], - "ySettings": { - "numberFormatSettings": { - "unit": 0, - "options": { - "style": "decimal", - "useGrouping": true - } - } - } - } - }, - "customWidth": "33", - "name": "query - 4" - }, - { - "type": 3, - "content": { - "version": "KqlItem/1.0", - "query": "\r\nSqlAssessment_CL\r\n| extend asmt = parse_csv(RawData)\r\n| extend\r\n AsmtId=tostring(asmt[1]),\r\n CheckId=tostring(asmt[2]),\r\n DisplayString=asmt[3],\r\n Description=tostring(asmt[4]),\r\n HelpLink=asmt[5],\r\n TargetType=case(asmt[6] == 1, \"Server\", asmt[6] == 2, \"Database\", \"\"),\r\n TargetName=tostring(asmt[7]), \r\n Severity=case(asmt[8] == 30, \"High\", asmt[8] == 20, \"Medium\", asmt[8] == 10, \"Low\", asmt[8] == 0, \"Information\", asmt[8] == 1, \"Warning\", asmt[8] == 2, \"Critical\", \"Passed\"),\r\n Message=tostring(asmt[9]),\r\n TagsArr=split(tostring(asmt[10]), \",\"),\r\n Sev = toint(asmt[8])\r\n | order by CheckId, _ResourceId\r\n | join kind=inner\r\n (\r\n SqlAssessment_CL\r\n | extend asmt = parse_csv(RawData)\r\n | extend\r\n AsmtId=tostring(asmt[1]) \r\n | summarize arg_max(TimeGenerated, *) by _ResourceId\r\n | project AsmtId\r\n ) on AsmtId\r\n |where Sev >= 0 \r\n and Severity == \"{severity}\"\r\n | order by Sev, CheckId\r\n | project CheckId, Description, _ResourceId, AsmtId, Sev, Severity \r\n", - "size": 3, - "queryType": 0, - "resourceType": "microsoft.operationalinsights/workspaces", - "crossComponentResources": [ - "{LogAnalitycsWorkpace}" - ] - }, - "name": "query - 8" - }, - { - "type": 3, - "content": { - "version": "KqlItem/1.0", - "query": "SqlAssessment_CL\r\n| extend asmt = parse_csv(RawData)\r\n| extend\r\n AsmtId=tostring(asmt[1]),\r\n CheckId=tostring(asmt[2]),\r\n DisplayString=asmt[3],\r\n Description=tostring(asmt[4]),\r\n HelpLink=asmt[5],\r\n TargetType=case(asmt[6] == 1, \"Server\", asmt[6] == 2, \"Database\", \"\"),\r\n TargetName=tostring(asmt[7]), \r\n Severity=case(asmt[8] == 30, \"High\", asmt[8] == 20, \"Medium\", asmt[8] == 10, \"Low\", asmt[8] == 0, \"Information\", asmt[8] == 1, \"Warning\", asmt[8] == 2, \"Critical\", \"Passed\"),\r\n Message=tostring(asmt[9]),\r\n TagsArr=split(tostring(asmt[10]), \",\"),\r\n Sev = toint(asmt[8])\r\n | order by CheckId, _ResourceId\r\n | join kind=inner\r\n (\r\n SqlAssessment_CL\r\n | extend asmt = parse_csv(RawData)\r\n | extend\r\n AsmtId=tostring(asmt[1]) \r\n | summarize arg_max(TimeGenerated, *) by _ResourceId\r\n | project AsmtId\r\n ) on AsmtId\r\n |where Sev >= 0 \r\n and TargetType == \"Server\"\r\n | order by Sev, CheckId\r\n | summarize count() by TargetName \r\n", - "size": 3, - "title": "Issues by server", - "queryType": 0, - "resourceType": "microsoft.operationalinsights/workspaces", - "crossComponentResources": [ - "{LogAnalitycsWorkpace}" - ], - "visualization": "piechart", - "chartSettings": { - "seriesLabelSettings": [ - { - "seriesName": "Protected", - "color": "green" - }, - { - "seriesName": "Unknown", - "color": "gray" - }, - { - "seriesName": "Not Protected", - "color": "redBright" - } - ] - } - }, - "customWidth": "33", - "name": "query - 4 - Copy" - }, - { - "type": 3, - "content": { - "version": "KqlItem/1.0", - "query": "SqlAssessment_CL\r\n| extend asmt = parse_csv(RawData)\r\n| extend\r\n AsmtId=tostring(asmt[1]),\r\n CheckId=tostring(asmt[2]),\r\n DisplayString=asmt[3],\r\n Description=tostring(asmt[4]),\r\n HelpLink=asmt[5],\r\n TargetType=case(asmt[6] == 1, \"Server\", asmt[6] == 2, \"Database\", \"\"),\r\n TargetName=tostring(asmt[7]), \r\n Severity=case(asmt[8] == 30, \"High\", asmt[8] == 20, \"Medium\", asmt[8] == 10, \"Low\", asmt[8] == 0, \"Information\", asmt[8] == 1, \"Warning\", asmt[8] == 2, \"Critical\", \"Passed\"),\r\n Message=tostring(asmt[9]),\r\n TagsArr=split(tostring(asmt[10]), \",\"),\r\n Sev = toint(asmt[8])\r\n | order by CheckId, _ResourceId\r\n | join kind=inner\r\n (\r\n SqlAssessment_CL\r\n | extend asmt = parse_csv(RawData)\r\n | extend\r\n AsmtId=tostring(asmt[1]) \r\n | summarize arg_max(TimeGenerated, *) by _ResourceId\r\n | project AsmtId\r\n ) on AsmtId\r\n |where Sev >= 0 \r\n and TargetType == \"Database\"\r\n | order by Sev, CheckId\r\n | summarize count() by TargetName \r\n", - "size": 3, - "title": "Issues by Database", - "queryType": 0, - "resourceType": "microsoft.operationalinsights/workspaces", - "crossComponentResources": [ - "{LogAnalitycsWorkpace}" - ], - "visualization": "piechart" - }, - "customWidth": "33", - "name": "query - 4 - Copy - Copy" - }, - { - "type": 9, - "content": { - "version": "KqlParameterItem/1.0", - "crossComponentResources": [ - "{LogAnalitycsWorkpace}" - ], - "parameters": [ - { - "id": "ced45d66-52da-4f9c-b473-6781309a78cc", - "version": "KqlParameterItem/1.0", - "name": "CheckId", - "type": 2, - "isRequired": true, - "query": "\r\nSqlAssessment_CL\r\n| extend asmt = parse_csv(RawData)\r\n| extend\r\n AsmtId=tostring(asmt[1]),\r\n CheckId=tostring(asmt[2]),\r\n DisplayString=asmt[3],\r\n Description=tostring(asmt[4]),\r\n HelpLink=asmt[5],\r\n TargetType=case(asmt[6] == 1, \"Server\", asmt[6] == 2, \"Database\", \"\"),\r\n TargetName=tostring(asmt[7]), \r\n Severity=case(asmt[8] == 30, \"High\", asmt[8] == 20, \"Medium\", asmt[8] == 10, \"Low\", asmt[8] == 0, \"Information\", asmt[8] == 1, \"Warning\", asmt[8] == 2, \"Critical\", \"Passed\"),\r\n Message=tostring(asmt[9]),\r\n TagsArr=split(tostring(asmt[10]), \",\"),\r\n Sev = toint(asmt[8])\r\n | order by CheckId, _ResourceId\r\n | join kind=inner\r\n (\r\n SqlAssessment_CL\r\n | extend asmt = parse_csv(RawData)\r\n | extend\r\n AsmtId=tostring(asmt[1]) \r\n | summarize arg_max(TimeGenerated, *) by _ResourceId\r\n | project AsmtId\r\n ) on AsmtId\r\n |where Sev >= 0 \r\n | distinct (CheckId)\r\n|order by CheckId asc\r\n\r\n\r\n ", - "crossComponentResources": [ - "{LogAnalitycsWorkpace}" - ], - "typeSettings": { - "additionalResourceOptions": [], - "showDefault": false - }, - "timeContext": { - "durationMs": 2592000000 - }, - "queryType": 0, - "resourceType": "microsoft.operationalinsights/workspaces", - "value": "DbIntegrity" - } - ], - "style": "pills", - "queryType": 0, - "resourceType": "microsoft.operationalinsights/workspaces" - }, - "name": "paarameter_CheckId" - }, - { - "type": 3, - "content": { - "version": "KqlItem/1.0", - "query": "SqlAssessment_CL\r\n| extend asmt = parse_csv(RawData)\r\n| extend\r\n AsmtId=tostring(asmt[1]),\r\n CheckId=tostring(asmt[2]),\r\n DisplayString=asmt[3],\r\n Description=tostring(asmt[4]),\r\n HelpLink=asmt[5],\r\n TargetType=case(asmt[6] == 1, \"Server\", asmt[6] == 2, \"Database\", \"\"),\r\n TargetName=tostring(asmt[7]), \r\n Severity=case(asmt[8] == 30, \"High\", asmt[8] == 20, \"Medium\", asmt[8] == 10, \"Low\", asmt[8] == 0, \"Information\", asmt[8] == 1, \"Warning\", asmt[8] == 2, \"Critical\", \"Passed\"),\r\n Message=tostring(asmt[9]),\r\n TagsArr=split(tostring(asmt[10]), \",\"),\r\n Sev = toint(asmt[8])\r\n | order by CheckId, _ResourceId\r\n | join kind=inner\r\n (\r\n SqlAssessment_CL\r\n | extend asmt = parse_csv(RawData)\r\n | extend\r\n AsmtId=tostring(asmt[1]) \r\n | summarize arg_max(TimeGenerated, *) by _ResourceId\r\n | project AsmtId\r\n ) on AsmtId\r\n |where Sev >= 0 \r\n and CheckId ==\"{CheckId}\"\r\n | project _ResourceId, tostring(DisplayString), TargetType, CheckId\r\n | summarize count() by _ResourceId, tostring(DisplayString), TargetType, CheckId\r\n | order by CheckId", - "size": 3, - "title": "sqlmonitoring", - "queryType": 0, - "resourceType": "microsoft.operationalinsights/workspaces", - "crossComponentResources": [ - "{LogAnalitycsWorkpace}" - ], - "gridSettings": { - "formatters": [ - { - "columnMatch": "createdAt", - "formatter": 0, - "formatOptions": { - "customColumnWidthSetting": "21.1429ch" - } - }, - { - "columnMatch": "AzureArcServer", - "formatter": 0, - "formatOptions": { - "customColumnWidthSetting": "20.1429ch" - } - }, - { - "columnMatch": "SQLInstance", - "formatter": 0, - "formatOptions": { - "customColumnWidthSetting": "23.4286ch" - } - }, - { - "columnMatch": "version", - "formatter": 0, - "formatOptions": { - "customColumnWidthSetting": "21ch" - } - }, - { - "columnMatch": "currentVersion", - "formatter": 0, - "formatOptions": { - "customColumnWidthSetting": "20ch" - } - }, - { - "columnMatch": "patchLevel", - "formatter": 0, - "formatOptions": { - "customColumnWidthSetting": "17ch" - } - }, - { - "columnMatch": "edition", - "formatter": 0, - "formatOptions": { - "customColumnWidthSetting": "11.4286ch" - } - }, - { - "columnMatch": "vcores", - "formatter": 0, - "formatOptions": { - "customColumnWidthSetting": "9.7143ch" - } - }, - { - "columnMatch": "subscriptionId", - "formatter": 13, - "formatOptions": { - "linkTarget": "Resource", - "showIcon": true, - "customColumnWidthSetting": "26.5714ch" - } - }, - { - "columnMatch": "licenseType", - "formatter": 0, - "formatOptions": { - "customColumnWidthSetting": "14.4286ch" - } - }, - { - "columnMatch": "azureDefenderStatus", - "formatter": 0, - "formatOptions": { - "customColumnWidthSetting": "25ch" - } - } - ], - "rowLimit": 500, - "filter": true - } - }, - "name": "query - 1" - }, - { - "type": 3, - "content": { - "version": "KqlItem/1.0", - "query": "SqlAssessment_CL\r\n| extend asmt = parse_csv(RawData)\r\n| extend\r\n AsmtId=tostring(asmt[1]),\r\n CheckId=tostring(asmt[2]),\r\n DisplayString=asmt[3],\r\n Description=tostring(asmt[4]),\r\n HelpLink=asmt[5],\r\n TargetType=case(asmt[6] == 1, \"Server\", asmt[6] == 2, \"Database\", \"\"),\r\n TargetName=tostring(asmt[7]), \r\n Severity=case(asmt[8] == 30, \"High\", asmt[8] == 20, \"Medium\", asmt[8] == 10, \"Low\", asmt[8] == 0, \"Information\", asmt[8] == 1, \"Warning\", asmt[8] == 2, \"Critical\", \"Passed\"),\r\n Message=tostring(asmt[9]),\r\n TagsArr=split(tostring(asmt[10]), \",\"),\r\n Sev = toint(asmt[8])\r\n | order by CheckId, _ResourceId\r\n | join kind=inner\r\n (\r\n SqlAssessment_CL\r\n | extend asmt = parse_csv(RawData)\r\n | extend\r\n AsmtId=tostring(asmt[1]) \r\n | summarize arg_max(TimeGenerated, *) by _ResourceId\r\n | project AsmtId\r\n ) on AsmtId\r\n |where Sev >= 0\r\n | order by Sev, CheckId", - "size": 0, - "queryType": 0, - "resourceType": "microsoft.operationalinsights/workspaces", - "crossComponentResources": [ - "{LogAnalitycsWorkpace}" - ] - }, - "name": "query - 0" - } - ], - "fallbackResourceIds": [ - "azure monitor" - ], - "fromTemplateId": "sentinel-UserWorkbook", - "$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json" -} \ No newline at end of file + "name": "Issues" + } + ], + "fallbackResourceIds": [ + "azure monitor" + ], + "fromTemplateId": "sentinel-UserWorkbook", + "$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json" + } \ No newline at end of file diff --git a/samples/features/azure-arc/workbooks/README.md b/samples/features/azure-arc/workbooks/README.md index 42d1c71b..ef440aa6 100644 --- a/samples/features/azure-arc/workbooks/README.md +++ b/samples/features/azure-arc/workbooks/README.md @@ -14,7 +14,8 @@ This section contains workbooks to use with Azure Arc SQL Servers. Please follow ## Azure Arc SQL Best Practices Assessment -![AzureSQLServerBPA](img/AzureSqlServerBPA.png) +![AzureSQLServerBPA](img/AzureSqlServerBPAa.png) +![AzureSQLServerBPA](img/AzureSqlServerBPAb.png) ## Disclaimers diff --git a/samples/features/azure-arc/workbooks/img/AzureSqlServerBPA.png b/samples/features/azure-arc/workbooks/img/AzureSqlServerBPA.png deleted file mode 100644 index 2e26b025..00000000 Binary files a/samples/features/azure-arc/workbooks/img/AzureSqlServerBPA.png and /dev/null differ diff --git a/samples/features/azure-arc/workbooks/img/AzureSqlServerBPAa.png b/samples/features/azure-arc/workbooks/img/AzureSqlServerBPAa.png new file mode 100644 index 00000000..f3e03f9f Binary files /dev/null and b/samples/features/azure-arc/workbooks/img/AzureSqlServerBPAa.png differ diff --git a/samples/features/azure-arc/workbooks/img/AzureSqlServerBPAb.png b/samples/features/azure-arc/workbooks/img/AzureSqlServerBPAb.png new file mode 100644 index 00000000..0fc740c1 Binary files /dev/null and b/samples/features/azure-arc/workbooks/img/AzureSqlServerBPAb.png differ