Skip to content

Receiver checks

duplicate-receiver

Level: error

Two receivers share the same name. Alertmanager uses the first definition and silently ignores the second, which is almost never intentional.

receivers:
  - name: team-slack
    slack_configs:
      - channel: '#alerts'
  - name: team-slack          # duplicate!
    slack_configs:
      - channel: '#incidents'
receivers:
  - name: team-slack
    slack_configs:
      - channel: '#alerts'
  - name: team-slack-incidents   # unique name
    slack_configs:
      - channel: '#incidents'

empty-receiver

Level: warn (info for the default receiver or one named like null)

A receiver has no integration configured — no slack_configs, pagerduty_configs, webhook_configs, etc. Alerts routed here will be silently dropped.

Using an empty receiver as the default (to blackhole low-priority alerts) is intentional and triggers info instead of warn. So does a receiver named null, blackhole, devnull, dev-null, discard or drop — the conventional names for a deliberate drop (kube-prometheus sends Watchdog and InfoInhibitor to null).

receivers:
  - name: default
    slack_configs: [...]
  - name: pager               # no integrations — alerts dropped!
receivers:
  - name: default
    slack_configs: [...]
  - name: pager
    pagerduty_configs:
      - routing_key: 'your-key'
route:
  receiver: null              # default catch-all blackhole
receivers:
  - name: null                # empty by design — INFO, not WARN

email-no-smarthost

Level: error

An email_configs entry has no smarthost and global.smtp_smarthost is not set. Alertmanager cannot send emails without knowing the SMTP server address.

receivers:
  - name: team
    email_configs:
      - to: 'team@example.com'
        from: 'alertmanager@example.com'
        # missing smarthost!
receivers:
  - name: team
    email_configs:
      - to: 'team@example.com'
        from: 'alertmanager@example.com'
        smarthost: 'smtp.example.com:587'
global:
  smtp_smarthost: 'smtp.example.com:587'
  smtp_from: 'alertmanager@example.com'

receivers:
  - name: team
    email_configs:
      - to: 'team@example.com'

webhook-no-url

Level: error

A webhook_configs entry has no url or url_file. Alertmanager cannot deliver alerts without a target URL — they fail silently.

receivers:
  - name: team
    webhook_configs:
      - send_resolved: true   # missing url!
receivers:
  - name: team
    webhook_configs:
      - url: 'http://my-service/webhook'
        send_resolved: true

pagerduty-no-routing-key

Level: error

A pagerduty_configs entry has no routing_key or routing_key_file. PagerDuty requires an integration key to accept events.

receivers:
  - name: pager
    pagerduty_configs:
      - severity: critical   # missing routing_key!
receivers:
  - name: pager
    pagerduty_configs:
      - routing_key: 'your-pagerduty-integration-key'
        severity: critical

slack-no-api-url

Level: error

A slack_configs entry has no api_url or api_url_file, and global.slack_api_url is not set. Slack requires an incoming webhook URL to receive messages.

receivers:
  - name: team
    slack_configs:
      - channel: '#alerts'   # missing api_url!
receivers:
  - name: team
    slack_configs:
      - api_url: 'https://hooks.slack.com/services/...'
        channel: '#alerts'
global:
  slack_api_url: 'https://hooks.slack.com/services/...'
receivers:
  - name: team
    slack_configs:
      - channel: '#alerts'

opsgenie-no-api-key

Level: error

An opsgenie_configs entry has no api_key or api_key_file, and global.opsgenie_api_key is not set. OpsGenie requires an API key to accept alerts.

receivers:
  - name: team
    opsgenie_configs:
      - priority: P1   # missing api_key!
receivers:
  - name: team
    opsgenie_configs:
      - api_key: 'your-opsgenie-api-key'
        priority: P1
global:
  opsgenie_api_key: 'your-opsgenie-api-key'

msteams-no-webhook-url

Level: error

An msteams_configs entry has no webhook_url or webhook_url_file. MS Teams requires an incoming webhook URL to receive messages.

receivers:
  - name: team
    msteams_configs:
      - title: 'Alert'   # missing webhook_url!
receivers:
  - name: team
    msteams_configs:
      - webhook_url: 'https://outlook.office.com/webhook/...'
        title: 'Alert'

telegram-no-bot-token

Level: error

A telegram_configs entry has no bot_token or bot_token_file. Telegram requires a bot token to authenticate with the Bot API.

receivers:
  - name: team
    telegram_configs:
      - chat_id: -1001234567890   # missing bot_token!
receivers:
  - name: team
    telegram_configs:
      - bot_token: '123456:ABC-DEF...'
        chat_id: -1001234567890

discord-no-webhook-url

Level: error

A discord_configs entry has no webhook_url or webhook_url_file. Discord requires an incoming webhook URL to post messages to a channel.

receivers:
  - name: team
    discord_configs:
      - title: 'Alert'   # missing webhook_url!
receivers:
  - name: team
    discord_configs:
      - webhook_url: 'https://discord.com/api/webhooks/...'
        title: 'Alert'

victorops-no-api-key

Level: error

A victorops_configs entry has no api_key, and global.victorops_api_key is not set. VictorOps requires an API key to accept alerts.

receivers:
  - name: team
    victorops_configs:
      - routing_key: 'team-routing-key'   # missing api_key!
# Option 1 — per receiver:
receivers:
  - name: team
    victorops_configs:
      - api_key: 'your-victorops-api-key'
        routing_key: 'team-routing-key'

# Option 2 — global default:
global:
  victorops_api_key: 'your-victorops-api-key'

wechat-no-corp-id

Level: error

A wechat_configs entry has no corp_id, and global.wechat_api_corp_id is not set. WeChat Work requires a corp_id to identify the enterprise account.

receivers:
  - name: team
    wechat_configs:
      - agent_id: '1000002'   # missing corp_id!
# Option 1 — per receiver:
receivers:
  - name: team
    wechat_configs:
      - corp_id: 'your-corp-id'
        agent_id: '1000002'

# Option 2 — global default:
global:
  wechat_api_corp_id: 'your-corp-id'

sns-no-target

Level: error

An sns_configs entry has none of topic_arn, phone_number, or target_arn set. SNS requires exactly one destination — a topic ARN, a phone number for SMS, or a mobile platform endpoint ARN.

receivers:
  - name: team
    sns_configs:
      - sigv4:
          region: us-east-2
        # missing topic_arn / phone_number / target_arn!
receivers:
  - name: team
    sns_configs:
      - topic_arn: 'arn:aws:sns:us-east-2:123456789012:My-Topic'
        sigv4:
          region: us-east-2
# or use phone_number (SMS) or target_arn (mobile endpoint) instead

template-file-missing

Level: error (warn for globs)

A relative path in templates: matches no file. Alertmanager resolves relative template paths against the config file's directory and starts even when one matches nothing — it just loads no templates from it, so notifications that use them fail to render.

This check only runs when linting a file (not stdin). Absolute paths (e.g. /etc/alertmanager/templates/*.tmpl) point into the Alertmanager host or container rather than wherever amlint runs, so they aren't checked.

templates:
  - templates/custom.tmpl   # no such file next to alertmanager.yml
templates:
  - templates/*.tmpl   # no files match this pattern
templates:
  - templates/custom.tmpl   # file exists in the repo alongside the config
# or use a glob that actually matches:
templates:
  - templates/*.tmpl        # and ensure at least one .tmpl file is present

unused-receiver

Level: info

A receiver is defined but never referenced by any route. It may be leftover from a previous config version.

route:
  receiver: default
receivers:
  - name: default
    slack_configs: [...]
  - name: old-pager           # never used in any route
    pagerduty_configs: [...]
# Remove the unused receiver, or add a route that uses it