본문 바로가기
Script/PowerCLI

[Script-PowerCLI] vRealize Network Insight 트래픽 사용량 추출 Script

by 치즈잼 2024. 7. 15.
728x90
vRealize Network Insight에서 특정 VM의 트래픽 사용량 추세를 추출 및 확인하는 Script를 작성해 보았습니다.

해당 내용은 Network Insight의 API를 사용하여 NSX-T LB의 특정 VS에 대한 트래픽 사용량을 추출하여 엑셀로 표현하는 방식을 사용하였습니다.

 

기존 Network Insight에서는 아래와 같은 명령어로 Destination IP Address에는 LB VIP를 입력하고 서비스 포트를 입력해주시면 해당하는 플로우 정보를 확인하실 수 있습니다.

 

flow where destination ip address = {확인하고자 하는 VIP} and port = {해당하는 서비스 포트}

 

 

다만 해당 정보는 목적지 IP에 대한 여러 플로우 정보를 포함하고 있습니다. [Source IP마다 트래픽 사용량이 나누어져 있음]

 

목적지 IP에 대한 전체 트래픽 사용량을 확인하기는 어렵다고 생각되어 스크립트를 통해 전체 트래픽에 대한 그래프를 추출할 수 있도록 하였습니다.

 

스크립트 파일을 실행하시면 다음와 같이 Network Insight의  IP, Username 등의 정보를 입력하면 됩니다.

 

해당 스크립트를 정상 실행 하시면 파일이 Home 디렉토리에 저장되며 내용은 다음과 같습니다.

 

참고사항

시간 범위 별로 트래픽 저장 간격이 달라집니다.

 

- 지난 1일 이내 : 5분 간격 트래픽 저장

- 지난 7일 이내 : 30분 간격 트래픽 저장

- 지난 30일 이내 : 2시간 간격 트래픽 저장

- 지난 3개월 이내 : 8시간 간격 트래픽 저장

 

 

 

------------------ 스크립트 본문 ----------------------

 

# 사용자로부터 입력 받기

$ni_ip = Read-Host "Enter vRealize Network Insight IP (ex: 10.10.10.1)"

$username = Read-Host "Enter username (ex: admin@local)"

$pass = Read-Host "Enter password (ex: password)"

 

$destination_ip = Read-Host "Enter destination IP (ex: 172.23.10.10)"

$destination_port = Read-Host "Enter destination port (ex: 80)"

$startTimeStr = Read-Host "Enter start time (ex: 2024-03-14 08:00)"

$endTimeStr = Read-Host "Enter end time (ex: 2024-03-14 10:00)"

 

# 토큰 획득

$token_body = @{

        username= $username

        password= $pass

        domain= @{

          domain_type= "LOCAL"

    }

} | ConvertTo-Json

 

$get_token_uri = https://${ni_ip}/api/ni/auth/token

$get_token_api = Invoke-RestMethod -Uri $get_token_uri -Method 'POST' -Body $token_body -ContentType 'application/json' -SkipCertificateCheck

 

$auth_token = $get_token_api.token

 

# HTTP 요청 헤더 설정

$header = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"

$authheader = "NetworkInsight " + $auth_token

$header.Add("Authorization",$authheader)

 

# 검색 쿼리 및 URI 설정

$search_query ="sum(bytes) of flow where destination ip address = ${destination_ip} and port = ${destination_port}"

$search_ql_uri = https://${ni_ip}/api/ni/search/ql

 

# 시작 시간과 종료 시간 설정

$startTime = Get-Date $startTimeStr

$endTime = Get-Date $endTimeStr

$time_range_result = $endTime - $startTime

$currentTime = $startTime

$data = @()

 

# 인터벌 설정

$interval = if ($time_range_result.TotalHours -le 24) { 5 } elseif ($time_range_result.TotalHours -lt 168) { 30 } elseif ($time_range_result.TotalHours -lt 720) { 120 } else { 480 }

while ($currentTime -lt $endTime) {

    $nextTime = $currentTime.AddMinutes($interval)

   

    if ($nextTime -gt $endTime) {

        $nextTime = $endTime

    }

   

    # 시간을 유닉스 타임스탬프로 변환하여 API에 전달

    $currentTime_unix_timestamp = [int]$currentTime.ToUniversalTime().Subtract([datetime]'1970-01-01').TotalSeconds

    $nextTime_unix_timestamp = [int]$nextTime.ToUniversalTime().Subtract([datetime]'1970-01-01').TotalSeconds

    $search_ql_body = @{

        query = $search_query

        size= 10

        time_range= @{

            start_time= $currentTime_unix_timestamp

            end_time= $nextTime_unix_timestamp

        }

    } | ConvertTo-Json

 

    # REST API 호출하여 데이터 가져오기

    $search_ql_api = Invoke-RestMethod -Uri $search_ql_uri -Method 'POST' -Body $search_ql_body -Headers $header -ContentType 'application/json' -SkipCertificateCheck

   

    # 시간 형식 변경 및 데이터 저장

    $forxls_currentTime = $currentTime.ToString("yy-MM-dd HH:mm:ss")

    $forxls_nextTime = $nextTime.ToString("yy-MM-dd HH:mm:ss")

    $data += [PSCustomObject]@{

        "Time" = "${forxls_currentTime} ~ ${forxls_nextTime} "

        "Value (MB)" = $search_ql_api.aggregation_response.aggregations.value / (1024 * 1024)

    }

 

    $currentTime = $nextTime

}

 

# Excel COM 객체 생성

$excel = New-Object -ComObject Excel.Application

 

# Excel 보이도록 설정

$excel.Visible = $true

 

# 새로운 워크북 생성

$workbook = $excel.Workbooks.Add()

 

# 워크시트 선택

$worksheet = $workbook.Worksheets.Item(1)

 

# 데이터 입력

$row = 1

$column = 1

$worksheet.Cells.Item($row, $column) = "시간"

$worksheet.Cells.Item($row, $column + 1) = "Total Traffic (MB)"

$row++

 

foreach ($item in $data) {

    $worksheet.Cells.Item($row, $column) = $item."Time"

    $worksheet.Cells.Item($row, $column + 1) = $item."Value (MB)"

    $row++

}

 

# 데이터 범위 선택

$dataRange = $worksheet.UsedRange

$chartRange = $dataRange.Offset(0, 0).Resize($dataRange.Rows.Count, $dataRange.Columns.Count)

 

# 차트 추가 (꺾은선 그래프)

$chart = $worksheet.Shapes.AddChart().Chart

$chartType = 4 # xlLineMarkers

$chart.ChartType = $chartType

$chart.SetSourceData($chartRange)

 

# 파일 저장

$excelFilePath = "$HOME\${destination_ip}_total_flow_chart.xlsx"

$workbook.SaveAs($excelFilePath)

 

# Excel 닫기

#$excel.Quit()

 

-----------------------스크립트---------------------

 

728x90