算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
build-grafana-dashboards【设计与创意】Crea dashboards de Grafana listos para producción con paneles reutilizables, variables de plantilla, anotaciones y aprovisionamiento para despliegue controlado por versiones. Útil para crear representaciones visuales de métricas de Prometheus, Loki u otras fuentes de datos, construir dashboards operacionales para equipos SRE, migrar de creación manua…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Diseña y despliega dashboards de Grafana con buenas prácticas de mantenibilidad, reutilización y control de versiones.
Consulta Ejemplos Extendidos para archivos de configuración completos y plantillas.
Planifica el diseño y la organización del dashboard antes de construir los paneles.
Crea un documento de especificación del dashboard:
# Service Overview Dashboard
## Purpose
Real-time operational view for on-call engineers monitoring the API service.
## Rows
1. High-Level Metrics (collapsed by default)
- Request rate, error rate, latency (RED metrics)
- Service uptime, instance count
2. Detailed Metrics (expanded by default)
- Per-endpoint latency breakdown
- Error rate by status code
- Database connection pool status
3. Resource Utilization
- CPU, memory, disk usage per instance
- Network I/O rates
4. Logs (collapsed by default)
- Recent errors from Loki
- Alert firing history
## Variables
- `environment`: production, staging, development
- `instance`: all instances or specific instance selection
- `interval`: aggregation window (5m, 15m, 1h)
## Annotations
- Deployment events from CI/CD system
- Alert firing/resolving events
Principios clave de diseño:
Esperado: Estructura de dashboard documentada claramente, partes interesadas alineadas en métricas y prioridades de diseño.
En caso de fallo:
Construye la base del dashboard con variables reutilizables para filtrado.
Crea la estructura JSON del dashboard (o usa la interfaz y luego exporta):
{
"dashboard": {
"title": "API Service Overview",
"uid": "api-service-overview",
"version": 1,
"timezone": "browser",
"editable": true,
"graphTooltip": 1,
"time": {
"from": "now-6h",
"to": "now"
},
"refresh": "30s",
"templating": {
"list": [
{
"name": "environment",
"type": "query",
"datasource": "Prometheus",
"query": "label_values(up{job=\"api-service\"}, environment)",
"multi": false,
"includeAll": false,
"refresh": 1,
"sort": 1,
"current": {
"selected": false,
"text": "production",
"value": "production"
}
},
{
"name": "instance",
"type": "query",
"datasource": "Prometheus",
"query": "label_values(up{job=\"api-service\",environment=\"$environment\"}, instance)",
"multi": true,
"includeAll": true,
"refresh": 1,
"allValue": ".*",
"current": {
"selected": true,
"text": "All",
"value": "$__all"
}
},
{
"name": "interval",
"type": "interval",
"options": [
{"text": "1m", "value": "1m"},
{"text": "5m", "value": "5m"},
{"text": "15m", "value": "15m"},
{"text": "1h", "value": "1h"}
],
"current": {
"text": "5m",
"value": "5m"
},
"auto": false
}
]
},
"annotations": {
"list": [
{
"name": "Deployments",
"datasource": "Prometheus",
"enable": true,
"expr": "changes(app_version{job=\"api-service\",environment=\"$environment\"}[5m]) > 0",
"step": "60s",
"iconColor": "rgba(0, 211, 255, 1)",
"tagKeys": "version"
}
]
}
}
}
Tipos de variables y casos de uso:
label_values(), query_result())Esperado: Las variables se llenan correctamente desde la fuente de datos, los filtros en cascada funcionan (el entorno filtra instancias), las selecciones predeterminadas son apropiadas.
En caso de fallo:
allValue para variables de selección múltipleCrea paneles para cada métrica con tipos de visualización apropiados.
Panel de series de tiempo (tasa de solicitudes):
{
"type": "timeseries",
"title": "Request Rate",
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 0},
"targets": [
{
"expr": "sum(rate(http_requests_total{job=\"api-service\",environment=\"$environment\",instance=~\"$instance\"}[$interval])) by (method)",
"legendFormat": "{{method}}",
"refId": "A"
}
],
"fieldConfig": {
"defaults": {
"unit": "reqps",
"color": {
"mode": "palette-classic"
},
"custom": {
"drawStyle": "line",
"lineInterpolation": "smooth",
"fillOpacity": 10,
"spanNulls": true
},
"thresholds": {
"mode": "absolute",
"steps": [
{"value": null, "color": "green"},
{"value": 1000, "color": "yellow"},
{"value": 5000, "color": "red"}
]
}
}
},
"options": {
"tooltip": {
"mode": "multi",
"sort": "desc"
},
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": ["mean", "max", "last"]
}
}
}
Panel estadístico (tasa de errores):
{
"type": "stat",
"title": "Error Rate",
"gridPos": {"h": 4, "w": 6, "x": 12, "y": 0},
"targets": [
{
# ... (see EXAMPLES.md for complete configuration)
Panel de mapa de calor (distribución de latencia):
{
"type": "heatmap",
"title": "Request Duration Heatmap",
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 8},
"targets": [
{
# ... (see EXAMPLES.md for complete configuration)
Guía de selección de paneles:
Esperado: Los paneles se renderizan correctamente con datos, las visualizaciones coinciden con los tipos de métricas previstos, las leyendas son descriptivas, los umbrales resaltan problemas.
En caso de fallo:
Organiza los paneles en filas colapsables para agrupación lógica.
{
"panels": [
{
"type": "row",
"title": "High-Level Metrics",
"collapsed": false,
# ... (see EXAMPLES.md for complete configuration)
Buenas prácticas de diseño:
w (ancho) y h (altura)Esperado: El diseño del dashboard está organizado lógicamente, las filas colapsan/expanden correctamente, los paneles se alinean visualmente sin espacios.
En caso de fallo:
Crea rutas de navegación entre dashboards relacionados.
Vínculos a nivel de dashboard en JSON:
{
"links": [
{
"title": "Service Details",
"type": "link",
"icon": "external link",
# ... (see EXAMPLES.md for complete configuration)
Vínculos de datos a nivel de panel:
{
"fieldConfig": {
"defaults": {
"links": [
{
"title": "View Logs for ${__field.labels.instance}",
# ... (see EXAMPLES.md for complete configuration)
Variables de vínculos:
$service, $environment: Variables de plantilla del dashboard${__field.labels.instance}: Valor de etiqueta desde el punto de datos clicado${__from}, ${__to}: Rango de tiempo actual del dashboard$__url_time_range: Rango de tiempo codificado para URLEsperado: Al hacer clic en elementos de paneles o vínculos del dashboard se navega a vistas relacionadas con el contexto preservado (rango de tiempo, variables).
En caso de fallo:
includeVars y keepTime funcionen según lo esperadoControla los dashboards como código para despliegues reproducibles.
Crea la estructura de directorios de aprovisionamiento:
mkdir -p /etc/grafana/provisioning/{dashboards,datasources}
Aprovisionamiento de fuente de datos (/etc/grafana/provisioning/datasources/prometheus.yml):
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
# ... (see EXAMPLES.md for complete configuration)
Aprovisionamiento de dashboard (/etc/grafana/provisioning/dashboards/default.yml):
apiVersion: 1
providers:
- name: 'default'
orgId: 1
folder: 'Services'
type: file
disableDeletion: false
updateIntervalSeconds: 30
allowUiUpdates: true
options:
path: /var/lib/grafana/dashboards
foldersFromFilesStructure: true
Almacena los archivos JSON del dashboard en /var/lib/grafana/dashboards/:
/var/lib/grafana/dashboards/
├── api-service/
│ ├── overview.json
│ └── details.json
├── database/
│ └── postgres.json
└── infrastructure/
├── nodes.json
└── kubernetes.json
Usando Docker Compose:
version: '3.8'
services:
grafana:
image: grafana/grafana:10.2.0
ports:
- "3000:3000"
volumes:
- ./grafana/provisioning:/etc/grafana/provisioning
- ./grafana/dashboards:/var/lib/grafana/dashboards
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
- GF_USERS_ALLOW_SIGN_UP=false
- GF_AUTH_ANONYMOUS_ENABLED=true
- GF_AUTH_ANONYMOUS_ORG_ROLE=Viewer
Esperado: Los dashboards se cargan automáticamente al iniciar Grafana, los cambios en archivos JSON se reflejan después del intervalo de actualización, el control de versiones registra los cambios del dashboard.
En caso de fallo:
docker logs grafana | grep -i provisioningpython -m json.tool dashboard.jsonchmod 644 *.jsonallowUiUpdates: false para evitar modificaciones desde la interfazcurl http://localhost:3000/api/admin/provisioning/dashboards/reload -X POST -H "Authorization: Bearer $GRAFANA_API_KEY"$variable, no valores codificados. Verificar la configuración de actualización de variables.legendFormat para mostrar solo las etiquetas relevantes, no el nombre completo de la métrica. Ejemplo: {{method}} - {{status}} en lugar del predeterminado.allowUiUpdates: false en producción.${__field.labels.labelname} con cuidado, verificar que la etiqueta existe en el resultado de la consulta.setup-prometheus-monitoring - Configurar fuentes de datos de Prometheus que alimentan los dashboards de Grafanaconfigure-log-aggregation - Configurar Loki para consultas de paneles de log y anotaciones basadas en logdefine-slo-sli-sla - Visualizar el cumplimiento de SLO y los presupuestos de error con paneles de estadísticas y medidores de Grafanainstrument-distributed-tracing - Agregar vínculos de ID de traza desde paneles de métricas a vistas de traza de Tempo