Komiser is an open-source cloud-agnostic cost intelligence platform. It connects to your AWS, GCP, Azure, OCI, and DigitalOcean accounts, inventories every resource, tracks spending trends, and surfaces cost anomalies before they hit your invoice. If Komiser itself goes down, your engineers lose cloud cost visibility at exactly the moment they need it most — during incident investigations, budget reviews, and architecture decisions.
This tutorial shows you how to add external uptime monitoring to Komiser so you know the moment your cost dashboard becomes unavailable.
What Is Komiser?
Komiser runs as a single Go binary (or Docker container) that:
- Polls cloud provider APIs on a configurable schedule to build a real-time resource inventory
- Stores resource and cost data in PostgreSQL or SQLite
- Serves a web dashboard on a configurable HTTP port (default
3000) - Exposes cloud spending grouped by service, region, tag, and account
- Sends Slack or custom webhook alerts when spending anomalies are detected
Because Komiser is self-hosted, its availability is entirely your responsibility. Cloud providers don't know if your Komiser instance is running. Your team only discovers the dashboard is down when someone tries to open it.
Why Monitoring Komiser Matters
Budget review interruptions — monthly cost reviews and architecture discussions depend on the dashboard being up. A silent Komiser outage means decisions get made without data.
Anomaly detection gaps — Komiser scans for cost anomalies on a schedule. If the process crashes between scans, anomalies accumulate silently until the next restart. A heartbeat monitor catches this gap.
Database connection failures — Komiser talks to PostgreSQL continuously. A dropped database connection causes the dashboard to return errors while the process appears running. External monitoring catches the user-facing failure that internal health checks miss.
Docker / Kubernetes restart loops — Komiser running in a container can enter a crash-restart loop that looks healthy in kubectl get pods or docker ps but serves partial or stale responses. Probing the actual HTTP endpoint reveals this.
What You'll Set Up
- HTTP monitor for the Komiser dashboard endpoint
- Heartbeat monitor to verify scheduled cost scans complete
- Response time alerting for database query slowdowns
- Alert routing to Slack
You'll need a free Vigilmon account — no credit card required.
Step 1: Configure a Health Endpoint
Komiser v3+ exposes a /health endpoint at the same port as the dashboard. Verify it's accessible:
curl http://your-komiser-host:3000/health
# Expected response: {"status":"healthy"}
If you run Komiser behind a reverse proxy (Nginx, Caddy, Traefik), make sure /health is forwarded without authentication so Vigilmon can probe it.
Nginx Pass-Through for /health
server {
listen 443 ssl;
server_name komiser.yourdomain.com;
# Health endpoint — no auth required for monitoring
location /health {
proxy_pass http://localhost:3000/health;
proxy_set_header Host $host;
}
# Dashboard — behind auth
location / {
auth_basic "Komiser";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
}
}
Step 2: Add an HTTP Monitor for the Komiser Dashboard
- Log in to vigilmon.online and go to Monitors → New Monitor
- Choose HTTP / HTTPS
- Set the URL:
https://komiser.yourdomain.com/health - Set check interval: 2 minutes
- Configure expected response:
- Status code:
200 - Response body contains:
"status":"healthy" - Response time threshold:
3000ms
- Status code:
- Save the monitor
Komiser queries cloud provider APIs on demand when you open certain dashboard views. A 3-second response time threshold catches database slowdowns before they make the dashboard unusable.
Step 3: Heartbeat Monitor for Scheduled Cost Scans
Komiser polls cloud providers on a schedule to refresh its resource inventory. Run a wrapper script that verifies the scan completed and pings Vigilmon:
#!/bin/bash
# komiser-scan-heartbeat.sh
set -e
KOMISER_URL="${KOMISER_URL:-http://localhost:3000}"
HEARTBEAT_URL="${VIGILMON_HEARTBEAT_URL}"
MAX_AGE_SECONDS=7200 # alert if resource data is older than 2 hours
# Check the last scan timestamp via Komiser API
LAST_SCAN=$(curl -sf "$KOMISER_URL/api/v1/resources/scan/status" | \
jq -r '.lastScanAt // empty')
if [ -z "$LAST_SCAN" ]; then
echo "ERROR: Could not retrieve last scan timestamp"
exit 1
fi
# Convert to epoch and check age
SCAN_EPOCH=$(date -d "$LAST_SCAN" +%s 2>/dev/null || \
python3 -c "import datetime; print(int(datetime.datetime.fromisoformat('$LAST_SCAN'.replace('Z','+00:00')).timestamp()))")
NOW_EPOCH=$(date +%s)
AGE=$((NOW_EPOCH - SCAN_EPOCH))
if [ "$AGE" -gt "$MAX_AGE_SECONDS" ]; then
echo "ERROR: Last scan was $((AGE/60)) minutes ago — exceeds $((MAX_AGE_SECONDS/60)) minute threshold"
exit 1
fi
echo "Komiser scan current: last ran $((AGE/60)) minutes ago"
curl -fsS "$HEARTBEAT_URL" > /dev/null
echo "Heartbeat sent."
Run as a cron job on the same host as Komiser:
# Add to crontab
*/30 * * * * /opt/komiser/komiser-scan-heartbeat.sh >> /var/log/komiser-heartbeat.log 2>&1
Set up the heartbeat in Vigilmon:
- Go to Monitors → New Monitor → Heartbeat
- Name it
Komiser cost scan - Expected interval: 30 minutes
- Grace period: 20 minutes
- Copy the ping URL and set it as the
VIGILMON_HEARTBEAT_URLenvironment variable
Step 4: Monitor Komiser in Docker or Kubernetes
Docker Health Check
If you run Komiser via Docker Compose, add a native health check that Vigilmon can also probe:
# docker-compose.yml
services:
komiser:
image: ghcr.io/tailwarden/komiser:latest
ports:
- "3000:3000"
environment:
- DATABASE_URI=postgresql://komiser:secret@db:5432/komiser
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
volumes:
- ./config.toml:/root/.komiser/config.toml
Kubernetes Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: komiser
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
app: komiser
template:
metadata:
labels:
app: komiser
spec:
containers:
- name: komiser
image: ghcr.io/tailwarden/komiser:latest
ports:
- containerPort: 3000
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 30
periodSeconds: 30
readinessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 10
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: komiser
namespace: monitoring
spec:
selector:
app: komiser
ports:
- port: 3000
targetPort: 3000
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: komiser
namespace: monitoring
spec:
rules:
- host: komiser.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: komiser
port:
number: 3000
Kubernetes readiness probes keep Komiser out of service rotation when it's unhealthy. Vigilmon monitors the external Ingress URL — catching the failure modes that internal probes miss (Ingress misconfiguration, DNS failure, TLS expiry).
Step 5: Configure Alert Channels
- Go to Alert Channels → New Channel → Webhook in Vigilmon
- Add your Slack Incoming Webhook URL for
#cloud-cost-alerts - Assign all Komiser monitors to this channel
Sample alert when Komiser dashboard goes down:
{
"monitor_name": "Komiser Dashboard /health",
"status": "down",
"url": "https://komiser.yourdomain.com/health",
"started_at": "2026-07-12T14:30:00Z",
"duration_seconds": 0,
"regions_failing": ["eu-west", "us-east"]
}
Recommended Alert Thresholds
| Monitor | Interval | Threshold | Alert channel |
|---|---|---|---|
| Komiser dashboard /health | 2 min | 200, "status":"healthy", < 3s | #cloud-cost-alerts |
| Cost scan heartbeat | 30 min | Grace 20 min | #cloud-cost-alerts |
| Database query latency | 2 min | Response > 5s | #infrastructure-alerts |
Summary
Komiser gives you cloud cost visibility — but only when it's running. External monitoring ensures that visibility is itself reliable:
| Failure | Impact | Vigilmon monitor |
|---|---|---|
| Process crash | Dashboard unavailable | HTTP /health monitor |
| Database connection drop | Silent errors on page load | HTTP response + body check |
| Scan schedule stall | Stale resource data | Heartbeat monitor |
| Ingress misconfiguration | Dashboard unreachable externally | External HTTP monitor |
Start free at vigilmon.online and have Komiser monitored in under two minutes.