← PagerDuty + Discord Webhook integrations

Send Message with Discord Webhook API on New On-Call Rotation from PagerDuty API

Pipedream makes it easy to connect APIs for Discord Webhook, PagerDuty and 1000+ other apps remarkably fast.

Trigger workflow on
New On-Call Rotation from the PagerDuty API
Next, do this
Send Message with the Discord Webhook API
No credit card required
Into to Pipedream
Watch us build a workflow
Watch us build a workflow
7 min
Watch now ➜
Trusted by 250,000+ developers from startups to Fortune 500 companies:
Trusted by 250,000+ developers from startups to Fortune 500 companies

Developers Pipedream

Getting Started

This integration creates a workflow with a PagerDuty trigger and Discord Webhook action. When you configure and deploy the workflow, it will run on Pipedream's servers 24x7 for free.

  1. Select this integration
  2. Configure the New On-Call Rotation trigger
    1. Connect your PagerDuty account
    2. Optional- Select one or more Escalation Policies
    3. Configure Interval to poll for new rotations
  3. Configure the Send Message action
    1. Connect your Discord Webhook account
    2. Configure Message
    3. Optional- Configure Thread ID
    4. Optional- Configure Username
    5. Optional- Configure Avatar URL
    6. Optional- Configure Include link to workflow
  4. Deploy the workflow
  5. Send a test event to validate your setup
  6. Turn on the trigger

Details

This integration uses pre-built, open source components from Pipedream's GitHub repo. These components are developed by Pipedream and the community, and verified and maintained by Pipedream.

To contribute an update to an existing component or create a new component, create a PR on GitHub. If you're new to Pipedream component development, you can start with quickstarts for trigger span and action development, and then review the component API reference.

Trigger

Description:Emit new event each time a new user rotates onto an on-call rotation
Version:0.0.2
Key:pagerduty-new-on-call-rotation

Trigger Code

import differenceBy from "lodash.differenceby";
import pagerduty from "../../pagerduty.app.mjs";
import common from "../common.mjs";

export default {
  ...common,
  key: "pagerduty-new-on-call-rotation",
  name: "New On-Call Rotation",
  version: "0.0.2",
  description: "Emit new event each time a new user rotates onto an on-call rotation",
  props: {
    ...common.props,
    pagerduty,
    db: "$.service.db",
    escalationPoliciesIds: {
      type: "string[]",
      label: "Escalation Policies",
      description: "To filter your on-call rotations to specific escalation policies, select them here. **To listen for rotations across all escalation policies, leave this blank**.",
      propDefinition: [
        pagerduty,
        "escalationPolicyId",
      ],
    },
    timer: {
      type: "$.interface.timer",
      label: "Interval to poll for new rotations",
      description:
        "The PagerDuty API doesn't support webhook notifications for on-call rotations, so we must poll the API to check for these changes. Change this interval according to your needs.",
      default: {
        intervalSeconds: 60 * 15,
      },
    },
  },
  async run() {
    // If the user didn't watch specific escalation policies,
    // iterate through all of the policies on the account
    const escalationPoliciesIds =
      this.escalationPoliciesIds?.length
        ? this.escalationPoliciesIds
        : await this.pagerduty.listEscalationPoliciesIds();

    // Since we can watch multiple escalation policies for rotations, we must
    // keep track of the last users who were on-call for a given policy.
    const oncallUsersByEscalationPolicy = this.getOncallUsersByEscalationPolicy() || {};

    for (const escalationPolicyId of escalationPoliciesIds) {
      // Multiple users can technically be on-call at the same time if the account
      // has multiple schedules attached to an escalation policy, so we must watch
      // for any new users in the list of on-call users who were not in the list of
      // users previously on-call. See
      // https://community.pagerduty.com/forum/t/how-do-i-add-more-than-one-person-on-call-for-a-schedule/751
      const oncallUsers = await this.pagerduty.listOncallUsers({
        params: {
          escalation_policy_ids: [
            escalationPolicyId,
          ],
        },
      });
      const previousUsersOncall = oncallUsersByEscalationPolicy[escalationPolicyId] || [];

      // Retrieve the list of users who were previously not on-call,
      // but now entered the rotation
      const newOncallUsers = differenceBy(
        oncallUsers,
        previousUsersOncall,
        "id",
      );

      oncallUsersByEscalationPolicy[escalationPolicyId] = oncallUsers;

      if (!newOncallUsers.length) {
        console.log(`No change to on-call users for escalation policy ${escalationPolicyId}`);
        continue;
      }

      // Include escalation policy metadata in emit
      const escalationPolicy =
        await this.pagerduty.getEscalationPolicy({
          escalationPolicyId,
        });

      newOncallUsers.forEach((user) => {
        this.$emit({
          user,
          escalationPolicy,
        }, {
          summary: `${user.summary} is now on-call for escalation policy ${escalationPolicy.name}`,
        });
      });
    }

    // Persist the new set of on-call users for the next run
    this.setOncallUsersByEscalationPolicy(oncallUsersByEscalationPolicy);
  },
};

Trigger Configuration

This component may be configured based on the props defined in the component code. Pipedream automatically prompts for input values in the UI and CLI.
LabelPropTypeDescription
PagerDutypagerdutyappThis component uses the PagerDuty app.
N/Adb$.service.dbThis component uses $.service.db to maintain state between component invocations.
Escalation PoliciesescalationPoliciesIdsstring[]Select a value from the drop down menu.
Interval to poll for new rotationstimer$.interface.timer

The PagerDuty API doesn't support webhook notifications for on-call rotations, so we must poll the API to check for these changes. Change this interval according to your needs.

Trigger Authentication

PagerDuty uses OAuth authentication. When you connect your PagerDuty account, Pipedream will open a popup window where you can sign into PagerDuty and grant Pipedream permission to connect to your account. Pipedream securely stores and automatically refreshes the OAuth tokens so you can easily authenticate any PagerDuty API.

Pipedream requests the following authorization scopes when you connect your account:

About PagerDuty

Real-Time Operations and Incident Response

Action

Description:Send a simple message to a Discord channel
Version:0.3.1
Key:discord_webhook-send-message

Discord Webhook Overview

With Discord's Webhook API, you can create applications that send messages to
Discord channels automatically. For example, you could create a bot that sends
a message to a channel every time a new blog post is published, or a message to
a channel when someone joins your Discord server.

Here are some ideas for what you could build using the Discord Webhook API:

  • A bot that sends a message to a channel when a new blog post is published
  • A bot that sends a message to a channel when someone joins your Discord
    server
  • A bot that sends a message to a channel when a new product is added to your
    online store

Action Code

import common from "../send-message-common.mjs";

export default {
  ...common,
  key: "discord_webhook-send-message",
  name: "Send Message",
  description: "Send a simple message to a Discord channel",
  version: "0.3.1",
  type: "action",
  props: {
    ...common.props,
  },
  async run({ $ }) {
    const {
      message,
      avatarURL,
      threadID,
      username,
      includeSentViaPipedream,
    } = this;

    try {
      // No interesting data is returned from Discord
      await this.discordWebhook.sendMessage({
        avatarURL,
        threadID,
        username,
        content: includeSentViaPipedream
          ? this.appendPipedreamText(message)
          : message,
      });
      $.export("$summary", "Message sent successfully");
    } catch (err) {
      const unsentMessage = this.getUserInputProps();
      $.export("unsent", unsentMessage);
      throw err;
    }
  },
};

Action Configuration

This component may be configured based on the props defined in the component code. Pipedream automatically prompts for input values in the UI.

LabelPropTypeDescription
Discord WebhookdiscordWebhookappThis component uses the Discord Webhook app.
Messagemessagestring

Enter a simple message up to 2000 characters. This is the most commonly used field. However, it's optional if you pass embed content.

Thread IDthreadIDstring

If provided, the message will be posted to this thread

Usernameusernamestring

Overrides the current username of the webhook

Avatar URLavatarURLstring

If used, it overrides the default avatar of the webhook. Note: Consecutive posts by the same username within 10 minutes of each other will not display updated avatar.

Include link to workflowincludeSentViaPipedreamboolean

Defaults to true, includes a link to this workflow at the end of your Discord message.

Action Authentication

Discord Webhook uses OAuth authentication. When you connect your Discord Webhook account, Pipedream will open a popup window where you can sign into Discord Webhook and grant Pipedream permission to connect to your account. Pipedream securely stores and automatically refreshes the OAuth tokens so you can easily authenticate any Discord Webhook API.

Pipedream requests the following authorization scopes when you connect your account:

webhook.incomingemailidentify

About Discord Webhook

Use this app to send messages to a channel using Discord's incoming webhooks

More Ways to Connect Discord Webhook + PagerDuty

Send Message (Advanced) with Discord Webhook API on New On-Call Rotation from PagerDuty API
PagerDuty + Discord Webhook
 
Try it
Send Message With File with Discord Webhook API on New On-Call Rotation from PagerDuty API
PagerDuty + Discord Webhook
 
Try it
Send Message (Advanced) with Discord Webhook API on New or Updated Incident from PagerDuty API
PagerDuty + Discord Webhook
 
Try it
Send Message With File with Discord Webhook API on New or Updated Incident from PagerDuty API
PagerDuty + Discord Webhook
 
Try it
Send Message with Discord Webhook API on New or Updated Incident from PagerDuty API
PagerDuty + Discord Webhook
 
Try it
New On-Call Rotation from the PagerDuty API

Emit new event each time a new user rotates onto an on-call rotation

 
Try it
New On-Call Rotation from the PagerDuty API

Emit new event each time a new user rotates onto an on-call rotation

 
Try it
New or Updated Incident from the PagerDuty API

Emit new event each time an incident is created or updated

 
Try it
Acknowledge Incident with the PagerDuty API

Acknowledge an incident. See the docs here

 
Try it
Find Oncall User with the PagerDuty API

Find the user on call for a specific schedule. See the docs here

 
Try it
Resolve Incident with the PagerDuty API

Resolve an incident. See the docs here

 
Try it
Trigger Incident with the PagerDuty API

Trigger an incident. See the docs here

 
Try it
Send Message with the Discord Webhook API

Send a simple message to a Discord channel

 
Try it