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:
- PowerShell Skript sammelt über die vCloud Director RESTful API die Metriken und Tags
- Telegraf greift die Ausgabe des Skripts ab
- Telegraf sendet die Metriken und Tags an InfluxDB
- 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
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
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
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:
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>" } }
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.
OrgVdc Usage
In diesem Abschnitt wird die Ressourcennutzung je OrgVdc visualisiert.
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.
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.
No Responses