# Monad Alerts
Receives alert events fired from your configured Monad alert rules, enabling you to load them into any destination — SIEMs, ticketing systems, Slack, PagerDuty, or custom webhooks.
## Overview
Every alert that fires — or resolves — from your configured alert rules is received by this input as a record in your pipeline. You can:
- **Route by severity** — send `critical` alerts to PagerDuty and `low` alerts to a log archive.
- **Route by alert type** — send pipeline health alerts to your oncall monitoring system and billing alerts to your finance team's Slack channel.
- **Audit** — store all fired alerts in long-term storage for compliance purposes.
## Requirements
- You must have an active Monad organization.
- At least one alert rule must be configured in your organization. See [Alerts](/docs/components/alerts) for available alert types and how to configure them.
## Configuration
This input requires no configuration — it is automatically scoped to your organization and requires no credentials.
## Record Structure
Each record emitted by this input is a JSON object representing a fired or resolved alert. The top-level fields are consistent across all alert types; the `metadata` field contains alert-type-specific detail.
### Top-Level Fields
| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Unique identifier for this alert event |
| `name` | string | Human-readable name from the alert rule |
| `organization_id` | string | ID of the Monad organization that owns this alert |
| `rule_id` | string | ID of the alert rule that triggered this event |
| `rule_type` | string | Alert type identifier (e.g. `error-rate-alert`, `threshold-alert`) |
| `severity` | string | Severity level: `critical`, `high`, `medium`, `low`, or `info` |
| `description` | string | Human-readable description of what triggered the alert |
| `metadata` | object | Alert-type-specific fields — structure varies by `rule_type` |
| `resource` | object | The resource (pipeline, node, or org) that triggered the alert |
| `created_at` | integer | Unix timestamp (seconds) when the alert was created |
| `status` | object | Lifecycle state of the alert |
### `resource` Object
| Field | Type | Description |
|-------|------|-------------|
| `resource_type` | string | Type of resource: `pipeline`, `node`, or `organization` |
| `resource_id` | string | ID of the resource |
| `parent_type` | string | (optional) Parent resource type, e.g. `pipeline` if resource is a node |
| `parent_id` | string | (optional) ID of the parent resource |
### `status` Object
| Field | Type | Description |
|-------|------|-------------|
| `state` | string | `FIRING` or `RESOLVED` |
| `resolved_at` | integer | Unix timestamp when the alert resolved (only present on resolved alerts) |
| `clearing_started_at` | integer | Unix timestamp when the clearing process began |
For the fields each alert type populates in `metadata`, see the [Alerts](/docs/components/alerts) documentation.
## Sample Record
The example below shows a `threshold-alert` firing when egress bytes drop below an expected minimum, indicating a stalled pipeline.
```json
{
"id": "a1b2c3d4-0000-0000-0000-000000000001",
"name": "Egress Stall — SIEM Export",
"organization_id": "fd347096-5f84-4e9c-9ca8-633d22757e38",
"rule_id": "5da557a4-0093-486c-9987-1a7121eaaab9",
"rule_type": "threshold-alert",
"severity": "high",
"description": "Pipeline pipe-siem less than threshold of 1000000 for metric 'egress_bytes' (current value: 0.00)",
"resource": {
"resource_type": "pipeline",
"resource_id": "543b3cca-d553-40c1-8bea-5f77e93e6f61"
},
"metadata": {
"pipeline_id": "pipe-siem",
"value": 0,
"threshold": 1000000,
"operator": "less_than",
"metric_name": "egress_bytes",
"time_window": "5m"
},
"created_at": 1743389400,
"status": {
"state": "FIRING"
}
}
```
When the condition clears, the same record is re-published with `status.state` set to `RESOLVED` and the resolution timestamps populated:
```json
{
"id": "a1b2c3d4-0000-0000-0000-000000000002",
"name": "Egress Stall — SIEM Export",
"organization_id": "fd347096-5f84-4e9c-9ca8-633d22757e38",
"rule_id": "5da557a4-0093-486c-9987-1a7121eaaab9",
"rule_type": "threshold-alert",
"severity": "high",
"description": "Pipeline pipe-siem less than threshold of 1000000 for metric 'egress_bytes' (current value: 0.00)",
"resource": {
"resource_type": "pipeline",
"resource_id": "543b3cca-d553-40c1-8bea-5f77e93e6f61"
},
"metadata": {
"pipeline_id": "pipe-siem",
"value": 0,
"threshold": 1000000,
"operator": "less_than",
"metric_name": "egress_bytes",
"time_window": "5m"
},
"created_at": 1743389400,
"status": {
"state": "RESOLVED",
"resolved_at": 1743391200,
"clearing_started_at": 1743390900
}
}
```
## Routing Alerts to Different Destinations
To send different alerts to different destinations, create multiple outgoing edges from the Monad Alerts input node, each with its own conditions. See [Data Routing](/docs/components/routing) for a full explanation of how edges and conditions work.
### Route by Severity
Create two edges — one for high-priority destinations and one for archival:
**Edge to PagerDuty** — matches critical and high severity:
```json
{
"operator": "or",
"conditions": [
{ "type_id": "equals", "config": { "key": "severity", "value": "critical" } },
{ "type_id": "equals", "config": { "key": "severity", "value": "high" } }
]
}
```
**Edge to log archive** — matches everything else:
```json
{
"operator": "or",
"conditions": [
{ "type_id": "equals", "config": { "key": "severity", "value": "medium" } },
{ "type_id": "equals", "config": { "key": "severity", "value": "low" } },
{ "type_id": "equals", "config": { "key": "severity", "value": "info" } }
]
}
```
### Route by Alert Type
Send operational alerts to your ops team and billing alerts to finance:
**Edge to ops Slack:**
```json
{
"operator": "or",
"conditions": [
{ "type_id": "equals", "config": { "key": "rule_type", "value": "error-rate-alert" } },
{ "type_id": "equals", "config": { "key": "rule_type", "value": "threshold-alert" } },
{ "type_id": "equals", "config": { "key": "rule_type", "value": "pipeline-status-alert" } },
{ "type_id": "equals", "config": { "key": "rule_type", "value": "volume-anomaly-alert" } }
]
}
```
**Edge to finance Slack:**
```json
{
"operator": "and",
"conditions": [
{ "type_id": "equals", "config": { "key": "rule_type", "value": "billing-metrics-cost-budget" } }
]
}
```
### Filter to a Specific Pipeline
Only forward alerts that concern a specific pipeline:
```json
{
"operator": "and",
"conditions": [
{ "type_id": "equals", "config": { "key": "resource.resource_id", "value": "pipe-xyz" } }
]
}
```
### Only Process FIRING Alerts
Skip resolved events when your destination handles state tracking itself:
```json
{
"operator": "and",
"conditions": [
{ "type_id": "equals", "config": { "key": "status.state", "value": "FIRING" } }
]
}
```
### Combine Multiple Conditions
Route only firing high-severity alerts to your on-call system by nesting conditions:
```json
{
"operator": "and",
"conditions": [
{
"operator": "or",
"conditions": [
{ "type_id": "equals", "config": { "key": "severity", "value": "critical" } },
{ "type_id": "equals", "config": { "key": "severity", "value": "high" } }
]
},
{ "type_id": "equals", "config": { "key": "status.state", "value": "FIRING" } }
]
}
```
## Deduplication Behavior
Once an alert fires for a given rule and resource, it will not re-fire for that same combination for at least one hour. When the underlying condition clears, a `RESOLVED` event is published. Your downstream systems will not receive repeated alerts for the same ongoing issue.
If your destination uses its own deduplication key (e.g. PagerDuty's `dedup_key`), use `.rule_id + "-" + .resource.resource_id` to align with Monad's deduplication behavior.
## Related Documentation
- [Alerts](/docs/components/alerts) — Available alert types, configuration options, and the metadata fields each one populates
- [Data Routing](/docs/components/routing) — How to configure edges and conditions to route records between nodes
- [Conditionals Reference](/docs/components/conditionals) — Full reference for all condition types available in edge routing