For the complete documentation index, see llms.txt. This page is also available as Markdown.

Notifications

How alerts move in and out of ODD Platform — outbound through Slack incoming webhook, generic webhook, or SMTP email; inbound from Prometheus AlertManager as Distribution Anomaly alerts.

Notifications is the subsystem that moves alerts across the platform's boundary — out, through Slack, generic webhook, or SMTP email; or in, from a Prometheus AlertManager pushing distribution-anomaly events through the inbound webhook. Alerts the platform raises internally are described under Alerting; this page is about the channels that connect those alerts to the rest of an operator's stack.

The subsystem is disabled out of the box — the outbound dispatcher needs notifications.enabled=true plus a configured PostgreSQL logical-replication slot, and the inbound AlertManager webhook is gated by network reachability and, from 0.29.0, by auth.ingestion.filter.enabled (off by default). Each channel is independently configurable; deployments use whatever subset matches their on-call workflow.

For setup steps and the full key list, see Configure ODD Platform → Enable Alert Notifications and Configure ODD Platform → Prometheus AlertManager Integration. This page is the user-facing description of what each channel does, what it carries, and what to know before enabling it.

What an outbound notification carries

Every alert dispatched out of the platform carries:

  1. The name of the entity the alert was raised on.

  2. The data source and namespace of that entity.

  3. The owners attached to that entity (see Owners).

  4. Affected downstream entities — the lineage neighbours within notifications.message.downstream-entities-depth levels (default 1).

Clickable links inside notification messages resolve back to the platform UI using the operator-set odd.platform-base-url — both the Slack and email senders consume that key. The generic webhook receiver does not consume odd.platform-base-url; it gets the full alert payload directly and is expected to construct any URLs it needs from that payload.

Outbound channels

The platform supports three outbound channels. They can be enabled together or individually; an alert dispatched to multiple channels is delivered to every channel that is enabled.

Slack incoming webhook

The platform POSTs a formatted alert message to a Slack incoming webhook URL. This is outgoing-only — there is no thread state, no reply ingestion, no per-channel routing logic; the platform writes one message per alert dispatch.

Configured by notifications.receivers.slack.url. The same Slack workspace can also host the bidirectional Data Collaboration Slack app — the two integrations use different Slack mechanisms (incoming webhook vs OAuth + Events API) and are configured independently.

This is the alert webhook, not the Discussions Slack app. The alerting Slack integration is a one-way notifications.receivers.slack.url POST — no replies, no thread state. The full Slack app used by Data Collaboration is a separate integration via OAuth (datacollaboration.slack-oauth-token) and the Slack Events API. Each is configured separately; enabling one does not enable the other. See Main Concepts → Terms & Aliases for the side-by-side comparison.

Email (SMTP)

The platform sends a formatted alert email through an operator-supplied SMTP relay. Configured by the notifications.receivers.email.* family of keys (host, port, protocol, sender, password, recipient list, optional STARTTLS). The reference walkthrough using Gmail's SMTP is on the operator-side configuration reference at Configure ODD Platform → Example: Gmail SMTP.

The SMTP integration carries several JavaMail-default-driven limitations that operators should know before relying on it for production on-call:

The full set of email-side caveats (only STARTTLS supported, self-signed cert workaround, non-ASCII charset issue) lives on Configure ODD Platform → Enable Alert Notifications → Known limitations — operators authoring the SMTP configuration should walk through that section before enabling the channel.

Generic webhook

The platform POSTs the full alert payload (JSON) to an operator-supplied URL. Configured by notifications.receivers.webhook.url. Use this when you want to fan alerts into a tool the platform doesn't natively integrate with — your own incident-management system, an HTTP-driven on-call tool, a custom consumer that fans further to other channels.

Unlike the Slack and email senders, the generic webhook does not consume odd.platform-base-url — the receiver is expected to extract any URLs it needs from the alert payload itself.

Inbound channel — Prometheus AlertManager webhook

In addition to the alerts the platform raises from its own ingestion / evaluation pipeline, ODD exposes an inbound webhook that accepts Prometheus AlertManager notifications. Each accepted alert becomes a Distribution Anomaly alert on the referenced data entity, indistinguishable from internally-raised alerts from there on (it shows on the Alerts section, on the entity's page, and in the activity feed).

The alert type is always Distribution Anomaly, regardless of what the AlertManager-side rule is about. The platform reads only the entity_oddrn label, the generatorURL, and the timestamp from each alert; it does not read alertname, severity, or any other label to choose a type. A rule named DiskFillingUp or LatencySpike still lands as a Distribution Anomaly alert. Treat this webhook as a generic "raise an alert on this entity" channel, not as a typed bridge that preserves your Prometheus alert taxonomy.

The endpoint is POST /ingestion/alert/alertmanager; the platform reads alerts[].labels, alerts[].generatorURL, and alerts[].startsAt from the AlertManager webhook body and ignores other top-level fields. The full payload shape, the AlertManager route/receivers example, the rule-side label requirement, and the authentication caveat live on Configure ODD Platform → Prometheus AlertManager Integration.

Setting up notifications

The full step-by-step — the PostgreSQL replication prerequisites (max_wal_senders, wal_level, max_replication_slots, the REPLICATION role grant, AWS RDS specifics), the notifications.* configuration keys, the YAML and environment-variable formats, the Gmail SMTP example, and the AlertManager receiver / rule example — lives on Configure ODD Platform → Enable Alert Notifications and Configure ODD Platform → Prometheus AlertManager Integration. Operators wiring up notifications work from those two sections — this page is the orientation surface, not the configuration reference.

Email notification example

Disabling notifications

Set notifications.enabled=false to stop the platform from dispatching outbound notifications. The PostgreSQL replication slot and publication created by the platform persist after the toggle flips — clean them up explicitly to avoid the database holding WAL indefinitely. The cleanup SQL plus the SQL-injection-safe steps live on Configure ODD Platform → Enable Alert Notifications → Cleaning up.

Disabling outbound notifications does not disable the AlertManager inbound webhook. By default the inbound endpoint is gated only by network reachability; from 0.29.0, auth.ingestion.filter.enabled=true additionally requires a token on it (see Prometheus AlertManager Integration → Authentication). To stop accepting inbound AlertManager events, enable that flag, remove the AlertManager-side receiver pointing at the platform, or block the perimeter route to /ingestion/alert/alertmanager.

Known operational caveats

The Notifications subsystem carries several operational behaviours that are non-obvious until they surface in production. Each item below states what an operator might assume, what the platform actually does, and what to do today.

The notification translator runs a downstream-lineage walk on every WAL event even with zero outbound channels configured. The WAL-driven pipeline does not short-circuit when no senders are wired up: every alert / activity event triggers the recursive-CTE lineage walk that computes the affected downstream entities, even when the resulting AlertNotificationMessage would never be dispatched anywhere. For deployments with notifications.enabled=true but no notifications.receivers.* configured, this is pure database load with no operator benefit.

Mitigation today: if you are not using outbound notifications, set notifications.enabled=false and clean up the logical-replication slot per Disabling notifications. The upstream fix is a short-circuit when zero senders are configured.

Where to next

Last updated