Private/Functions/Invoke-WebSink.ps1

function Invoke-WebSink {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)][hashtable]$Options,
        [Parameter(Mandatory)][string]$Component,
        [Parameter(Mandatory)][string]$Message,
        [Parameter(Mandatory)][ValidateSet('Info','Success','Warning','Error','Debug','Verbose')][string]$Severity,
        [int]$IndentLevel = 0
    )

    $url = $Options.Url
    if (-not $url) { return }
    $apiKey = $Options.APIKey
    $headers = @{}
    if ($apiKey) { $headers['X-API-Key'] = $apiKey }
    if ($Options.Headers -is [hashtable]) { $Options.Headers.GetEnumerator() | ForEach-Object { $headers[$_.Key] = $_.Value } }
    $payload = [ordered]@{
        timestamp  = (Get-Date).ToString('o')
        component  = $Component
        message    = $Message
        severity   = $Severity
        indent     = $IndentLevel
        host       = $env:COMPUTERNAME
        processId  = $PID
    }
    try {
        Invoke-RestMethod -Method Post -Uri $url -Headers $headers -Body ($payload | ConvertTo-Json -Depth 5) -ContentType 'application/json' -ErrorAction SilentlyContinue | Out-Null
    } catch { }
}