Source code for notifiers.providers.pagerduty

from ..core import Provider
from ..core import Response
from ..utils import requests


[docs]class PagerDuty(Provider): """Send PagerDuty Events""" name = "pagerduty" base_url = "https://events.pagerduty.com/v2/enqueue" site_url = "https://v2.developer.pagerduty.com/" path_to_errors = ("errors",) __payload_attributes = [ "message", "source", "severity", "timestamp", "component", "group", "class", "custom_details", ] __images = { "type": "array", "items": { "type": "object", "properties": { "src": { "type": "string", "title": "The source of the image being attached to the incident. " "This image must be served via HTTPS.", }, "href": { "type": "string", "title": "Optional URL; makes the image a clickable link", }, "alt": { "type": "string", "title": "Optional alternative text for the image", }, }, "required": ["src"], "additionalProperties": False, }, } __links = { "type": "array", "items": { "type": "object", "properties": { "href": {"type": "string", "title": "URL of the link to be attached"}, "text": { "type": "string", "title": "Plain text that describes the purpose of the link, and can be used as the link's text", }, }, "required": ["href", "text"], "additionalProperties": False, }, } _required = { "required": ["routing_key", "event_action", "source", "severity", "message"] } _schema = { "type": "object", "properties": { "message": { "type": "string", "title": "A brief text summary of the event, used to generate the summaries/titles of any " "associated alerts", }, "routing_key": { "type": "string", "title": 'The GUID of one of your Events API V2 integrations. This is the "Integration Key" listed on' " the Events API V2 integration's detail page", }, "event_action": { "type": "string", "enum": ["trigger", "acknowledge", "resolve"], "title": "The type of event", }, "dedup_key": { "type": "string", "title": "Deduplication key for correlating triggers and resolves", "maxLength": 255, }, "source": { "type": "string", "title": "The unique location of the affected system, preferably a hostname or FQDN", }, "severity": { "type": "string", "enum": ["critical", "error", "warning", "info"], "title": "The perceived severity of the status the event is describing with respect to the " "affected system", }, "timestamp": { "type": "string", "format": "iso8601", "title": "The time at which the emitting tool detected or generated the event in ISO 8601", }, "component": { "type": "string", "title": "Component of the source machine that is responsible for the event", }, "group": { "type": "string", "title": "Logical grouping of components of a service", }, "class": {"type": "string", "title": "The class/type of the event"}, "custom_details": { "type": "object", "title": "Additional details about the event and affected system", }, "images": __images, "links": __links, }, } def _prepare_data(self, data: dict) -> dict: payload = { attribute: data.pop(attribute) for attribute in self.__payload_attributes if data.get(attribute) } payload["summary"] = payload.pop("message") data["payload"] = payload return data def _send_notification(self, data: dict) -> Response: url = self.base_url response, errors = requests.post( url, json=data, path_to_errors=self.path_to_errors ) return self.create_response(data, response, errors)