Grafana Dashboard für vCloud Director

Einer der Punkte auf meiner Bucket List für 2018 war endlich etwas mehr über Grafana zu lernen. Da ich persönlich bei konkreteren Projekten am meisten lerne, habe ich beschlossen ein Grafana Dashboard für vCloud Director zu erstellen. Wie auch schon bei meinem vCloud Director Tenant HTML Report sollte das Dashboard aus Tenant Sicht funktionieren, also als Org Admin. Als weitere Zielsetzung habe ich mit Ubuntu als Plattform gesteckt und es sollten keine externen Ressourcen außer natürlich der vCloud Director selbst genutzt werden.

Mit dieser list hab ich also begonnen nach den richtigen Tools zu recherchieren. Sehr schnell bin ich bei InfluxDB als Data Source für Grafana und Telegraf als Collector Agent gelandet. Telegraf benutzt Input Plugins um Daten zu sammeln, ein sehr spannenden davon ist das Exec Input Plugin. Telegraf führt mit diesem Plugin Skripte aller Art aus und greift die Ausgabe (in verschiedenen Formaten) als Metriken ab. Mit der PowerShell Core Multi-Plattform Unterstützung kann das natürlich auch ein PowerShell Sktipt sein, was mir sehr entgegen kommt.

Ablauf der Erfassung:

  1. PowerShell Skript sammelt über die vCloud Director RESTful API die Metriken und Tags
  2. Telegraf greift die Ausgabe des Skripts ab
  3. Telegraf sendet die Metriken und Tags an InfluxDB
  4. Das Grafana Dashboard nutzt die Metriken und Tags aus InfluxDB

Jorge de la Cruz hat ein sehr schönes Diagramm zum Ablauf der Datenerfassung mit Grafana in seinem Blog Post erstellt: Looking for the Perfect Dashboard: InfluxDB, Telegraf and Grafana – Part VIII (Monitoring Veeam using Veeam Enterprise Manager)

Backend des Grafana Dashboard für vCloud Director

Ich möchte hier eine kurze Zusammenfassung über die Installation der notwendigen Tools auf meinem Ubuntu 16.04 geben.

InfluxDB

Repository hinzufügen:

curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
source /etc/lsb-release
echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list

InfluxDB Installation:

sudo apt-get update && sudo apt-get install influxdb

Starten und aktivieren des Service:

sudo systemctl enable influxdb  
sudo systemctl start influxdb

InfluxDB Benutzer und Datenbank erstellen:

Zuerst muss auf die InfluxDB Shell gewechselt werden: influx

CREATE USER admin WITH PASSWORD '<Your Password>!' WITH ALL PRIVILEGES  
CREATE DATABASE telegraf  
exit

Grafana Dashboard für vCloud Director - Create User and DB

Verbindung Konfigurieren:

Verbindungsdetails müssen in der influxdb.conf angepasst werden: sudo vi /etc/influxdb/influxdb.conf

[http]   
  enabled = true   
  bind-address = ":8086"   
  auth-enabled = true

Grafana Dashboard für vCloud Director - Configure Connection

Service neu starten:

sudo systemctl restart influxdb

Telegraf

Telegraf and Abhängigkeiten installieren:

sudo apt-get install telegraf snmp snmp-mibs-downloader

Alle MIBs aktivieren:

Dafür muss die snmp.conf angepasst werden: sudo vi /etc/snmp/snmp.conf

mibs +ALL

Ausgabe konfigurieren:

Die Ausgabeeinstellungen in der telegraf.conf müssen an die vorgenommenen InfluxDB Einstellungen angepasst werden: sudo vi /etc/telegraf/telegraf.conf

[[outputs.influxdb]]
  urls = ["http://127.0.0.1:8086"] # required
  database = "telegraf" # required
  retention_policy = ""
  write_consistency = "any"
  timeout = "5s"
  username = "admin"
  password = "<Password>"

Grafana Dashboard für vCloud Director - Configure output

Grafana

Repository hinzufügen:

echo "deb https://packagecloud.io/grafana/stable/debian/ jessie main" | sudo tee /etc/apt/sources.list.d/grafana.list
curl https://packagecloud.io/gpg.key | sudo apt-key add -

Grafana installieren:

sudo apt-get update && sudo apt-get install grafana

Nach der erfolgreichen Installation kann auf das Grafana Interface zugegriffen werden (http://<Yout IP>:3000) und InfluxDB muss zu allererst als Datenquelle hinzugefügt werden:

Grafana Dashboard für vCloud Director - Configure InfluxDB Data Source

Grafana Dashboard für vCloud Director - Configure InfluxDB Data Source Details

PowerShell

Repository hinzufügen:

curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/microsoft.list

PowerShell installieren:

sudo apt-get update && sudo apt-get install powershell

Konfiguration des Grafana Dashboard für vCloud Director

Telegraf

Für die notwendigen Datenerfassung einfach diese Sektion an die telegraf.conf anhängen (Skript muss natürlich auch vorhanden sein): sudo vi /etc/telegraf/telegraf.conf

[[inputs.exec]]
  commands = ["pwsh /scripts/Grafana-Telegraf-vCloud-PsCore/vCloud.ps1"]
  name_override = "vCloudStats"
  interval = "60s"
  timeout = "60s"
  data_format = "influx"

PowerShell Script

Um das Skript erfolgreich auszuführen muss zusätzlich die json Konfiguration, passend zur Umgebung, abgelegt werden. Beide Files (Konfiguration nur als Beispiel) sind in meinem  GitHub Repository Grafana-Telegraf-vCloud-PsCore enthalten. Ich nutze bei mir einfach GIT um das Skript zwischen meiner Workstation und dem Grafana Server zu synchronisieren: Initial das Repository Klonen  git clone https://github.com/mycloudrevolution/Grafana-Telegraf-vCloud-PsCore.git und wenn nötig die lokalen Files aktualisieren git pull

$ConfigFile = "$PSScriptRoot/Config.json"
$Configs = Get-Content -Raw -Path $ConfigFile -ErrorAction Continue | ConvertFrom-Json -ErrorAction Continue

if (!($Configs)) {
    Throw "Import JSON Config Failed"
    }

$VcdHost = $Configs.Base.VcdHost
$BasicAuth = $Configs.Base.BasicAuth

#region: Login
$Uri = "https://$VcdHost/api/sessions"
$Authorization = 'Basic {0}' -f $BasicAuth
$Headers =  @{'accept' = 'application/vnd.vmware.vcloud.session+xml;version=27.0'; 'Authorization' = $Authorization}
$ResponseHeaders = $null
$Login = Invoke-RestMethod -uri $Uri -Method Post -Headers $Headers -ResponseHeadersVariable 'ResponseHeaders'
#endregion

#region: Cleanup Confidential Data
Clear-Variable -Name BasicAuth, Authorization, Headers
#endregion

#region: Get vApps
$Uri = "https://$VcdHost/api/query?type=orgVdc"
$Headers =  @{'accept' = 'application/*+xml;version=27.0'; 'x-vcloud-authorization' = [String]$ResponseHeaders.'x-vcloud-authorization'}
[XML]$orgVdcs = Invoke-RestMethod -uri $Uri -Method Get -Headers $Headers
#endregion

#region: Get vApps
$Uri = "https://$VcdHost/api/query?type=vApp"
$Headers =  @{'accept' = 'application/*+xml;version=27.0'; 'x-vcloud-authorization' = [String]$ResponseHeaders.'x-vcloud-authorization'}
[XML]$vApps = Invoke-RestMethod -uri $Uri -Method Get -Headers $Headers
#endregion

#region: Get VMs
$Uri = "https://$VcdHost/api/query?type=vm"
$Headers =  @{'accept' = 'application/*+xml;version=27.0'; 'x-vcloud-authorization' = [String]$ResponseHeaders.'x-vcloud-authorization'}
[XML]$VMs = Invoke-RestMethod -uri $Uri -Method Get -Headers $Headers
#endregion

#region: Get orgNetworks
$Uri = "https://$VcdHost/api/query?type=orgNetwork"
$Headers =  @{'accept' = 'application/*+xml;version=27.0'; 'x-vcloud-authorization' = [String]$ResponseHeaders.'x-vcloud-authorization'}
[XML]$orgNetworks = Invoke-RestMethod -uri $Uri -Method Get -Headers $Headers
#endregion

#region: Get edgeGateway
$Uri = "https://$VcdHost/api/query?type=edgeGateway"
$Headers =  @{'accept' = 'application/*+xml;version=27.0'; 'x-vcloud-authorization' = [String]$ResponseHeaders.'x-vcloud-authorization'}
[XML]$edgeGateways = Invoke-RestMethod -uri $Uri -Method Get -Headers $Headers
#endregion

#region: Output
## Simple Stats
$orgVdcsTotal = ([Array]$orgVdcs.QueryResultRecords.OrgVdcRecord).Count
$body="vCloudStats orgVdcCountTotal=$orgVdcsTotal"
Write-Host $body
$vAppsTotal = ([Array]$vApps.QueryResultRecords.VAppRecord).Count
$body="vCloudStats vAppCountTotal=$vAppsTotal"
Write-Host $body
$VMsTotal = ([Array]$VMs.QueryResultRecords.VMRecord | Where-Object {$_.isVAppTemplate -ne "true"}).Count
$body="vCloudStats VMCountTotal=$VMsTotal"
Write-Host $body
$VMsPoweredOff = ([Array]$VMs.QueryResultRecords.VMRecord | Where-Object {$_.isVAppTemplate -ne "true" -and  $_.status -eq "POWERED_OFF"}).Count
$body="vCloudStats VMCountPoweredOff=$VMsPoweredOff"
Write-Host $body
$orgNetworksTotal = $orgNetworks.QueryResultRecords.OrgNetworkRecord.Count
$body="vCloudStats orgNetworkCountTotal=$orgNetworksTotal"
Write-Host $body
$edgeGatewaysTotal = ([Array]$edgeGateways.QueryResultRecords.EdgeGatewayRecord).Count
$body="vCloudStats edgeGatewaysTotal=$edgeGatewaysTotal"
Write-Host $body

## OrgVdc Details
foreach ($item in [Array]$orgVdcs.QueryResultRecords.OrgVdcRecord) {
    $body = "vCloudStats,orgVdc=$($item.name),isEnabled=$($item.isEnabled) cpuUsedMhz=$($item.cpuUsedMhz),memoryUsedMB=$($item.memoryUsedMB),numberOfMedia=$($item.numberOfMedia),numberOfVAppTemplates=$($item.numberOfVAppTemplates),numberOfVApps=$($item.numberOfVApps),storageUsedMB=$($item.storageUsedMB)"
        Write-Host $body
}
## vApp Details
foreach ($item in [Array]$vApps.QueryResultRecords.VAppRecord) {
    $body = "vCloudStats,vApp=$($item.name),status=$($item.status) numberOfVMs=$($item.numberOfVMs),numberOfCpus=$($item.numberOfCpus),cpuAllocationInMhz=$($item.cpuAllocationInMhz),memoryAllocationMB=$($item.memoryAllocationMB),storageKB=$($item.storageKB)"
        Write-Host $body
}
## orgNetwork Details
foreach ($item in [Array]$orgNetworks.QueryResultRecords.OrgNetworkRecord) {
    $Uri = [string]$item.href + "/allocatedAddresses"
    $Headers =  @{'accept' = 'application/*+xml;version=27.0'; 'x-vcloud-authorization' = [String]$ResponseHeaders.'x-vcloud-authorization'}
    [XML]$orgNetworkAllocated = Invoke-RestMethod -uri $Uri -Method Get -Headers $Headers
    $AllocatedIpAddressesTotal = $orgNetworkAllocated.AllocatedIpAddresses.IpAddress.Count
    $body = "vCloudStats,orgNetwork=$($item.name),gateway=$($item.gateway) AllocatedIpAddressesTotal=$AllocatedIpAddressesTotal"
        Write-Host $body
}
## Edge Details
foreach ($item in [Array]$edgeGateways.QueryResultRecords.EdgeGatewayRecord) {
    $body = "vCloudStats,edgeGateway=$($item.name),gatewayStatus=$($item.gatewayStatus),haStatus=$($item.haStatus) numberOfExtNetworks=$($item.numberOfExtNetworks),numberOfOrgNetworks=$($item.numberOfOrgNetworks)"
        Write-Host $body
}
#endregion

#region: Logout
$Uri = "https://$VcdHost/api/session"
$Headers =  @{'accept' = 'application/vnd.vmware.vcloud.session+xml;version=27.0'; 'x-vcloud-authorization' = [String]$ResponseHeaders.'x-vcloud-authorization'}
$Logout = Invoke-RestMethod -uri $Uri -Method Delete -Headers $Headers
#endregion

#region: Cleanup Confidential Data
Clear-Variable -Name ResponseHeaders, Headers
#endregion

Die json Konfiguration beinhaltet den FQDN der vCloud Director Instanz und den Base64 Hash des Benutzernamens und des Passwortes.

{
    "Base": {
            "VcdHost": "<FQDN>",
            "BasicAuth": "<Base64>"
        }
    }

Note:

Die Klartext-Syntax des Benutzernamens muss so aussehen: <User>@<Org>

Der Base64 Hash kann mit diesem simplen PowerShell Skript erzeugt werden:

[String] $User		= "<User>@<Org>"
[String] $Password	= "<Password>"	
Write-Host "Basic String: " $([Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$($user):$($password)")))

Details des Grafana Dashboard für vCloud Director

Das Grafana Dashboard für vCloud Director hat aktuell vier kategorien, Summary, OrgVdc Usage, vApp Usage and Org Network / Edge Gateway Usage.

Summary

Der Abschnitt Summary zeigt die wichtigsten Statistiken auf einen Blick.

Grafana Dashboard für vCloud Director - Dashboard Summary

OrgVdc Usage

In diesem Abschnitt wird die Ressourcennutzung je OrgVdc visualisiert.

Grafana Dashboard für vCloud Director - Dashboard OrgVdc

vApp Usage

Der vApp Abschnitt unterscheidet zwischen ein- und ausgeschalteten Systemen. Für eingeschaltete wird  CPU und RAM Nutzung angezeigt und für ausgeschaltete nur Storage Nutzung.

Grafana Dashboard für vCloud Director - Dashboard vApp

Org Network and Edge Gateway Usage

Für Org Networks zeigt dieser Abschnitt die Anzahl der genutzten IP‘ s sowie für Edge Gateway die anzahl der verbundenen Netze an.

Grafana Dashboard für vCloud Director - Dashboard Org Net and Edge Gateway

 

Leave a Reply