AnubisWatchDOCUMENTATION

Search the hall

Search guides, configuration fields and command examples.
↑↓ select · Enter openEsc close
GitHub
Documentation
THE FIELD GUIDE

Alerts & verdicts

Configure dispatch channels, alert conditions and the rules that reach your team.

Project source · da59007Updated 2026-10-17

A Judgment is a check result. A Verdict evaluates your alert conditions and dispatches a message through the channels you configure.

Alert Channels

Root channels Array

FieldTypeDefaultRequiredDescription
namestring-YesChannel name
typestring-YesChannel type
<type>object-YesType-specific config

Supported Channel Types

TypeDescriptionConfig Block
slackSlack webhookslack
discordDiscord webhookdiscord
telegramTelegram bottelegram
emailSMTP emailemail
pagerdutyPagerDutypagerduty
opsgenieAtlassian Opsgenieopsgenie
smsTwilio SMSsms
ntfyNtfy.sh pushntfy
webhookGeneric webhookwebhook

slack Block

FieldTypeDefaultDescription
webhook_urlstring-Slack incoming webhook
channelstring-Override channel
usernamestringAnubisWatchBot username
icon_emojistring:anubis:Bot emoji icon
mention_on_criticalarray-Users/roles to mention

Slack Example

YAML
channels:
  - name: "ops-slack"
    type: slack
    slack:
      webhook_url: "${SLACK_WEBHOOK_URL}"
      channel: "#ops-alerts"
      username: "AnubisWatch"
      icon_emoji: ":anubis:"
      mention_on_critical: ["@oncall-team"]

discord Block

FieldTypeDefaultDescription
webhook_urlstring-Discord webhook URL
usernamestringAnubisWatchBot username
avatar_urlstring-Bot avatar URL

Discord Example

YAML
channels:
  - name: "dev-discord"
    type: discord
    discord:
      webhook_url: "${DISCORD_WEBHOOK_URL}"
      username: "AnubisWatch"

email Block

FieldTypeDefaultDescription
smtp_hoststring-SMTP server
smtp_portinteger587SMTP port
starttlsbooleantrueUse STARTTLS
usernamestring-SMTP username
passwordstring-SMTP password
fromstring-From address
toarray-Recipients
subject_templatestring-Go template for subject

Email Example

YAML
channels:
  - name: "ops-email"
    type: email
    email:
      smtp_host: "smtp.example.com"
      smtp_port: 587
      starttls: true
      username: "${SMTP_USER}"
      password: "${SMTP_PASS}"
      from: "anubis@example.com"
      to:
        - "ops@example.com"
        - "cto@example.com"
      subject_template: "[{{ .Severity }}] {{ .Soul.Name }} — {{ .Judgment.Status }}"

pagerduty Block

FieldTypeDefaultDescription
integration_keystring-PagerDuty integration key
severity_mapobject-Custom severity mapping
auto_resolvebooleantrueAuto-resolve on recovery

PagerDuty Example

YAML
channels:
  - name: "pagerduty-oncall"
    type: pagerduty
    pagerduty:
      integration_key: "${PAGERDUTY_INTEGRATION_KEY}"
      severity_map:
        critical: "critical"
        warning: "warning"
        info: "info"
      auto_resolve: true

ntfy Block

FieldTypeDefaultDescription
serverstringhttps://ntfy.shNtfy server URL
topicstring-Topic name
priority_mapobject-Priority mapping

Ntfy Example

YAML
channels:
  - name: "ntfy-push"
    type: ntfy
    ntfy:
      server: "https://ntfy.sh"
      topic: "anubis-alerts"
      priority_map:
        critical: "urgent"
        warning: "high"
        info: "default"

webhook Block

FieldTypeDefaultDescription
urlstring-Webhook URL
methodstringPOSTHTTP method
headersobject-Custom headers
body_templatestring-Go template for body
timeoutduration10sRequest timeout

Generic Webhook Example

YAML
channels:
  - name: "custom-webhook"
    type: webhook
    webhook:
      url: "https://hooks.example.com/alerts"
      method: POST
      headers:
        Authorization: "Bearer ${WEBHOOK_TOKEN}"
        Content-Type: "application/json"
      body_template: |
        {
          "severity": "{{ .Severity }}",
          "soul": "{{ .Soul.Name }}",
          "status": "{{ .Judgment.Status }}",
          "timestamp": "{{ .Judgment.Timestamp }}"
        }

Alert Rules (Verdicts)

Root verdicts Block

FieldTypeDefaultRequiredDescription
rulesarray-NoAlert rules list
escalationarray-NoEscalation policies

verdicts.rules[] Block

FieldTypeDefaultRequiredDescription
namestring-YesRule name
scopestring"all"NoTarget scope
conditionobject-YesTrigger condition
severitystring"warning"NoAlert severity
channelsarray-NoChannels to notify
cooldownduration5mNoMin time between alerts

Scope Formats

FormatDescription
allAll souls
tag:<tag>Souls with specific tag
type:<type>Souls of specific type
soul:<name>Specific soul by name
region:<region>Souls in specific region

Condition Types

consecutive_failures

FieldTypeDefaultDescription
typestring-consecutive_failures
thresholdinteger-Number of failures
YAML
condition:
  type: consecutive_failures
  threshold: 3

threshold

FieldTypeDefaultDescription
typestring-threshold
metricstring-Metric name
operatorstring->, <, >=, <=, ==
valuestring-Threshold value
windowduration-Evaluation window
YAML
condition:
  type: threshold
  metric: latency_p95
  operator: ">"
  value: "500ms"
  window: 5m

percentage

FieldTypeDefaultDescription
typestring-percentage
metricstring-Metric name
operatorstring-Comparison operator
thresholdinteger-Percentage threshold
windowduration-Evaluation window
YAML
condition:
  type: percentage
  metric: failure_rate
  operator: ">"
  threshold: 10
  window: 5m

Available Metrics

MetricDescription
latency_p5050th percentile latency
latency_p9595th percentile latency
latency_p9999th percentile latency
latency_maxMaximum latency
failure_rateFailure percentage
uptime_percentUptime percentage
tls_days_until_expiryDays until cert expiry
propagation_percentDNS propagation %
packet_loss_percentICMP packet loss %

Example Rules

YAML
verdicts:
  rules:
    - name: "Service Down - Critical"
      scope: "all"
      condition:
        type: consecutive_failures
        threshold: 3
      severity: critical
      channels: ["ops-slack", "pagerduty-oncall"]
      cooldown: 5m

    - name: "High Latency"
      scope: "tag:production"
      condition:
        type: threshold
        metric: latency_p95
        operator: ">"
        value: "1s"
        window: 5m
      severity: warning
      channels: ["ops-slack"]
      cooldown: 15m

    - name: "Certificate Expiring Soon"
      scope: "tag:security"
      condition:
        type: threshold
        metric: tls_days_until_expiry
        operator: "<"
        value: 14
      severity: warning
      channels: ["ops-email"]
      cooldown: 24h

Escalation Policies

YAML
verdicts:
  escalation:
    - name: "production-escalation"
      stages:
        - wait: 0s
          channels: ["ops-slack", "ntfy-push"]
        - wait: 5m
          channels: ["pagerduty-oncall"]
          condition: "not_acknowledged"
        - wait: 15m
          channels: ["ops-email", "sms-oncall"]
          condition: "not_resolved"

Adapted from the AnubisWatch project. Examples use placeholder services and credentials.View project source Suggest a correction

AnubisWatch is built and maintained by

oxognet.

A small studio in Estonia building AI agents, developer tools and the infrastructure behind them.

Made in Estonia. Shipped worldwide.