Skip to main content

Channels

kwatch sends alerts through 56 notification providers. The 15 below each have a dedicated configuration page; the rest follow the same shape from the providers reference. Configure one or more under alert: in your config.

Supported Channels

ChannelConfig keyTypeAuth
SlackslackWebhook or Bot TokenURL or xoxb-*
DiscorddiscordWebhookURL
Microsoft TeamsteamsWebhookURL
Google ChatgooglechatWebhookURL
Rocket.ChatrocketchatWebhookURL
MattermostmattermostWebhookURL
TelegramtelegramBot APIToken + Chat ID
EmailemailSMTPPassword
PagerDutypagerdutyEvents APIIntegration Key
OpsgenieopsgenieAPIAPI Key
ZendutyzendutyAPIIntegration Key
MatrixmatrixHomeserver APIUser + Password
DingTalkdingtalkWebhookURL
FeiShufeishuWebhookURL
Custom WebhookwebhookHTTPHeaders / Basic Auth

Common Features

All channels support these advanced delivery features:

📮 Routing

Control which incidents reach which provider:

alert:
slack:
webhook: "..."
routes:
- namespaces: ["production"] # only production namespace
severities: ["high", "critical"] # only high/critical severity
reasons: ["OOMKilled"] # only OOM kills

An incident matches if it matches all conditions in at least one route. If no routes are configured, all incidents are delivered.

🔁 Retry

alert:
slack:
webhook: "..."
retry:
maxAttempts: 5 # max send attempts (default: 3, max: 20)
delay: 5s # delay between attempts (default: 1s base, 30s cap)

Uses exponential backoff: 1s → 2s → 4s → 8s → ... capped at 30s.

🆘 Fallback

If the primary provider fails after all retries, kwatch tries a fallback:

alert:
slack:
webhook: "..."
fallback: pagerduty # must be configured at the top level of alert:
retry:
maxAttempts: 3

🔇 Compact mode

Hide common fields (namespace, node, etc.) to fit more incidents in a single message:

alert:
slack:
webhook: "..."
compact: true

⚡ Threaded mode (Slack only)

When using Slack bot token, alerts become threaded conversations — root message on first alert, updates as replies:

alert:
slack:
token: "xoxb-..."
channel: "#alerts"

Delivery Architecture

Incident → AlertManager → per-provider buffered channel (cap 256)
→ circuit breaker (3 fails → 60s cooldown)
→ retry (exponential backoff)
→ fallback (optional)
→ either: HTTP 200 (delivered)
→ or: dead-letter queue (last 100 failures)

All channels are dispatched non-blocking — a slow or down provider won't delay alerts to other channels.


Format

kwatch formats messages differently per channel type:

FormatChannels
MarkdownSlack, Discord, Mattermost, RocketChat, Teams, GoogleChat
HTMLEmail
Plain TextTelegram, Matrix, DingTalk, FeiShu

You can override the message template per incident reason:

templates:
OOMKilled: "🔴 {{.Incident.Name}} OOM in {{.Incident.Namespace}}"
CrashLoopBackOff: "🔄 {{.Incident.Name}} crashing — {{.Incident.Hint}}"