Skip to content

Alert Channels

The alert channel kind set is closed:

webhook
slack_webhook
discord_webhook
ntfy
email_smtp

Channel lists omit config so read-only channel access never exposes secrets.

Native webhook delivery sends this stable payload shape:

{
"version": 1,
"state": "alerting",
"rule": "High error rate",
"severity": "page",
"instance": { "service": "api" },
"value": "12.3",
"threshold": "5",
"scope": { "project": "demo", "environment": "prod" },
"url": "https://oriel.example.com/...",
"since": "2026-06-16T00:00:00Z"
}

Slack, Discord, ntfy, and email channels render a one-line human summary.

{
"url": "https://example.com/hooks/oriel",
"secret": "optional-bearer-token"
}

When secret is set, Oriel sends:

Authorization: Bearer <secret>
{
"url": "https://hooks.slack.com/services/...",
"secret": ""
}

Oriel posts:

{ "text": "[PAGE] High error rate alerting {service=api} value=12.3 threshold=5" }
{
"url": "https://discord.com/api/webhooks/...",
"secret": ""
}

Oriel posts:

{ "content": "[WARN] Rule alerting value=12.3 threshold=5" }
{
"server": "https://ntfy.sh",
"topic": "oriel-alerts",
"token": "optional-token"
}

server defaults to https://ntfy.sh. Severity controls priority:

Severityntfy priority
pageurgent
warnhigh
infodefault
{
"host": "smtp.example.com",
"port": 587,
"from": "oriel-alerts@example.com",
"to": ["oncall@example.com"],
"username": "oriel-alerts",
"password": "secret"
}

Required fields are host, from, and non-empty to. port defaults to 587. SMTP auth is used when username is set.

The worker delivers with three attempts and exponential backoff starting at one second. Final failure maps to ORL-4001.