9.6 KiB
AGENTS.md
This file provides guidance to AI agents when working with code in the Grafana repository.
Directory-scoped agent files exist for specialized areas — read them when working in those directories:
docs/AGENTS.md— Documentation style guide (for work underdocs/)public/app/features/alerting/unified/AGENTS.md— Alerting squad patternspkg/storage/unified/AGENTS.md— Unified storage/search compatibility rules (for work underpkg/storage/unified/)public/app/core/journeys/AGENTS.md— Critical User Journey instrumentation
Project Overview
Grafana is a monitoring and observability platform. Go backend, TypeScript/React frontend, monorepo with Yarn workspaces (frontend) and Go workspaces (backend).
Principles
- Follow existing patterns in the surrounding code
- Write tests for new functionality
- Keep changes focused — avoid over-engineering
- Separate PRs for frontend and backend changes (deployed at different cadences)
- Security: prevent XSS, SQL injection, command injection
- Security issues should be reported via Grafana's security issue reporting page and not directly in this repository.
Comments
- Only add a comment when it explains why something is done or reveals non-obvious logic that a reader must know to safely change the code. If the code is self-explanatory, no comment is needed.
- Never include links (Slack, GitHub, Jira, etc.) in code comments.
Human Review Gates
Before running git push, stop and get explicit human approval. When changes are ready, show a summary of changes and wait for instruction. "Open a PR" in a task description is intent, not permission to push without review.
Commands
Build & Run
make run # Backend with hot reload (localhost:3000, admin/admin)
make build-backend # Backend only
yarn start # Frontend dev server (watches for changes)
yarn build # Frontend production build
Test
# Backend
go test -run TestName ./pkg/services/myservice/ # Specific test
make test-go-unit # All unit tests
make test-go-integration # Integration tests
# Frontend
yarn test path/to/file # Specific file
yarn test -t "pattern" # By name pattern
yarn test -u # Update snapshots
# E2E
yarn e2e:playwright path/to/test.spec.ts # Specific test
Lint & Format
make lint-go # Go linter
yarn lint # ESLint
yarn lint:fix # ESLint auto-fix
yarn prettier:write # Prettier auto-format
yarn typecheck # TypeScript check
Code Generation
make gen-go # Wire DI (after changing service init)
make gen-cue # CUE schemas (after changing kinds/)
make gen-apps # App SDK apps
make swagger-gen # OpenAPI/Swagger specs
make gen-feature-toggles # Feature flags (pkg/services/featuremgmt/)
make i18n-extract # i18n strings
make update-workspace # Go workspace (after adding modules)
Dev Environment
yarn install --immutable # Install frontend deps
make devenv sources=influxdb # Start backing services
make devenv-down # Stop backing services
make lefthook-install # Pre-commit hooks
Architecture
Backend (pkg/)
| Directory | Purpose |
|---|---|
pkg/api/ |
HTTP API handlers and routes |
pkg/services/ |
Business logic by domain (alerting, dashboards, auth, etc.) |
pkg/server/ |
Server init and Wire DI setup (wire.go) |
pkg/tsdb/ |
Time series database query backends |
pkg/plugins/ |
Plugin system and loader |
pkg/infra/ |
Logging, metrics, database access |
pkg/middleware/ |
HTTP middleware |
pkg/setting/ |
Configuration management |
Patterns: Wire DI (regenerate with make gen-go), services implement interfaces in same package, business logic in pkg/services/<domain>/ not in API handlers, database via sqlstore, plugin communication via gRPC/protobuf.
Frontend (public/app/)
| Directory | Purpose |
|---|---|
public/app/core/ |
Shared services, components, utilities |
public/app/features/ |
Feature code by domain (dashboard, alerting, explore) |
public/app/plugins/ |
Built-in plugins (many are Yarn workspaces) |
public/app/types/ |
TypeScript type definitions |
public/app/store/ |
Redux store configuration |
Patterns: Redux Toolkit with slices (not old Redux), function components with hooks, Emotion CSS-in-JS via useStyles2, RTK Query for data fetching, React Testing Library for tests.
Shared Packages (packages/)
@grafana/data (data structures), @grafana/ui (components), @grafana/runtime (runtime services), @grafana/schema (CUE-generated types), @grafana/scenes (dashboard framework).
Backend Apps (apps/)
Standalone Go apps using Grafana App SDK: apps/dashboard/, apps/folder/, apps/alerting/.
Plugin Workspaces
These built-in plugins require separate build steps: azuremonitor, loki, grafana-testdata-datasource.
Build a specific plugin: yarn workspace @grafana-plugins/<name> dev
Key Notes
- Wire DI: Backend service init changes require
make gen-go. Wire catches circular deps at compile time. - CUE schemas: Dashboard/panel schemas in
kinds/generate both Go and TS code viamake gen-cue. - Feature toggles: Defined in
pkg/services/featuremgmt/, auto-generate code. Runmake gen-feature-togglesafter changes. - Go workspace: Defined in
go.work. Runmake update-workspacewhen adding Go modules. - Build tags:
oss(default),enterprise,pro. - Config: Defaults in
conf/defaults.ini, overrides inconf/custom.ini. - Database migrations: Live in
pkg/services/sqlstore/migrations/. Test withmake devenv sources=postgres_tests,mysql_teststhenmake test-go-integration-postgres. - CI sharding: Backend tests use
SHARD/SHARDSenv vars for parallelization. - Service compatibility: Unified storage/search (
pkg/storage/unified/) can be deployed as separate services at a different cadence than the Grafana API layer. Changes spanning API-layer callers andpkg/storage/unified/must be backwards compatible in both directions — seepkg/storage/unified/AGENTS.md.
Cursor Cloud specific instructions
Prerequisites
- Node.js — version pinned in
.nvmrc(check that file for the exact version). Installed via nvm and set as the nvm default. PATH gotcha: the infra injects/exec-daemon/nodeahead of nvm, so the plain non-login shell may resolvenodeto an older version — check it satisfies theenginesrange inpackage.json(it does today, so builds/tests work), but it is not the pinned version. Login shells (tmux sessions,bash -lc '...') get the pinned version because~/.bashrcprepends the nvm bin. Runyarn/yarn start/jest/ webpack via a login shell (tmux orbash -lc) to use the pinned Node. - Go — version pinned in
go.mod(check that file for the exact version), installed at/usr/local/goand symlinked to/usr/local/bin/go. The distro/usr/bin/gois older;/usr/local/binwins in PATH sogoresolves correctly. Ifgo.modbumps Go, reinstall a matching toolchain into/usr/local/go. - Yarn via corepack — version pinned by
package.jsonpackageManager(check that field for the exact version). Runcorepack enableifyarnis not found..yarnrc.ymlsetsenableScripts: false, so dependency build/lifecycle scripts are disabled by default. - GCC required for CGo/SQLite compilation of the backend.
- Repos in this environment live under
/agent/repos/<repo>(e.g./agent/repos/grafana); this is a multi-repo workspace, not the single~/grafanalayout described ingrafana-enterprise/AGENTS.md.
Running services
- Backend:
make run— builds and starts Grafana backend with hot-reload (air) onlocalhost:3000. Default login:admin/admin. First build takes ~3 minutes due to debug symbols (-gcflags all=-N -l); subsequent hot-reload rebuilds are faster. - Frontend:
yarn start— starts webpack dev server that watches for changes. The backend proxies to it. First compile takes ~45s. - No external databases required — Grafana uses embedded SQLite by default.
Testing gotchas
- Frontend tests: The
yarn testscript includes--watchby default. Always useyarn jest --no-watchor add--watchAll=falseto run tests once and exit. - Backend tests: Some packages (e.g.
pkg/api/) have slow test compilation (~2 min) due to large dependency graphs. Use targeted test runs with-run TestNamewhere possible. - All standard build/test/lint commands are documented in the Commands section above.