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 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.
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"
}
}
Page updated on Thursday, March 4, 2021