Azure 虛擬桌面中會話主機更新的範例診斷查詢
重要
Azure 虛擬桌面的會話主機更新目前為預覽狀態。 請參閱 Microsoft Azure 預覽版增補使用規定,以了解適用於 Azure 功能 (搶鮮版 (Beta)、預覽版,或尚未正式發行的版本) 的法律條款。
會話主機更新會使用 Azure 監視器 中的 Log Analytics 來儲存更新的相關信息。 本文有一些您可以搭配Log Analytics使用的 Kusto 查詢範例,以查看會話主機更新的相關信息。
必要條件
您必須先執行下列動作,才能使用這些查詢:
具有會話主機設定的現有主機集區。
您在與會話主機更新搭配使用的每個主機集區上設定診斷設定,以將記錄和計量傳送至 Log Analytics 工作區。 必須至少啟用檢查點、錯誤和會話主機管理活動記錄的類別。
診斷數據位置
在主機集區上設定診斷設定之後,會話主機更新的診斷數據會儲存在Log Analytics工作區的數據表 WVDSessionHostManagement
和 WVDCheckpoints
數據表中。 記錄專案會使用來自 Azure Resource Manager(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 | 主機集區的訂用帳戶標識碼 |
_ResourceId | 主機集區的資源標識碼 |
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 | 主機集區的訂用帳戶標識碼 |
_ResourceId | 主機集區的資源標識碼 |
CorrelationId | 指派給主機集區上執行之每個映像更新的唯一標識碼 |
CodeSymbolic | 錯誤碼 |
SessionHostResourceId | 如果適用的話,會話主機的資源標識符 |
訊息 | 錯誤資訊 |
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 | 主機集區的訂用帳戶標識碼 |
_ResourceId | 主機集區的資源標識碼 |
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 | 主機集區的訂用帳戶標識碼 |
_ResourceId | 主機集區的資源標識碼 |
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 | 主機集區的訂用帳戶標識碼 |
_ResourceId | 主機集區的資源標識碼 |
CorrelationId | 指派給主機集區映像的每個更新的唯一標識符 |
ProvisioningStatus | 主機集區映像更新的目前狀態 |
ScheduledDateTime | 以UTC為單位的工作階段主機更新排程時間 |
UpdateBatchSize | 在映像更新期間,單一批次中的會話主機數目 |
SessionHostUpdateCount | 已更新的會話主機數目 |
下一步
如需會話主機更新的疑難解答指引,請參閱 針對會話主機更新進行疑難解答。