Notification channels¶
A channel is the output config for alerts: where the notification goes, in what format, to whom.
Channel types¶
| Type | Recipient | Format |
|---|---|---|
| Email addresses or user selection | HTML + text | |
| Mobile push | Mobile app users (tenant or user-targeted) | FCM notification + deep link |
| Webhook | Any HTTP URL | JSON payload |
| Slack | Slack channel | Structured Slack message |
| Teams | Microsoft Teams channel | Adaptive Card |
/notification-channels is the management page.
Common fields per channel¶
| Field | Meaning |
|---|---|
| Name | free-form, used in alert rules |
| Tenant | super admin: global or tenant-specific |
| Severity filter | only WARN and above? only CRIT? |
| Recovery notifications | also send on recovery? |
| Throttle | min seconds between two notifications (storm protection) |
Email¶
Configuration¶
| Field | Meaning |
|---|---|
| Recipients | list — fixed or variable like ${tenant_admins} |
| Reply-To | optional |
| Template | HTML template choice (default or custom) |
Prerequisite: SMTP configured (setup wizard or Admin → SMTP).
Templates¶
Default template is German + English (language per user pref). Custom Jinja2 templates:
{# Variables: alert.host, alert.service, alert.status, alert.message #}
<h1>{{ alert.host.name }} — {{ alert.service.display_name }}</h1>
<p>Status: <b>{{ alert.status }}</b></p>
<p>{{ alert.message }}</p>
<p><a href="{{ alert.host_url }}">Open host</a></p>
Mobile push¶
Configuration¶
| Field | Meaning |
|---|---|
| Targeting | „all tenant users" or specific users |
| Deep link | default „jump to host detail" |
Prerequisite: Firebase configured (shared FCM or own project). See Mobile app → Push.
User targeting¶
For „specific users" multi-select from tenant members. Only users with a registered mobile device are selectable.
Since v0.17.4
Tenant filter bug on push test fixed.
Webhook¶
Configuration¶
| Field | Meaning |
|---|---|
| URL | recipient HTTPS URL |
| Method | POST (default), PUT |
| Headers | custom headers (e.g. Authorization) |
| Auth type | None, Basic, Bearer |
| Payload template | JSON template, default is Vesana-native |
Default payload¶
{
"version": 1,
"alert_id": "uuid",
"rule_name": "Disk Full Critical",
"status": "CRITICAL",
"host": {
"id": "uuid",
"name": "web01",
"tenant": "Acme GmbH",
"url": "https://vesana.example/hosts/uuid"
},
"service": {
"id": "uuid",
"display_name": "Disk /var",
"check_type": "agent_disk",
"value": 96.4,
"message": "CRITICAL - /var at 96%"
},
"trigger_at": "2026-04-25T10:15:30Z",
"is_recovery": false
}
Security¶
- Optional HMAC signature:
X-Vesana-Signature: sha256=... - Receiver should re-sign body and compare
- Secret per channel configurable
Slack¶
Configuration¶
- Create Slack app: api.slack.com → New App → From Scratch
- Activate Incoming Webhooks, webhook URL into target channel
- URL into Vesana channel
Format: structured Slack message with severity color (red/yellow/green), buttons „Ack" and „Open host".
Teams¶
Configuration¶
- In Microsoft Teams: Channel → … → Connectors → Incoming Webhook
- Copy URL
- Into Vesana channel
Format: Adaptive Card with severity, host, service, buttons.
Throttle and rate limit¶
Min interval between two notifications can be set per channel. Default: 0 s (no throttle). Useful for mobile push to prevent spam.
Test¶
Per channel Send test notification:
- Generates a fake alert payload
- Sends to channel
- UI shows success/error code with details
Multiple channels in a rule¶
Alert rules can use multiple channels in parallel — e.g. email + push for stage 1, webhook + Slack for stage 2 (escalation).
Each channel filters by severity again — if the channel is CRIT only, WARN alerts of the rule won't pass.
User preferences¶
Recipient users can mute individual channels (mobile push especially). Settings → Notifications → channel → pause.
The pause overrides rule and channel config.
Audit¶
Channel changes are in the audit log — filter target_kind = notification_channel.
Next¶
- Alert rules
- Mobile app — push setup
- Webhooks — payload + HMAC details