very, very simple PowerShell performance monitoring + ElasitcSearch
Mon, Feb 26, 2018
2-minute read
Some time ago I’ve promised a friend to post a little “how-to” concerning PowerShell and ElasticSearch.
So here we go: the following code-snipped can be split into two parts: the “elasticsearch api” and a “naive performance monitor” 🙂
Please note that as always, I write my PoSh-Scripts with PowerShell 5 or 5.1 especially in this case I’m using class-objects, so this won’t run on anything below version 5!
param(
[string]$es_uri = "http://my-elastic-uri:9200",
[string]$es_perf_index = "perfdata",
[string]$es_perf_mapping = "base",
[int]$SecondsDelay = 10,
[switch]$Verbose
)
$script:beVerbose = $Verbose
##########################################################################################
## basic elasticsearch powershell api
##########################################################################################
class Elastic {
hidden [string]$es_uri
hidden [PSCustomObject] _JSONIFY($obj) {
return ($obj | ConvertTo-Json -Depth 10)
}
Elastic($ElasitcServerURI) {
$this.es_uri = $ElasitcServerURI
}
[PSCustomObject] __call ($verb, $params, $body) {
$uri = $this.es_uri
if ($script:beVerbose) {
Write-Host "`nCalling [$uri/$params]" -f Green
if ($body) {
if ($body) {
Write-Host "BODY`n--------------------------------------------`n$body`n--------------------------------------------`n" -f Yellow
}
}
}
$response = Invoke-WebRequest -Uri "$uri/$params" -method $verb -ContentType 'application/json' -Body $body
return $response.Content
}
[PSCustomObject] _get ($params) {
$params += "?format=json"
return ($this.__call("Get", $params, $null) | ConvertFrom-JSon)
}
[PSCustomObject] _delete ($params) {
return $this.__call("Delete", $params, $null)
}
[PSCustomObject] _put ($params, $obj) {
$obj = $this._JSONIFY($obj)
return $this.__call("Put", $params, $obj)
}
[PSCustomObject] _post ($params, $obj) {
$obj = $this._JSONIFY($obj)
return $this.__call("Post", $params, $obj)
}
[PSCustomObject] catalogs() {
return $this._get("_cat/indices")
}
}
##########################################################################################
## naive performance monitor
##########################################################################################
function Get-CPULoad {
return $(Get-WmiObject win32_processor | Measure-Object -property LoadPercentage -Average | Select-Object Average)
}
function Get-MEMLoad {
$os = Get-WmiObject Win32_OperatingSystem
return $([math]::Round(100 - ($os.FreePhysicalMemory / $os.TotalVisibleMemorySize) * 100, 2))
}
while ($true) {
$entry = @{
"Time" = $(Get-Date);
"CPULoad" = $(Get-CPULoad);
"MEMLoad" = $(Get-MEMLoad);
}
[Elastic]::new($es_uri)._post("$es_perf_index/$es_perf_mapping", $entry) > $null
if ($script:beVerbose) {
Write-Host "... going to sleep for $SecondsDelay seconds!"
}
Start-Sleep -Seconds $SecondsDelay
}
happy hacking! – if you’ve got any questions concerning this sample, feel free to reach out to me any time!