Поделиться через


Примеры диагностических запросов для обновления узла сеансов в Виртуальном рабочем столе Azure

Важно!

Обновление узла сеансов для Виртуального рабочего стола Azure в настоящее время находится в предварительной версии. Юридические условия, применимые к функциям Azure, которые находятся в бета-версии, предварительной версии или еще не выпущены в общедоступной версии, см. в дополнительных условиях использования предварительных версий Microsoft Azure .

Обновление узла сеанса использует Log Analytics в Azure Monitor для хранения сведений об обновлениях. В этой статье приведены примеры запросов Kusto, которые можно использовать с Log Analytics для просмотра сведений об обновлениях узла сеансов.

Предварительные условия

Прежде чем использовать эти запросы, вам потребуется:

Расположение диагностических данных

После настройки параметров диагностики в пуле узлов диагностические данные для обновления узла сеансов сохраняются в таблицах WVDSessionHostManagement и WVDCheckpoints рабочей области Log Analytics. В записях журнала используется существующий тип действия "Управление", который поступает от поставщика 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 Число обновленных узлов сеансов

Дальнейшие действия

Инструкции по устранению неполадок при обновлении узла сеанса см. в статье Устранение неполадок с обновлением узла сеансов.