你当前正在访问 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 工作区的表 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
返回的数据集如下所示:
列 | 定义 |
---|---|
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
返回的数据集如下所示:
列 | 定义 |
---|---|
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
返回的数据集如下所示:
列 | 定义 |
---|---|
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
返回的数据集如下所示:
列 | 定义 |
---|---|
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)
返回的数据集如下所示:
列 | 定义 |
---|---|
TimeGenerated | 系统生成的事件时间戳 |
_SubscriptionId | 主机池的订阅 ID |
_ResourceId | 主机池的资源 ID |
CorrelationId | 为主机池的每个映像更新分配的唯一标识符 |
ProvisioningStatus | 主机池映像更新的当前状态 |
ScheduledDateTime | 会话主机更新计划时间 (UTC) |
UpdateBatchSize | 映像更新期间单个批次中的会话主机数量 |
SessionHostUpdateCount | 更新的会话主机数 |
后续步骤
有关会话主机更新的故障排除指南,请参阅排查会话主机更新问题。