PagerDuty
What it gives you — investigations triggered directly from PagerDuty incidents, no Alertmanager in the loop.
Minimal config
sources:
pagerduty: {}Optionally verify deliveries with the subscription’s signing secret:
sources:
pagerduty:
secret_env: PAGERDUTY_WEBHOOK_SECRETPD-side setup: create a webhook subscription
with delivery URL https://<runlore>/webhook/pagerduty, subscribe to incident.triggered and
incident.resolved, and put the subscription’s generated secret in the env var named by secret_env.
Verify it locally
curl -s -o /dev/null -w 'webhook HTTP %{http_code}\n' \
-XPOST "http://localhost:8080/webhook/pagerduty" \
-H 'Content-Type: application/json' \
--data '{"event":{"event_type":"incident.triggered","data":{"id":"PD123","type":"incident","title":"db latency spike","service":{"summary":"checkout-api"},"urgency":"high","html_url":"https://example.pagerduty.com/incidents/PD123"}}}'With secret_env set, PagerDuty (and this curl) must send X-PagerDuty-Signature: v1=<hex hmac-sha256 of the raw body>, keyed on the shared secret — otherwise the delivery is rejected.
Notes
incident.triggeredstarts an investigation;incident.resolvedcloses the outcome (like an Alertmanager resolved alert). Every other event type is ignored.- The incident title becomes the investigation title, priority (else urgency) the severity, and the
service name, incident number and
html_urlride along as labels. - PagerDuty carries no Kubernetes namespace or workload. Those fields stay empty, so a PagerDuty
incident can only recall catalog entries that are themselves resource-less (hand-written runbooks /
curated Playbooks without a
resourcefrontmatter) — the scopeless tier, the weakest recall match. It must clearsolo_floorandmin_scoreeven with multiple candidates, recalls with reduced confidence, andrequire_workload_match: truedisables it entirely. secret_envverifies each delivery against itsX-PagerDuty-Signatureheader (v1=-prefixed HMAC-SHA256 of the raw body); multiple comma-separated signatures are accepted so a zero-downtime secret rotation works — any match passes, constant-time.secret_envreplaces the sharedserver.webhook_token_envbearer token for this path (PagerDuty signs, it cannot send a bearer token). Leaving it unset leaves the webhook open — but it fails closed once a model is configured oractions.mode=auto: RunLore refuses to start with an unauthenticated PagerDuty webhook once a model is wired.
Reference
- Configuration →
sourcesfor the fullpagerdutykey reference. - Custom webhook — the same scopeless-tier recall applies there.