DEV Community

Alex Spinov
Alex Spinov

Posted on

Grafana Has a Free Dashboarding Platform: Visualize Metrics, Logs, and Traces From Any Data Source

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)
Enter fullscreen mode Exit fullscreen mode

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());
});
Enter fullscreen mode Exit fullscreen mode

2. Configure Prometheus

# prometheus.yml
scrape_configs:
  - job_name: "my-api"
    scrape_interval: 15s
    static_configs:
      - targets: ["api:3000"]
Enter fullscreen mode Exit fullscreen mode

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])
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

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)