Datadog wanted $1,500/month for my setup. I rebuilt my monitoring stack with open-source tools for $0. Here's what I use.

The Datadog bill

I run a small production setup (12 services, ~20 hosts, 50 GB of metrics/day). Datadog's pricing is per-host and per-GB-ingested. With my volume, the bill was:

  • Infrastructure: $0.10/host × 20 = $2/day
  • APM: $31/host/month × 12 = $372/month
  • Logs: $0.10/GB × 50 GB/day × 30 = $150/month
  • Custom metrics: ~$300/month
  • Synthetics: ~$100/month
  • Total: ~$900/month, peaked at $1,500 when I enabled APM

For a side project. Out of the question.

What I replaced it with

Metrics: Prometheus + Grafana

Prometheus scrapes metrics from my services (Node Exporter for hosts, app-specific exporters for apps). Grafana visualizes.

Setup:

  • Single VM with 4 GB RAM
  • Prometheus ~1 GB RAM for 50 GB/day
  • Grafana ~200 MB
  • 30-day retention

For long-term storage I use Thanos with S3 backend. Costs about $5/month in S3 storage.

Logs: Loki + Grafana

Loki is "Prometheus but for logs" — it doesn't index log content, just labels. Way cheaper than Elasticsearch.

Each service ships logs via Promtail (Loki's agent). I store about 20 GB/day of logs. Total disk usage: ~600 GB with 30-day retention.

Setup time: 30 min.

Uptime monitoring: Uptime Kuma

Self-hosted status page. Pings every 5 minutes, alerts via email/Discord/Telegram on failure.

I run it on the same VM as Prometheus. Tiny footprint.

APM: SigNoz (OpenTelemetry-based)

For one service I need distributed tracing. SigNoz is a Datadog APM alternative. It's OpenTelemetry-native, so any OTel-instrumented service works.

Currently I have it tracking my main API. Dashboard shows p50/p95/p99 latencies, request counts, error rates.

Setup time: ~1 hour.

Alerting: Alertmanager + PagerDuty (free for 5 users)

Alertmanager comes for free with Prometheus. I route alerts to Discord (free), email (free), and PagerDuty free tier for things that wake me up.

My setup

 ┌──────────────┐ VMs ────────────▶│ Prometheus │ Containers ────▶│ │──┐ Apps ──────────▶│ │ │ └──────────────┘ │ ▼ ┌──────────────┐ ┌──────────────┐ │ Loki │ │ Grafana │ │ (logs) │─────────────▶│ (dashboards) │ └──────────────┘ └──────────────┘ ▲ │ │ ▼ ┌──────────────┐ ┌──────────────┐ │ Promtail │ │ Alertmanager │ └──────────────┘ └──────────────┘ │ ▼ Discord/Email 

Cost comparison

Datadog My setup
Metrics $300/mo $5/mo (S3)
Logs $150/mo $5/mo (S3)
APM $372/mo $0
Uptime $100/mo $0
Total ~$900/mo ~$10/mo

Plus: data never leaves my servers.

What I gave up

Honestly, a few things:

  • Managed reliability: Datadog's infrastructure is rock solid. Self-hosted Prometheus can fail.
  • Auto-instrumentation: Datadog's agents instrument apps automatically. With SigNoz I have to add OpenTelemetry SDKs.
  • Real-time alerting: Datadog alerts in seconds. My stack alerts in 30-60 seconds.
  • Integrations: Datadog has 600+ integrations. My stack has ~30 (Prometheus exporters).

For a small setup, the trade-off is worth it. For a large team, probably not.

What surprised me

  • Grafana dashboards are easier to build than Datadog's. Once you know PromQL, you can build anything.
  • Loki's "no indexing" approach works surprisingly well for my volume.
  • Self-hosted monitoring is more work than I expected but less than I feared.

Should you self-host monitoring?

Self-host if:

  • You're under $500/month on Datadog currently
  • You have 1+ engineer with Prometheus experience
  • You can tolerate a few hours of setup time per service
  • You care about data ownership

Don't self-host if:

  • You're a large team with APM needs beyond 5 services
  • You need 24/7 on-call alerting with paging
  • You don't have time to learn PromQL/Loki

Tips for getting started

  1. Start with just Prometheus + Grafana. Skip logs and APM initially.
  2. Use kube-prometheus-stack if you're on Kubernetes. Skip if not.
  3. Learn PromQL. It's not SQL. 30 min of tutorials gets you 80%.
  4. Import community dashboards from grafana.com. Don't build from scratch.
  5. Alert on symptoms, not causes. Page on "p99 > 500ms" not "CPU > 90%".

The monitoring stack is now genuinely good enough to replace Datadog for small teams. Try it before paying your maintenance fee.