Public/Write-Influx.ps1
Function Write-Influx { <# .SYNOPSIS Writes data to Influx via the REST API. .DESCRIPTION Use to send data in to an Influx database by providing a hashtable of tags and values. .PARAMETER InputObject A metric object (generated by one of the Get-*Metric cmdlets from this module) which can be provided as pipeline input. .PARAMETER Measure The name of the measure to be updated or created. .PARAMETER Tags A hashtable of tag names and values. .PARAMETER Metrics A hashtable of metric names and values. .PARAMETER Server The URL and port for the Influx REST API. Default: 'http://localhost:8086' .PARAMETER Database The name of the Influx database to write to. .PARAMETER Credential A PSCredential object with the username and password to use if the Influx server has authentication enabled. .PARAMETER Bulk Switch: Use to have all metrics transmitted via a single connection to Influx. .EXAMPLE Write-Influx -Measure WebServer -Tags @{Server='Host01'} -Metrics @{CPU=100; Memory=50} -Database Web -Server http://myinflux.local:8086 Description ----------- This command will submit the provided tag and metric data for a measure called 'WebServer' to a database called 'Web' via the API endpoint 'http://myinflux.local:8086' #> [cmdletbinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')] param ( [Parameter(ParameterSetName = 'MetricObject', ValueFromPipeline = $True, Position = 0)] [PSTypeName('Metric')] $InputObject, [Parameter(ParameterSetName = 'Measure', Mandatory = $true, Position = 0)] [string] $Measure, [Parameter(ParameterSetName = 'Measure')] [hashtable] $Tags, [Parameter(ParameterSetName = 'Measure', Mandatory = $true)] [hashtable] $Metrics, [Parameter(ParameterSetName = 'Measure')] [datetime] $TimeStamp, [Parameter(Mandatory = $true)] [string] $Database, [string] $Server = 'http://localhost:8086', [pscredential] $Credential, [switch] $Bulk ) Begin { if ($Credential) { $Username = $Credential.UserName $Password = $Credential.GetNetworkCredential().Password $EncodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes("$($Username):$($Password)")) $Headers = @{ Authorization = "Basic $EncodedCreds" } } $BulkBody = @() $URI = "$Server/write?&db=$Database" } Process { if ($InputObject) { $Measure = $InputObject.Measure $Metrics = $InputObject.Metrics if ($InputObject.Tags) { $Tags = $InputObject.Tags } if ($InputObject.TimeStamp) { $TimeStamp = $InputObject.TimeStamp } } if ($TimeStamp) { $timeStampNanoSecs = $Timestamp | ConvertTo-UnixTimeNanosecond } else { $null = $timeStampNanoSecs } if ($Tags) { $TagData = foreach ($Tag in $Tags.Keys) { "$($Tag | Out-InfluxEscapeString)=$($Tags[$Tag] | Out-InfluxEscapeString)" } $TagData = $TagData -Join ',' $TagData = ",$TagData" } $Body = foreach ($Metric in $Metrics.Keys) { if ($Metrics[$Metric] -isnot [ValueType]) { $MetricValue = '"' + $Metrics[$Metric] + '"' } else { $MetricValue = $Metrics[$Metric] | Out-InfluxEscapeString } "$($Measure | Out-InfluxEscapeString)$TagData $($Metric | Out-InfluxEscapeString)=$MetricValue $timeStampNanoSecs" } if ($Body) { $Body = $Body -Join "`n" If ($Bulk) { $BulkBody += $Body } Else { if ($PSCmdlet.ShouldProcess($URI, $Body)) { Invoke-RestMethod -Uri $URI -Method Post -Body $Body -Headers $Headers | Out-Null } } } } End { If ($Bulk) { $BulkBody = $BulkBody -Join "`n" if ($PSCmdlet.ShouldProcess($URI, $BulkBody)) { Invoke-RestMethod -Uri $URI -Method Post -Body $BulkBody -Headers $Headers | Out-Null } } } } |