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

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

重要

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

会话主机更新使用 Azure Monitor 中的 Log Analytics 来存储有关更新的信息。 本文有一些示例 Kusto 查询,你可以将其与 Log Analytics 配合使用来查看有关会话主机更新的信息。

先决条件

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

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

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

  • 一个先前在主机池中的会话主机上计划并运行的会话主机更新

诊断数据位置

在主机池上配置诊断设置后,会话主机更新的诊断数据将存储在 Log Analytics 工作区的表 WVDSessionHostManagementWVDCheckpoints 中。 日志条目使用现有的“管理”活动类型,该类型来自 Azure 资源管理器 (ARM) 提供程序。

WVDSessionHostManagement 特定于会话主机更新,当你在与会话主机更新配合使用的每个主机池的诊断设置上启用类别“会话主机管理活动日志”且会话主机更新运行时,就会创建该表。 如果先前为主机池配置了诊断设置,则需要启用“会话主机管理活动日志”类别。 有关详细信息,请参阅配置诊断设置以捕获 Azure 虚拟桌面的平台日志和指标

本文的其余部分有一些可供运行的示例查询。 可以以它们为基础来创建你自己的查询。 需要在 Log Analytics 中运行这些查询中的每一个。 有关如何运行查询的详细信息,请参阅启动 Log Analytics

成功完成的会话主机更新

此查询将表 WVDSessionHostManagementWVDCheckpoints 关联起来,以提供完成更新所花费的时间以及过去 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

返回的数据集如下所示:

定义
TimeGenerated 系统生成的事件时间戳
_SubscriptionId 主机池的订阅 ID
_ResourceId 主机池的资源 ID
CorrelationId 为主机池上执行的每个映像更新分配的唯一标识符
UpdateStartDateTime 会话主机更新开始时间戳 (UTC)
UpdateEndDateTime 会话主机更新完成时间戳 (UTC)
UpdateDuration 更新主机池中所有会话主机的映像所花的时间(分钟)
SessionHostUpdateCount 更新的会话主机数
MedianSessionHostUpdateTime 更新单个会话主机映像所需的中位时间(分钟)
UpdateBatchSize 映像更新期间单个批次中的会话主机数量
FromSessionHostConfigVer 映像更新前的会话主机配置
ToSessionHostConfigVer 映像更新后的会话主机配置
UpdateDeleteOriginalVm 映像更新完成后是否保留了原始虚拟机

会话主机更新期间的错误

此查询将表 WVDSessionHostManagementWVDErrors 关联起来,以提供可用于排查在过去 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

返回的数据集如下所示:

定义
TimeGenerated 系统生成的事件时间戳
_SubscriptionId 主机池的订阅 ID
_ResourceId 主机池的资源 ID
CorrelationId 为主机池上执行的每个映像更新分配的唯一标识符
CodeSymbolic 错误代码
SessionHostResourceId 会话主机的资源 ID(如果适用)
消息 错误信息
FromSessionHostConfigVer 映像更新前的会话主机配置版本
ToSessionHostConfigVer 在更新过程失败的情况下会话主机更新到的会话主机配置版本

由管理员在计划的时间之前取消的会话主机更新

此查询将表 WVDSessionHostManagementWVDCheckpoints 关联起来,以提供过去 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

返回的数据集如下所示:

定义
TimeGenerated 系统生成的事件时间戳
_SubscriptionId 主机池的订阅 ID
_ResourceId 主机池的资源 ID
CorrelationId 为主机池的每个映像更新分配的唯一标识符
ScheduledDateTime 会话主机更新计划时间 (UTC)
CanceledDateTime 管理员取消映像更新的时间 (UTC)
UpdateBatchSize 映像更新期间单个批次中的会话主机数量

会话主机更新正在进行或已失败,随后被管理员取消

此查询将表 WVDSessionHostManagementWVDCheckpoints 关联起来,以提供过去 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

返回的数据集如下所示:

定义
TimeGenerated 系统生成的事件时间戳
_SubscriptionId 主机池的订阅 ID
_ResourceId 主机池的资源 ID
CorrelationId 为主机池的每个会话主机更新分配的唯一标识符
ScheduledDateTime 会话主机更新计划时间 (UTC)
CanceledDateTime 管理员取消会话主机更新的时间 (UTC)
TotalSessionHostsInHostPool 主机池中的会话主机总数
SessionHostUpdateCount 取消会话主机更新之前更新的会话主机数量
UpdateBatchSize 会话主机更新期间单个批次中的会话主机数量

每个会话主机更新的状态

此查询将表 WVDSessionHostManagementWVDCheckpoints 关联起来,以提供过去 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)

返回的数据集如下所示:

定义
TimeGenerated 系统生成的事件时间戳
_SubscriptionId 主机池的订阅 ID
_ResourceId 主机池的资源 ID
CorrelationId 为主机池的每个映像更新分配的唯一标识符
ProvisioningStatus 主机池映像更新的当前状态
ScheduledDateTime 会话主机更新计划时间 (UTC)
UpdateBatchSize 映像更新期间单个批次中的会话主机数量
SessionHostUpdateCount 更新的会话主机数

后续步骤

有关会话主机更新的故障排除指南,请参阅排查会话主机更新问题