你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure 虚拟桌面中会话主机更新的示例诊断查询

重要

Azure 虚拟桌面的会话主机更新目前为预览版。 有关适用于 Beta 版、预览版或其他尚未正式发布的 Azure 功能的法律条款,请参阅 Microsoft Azure 预览版补充使用条款

会话主机更新使用 Azure Monitor 中的 Log Analytics 来存储有关更新的信息。 本文提供了一些可用于 Log Analytics 的示例 Kusto 查询,以查看有关会话主机更新的信息。

先决条件

在使用这些查询之前,需要:

  • 具有会话主机配置的现有主机池。

  • 在会话主机更新中用于将日志和指标发送到 Log Analytics 工作区的每个主机池上配置 了诊断设置 。 必须至少启用 “检查点”、“ 错误”“会话主机管理活动日志 ”类别。

  • 以前 在主机池中的会话主机上计划并运行 会话主机更新。

诊断数据位置

在主机池上配置诊断设置后,会话主机更新的诊断数据将存储在 Log Analytics 工作区的表 WVDSessionHostManagementWVDCheckpoints 中。 日志条目使用来自 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 已更新的会话主机数

后续步骤

有关会话主机更新的故障排除指南,请参阅 会话主机更新疑难解答