-
Notifications
You must be signed in to change notification settings - Fork 3
/
prometheus.psm1
101 lines (87 loc) · 3.11 KB
/
prometheus.psm1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# requires -version 5.0
<#
# A powershell script module for providing a general way to export metrics to prometheus
# Author: Huajun (Greg) Gu
# Version: 0.0.2
#>
function ConvertTo-PromExposition
{
<#
.SYNOPSIS
A function to generate data that can be post to Prometheus PushGateway.
.DESCRIPTION
A function to generate data that can be post to Prometheus PushGateway.
.INPUTS
Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSample
.OUTPUTS
System.String
.LINK
https://prometheus.io/docs/instrumenting/exposition_formats/
.EXAMPLE
$metric = Get-Counter | Select-Object -ExpandProperty 'CounterSamples' | ?{$PSItem.InstanceName -match '[a-zA-Z_:][a-zA-Z0-9_:]*'}
$metric = $metric | ConvertTo-PromExposition
$response = Invoke-WebRequest -Uri "http://localhost:9091/metrics/job/pushgateway/" -Method Post -Body $metric
.NOTES
None
#>
[CmdletBinding()]
param(
[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
[Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSample]
$Sample
)
begin
{
$results = New-Object System.Text.StringBuilder
$metrics = @()
}
process
{
try
{
# Get counter path
$path = $Sample.Path
$path = $path.ToLower()
# Get host name from path
$hostname = $path.split('\')[2]
$path = $path -replace $hostname, ''
# Get instance name from path then remove it
$instanceName = $Sample.InstanceName.ToLower()
$path = $path -replace $instanceName, ''
# Make sure metric name is valid
$pattern = '[a-zA-Z_:][a-zA-Z0-9_:]*'
$metricNames = @()
[regex]::Matches($path, $pattern) | %{$metricNames += $PSItem.Value}
$metric = $metricNames -join '_'
$metric = 'windows_' + $metric
$PSCmdlet.WriteVerbose('Metric name is {0}' -f $metric)
# Make sure instance name is valid
$instanceNames = @()
[regex]::Matches($instanceName, $pattern) | %{$instanceNames += $PSItem.Value}
$instanceName = $instanceNames -join '_'
$PSCmdlet.WriteVerbose('Instance name is {0}' -f $instanceName)
# Get value
$value = $Sample.CookedValue
if ($metric -notin $metrics)
{
$metrics += $metric
$result1 = "#HELP {0}`n" -f $metric
$result2 = "#TYPE {0} gauge`n" -f $metric
$null = $results.Append($result1)
$null = $results.Append($result2)
}
$result3 = "{0}{{host=`"{1}`", instance=`"{2}`"}} {3}`n" -f @(
$metric, $hostname, $instanceName, $value)
$null = $results.Append($result3)
}
catch
{
$PSCmdlet.WriteError($PSItem.Exception.ToString())
}
}
end
{
return $results.ToString()
}
}
Export-ModuleMember -Function 'ConvertTo-PromExposition'