From gcx
Generates typed Go stubs for Grafana dashboards and alert rules using grafana-foundation-sdk builder pattern via gcx dev generate. Infers type from dashboards/ or alerts/ directories.
npx claudepluginhub grafana/gcx --plugin gcxThis skill uses the workspace's default tool permissions.
Generate ready-to-edit Go files for dashboards and alert rules using
Scaffolds new Go projects for Grafana resources-as-code using gcx dev scaffold. Generates repo structure with CI/CD, main.go, and dashboard examples. Triggers on 'new project', 'scaffold', 'get started with gcx'.
Generates Grafana dashboards and configurations for DevOps monitoring tasks involving Kubernetes, Terraform, Helm, and IaC. Provides step-by-step guidance, best practices, and production-ready outputs.
Creates Grafana dashboards with panels, variables, templating, alerts, and provisioning. Use for monitoring dashboards, time-series visualizations, and operational insights.
Share bugs, ideas, or general feedback.
Generate ready-to-edit Go files for dashboards and alert rules using
gcx dev generate. The generated code uses the grafana-foundation-sdk
builder pattern and compiles without modification.
# Dashboard stub
gcx dev generate dashboards/my-service-overview.go
# Alert rule stub
gcx dev generate alerts/high-cpu-usage.go
# Batch generation
gcx dev generate dashboards/a.go dashboards/b.go alerts/c.go
The resource type is inferred from the immediate parent directory:
| Directory | Type |
|---|---|
dashboards/ or dashboard/ | dashboard |
alerts/, alertrules/, or alertrule/ | alertrule |
Override with --type when the directory doesn't match:
gcx dev generate internal/monitoring/cpu-alert.go --type alertrule
my-dashboard.go → my_dashboard.gomy-dashboard → MyDashboard()The generated stub is a starting point. See references/foundation-sdk-guide.md
for the full builder API reference to customize your dashboards and alerts.
import (
dashboard "github.com/grafana/grafana-foundation-sdk/go/dashboardv2beta1"
"github.com/grafana/grafana-foundation-sdk/go/prometheus"
"github.com/grafana/grafana-foundation-sdk/go/timeseries"
)
builder := dashboard.NewDashboardBuilder("My Dashboard").
Tags([]string{"team:platform", "env:production"}).
Editable(true).
// Add a panel
Panel("requests-panel",
dashboard.NewPanelBuilder().
Title("Request Rate").
Visualization(timeseries.NewVisualizationBuilder()).
Data(
dashboard.NewQueryGroupBuilder().
Target(
dashboard.NewTargetBuilder().Query(
prometheus.NewDataqueryBuilder().
Expr(`rate(http_requests_total[$__rate_interval])`).
LegendFormat("{{method}} {{status}}"),
),
),
),
).
// Layout
AutoGridLayout(
dashboard.AutoGrid().
WithItem("requests-panel"),
)
return dashboard.Manifest("my-dashboard", builder)
import (
"github.com/grafana/grafana-foundation-sdk/go/alerting"
"github.com/grafana/grafana-foundation-sdk/go/resource"
)
rule := alerting.NewRuleBuilder("High CPU Usage").
Condition("A").
For("5m").
FolderUID("my-folder").
RuleGroup("cpu-alerts").
Labels(map[string]string{
"severity": "critical",
"team": "platform",
}).
Annotations(map[string]string{
"summary": "CPU usage above 90% for 5 minutes",
"description": "Instance {{ $labels.instance }} has high CPU usage.",
})
| Issue | Fix |
|---|---|
| "cannot infer resource type" | Directory name doesn't match known types; use --type dashboard or --type alertrule |
| "file already exists" | Delete the existing file first or use a different name |
| Need to add to registry | Manually add the function call to your All() function in all.go |