
Grafana Dashboard
- 451 installs
- 305 repo stars
- Updated March 4, 2026
- aj-geddes/useful-ai-prompts
grafana-dashboard is an agent skill that designs Grafana panels, queries, and alerts to observe service health, latency, errors, and business metrics in production for developers who need actionable observability dashboa
About
grafana-dashboard is an agent skill from aj-geddes/useful-ai-prompts that helps developers design production Grafana dashboards for service observability. The skill guides panel layout, metric queries, visualization choices, and alert thresholds for health signals like latency, error rates, saturation, and business KPIs. Agents use it when a running service lacks clear operational visibility or when on-call engineers need faster incident triage through structured dashboards. Developers reach for grafana-dashboard when Prometheus, Loki, or other datasource-backed monitoring must translate raw metrics into SLO-friendly views and paging rules. The workflow produces dashboard JSON definitions, query snippets, and alert configurations ready to import or refine in Grafana.
- Panel design for SLOs and golden signals
- Prometheus or Loki query authoring
- Variable-driven reusable dashboards
- Alert rule definition and thresholds
- Runbook-linked annotations and drill-downs
Grafana Dashboard by the numbers
- 451 all-time installs (skills.sh)
- Ranked #273 of 1,435 DevOps & CI/CD skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/aj-geddes/useful-ai-prompts --skill grafana-dashboardAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 451 |
|---|---|
| repo stars | ★ 305 |
| Last updated | March 4, 2026 |
| Repository | aj-geddes/useful-ai-prompts ↗ |
How do you design Grafana dashboards for production?
Design Grafana panels, queries, and alerts to observe service health, latency, errors, and business metrics in production environments.
Who is it for?
Backend and platform engineers who need production Grafana dashboards for service health, latency, errors, and business metrics.
Skip if: Teams without Grafana or metrics backends who only need local debug logging instead of production observability.
When should I use this skill?
A developer asks to create Grafana dashboards, panels, queries, or alerts for production service monitoring.
What you get
Grafana dashboard definitions, panel query snippets, and alert rule configurations
- Grafana dashboard JSON
- Alert rule definitions
Files
Grafana Dashboard
Table of Contents
Overview
Design and implement comprehensive Grafana dashboards with multiple visualization types, variables, and drill-down capabilities for operational monitoring.
When to Use
- Creating monitoring dashboards
- Building operational insights
- Visualizing time-series data
- Creating drill-down dashboards
- Sharing metrics with stakeholders
Quick Start
Minimal working example:
{
"dashboard": {
"title": "Application Performance",
"description": "Real-time application metrics",
"tags": ["production", "performance"],
"timezone": "UTC",
"refresh": "30s",
"templating": {
"list": [
{
"name": "datasource",
"type": "datasource",
"datasource": "prometheus"
},
{
"name": "service",
"type": "query",
"datasource": "prometheus",
"query": "label_values(requests_total, service)"
}
]
},
"panels": [
{
"id": 1,
// ... (see reference guides for full implementation)Reference Guides
Detailed implementations in the references/ directory:
| Guide | Contents |
|---|---|
| Grafana Dashboard JSON | Grafana Dashboard JSON |
| Grafana Provisioning Configuration | Grafana Provisioning Configuration |
| Grafana Alert Configuration | Grafana Alert Configuration |
| Grafana API Client | Grafana API Client |
| Docker Compose Setup | Docker Compose Setup |
Best Practices
✅ DO
- Use meaningful dashboard titles
- Add documentation panels
- Implement row-based organization
- Use variables for flexibility
- Set appropriate refresh intervals
- Include runbook links in alerts
- Test alerts before deploying
- Use consistent color schemes
- Version control dashboard JSON
❌ DON'T
- Overload dashboards with too many panels
- Mix different time ranges without justification
- Create without runbooks
- Ignore alert noise
- Use inconsistent metric naming
- Set refresh too frequently
- Forget to configure datasources
- Leave default passwords
Docker Compose Setup
Docker Compose Setup
version: "3.8"
services:
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD:-admin}
GF_USERS_ALLOW_SIGN_UP: "false"
GF_SERVER_ROOT_URL: http://grafana.example.com
volumes:
- ./provisioning:/etc/grafana/provisioning
- grafana_storage:/var/lib/grafana
depends_on:
- prometheus
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_storage:/prometheus
volumes:
grafana_storage:
prometheus_storage:Grafana Alert Configuration
Grafana Alert Configuration
# /etc/grafana/provisioning/alerting/alerts.yaml
groups:
- name: application_alerts
interval: 1m
rules:
- uid: alert_high_error_rate
title: High Error Rate
condition: B
data:
- refId: A
model:
expr: 'sum(rate(requests_total{status_code=~"5.."}[5m]))'
- refId: B
conditions:
- evaluator:
params: [0.05]
type: gt
query:
params: [A, 5m, now]
for: 5m
annotations:
description: "Error rate is {{ $values.A }}"
labels:
severity: critical
team: platformGrafana API Client
Grafana API Client
// grafana-api-client.js
const axios = require("axios");
class GrafanaClient {
constructor(baseUrl, apiKey) {
this.baseUrl = baseUrl;
this.client = axios.create({
baseURL: baseUrl,
headers: {
Authorization: `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
});
}
async createDashboard(dashboard) {
const response = await this.client.post("/api/dashboards/db", {
dashboard: dashboard,
overwrite: true,
});
return response.data;
}
async getDashboard(uid) {
const response = await this.client.get(`/api/dashboards/uid/${uid}`);
return response.data;
}
async createAlert(alert) {
const response = await this.client.post("/api/alerts", alert);
return response.data;
}
async listDashboards() {
const response = await this.client.get("/api/search?query=");
return response.data;
}
}
module.exports = GrafanaClient;Grafana Dashboard JSON
Grafana Dashboard JSON
{
"dashboard": {
"title": "Application Performance",
"description": "Real-time application metrics",
"tags": ["production", "performance"],
"timezone": "UTC",
"refresh": "30s",
"templating": {
"list": [
{
"name": "datasource",
"type": "datasource",
"datasource": "prometheus"
},
{
"name": "service",
"type": "query",
"datasource": "prometheus",
"query": "label_values(requests_total, service)"
}
]
},
"panels": [
{
"id": 1,
"title": "Request Rate",
"type": "graph",
"gridPos": { "x": 0, "y": 0, "w": 12, "h": 8 },
"targets": [
{
"expr": "sum(rate(requests_total{service=\"$service\"}[5m]))",
"legendFormat": "{{ method }}"
}
],
"yaxes": [
{
"format": "rps",
"label": "Requests per Second"
}
]
},
{
"id": 2,
"title": "Error Rate",
"type": "graph",
"gridPos": { "x": 12, "y": 0, "w": 12, "h": 8 },
"targets": [
{
"expr": "sum(rate(requests_total{status_code=~\"5..\",service=\"$service\"}[5m])) / sum(rate(requests_total{service=\"$service\"}[5m]))",
"legendFormat": "Error Rate"
}
]
},
{
"id": 3,
"title": "Response Latency (p95)",
"type": "graph",
"gridPos": { "x": 0, "y": 8, "w": 12, "h": 8 },
"targets": [
{
"expr": "histogram_quantile(0.95, rate(request_duration_seconds_bucket{service=\"$service\"}[5m]))",
"legendFormat": "p95"
}
]
},
{
"id": 4,
"title": "Active Connections",
"type": "stat",
"gridPos": { "x": 12, "y": 8, "w": 12, "h": 8 },
"targets": [
{
"expr": "sum(active_connections{service=\"$service\"})"
}
]
}
]
}
}Grafana Provisioning Configuration
Grafana Provisioning Configuration
# /etc/grafana/provisioning/dashboards/dashboards.yaml
apiVersion: 1
providers:
- name: "Dashboards"
orgId: 1
folder: "Production"
type: file
disableDeletion: false
updateIntervalSeconds: 10
options:
path: /var/lib/grafana/dashboards# /etc/grafana/provisioning/datasources/prometheus.yaml
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
orgId: 1
url: http://prometheus:9090
isDefault: true
editable: true
jsonData:
timeInterval: "30s"#!/bin/bash
# health-check.sh - Check service health
# Usage: ./health-check.sh <service_url>
set -euo pipefail
SERVICE_URL="${{1:?Usage: $0 <service_url>}}"
echo "Checking health: $SERVICE_URL"
# TODO: Implement health checks
# - HTTP endpoint check
# - Response time validation
# - Dependency health
# - Resource utilization
# - Error rate check
echo "Health check complete."
# Monitoring Dashboard Configuration
# TODO: Customize for your monitoring platform (Grafana, Datadog, etc.)
dashboard:
title: "Service Dashboard"
refresh: 30s
panels:
- title: "Request Rate"
type: graph
# TODO: Add metric query
- title: "Error Rate"
type: graph
# TODO: Add metric query
- title: "Latency (p50/p95/p99)"
type: graph
# TODO: Add metric query
alerts:
- name: "High Error Rate"
# TODO: Configure alert thresholds
Related skills
How it compares
Pick grafana-dashboard over generic monitoring advice when you need import-ready Grafana panel and alert structures for production datasources.
FAQ
What metrics does grafana-dashboard cover?
grafana-dashboard covers service health, latency, errors, saturation, and business metrics in Grafana panels. The skill designs queries and visualizations so production signals are visible on one operational dashboard.
Does grafana-dashboard configure alerts?
grafana-dashboard helps define Grafana alert rules alongside dashboard panels. Developers get threshold guidance for latency, error rates, and KPI regressions tied to on-call response.