Datadog - Log Task

Octopus.Script exported 2021-03-04 by octocrock belongs to ‘Datadog’ category.

Log details of a task to Datadog, including error detail.

Configuration:

  • In Datadog, add a standard attribute of octopus.deployment.properties to see and access JSON details of the task.

  • When using the step, set the run condition of the step to Always run to ensure logs are sent for errors as well as successful tasks.

Parameters

When steps based on the template are included in a project’s deployment process, the parameters below can be set.

Datadog URL

DatadogUrl = https://http-intake.logs.datadoghq.eu/v1/input

The URL for POSTing log information

Datadog API Key

DatadogAPIKey =

API Key required for accessing API.

Datadog Application Key

DatadogApplicationKey =

Information on Datadog Application Keys

Datadog Service Name

DatadogServiceName = Octopus Deploy

null

DatadogOctopusAPIKey =

Only used when an exception has occurred.

Octopus instance API Key. Requires at least TaskView permission.

Script body

Steps based on this template will execute the following PowerShell script.

  
function Send-DatadogEvent (
    $datadog,
    [string] $text,
    [string] $level,
    $properties = @{},
    [string] $exception = $null,
    [switch] $template) {
    
    
    if (-not $level) {
        $level = 'Information'
    }

    if (@('Verbose', 'Debug', 'Information', 'Warning', 'Error', 'Fatal') -notcontains $level) {
        $level = 'Information'
    }


    $ddtags = "project:$($properties.ProjectName),deploymentname:$($properties.DeploymentName),env:$($properties.EnvironmentName)"
    if ($properties["TaskType"] -eq "Runbook") {
        $ddtags += ",runbookname:$($properties.RunbookName),tasktype:runbook"
    }
    else {
        $ddtags += ",tasktype:deployment"    
    }

    $body = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
    $body.Add("ddsource", "Octopus Deploy")
    $body.Add("ddtags", $ddtags)
    $body.Add("service", $DatadogServiceName)
    $body.Add("hostname", "https://octopus.the-crock.com/")
    $body.Add("http.url", "$($properties["TaskLink"])")
    $body.Add("octopus.deployment.properties", "$($properties | ConvertTo-Json)")

    if ($exception) {
        $body.Add("error.message", "$($properties["Error"])")
        $body.Add("error.stack", "$($exception)")
    }
    
    $body.Add("level", "$($level)")
  
    $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
    $headers.Add("Content-Type", "application/json")
    $headers.Add("DD-APPLICATION-KEY", "$($DatadogApplicationKey)")
    $headers.Add("DD-API-KEY", "$($DatadogApiKey)")

    Invoke-RestMethod -Uri $DatadogUrl -Body $($body | ConvertTo-Json)  -ContentType "application/json" -Method POST -Headers $headers
}

function Set-ErrorDetails(){

    $octopusAPIHeader = @{ "X-Octopus-ApiKey" = $DatadogOctopusAPIKey }
    $taskDetailUri = "$($OctopusParameters['Octopus.Web.ServerUri'])/api/tasks/$($OctopusParameters["Octopus.Task.Id"])/details"

    $taskDetails = Invoke-RestMethod -Method Get -Uri $taskDetailUri -Headers $octopusAPIHeader 
    $errorMessage = "";
    $errorFirstLine = "";
    $isFirstLine = $true;

    foreach ($activityLog in $taskDetails.ActivityLogs) {
        foreach ($activityLogChild1 in $activityLog.Children) {
            foreach ($activityLogChild2 in $activityLogChild1.Children) {
                foreach ($logElement in $activityLogChild2.LogElements) {
                    if ($logElement.Category -eq "Error") {
                        if ($isFirstLine -eq $true) {
                            $errorFirstLine = $logElement.MessageText;
                            $isFirstLine = $false;
                        }

                        $errorMessage += $logElement.MessageText + " `n"
                    }
                }
            }
        }
    }

    $exInfo = @{
        firstLine = $errorFirstLine
        message = $errorMessage
    }

    return $exInfo;
}

function Set-TaskProperties(){
    $taskProperties = @{
        ProjectName     = $OctopusParameters['Octopus.Project.Name'];
        Result          = "succeeded";
        InstanceUrl     = $OctopusParameters['Octopus.Web.ServerUri'];
        EnvironmentName = $OctopusParameters['Octopus.Environment.Name'];
        DeploymentName  = $OctopusParameters['Octopus.Deployment.Name'];
        TenantName      = $OctopusParameters["Octopus.Deployment.Tenant.Name"]
        TaskLink        = $taskLink
    }
    
    if ([string]::IsNullOrEmpty($OctopusParameters["Octopus.Runbook.Id"]) -eq $false) {
        $taskProperties["TaskType"] 			= "Runbook"
        $taskProperties["RunbookSnapshotName"] 	= $OctopusParameters["Octopus.RunbookSnapshot.Name"]
        $taskProperties["RunbookName"]         	= $OctopusParameters["Octopus.Runbook.Name"]
    }
    else {
        $taskProperties["TaskType"] 		= "Deployment"
        $taskProperties["ReleaseNumber"] 	= $OctopusParameters['Octopus.Release.Number'];
        $taskProperties["Channel"]  		= $OctopusParameters['Octopus.Release.Channel.Name'];
    }

    return $taskProperties;
}

#******************************************************************

$taskLink = $OctopusParameters['Octopus.Web.ServerUri'] + "/app#/" + $OctopusParameters["Octopus.Space.Id"] + "/tasks/" + $OctopusParameters["Octopus.Task.Id"]
$level = "Information"
$exception = $null

Write-Output "Logging the deployment result to Datadog at $DatadogServerUrl..."

$properties = Set-TaskProperties

if ($OctopusParameters['Octopus.Deployment.Error']) {
    $exceptionInfo = Set-ErrorDetails
    $properties["Result"] = "failed"
    $properties["Error"] = $exceptionInfo["firstLine"]
    $exception = $exceptionInfo["message"]
    $level = "Error"
}

try {
    Send-DatadogEvent $datadog "A deployment of $($properties.ProjectName) release $($properties.ReleaseNumber) $($properties.Result) in $($properties.EnvironmentName)" -level $level -template -properties $properties -exception $exception
}
catch [Exception] {
    Write-Error "Unable to write task details to Datadog"
    $_.Exception | format-list -force
}

Provided under the Apache License version 2.0.

Report an issue

To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.

{
  "Id": "e8550a62-3ed7-4200-b5c7-ba91cbda5e2a",
  "Name": "Datadog - Log Task",
  "Description": "Log details of a task to Datadog, including error detail.\n\n**Configuration**: \n\n* In Datadog, add a [standard attribute](https://docs.datadoghq.com/logs/processing/attributes_naming_convention/#standard-attributes-and-aliasing) of `octopus.deployment.properties` to see and access JSON details of the task.  \n\n* When using the step, set the [run condition](https://octopus.com/docs/projects/steps/conditions) of the step to `Always run` to ensure logs are sent for errors as well as successful tasks.",
  "Version": 1,
  "ExportedAt": "2021-03-04T11:25:36.400Z",
  "ActionType": "Octopus.Script",
  "Author": "octocrock",
  "Packages": [],
  "Parameters": [
    {
      "Id": "6a1f7310-294a-4593-898b-afc32bd93bb3",
      "Name": "DatadogUrl",
      "Label": "Datadog URL",
      "HelpText": "The URL for POSTing log information",
      "DefaultValue": "https://http-intake.logs.datadoghq.eu/v1/input",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "2eb26500-3ced-466c-962e-18b91ce6ea46",
      "Name": "DatadogAPIKey",
      "Label": "Datadog API Key",
      "HelpText": "[API Key](https://docs.datadoghq.com/account_management/api-app-keys/#api-keys) required for accessing API.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "Sensitive"
      }
    },
    {
      "Id": "289728cb-9442-41b3-a3be-17f4e8287380",
      "Name": "DatadogApplicationKey",
      "Label": "Datadog Application Key",
      "HelpText": "Information on Datadog [Application Keys](https://docs.datadoghq.com/account_management/api-app-keys/#application-keys)",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "Sensitive"
      }
    },
    {
      "Id": "6afbdc2a-3f85-4807-abff-d7f3e0dcba77",
      "Name": "DatadogServiceName",
      "Label": "Datadog Service Name",
      "HelpText": null,
      "DefaultValue": "Octopus Deploy",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "62b47d15-e05f-4e0b-a4b9-4a80b98b62f9",
      "Name": "DatadogOctopusAPIKey",
      "Label": "",
      "HelpText": "Only used when an exception has occurred.\n\nOctopus instance [API Key](https://octopus.com/docs/octopus-rest-api/how-to-create-an-api-key).   Requires at least `TaskView` [permission](https://octopus.com/docs/security/users-and-teams/system-and-space-permissions).",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "Sensitive"
      }
    }
  ],
  "Properties": {
    "Octopus.Action.Script.ScriptSource": "Inline",
    "Octopus.Action.Script.Syntax": "PowerShell",
    "Octopus.Action.Script.ScriptBody": "  \nfunction Send-DatadogEvent (\n    $datadog,\n    [string] $text,\n    [string] $level,\n    $properties = @{},\n    [string] $exception = $null,\n    [switch] $template) {\n    \n    \n    if (-not $level) {\n        $level = 'Information'\n    }\n\n    if (@('Verbose', 'Debug', 'Information', 'Warning', 'Error', 'Fatal') -notcontains $level) {\n        $level = 'Information'\n    }\n\n\n    $ddtags = \"project:$($properties.ProjectName),deploymentname:$($properties.DeploymentName),env:$($properties.EnvironmentName)\"\n    if ($properties[\"TaskType\"] -eq \"Runbook\") {\n        $ddtags += \",runbookname:$($properties.RunbookName),tasktype:runbook\"\n    }\n    else {\n        $ddtags += \",tasktype:deployment\"    \n    }\n\n    $body = New-Object \"System.Collections.Generic.Dictionary[[String],[String]]\"\n    $body.Add(\"ddsource\", \"Octopus Deploy\")\n    $body.Add(\"ddtags\", $ddtags)\n    $body.Add(\"service\", $DatadogServiceName)\n    $body.Add(\"hostname\", \"https://octopus.the-crock.com/\")\n    $body.Add(\"http.url\", \"$($properties[\"TaskLink\"])\")\n    $body.Add(\"octopus.deployment.properties\", \"$($properties | ConvertTo-Json)\")\n\n    if ($exception) {\n        $body.Add(\"error.message\", \"$($properties[\"Error\"])\")\n        $body.Add(\"error.stack\", \"$($exception)\")\n    }\n    \n    $body.Add(\"level\", \"$($level)\")\n  \n    $headers = New-Object \"System.Collections.Generic.Dictionary[[String],[String]]\"\n    $headers.Add(\"Content-Type\", \"application/json\")\n    $headers.Add(\"DD-APPLICATION-KEY\", \"$($DatadogApplicationKey)\")\n    $headers.Add(\"DD-API-KEY\", \"$($DatadogApiKey)\")\n\n    Invoke-RestMethod -Uri $DatadogUrl -Body $($body | ConvertTo-Json)  -ContentType \"application/json\" -Method POST -Headers $headers\n}\n\nfunction Set-ErrorDetails(){\n\n    $octopusAPIHeader = @{ \"X-Octopus-ApiKey\" = $DatadogOctopusAPIKey }\n    $taskDetailUri = \"$($OctopusParameters['Octopus.Web.ServerUri'])/api/tasks/$($OctopusParameters[\"Octopus.Task.Id\"])/details\"\n\n    $taskDetails = Invoke-RestMethod -Method Get -Uri $taskDetailUri -Headers $octopusAPIHeader \n    $errorMessage = \"\";\n    $errorFirstLine = \"\";\n    $isFirstLine = $true;\n\n    foreach ($activityLog in $taskDetails.ActivityLogs) {\n        foreach ($activityLogChild1 in $activityLog.Children) {\n            foreach ($activityLogChild2 in $activityLogChild1.Children) {\n                foreach ($logElement in $activityLogChild2.LogElements) {\n                    if ($logElement.Category -eq \"Error\") {\n                        if ($isFirstLine -eq $true) {\n                            $errorFirstLine = $logElement.MessageText;\n                            $isFirstLine = $false;\n                        }\n\n                        $errorMessage += $logElement.MessageText + \" `n\"\n                    }\n                }\n            }\n        }\n    }\n\n    $exInfo = @{\n        firstLine = $errorFirstLine\n        message = $errorMessage\n    }\n\n    return $exInfo;\n}\n\nfunction Set-TaskProperties(){\n    $taskProperties = @{\n        ProjectName     = $OctopusParameters['Octopus.Project.Name'];\n        Result          = \"succeeded\";\n        InstanceUrl     = $OctopusParameters['Octopus.Web.ServerUri'];\n        EnvironmentName = $OctopusParameters['Octopus.Environment.Name'];\n        DeploymentName  = $OctopusParameters['Octopus.Deployment.Name'];\n        TenantName      = $OctopusParameters[\"Octopus.Deployment.Tenant.Name\"]\n        TaskLink        = $taskLink\n    }\n    \n    if ([string]::IsNullOrEmpty($OctopusParameters[\"Octopus.Runbook.Id\"]) -eq $false) {\n        $taskProperties[\"TaskType\"] \t\t\t= \"Runbook\"\n        $taskProperties[\"RunbookSnapshotName\"] \t= $OctopusParameters[\"Octopus.RunbookSnapshot.Name\"]\n        $taskProperties[\"RunbookName\"]         \t= $OctopusParameters[\"Octopus.Runbook.Name\"]\n    }\n    else {\n        $taskProperties[\"TaskType\"] \t\t= \"Deployment\"\n        $taskProperties[\"ReleaseNumber\"] \t= $OctopusParameters['Octopus.Release.Number'];\n        $taskProperties[\"Channel\"]  \t\t= $OctopusParameters['Octopus.Release.Channel.Name'];\n    }\n\n    return $taskProperties;\n}\n\n#******************************************************************\n\n$taskLink = $OctopusParameters['Octopus.Web.ServerUri'] + \"/app#/\" + $OctopusParameters[\"Octopus.Space.Id\"] + \"/tasks/\" + $OctopusParameters[\"Octopus.Task.Id\"]\n$level = \"Information\"\n$exception = $null\n\nWrite-Output \"Logging the deployment result to Datadog at $DatadogServerUrl...\"\n\n$properties = Set-TaskProperties\n\nif ($OctopusParameters['Octopus.Deployment.Error']) {\n    $exceptionInfo = Set-ErrorDetails\n    $properties[\"Result\"] = \"failed\"\n    $properties[\"Error\"] = $exceptionInfo[\"firstLine\"]\n    $exception = $exceptionInfo[\"message\"]\n    $level = \"Error\"\n}\n\ntry {\n    Send-DatadogEvent $datadog \"A deployment of $($properties.ProjectName) release $($properties.ReleaseNumber) $($properties.Result) in $($properties.EnvironmentName)\" -level $level -template -properties $properties -exception $exception\n}\ncatch [Exception] {\n    Write-Error \"Unable to write task details to Datadog\"\n    $_.Exception | format-list -force\n}\n"
  },
  "Category": "Datadog",
  "HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/datadog-task-log.json",
  "Website": "/step-templates/e8550a62-3ed7-4200-b5c7-ba91cbda5e2a",
  "Logo": "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",
  "$Meta": {
    "Type": "ActionTemplate"
  }
}

History

Page updated on Thursday, March 4, 2021