DEV Community

DevOps VN
DevOps VN

Posted on

1

Replace Opsgenie with this open-source alert router (save $2,280/year)

Tired of paying $199.5/month (10 users) for Opsgenie? Here’s how teams like yours are slashing costs by 90% while gaining full control over alert routing and templates using Versus Incident – an open-source alternative trusted by DevOps teams managing 10k+ servers.

Why Teams Are Switching

Feature Opsgenie Versus Incident
Cost $2,280/year (10 users) Free
Custom Templates Limited Go Templating
Multi-Channel Routing Add-on Fees Built-in
Lock-in Risk High None

In this guide, you’ll learn how to route Prometheus Alertmanager alerts to Slack and Telegram using the Versus Incident, while fully customizing alert messages.

Versus

Step 1: Redirect Alertmanager to Versus (5 Minutes)

Update your alertmanager.yml to bypass Opsgenie’s webhook:

route:
  receiver: 'versus-incident'
  group_wait: 10s  # Faster than Opsgenie's 30s default!

receivers:
- name: 'versus-incident'
  webhook_configs:
  - url: 'http://versus-host:3000/api/incidents' 
    send_resolved: true  # Get resolution notices for free
Enter fullscreen mode Exit fullscreen mode

Step 2: Deploy Versus Incident (With Multi-Channel Fallback)

Create a configuration folder:

mkdir -p ./config
Enter fullscreen mode Exit fullscreen mode

Create a configuration file config/config.yaml:

name: versus
host: 0.0.0.0
port: 3000

alert:
  slack:
    enable: true
    token: ${SLACK_TOKEN}
    channel_id: ${SLACK_CHANNEL_ID}
    template_path: "/app/config/slack_message.tmpl"

  telegram:
    enable: true
    bot_token: ${TELEGRAM_BOT_TOKEN}
    chat_id: ${TELEGRAM_CHAT_ID}
    template_path: "/app/config/telegram_message.tmpl"
Enter fullscreen mode Exit fullscreen mode

docker-compose.ymlAlways-on alerting with Slack + Telegram backup:

version: '3.8'
services:
  versus:
    image: ghcr.io/versuscontrol/versus-incident
    ports:
      - "3000:3000"
    volumes:
      - ./config:/app/config  # Persist templates
    environment:
      SLACK_ENABLE: "true"
      SLACK_TOKEN: "xoxb-..."
      SLACK_CHANNEL_ID: "C123"
      TELEGRAM_ENABLE: "true"  # Failover channel
      TELEGRAM_BOT_TOKEN: "123:ABC"
      TELEGRAM_CHAT_ID: "-456"
Enter fullscreen mode Exit fullscreen mode

Key Advantage: Unlike Opsgenie’s per-channel pricing, Versus lets you blast alerts to unlimited channels for $0.

Step 3: Create Context-Rich Templates

Slack Template (config/slack_message.tmpl):

🔥 {{.commonLabels.severity | upper}} ALERT: {{.commonLabels.alertname}}  
📦 *Cluster*: {{.commonLabels.cluster | default "N/A"}}  
🚨 *Status*: {{.status | title}}  

{{range .alerts}}
⏰ {{.startsAt | formatTime}}  
{{.annotations.description | indent 2}}
{{end}}

{{if .commonLabels.runbook}}📖 <{{.commonLabels.runbook}}|Runbook>{{end}}
Enter fullscreen mode Exit fullscreen mode

Telegram Template (config/telegram_message.tmpl):

🚩 <b>{{.commonLabels.alertname}}</b> ({{.status}})

{{range .alerts}}
🕒 {{.startsAt | formatTime}}
{{.annotations.summary}}
{{end}}

{{if eq .commonLabels.severity "critical"}}🔴 <i>PAGE ON-CALL</i>{{end}}
Enter fullscreen mode Exit fullscreen mode

Step 4: Advanced Routing

Route to different channels based on labels:

# Send database alerts to DBA team
curl -X POST http://versus-host:3000/api/incidents?slack_channel_id=C001DB \
  -H "Content-Type: application/json" \
  -d '{"commonLabels":{"alertname":"PostgresqlDown","team":"dba"}}'

# Send frontend alerts to web-team
curl -X POST http://versus-host:3000/api/incidents?slack_channel_id=C002FE \
  -H "Content-Type: application/json" \
  -d '{"commonLabels":{"alertname":"FrontendLatency","team":"web"}}'
Enter fullscreen mode Exit fullscreen mode

Cost Comparison:

Opsgenie charges $199.5/month (10 users) for basic routing rules – for something Versus does better for free.


Migration Checklist

  1. Redirect Alertmanager webhooks to Versus
  2. Set up multi-channel fallbacks (Slack + Telegram + Email)

Cons

Q: How do we handle on-call schedules?

Versus don't support on-call schedules now, but it's in the roadmap

Top comments (0)