├── README.md └── WVD-ARM-monitoring-workbook.json /README.md: -------------------------------------------------------------------------------- 1 | # Archived - Windows Virtual Desktop Azure Monitor documentation for spring update (ARM). 2 | 3 | ## No longer active - archiving this repository for preservation but be sure to check out [AVD Insights](https://learn.microsoft.com/en-us/azure/virtual-desktop/diagnostics-log-analytics) which is built into the AVD Portal experience. 4 | 5 | -------------------------------------------------------------------------------- /WVD-ARM-monitoring-workbook.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "Notebook/1.0", 3 | "items": [ 4 | { 5 | "type": 1, 6 | "content": { 7 | "json": "# Windows Virtual Desktop" 8 | }, 9 | "name": "header" 10 | }, 11 | { 12 | "type": 9, 13 | "content": { 14 | "version": "KqlParameterItem/1.0", 15 | "crossComponentResources": [ 16 | "{Subscription}" 17 | ], 18 | "parameters": [ 19 | { 20 | "id": "b859a03f-2283-43dd-8536-42714bbfced6", 21 | "version": "KqlParameterItem/1.0", 22 | "name": "Subscription", 23 | "type": 6, 24 | "isRequired": true, 25 | "query": "summarize Count = count() by subscriptionId\r\n| project value = strcat('/subscriptions/', subscriptionId), label = subscriptionId, Selected = Count >= 0", 26 | "crossComponentResources": [ 27 | "value::selected" 28 | ], 29 | "typeSettings": { 30 | "additionalResourceOptions": [] 31 | }, 32 | "queryType": 1, 33 | "resourceType": "microsoft.resourcegraph/resources" 34 | }, 35 | { 36 | "id": "bab77e5f-3597-4d1f-beb4-878b8b1aab3e", 37 | "version": "KqlParameterItem/1.0", 38 | "name": "SubscriptionID", 39 | "type": 6, 40 | "isRequired": true, 41 | "query": "resourcecontainers\r\n | where type == \"microsoft.resources/subscriptions\"\r\n | summarize Count = count() by subscriptionId\r\n | project Label = subscriptionId, Id = subscriptionId, Selected = Count >= 0", 42 | "crossComponentResources": [ 43 | "{Subscription}" 44 | ], 45 | "isHiddenWhenLocked": true, 46 | "typeSettings": { 47 | "additionalResourceOptions": [] 48 | }, 49 | "queryType": 1, 50 | "resourceType": "microsoft.resourcegraph/resources" 51 | }, 52 | { 53 | "id": "8df9c309-e7d1-43ad-b2ad-2d190c0c4e60", 54 | "version": "KqlParameterItem/1.0", 55 | "name": "Workspace", 56 | "type": 5, 57 | "isRequired": true, 58 | "multiSelect": true, 59 | "quote": "'", 60 | "delimiter": ",", 61 | "query": "where type =~ 'microsoft.operationalinsights/workspaces'\r\n| summarize by id, name\r\n| project id", 62 | "crossComponentResources": [ 63 | "{Subscription}" 64 | ], 65 | "typeSettings": { 66 | "additionalResourceOptions": [ 67 | "value::all" 68 | ] 69 | }, 70 | "queryType": 1, 71 | "resourceType": "microsoft.resourcegraph/resources", 72 | "value": [ 73 | "" 74 | ], 75 | "label": "Log Analytics Workspace" 76 | }, 77 | { 78 | "id": "2e3dfd9b-2d0f-4feb-94e8-107f220c4e28", 79 | "version": "KqlParameterItem/1.0", 80 | "name": "ResourceGroup", 81 | "type": 5, 82 | "isRequired": true, 83 | "query": "resources\r\n| where type contains \"desktopvirtualization\"\r\n| summarize Count = count() by resourceGroup\r\n| project Label = resourceGroup, Id = resourceGroup, Selected = Count >= 0", 84 | "crossComponentResources": [ 85 | "{Subscription}" 86 | ], 87 | "typeSettings": { 88 | "additionalResourceOptions": [] 89 | }, 90 | "queryType": 1, 91 | "resourceType": "microsoft.resourcegraph/resources" 92 | }, 93 | { 94 | "id": "951b5870-e216-45c6-b159-34150868a46e", 95 | "version": "KqlParameterItem/1.0", 96 | "name": "HostPool", 97 | "type": 5, 98 | "isRequired": true, 99 | "query": "resources\r\n| where type == \"microsoft.desktopvirtualization/hostpools\"\r\n| summarize Count = count() by name, id\r\n| project Label = name, Id = id, Selected = Count >= 1", 100 | "crossComponentResources": [ 101 | "{Subscription}" 102 | ], 103 | "typeSettings": { 104 | "additionalResourceOptions": [] 105 | }, 106 | "timeContext": { 107 | "durationMs": 0 108 | }, 109 | "timeContextFromParameter": "TimeRange", 110 | "queryType": 1, 111 | "resourceType": "microsoft.resourcegraph/resources" 112 | }, 113 | { 114 | "id": "966a75f4-f4a4-4404-b649-67da45ddf636", 115 | "version": "KqlParameterItem/1.0", 116 | "name": "WVDHosts", 117 | "type": 5, 118 | "isRequired": true, 119 | "multiSelect": true, 120 | "quote": "'", 121 | "delimiter": ",", 122 | "query": "{\"version\":\"ARMEndpoint/1.0\",\"data\":null,\"headers\":[],\"method\":\"GET\",\"path\":\"{SubscriptionID}/resourcegroups/{ResourceGroup}/providers/Microsoft.DesktopVirtualization/hostpools/{HostPool}/sessionhosts?api-version=2019-01-23-preview\",\"urlParams\":[],\"batchDisabled\":false,\"transformers\":[{\"type\":\"jsonpath\",\"settings\":{\"tablePath\":\"$.value\",\"columns\":[{\"path\":\"$.name\",\"columnid\":\"Name\"}]}}]}", 123 | "value": [ 124 | "value::all" 125 | ], 126 | "typeSettings": { 127 | "additionalResourceOptions": [ 128 | "value::all" 129 | ] 130 | }, 131 | "timeContext": { 132 | "durationMs": 0 133 | }, 134 | "timeContextFromParameter": "TimeRange", 135 | "queryType": 12 136 | }, 137 | { 138 | "id": "04a8ead2-1fb2-4666-a7b0-6d92e3c29b46", 139 | "version": "KqlParameterItem/1.0", 140 | "name": "TimeRange", 141 | "type": 4, 142 | "typeSettings": { 143 | "selectableValues": [ 144 | { 145 | "durationMs": 14400000 146 | }, 147 | { 148 | "durationMs": 43200000 149 | }, 150 | { 151 | "durationMs": 86400000 152 | }, 153 | { 154 | "durationMs": 172800000 155 | }, 156 | { 157 | "durationMs": 259200000 158 | }, 159 | { 160 | "durationMs": 604800000 161 | }, 162 | { 163 | "durationMs": 1209600000 164 | }, 165 | { 166 | "durationMs": 2592000000 167 | }, 168 | { 169 | "durationMs": 5184000000 170 | }, 171 | { 172 | "durationMs": 7776000000 173 | } 174 | ], 175 | "allowCustom": true 176 | }, 177 | "value": { 178 | "durationMs": 2592000000 179 | } 180 | } 181 | ], 182 | "style": "pills", 183 | "queryType": 1, 184 | "resourceType": "microsoft.resourcegraph/resources" 185 | }, 186 | "name": "parameters - 2" 187 | }, 188 | { 189 | "type": 1, 190 | "content": { 191 | "json": "This workbook relies on the following:\r\n* Windows Virtual Desktop spring release with WCD Diagnostic Logs enabled\r\n* Azure Monitor VMInsights with Map enabled\r\n* Azure Monitor Log Analytics workspace, with the performance counter and event log collection as detailed in *[this document](dummyurl)*.\r\n* AAD Diagnostic Logs enabled" 192 | }, 193 | "conditionalVisibility": { 194 | "parameterName": "DebugMode", 195 | "comparison": "isEqualTo", 196 | "value": "True" 197 | }, 198 | "name": "abouttext" 199 | }, 200 | { 201 | "type": 11, 202 | "content": { 203 | "version": "LinkItem/1.0", 204 | "style": "tabs", 205 | "links": [ 206 | { 207 | "cellValue": "selectedTab", 208 | "linkTarget": "parameter", 209 | "linkLabel": "Overview", 210 | "subTarget": "Overview", 211 | "style": "link" 212 | }, 213 | { 214 | "cellValue": "selectedTab", 215 | "linkTarget": "parameter", 216 | "linkLabel": "Session Details", 217 | "subTarget": "SessionDetails", 218 | "style": "link" 219 | }, 220 | { 221 | "cellValue": "selectedTab", 222 | "linkTarget": "parameter", 223 | "linkLabel": "Session Diagnostics", 224 | "subTarget": "SessionDiagnostics", 225 | "style": "link" 226 | }, 227 | { 228 | "cellValue": "selectedTab", 229 | "linkTarget": "parameter", 230 | "linkLabel": "User Specific Reporting", 231 | "subTarget": "UserSpecific", 232 | "style": "link" 233 | }, 234 | { 235 | "cellValue": "selectedTab", 236 | "linkTarget": "parameter", 237 | "linkLabel": "Session Performance", 238 | "subTarget": "SessionPerformance", 239 | "style": "link" 240 | }, 241 | { 242 | "cellValue": "selectedTab", 243 | "linkTarget": "parameter", 244 | "linkLabel": "Host Performance", 245 | "subTarget": "HostPerformance", 246 | "style": "link" 247 | }, 248 | { 249 | "cellValue": "selectedTab", 250 | "linkTarget": "parameter", 251 | "linkLabel": "Disk Performance", 252 | "subTarget": "DiskPerformance", 253 | "style": "link" 254 | } 255 | ] 256 | }, 257 | "name": "tabs" 258 | }, 259 | { 260 | "type": 12, 261 | "content": { 262 | "version": "NotebookGroup/1.0", 263 | "groupType": "editable", 264 | "items": [ 265 | { 266 | "type": 1, 267 | "content": { 268 | "json": "# WVD Overview" 269 | }, 270 | "name": "text - 4" 271 | }, 272 | { 273 | "type": 3, 274 | "content": { 275 | "version": "KqlItem/1.0", 276 | "query": "resources\r\n| where type contains \"desktopvirtualization\"\r\n| parse type with * \"microsoft.desktopvirtualization/\" TypeName\r\n| summarize Resources=count() by TypeName\r\n| order by Resources desc", 277 | "size": 1, 278 | "title": "WVD Resources", 279 | "noDataMessage": "No resources detected in the selected subscription.", 280 | "queryType": 1, 281 | "resourceType": "microsoft.resourcegraph/resources", 282 | "crossComponentResources": [ 283 | "{Subscription}" 284 | ], 285 | "visualization": "tiles", 286 | "tileSettings": { 287 | "showBorder": false, 288 | "titleContent": { 289 | "columnMatch": "TypeName", 290 | "formatter": 1 291 | }, 292 | "leftContent": { 293 | "columnMatch": "Resources", 294 | "formatter": 12, 295 | "formatOptions": { 296 | "palette": "auto" 297 | }, 298 | "numberFormat": { 299 | "unit": 17, 300 | "options": { 301 | "maximumSignificantDigits": 3, 302 | "maximumFractionDigits": 2 303 | } 304 | } 305 | } 306 | } 307 | }, 308 | "customWidth": "25", 309 | "showPin": true, 310 | "name": "wvdresources", 311 | "styleSettings": { 312 | "margin": "1px", 313 | "padding": "1px", 314 | "showBorder": true 315 | } 316 | }, 317 | { 318 | "type": 3, 319 | "content": { 320 | "version": "KqlItem/1.0", 321 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nWVDConnections\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, SessionHostName)\r\n| where Computername in (WVDHosts)\r\n|sort by TimeGenerated asc, CorrelationId\r\n|summarize Sessions = dcount(CorrelationId) by bin(TimeGenerated, 1d)", 322 | "size": 1, 323 | "title": "Daily Connections - {HostPool} - Rolling 7 days", 324 | "noDataMessage": "No sessions detected in the last 7 days.", 325 | "timeContext": { 326 | "durationMs": 604800000 327 | }, 328 | "queryType": 0, 329 | "resourceType": "microsoft.operationalinsights/workspaces", 330 | "crossComponentResources": [ 331 | "{Workspace}" 332 | ], 333 | "visualization": "barchart", 334 | "chartSettings": { 335 | "xAxis": "TimeGenerated" 336 | } 337 | }, 338 | "customWidth": "25", 339 | "showPin": true, 340 | "name": "rollingsessioncount", 341 | "styleSettings": { 342 | "margin": "1px", 343 | "padding": "1px", 344 | "showBorder": true 345 | } 346 | }, 347 | { 348 | "type": 3, 349 | "content": { 350 | "version": "KqlItem/1.0", 351 | "query": "SigninLogs\r\n| where ResourceDisplayName == \"Windows Virtual Desktop\"\r\n| summarize arg_max(CorrelationId, *) by CorrelationId\r\n| project [\"City\"]= LocationDetails.city, LocationDetails.geoCoordinates.longitude, LocationDetails.geoCoordinates.latitude", 352 | "size": 1, 353 | "title": "Logon Location Heatmap - Rolling 7 days", 354 | "noDataMessage": "No logons detected in the last 7 days, or AAD Signin logs have not been configured for collection", 355 | "noDataMessageStyle": 2, 356 | "timeContext": { 357 | "durationMs": 604800000 358 | }, 359 | "queryType": 0, 360 | "resourceType": "microsoft.operationalinsights/workspaces", 361 | "crossComponentResources": [ 362 | "{Workspace}" 363 | ], 364 | "visualization": "map", 365 | "mapSettings": { 366 | "locInfo": "LatLong", 367 | "latitude": "LocationDetails_geoCoordinates_latitude", 368 | "longitude": "LocationDetails_geoCoordinates_longitude", 369 | "sizeSettings": "City", 370 | "sizeAggregation": "Count", 371 | "labelSettings": "City", 372 | "legendMetric": "City", 373 | "numberOfMetrics": 5, 374 | "legendAggregation": "Count", 375 | "itemColorSettings": { 376 | "nodeColorField": "City", 377 | "colorAggregation": "Count", 378 | "type": "heatmap", 379 | "heatmapPalette": "hotCold" 380 | } 381 | } 382 | }, 383 | "customWidth": "25", 384 | "showPin": true, 385 | "name": "mapoflogons", 386 | "styleSettings": { 387 | "margin": "1px", 388 | "padding": "1px", 389 | "showBorder": true 390 | } 391 | }, 392 | { 393 | "type": 3, 394 | "content": { 395 | "version": "KqlItem/1.0", 396 | "query": "Perf\r\n| where CounterName == \"Active Sessions\"\r\n| extend ActiveTimeStamp = TimeGenerated > ago(5m)\r\n| summarize LatestActiveSessionCounter = arg_max(ActiveTimeStamp, *) by CounterName, Computer\r\n| extend LatestActiveSessionCount = iff(LatestActiveSessionCounter == \"false\", 0, toint(CounterValue))\r\n| join kind =inner ( \r\nPerf\r\n | where CounterName == \"Inactive Sessions\"\r\n | extend InactiveTimeStamp = TimeGenerated > ago(5m)\r\n | summarize LatestInactiveSessionCounter = arg_max(InactiveTimeStamp, *) by CounterName, Computer\r\n | extend LatestInactiveSessionCount = iff(LatestInactiveSessionCounter == \"false\", 0, toint(CounterValue - 2))\r\n )\r\n on Computer\r\n| extend Sessions = pack(\"Inactive Sessions\", LatestInactiveSessionCount, \"Active Sessions\", LatestActiveSessionCount)\r\n| mvexpand kind=array Sessions\r\n| project SessionType = tostring(Sessions[0]), value = toint(Sessions[1]), Computer = Computer\r\n| render piechart", 397 | "size": 1, 398 | "title": "Current Session Status", 399 | "noDataMessage": "No Current or Recent Sessions collected", 400 | "timeContext": { 401 | "durationMs": 2592000000 402 | }, 403 | "timeContextFromParameter": "TimeRange", 404 | "queryType": 0, 405 | "resourceType": "microsoft.operationalinsights/workspaces", 406 | "crossComponentResources": [ 407 | "{Workspace}" 408 | ], 409 | "chartSettings": { 410 | "seriesLabelSettings": [ 411 | { 412 | "seriesName": "Inactive Sessions", 413 | "color": "orange" 414 | }, 415 | { 416 | "seriesName": "Active Sessions", 417 | "color": "green" 418 | } 419 | ] 420 | } 421 | }, 422 | "customWidth": "25", 423 | "showPin": true, 424 | "name": "CurrentSessionsPieChart", 425 | "styleSettings": { 426 | "margin": "1px", 427 | "padding": "1px", 428 | "showBorder": true 429 | } 430 | }, 431 | { 432 | "type": 3, 433 | "content": { 434 | "version": "KqlItem/1.0", 435 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nWVDConnections\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, SessionHostName)\r\n| where Computername in (WVDHosts)\r\n| where Type =~\"WVDConnections\" and State =~ \"Connected\" \r\n| extend Multi=split(_ResourceId, \"/\")\r\n| project ResourceAlias, HostPool=toupper(HP=Multi[8]), SessionHostName , UserName ,CState=iff(SessionHostOSVersion==\"<>\",\"Failure\",\"Success\"), CorrelationId, TimeGenerated, ResourceGroup=Multi[4], DesktopGroup_s=toupper(strcat(RG=Multi[4],\".\", HP=Multi[8])), StartTime=TimeGenerated\r\n| join (WVDConnections\r\n| where State == \"Completed\"\r\n| project EndTime=TimeGenerated, CorrelationId)\r\non CorrelationId\r\n| project Duration = EndTime - StartTime,UserName\r\n| summarize Duration=avg(Duration) by UserName\r\n| sort by Duration desc\r\n| take 5\r\n", 436 | "size": 1, 437 | "title": "Top 5 Average Session Durations by User", 438 | "timeContext": { 439 | "durationMs": 2592000000 440 | }, 441 | "timeContextFromParameter": "TimeRange", 442 | "queryType": 0, 443 | "resourceType": "microsoft.operationalinsights/workspaces", 444 | "crossComponentResources": [ 445 | "{Workspace}" 446 | ], 447 | "gridSettings": { 448 | "formatters": [ 449 | { 450 | "columnMatch": "DurationInSeconds", 451 | "formatter": 3, 452 | "formatOptions": { 453 | "palette": "blue" 454 | }, 455 | "numberFormat": { 456 | "unit": 24, 457 | "options": { 458 | "style": "decimal", 459 | "useGrouping": false 460 | } 461 | } 462 | } 463 | ] 464 | } 465 | }, 466 | "customWidth": "50", 467 | "showPin": true, 468 | "name": "usersessionlogonduration", 469 | "styleSettings": { 470 | "margin": "1px", 471 | "padding": "1px", 472 | "showBorder": true 473 | } 474 | }, 475 | { 476 | "type": 3, 477 | "content": { 478 | "version": "KqlItem/1.0", 479 | "query": "{\"version\":\"ARMEndpoint/1.0\",\"data\":null,\"headers\":[],\"method\":\"GET\",\"path\":\"{SubscriptionID}/resourcegroups/{ResourceGroup}/providers/Microsoft.DesktopVirtualization/hostpools/{HostPool}?api-version=2019-01-23-preview\",\"urlParams\":[],\"batchDisabled\":false,\"transformers\":[{\"type\":\"jsonpath\",\"settings\":{\"tablePath\":\"$.properties\",\"columns\":[{\"path\":\"$.hostPoolType\",\"columnid\":\"HostPoolType\"},{\"path\":\"$.maxSessionLimit\",\"columnid\":\"MaxSessionLimit\"}]}}]}", 480 | "size": 4, 481 | "queryType": 12 482 | }, 483 | "customWidth": "33", 484 | "name": "hostpoolspecifics", 485 | "styleSettings": { 486 | "margin": "1px", 487 | "padding": "1px" 488 | } 489 | }, 490 | { 491 | "type": 12, 492 | "content": { 493 | "version": "NotebookGroup/1.0", 494 | "groupType": "editable", 495 | "title": "Pool Health Overview", 496 | "items": [ 497 | { 498 | "type": 3, 499 | "content": { 500 | "version": "KqlItem/1.0", 501 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nHeartbeat\r\n| extend HostPool = '{HostPool}'\r\n| extend FullName = strcat(HostPool, \"/\", Computer)\r\n| where FullName in (WVDHosts)\r\n| summarize LastHeartbeat = max(TimeGenerated) by Computer, FullName, HostPool\r\n| extend State = iff(LastHeartbeat < ago(15m), 'Unhealthy', 'Healthy')\r\n| extend TimeFromNow = now() - LastHeartbeat\r\n| extend [\"TimeAgo\"] = strcat(case(TimeFromNow < 2m, strcat(toint(TimeFromNow / 1m), ' seconds'), TimeFromNow < 2h, strcat(toint(TimeFromNow / 1m), ' minutes'), TimeFromNow < 2d, strcat(toint(TimeFromNow / 1h), ' hours'), strcat(toint(TimeFromNow / 1d), ' days')), ' ago')\r\n| join kind= innerunique (\r\nPerf\r\n| where ObjectName == \"Terminal Services\" and\r\n(CounterName == \"Active Sessions\")\r\n| extend ActiveSessions = toint(CounterValue), Computer, TimeGenerated\r\n| project Computer, TimeGenerated, ActiveSessions\r\n| join kind=inner (\r\nPerf\r\n| where ObjectName == \"Terminal Services\" and CounterName == \"Inactive Sessions\"\r\n| extend totalinactivesessions = toint(CounterValue)\r\n| extend InactiveSessions = totalinactivesessions -2\r\n| project Computer, InactiveTimeStamp=TimeGenerated, InactiveSessions\r\n) on Computer\r\n| where (TimeGenerated - InactiveTimeStamp) between (0min .. 15s)\r\n| summarize arg_max(TimeGenerated, *) by Computer\r\n| project ActiveSessions, InactiveSessions, Computer\r\n) on Computer\r\n| join (Perf\r\n| where (ObjectName == \"Terminal Services\" and CounterName == \"Active Sessions\")\r\n| make-series TSActTrend = avg(CounterValue) default=0 on TimeGenerated from {TimeRange:start} to {TimeRange:end} step {TimeRange:grain} by ObjectName, Computer | project TSActTrend, Computer) on Computer\r\n| join (Perf\r\n| where (ObjectName == \"Memory\" and CounterName == \"% Committed Bytes In Use\")\r\n| make-series MemTrend = avg(CounterValue) default=0 on TimeGenerated from {TimeRange:start} to {TimeRange:end} step {TimeRange:grain} by ObjectName, Computer | project MemTrend, Computer) on Computer\r\n| join (Perf\r\n| where (ObjectName == \"Processor\" and CounterName == \"% Processor Time\")\r\n| make-series CPUTrend = avg(CounterValue) default=0 on TimeGenerated from {TimeRange:start} to {TimeRange:end} step {TimeRange:grain} by ObjectName, Computer | project CPUTrend, Computer) on Computer\r\n| project Computer, State, ActiveSessions, InactiveSessions,[\"Azure Monitor Checkin\"]=strcat('🕒 ', TimeAgo), FullName, HostPool, TSActTrend, MemTrend, CPUTrend", 502 | "size": 4, 503 | "timeContext": { 504 | "durationMs": 2592000000 505 | }, 506 | "timeContextFromParameter": "TimeRange", 507 | "queryType": 0, 508 | "resourceType": "microsoft.operationalinsights/workspaces", 509 | "crossComponentResources": [ 510 | "{Workspace}" 511 | ], 512 | "visualization": "tiles", 513 | "gridSettings": { 514 | "formatters": [ 515 | { 516 | "columnMatch": "Computer", 517 | "formatter": 13, 518 | "formatOptions": { 519 | "linkTarget": null, 520 | "showIcon": true 521 | } 522 | }, 523 | { 524 | "columnMatch": "FullName", 525 | "formatter": 5, 526 | "formatOptions": {} 527 | }, 528 | { 529 | "columnMatch": "HostPool", 530 | "formatter": 5, 531 | "formatOptions": {} 532 | }, 533 | { 534 | "columnMatch": "TSActTrend", 535 | "formatter": 5, 536 | "formatOptions": {} 537 | }, 538 | { 539 | "columnMatch": "MemTrend", 540 | "formatter": 5, 541 | "formatOptions": {} 542 | }, 543 | { 544 | "columnMatch": "CPUTrend", 545 | "formatter": 5, 546 | "formatOptions": {} 547 | } 548 | ] 549 | }, 550 | "tileSettings": { 551 | "titleContent": { 552 | "formatter": 1 553 | }, 554 | "leftContent": { 555 | "columnMatch": "Computer", 556 | "formatter": 1 557 | }, 558 | "showBorder": false 559 | } 560 | }, 561 | "customWidth": "33", 562 | "name": "hostperf", 563 | "styleSettings": { 564 | "margin": "1px", 565 | "padding": "1px", 566 | "progressStyle": "none" 567 | } 568 | }, 569 | { 570 | "type": 3, 571 | "content": { 572 | "version": "KqlItem/1.0", 573 | "query": "{\"version\":\"ARMEndpoint/1.0\",\"data\":null,\"headers\":[],\"method\":\"GET\",\"path\":\"{SubscriptionID}/resourcegroups/{ResourceGroup}/providers/Microsoft.DesktopVirtualization/hostpools/{HostPool}/sessionhosts?api-version=2019-01-23-preview\",\"urlParams\":[],\"batchDisabled\":false,\"transformers\":[{\"type\":\"jsonpath\",\"settings\":{\"tablePath\":\"$.value\",\"columns\":[{\"path\":\"$.properties.status\",\"columnid\":\"Status\"},{\"path\":\"$.name\",\"columnid\":\"Name\"},{\"path\":\"$.properties.lastHeartBeat\",\"columnid\":\"LastHeartbeat\"},{\"path\":\"$.properties.sessions\",\"columnid\":\"Sessions\"}]}}]}", 574 | "size": 4, 575 | "queryType": 12, 576 | "visualization": "tiles", 577 | "gridSettings": { 578 | "formatters": [ 579 | { 580 | "columnMatch": "Status", 581 | "formatter": 5, 582 | "formatOptions": {} 583 | }, 584 | { 585 | "columnMatch": "Name", 586 | "formatter": 13, 587 | "formatOptions": { 588 | "linkTarget": null, 589 | "showIcon": true 590 | } 591 | }, 592 | { 593 | "columnMatch": "LastHeartbeat", 594 | "formatter": 5, 595 | "formatOptions": {} 596 | }, 597 | { 598 | "columnMatch": "Sessions", 599 | "formatter": 5, 600 | "formatOptions": {} 601 | } 602 | ], 603 | "labelSettings": [ 604 | { 605 | "columnId": "Status" 606 | }, 607 | { 608 | "columnId": "Name" 609 | }, 610 | { 611 | "columnId": "LastHeartbeat" 612 | }, 613 | { 614 | "columnId": "Sessions", 615 | "label": "Last Session Count" 616 | } 617 | ] 618 | }, 619 | "tileSettings": { 620 | "titleContent": { 621 | "columnMatch": "Name", 622 | "formatter": 1, 623 | "formatOptions": {} 624 | }, 625 | "subtitleContent": { 626 | "columnMatch": "Status", 627 | "formatOptions": {} 628 | }, 629 | "leftContent": { 630 | "columnMatch": "Sessions", 631 | "formatter": 12, 632 | "formatOptions": { 633 | "palette": "auto" 634 | }, 635 | "numberFormat": { 636 | "unit": 17, 637 | "options": { 638 | "style": "decimal", 639 | "useGrouping": false, 640 | "maximumFractionDigits": 2, 641 | "maximumSignificantDigits": 3 642 | } 643 | } 644 | }, 645 | "showBorder": false 646 | } 647 | }, 648 | "customWidth": "33", 649 | "name": "hostpooloverview", 650 | "styleSettings": { 651 | "margin": "1px", 652 | "padding": "1px", 653 | "progressStyle": "none" 654 | } 655 | }, 656 | { 657 | "type": 3, 658 | "content": { 659 | "version": "KqlItem/1.0", 660 | "query": "{\"version\":\"Merge/1.0\",\"merges\":[{\"id\":\"eb82698f-2418-4770-8607-a730f61540f9\",\"mergeType\":\"innerunique\",\"leftTable\":\"hostpooloverview\",\"rightTable\":\"hostperf\",\"leftColumn\":\"Name\",\"rightColumn\":\"FullName\"}],\"projectRename\":[{\"originalName\":\"[hostperf].HostPool\",\"mergedName\":\"HostPool\",\"fromId\":\"unknown\"},{\"originalName\":\"[hostperf].FullName\",\"mergedName\":\"FullName\",\"fromId\":\"unknown\"},{\"originalName\":\"[hostperf].Computer\",\"mergedName\":\"Computer\",\"fromId\":\"eb82698f-2418-4770-8607-a730f61540f9\"},{\"originalName\":\"[hostpooloverview].Status\",\"mergedName\":\"Status\",\"fromId\":\"eb82698f-2418-4770-8607-a730f61540f9\"},{\"originalName\":\"[hostpooloverview].Name\",\"mergedName\":\"Name\",\"fromId\":\"eb82698f-2418-4770-8607-a730f61540f9\"},{\"originalName\":\"[hostpooloverview].LastHeartbeat\",\"mergedName\":\"LastHeartbeat\",\"fromId\":\"eb82698f-2418-4770-8607-a730f61540f9\"},{\"originalName\":\"[hostperf].Azure Monitor Checkin\",\"mergedName\":\"Azure Monitor Checkin\",\"fromId\":\"unknown\"},{\"originalName\":\"[hostpooloverview].Sessions\",\"mergedName\":\"Last Session Count\",\"fromId\":\"eb82698f-2418-4770-8607-a730f61540f9\"},{\"originalName\":\"[hostperf].ActiveSessions\",\"mergedName\":\"ActiveSessions\",\"fromId\":\"unknown\"},{\"originalName\":\"[hostperf].InactiveSessions\",\"mergedName\":\"InactiveSessions\",\"fromId\":\"unknown\"},{\"originalName\":\"[hostperf].TSActTrend\",\"mergedName\":\"TSActTrend\",\"fromId\":\"unknown\"},{\"originalName\":\"[hostperf].MemTrend\",\"mergedName\":\"MemTrend\",\"fromId\":\"eb82698f-2418-4770-8607-a730f61540f9\"},{\"originalName\":\"[hostperf].CPUTrend\",\"mergedName\":\"CPUTrend\",\"fromId\":\"eb82698f-2418-4770-8607-a730f61540f9\"},{\"originalName\":\"[hostperf].State\",\"mergedName\":\"State\",\"fromId\":\"unknown\"},{\"originalName\":\"[hostperf].NWSTrend\"},{\"originalName\":\"[hostperf].NWRTrend\"}]}", 661 | "size": 0, 662 | "queryType": 7, 663 | "gridSettings": { 664 | "formatters": [ 665 | { 666 | "columnMatch": "$gen_group", 667 | "formatter": 16, 668 | "formatOptions": { 669 | "showIcon": true 670 | } 671 | }, 672 | { 673 | "columnMatch": "HostPool", 674 | "formatter": 5 675 | }, 676 | { 677 | "columnMatch": "FullName", 678 | "formatter": 5 679 | }, 680 | { 681 | "columnMatch": "Computer", 682 | "formatter": 7, 683 | "formatOptions": { 684 | "linkTarget": "Resource" 685 | } 686 | }, 687 | { 688 | "columnMatch": "Status", 689 | "formatter": 18, 690 | "formatOptions": { 691 | "thresholdsOptions": "icons", 692 | "thresholdsGrid": [ 693 | { 694 | "operator": "==", 695 | "thresholdValue": "Available", 696 | "representation": "Available", 697 | "text": "Available" 698 | }, 699 | { 700 | "operator": "==", 701 | "thresholdValue": "Unavailable", 702 | "representation": "failed", 703 | "text": "Unavailable" 704 | }, 705 | { 706 | "operator": "Default", 707 | "thresholdValue": null, 708 | "representation": "success", 709 | "text": "{0}{1}" 710 | } 711 | ] 712 | } 713 | }, 714 | { 715 | "columnMatch": "Name", 716 | "formatter": 5 717 | }, 718 | { 719 | "columnMatch": "LastHeartbeat", 720 | "formatter": 5 721 | }, 722 | { 723 | "columnMatch": "Last Session Count", 724 | "formatter": 3, 725 | "formatOptions": { 726 | "palette": "blue" 727 | } 728 | }, 729 | { 730 | "columnMatch": "TSActTrend", 731 | "formatter": 21, 732 | "formatOptions": { 733 | "palette": "blue" 734 | } 735 | }, 736 | { 737 | "columnMatch": "MemTrend", 738 | "formatter": 21, 739 | "formatOptions": { 740 | "palette": "blue" 741 | } 742 | }, 743 | { 744 | "columnMatch": "CPUTrend", 745 | "formatter": 21, 746 | "formatOptions": { 747 | "palette": "blue" 748 | } 749 | }, 750 | { 751 | "columnMatch": "State", 752 | "formatter": 5 753 | }, 754 | { 755 | "columnMatch": "NWRTrend", 756 | "formatter": 21, 757 | "formatOptions": { 758 | "palette": "blue" 759 | } 760 | }, 761 | { 762 | "columnMatch": "NWSTrend", 763 | "formatter": 21, 764 | "formatOptions": { 765 | "palette": "blue" 766 | } 767 | } 768 | ], 769 | "hierarchySettings": { 770 | "treeType": 1, 771 | "groupBy": [ 772 | "HostPool" 773 | ], 774 | "expandTopLevel": true 775 | }, 776 | "labelSettings": [ 777 | { 778 | "columnId": "HostPool" 779 | }, 780 | { 781 | "columnId": "FullName" 782 | }, 783 | { 784 | "columnId": "Computer" 785 | }, 786 | { 787 | "columnId": "Status" 788 | }, 789 | { 790 | "columnId": "Name" 791 | }, 792 | { 793 | "columnId": "LastHeartbeat" 794 | }, 795 | { 796 | "columnId": "Azure Monitor Checkin" 797 | }, 798 | { 799 | "columnId": "Last Session Count" 800 | }, 801 | { 802 | "columnId": "ActiveSessions", 803 | "label": "Active Sessions" 804 | }, 805 | { 806 | "columnId": "InactiveSessions", 807 | "label": "Inactive Sessions" 808 | }, 809 | { 810 | "columnId": "TSActTrend", 811 | "label": "Terminal Services Active Sessions" 812 | }, 813 | { 814 | "columnId": "MemTrend", 815 | "label": "Memory Utilisation" 816 | }, 817 | { 818 | "columnId": "CPUTrend", 819 | "label": "CPU Utilisation" 820 | }, 821 | { 822 | "columnId": "State" 823 | } 824 | ] 825 | }, 826 | "sortBy": [] 827 | }, 828 | "showPin": false, 829 | "name": "hostandperfmerge" 830 | } 831 | ] 832 | }, 833 | "name": "poolhealthoverview" 834 | } 835 | ] 836 | }, 837 | "conditionalVisibility": { 838 | "parameterName": "selectedTab", 839 | "comparison": "isEqualTo", 840 | "value": "Overview" 841 | }, 842 | "name": "Overview" 843 | }, 844 | { 845 | "type": 12, 846 | "content": { 847 | "version": "NotebookGroup/1.0", 848 | "groupType": "editable", 849 | "items": [ 850 | { 851 | "type": 1, 852 | "content": { 853 | "json": "# Session Details" 854 | }, 855 | "name": "text - 4" 856 | }, 857 | { 858 | "type": 3, 859 | "content": { 860 | "version": "KqlItem/1.0", 861 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nPerf\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, Computer)\r\n| where Computername in (WVDHosts)\r\n| where ObjectName == \"Terminal Services\" \r\n| where CounterName == \"Active Sessions\" \r\n| summarize arg_max(TimeGenerated, *) by Computer\r\n| project Computer, CounterName, CounterValue\r\n| order by CounterValue desc\r\n| take 5", 862 | "size": 1, 863 | "title": "Top 5 hosts with connected sessions", 864 | "noDataMessage": "No session information to display. Please ensure that you have enabled collection of the Terminal Services performance counters into your workspace.have enabled the ", 865 | "noDataMessageStyle": 4, 866 | "timeContext": { 867 | "durationMs": 2592000000 868 | }, 869 | "timeContextFromParameter": "TimeRange", 870 | "queryType": 0, 871 | "resourceType": "microsoft.operationalinsights/workspaces", 872 | "crossComponentResources": [ 873 | "{Workspace}" 874 | ], 875 | "visualization": "tiles", 876 | "tileSettings": { 877 | "titleContent": { 878 | "columnMatch": "Computer", 879 | "formatter": 1, 880 | "formatOptions": {} 881 | }, 882 | "subtitleContent": { 883 | "columnMatch": "CounterName", 884 | "formatOptions": {} 885 | }, 886 | "leftContent": { 887 | "columnMatch": "CounterValue", 888 | "formatter": 12, 889 | "formatOptions": { 890 | "palette": "auto" 891 | }, 892 | "numberFormat": { 893 | "unit": 17, 894 | "options": { 895 | "maximumSignificantDigits": 3, 896 | "maximumFractionDigits": 2 897 | } 898 | } 899 | }, 900 | "showBorder": true, 901 | "size": "auto" 902 | }, 903 | "chartSettings": { 904 | "seriesLabelSettings": [ 905 | { 906 | "seriesName": "Active Sessions", 907 | "color": "green" 908 | }, 909 | { 910 | "seriesName": "Inactive Sessions", 911 | "color": "yellow" 912 | } 913 | ] 914 | } 915 | }, 916 | "customWidth": "33", 917 | "showPin": true, 918 | "name": "currentsessionstatus", 919 | "styleSettings": { 920 | "margin": "1px", 921 | "padding": "1px", 922 | "showBorder": true 923 | } 924 | }, 925 | { 926 | "type": 3, 927 | "content": { 928 | "version": "KqlItem/1.0", 929 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nWVDConnections\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, SessionHostName)\r\n| where Computername in (WVDHosts)\r\n| where State == \"Connected\"\r\n| summarize UserCount = count() by UserName\r\n| sort by UserCount desc\r\n| take 5", 930 | "size": 1, 931 | "title": "Top 5 Active Users", 932 | "noDataMessage": "No active users detected in the selected time period.", 933 | "timeContext": { 934 | "durationMs": 2592000000 935 | }, 936 | "timeContextFromParameter": "TimeRange", 937 | "queryType": 0, 938 | "resourceType": "microsoft.operationalinsights/workspaces", 939 | "crossComponentResources": [ 940 | "{Workspace}" 941 | ], 942 | "visualization": "tiles", 943 | "tileSettings": { 944 | "titleContent": { 945 | "columnMatch": "UserName", 946 | "formatter": 1, 947 | "formatOptions": {} 948 | }, 949 | "leftContent": { 950 | "columnMatch": "UserCount", 951 | "formatter": 12, 952 | "formatOptions": { 953 | "palette": "blue" 954 | } 955 | }, 956 | "showBorder": true, 957 | "rowLimit": 10, 958 | "size": "auto" 959 | }, 960 | "graphSettings": { 961 | "type": 2, 962 | "topContent": { 963 | "columnMatch": "UserName", 964 | "formatter": 1, 965 | "formatOptions": {} 966 | }, 967 | "centerContent": { 968 | "columnMatch": "UserCount", 969 | "formatter": 12, 970 | "formatOptions": { 971 | "palette": "blue" 972 | }, 973 | "numberFormat": { 974 | "unit": 17, 975 | "options": { 976 | "style": "decimal", 977 | "useGrouping": false, 978 | "maximumFractionDigits": 2, 979 | "maximumSignificantDigits": 3 980 | } 981 | } 982 | }, 983 | "nodeIdField": "UserName", 984 | "nodeSize": null, 985 | "staticNodeSize": 100, 986 | "colorSettings": null, 987 | "hivesMargin": 5 988 | } 989 | }, 990 | "customWidth": "33", 991 | "showPin": true, 992 | "name": "top5users", 993 | "styleSettings": { 994 | "margin": "1px", 995 | "padding": "1px", 996 | "showBorder": true 997 | } 998 | }, 999 | { 1000 | "type": 3, 1001 | "content": { 1002 | "version": "KqlItem/1.0", 1003 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nPerf\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, Computer)\r\n| where Computername in (WVDHosts)\r\n| where ObjectName == \"Terminal Services\" \r\n| where CounterName == \"Inactive Sessions\" \r\n| summarize arg_max(TimeGenerated, *) by Computer\r\n| project Computer, CounterName, CounterValue\r\n| order by CounterValue desc\r\n| take 5", 1004 | "size": 1, 1005 | "title": "Top 5 host with disconnected sessions", 1006 | "noDataMessage": "No disconnected sessions detected in the selected time frame", 1007 | "timeContext": { 1008 | "durationMs": 2592000000 1009 | }, 1010 | "timeContextFromParameter": "TimeRange", 1011 | "queryType": 0, 1012 | "resourceType": "microsoft.operationalinsights/workspaces", 1013 | "crossComponentResources": [ 1014 | "{Workspace}" 1015 | ], 1016 | "visualization": "tiles", 1017 | "tileSettings": { 1018 | "titleContent": { 1019 | "columnMatch": "Computer", 1020 | "formatter": 1, 1021 | "formatOptions": {} 1022 | }, 1023 | "subtitleContent": { 1024 | "columnMatch": "CounterName", 1025 | "formatOptions": {} 1026 | }, 1027 | "leftContent": { 1028 | "columnMatch": "CounterValue", 1029 | "formatter": 12, 1030 | "formatOptions": { 1031 | "palette": "auto" 1032 | }, 1033 | "numberFormat": { 1034 | "unit": 17, 1035 | "options": { 1036 | "style": "decimal", 1037 | "useGrouping": false, 1038 | "maximumFractionDigits": 2, 1039 | "maximumSignificantDigits": 3 1040 | } 1041 | } 1042 | }, 1043 | "showBorder": true, 1044 | "size": "auto" 1045 | } 1046 | }, 1047 | "customWidth": "33", 1048 | "showPin": true, 1049 | "name": "top5disconnectedsessions", 1050 | "styleSettings": { 1051 | "margin": "1px", 1052 | "padding": "1px", 1053 | "showBorder": true 1054 | } 1055 | }, 1056 | { 1057 | "type": 3, 1058 | "content": { 1059 | "version": "KqlItem/1.0", 1060 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nPerf\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, Computer)\r\n| where Computername in (WVDHosts)\r\n| where ObjectName == \"Terminal Services\" \r\n| where CounterName == \"Total Sessions\" \r\n| summarize arg_max(TimeGenerated, *) by Computer\r\n| project Computer, CounterName, CounterValue\r\n| order by CounterValue desc\r\n| take 5", 1061 | "size": 1, 1062 | "title": "Total Sessions top 5 Hosts", 1063 | "noDataMessage": "No total sessions detected in the selected time range. If there have been sessions, please ensure that the Terminal Services counters are being collected into your workspace.", 1064 | "timeContext": { 1065 | "durationMs": 2592000000 1066 | }, 1067 | "timeContextFromParameter": "TimeRange", 1068 | "queryType": 0, 1069 | "resourceType": "microsoft.operationalinsights/workspaces", 1070 | "crossComponentResources": [ 1071 | "{Workspace}" 1072 | ], 1073 | "visualization": "tiles", 1074 | "tileSettings": { 1075 | "titleContent": { 1076 | "columnMatch": "Computer", 1077 | "formatter": 1, 1078 | "formatOptions": {} 1079 | }, 1080 | "subtitleContent": { 1081 | "columnMatch": "CounterName", 1082 | "formatOptions": {} 1083 | }, 1084 | "leftContent": { 1085 | "columnMatch": "CounterValue", 1086 | "formatter": 12, 1087 | "formatOptions": { 1088 | "palette": "auto" 1089 | }, 1090 | "numberFormat": { 1091 | "unit": 17, 1092 | "options": { 1093 | "maximumSignificantDigits": 3, 1094 | "maximumFractionDigits": 2 1095 | } 1096 | } 1097 | }, 1098 | "showBorder": true 1099 | } 1100 | }, 1101 | "customWidth": "33", 1102 | "showPin": true, 1103 | "name": "totalsessions", 1104 | "styleSettings": { 1105 | "margin": "1px", 1106 | "padding": "1px", 1107 | "showBorder": true 1108 | } 1109 | }, 1110 | { 1111 | "type": 3, 1112 | "content": { 1113 | "version": "KqlItem/1.0", 1114 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nWVDConnections\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, SessionHostName)\r\n| where Computername in (WVDHosts)\r\n| where State == \"Connected\"\r\n| extend ClientOSType = pack(\"ClientOSVersion\", ClientOS)\r\n| summarize AggregatedValue = count() by ClientOS", 1115 | "size": 1, 1116 | "title": "Client Connection Operating System", 1117 | "noDataMessage": "No client connections detected in the selected time frame.", 1118 | "timeContext": { 1119 | "durationMs": 2592000000 1120 | }, 1121 | "timeContextFromParameter": "TimeRange", 1122 | "queryType": 0, 1123 | "resourceType": "microsoft.operationalinsights/workspaces", 1124 | "crossComponentResources": [ 1125 | "{Workspace}" 1126 | ], 1127 | "visualization": "piechart", 1128 | "chartSettings": { 1129 | "showMetrics": false, 1130 | "showLegend": true 1131 | } 1132 | }, 1133 | "customWidth": "33", 1134 | "showPin": true, 1135 | "name": "clientosbreakdown", 1136 | "styleSettings": { 1137 | "margin": "1px", 1138 | "padding": "1px", 1139 | "showBorder": true 1140 | } 1141 | }, 1142 | { 1143 | "type": 1, 1144 | "content": { 1145 | "json": "
" 1146 | }, 1147 | "name": "text - 6" 1148 | }, 1149 | { 1150 | "type": 9, 1151 | "content": { 1152 | "version": "KqlParameterItem/1.0", 1153 | "crossComponentResources": [ 1154 | "{Workspace}" 1155 | ], 1156 | "parameters": [ 1157 | { 1158 | "id": "37cebb64-3756-4e03-9b04-5d3b63bc2407", 1159 | "version": "KqlParameterItem/1.0", 1160 | "name": "TSSessions", 1161 | "label": "Terminal Server Session Counters", 1162 | "type": 2, 1163 | "isRequired": true, 1164 | "multiSelect": true, 1165 | "quote": "'", 1166 | "delimiter": ",", 1167 | "query": "Perf\r\n| where ObjectName == \"Terminal Services\"\r\n| summarize by CounterName\r\n| project Label = CounterName, Id = CounterName, Selected = 1", 1168 | "crossComponentResources": [ 1169 | "{Workspace}" 1170 | ], 1171 | "typeSettings": { 1172 | "additionalResourceOptions": [] 1173 | }, 1174 | "queryType": 0, 1175 | "resourceType": "microsoft.operationalinsights/workspaces" 1176 | } 1177 | ], 1178 | "style": "pills", 1179 | "queryType": 0, 1180 | "resourceType": "microsoft.operationalinsights/workspaces" 1181 | }, 1182 | "name": "parameters - 9" 1183 | }, 1184 | { 1185 | "type": 3, 1186 | "content": { 1187 | "version": "KqlItem/1.0", 1188 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nPerf\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, Computer)\r\n| where Computername in (WVDHosts)\r\n| where CounterName == \"Active Sessions\"\r\n| extend ActiveSessions = toint(CounterValue)\r\n| project Computer, ActiveTimeStamp=TimeGenerated, ActiveSessions \r\n| join kind= inner (\r\n Perf\r\n | where CounterName == \"Inactive Sessions\"\r\n | extend totalinactivesessions = toint(CounterValue)\r\n | extend InactiveSessions = totalinactivesessions - 2\r\n | project Computer, InactiveTimeStamp=TimeGenerated, InactiveSessions \r\n) on Computer \r\n| where (ActiveTimeStamp - InactiveTimeStamp) between (0min .. 15s)\r\n| project ActiveSessions, InactiveSessions, bin(ActiveTimeStamp, 5m)", 1189 | "size": 0, 1190 | "aggregation": 3, 1191 | "showAnalytics": true, 1192 | "title": "Session Status History (WVD)", 1193 | "noDataMessage": "No Session History information. If you have had active sessions in the selected time period, please ensure that the collection of the Terminal Services counters into your workspace has been enabled.", 1194 | "timeContext": { 1195 | "durationMs": 0 1196 | }, 1197 | "timeContextFromParameter": "TimeRange", 1198 | "queryType": 0, 1199 | "resourceType": "microsoft.operationalinsights/workspaces", 1200 | "crossComponentResources": [ 1201 | "{Workspace}" 1202 | ], 1203 | "visualization": "timechart", 1204 | "chartSettings": { 1205 | "ySettings": { 1206 | "numberFormatSettings": { 1207 | "unit": 17, 1208 | "options": { 1209 | "style": "decimal", 1210 | "useGrouping": true, 1211 | "maximumFractionDigits": 0 1212 | } 1213 | } 1214 | } 1215 | } 1216 | }, 1217 | "customWidth": "50", 1218 | "showPin": true, 1219 | "name": "sessionstatushistory", 1220 | "styleSettings": { 1221 | "margin": "1px", 1222 | "padding": "1px", 1223 | "showBorder": true 1224 | } 1225 | }, 1226 | { 1227 | "type": 3, 1228 | "content": { 1229 | "version": "KqlItem/1.0", 1230 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nlet Counter = dynamic([{TSSessions}]);\r\nPerf\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, Computer)\r\n| where Computername in (WVDHosts)\r\n| where ObjectName == \"Terminal Services\" and CounterName in (Counter)\r\n| summarize AggregatedValue = avg(CounterValue) by bin(TimeGenerated, 1h), CounterName, Computer", 1231 | "size": 0, 1232 | "aggregation": 3, 1233 | "showAnalytics": true, 1234 | "title": "Session Overview (TermServer & WVD)", 1235 | "noDataMessage": "No Session History information. If you have had active sessions in the selected time period, please ensure that the collection of the Terminal Services counters into your workspace has been enabled.", 1236 | "timeContext": { 1237 | "durationMs": 2592000000 1238 | }, 1239 | "queryType": 0, 1240 | "resourceType": "microsoft.operationalinsights/workspaces", 1241 | "crossComponentResources": [ 1242 | "{Workspace}" 1243 | ], 1244 | "visualization": "timechart", 1245 | "gridSettings": { 1246 | "formatters": [ 1247 | { 1248 | "columnMatch": "AggregatedValue", 1249 | "formatter": 0, 1250 | "numberFormat": { 1251 | "unit": 17, 1252 | "options": { 1253 | "style": "decimal", 1254 | "maximumFractionDigits": 0 1255 | } 1256 | } 1257 | } 1258 | ], 1259 | "sortBy": [ 1260 | { 1261 | "itemKey": "TimeGenerated", 1262 | "sortOrder": 1 1263 | } 1264 | ] 1265 | }, 1266 | "sortBy": [ 1267 | { 1268 | "itemKey": "TimeGenerated", 1269 | "sortOrder": 1 1270 | } 1271 | ], 1272 | "chartSettings": { 1273 | "yAxis": [ 1274 | "AggregatedValue" 1275 | ], 1276 | "ySettings": { 1277 | "numberFormatSettings": { 1278 | "unit": 17, 1279 | "options": { 1280 | "style": "decimal", 1281 | "useGrouping": true, 1282 | "maximumFractionDigits": 0 1283 | } 1284 | } 1285 | } 1286 | } 1287 | }, 1288 | "customWidth": "50", 1289 | "showPin": true, 1290 | "name": "tssessions", 1291 | "styleSettings": { 1292 | "margin": "1px", 1293 | "padding": "1px", 1294 | "showBorder": true 1295 | } 1296 | } 1297 | ] 1298 | }, 1299 | "conditionalVisibility": { 1300 | "parameterName": "selectedTab", 1301 | "comparison": "isEqualTo", 1302 | "value": "SessionDetails" 1303 | }, 1304 | "name": "sessiondetails" 1305 | }, 1306 | { 1307 | "type": 12, 1308 | "content": { 1309 | "version": "NotebookGroup/1.0", 1310 | "groupType": "editable", 1311 | "items": [ 1312 | { 1313 | "type": 1, 1314 | "content": { 1315 | "json": "# Session Diagnostics" 1316 | }, 1317 | "name": "text - 0" 1318 | }, 1319 | { 1320 | "type": 9, 1321 | "content": { 1322 | "version": "KqlParameterItem/1.0", 1323 | "parameters": [ 1324 | { 1325 | "id": "06f79b5c-9883-4485-8a21-244d7327fd73", 1326 | "version": "KqlParameterItem/1.0", 1327 | "name": "wvd_displayserviceerrors", 1328 | "label": "Display WVD Service Backend Errors?", 1329 | "type": 2, 1330 | "isRequired": true, 1331 | "typeSettings": { 1332 | "additionalResourceOptions": [] 1333 | }, 1334 | "jsonData": "[\r\n {\"label\":\"False\", \"value\":\"| where ServiceError == 'False'\", \"selected\":\"True\"},\r\n {\"label\":\"True\", \"value\":\"| where ServiceError == 'True'\", \"selected\":\"False\"}\r\n]", 1335 | "timeContext": { 1336 | "durationMs": 86400000 1337 | } 1338 | } 1339 | ], 1340 | "style": "pills", 1341 | "queryType": 0, 1342 | "resourceType": "microsoft.operationalinsights/workspaces" 1343 | }, 1344 | "name": "parameters - 5" 1345 | }, 1346 | { 1347 | "type": 3, 1348 | "content": { 1349 | "version": "KqlItem/1.0", 1350 | "query": "WVDErrors\r\n{wvd_displayserviceerrors}\r\n| parse _ResourceId with * \"/hostpools/\" HostPoolName\r\n| where HostPoolName like ('{HostPool}')\r\n| summarize count() by UserName", 1351 | "size": 1, 1352 | "title": "Top users encountering errors", 1353 | "noDataMessage": "No errors detected in the selected time period", 1354 | "timeContext": { 1355 | "durationMs": 0 1356 | }, 1357 | "timeContextFromParameter": "TimeRange", 1358 | "queryType": 0, 1359 | "resourceType": "microsoft.operationalinsights/workspaces", 1360 | "crossComponentResources": [ 1361 | "{Workspace}" 1362 | ], 1363 | "visualization": "piechart" 1364 | }, 1365 | "customWidth": "25", 1366 | "showPin": true, 1367 | "name": "wvderrorsbyuser", 1368 | "styleSettings": { 1369 | "margin": "1px", 1370 | "padding": "1px", 1371 | "showBorder": true 1372 | } 1373 | }, 1374 | { 1375 | "type": 3, 1376 | "content": { 1377 | "version": "KqlItem/1.0", 1378 | "query": "WVDErrors\r\n{wvd_displayserviceerrors}\r\n| parse _ResourceId with * \"/hostpools/\" HostPoolName\r\n| where HostPoolName like ('{HostPool}')\r\n| summarize usercount = count(UserName) by CodeSymbolic, CorrelationId, TimeGenerated\r\n| project CodeSymbolic, usercount, CorrelationId, TimeGenerated\r\n| sort by usercount desc", 1379 | "size": 1, 1380 | "title": "WVD Errors", 1381 | "noDataMessage": "No errors detected in the selected time period", 1382 | "timeContext": { 1383 | "durationMs": 0 1384 | }, 1385 | "timeContextFromParameter": "TimeRange", 1386 | "queryType": 0, 1387 | "resourceType": "microsoft.operationalinsights/workspaces", 1388 | "crossComponentResources": [ 1389 | "{Workspace}" 1390 | ], 1391 | "visualization": "piechart" 1392 | }, 1393 | "customWidth": "25", 1394 | "showPin": true, 1395 | "name": "WVD Service Errors", 1396 | "styleSettings": { 1397 | "margin": "1px", 1398 | "padding": "1px", 1399 | "showBorder": true 1400 | } 1401 | }, 1402 | { 1403 | "type": 3, 1404 | "content": { 1405 | "version": "KqlItem/1.0", 1406 | "query": "WVDErrors\r\n{wvd_displayserviceerrors}\r\n| parse _ResourceId with * \"/hostpools/\" HostPoolName\r\n| where HostPoolName like ('{HostPool}')\r\n| summarize usercount = count(Source) by CodeSymbolic, CorrelationId, TimeGenerated, Source\r\n| project Source, CodeSymbolic, usercount, CorrelationId, TimeGenerated", 1407 | "size": 1, 1408 | "title": "WVD Errors - by Source", 1409 | "noDataMessage": "No errors returned for the selected time range", 1410 | "timeContext": { 1411 | "durationMs": 0 1412 | }, 1413 | "timeContextFromParameter": "TimeRange", 1414 | "exportFieldName": "Source", 1415 | "exportParameterName": "wvd_serviceerror_source", 1416 | "queryType": 0, 1417 | "resourceType": "microsoft.operationalinsights/workspaces", 1418 | "crossComponentResources": [ 1419 | "{Workspace}" 1420 | ], 1421 | "visualization": "piechart" 1422 | }, 1423 | "customWidth": "25", 1424 | "showPin": true, 1425 | "name": "WVD Service Errors - by Source", 1426 | "styleSettings": { 1427 | "margin": "1px", 1428 | "padding": "1px", 1429 | "showBorder": true 1430 | } 1431 | }, 1432 | { 1433 | "type": 3, 1434 | "content": { 1435 | "version": "KqlItem/1.0", 1436 | "query": "WVDErrors\r\n{wvd_displayserviceerrors}\r\n| parse _ResourceId with * \"/hostpools/\" HostPoolName\r\n| where HostPoolName like ('{HostPool}')\r\n| summarize usercount = count(CorrelationId) by TimeGenerated, CorrelationId, CodeSymbolic, Source\r\n| project Source, CodeSymbolic, usercount, CorrelationId, TimeGenerated", 1437 | "size": 1, 1438 | "title": "WVD Errors - by rolling 7 days", 1439 | "noDataMessage": "No errors detected in the last 7 days", 1440 | "timeContext": { 1441 | "durationMs": 604800000 1442 | }, 1443 | "queryType": 0, 1444 | "resourceType": "microsoft.operationalinsights/workspaces", 1445 | "crossComponentResources": [ 1446 | "{Workspace}" 1447 | ], 1448 | "visualization": "barchart" 1449 | }, 1450 | "customWidth": "25", 1451 | "showPin": true, 1452 | "name": "WVD Errors - by rolling 7 days", 1453 | "styleSettings": { 1454 | "margin": "1px", 1455 | "padding": "1px", 1456 | "showBorder": true 1457 | } 1458 | }, 1459 | { 1460 | "type": 3, 1461 | "content": { 1462 | "version": "KqlItem/1.0", 1463 | "query": "WVDErrors\r\n| parse _ResourceId with * \"/hostpools/\" HostPoolName\r\n| where HostPoolName like ('{HostPool}')\r\n{wvd_displayserviceerrors}\r\n| project [\"Error Code\"]= CodeSymbolic, Message, UserName, ActivityType, Source, CorrelationId, TimeGenerated, [\"Host Pool\"] = _ResourceId\r\n| sort by TimeGenerated desc", 1464 | "size": 0, 1465 | "showAnalytics": true, 1466 | "title": "WVD Error Information", 1467 | "noDataMessage": "No errors collected in the specified time range", 1468 | "noDataMessageStyle": 4, 1469 | "timeContext": { 1470 | "durationMs": 0 1471 | }, 1472 | "timeContextFromParameter": "TimeRange", 1473 | "showExportToExcel": true, 1474 | "exportToExcelOptions": "all", 1475 | "queryType": 0, 1476 | "resourceType": "microsoft.operationalinsights/workspaces", 1477 | "crossComponentResources": [ 1478 | "{Workspace}" 1479 | ], 1480 | "gridSettings": { 1481 | "formatters": [ 1482 | { 1483 | "columnMatch": "Error Code", 1484 | "formatter": 5 1485 | }, 1486 | { 1487 | "columnMatch": "CorrelationId", 1488 | "formatter": 7, 1489 | "formatOptions": { 1490 | "linkTarget": "CellDetails", 1491 | "linkIsContextBlade": true 1492 | } 1493 | } 1494 | ], 1495 | "filter": true, 1496 | "hierarchySettings": { 1497 | "treeType": 1, 1498 | "groupBy": [ 1499 | "Error Code" 1500 | ], 1501 | "expandTopLevel": true 1502 | } 1503 | } 1504 | }, 1505 | "showPin": false, 1506 | "name": "wvderrorsspecificcode" 1507 | }, 1508 | { 1509 | "type": 3, 1510 | "content": { 1511 | "version": "KqlItem/1.0", 1512 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nWVDConnections\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, SessionHostName)\r\n| where Computername in (WVDHosts)\r\n| project-away TenantId,SourceSystem\r\n| summarize arg_max(TimeGenerated, *), StartTime = min(iff(State== 'Started', TimeGenerated , datetime(null) )), ConnectTime = min(iff(State== 'Connected', TimeGenerated , datetime(null) )) by CorrelationId\r\n| join kind=leftouter (\r\n WVDErrors\r\n |summarize Errors=makelist(pack('Code', Code, 'CodeSymbolic', CodeSymbolic, 'Time', TimeGenerated, 'Message', Message ,'ServiceError', ServiceError, 'Source', Source)) by CorrelationId\r\n ) on CorrelationId \r\n| join kind=leftouter (\r\n WVDCheckpoints\r\n | summarize Checkpoints=makelist(pack('Time', TimeGenerated, 'Name', Name, 'Parameters', Parameters, 'Source', Source)) by CorrelationId\r\n | mv-apply Checkpoints on\r\n (\r\n order by todatetime(Checkpoints['Time']) asc\r\n | summarize Checkpoints=makelist(Checkpoints)\r\n )\r\n ) on CorrelationId\r\n| project-away CorrelationId1, CorrelationId2, ClientIPAddress, SessionHostIPAddress, SessionHostSxSStackVersion, PredecessorConnectionId\r\n| order by TimeGenerated desc", 1513 | "size": 0, 1514 | "showAnalytics": true, 1515 | "title": "WVD Connected Session Details", 1516 | "noDataMessage": "No Connected Sessions detected in the selected time period", 1517 | "timeContext": { 1518 | "durationMs": 0 1519 | }, 1520 | "timeContextFromParameter": "TimeRange", 1521 | "showExportToExcel": true, 1522 | "queryType": 0, 1523 | "resourceType": "microsoft.operationalinsights/workspaces", 1524 | "crossComponentResources": [ 1525 | "{Workspace}" 1526 | ], 1527 | "gridSettings": { 1528 | "filter": true 1529 | } 1530 | }, 1531 | "name": "wvdconnectedsessionsdetails" 1532 | } 1533 | ] 1534 | }, 1535 | "conditionalVisibility": { 1536 | "parameterName": "selectedTab", 1537 | "comparison": "isEqualTo", 1538 | "value": "SessionDiagnostics" 1539 | }, 1540 | "name": "sessiondiagnostics" 1541 | }, 1542 | { 1543 | "type": 12, 1544 | "content": { 1545 | "version": "NotebookGroup/1.0", 1546 | "groupType": "editable", 1547 | "items": [ 1548 | { 1549 | "type": 1, 1550 | "content": { 1551 | "json": "# User Specific Reporting" 1552 | }, 1553 | "name": "text - 0" 1554 | }, 1555 | { 1556 | "type": 9, 1557 | "content": { 1558 | "version": "KqlParameterItem/1.0", 1559 | "crossComponentResources": [ 1560 | "{Workspace}" 1561 | ], 1562 | "parameters": [ 1563 | { 1564 | "id": "e1e164a5-c5e8-4219-997a-fc580dc3f593", 1565 | "version": "KqlParameterItem/1.0", 1566 | "name": "UserName", 1567 | "type": 1, 1568 | "description": "Please enter the username you would like to explore", 1569 | "isRequired": true, 1570 | "value": "wvd9", 1571 | "timeContext": { 1572 | "durationMs": 0 1573 | }, 1574 | "timeContextFromParameter": "TimeRange" 1575 | } 1576 | ], 1577 | "style": "pills", 1578 | "queryType": 0, 1579 | "resourceType": "microsoft.insights/components" 1580 | }, 1581 | "name": "parameters - 1" 1582 | }, 1583 | { 1584 | "type": 3, 1585 | "content": { 1586 | "version": "KqlItem/1.0", 1587 | "query": "WVDConnections\r\n|where UserName contains '{UserName}'\r\n|sort by TimeGenerated asc, CorrelationId\r\n|summarize Connectcount = dcount(CorrelationId) by bin(TimeGenerated, 1d)", 1588 | "size": 0, 1589 | "aggregation": 2, 1590 | "showAnalytics": true, 1591 | "title": "Connections per day for user {UserName}", 1592 | "color": "gray", 1593 | "noDataMessage": "No connections detected for this user in the specified time frame", 1594 | "timeContext": { 1595 | "durationMs": 0 1596 | }, 1597 | "timeContextFromParameter": "TimeRange", 1598 | "queryType": 0, 1599 | "resourceType": "microsoft.operationalinsights/workspaces", 1600 | "crossComponentResources": [ 1601 | "{Workspace}" 1602 | ], 1603 | "visualization": "barchart", 1604 | "chartSettings": { 1605 | "xAxis": "TimeGenerated", 1606 | "group": "Connectcount", 1607 | "createOtherGroup": null, 1608 | "showMetrics": false 1609 | } 1610 | }, 1611 | "name": "ConnectionsbyUser", 1612 | "styleSettings": { 1613 | "margin": "1px", 1614 | "padding": "1px" 1615 | } 1616 | }, 1617 | { 1618 | "type": 3, 1619 | "content": { 1620 | "version": "KqlItem/1.0", 1621 | "query": "WVDConnections\r\n|where UserName contains '{UserName}'\r\n|sort by TimeGenerated asc, CorrelationId\r\n| project TimeGenerated, CorrelationId, _ResourceId, SessionHostName, SessionHostIPAddress, UserName, State, ClientOS, ClientVersion, ClientType, ConnectionType, ResourceAlias, TenantId", 1622 | "size": 0, 1623 | "showAnalytics": true, 1624 | "title": "All connections for user {UserName}", 1625 | "noDataMessage": "No connections detected in the specified time frame", 1626 | "noDataMessageStyle": 4, 1627 | "timeContext": { 1628 | "durationMs": 2592000000 1629 | }, 1630 | "timeContextFromParameter": "TimeRange", 1631 | "showExportToExcel": true, 1632 | "exportToExcelOptions": "all", 1633 | "queryType": 0, 1634 | "resourceType": "microsoft.operationalinsights/workspaces", 1635 | "crossComponentResources": [ 1636 | "{Workspace}" 1637 | ], 1638 | "gridSettings": { 1639 | "formatters": [ 1640 | { 1641 | "columnMatch": "CorrelationId", 1642 | "formatter": 5, 1643 | "formatOptions": {} 1644 | }, 1645 | { 1646 | "columnMatch": "TenantId", 1647 | "formatter": 5, 1648 | "formatOptions": {} 1649 | }, 1650 | { 1651 | "columnMatch": "ClientIPAddress", 1652 | "formatter": 5, 1653 | "formatOptions": {} 1654 | }, 1655 | { 1656 | "columnMatch": "SessionHostSxSStackVersion", 1657 | "formatter": 5, 1658 | "formatOptions": {} 1659 | } 1660 | ], 1661 | "rowLimit": 100, 1662 | "filter": true, 1663 | "labelSettings": [ 1664 | { 1665 | "columnId": "TimeGenerated" 1666 | }, 1667 | { 1668 | "columnId": "CorrelationId" 1669 | }, 1670 | { 1671 | "columnId": "_ResourceId", 1672 | "label": "Host Pool" 1673 | }, 1674 | { 1675 | "columnId": "SessionHostName" 1676 | }, 1677 | { 1678 | "columnId": "SessionHostIPAddress" 1679 | }, 1680 | { 1681 | "columnId": "UserName" 1682 | }, 1683 | { 1684 | "columnId": "State" 1685 | }, 1686 | { 1687 | "columnId": "ClientOS" 1688 | }, 1689 | { 1690 | "columnId": "ClientVersion" 1691 | }, 1692 | { 1693 | "columnId": "ClientType" 1694 | }, 1695 | { 1696 | "columnId": "ConnectionType" 1697 | }, 1698 | { 1699 | "columnId": "ResourceAlias" 1700 | }, 1701 | { 1702 | "columnId": "TenantId" 1703 | } 1704 | ] 1705 | } 1706 | }, 1707 | "name": "AllConnectionsforUser" 1708 | }, 1709 | { 1710 | "type": 3, 1711 | "content": { 1712 | "version": "KqlItem/1.0", 1713 | "query": "let Events = WVDConnections \r\n| where UserName contains '{UserName}' ;\r\nEvents\r\n| where State == \"Connected\"\r\n| project CorrelationId , UserName, ResourceAlias , StartTime=TimeGenerated\r\n| join (Events\r\n| where State == \"Completed\"\r\n| project EndTime=TimeGenerated, CorrelationId)\r\non CorrelationId\r\n| project Duration = EndTime - StartTime, ResourceAlias\r\n| sort by Duration desc\r\n", 1714 | "size": 0, 1715 | "showAnalytics": true, 1716 | "title": "Connection Duration for user {UserName}", 1717 | "timeContext": { 1718 | "durationMs": 0 1719 | }, 1720 | "timeContextFromParameter": "TimeRange", 1721 | "queryType": 0, 1722 | "resourceType": "microsoft.operationalinsights/workspaces", 1723 | "crossComponentResources": [ 1724 | "{Workspace}" 1725 | ] 1726 | }, 1727 | "customWidth": "50", 1728 | "name": "ConnectionsDurationbyUser", 1729 | "styleSettings": { 1730 | "showBorder": true 1731 | } 1732 | }, 1733 | { 1734 | "type": 3, 1735 | "content": { 1736 | "version": "KqlItem/1.0", 1737 | "query": "Perf\r\n| where ObjectName == \"Process\"\r\n| join\r\n(\r\nVMProcess\r\n| where UserName contains '{UserName}'\r\n| extend InstanceName = ExecutableName\r\n| project TimeGenerated, InstanceName, Computer, UserName, UserDomain\r\n)\r\non InstanceName\r\n| summarize AggregatedValue = avg(CounterValue) by bin(TimeGenerated, 10m), InstanceName, CounterName, UserName, Computer\r\n| order by AggregatedValue desc", 1738 | "size": 0, 1739 | "showAnalytics": true, 1740 | "title": "User Process by Session for {UserName}", 1741 | "noDataMessage": "No process information detected for user {UserName} in the selected time range", 1742 | "timeContext": { 1743 | "durationMs": 86400000 1744 | }, 1745 | "showExportToExcel": true, 1746 | "queryType": 0, 1747 | "resourceType": "microsoft.operationalinsights/workspaces", 1748 | "crossComponentResources": [ 1749 | "{Workspace}" 1750 | ], 1751 | "gridSettings": { 1752 | "formatters": [ 1753 | { 1754 | "columnMatch": "TimeGenerated", 1755 | "formatter": 5 1756 | }, 1757 | { 1758 | "columnMatch": "AggregatedValue", 1759 | "formatter": 0, 1760 | "numberFormat": { 1761 | "unit": 2, 1762 | "options": { 1763 | "style": "decimal", 1764 | "useGrouping": false 1765 | } 1766 | } 1767 | } 1768 | ], 1769 | "labelSettings": [ 1770 | { 1771 | "columnId": "TimeGenerated" 1772 | }, 1773 | { 1774 | "columnId": "InstanceName", 1775 | "label": "Process" 1776 | }, 1777 | { 1778 | "columnId": "CounterName" 1779 | }, 1780 | { 1781 | "columnId": "UserName" 1782 | }, 1783 | { 1784 | "columnId": "Computer" 1785 | }, 1786 | { 1787 | "columnId": "AggregatedValue", 1788 | "label": "Average Value" 1789 | } 1790 | ] 1791 | } 1792 | }, 1793 | "customWidth": "50", 1794 | "name": "User Process by Session", 1795 | "styleSettings": { 1796 | "margin": "1px", 1797 | "padding": "1px", 1798 | "showBorder": true 1799 | } 1800 | }, 1801 | { 1802 | "type": 3, 1803 | "content": { 1804 | "version": "KqlItem/1.0", 1805 | "query": "WVDErrors\r\n| where UserName contains '{UserName}'\r\n| project TimeGenerated, CorrelationId, _ResourceId, UserName, ActivityType, Source, Code, CodeSymbolic, Message, TenantId", 1806 | "size": 0, 1807 | "showAnalytics": true, 1808 | "title": "WVD Errors by User - {UserName}", 1809 | "noDataMessage": "No errors detected in the specified time range", 1810 | "timeContext": { 1811 | "durationMs": 2592000000 1812 | }, 1813 | "timeContextFromParameter": "TimeRange", 1814 | "showExportToExcel": true, 1815 | "exportToExcelOptions": "all", 1816 | "queryType": 0, 1817 | "resourceType": "microsoft.operationalinsights/workspaces", 1818 | "crossComponentResources": [ 1819 | "{Workspace}" 1820 | ], 1821 | "gridSettings": { 1822 | "formatters": [ 1823 | { 1824 | "columnMatch": "CorrelationId", 1825 | "formatter": 5, 1826 | "formatOptions": {} 1827 | }, 1828 | { 1829 | "columnMatch": "TenantId", 1830 | "formatter": 5, 1831 | "formatOptions": {} 1832 | } 1833 | ], 1834 | "rowLimit": 100, 1835 | "filter": true, 1836 | "labelSettings": [ 1837 | { 1838 | "columnId": "TimeGenerated" 1839 | }, 1840 | { 1841 | "columnId": "CorrelationId" 1842 | }, 1843 | { 1844 | "columnId": "_ResourceId", 1845 | "label": "Host Pool" 1846 | }, 1847 | { 1848 | "columnId": "UserName" 1849 | }, 1850 | { 1851 | "columnId": "ActivityType" 1852 | }, 1853 | { 1854 | "columnId": "Source" 1855 | }, 1856 | { 1857 | "columnId": "Code" 1858 | }, 1859 | { 1860 | "columnId": "CodeSymbolic" 1861 | }, 1862 | { 1863 | "columnId": "Message" 1864 | }, 1865 | { 1866 | "columnId": "TenantId" 1867 | } 1868 | ] 1869 | } 1870 | }, 1871 | "name": "WVDErrorsbyUser" 1872 | } 1873 | ] 1874 | }, 1875 | "conditionalVisibility": { 1876 | "parameterName": "selectedTab", 1877 | "comparison": "isEqualTo", 1878 | "value": "UserSpecific" 1879 | }, 1880 | "name": "UserSpecificReportinggroup" 1881 | }, 1882 | { 1883 | "type": 12, 1884 | "content": { 1885 | "version": "NotebookGroup/1.0", 1886 | "groupType": "editable", 1887 | "items": [ 1888 | { 1889 | "type": 1, 1890 | "content": { 1891 | "json": "# Session Performance" 1892 | }, 1893 | "name": "text - 0" 1894 | }, 1895 | { 1896 | "type": 3, 1897 | "content": { 1898 | "version": "KqlItem/1.0", 1899 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nPerf\r\n| extend HostPool = '{HostPool}'\r\n| extend FullName = strcat(HostPool, \"/\", Computer)\r\n| where FullName in (WVDHosts)\r\n| where InstanceName != \"_Total\"\r\n| where ObjectName == \"Process\" and CounterName == \"% User Time\"\r\n| summarize AggregatedValue = avg(CounterValue) by bin(TimeGenerated, 10m), InstanceName, Computer\r\n", 1900 | "size": 0, 1901 | "showAnalytics": true, 1902 | "title": "% User Time by Process", 1903 | "timeContext": { 1904 | "durationMs": 0 1905 | }, 1906 | "timeContextFromParameter": "TimeRange", 1907 | "queryType": 0, 1908 | "resourceType": "microsoft.operationalinsights/workspaces", 1909 | "crossComponentResources": [ 1910 | "{Workspace}" 1911 | ], 1912 | "visualization": "linechart" 1913 | }, 1914 | "customWidth": "50", 1915 | "showPin": true, 1916 | "name": "session-percusertime", 1917 | "styleSettings": { 1918 | "margin": "1px", 1919 | "padding": "1px", 1920 | "showBorder": true 1921 | } 1922 | }, 1923 | { 1924 | "type": 3, 1925 | "content": { 1926 | "version": "KqlItem/1.0", 1927 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nPerf\r\n| extend HostPool = '{HostPool}'\r\n| extend FullName = strcat(HostPool, \"/\", Computer)\r\n| where FullName in (WVDHosts)\r\n| where InstanceName != \"_Total\"\r\n| where ObjectName == \"Process\" and CounterName == \"% Processor Time\"\r\n| summarize AggregatedValue = avg(CounterValue) by bin(TimeGenerated, 10m), InstanceName, Computer", 1928 | "size": 0, 1929 | "showAnalytics": true, 1930 | "title": "% Processor Time by Process", 1931 | "timeContext": { 1932 | "durationMs": 0 1933 | }, 1934 | "timeContextFromParameter": "TimeRange", 1935 | "queryType": 0, 1936 | "resourceType": "microsoft.operationalinsights/workspaces", 1937 | "crossComponentResources": [ 1938 | "{Workspace}" 1939 | ], 1940 | "visualization": "linechart" 1941 | }, 1942 | "customWidth": "50", 1943 | "showPin": true, 1944 | "name": "session-percproctime", 1945 | "styleSettings": { 1946 | "margin": "1px", 1947 | "padding": "1px", 1948 | "showBorder": true 1949 | } 1950 | }, 1951 | { 1952 | "type": 3, 1953 | "content": { 1954 | "version": "KqlItem/1.0", 1955 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nPerf\r\n| extend HostPool = '{HostPool}'\r\n| extend FullName = strcat(HostPool, \"/\", Computer)\r\n| where FullName in (WVDHosts)\r\n| where InstanceName != \"_Total\"\r\n| where ObjectName == \"Process\" and CounterName == \"IO Write Operations/sec\"\r\n| summarize AggregatedValue = avg(CounterValue) by bin(TimeGenerated, 10m), InstanceName, Computer", 1956 | "size": 0, 1957 | "showAnalytics": true, 1958 | "title": "Disk IO Write Operations/sec by Process", 1959 | "timeContext": { 1960 | "durationMs": 0 1961 | }, 1962 | "timeContextFromParameter": "TimeRange", 1963 | "queryType": 0, 1964 | "resourceType": "microsoft.operationalinsights/workspaces", 1965 | "crossComponentResources": [ 1966 | "{Workspace}" 1967 | ], 1968 | "visualization": "linechart" 1969 | }, 1970 | "customWidth": "50", 1971 | "showPin": true, 1972 | "name": "session-iowrite", 1973 | "styleSettings": { 1974 | "margin": "1px", 1975 | "padding": "1px", 1976 | "showBorder": true 1977 | } 1978 | }, 1979 | { 1980 | "type": 3, 1981 | "content": { 1982 | "version": "KqlItem/1.0", 1983 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nPerf\r\n| extend HostPool = '{HostPool}'\r\n| extend FullName = strcat(HostPool, \"/\", Computer)\r\n| where FullName in (WVDHosts)\r\n| where InstanceName != \"_Total\"\r\n| where ObjectName == \"Process\" and CounterName == \"IO Read Operations/sec\"\r\n| summarize AggregatedValue = avg(CounterValue) by bin(TimeGenerated, 10m), InstanceName, Computer", 1984 | "size": 0, 1985 | "showAnalytics": true, 1986 | "title": "Disk IO Read Operations/sec by Process", 1987 | "timeContext": { 1988 | "durationMs": 0 1989 | }, 1990 | "timeContextFromParameter": "TimeRange", 1991 | "queryType": 0, 1992 | "resourceType": "microsoft.operationalinsights/workspaces", 1993 | "crossComponentResources": [ 1994 | "{Workspace}" 1995 | ], 1996 | "visualization": "linechart" 1997 | }, 1998 | "customWidth": "50", 1999 | "showPin": true, 2000 | "name": "session-ioread", 2001 | "styleSettings": { 2002 | "margin": "1px", 2003 | "padding": "1px", 2004 | "showBorder": true 2005 | } 2006 | } 2007 | ] 2008 | }, 2009 | "conditionalVisibility": { 2010 | "parameterName": "selectedTab", 2011 | "comparison": "isEqualTo", 2012 | "value": "SessionPerformance" 2013 | }, 2014 | "name": "sessionperformance" 2015 | }, 2016 | { 2017 | "type": 12, 2018 | "content": { 2019 | "version": "NotebookGroup/1.0", 2020 | "groupType": "editable", 2021 | "items": [ 2022 | { 2023 | "type": 1, 2024 | "content": { 2025 | "json": "# Host Performance" 2026 | }, 2027 | "name": "text - 0" 2028 | }, 2029 | { 2030 | "type": 3, 2031 | "content": { 2032 | "version": "KqlItem/1.0", 2033 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nHeartbeat\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, Computer)\r\n| where Computername in (WVDHosts)\r\n| join (Perf\r\n| where (ObjectName == \"Terminal Services\" and CounterName == \"Active Sessions\")\r\n| make-series TSActTrend = avg(CounterValue) default=0 on TimeGenerated from {TimeRange:start} to {TimeRange:end} step {TimeRange:grain} by ObjectName, Computer | project TSActTrend, Computer) on Computer\r\n| join (Perf\r\n| where (ObjectName == \"Memory\" and CounterName == \"% Committed Bytes In Use\")\r\n| make-series MemTrend = avg(CounterValue) default=0 on TimeGenerated from {TimeRange:start} to {TimeRange:end} step {TimeRange:grain} by ObjectName, Computer | project MemTrend, Computer) on Computer\r\n| join (Perf\r\n| where (ObjectName == \"Processor\" and CounterName == \"% Processor Time\")\r\n| make-series CPUTrend = avg(CounterValue) default=0 on TimeGenerated from {TimeRange:start} to {TimeRange:end} step {TimeRange:grain} by ObjectName, Computer | project CPUTrend, Computer) on Computer\r\n| join (Perf\r\n| where (ObjectName == \"Network Adapter\" and CounterName == \"Bytes Received/sec\")\r\n| make-series NWRTrend = avg(CounterValue) default=0 on TimeGenerated from {TimeRange:start} to {TimeRange:end} step {TimeRange:grain} by ObjectName, Computer | project NWRTrend, Computer) on Computer\r\n| join (Perf\r\n| where (ObjectName == \"Network Adapter\" and CounterName == \"Bytes Sent/sec\")\r\n| make-series NWSTrend = avg(CounterValue) default=0 on TimeGenerated from {TimeRange:start} to {TimeRange:end} step {TimeRange:grain} by ObjectName, Computer | project NWSTrend, Computer) on Computer\r\n| project Computer, TSActTrend, MemTrend, CPUTrend, NWRTrend, NWSTrend", 2034 | "size": 1, 2035 | "showAnalytics": true, 2036 | "title": "Host Performance Overview", 2037 | "noDataMessage": "No performance counters to display. Please confirm that you have enabled the performance counter collection in your Log Analytics workspace", 2038 | "timeContext": { 2039 | "durationMs": 2592000000 2040 | }, 2041 | "timeContextFromParameter": "TimeRange", 2042 | "queryType": 0, 2043 | "resourceType": "microsoft.operationalinsights/workspaces", 2044 | "crossComponentResources": [ 2045 | "{Workspace}" 2046 | ], 2047 | "gridSettings": { 2048 | "formatters": [ 2049 | { 2050 | "columnMatch": "TSActTrend", 2051 | "formatter": 21, 2052 | "formatOptions": { 2053 | "palette": "blue" 2054 | } 2055 | }, 2056 | { 2057 | "columnMatch": "MemTrend", 2058 | "formatter": 21, 2059 | "formatOptions": { 2060 | "palette": "blue" 2061 | } 2062 | }, 2063 | { 2064 | "columnMatch": "CPUTrend", 2065 | "formatter": 21, 2066 | "formatOptions": { 2067 | "palette": "blue" 2068 | } 2069 | }, 2070 | { 2071 | "columnMatch": "NWRTrend", 2072 | "formatter": 21, 2073 | "formatOptions": { 2074 | "palette": "blue" 2075 | } 2076 | }, 2077 | { 2078 | "columnMatch": "NWSTrend", 2079 | "formatter": 21, 2080 | "formatOptions": { 2081 | "palette": "blue" 2082 | } 2083 | } 2084 | ], 2085 | "labelSettings": [ 2086 | { 2087 | "columnId": "Computer" 2088 | }, 2089 | { 2090 | "columnId": "TSActTrend", 2091 | "label": "Terminal Services Active Sessions" 2092 | }, 2093 | { 2094 | "columnId": "MemTrend", 2095 | "label": "Memory % Committed Bytes in Use" 2096 | }, 2097 | { 2098 | "columnId": "CPUTrend", 2099 | "label": "Processor % Processor Time" 2100 | }, 2101 | { 2102 | "columnId": "NWRTrend", 2103 | "label": "Network Bytes Read/sec" 2104 | }, 2105 | { 2106 | "columnId": "NWSTrend", 2107 | "label": "Network Bytes Sent/sec" 2108 | } 2109 | ] 2110 | } 2111 | }, 2112 | "name": "hostperfoverview" 2113 | }, 2114 | { 2115 | "type": 3, 2116 | "content": { 2117 | "version": "KqlItem/1.0", 2118 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nPerf\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, Computer)\r\n| where Computername in (WVDHosts)\r\n| where (ObjectName == \"Logical Disk\" or ObjectName == \"LogicalDisk\") and CounterName contains \"%\" and InstanceName != \"_Total\" and InstanceName !contains \"HarddiskVolume\"\r\n| project TimeGenerated, Computer, ObjectName, CounterName, InstanceName, CounterValue \r\n| summarize arg_max(TimeGenerated, *) by Computer, InstanceName\r\n| extend SpaceUsed = (100-CounterValue)\r\n| top 10 by SpaceUsed desc", 2119 | "size": 1, 2120 | "showAnalytics": true, 2121 | "title": "Top 10 Hosts - Disk % Free Space", 2122 | "timeContext": { 2123 | "durationMs": 2592000000 2124 | }, 2125 | "timeContextFromParameter": "TimeRange", 2126 | "queryType": 0, 2127 | "resourceType": "microsoft.operationalinsights/workspaces", 2128 | "crossComponentResources": [ 2129 | "{Workspace}" 2130 | ], 2131 | "gridSettings": { 2132 | "formatters": [ 2133 | { 2134 | "columnMatch": "TimeGenerated", 2135 | "formatter": 6, 2136 | "formatOptions": {}, 2137 | "dateFormat": { 2138 | "formatName": "longDatePattern" 2139 | } 2140 | }, 2141 | { 2142 | "columnMatch": "ObjectName", 2143 | "formatter": 5, 2144 | "formatOptions": {} 2145 | }, 2146 | { 2147 | "columnMatch": "CounterName", 2148 | "formatter": 5, 2149 | "formatOptions": {} 2150 | }, 2151 | { 2152 | "columnMatch": "CounterValue", 2153 | "formatter": 5, 2154 | "formatOptions": {}, 2155 | "numberFormat": { 2156 | "unit": 1, 2157 | "options": { 2158 | "style": "decimal", 2159 | "useGrouping": false, 2160 | "maximumFractionDigits": 1 2161 | } 2162 | } 2163 | }, 2164 | { 2165 | "columnMatch": "SpaceUsed", 2166 | "formatter": 3, 2167 | "formatOptions": { 2168 | "max": 100, 2169 | "palette": "greenRed" 2170 | }, 2171 | "numberFormat": { 2172 | "unit": 1, 2173 | "options": { 2174 | "style": "decimal" 2175 | } 2176 | } 2177 | } 2178 | ], 2179 | "labelSettings": [ 2180 | { 2181 | "columnId": "Computer" 2182 | }, 2183 | { 2184 | "columnId": "InstanceName" 2185 | }, 2186 | { 2187 | "columnId": "TimeGenerated", 2188 | "label": "Last Counter Date", 2189 | "comment": "Most recent performance counter collected" 2190 | }, 2191 | { 2192 | "columnId": "ObjectName" 2193 | }, 2194 | { 2195 | "columnId": "CounterName" 2196 | }, 2197 | { 2198 | "columnId": "CounterValue" 2199 | }, 2200 | { 2201 | "columnId": "SpaceUsed", 2202 | "label": "% Disk Space Used" 2203 | } 2204 | ] 2205 | } 2206 | }, 2207 | "customWidth": "50", 2208 | "showPin": true, 2209 | "name": "hostperf-top10diskspace", 2210 | "styleSettings": { 2211 | "margin": "1px", 2212 | "padding": "1px", 2213 | "showBorder": true 2214 | } 2215 | }, 2216 | { 2217 | "type": 3, 2218 | "content": { 2219 | "version": "KqlItem/1.0", 2220 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nPerf\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, Computer)\r\n| where Computername in (WVDHosts)\r\n| where ObjectName == \"Processor\" and CounterName == \"% Processor Time\"\r\n| project TimeGenerated, Computer, ObjectName, CounterName, InstanceName, CounterValue \r\n| summarize AggregatedValue = avg(CounterValue) by bin(TimeGenerated, 1h), Computer\r\n| summarize arg_max(TimeGenerated, *) by Computer\r\n| top 10 by AggregatedValue desc", 2221 | "size": 1, 2222 | "showAnalytics": true, 2223 | "title": "Top 10 Hosts - Processor Utilisation", 2224 | "timeContext": { 2225 | "durationMs": 2592000000 2226 | }, 2227 | "timeContextFromParameter": "TimeRange", 2228 | "queryType": 0, 2229 | "resourceType": "microsoft.operationalinsights/workspaces", 2230 | "crossComponentResources": [ 2231 | "{Workspace}" 2232 | ], 2233 | "gridSettings": { 2234 | "formatters": [ 2235 | { 2236 | "columnMatch": "AggregatedValue", 2237 | "formatter": 3, 2238 | "formatOptions": { 2239 | "min": 0, 2240 | "max": 100, 2241 | "palette": "greenRed" 2242 | }, 2243 | "numberFormat": { 2244 | "unit": 1, 2245 | "options": { 2246 | "style": "decimal", 2247 | "maximumFractionDigits": 1 2248 | } 2249 | } 2250 | } 2251 | ] 2252 | } 2253 | }, 2254 | "customWidth": "50", 2255 | "showPin": true, 2256 | "name": "hostperf-top10cpu", 2257 | "styleSettings": { 2258 | "margin": "1px", 2259 | "padding": "1px", 2260 | "showBorder": true 2261 | } 2262 | }, 2263 | { 2264 | "type": 3, 2265 | "content": { 2266 | "version": "KqlItem/1.0", 2267 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nPerf\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, Computer)\r\n| where Computername in (WVDHosts)\r\n| where ObjectName == \"LogicalDisk\" and CounterName == \"% Free Space\" \r\n| where InstanceName <> \"_Total\" \r\n| summarize AggregatedValue = avg(CounterValue) by bin(TimeGenerated, 10m), Computer, InstanceName ", 2268 | "size": 1, 2269 | "aggregation": 3, 2270 | "title": "Logical Disk Space Used by Host", 2271 | "timeContext": { 2272 | "durationMs": 2592000000 2273 | }, 2274 | "timeContextFromParameter": "TimeRange", 2275 | "queryType": 0, 2276 | "resourceType": "microsoft.operationalinsights/workspaces", 2277 | "crossComponentResources": [ 2278 | "{Workspace}" 2279 | ], 2280 | "visualization": "linechart", 2281 | "chartSettings": { 2282 | "ySettings": { 2283 | "numberFormatSettings": { 2284 | "unit": 1, 2285 | "options": { 2286 | "style": "decimal", 2287 | "useGrouping": true, 2288 | "maximumFractionDigits": 2 2289 | } 2290 | }, 2291 | "max": 100 2292 | } 2293 | } 2294 | }, 2295 | "customWidth": "25", 2296 | "showPin": true, 2297 | "name": "diskspacebyhost", 2298 | "styleSettings": { 2299 | "margin": "1px", 2300 | "padding": "1px", 2301 | "showBorder": true 2302 | } 2303 | }, 2304 | { 2305 | "type": 3, 2306 | "content": { 2307 | "version": "KqlItem/1.0", 2308 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nPerf\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, Computer)\r\n| where Computername in (WVDHosts)\r\n| where ObjectName == \"Processor\" and CounterName == \"% Processor Time\"\r\n| summarize AggregatedValue = avg(CounterValue) by bin(TimeGenerated, 10m), Computer, InstanceName ", 2309 | "size": 1, 2310 | "aggregation": 3, 2311 | "title": "Processor % Processor Time per host", 2312 | "timeContext": { 2313 | "durationMs": 2592000000 2314 | }, 2315 | "timeContextFromParameter": "TimeRange", 2316 | "queryType": 0, 2317 | "resourceType": "microsoft.operationalinsights/workspaces", 2318 | "crossComponentResources": [ 2319 | "{Workspace}" 2320 | ], 2321 | "visualization": "timechart", 2322 | "chartSettings": { 2323 | "ySettings": { 2324 | "numberFormatSettings": { 2325 | "unit": 1, 2326 | "options": { 2327 | "style": "decimal", 2328 | "useGrouping": true, 2329 | "maximumFractionDigits": 1 2330 | } 2331 | }, 2332 | "max": 100 2333 | } 2334 | } 2335 | }, 2336 | "customWidth": "25", 2337 | "showPin": true, 2338 | "name": "hostperf-processor", 2339 | "styleSettings": { 2340 | "margin": "1px", 2341 | "padding": "1px", 2342 | "showBorder": true 2343 | } 2344 | }, 2345 | { 2346 | "type": 3, 2347 | "content": { 2348 | "version": "KqlItem/1.0", 2349 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nPerf\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, Computer)\r\n| where Computername in (WVDHosts)\r\n| where ObjectName == \"Memory\" and CounterName == \"% Committed Bytes In Use\"\r\n| summarize AggregatedValue = avg(CounterValue) by bin(TimeGenerated, 10m), Computer", 2350 | "size": 1, 2351 | "aggregation": 3, 2352 | "title": "Memory % Committed bytes in use per Host", 2353 | "timeContext": { 2354 | "durationMs": 2592000000 2355 | }, 2356 | "timeContextFromParameter": "TimeRange", 2357 | "queryType": 0, 2358 | "resourceType": "microsoft.operationalinsights/workspaces", 2359 | "crossComponentResources": [ 2360 | "{Workspace}" 2361 | ], 2362 | "visualization": "timechart", 2363 | "chartSettings": { 2364 | "ySettings": { 2365 | "numberFormatSettings": { 2366 | "unit": 1, 2367 | "options": { 2368 | "style": "decimal", 2369 | "useGrouping": true, 2370 | "maximumFractionDigits": 1 2371 | } 2372 | }, 2373 | "max": 100 2374 | } 2375 | } 2376 | }, 2377 | "customWidth": "25", 2378 | "showPin": true, 2379 | "name": "hostperf-memory", 2380 | "styleSettings": { 2381 | "margin": "1px", 2382 | "padding": "1px", 2383 | "showBorder": true 2384 | } 2385 | }, 2386 | { 2387 | "type": 3, 2388 | "content": { 2389 | "version": "KqlItem/1.0", 2390 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nPerf\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, Computer)\r\n| where Computername in (WVDHosts)\r\n| where ObjectName == \"Network Interface\" \r\n| summarize AggregatedValue = avg(CounterValue) by bin(TimeGenerated, 10m), Computer, InstanceName, CounterName ", 2391 | "size": 1, 2392 | "aggregation": 3, 2393 | "title": "Network Usage per host", 2394 | "timeContext": { 2395 | "durationMs": 2592000000 2396 | }, 2397 | "timeContextFromParameter": "TimeRange", 2398 | "queryType": 0, 2399 | "resourceType": "microsoft.operationalinsights/workspaces", 2400 | "crossComponentResources": [ 2401 | "{Workspace}" 2402 | ], 2403 | "visualization": "timechart", 2404 | "chartSettings": { 2405 | "ySettings": { 2406 | "numberFormatSettings": { 2407 | "unit": 11, 2408 | "options": { 2409 | "style": "decimal", 2410 | "useGrouping": true, 2411 | "maximumFractionDigits": 1 2412 | } 2413 | } 2414 | } 2415 | } 2416 | }, 2417 | "customWidth": "25", 2418 | "showPin": true, 2419 | "name": "hostperf-network", 2420 | "styleSettings": { 2421 | "margin": "1px", 2422 | "padding": "1px", 2423 | "showBorder": true 2424 | } 2425 | }, 2426 | { 2427 | "type": 3, 2428 | "content": { 2429 | "version": "KqlItem/1.0", 2430 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nPerf\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, Computer)\r\n| where Computername in (WVDHosts)\r\n| where ObjectName == \"RemoteFX Network\" and InstanceName matches regex @\"(rdp-sxs\\d{9}\\s\\d{0,7}|rdp-sxs#\\d{0,7}|rdp-sxs \\d{0,7})\" and CounterName == \"Current TCP RTT\" and CounterValue > 0\r\n| summarize RTTLatency =avg(CounterValue) by Computer, bin(TimeGenerated, 5m), InstanceName\r\n| order by RTTLatency desc", 2431 | "size": 0, 2432 | "aggregation": 3, 2433 | "title": "RTT Latency avg by Computer (ms)", 2434 | "timeContext": { 2435 | "durationMs": 0 2436 | }, 2437 | "timeContextFromParameter": "TimeRange", 2438 | "queryType": 0, 2439 | "resourceType": "microsoft.operationalinsights/workspaces", 2440 | "crossComponentResources": [ 2441 | "{Workspace}" 2442 | ], 2443 | "visualization": "timechart" 2444 | }, 2445 | "name": "hostperf-rtt" 2446 | }, 2447 | { 2448 | "type": 3, 2449 | "content": { 2450 | "version": "KqlItem/1.0", 2451 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nPerf\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, Computer)\r\n| where Computername in (WVDHosts)\r\n| where ObjectName == \"RemoteFX Network\" and InstanceName matches regex @\"(rdp-sxs\\d{9}\\s\\d{0,7}|rdp-sxs#\\d{0,7}|rdp-sxs \\d{0,7})\" and CounterName == \"Current TCP RTT\" and CounterValue > 0\r\n| summarize RTTLatency =avg(CounterValue) by InstanceName, bin(TimeGenerated, 5m), Computer\r\n| project RTTLatency, TimeGenerated, strcat(InstanceName, \"-\", Computer)\r\n| order by RTTLatency desc", 2452 | "size": 0, 2453 | "aggregation": 3, 2454 | "title": "RTT Latency avg by SessionID (ms)", 2455 | "timeContext": { 2456 | "durationMs": 0 2457 | }, 2458 | "timeContextFromParameter": "TimeRange", 2459 | "queryType": 0, 2460 | "resourceType": "microsoft.operationalinsights/workspaces", 2461 | "crossComponentResources": [ 2462 | "{Workspace}" 2463 | ], 2464 | "visualization": "timechart", 2465 | "chartSettings": { 2466 | "group": "Column1", 2467 | "createOtherGroup": 0, 2468 | "showLegend": true 2469 | } 2470 | }, 2471 | "name": "hostperf-rtt - Usersessions" 2472 | } 2473 | ] 2474 | }, 2475 | "conditionalVisibility": { 2476 | "parameterName": "selectedTab", 2477 | "comparison": "isEqualTo", 2478 | "value": "HostPerformance" 2479 | }, 2480 | "name": "hostperformance" 2481 | }, 2482 | { 2483 | "type": 12, 2484 | "content": { 2485 | "version": "NotebookGroup/1.0", 2486 | "groupType": "editable", 2487 | "items": [ 2488 | { 2489 | "type": 1, 2490 | "content": { 2491 | "json": "# Disk Performance" 2492 | }, 2493 | "name": "text - 0" 2494 | }, 2495 | { 2496 | "type": 3, 2497 | "content": { 2498 | "version": "KqlItem/1.0", 2499 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nPerf\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, Computer)\r\n| where Computername in (WVDHosts)\r\n| where ObjectName == \"PhysicalDisk\" and InstanceName !contains \"Total\"\r\n| join (Perf\r\n| where (ObjectName == \"PhysicalDisk\" and CounterName == \"Avg. Disk Bytes/Read\")\r\n| make-series AvgDiskBytesRead = avg(CounterValue) default=0 on TimeGenerated from {TimeRange:start} to {TimeRange:end} step {TimeRange:grain} by ObjectName, Computer | project AvgDiskBytesRead, Computer) on Computer\r\n| join (Perf\r\n| where (ObjectName == \"PhysicalDisk\" and CounterName == \"Avg. Disk Bytes/Write\")\r\n| make-series AvgDiskBytesWrite = avg(CounterValue) default=0 on TimeGenerated from {TimeRange:start} to {TimeRange:end} step {TimeRange:grain} by ObjectName, Computer | project AvgDiskBytesWrite, Computer) on Computer\r\n| join (Perf\r\n| where (ObjectName == \"PhysicalDisk\" and CounterName == \"Avg. Disk sec/Write\")\r\n| make-series AvgDiskSecBytesWrite = avg(CounterValue) default=0 on TimeGenerated from {TimeRange:start} to {TimeRange:end} step {TimeRange:grain} by ObjectName, Computer | project AvgDiskSecBytesWrite, Computer) on Computer\r\n| join (Perf\r\n| where (ObjectName == \"PhysicalDisk\" and CounterName == \"Avg. Disk sec/Read\")\r\n| make-series DiskReadsSec = avg(CounterValue) default=0 on TimeGenerated from {TimeRange:start} to {TimeRange:end} step {TimeRange:grain} by ObjectName, Computer | project DiskReadsSec, Computer) on Computer\r\n| join (Perf\r\n| where (ObjectName == \"PhysicalDisk\" and CounterName == \"Avg. Disk Bytes/Transfer\")\r\n| make-series AvgDiskSecBytesTransfer = avg(CounterValue) default=0 on TimeGenerated from {TimeRange:start} to {TimeRange:end} step {TimeRange:grain} by ObjectName, Computer | project AvgDiskSecBytesTransfer, Computer) on Computer\r\n| join (Perf\r\n| where (ObjectName == \"PhysicalDisk\" and CounterName == \"Avg. Disk sec/Transfer\")\r\n| make-series AvgDiskSecTransfer = avg(CounterValue) default=0 on TimeGenerated from {TimeRange:start} to {TimeRange:end} step {TimeRange:grain} by ObjectName, Computer | project AvgDiskSecTransfer, Computer) on Computer\r\n| project Computer, AvgDiskBytesRead, AvgDiskBytesWrite, AvgDiskSecBytesWrite, DiskReadsSec, AvgDiskSecBytesTransfer, AvgDiskSecTransfer", 2500 | "size": 0, 2501 | "title": "Host Disk Performance Overview", 2502 | "noDataMessage": "No results. Please ensure that you have configured collection of disk performance counters across your hosts.", 2503 | "noDataMessageStyle": 4, 2504 | "timeContext": { 2505 | "durationMs": 0 2506 | }, 2507 | "timeContextFromParameter": "TimeRange", 2508 | "queryType": 0, 2509 | "resourceType": "microsoft.operationalinsights/workspaces", 2510 | "crossComponentResources": [ 2511 | "{Workspace}" 2512 | ], 2513 | "gridSettings": { 2514 | "formatters": [ 2515 | { 2516 | "columnMatch": "AvgDiskBytesRead", 2517 | "formatter": 21, 2518 | "formatOptions": { 2519 | "palette": "blue" 2520 | } 2521 | }, 2522 | { 2523 | "columnMatch": "AvgDiskBytesWrite", 2524 | "formatter": 21, 2525 | "formatOptions": { 2526 | "palette": "blue" 2527 | } 2528 | }, 2529 | { 2530 | "columnMatch": "AvgDiskSecBytesWrite", 2531 | "formatter": 21, 2532 | "formatOptions": { 2533 | "palette": "blue" 2534 | } 2535 | }, 2536 | { 2537 | "columnMatch": "DiskReadsSec", 2538 | "formatter": 21, 2539 | "formatOptions": { 2540 | "palette": "blue" 2541 | } 2542 | }, 2543 | { 2544 | "columnMatch": "AvgDiskSecBytesTransfer", 2545 | "formatter": 21, 2546 | "formatOptions": { 2547 | "palette": "blue" 2548 | } 2549 | }, 2550 | { 2551 | "columnMatch": "AvgDiskSecTransfer", 2552 | "formatter": 21, 2553 | "formatOptions": { 2554 | "palette": "blue" 2555 | } 2556 | } 2557 | ] 2558 | } 2559 | }, 2560 | "name": "query - 3" 2561 | }, 2562 | { 2563 | "type": 9, 2564 | "content": { 2565 | "version": "KqlParameterItem/1.0", 2566 | "crossComponentResources": [ 2567 | "{Workspace}" 2568 | ], 2569 | "parameters": [ 2570 | { 2571 | "id": "36641c91-e8dc-4fb1-a4f0-0f981443a37b", 2572 | "version": "KqlParameterItem/1.0", 2573 | "name": "DiskCounter", 2574 | "label": "Disk Counter", 2575 | "type": 2, 2576 | "isRequired": true, 2577 | "multiSelect": true, 2578 | "quote": "'", 2579 | "delimiter": ",", 2580 | "query": "Perf\r\n| where ObjectName == \"LogicalDisk\"\r\n| summarize Count = count() by CounterName\r\n| project value = CounterName, label = CounterName, Selected = Count >= 0", 2581 | "crossComponentResources": [ 2582 | "{Workspace}" 2583 | ], 2584 | "value": [ 2585 | "% Free Space" 2586 | ], 2587 | "typeSettings": { 2588 | "additionalResourceOptions": [ 2589 | "value::all" 2590 | ], 2591 | "showDefault": false 2592 | }, 2593 | "timeContext": { 2594 | "durationMs": 0 2595 | }, 2596 | "timeContextFromParameter": "TimeRange", 2597 | "queryType": 0, 2598 | "resourceType": "microsoft.operationalinsights/workspaces" 2599 | } 2600 | ], 2601 | "style": "pills", 2602 | "queryType": 0, 2603 | "resourceType": "microsoft.operationalinsights/workspaces" 2604 | }, 2605 | "name": "parameters - 2" 2606 | }, 2607 | { 2608 | "type": 3, 2609 | "content": { 2610 | "version": "KqlItem/1.0", 2611 | "query": "let WVDHosts = dynamic([{WVDHosts}]);\r\nlet Counter = dynamic([{DiskCounter}]);\r\nPerf\r\n| extend HostPool = '{HostPool}'\r\n| extend HostPool = strcat(HostPool, \"/\")\r\n| extend Computername = strcat(HostPool, Computer)\r\n| where Computername in (WVDHosts)\r\n| where ObjectName == \"LogicalDisk\" and CounterName in (Counter) and InstanceName !contains \"Total\"\r\n| summarize AggregatedValue = avg(CounterValue) by bin(TimeGenerated, 10m), CounterName, Computer, InstanceName", 2612 | "size": 0, 2613 | "aggregation": 3, 2614 | "showAnalytics": true, 2615 | "title": "{DiskCounter}", 2616 | "timeContext": { 2617 | "durationMs": 0 2618 | }, 2619 | "timeContextFromParameter": "TimeRange", 2620 | "queryType": 0, 2621 | "resourceType": "microsoft.operationalinsights/workspaces", 2622 | "crossComponentResources": [ 2623 | "{Workspace}" 2624 | ], 2625 | "visualization": "linechart", 2626 | "chartSettings": { 2627 | "group": "Computer", 2628 | "createOtherGroup": null, 2629 | "showLegend": true, 2630 | "ySettings": { 2631 | "numberFormatSettings": { 2632 | "unit": 0, 2633 | "options": { 2634 | "style": "decimal", 2635 | "useGrouping": true, 2636 | "maximumFractionDigits": 2 2637 | } 2638 | } 2639 | } 2640 | } 2641 | }, 2642 | "name": "diskperfall" 2643 | } 2644 | ] 2645 | }, 2646 | "conditionalVisibility": { 2647 | "parameterName": "selectedTab", 2648 | "comparison": "isEqualTo", 2649 | "value": "DiskPerformance" 2650 | }, 2651 | "name": "diskperformancegroup" 2652 | } 2653 | ], 2654 | "fallbackResourceIds": [ 2655 | "Azure Monitor" 2656 | ], 2657 | "$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json" 2658 | } 2659 | --------------------------------------------------------------------------------