Public/New-DDEvent.ps1

function New-DDEvent {
<#
    .SYNOPSIS
        Post an event to the stream.

    .DESCRIPTION

    .PARAMETER Title
        The event title, limited to 100 characters.
    
    .PARAMETER Text
        The body of the event, limited to 4000 characters.
        
    .PARAMETER DateHappened
        Date object representing the date of the event, default is now. Not compatible with TimestampHappened.
    
    .PARAMETER TimestampHappened
        Posix timestamp of the event, default is now. Not compatible with DateHappened.
   
    .PARAMETER Priority
        The priority of the event, can be 'normal' or 'low'. Default is 'normal'.
    
    .PARAMETER Host
        Hostname to associate with the event, default is None.
    
    .PARAMETER Tags
        A list of tags to associate with the event, as string or array of strings
    
    .PARAMETER AlertType
        Severity of the event. Can be 'error', 'warning', or 'success'. Default is 'info'.

    .PARAMETER AggregationKey
        An arbitrary string to use for aggregation, max length of 100 characters. Default is None.
        If you specify a key, all events using that key will be grouped together in the Event Stream.
    
    .PARAMETER SourceTypeName
        The type of event being posted. Can be 'nagios', 'hudson', 'jenkins', 'user', 'my_apps', 'feed',
        'chef', 'puppet', 'git', 'bitbucket', 'fabric', 'capistrano'. Default is None.
       
    .EXAMPLE
       # Send an event with default options
       New-DDEvent -Title 'A new event' -Text 'Something happened!'

    .EXAMPLE
       # Send an event with custom options
       New-DDEvent -Title 'A new event' -Text 'Something happened!' -Tags 'deploy' -AlertType 'Success'
   

    .LINK
        http://docs.datadoghq.com/api/?lang=console#events-post

    .FUNCTIONALITY
    
#>

    [CmdletBinding(DefaultParameterSetName='Default')]

    # most parameters belong to Default, New-DDEvent:ByDate and New-DDEvent:ByTimestamp parameter sets
    param (     
         [Parameter(
            Position=0,
            ValueFromPipeline=$True,
            ValueFromPipelineByPropertyName=$True,
            ValueFromRemainingArguments=$True,
            Mandatory=$True,
            HelpMessage=" The event title",
            ParameterSetName="Default"
        )]
        [Parameter(
            Position=0,
            ValueFromPipeline=$True,
            ValueFromPipelineByPropertyName=$True,
            ValueFromRemainingArguments=$True,
            Mandatory=$True,
            HelpMessage=" The event title",
            ParameterSetName="New-DDEvent:ByDate"
        )]
        [Parameter(
            Position=0,
            ValueFromPipeline=$True,
            ValueFromPipelineByPropertyName=$True,
            ValueFromRemainingArguments=$True,
            Mandatory=$True,
            HelpMessage=" The event title",
            ParameterSetName="New-DDEvent:ByTimestamp"
        )]
        [ValidateNotNullOrEmpty()]
        [ValidateLength(1, 100)]
        [String]$Title,

        [Parameter(
            Position=1,
            ValueFromPipeline=$True,
            ValueFromPipelineByPropertyName=$True,
            ValueFromRemainingArguments=$True,
            Mandatory=$True,
            HelpMessage="The body of the event.",
            ParameterSetName="Default"
        )]
        [Parameter(
            Position=1,
            ValueFromPipeline=$True,
            ValueFromPipelineByPropertyName=$True,
            ValueFromRemainingArguments=$True,
            Mandatory=$True,
            HelpMessage="The body of the event.",
            ParameterSetName="New-DDEvent:ByDate"
        )]
        [Parameter(
            Position=1,
            ValueFromPipeline=$True,
            ValueFromPipelineByPropertyName=$True,
            ValueFromRemainingArguments=$True,
            Mandatory=$True,
            HelpMessage="The body of the event.",
            ParameterSetName="New-DDEvent:ByTimestamp"
        )]
        [ValidateNotNullOrEmpty()]
        [ValidateLength(1, 4000)]
        [String]$Text,

        [Parameter(
            Position=2,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$False,
            Mandatory=$False,
            HelpMessage="Date of the event",
            ParameterSetName="New-DDEvent:ByDate"
        )]
        [ValidateNotNullOrEmpty()]
        [datetime]$DateHappened,

        [Parameter(
            Position=2,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$False,
            Mandatory=$False,
            HelpMessage="POSIX timestamp of the event",
            ParameterSetName="New-DDEvent:ByTimestamp"
        )]
        # [int]$null is 0, so we can't use [ValidateNullOrEmpty]
        [ValidateScript( {if ($_ -eq 0) {throw 'Cannot bind argument to parameter <<MonitorID>> because it is null or 0.'} else {return $True} } 
        )]
        [Double]$TimestampHappened,
        
       [Parameter(
            Position=3,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$False,
            Mandatory=$False,
            HelpMessage="The priority of the event chosen from 'normal' or 'low'",
            ParameterSetName="Default"
        )]
       [Parameter(
            Position=3,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$False,
            Mandatory=$False,
            HelpMessage="The priority of the event chosen from 'normal' or 'low'",
            ParameterSetName="New-DDEvent:ByDate"
        )]
        [Parameter(
            Position=3,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$False,
            Mandatory=$False,
            HelpMessage="The priority of the event chosen from 'normal' or 'low'",
            ParameterSetName="New-DDEvent:ByTimestamp"
        )]
        [ValidateSet('normal', 'low')]
        [ValidateNotNullOrEmpty()]
        [String]$Priority, # No need to set a default value here, the API does that for us

        [Parameter(
            Position=4,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$False,
            Mandatory=$False,
            HelpMessage="Host name to associate with the event.",
            ParameterSetName="Default"
        )]
        [Parameter(
            Position=4,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$False,
            Mandatory=$False,
            HelpMessage="Host name to associate with the event.",
            ParameterSetName="New-DDEvent:ByDate"
        )]
        [Parameter(
            Position=4,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$False,
            Mandatory=$False,
            HelpMessage="Host name to associate with the event.",
            ParameterSetName="New-DDEvent:ByTimestamp"
        )]
        [ValidateNotNullOrEmpty()]
        [String]$Hostname,

         [Parameter(
            Position=5,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$false,
            Mandatory=$False,
            HelpMessage="A list of tags to associate with the event, as string or array of strings",
            ParameterSetName="Default"
        )]
         [Parameter(
            Position=5,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$false,
            Mandatory=$False,
            HelpMessage="A list of tags to associate with the event, as string or array of strings",
            ParameterSetName="New-DDEvent:ByDate"
        )]
        [Parameter(
            Position=5,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$false,
            Mandatory=$False,
            HelpMessage="A list of tags to associate with the event, as string or array of strings",
            ParameterSetName="New-DDEvent:ByTimestamp"
        )]
        [ValidateNotNullOrEmpty()]
        [string[]]$Tags,

        [Parameter(
            Position=6,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$False,
            Mandatory=$False,
            HelpMessage="Severity of the event. Can be 'error', 'warning', 'info' or 'success'. Default is 'info'.",
            ParameterSetName="Default"
        )]
        [Parameter(
            Position=6,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$False,
            Mandatory=$False,
            HelpMessage="Severity of the event. Can be 'error', 'warning', 'info' or 'success'. Default is 'info'.",
            ParameterSetName="New-DDEvent:ByTimestamp"
        )]
        [Parameter(
            Position=6,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$False,
            Mandatory=$False,
            HelpMessage="Severity of the event. Can be 'error', 'warning' or 'success'. Default is 'info'.",
            ParameterSetName="New-DDEvent:ByDate"
        )]
        [ValidateSet('error', 'warning', 'success')]
        [ValidateNotNullOrEmpty()]
        [String]$AlertType,

        [Parameter(
            Position=7,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$False,
            Mandatory=$False,
            HelpMessage="An arbitrary string to use for aggregation, max length of 100 characters.",
            ParameterSetName="Default"
        )]
        [Parameter(
            Position=7,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$False,
            Mandatory=$False,
            HelpMessage="An arbitrary string to use for aggregation, max length of 100 characters.",
            ParameterSetName="New-DDEvent:ByDate"
        )]
         [Parameter(
            Position=7,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$False,
            Mandatory=$False,
            HelpMessage="An arbitrary string to use for aggregation, max length of 100 characters.",
            ParameterSetName="New-DDEvent:ByTimestamp"
        )]
        [ValidateNotNullOrEmpty()]
        [ValidateLength(1, 100)]
        [String]$AggregationKey,

        [Parameter(
            Position=8,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$False,
            Mandatory=$False,
            HelpMessage="The type of event being posted.",
            ParameterSetName="Default"
        )]
        [Parameter(
            Position=8,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$False,
            Mandatory=$False,
            HelpMessage="The type of event being posted.",
            ParameterSetName="New-DDEvent:ByDate"
        )]
        [Parameter(
            Position=8,
            ValueFromPipeline=$False,
            ValueFromPipelineByPropertyName=$False,
            ValueFromRemainingArguments=$False,
            Mandatory=$False,
            HelpMessage="The type of event being posted.",
            ParameterSetName="New-DDEvent:ByTimestamp"
        )]
        [ValidateSet('nagios', 'hudson', 'jenkins', 'user', 'my_apps', 'feed',
        'chef', 'puppet', 'git', 'bitbucket', 'fabric', 'capistrano')]
        [ValidateNotNullOrEmpty()]
        [String]$SourceTypeName
     )
    process {

        $Body = @{}

        $Body.Add('title', $Title)
        $Body.Add('text', $Text)
        if ($PSCmdlet.ParameterSetName -eq "New-DDEvent:ByDate") {
            $unixEpochStart = new-object DateTime 1970,1,1,0,0,0,([DateTimeKind]::Utc)
            $Timestamp = [int]($DateHappened - $unixEpochStart).TotalSeconds
            $Body.Add('date_happened',$Timestamp)
        }
        if ($PSCmdlet.ParameterSetName -eq "New-DDEvent:ByTimestamp") {
            $Body.Add('date_happened',$TimestampHappened)
        }
        if ($Priority) {
            $Body.Add('priority', $Priority)
        }
        if ($Hostname) {
            $Body.Add('host', $Hostname)
        }
        if ($Tags) {
            $Body.Add("tags",($Tags -join ','))
        }
        if ($AlertType) {
            $Body.Add('alert_type', $AlertType)
        }
        if ($AggregationKey) {
            $Body.Add('aggregation_key', $AggregationKey)
        }
        if ($SourceTypeName) {
            $Body.Add('source_type_name', $SourceTypeName)
        }

        $result = New-DDQuery -EndPoint "/events" -Method 'Post' -Body $($Body | ConvertTo-Json)  -RequiresApplicationKey -ErrorAction Stop
       
        # Build the default property set
        $defaultDisplaySet = 'event', 'status'
        $defaultDisplayPropertySet = New-Object System.Management.Automation.PSPropertySet('DefaultDisplayPropertySet',[string[]]$defaultDisplaySet)
        $PSStandardMembers = [System.Management.Automation.PSMemberInfo[]]@($defaultDisplayPropertySet)
        $result | Add-Member MemberSet PSStandardMembers $PSStandardMembers

        return $result 
   
    }
}