[Azure] Azure Virtual Desktop에서 사용자 세션 수의 변화를 그래프로 표시

Azure Virtual Desktop(2021/6까지 Windows Virtual Desktop)은 Azure에 구축할 수 있는 데스크톱 앱의 가상화 서비스입니다.

유저 세션수의 추이를 그래프 표시하고 싶었습니다만, 현재의 진단 정보로는 간단하게 표시할 수 없는 것 같습니다( LogAnalysis에 세션 시작 및 종료 로그가 남아 있습니다. 그래서 노력하면 할 수 있을 것 같습니다만).

마지막으로 Automation 계정을 설정하고 , 커스텀 메트릭스 사용하면 간단하게 그래프화할 수 있을 것 같았으므로, 작성해 본 것이 본 기사의 내용이 됩니다.

1. Application Insight 작성



사용자 지정 메트릭의 대상으로 Application Insight를 사용합니다. 계정을 만들고 계측 키를 삼가하십시오.



2. Azure Automation 계정 설정



마지막 기사에서처럼 , Automation 계정을 만든 후 관리 ID를 활성화하고 "Az.Accounts" 모듈을 가져옵니다.

그런 다음 Azure Virtual Desktop용 추가 모듈을 가져옵니다.
"Az.DesktopVirtualization" 모듈 가져오기


"Az.ResourceGraph" 모듈 가져오기


"Az.Resources" 모듈 가져오기


"Az.Wvd" 모듈 가져오기



※모듈의 설치입니다만, 사전에 의존관계를 체크해 주는 것과, 설치시에 체크되어 실패하는 것이 있는 것 같습니다. 실패하면 로그에 종속성이 표시되므로 일단 삭제하고 먼저 종속된 모듈을 설치합니다.



3. 관리 ID에 역할 부여



세션 수를 얻으려면 데스크톱 가상화 호스트 풀 뷰어 권한이 필요합니다. 관리 ID에 대해 구독 또는 대상 리소스에 대한 권한을 부여합니다.



4. Application Insights에 출력용 모듈 만들기



이 기사 : Azure Automation (PowerShell)에서 Application Insights로 로그 출력 에 그대로 실행 가능한 순서가 정리되어 있었습니다(감사합니다).

이번에는 이것을 그대로 가져온 것과 메트릭스용으로 또 하나의 모듈을 만들었습니다. 전 기사와의 차이로서

· psm1 스크립트로 Trace → Metric으로 수정

ApplicationInsightsCustomMetric.psm1
function Write-ApplicationInsightsMetric
{
    [CmdletBinding()]
    param(
            [Parameter(Mandatory=$true)][string] $InstrumentationKey,
            [Parameter(Mandatory=$true)][string] $MetricKey,
            [Parameter(Mandatory=$true)][string] $MetricValue
            )
    try
    {
        $TelClient = New-Object -TypeName Microsoft.ApplicationInsights.TelemetryClient
        $TelClient.InstrumentationKey = $InstrumentationKey
        $TelClient.TrackMetric($MetricKey, $MetricValue)
        $TelClient.Flush()
    }
    catch
    {
        Write-Output "Exception while logging into Application Insights: $($_.Exception.Message)"
    }
}

Export-ModuleMember -Function Write-ApplicationInsightsMetric

· psd1 스크립트로 Trace → Metric으로 수정

ApplicationInsightsCustomMetric.psd1

@{

    # Script module or binary module file associated with this manifest.
    RootModule = 'ApplicationInsightsCustomMetric.psm1'

    # Version number of this module.
    ModuleVersion = '1.0.0'

    # Author of this module
    Author = 'mkyz08'

    # Company or vendor of this module
    CompanyName = ''

    # Copyright statement for this module
    Copyright = ''

    # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess
    NestedModules = @('.\Microsoft.ApplicationInsights.dll') 

    # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export.
    FunctionsToExport = @('*')

    # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export.
    CmdletsToExport = @('*')

    # Variables to export from this module
    VariablesToExport = '*'

    # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export.
    AliasesToExport = @()

    # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell.
    PrivateData = @{

        PSData = @{

        } # End of PSData hashtable

    } # End of PrivateData hashtable

    }    

그런 다음 Zip 파일을 만들어 두 개의 모듈을 가져옵니다.



덧붙여 Microsoft.ApplicationInsights.dll는 이번 로컬 PC의 Az 모듈에 포함되어 있던 것(버전 2.4.0.32153 )으로 문제 없게 동작했습니다.

5. Runbook 만들기



나중에 Runbook을 만듭니다. 사전에 1. 에서 확인한 계측 키를 변수(암호화 문자열)로 등록해 둡니다.



작성한 Runbook은 다음과 같습니다. 세션수를 취득해, Application Insight(Metric)에 제휴 후, 세션수가 1 이상의 경우는 유저명의 리스트를 Application Insight(Log)에 제휴하고 있습니다.
# マネージドIDによる接続
Connect-AzAccount -Identity

try {
    $ResourceGroupName = 'resource-group-name'
    $HostPoolName = 'host-pool-name'
    $InstrumentationKey = Get-AutomationVariable -Name 'app-insight-instrumentation-key' # インストルメンテーションキー

    # セッション数取得
    $userSessions = Get-AzWvdUserSession -ResourceGroupName $ResourceGroupName -HostPoolName $HostPoolName
    Write-Output ("Session num:" + $userSessions.Count)

    # セッション数をApplication Insight(Metric)へ連携
    Write-ApplicationInsightsCustomMetric $InstrumentationKey "UserCount-HostPool-xxx" $userSessions.Count

    # ユーザがいる場合はユーザ名をApplication Insight(Log)へ連携
    if ( $userSessions.Count -gt 0 ){
        $userList = ''
        foreach($eachUser in $userSessions){
            $userList = $userList + '   ' + $eachUser.UserPrincipalName
        }
        Write-ApplicationInsightsTrace $InstrumentationKey $userList "Information"
    }
}
catch {
    $ErrorMessage = $_.Exception.message
    Write-Error ("Error occurred when starting vm:" + $ErrorMessage)
    Break
}

6. 동작 확인



Runbook을 예약하고 정기적으로 실행하면 다음과 같이 사용자 지정 메트릭에 세션 수가 연결되었습니다.

맞춤 측정항목이 선택 항목에 추가되었습니다.



세션 수 추이 그래프:



로그를 검색하면 각 세션의 사용자 이름을 볼 수 있습니다.
traces
| where severityLevel == 1

에서 검색하고 로그가 늘어나면 시간으로 필터링 :



이상으로 세션수의 추이를 용이하게 확인할 수 있게 되었습니다.

참고 자료


  • Log Analytics로 WVD 진단 정보 시각화
  • Azure Monitor의 사용자 지정 메트릭(미리 보기)
  • 좋은 웹페이지 즐겨찾기