你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
重要
Azure 虚拟桌面的会话主机更新目前为预览版。 有关适用于 Beta 版、预览版或其他尚未正式发布的 Azure 功能的法律条款,请参阅 Microsoft Azure 预览版补充使用条款 。
会话主机更新使用 Azure Monitor 中的 Log Analytics 来存储有关更新的信息。 本文提供了一些可用于 Log Analytics 的示例 Kusto 查询,以查看有关会话主机更新的信息。
先决条件
在使用这些查询之前,需要:
具有会话主机配置的现有主机池。
在会话主机更新中用于将日志和指标发送到 Log Analytics 工作区的每个主机池上配置 了诊断设置 。 必须至少启用 “检查点”、“ 错误”和 “会话主机管理活动日志 ”类别。
以前 在主机池中的会话主机上计划并运行 会话主机更新。
诊断数据位置
在主机池上配置诊断设置后,会话主机更新的诊断数据将存储在 Log Analytics 工作区的表 WVDSessionHostManagement 和 WVDCheckpoints 中。 日志条目使用来自 Azure 资源管理器 (ARM) 提供程序的现有管理活动类型。
该表 WVDSessionHostManagement 特定于会话主机更新,在会话主机更新和会话主机更新运行的每个主机池的诊断设置上启用类别“会话主机 管理活动日志 ”后创建。 如果以前为主机池配置了诊断设置,则需要启用“ 会话主机管理活动日志”类别。 有关详细信息 ,请配置诊断设置以捕获 Azure 虚拟桌面的平台日志和指标。
本文的其余部分提供了一些可以运行的示例查询。 可以使用它们作为创建自己的查询的基础。 需要在 Log Analytics 中运行每个查询。 有关如何运行查询的详细信息,请参阅 启动 Log Analytics。
成功完成的会话主机更新
此查询关联表 WVDSessionHostManagement ,并提供 WVDCheckpoints 完成更新所需的时间以及过去 30 天内更新单个会话主机的中值时间(以分钟为单位):
let timeRange = ago(30d);
let succeededStatus = "Succeeded";
let hostPoolUpdateCompletedCheckpoint = "HostPoolUpdateCompleted";
let sessionHostUpdateCompletedCheckpoint = "SessionHostUpdateCompleted";
let provisioningTypeUpdate = "Update";
WVDSessionHostManagement
| where ProvisioningStatus == succeededStatus and TimeGenerated >= timeRange and ProvisioningType == provisioningTypeUpdate
| join kind = inner (
// Get number of session hosts updated
WVDCheckpoints
| where Name == hostPoolUpdateCompletedCheckpoint
| extend ParametersParsed = parse_json(Parameters)
| extend SessionHostUpdateCount = ParametersParsed["SessionHostsUpdateCompleted"], UpdateCompletionTime = todatetime(ParametersParsed["TimeCompleted"]), UpdateStartTime = todatetime(ParametersParsed["TimeStarted"])
| project CorrelationId, SessionHostUpdateCount, UpdateStartTime, UpdateCompletionTime
) on CorrelationId
| join kind = inner
(
// Get time to update individual session hosts
WVDCheckpoints
| where Name == sessionHostUpdateCompletedCheckpoint
| extend ParametersParsed = parse_json(Parameters)
| extend SessionHostUpdateTime = todecimal(ParametersParsed["TimeTakenToUpdateSessionHostInSeconds"])
// Calculate median time to update session host
| summarize SessionHostMedianUpdateTime = percentile(SessionHostUpdateTime, 50) by CorrelationId
) on CorrelationId
| project TimeGenerated, _SubscriptionId, _ResourceId, CorrelationId, UpdateStartDateTime = UpdateStartTime, UpdateEndDateTime = UpdateCompletionTime, ['UpdateDuration [InMinutes]'] = datetime_diff('minute', UpdateCompletionTime, UpdateStartTime), SessionHostUpdateCount, ['MedianSessionHostUpdateTime [InMinutes]'] = toint(SessionHostMedianUpdateTime/(60 * 1.0)), UpdateBatchSize = UpdateMaxVmsRemoved, FromSessionHostConfigVer, ToSessionHostConfigVer, UpdateDeleteOriginalVm
返回的数据集如下所示:
| Column | 定义 |
|---|---|
| TimeGenerated | 系统生成的事件时间戳 |
| _SubscriptionId | 主机池的订阅 ID |
| _ResourceId | 主机池的资源 ID |
| CorrelationId | 分配给对主机池执行的每个映像更新的唯一标识符 |
| UpdateStartDateTime | 会话主机更新开始时间戳(UTC) |
| UpdateEndDateTime | 会话主机更新完成时间戳(UTC) |
| UpdateDuration | 完成更新主机池中所有会话主机映像所需的时间(以分钟为单位) |
| SessionHostUpdateCount | 已更新的会话主机数 |
| MedianSessionHostUpdateTime | 更新单个会话主机映像的中值时间(分钟) |
| UpdateBatchSize | 映像更新期间单个批处理中的会话主机数 |
| FromSessionHostConfigVer | 更新映像之前的会话主机配置 |
| ToSessionHostConfigVer | 更新映像后的会话主机配置 |
| UpdateDeleteOriginalVm | 映像更新完成后是否保留了原始虚拟机 |
会话主机更新期间的错误
此查询关联表 WVDSessionHostManagement ,并提供 WVDErrors 可用于排查过去 30 天内会话主机更新期间发生的错误的信息:
let timeRange = ago(30d);
let provisioningTypeUpdate = "Update";
WVDSessionHostManagement
| where ProvisioningStatus in ("Failed", "Error", "Canceled") and TimeGenerated >= timeRange and ProvisioningType == provisioningTypeUpdate
| summarize arg_max(TimeGenerated, _ResourceId, _SubscriptionId, FromSessionHostConfigVer, ToSessionHostConfigVer) by CorrelationId
| join kind = inner
(
// Get image update errors
WVDErrors
| where TimeGenerated >= timeRange
| extend IsSessionHostResourceIdAvailable = iif(Message startswith "SessionHostResourceId", 1, 0)
| extend startIndex = iif(IsSessionHostResourceIdAvailable == 1, indexof(Message, ":") + 1, 0)
| extend length = iif(IsSessionHostResourceIdAvailable == 1, indexof(Message, ";") - startIndex, 0)
// Get Session host ResourceId when available
| extend SessionHostResourceId = iif(IsSessionHostResourceIdAvailable == 1, substring(Message, startIndex, length), "")
| project TimeGenerated, CorrelationId, SessionHostResourceId, CodeSymbolic, Message
) on CorrelationId
| project TimeGenerated, _SubscriptionId, _ResourceId, CorrelationId, CodeSymbolic, SessionHostResourceId, Message, FromSessionHostConfigVer, ToSessionHostConfigVer
返回的数据集如下所示:
| Column | 定义 |
|---|---|
| TimeGenerated | 系统生成的事件时间戳 |
| _SubscriptionId | 主机池的订阅 ID |
| _ResourceId | 主机池的资源 ID |
| CorrelationId | 分配给对主机池执行的每个映像更新的唯一标识符 |
| CodeSymbolic | 错误代码 |
| SessionHostResourceId | 会话主机的资源 ID(如果适用) |
| 邮件 | 错误信息 |
| FromSessionHostConfigVer | 映像更新之前的会话主机配置版本 |
| ToSessionHostConfigVer | 会话主机配置版本,更新过程失败时会话主机已更新到哪个版本 |
管理员在计划时间之前取消的会话主机更新
此查询关联表 WVDSessionHostManagement ,并提供 WVDCheckpoints 在过去 30 天内计划但随后由管理员取消的会话主机更新:
let timeRange = ago(30d);
let canceledStatus = "Canceled";
let scheduledStatus = "Scheduled";
let hostPoolUpdateCanceledCheckpoint = "HostPoolUpdateCanceled";
let provisioningTypeUpdate = "Update";
WVDSessionHostManagement
| where ProvisioningStatus == canceledStatus and TimeGenerated >= timeRange and ProvisioningType == provisioningTypeUpdate
| join kind = inner
(
WVDCheckpoints
| where Name == "HostPoolUpdateCanceled"
| project TimeGenerated, CorrelationId, Name, Parameters
| extend ParametersParsed = parse_json(Parameters)
| extend StateFrom = tostring(ParametersParsed["StateFrom"]), StateTo = tostring(ParametersParsed["StateTo"]), CanceledTime = todatetime(ParametersParsed["TimeCanceled"])
| where StateFrom == scheduledStatus and StateTo == canceledStatus
) on CorrelationId
| project TimeGenerated, _SubscriptionId, _ResourceId, CorrelationId, ScheduledDateTime = todatetime(ScheduledDateTime), CanceledDateTime = CanceledTime, UpdateBatchSize = UpdateMaxVmsRemoved
返回的数据集如下所示:
| Column | 定义 |
|---|---|
| TimeGenerated | 系统生成的事件时间戳 |
| _SubscriptionId | 主机池的订阅 ID |
| _ResourceId | 主机池的资源 ID |
| CorrelationId | 分配给主机池映像的每次更新的唯一标识符 |
| ScheduledDateTime | 会话主机更新计划时间(UTC) |
| CanceledDateTime | 管理员取消映像更新的 UTC 时间 |
| UpdateBatchSize | 映像更新期间单个批处理中的会话主机数 |
会话主机更新正在进行或失败,随后由管理员取消
此查询关联表 WVDSessionHostManagement ,并提供 WVDCheckpoints 正在进行或失败的会话主机更新,然后由管理员在过去 30 天内取消:
let timeRange = ago(30d);
let canceledStatus = "Canceled";
let scheduledStatus = "Scheduled";
let hostPoolUpdateCanceledCheckpoint = "HostPoolUpdateCanceled";
let provisioningTypeUpdate = "Update";
WVDSessionHostManagement
| where ProvisioningStatus == canceledStatus and TimeGenerated >= timeRange and ProvisioningType == provisioningTypeUpdate
| join kind = inner
(
WVDCheckpoints
| where Name == hostPoolUpdateCanceledCheckpoint
| project TimeGenerated, CorrelationId, Name, Parameters
| extend ParametersParsed = parse_json(Parameters)
| extend StateFrom = tostring(ParametersParsed["StateFrom"]), StateTo = tostring(ParametersParsed["StateTo"]), CanceledTime = todatetime(ParametersParsed["TimeCanceled"]), TotalSessionHostsInHostPool = toint(ParametersParsed["TotalSessionHostsInHostPool"]), SessionHostUpdateCount = ParametersParsed["SessionHostsUpdateCompleted"]
| where StateFrom != scheduledStatus and StateTo == canceledStatus
) on CorrelationId
| project TimeGenerated, _SubscriptionId, _ResourceId, CorrelationId, ScheduledDateTime = todatetime(ScheduledDateTime), CanceledDateTime = CanceledTime, TotalSessionHostsInHostPool, SessionHostUpdateCount, UpdateBatchSize = UpdateMaxVmsRemoved
返回的数据集如下所示:
| Column | 定义 |
|---|---|
| TimeGenerated | 系统生成的事件时间戳 |
| _SubscriptionId | 主机池的订阅 ID |
| _ResourceId | 主机池的资源 ID |
| CorrelationId | 分配给主机池会话主机的每个更新的唯一标识符 |
| ScheduledDateTime | 会话主机更新计划时间(UTC) |
| CanceledDateTime | 管理员取消会话主机更新的时间(UTC) |
| TotalSessionHostsInHostPool | 主机池中的会话主机总数 |
| SessionHostUpdateCount | 在取消会话主机更新之前更新的会话主机数 |
| UpdateBatchSize | 更新会话主机期间单个批处理中的会话主机数 |
每个会话主机更新的状态
此查询关联表 WVDSessionHostManagement ,并提供 WVDCheckpoints 过去 30 天内每个会话主机更新的最新状态:
let timeRange = ago(30d);
let sessionHostUpdateCompletedCheckpoint = "SessionHostUpdateCompleted";
let provisioningTypeUpdate = "Update";
WVDSessionHostManagement
| where TimeGenerated >= timeRange and ProvisioningType == provisioningTypeUpdate
| join kind = leftouter (
// Get number of session hosts updated if available
WVDCheckpoints
| where Name == sessionHostUpdateCompletedCheckpoint
| summarize SessionHostUpdateCount = count() by CorrelationId
) on CorrelationId
| summarize arg_max(TimeGenerated, _SubscriptionId, _ResourceId, ScheduledDateTime, UpdateMaxVmsRemoved, SessionHostUpdateCount, ProvisioningStatus) by CorrelationId
| project TimeGenerated, _SubscriptionId, _ResourceId, CorrelationId, ProvisioningStatus, ScheduledDateTime = todatetime(ScheduledDateTime), UpdateBatchSize = UpdateMaxVmsRemoved, SessionHostUpdateCount = iif(isempty(SessionHostUpdateCount), 0, SessionHostUpdateCount)
返回的数据集如下所示:
| Column | 定义 |
|---|---|
| TimeGenerated | 系统生成的事件时间戳 |
| _SubscriptionId | 主机池的订阅 ID |
| _ResourceId | 主机池的资源 ID |
| CorrelationId | 分配给主机池映像的每次更新的唯一标识符 |
| ProvisioningStatus | 主机池映像更新的当前状态 |
| ScheduledDateTime | 会话主机更新计划时间(UTC) |
| UpdateBatchSize | 映像更新期间单个批处理中的会话主机数 |
| SessionHostUpdateCount | 已更新的会话主机数 |
后续步骤
有关会话主机更新的故障排除指南,请参阅 会话主机更新疑难解答。