Skip to content

Incoming integrations

Exhale turns incoming alert signals into Pulses — scrubbed payloads in PostgreSQL, optional async triage, and the customer UI. Each source is an HTTPS webhook that creates or updates tenant-scoped pulse rows.

Today: PagerDuty, OpsGenie, Splunk On-Call, Grafana, Datadog, Alertmanager, New Relic, Sentry, Honeycomb, Elastic Observability, Dynatrace, AWS CloudWatch, and tenant manual webhooks are production ingest paths.

Triage context (repos, runbooks, observability at triage time) is separate from ingest — configure under Connections → Context in the app.

Outbound notifications (Slack Block Kit, Teams Adaptive Cards, outbound HTTPS webhook, incident email/SMS after triage) are separate from ingest — configure under Connections → Notifications.


How ingest works (all sources)

Every incoming integration follows the same pipeline:

  1. Authenticate — vendor signature, shared secret, or tenant token (per source).
  2. Size limit — reject bodies over the configured maximum (default 1 MiB413).
  3. Dedupe — delivery id and/or (tenant_id, source, external_id) to avoid duplicate Pulses.
  4. Scrub — regex + structural masking before persist and before LLM.
  5. Resolve tenant — integration registry account hint; dev tenant fallback in local/test only.
  6. Upsert pulse — set source, external_id, title, status, ephemeral payload.
  7. Enqueue triage — when async triage is enabled and lifecycle rules allow.

Shipped today

SourceEndpointPulse sourceGuide
PagerDutyPOST /webhooks/pagerdutypagerdutyPagerDuty webhooks
OpsGeniePOST /webhooks/opsgenie (header X-Exhale-Webhook-Token) or POST /webhooks/opsgenie/{token}opsgenieOpsGenie
Splunk On-CallPOST /webhooks/splunk-oncall (header X-Exhale-Webhook-Token) or POST /webhooks/splunk-oncall/{token}splunk_oncallSplunk On-Call
GrafanaPOST /webhooks/grafana (header X-Exhale-Webhook-Token) or POST /webhooks/grafana/{token}grafanaGrafana
DatadogPOST /webhooks/datadog (header X-Exhale-Webhook-Token) or POST /webhooks/datadog/{token}datadogDatadog
Prometheus AlertmanagerPOST /webhooks/alertmanager (header X-Exhale-Webhook-Token) or POST /webhooks/alertmanager/{token}alertmanagerAlertmanager
New RelicPOST /webhooks/newrelic (header X-Exhale-Webhook-Token) or POST /webhooks/newrelic/{token}new_relicNew Relic
SentryPOST /webhooks/sentry (header X-Exhale-Webhook-Token) or POST /webhooks/sentry/{token}sentrySentry
HoneycombPOST /webhooks/honeycomb (header X-Exhale-Webhook-Token) or POST /webhooks/honeycomb/{token}honeycombHoneycomb
Elastic ObservabilityPOST /webhooks/elastic (header X-Exhale-Webhook-Token) or POST /webhooks/elastic/{token}elasticElastic
DynatracePOST /webhooks/dynatrace (header X-Exhale-Webhook-Token) or POST /webhooks/dynatrace/{token}dynatraceDynatrace
AWS CloudWatchPOST /webhooks/aws-cloudwatch (header X-Exhale-Webhook-Token) or POST /webhooks/aws-cloudwatch/{token}aws_cloudwatchAWS CloudWatch
Manual webhookPOST /webhooks/manual (header X-Exhale-Webhook-Token) or POST /webhooks/manual/{token}other (UI: Manual webhook)Manual webhook

Customer setup: Connections → Integrations. PagerDuty uses self-serve account id registration plus a shared webhook URL. Token-auth sources use a per-tenant URL token from Connect (manual also uses HMAC).


Context vs ingest

TrackPurposeExamples
Incoming (this site)Creates PulsesNew Relic Integrations, Datadog Integrations, Sentry, CloudWatch SNS, …
Context (in-app)Enrichment at triage timeDatadog Context (API key); New Relic Context and other Observability context adapters (connect shipped; APM fetch at triage still open)

OpenAPI

Webhook and integration-setup routes are documented in the API reference. Use the guides above for signing, dedupe, tenancy, and lifecycle behavior.

Exhale by Kolstrom Systems LLC