Your app is running in production. Is it healthy? You check logs with grep. You query the database for metrics. You guess at performance trends. When something breaks at 3 AM, you're blind.
What if you had real-time dashboards showing every metric that matters — request latency, error rates, CPU usage, business KPIs — from any data source?
That's Grafana.
What Grafana Connects To
- Prometheus — metrics (CPU, memory, request counts)
- Loki — logs (structured log aggregation)
- Tempo — traces (distributed tracing)
- PostgreSQL/MySQL — query databases directly
- Elasticsearch — search and analytics
- CloudWatch, Azure Monitor, GCP — cloud provider metrics
- InfluxDB, TimescaleDB — time-series databases
- JSON API — any REST endpoint
50+ official data sources. Mix and match on the same dashboard.
Quick Start
docker run -d -p 3000:3000 grafana/grafana-oss
# Open http://localhost:3000 (admin/admin)
Example: Node.js API Monitoring
1. Export Metrics (Prometheus format)
import express from "express";
import { collectDefaultMetrics, Registry, Histogram, Counter } from "prom-client";
const register = new Registry();
collectDefaultMetrics({ register });
const httpDuration = new Histogram({
name: "http_request_duration_seconds",
help: "Duration of HTTP requests",
labelNames: ["method", "route", "status"],
buckets: [0.01, 0.05, 0.1, 0.5, 1, 5],
registers: [register],
});
const httpErrors = new Counter({
name: "http_errors_total",
help: "Total HTTP errors",
labelNames: ["method", "route", "status"],
registers: [register],
});
// Middleware
app.use((req, res, next) => {
const end = httpDuration.startTimer({ method: req.method, route: req.path });
res.on("finish", () => {
end({ status: res.statusCode });
if (res.statusCode >= 400) {
httpErrors.inc({ method: req.method, route: req.path, status: res.statusCode });
}
});
next();
});
app.get("/metrics", async (req, res) => {
res.set("Content-Type", register.contentType);
res.end(await register.metrics());
});
2. Configure Prometheus
# prometheus.yml
scrape_configs:
- job_name: "my-api"
scrape_interval: 15s
static_configs:
- targets: ["api:3000"]
3. Build Grafana Dashboard
In Grafana, create panels with PromQL:
# Request rate
rate(http_request_duration_seconds_count[5m])
# 95th percentile latency
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
# Error rate
rate(http_errors_total[5m]) / rate(http_request_duration_seconds_count[5m])
Alerting
# Alert when error rate > 5% for 5 minutes
- alert: HighErrorRate
expr: rate(http_errors_total[5m]) / rate(http_request_duration_seconds_count[5m]) > 0.05
for: 5m
labels:
severity: critical
annotations:
summary: "High error rate detected"
Grafana sends alerts to Slack, PagerDuty, email, webhooks.
Grafana vs DataDog vs New Relic
| Feature | Grafana (OSS) | DataDog | New Relic |
|---|---|---|---|
| Cost | Free | $15/host/mo | $0.30/GB |
| Self-hosted | Yes | No | No |
| Data sources | 50+ | DataDog only | New Relic only |
| Dashboards | Unlimited | Unlimited | Limited (free) |
| Alerting | Built-in | Built-in | Built-in |
Choose Grafana for self-hosted, vendor-neutral observability. Choose DataDog/New Relic for managed convenience.
Start here: grafana.com/oss
Need custom data extraction, scraping, or automation? I build tools that collect and process data at scale — 78 actors on Apify Store and 265+ open-source repos. Email me: Spinov001@gmail.com | My Apify Actors
Top comments (0)