Freshservice Tickets using Webhooks

This guide shows you how to use the Datadog Webhooks integration to open new tickets in Freshservice when a monitor alerts.

Setup

To begin, open the Webhooks integration tile, go to the Configuration tab, then scroll to the bottom form to add a new Webhook.

Name

Provide your Webhook with a name. This name is used in your monitor message (see Usage) with @webhook-<NAME>. For example, if you name your Webhook freshservice, you can open a ticket from your monitor by mentioning @webhook-freshservice in the monitor message.

URL

Freshservice has 2 different versions of their API. This guide uses V2, but it is possible to use V1 with slight modifications to your JSON payload.

In the URL field enter the following endpoint:

https://<YOUR_DOMAIN>.freshservice.com/api/v2/tickets

Payload

Enter a new ticket JSON payload. The following example uses only the required fields, so review Freshservice’s ticket endpoint for more options on customizing your payload:

{
  "email": "[email address to associate with ticket]",
  "subject": "$EVENT_TITLE",
  "description": "<img src=\"$SNAPSHOT\" /><hr/>$TEXT_ONLY_MSG",
  "status": 2,
  "priority": 2
}

Note:

  • Values such as $EVENT_TITLE are variables used by the Webhook integration. For a full list of these variables and their meaning, see the Webhook integration tile or Webhook integration documentation.
  • Manually enter an email address for the email field instead of using the variable of $EMAIL, which is only populated when mentioning the Webhook in an Event Stream comment and not used within Monitor Alerts.
  • The description field of the payload accepts HTML. The $EVENT_MSG variable renders your monitor’s message in Markdown, which is not supported by Freshservice’s API, so $TEXT_ONLY_MSG is used instead, along with a graph snapshot.
  • The status and priority fields are numbers mapped to different values. To see these values, review Freshservice’s ticket endpoint.

Authentication

Freshservice’s API uses Basic Access Authentication. Your Base64 encoded credentials should be sent in the Authorization request header. Accepted credentials are your username and password in username:password format, or your Freshservice API key.

To set this up in your Webhook, add the following to your Headers section:

{"Authorization": "Basic <BASE64_ENCODED_CREDENTIALS>"}

Finishing up

In the Webhook integration tile, click Install Integration or Update Configuration (if you previously entered a Webhook definition) to save your changes.

Usage

Add the @webhook-<NAME> to your monitor message. The Webhook is triggered when the monitor changes state.

It is recommended to add your @-mention inside of {{#is_alert}} or {{#is_warning}} conditionals, for example:

{{#is_alert}}
    {{host.name}} is down!
    @webhook-freshservice
{{/is_alert}}

When your monitor triggers an alert, a new ticket appears in your Freshservice dashboard. If you choose not to use a conditional statement, a new ticket is created when the monitor recovers because the Webhook is triggered again.

Limitations

Ticket creation

The Webhooks integration can only create tickets. Updating an existing ticket requires a PUT method and the Webhooks integration only supports POST methods.

Status and priority

The $ALERT_STATUS and $PRIORITY variables return strings (such as ALERT and NORMAL) instead of a numerical value expected by Freshservice’s API. To setup different levels of status and priorities, create duplicate Webhooks with hard-coded status and priority fields. Then, @-mention those Webhooks inside of related conditional statements, for example:

{{#is_warning}}
    Disk space usage is above 80%
    @webhook-freshservice-warning
{{/is_warning}}
{{#is_alert}}
    Disk space usage is above 95%
    @webhook-freshservice-alert
{{/is_alert}}

Tagging

Tagging is supported in Freshservice’s API, but note the following:

  • The tags parameter in your JSON payload must be an array. That means you cannot use the $TAGS Webhook variable because it returns a comma separated list of strings.
  • Tags added to your JSON payload must not contain a : character, so you may not be able to map all of your Datadog tags to Freshservice. If a : character exists in your tags, your request fails.
  • Review the Webhook integration documentation for more variables that may be useful for Freshservice tags. In the following example, $HOSTNAME and $ORG_ID are used:
{
  "email": "<EMAIL_ADDRESS_TO_ASSOCIATE_WITH_TICKET>",
  "subject": "$EVENT_TITLE",
  "description": "<img src=\"$SNAPSHOT\" /><hr/>$TEXT_ONLY_MSG",
  "status": 2,
  "priority": 2,
  "tags": ["$HOSTNAME", "$ORG_ID"]
}

Troubleshooting

If your Webhooks fail to send after your monitor triggers, go to your Event Stream and search for sources:webhooks status:error. This searches for events with failed Webhooks that contain troubleshooting information, for example:

- Reply status code was: HTTP 401
- Reply content was:
  {"code":"invalid_credentials","message":"You have to be logged in to perform this action."}

Further Reading

Additional helpful documentation, links, and articles: