DEV Community

Alex Spinov
Alex Spinov

Posted on

Grafana Has a Free API That Turns Any Data Into Beautiful Dashboards

Grafana is the open-source observability platform that visualizes metrics from Prometheus, PostgreSQL, Elasticsearch, and 100+ data sources. Its API lets you create dashboards, alerts, and data sources programmatically.

What Is Grafana?

Grafana is the industry standard for monitoring dashboards. Used by NASA, eBay, and Bloomberg to visualize everything from server metrics to business KPIs.

The Grafana API

Authentication

export GRAFANA_URL="http://localhost:3000"
export GRAFANA_TOKEN="your-api-key"

# Create API key: Grafana UI > Administration > API Keys
Enter fullscreen mode Exit fullscreen mode

Create a Dashboard

curl -s -X POST "$GRAFANA_URL/api/dashboards/db" \
  -H "Authorization: Bearer $GRAFANA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "dashboard": {
      "title": "Server Metrics",
      "panels": [{
        "title": "CPU Usage",
        "type": "timeseries",
        "targets": [{"expr": "rate(node_cpu_seconds_total{mode=\"user\"}[5m])"}],
        "gridPos": {"h": 8, "w": 12, "x": 0, "y": 0}
      }]
    },
    "overwrite": false
  }'
Enter fullscreen mode Exit fullscreen mode

Add Data Sources

# Add Prometheus
curl -s -X POST "$GRAFANA_URL/api/datasources" \
  -H "Authorization: Bearer $GRAFANA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "Prometheus", "type": "prometheus", "url": "http://prometheus:9090", "access": "proxy"}'

# Add PostgreSQL
curl -s -X POST "$GRAFANA_URL/api/datasources" \
  -H "Authorization: Bearer $GRAFANA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "PostgreSQL", "type": "postgres", "url": "postgres:5432", "database": "mydb", "user": "grafana", "secureJsonData": {"password": "secret"}}'
Enter fullscreen mode Exit fullscreen mode

Create Alerts

curl -s -X POST "$GRAFANA_URL/api/v1/provisioning/alert-rules" \
  -H "Authorization: Bearer $GRAFANA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "High CPU Alert",
    "condition": "A",
    "data": [{"refId": "A", "queryType": "", "model": {"expr": "rate(node_cpu_seconds_total[5m]) > 0.9"}}],
    "for": "5m"
  }'
Enter fullscreen mode Exit fullscreen mode

Query Data

import requests
from datetime import datetime, timedelta

GRAFANA_URL = "http://localhost:3000"
TOKEN = "your-token"

def query_prometheus(expr, hours_back=24):
    end = datetime.now()
    start = end - timedelta(hours=hours_back)
    resp = requests.get(
        f"{GRAFANA_URL}/api/ds/query",
        headers={"Authorization": f"Bearer {TOKEN}"},
        json={
            "queries": [{
                "datasource": {"type": "prometheus"},
                "expr": expr,
                "range": True
            }],
            "from": str(int(start.timestamp() * 1000)),
            "to": str(int(end.timestamp() * 1000))
        }
    )
    return resp.json()

result = query_prometheus('up{job="api-server"}')
print(f"Data points: {len(result['results']['A']['frames'])}")
Enter fullscreen mode Exit fullscreen mode

Grafana Ecosystem

  • Grafana Cloud: Free tier with 10K metrics, 50GB logs, 50GB traces
  • Loki: Log aggregation (like ELK but simpler)
  • Tempo: Distributed tracing
  • Mimir: Long-term metrics storage
  • k6: Load testing

Getting Started

# Docker
docker run -d -p 3000:3000 grafana/grafana

# Open http://localhost:3000 (admin/admin)
Enter fullscreen mode Exit fullscreen mode

Monitoring scraping jobs? Scrapfly provides built-in dashboards for your web scraping. Email spinov001@gmail.com for monitoring + scraping setups.

Top comments (0)