Public/Write-Statsd.ps1

Function Write-StatsD {
    <#
        .SYNOPSIS
            Send metrics to a statsd server via UDP for writing to Influx.
 
        .DESCRIPTION
            PowerShell cmdlet to send metric data to a statsd server. Unless server or port is passed, uses the default 127.0.0.1 and port of 8125.
     
        .PARAMETER InputObject
            A metric object (generated by one of the Get-*Metric cmdlets from this module) which can be provided as pipeline input
            and will be automatically converted to StatsD strings.
 
        .PARAMETER Data
            Metric data to send to statsd. If string is not enclosed in quotes (single or double), the pipe character needs to be escaped.
     
        .PARAMETER IP
            IP address for statsd server
     
        .PARAMETER Port
            Port that statsd server is listening to
     
        .EXAMPLE
            Write-StatsD 'my_metric:123|g'
 
            This will write a value to a gauge metric named my_metric.
 
        .EXAMPLE
            Write-StatsD 'my_metric:321|g' -ip 10.0.0.10 -port 8180
 
            This will write a value to a gauge metric named my_metric via the specified IP and port.
 
        .EXAMPLE
            'my_metric:1|c' | Write-StatsD
 
            This will write a value to a counter metric, using the piepline as input for the cmdlet.
    #>

    [cmdletbinding(SupportsShouldProcess, ConfirmImpact = 'Medium')]
    param(
        [Parameter(ParameterSetName = 'MetricObject', Mandatory = $True, ValueFromPipeline = $True, Position = 0)]
        [PSTypeName('Metric')]
        [PSObject[]]
        $InputObject,
        
        [parameter(ParameterSetName = 'StatsDString', Mandatory = $True, ValueFromPipeline = $True, Position = 0)]
        [string[]]
        $Data,

        [ipaddress]
        $IP = '127.0.0.1',
  
        [int]
        $Port = 8125
    )
    Process {
        if ($InputObject) {
            $Data = $InputObject | ConvertTo-StatsDString
        }

        foreach ($Item in $Data) {

            if ($PSCmdlet.ShouldProcess("$($IP):$Port", "$($MyInvocation.MyCommand) -Data $Item")) {
                $Item | Invoke-UDPSendMethod -IP $IP -Port $Port
            }
        }
    } 
}