@hivehub/rulebook 4.2.2 → 4.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/continue.md +33 -33
- package/.claude/commands/ralph-config.md +112 -112
- package/.claude/commands/ralph-history.md +110 -110
- package/.claude/commands/ralph-init.md +72 -72
- package/.claude/commands/ralph-pause-resume.md +105 -105
- package/.claude/commands/ralph-run.md +101 -101
- package/.claude/commands/ralph-status.md +76 -76
- package/.claude/commands/rulebook-memory-save.md +48 -48
- package/.claude/commands/rulebook-memory-search.md +47 -47
- package/.claude/commands/rulebook-task-apply.md +67 -67
- package/.claude/commands/rulebook-task-archive.md +70 -70
- package/.claude/commands/rulebook-task-create.md +93 -93
- package/.claude/commands/rulebook-task-list.md +42 -42
- package/.claude/commands/rulebook-task-show.md +52 -52
- package/.claude/commands/rulebook-task-validate.md +53 -53
- package/.claude-plugin/marketplace.json +28 -28
- package/.claude-plugin/plugin.json +8 -8
- package/README.md +15 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +43 -18
- package/dist/cli/commands.js.map +1 -1
- package/dist/core/claude-mcp.d.ts +10 -2
- package/dist/core/claude-mcp.d.ts.map +1 -1
- package/dist/core/claude-mcp.js +48 -9
- package/dist/core/claude-mcp.js.map +1 -1
- package/dist/core/config-manager.d.ts.map +1 -1
- package/dist/core/config-manager.js +1 -2
- package/dist/core/config-manager.js.map +1 -1
- package/dist/core/generator.d.ts +13 -0
- package/dist/core/generator.d.ts.map +1 -1
- package/dist/core/generator.js +283 -28
- package/dist/core/generator.js.map +1 -1
- package/dist/core/indexer/background-indexer.d.ts.map +1 -1
- package/dist/core/indexer/background-indexer.js +10 -3
- package/dist/core/indexer/background-indexer.js.map +1 -1
- package/dist/core/workspace/workspace-manager.d.ts.map +1 -1
- package/dist/core/workspace/workspace-manager.js +2 -6
- package/dist/core/workspace/workspace-manager.js.map +1 -1
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp/rulebook-server.d.ts.map +1 -1
- package/dist/mcp/rulebook-server.js +23 -10
- package/dist/mcp/rulebook-server.js.map +1 -1
- package/package.json +21 -22
- package/templates/agents/accessibility-reviewer.md +43 -0
- package/templates/agents/api-designer.md +42 -0
- package/templates/agents/architect.md +51 -0
- package/templates/agents/build-engineer.md +36 -0
- package/templates/agents/code-reviewer.md +47 -0
- package/templates/agents/database-architect.md +41 -0
- package/templates/agents/devops-engineer.md +42 -0
- package/templates/agents/docs-writer.md +38 -0
- package/templates/agents/i18n-engineer.md +42 -0
- package/templates/agents/implementer.md +38 -35
- package/templates/agents/migration-engineer.md +42 -0
- package/templates/agents/performance-engineer.md +49 -0
- package/templates/agents/refactoring-agent.md +41 -0
- package/templates/agents/researcher.md +38 -34
- package/templates/agents/security-reviewer.md +40 -0
- package/templates/agents/team-lead.md +37 -34
- package/templates/agents/tester.md +45 -42
- package/templates/agents/ux-reviewer.md +43 -0
- package/templates/ci/rulebook-review.yml +26 -26
- package/templates/cli/AIDER.md +49 -49
- package/templates/cli/AMAZON_Q.md +25 -25
- package/templates/cli/AUGGIE.md +32 -32
- package/templates/cli/CLAUDE.md +117 -117
- package/templates/cli/CLINE.md +99 -99
- package/templates/cli/CODEBUDDY.md +20 -20
- package/templates/cli/CODEIUM.md +20 -20
- package/templates/cli/CODEX.md +21 -21
- package/templates/cli/CONTINUE.md +34 -34
- package/templates/cli/CURSOR_CLI.md +62 -62
- package/templates/cli/FACTORY.md +18 -18
- package/templates/cli/GEMINI.md +35 -35
- package/templates/cli/KILOCODE.md +18 -18
- package/templates/cli/OPENCODE.md +18 -18
- package/templates/cli/_GENERIC_TEMPLATE.md +29 -29
- package/templates/commands/rulebook-memory-save.md +48 -48
- package/templates/commands/rulebook-memory-search.md +47 -47
- package/templates/commands/rulebook-task-apply.md +67 -67
- package/templates/commands/rulebook-task-archive.md +94 -94
- package/templates/commands/rulebook-task-create.md +93 -93
- package/templates/commands/rulebook-task-list.md +42 -42
- package/templates/commands/rulebook-task-show.md +52 -52
- package/templates/commands/rulebook-task-validate.md +53 -53
- package/templates/core/AGENTS_LEAN.md +25 -25
- package/templates/core/AGENTS_OVERRIDE.md +16 -16
- package/templates/core/AGENT_AUTOMATION.md +288 -288
- package/templates/core/DAG.md +304 -304
- package/templates/core/DOCUMENTATION_RULES.md +36 -36
- package/templates/core/MULTI_AGENT.md +74 -74
- package/templates/core/PLANS.md +28 -28
- package/templates/core/QUALITY_ENFORCEMENT.md +68 -68
- package/templates/core/RALPH.md +471 -471
- package/templates/core/RULEBOOK.md +1935 -1935
- package/templates/frameworks/ANGULAR.md +36 -36
- package/templates/frameworks/DJANGO.md +83 -83
- package/templates/frameworks/ELECTRON.md +147 -147
- package/templates/frameworks/FLASK.md +38 -38
- package/templates/frameworks/FLUTTER.md +55 -55
- package/templates/frameworks/JQUERY.md +32 -32
- package/templates/frameworks/LARAVEL.md +38 -38
- package/templates/frameworks/NESTJS.md +43 -43
- package/templates/frameworks/NEXTJS.md +127 -127
- package/templates/frameworks/NUXT.md +40 -40
- package/templates/frameworks/RAILS.md +66 -66
- package/templates/frameworks/REACT.md +38 -38
- package/templates/frameworks/REACT_NATIVE.md +47 -47
- package/templates/frameworks/SPRING.md +39 -39
- package/templates/frameworks/SYMFONY.md +36 -36
- package/templates/frameworks/VUE.md +36 -36
- package/templates/frameworks/ZEND.md +35 -35
- package/templates/git/CI_CD_PATTERNS.md +661 -661
- package/templates/git/GITHUB_ACTIONS.md +728 -728
- package/templates/git/GITLAB_CI.md +730 -730
- package/templates/git/GIT_WORKFLOW.md +1157 -1157
- package/templates/git/SECRETS_MANAGEMENT.md +585 -585
- package/templates/hooks/COMMIT_MSG.md +530 -530
- package/templates/hooks/POST_CHECKOUT.md +546 -546
- package/templates/hooks/PREPARE_COMMIT_MSG.md +619 -619
- package/templates/hooks/PRE_COMMIT.md +414 -414
- package/templates/hooks/PRE_PUSH.md +601 -601
- package/templates/ides/CONTINUE_RULES.md +16 -16
- package/templates/ides/COPILOT.md +37 -37
- package/templates/ides/COPILOT_INSTRUCTIONS.md +23 -23
- package/templates/ides/CURSOR.md +43 -43
- package/templates/ides/GEMINI_RULES.md +17 -17
- package/templates/ides/JETBRAINS_AI.md +35 -35
- package/templates/ides/REPLIT.md +36 -36
- package/templates/ides/TABNINE.md +29 -29
- package/templates/ides/VSCODE.md +40 -40
- package/templates/ides/WINDSURF.md +36 -36
- package/templates/ides/WINDSURF_RULES.md +14 -14
- package/templates/ides/ZED.md +32 -32
- package/templates/ides/cursor-mdc/go.mdc +24 -24
- package/templates/ides/cursor-mdc/python.mdc +24 -24
- package/templates/ides/cursor-mdc/quality.mdc +25 -25
- package/templates/ides/cursor-mdc/ralph.mdc +39 -39
- package/templates/ides/cursor-mdc/rulebook.mdc +38 -38
- package/templates/ides/cursor-mdc/rust.mdc +24 -24
- package/templates/ides/cursor-mdc/typescript.mdc +25 -25
- package/templates/languages/C.md +333 -333
- package/templates/languages/CPP.md +743 -743
- package/templates/languages/CSHARP.md +417 -417
- package/templates/languages/ELIXIR.md +454 -454
- package/templates/languages/ERLANG.md +361 -361
- package/templates/languages/GO.md +645 -645
- package/templates/languages/HASKELL.md +177 -177
- package/templates/languages/JAVA.md +607 -607
- package/templates/languages/JAVASCRIPT.md +631 -631
- package/templates/languages/JULIA.md +97 -97
- package/templates/languages/KOTLIN.md +511 -511
- package/templates/languages/LISP.md +100 -100
- package/templates/languages/LUA.md +74 -74
- package/templates/languages/OBJECTIVEC.md +90 -90
- package/templates/languages/PHP.md +416 -416
- package/templates/languages/PYTHON.md +682 -682
- package/templates/languages/RUBY.md +421 -421
- package/templates/languages/RUST.md +477 -477
- package/templates/languages/SAS.md +73 -73
- package/templates/languages/SCALA.md +348 -348
- package/templates/languages/SOLIDITY.md +580 -580
- package/templates/languages/SQL.md +137 -137
- package/templates/languages/SWIFT.md +466 -466
- package/templates/languages/TYPESCRIPT.md +591 -591
- package/templates/languages/ZIG.md +265 -265
- package/templates/modules/ATLASSIAN.md +255 -255
- package/templates/modules/CONTEXT7.md +54 -54
- package/templates/modules/FIGMA.md +267 -267
- package/templates/modules/GITHUB_MCP.md +64 -64
- package/templates/modules/GRAFANA.md +328 -328
- package/templates/modules/MEMORY.md +126 -126
- package/templates/modules/NOTION.md +247 -247
- package/templates/modules/PLAYWRIGHT.md +90 -90
- package/templates/modules/RULEBOOK_MCP.md +156 -156
- package/templates/modules/SERENA.md +337 -337
- package/templates/modules/SUPABASE.md +223 -223
- package/templates/modules/SYNAP.md +69 -69
- package/templates/modules/VECTORIZER.md +63 -63
- package/templates/modules/sequential-thinking.md +42 -42
- package/templates/ralph/ralph-history.bat +4 -4
- package/templates/ralph/ralph-history.sh +5 -5
- package/templates/ralph/ralph-init.bat +5 -5
- package/templates/ralph/ralph-init.sh +5 -5
- package/templates/ralph/ralph-pause.bat +5 -5
- package/templates/ralph/ralph-pause.sh +5 -5
- package/templates/ralph/ralph-run.bat +5 -5
- package/templates/ralph/ralph-run.sh +5 -5
- package/templates/ralph/ralph-status.bat +4 -4
- package/templates/ralph/ralph-status.sh +5 -5
- package/templates/services/AZURE_BLOB.md +184 -184
- package/templates/services/CASSANDRA.md +239 -239
- package/templates/services/DATADOG.md +26 -26
- package/templates/services/DOCKER.md +124 -124
- package/templates/services/DOCKER_COMPOSE.md +168 -168
- package/templates/services/DYNAMODB.md +308 -308
- package/templates/services/ELASTICSEARCH.md +347 -347
- package/templates/services/GCS.md +178 -178
- package/templates/services/HELM.md +194 -194
- package/templates/services/INFLUXDB.md +265 -265
- package/templates/services/KAFKA.md +341 -341
- package/templates/services/KUBERNETES.md +208 -208
- package/templates/services/MARIADB.md +183 -183
- package/templates/services/MEMCACHED.md +242 -242
- package/templates/services/MINIO.md +201 -201
- package/templates/services/MONGODB.md +268 -268
- package/templates/services/MYSQL.md +358 -358
- package/templates/services/NEO4J.md +247 -247
- package/templates/services/OPENTELEMETRY.md +25 -25
- package/templates/services/ORACLE.md +290 -290
- package/templates/services/PINO.md +24 -24
- package/templates/services/POSTGRESQL.md +326 -326
- package/templates/services/PROMETHEUS.md +33 -33
- package/templates/services/RABBITMQ.md +286 -286
- package/templates/services/REDIS.md +292 -292
- package/templates/services/S3.md +298 -298
- package/templates/services/SENTRY.md +23 -23
- package/templates/services/SQLITE.md +294 -294
- package/templates/services/SQLSERVER.md +294 -294
- package/templates/services/WINSTON.md +30 -30
- package/templates/skills/cli/aider/SKILL.md +59 -59
- package/templates/skills/cli/amazon-q/SKILL.md +35 -35
- package/templates/skills/cli/auggie/SKILL.md +42 -42
- package/templates/skills/cli/claude/SKILL.md +42 -42
- package/templates/skills/cli/cline/SKILL.md +42 -42
- package/templates/skills/cli/codebuddy/SKILL.md +30 -30
- package/templates/skills/cli/codeium/SKILL.md +30 -30
- package/templates/skills/cli/codex/SKILL.md +31 -31
- package/templates/skills/cli/continue/SKILL.md +44 -44
- package/templates/skills/cli/cursor-cli/SKILL.md +38 -38
- package/templates/skills/cli/factory/SKILL.md +28 -28
- package/templates/skills/cli/gemini/SKILL.md +45 -45
- package/templates/skills/cli/kilocode/SKILL.md +28 -28
- package/templates/skills/cli/opencode/SKILL.md +28 -28
- package/templates/skills/core/agent-automation/SKILL.md +194 -194
- package/templates/skills/core/dag/SKILL.md +314 -314
- package/templates/skills/core/documentation-rules/SKILL.md +46 -46
- package/templates/skills/core/quality-enforcement/SKILL.md +78 -78
- package/templates/skills/core/rulebook/SKILL.md +176 -176
- package/templates/skills/dev/accessibility/SKILL.md +17 -0
- package/templates/skills/dev/api-design/SKILL.md +15 -0
- package/templates/skills/dev/architect/SKILL.md +17 -0
- package/templates/skills/dev/build-fix/SKILL.md +17 -0
- package/templates/skills/dev/db-design/SKILL.md +15 -0
- package/templates/skills/dev/debug/SKILL.md +16 -0
- package/templates/skills/dev/deploy/SKILL.md +17 -0
- package/templates/skills/dev/docs/SKILL.md +17 -0
- package/templates/skills/dev/migrate/SKILL.md +15 -0
- package/templates/skills/dev/perf/SKILL.md +17 -0
- package/templates/skills/dev/refactor/SKILL.md +17 -0
- package/templates/skills/dev/research/SKILL.md +14 -0
- package/templates/skills/dev/review/SKILL.md +18 -0
- package/templates/skills/dev/security-audit/SKILL.md +17 -0
- package/templates/skills/frameworks/angular/SKILL.md +46 -46
- package/templates/skills/frameworks/django/SKILL.md +93 -93
- package/templates/skills/frameworks/electron/SKILL.md +157 -157
- package/templates/skills/frameworks/flask/SKILL.md +48 -48
- package/templates/skills/frameworks/flutter/SKILL.md +65 -65
- package/templates/skills/frameworks/jquery/SKILL.md +42 -42
- package/templates/skills/frameworks/laravel/SKILL.md +48 -48
- package/templates/skills/frameworks/nestjs/SKILL.md +53 -53
- package/templates/skills/frameworks/nextjs/SKILL.md +137 -137
- package/templates/skills/frameworks/nuxt/SKILL.md +50 -50
- package/templates/skills/frameworks/rails/SKILL.md +76 -76
- package/templates/skills/frameworks/react/SKILL.md +48 -48
- package/templates/skills/frameworks/react-native/SKILL.md +57 -57
- package/templates/skills/frameworks/spring/SKILL.md +49 -49
- package/templates/skills/frameworks/symfony/SKILL.md +46 -46
- package/templates/skills/frameworks/vue/SKILL.md +46 -46
- package/templates/skills/frameworks/zend/SKILL.md +45 -45
- package/templates/skills/ides/copilot/SKILL.md +47 -47
- package/templates/skills/ides/cursor/SKILL.md +53 -53
- package/templates/skills/ides/jetbrains-ai/SKILL.md +45 -45
- package/templates/skills/ides/replit/SKILL.md +46 -46
- package/templates/skills/ides/tabnine/SKILL.md +39 -39
- package/templates/skills/ides/vscode/SKILL.md +50 -50
- package/templates/skills/ides/windsurf/SKILL.md +46 -46
- package/templates/skills/ides/zed/SKILL.md +42 -42
- package/templates/skills/languages/c/SKILL.md +343 -343
- package/templates/skills/languages/cpp/SKILL.md +753 -753
- package/templates/skills/languages/csharp/SKILL.md +427 -427
- package/templates/skills/languages/elixir/SKILL.md +464 -464
- package/templates/skills/languages/erlang/SKILL.md +371 -371
- package/templates/skills/languages/go/SKILL.md +655 -655
- package/templates/skills/languages/haskell/SKILL.md +187 -187
- package/templates/skills/languages/java/SKILL.md +617 -617
- package/templates/skills/languages/javascript/SKILL.md +641 -641
- package/templates/skills/languages/julia/SKILL.md +107 -107
- package/templates/skills/languages/kotlin/SKILL.md +521 -521
- package/templates/skills/languages/lisp/SKILL.md +110 -110
- package/templates/skills/languages/lua/SKILL.md +84 -84
- package/templates/skills/languages/objectivec/SKILL.md +100 -100
- package/templates/skills/languages/php/SKILL.md +426 -426
- package/templates/skills/languages/python/SKILL.md +692 -692
- package/templates/skills/languages/ruby/SKILL.md +431 -431
- package/templates/skills/languages/rust/SKILL.md +487 -487
- package/templates/skills/languages/sas/SKILL.md +83 -83
- package/templates/skills/languages/scala/SKILL.md +358 -358
- package/templates/skills/languages/solidity/SKILL.md +590 -590
- package/templates/skills/languages/sql/SKILL.md +147 -147
- package/templates/skills/languages/swift/SKILL.md +476 -476
- package/templates/skills/languages/typescript/SKILL.md +302 -302
- package/templates/skills/languages/zig/SKILL.md +275 -275
- package/templates/skills/modules/atlassian/SKILL.md +265 -265
- package/templates/skills/modules/context7/SKILL.md +64 -64
- package/templates/skills/modules/figma/SKILL.md +277 -277
- package/templates/skills/modules/github-mcp/SKILL.md +74 -74
- package/templates/skills/modules/grafana/SKILL.md +338 -338
- package/templates/skills/modules/memory/SKILL.md +73 -73
- package/templates/skills/modules/notion/SKILL.md +257 -257
- package/templates/skills/modules/playwright/SKILL.md +100 -100
- package/templates/skills/modules/rulebook-mcp/SKILL.md +166 -166
- package/templates/skills/modules/serena/SKILL.md +347 -347
- package/templates/skills/modules/supabase/SKILL.md +233 -233
- package/templates/skills/modules/synap/SKILL.md +79 -79
- package/templates/skills/modules/vectorizer/SKILL.md +73 -73
- package/templates/skills/services/azure-blob/SKILL.md +194 -194
- package/templates/skills/services/cassandra/SKILL.md +249 -249
- package/templates/skills/services/dynamodb/SKILL.md +318 -318
- package/templates/skills/services/elasticsearch/SKILL.md +357 -357
- package/templates/skills/services/gcs/SKILL.md +188 -188
- package/templates/skills/services/influxdb/SKILL.md +275 -275
- package/templates/skills/services/kafka/SKILL.md +351 -351
- package/templates/skills/services/mariadb/SKILL.md +193 -193
- package/templates/skills/services/memcached/SKILL.md +252 -252
- package/templates/skills/services/minio/SKILL.md +211 -211
- package/templates/skills/services/mongodb/SKILL.md +278 -278
- package/templates/skills/services/mysql/SKILL.md +368 -368
- package/templates/skills/services/neo4j/SKILL.md +257 -257
- package/templates/skills/services/oracle/SKILL.md +300 -300
- package/templates/skills/services/postgresql/SKILL.md +336 -336
- package/templates/skills/services/rabbitmq/SKILL.md +296 -296
- package/templates/skills/services/redis/SKILL.md +302 -302
- package/templates/skills/services/s3/SKILL.md +308 -308
- package/templates/skills/services/sqlite/SKILL.md +304 -304
- package/templates/skills/services/sqlserver/SKILL.md +304 -304
- package/templates/skills/workflows/ralph/SKILL.md +309 -309
- package/templates/skills/workflows/ralph/install.sh +87 -87
- package/templates/skills/workflows/ralph/manifest.json +158 -158
|
@@ -1,328 +1,328 @@
|
|
|
1
|
-
<!-- GRAFANA:START -->
|
|
2
|
-
# Grafana MCP Instructions
|
|
3
|
-
|
|
4
|
-
**CRITICAL**: Use MCP Grafana for metrics visualization, alerting, and observability dashboards.
|
|
5
|
-
|
|
6
|
-
## Core Operations
|
|
7
|
-
|
|
8
|
-
### Dashboard Management
|
|
9
|
-
```typescript
|
|
10
|
-
// Get dashboard
|
|
11
|
-
grafana.dashboards.getDashboardByUid({ uid: 'dashboard-uid' })
|
|
12
|
-
|
|
13
|
-
// Create dashboard
|
|
14
|
-
grafana.dashboards.postDashboard({
|
|
15
|
-
dashboard: {
|
|
16
|
-
title: 'Application Metrics',
|
|
17
|
-
tags: ['production', 'api'],
|
|
18
|
-
timezone: 'browser',
|
|
19
|
-
panels: [
|
|
20
|
-
{
|
|
21
|
-
title: 'Request Rate',
|
|
22
|
-
type: 'graph',
|
|
23
|
-
targets: [{ expr: 'rate(http_requests_total[5m])' }]
|
|
24
|
-
}
|
|
25
|
-
]
|
|
26
|
-
},
|
|
27
|
-
overwrite: false
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
// Update dashboard
|
|
31
|
-
grafana.dashboards.postDashboard({
|
|
32
|
-
dashboard: modifiedDashboard,
|
|
33
|
-
overwrite: true
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
// Delete dashboard
|
|
37
|
-
grafana.dashboards.deleteDashboardByUid({ uid: 'dashboard-uid' })
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### Data Sources
|
|
41
|
-
```typescript
|
|
42
|
-
// Get data sources
|
|
43
|
-
grafana.datasources.getDataSources()
|
|
44
|
-
|
|
45
|
-
// Add data source
|
|
46
|
-
grafana.datasources.addDataSource({
|
|
47
|
-
name: 'Prometheus',
|
|
48
|
-
type: 'prometheus',
|
|
49
|
-
url: 'http://prometheus:9090',
|
|
50
|
-
access: 'proxy',
|
|
51
|
-
isDefault: true
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
// Query data source
|
|
55
|
-
grafana.datasources.queryDataSource({
|
|
56
|
-
datasourceId: 1,
|
|
57
|
-
from: Date.now() - 3600000, // 1 hour ago
|
|
58
|
-
to: Date.now(),
|
|
59
|
-
queries: [
|
|
60
|
-
{ expr: 'up', refId: 'A' }
|
|
61
|
-
]
|
|
62
|
-
})
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### Alerts
|
|
66
|
-
```typescript
|
|
67
|
-
// Get alerts
|
|
68
|
-
grafana.alerting.getAlerts({ state: 'alerting' })
|
|
69
|
-
|
|
70
|
-
// Create alert rule
|
|
71
|
-
grafana.alerting.postAlertRule({
|
|
72
|
-
title: 'High Error Rate',
|
|
73
|
-
condition: 'A',
|
|
74
|
-
data: [
|
|
75
|
-
{
|
|
76
|
-
refId: 'A',
|
|
77
|
-
queryType: '',
|
|
78
|
-
relativeTimeRange: { from: 600, to: 0 },
|
|
79
|
-
datasourceUid: 'prometheus-uid',
|
|
80
|
-
model: {
|
|
81
|
-
expr: 'rate(http_errors_total[5m]) > 0.05'
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
],
|
|
85
|
-
noDataState: 'NoData',
|
|
86
|
-
execErrState: 'Alerting',
|
|
87
|
-
for: '5m',
|
|
88
|
-
annotations: {
|
|
89
|
-
description: 'Error rate exceeded 5%'
|
|
90
|
-
},
|
|
91
|
-
labels: { severity: 'high' }
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
// Pause alert
|
|
95
|
-
grafana.alerting.pauseAlertRule({ uid: 'alert-uid', paused: true })
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### Annotations
|
|
99
|
-
```typescript
|
|
100
|
-
// Create annotation
|
|
101
|
-
grafana.annotations.postAnnotation({
|
|
102
|
-
dashboardUid: 'dashboard-uid',
|
|
103
|
-
time: Date.now(),
|
|
104
|
-
timeEnd: Date.now(),
|
|
105
|
-
tags: ['deployment'],
|
|
106
|
-
text: 'Deployed version 1.2.0'
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
// Get annotations
|
|
110
|
-
grafana.annotations.getAnnotations({
|
|
111
|
-
from: Date.now() - 86400000, // Last 24h
|
|
112
|
-
to: Date.now(),
|
|
113
|
-
tags: ['deployment']
|
|
114
|
-
})
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
### Organizations & Users
|
|
118
|
-
```typescript
|
|
119
|
-
// Get organization
|
|
120
|
-
grafana.orgs.getOrgByName({ orgName: 'Main Org' })
|
|
121
|
-
|
|
122
|
-
// Add user
|
|
123
|
-
grafana.users.createUser({
|
|
124
|
-
email: 'user@example.com',
|
|
125
|
-
login: 'username',
|
|
126
|
-
password: 'secure-password',
|
|
127
|
-
name: 'User Name'
|
|
128
|
-
})
|
|
129
|
-
|
|
130
|
-
// Update user permissions
|
|
131
|
-
grafana.org.updateOrgUser({
|
|
132
|
-
userId: 123,
|
|
133
|
-
role: 'Editor' // Viewer, Editor, Admin
|
|
134
|
-
})
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
## Common Patterns
|
|
138
|
-
|
|
139
|
-
### Deployment Tracking
|
|
140
|
-
```typescript
|
|
141
|
-
// Mark deployment on dashboard
|
|
142
|
-
await grafana.annotations.postAnnotation({
|
|
143
|
-
time: Date.now(),
|
|
144
|
-
tags: ['deployment', 'production'],
|
|
145
|
-
text: `Deployed ${process.env.GIT_SHA}`,
|
|
146
|
-
dashboardUid: 'main-dashboard'
|
|
147
|
-
})
|
|
148
|
-
|
|
149
|
-
// Create snapshot after deployment
|
|
150
|
-
const snapshot = await grafana.snapshots.createDashboardSnapshot({
|
|
151
|
-
dashboard: dashboard,
|
|
152
|
-
name: `Production Metrics - ${new Date().toISOString()}`,
|
|
153
|
-
expires: 86400 // 24 hours
|
|
154
|
-
})
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
### Automated Dashboard Creation
|
|
158
|
-
```typescript
|
|
159
|
-
// Create dashboard for new service
|
|
160
|
-
async function createServiceDashboard(serviceName) {
|
|
161
|
-
const dashboard = {
|
|
162
|
-
title: `${serviceName} Metrics`,
|
|
163
|
-
tags: ['microservices', serviceName],
|
|
164
|
-
panels: [
|
|
165
|
-
{
|
|
166
|
-
title: 'Request Rate',
|
|
167
|
-
type: 'graph',
|
|
168
|
-
targets: [{
|
|
169
|
-
expr: `rate(http_requests_total{service="${serviceName}"}[5m])`
|
|
170
|
-
}]
|
|
171
|
-
},
|
|
172
|
-
{
|
|
173
|
-
title: 'Error Rate',
|
|
174
|
-
type: 'graph',
|
|
175
|
-
targets: [{
|
|
176
|
-
expr: `rate(http_errors_total{service="${serviceName}"}[5m])`
|
|
177
|
-
}]
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
title: 'Response Time (p95)',
|
|
181
|
-
type: 'graph',
|
|
182
|
-
targets: [{
|
|
183
|
-
expr: `histogram_quantile(0.95, rate(http_duration_seconds_bucket{service="${serviceName}"}[5m]))`
|
|
184
|
-
}]
|
|
185
|
-
}
|
|
186
|
-
]
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
return await grafana.dashboards.postDashboard({
|
|
190
|
-
dashboard,
|
|
191
|
-
overwrite: false
|
|
192
|
-
})
|
|
193
|
-
}
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
### Alert Management
|
|
197
|
-
```typescript
|
|
198
|
-
// Check for firing alerts
|
|
199
|
-
const alerts = await grafana.alerting.getAlerts({ state: 'alerting' })
|
|
200
|
-
|
|
201
|
-
if (alerts.length > 0) {
|
|
202
|
-
console.log(`${alerts.length} alerts firing:`)
|
|
203
|
-
|
|
204
|
-
for (const alert of alerts) {
|
|
205
|
-
console.log(`- ${alert.labels.alertname}: ${alert.annotations.description}`)
|
|
206
|
-
|
|
207
|
-
// Create incident ticket
|
|
208
|
-
await jira.issues.createIssue({
|
|
209
|
-
fields: {
|
|
210
|
-
project: { key: 'OPS' },
|
|
211
|
-
summary: `Alert: ${alert.labels.alertname}`,
|
|
212
|
-
description: alert.annotations.description,
|
|
213
|
-
issuetype: { name: 'Incident' },
|
|
214
|
-
priority: { name: alert.labels.severity === 'critical' ? 'Highest' : 'High' }
|
|
215
|
-
}
|
|
216
|
-
})
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
### Metrics Reporting
|
|
222
|
-
```typescript
|
|
223
|
-
// Generate daily metrics report
|
|
224
|
-
async function generateDailyReport() {
|
|
225
|
-
const datasourceId = 1 // Prometheus
|
|
226
|
-
const from = Date.now() - 86400000 // 24h ago
|
|
227
|
-
const to = Date.now()
|
|
228
|
-
|
|
229
|
-
// Query metrics
|
|
230
|
-
const requestRate = await grafana.datasources.queryDataSource({
|
|
231
|
-
datasourceId,
|
|
232
|
-
from,
|
|
233
|
-
to,
|
|
234
|
-
queries: [{ expr: 'sum(rate(http_requests_total[24h]))', refId: 'A' }]
|
|
235
|
-
})
|
|
236
|
-
|
|
237
|
-
const errorRate = await grafana.datasources.queryDataSource({
|
|
238
|
-
datasourceId,
|
|
239
|
-
from,
|
|
240
|
-
to,
|
|
241
|
-
queries: [{ expr: 'sum(rate(http_errors_total[24h]))', refId: 'A' }]
|
|
242
|
-
})
|
|
243
|
-
|
|
244
|
-
// Create report
|
|
245
|
-
const report = {
|
|
246
|
-
date: new Date().toISOString(),
|
|
247
|
-
totalRequests: requestRate.results.A.frames[0].data.values[1][0],
|
|
248
|
-
totalErrors: errorRate.results.A.frames[0].data.values[1][0],
|
|
249
|
-
errorPercentage: (totalErrors / totalRequests * 100).toFixed(2)
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
// Post to Confluence/Notion
|
|
253
|
-
await notion.pages.create({
|
|
254
|
-
parent: { database_id: reportsDbId },
|
|
255
|
-
properties: {
|
|
256
|
-
'Title': { title: [{ text: { content: `Daily Metrics - ${report.date}` } }] },
|
|
257
|
-
'Requests': { number: report.totalRequests },
|
|
258
|
-
'Errors': { number: report.totalErrors },
|
|
259
|
-
'Error Rate': { number: parseFloat(report.errorPercentage) }
|
|
260
|
-
}
|
|
261
|
-
})
|
|
262
|
-
}
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
## Best Practices
|
|
266
|
-
|
|
267
|
-
✅ **DO:**
|
|
268
|
-
- Use dashboard folders for organization
|
|
269
|
-
- Tag dashboards appropriately
|
|
270
|
-
- Set up proper alert thresholds
|
|
271
|
-
- Use variables for flexibility
|
|
272
|
-
- Create snapshots before changes
|
|
273
|
-
- Document dashboard purpose
|
|
274
|
-
- Use templating for multi-instance dashboards
|
|
275
|
-
|
|
276
|
-
❌ **DON'T:**
|
|
277
|
-
- Create duplicate dashboards
|
|
278
|
-
- Set alerts without testing
|
|
279
|
-
- Ignore alert fatigue
|
|
280
|
-
- Hardcode dashboard IDs
|
|
281
|
-
- Skip dashboard backups
|
|
282
|
-
- Over-complicate queries
|
|
283
|
-
|
|
284
|
-
## Configuration
|
|
285
|
-
|
|
286
|
-
```json
|
|
287
|
-
{
|
|
288
|
-
"mcpServers": {
|
|
289
|
-
"grafana": {
|
|
290
|
-
"command": "npx",
|
|
291
|
-
"args": ["-y", "@modelcontextprotocol/server-grafana"],
|
|
292
|
-
"env": {
|
|
293
|
-
"GRAFANA_URL": "http://grafana:3000",
|
|
294
|
-
"GRAFANA_API_KEY": "your-api-key",
|
|
295
|
-
"GRAFANA_ORG_ID": "1"
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
```
|
|
301
|
-
|
|
302
|
-
**Setup:**
|
|
303
|
-
1. Create API key: Configuration → API Keys → Add API key
|
|
304
|
-
2. Grant appropriate permissions (Admin for management, Viewer for read-only)
|
|
305
|
-
3. Store securely
|
|
306
|
-
|
|
307
|
-
## Integration with CI/CD
|
|
308
|
-
|
|
309
|
-
```typescript
|
|
310
|
-
// Add deployment annotation on successful deploy
|
|
311
|
-
if (deploymentSuccess) {
|
|
312
|
-
await grafana.annotations.postAnnotation({
|
|
313
|
-
time: Date.now(),
|
|
314
|
-
tags: ['deployment', process.env.ENVIRONMENT],
|
|
315
|
-
text: `Deployed ${process.env.GIT_SHA} to ${process.env.ENVIRONMENT}`,
|
|
316
|
-
dashboardUid: process.env.GRAFANA_DASHBOARD_UID
|
|
317
|
-
})
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
// Check alerts before deployment
|
|
321
|
-
const alerts = await grafana.alerting.getAlerts({ state: 'alerting' })
|
|
322
|
-
if (alerts.length > 0) {
|
|
323
|
-
console.warn('⚠️ Active alerts detected. Deployment may be risky.')
|
|
324
|
-
}
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
<!-- GRAFANA:END -->
|
|
328
|
-
|
|
1
|
+
<!-- GRAFANA:START -->
|
|
2
|
+
# Grafana MCP Instructions
|
|
3
|
+
|
|
4
|
+
**CRITICAL**: Use MCP Grafana for metrics visualization, alerting, and observability dashboards.
|
|
5
|
+
|
|
6
|
+
## Core Operations
|
|
7
|
+
|
|
8
|
+
### Dashboard Management
|
|
9
|
+
```typescript
|
|
10
|
+
// Get dashboard
|
|
11
|
+
grafana.dashboards.getDashboardByUid({ uid: 'dashboard-uid' })
|
|
12
|
+
|
|
13
|
+
// Create dashboard
|
|
14
|
+
grafana.dashboards.postDashboard({
|
|
15
|
+
dashboard: {
|
|
16
|
+
title: 'Application Metrics',
|
|
17
|
+
tags: ['production', 'api'],
|
|
18
|
+
timezone: 'browser',
|
|
19
|
+
panels: [
|
|
20
|
+
{
|
|
21
|
+
title: 'Request Rate',
|
|
22
|
+
type: 'graph',
|
|
23
|
+
targets: [{ expr: 'rate(http_requests_total[5m])' }]
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
overwrite: false
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
// Update dashboard
|
|
31
|
+
grafana.dashboards.postDashboard({
|
|
32
|
+
dashboard: modifiedDashboard,
|
|
33
|
+
overwrite: true
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
// Delete dashboard
|
|
37
|
+
grafana.dashboards.deleteDashboardByUid({ uid: 'dashboard-uid' })
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Data Sources
|
|
41
|
+
```typescript
|
|
42
|
+
// Get data sources
|
|
43
|
+
grafana.datasources.getDataSources()
|
|
44
|
+
|
|
45
|
+
// Add data source
|
|
46
|
+
grafana.datasources.addDataSource({
|
|
47
|
+
name: 'Prometheus',
|
|
48
|
+
type: 'prometheus',
|
|
49
|
+
url: 'http://prometheus:9090',
|
|
50
|
+
access: 'proxy',
|
|
51
|
+
isDefault: true
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
// Query data source
|
|
55
|
+
grafana.datasources.queryDataSource({
|
|
56
|
+
datasourceId: 1,
|
|
57
|
+
from: Date.now() - 3600000, // 1 hour ago
|
|
58
|
+
to: Date.now(),
|
|
59
|
+
queries: [
|
|
60
|
+
{ expr: 'up', refId: 'A' }
|
|
61
|
+
]
|
|
62
|
+
})
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Alerts
|
|
66
|
+
```typescript
|
|
67
|
+
// Get alerts
|
|
68
|
+
grafana.alerting.getAlerts({ state: 'alerting' })
|
|
69
|
+
|
|
70
|
+
// Create alert rule
|
|
71
|
+
grafana.alerting.postAlertRule({
|
|
72
|
+
title: 'High Error Rate',
|
|
73
|
+
condition: 'A',
|
|
74
|
+
data: [
|
|
75
|
+
{
|
|
76
|
+
refId: 'A',
|
|
77
|
+
queryType: '',
|
|
78
|
+
relativeTimeRange: { from: 600, to: 0 },
|
|
79
|
+
datasourceUid: 'prometheus-uid',
|
|
80
|
+
model: {
|
|
81
|
+
expr: 'rate(http_errors_total[5m]) > 0.05'
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
],
|
|
85
|
+
noDataState: 'NoData',
|
|
86
|
+
execErrState: 'Alerting',
|
|
87
|
+
for: '5m',
|
|
88
|
+
annotations: {
|
|
89
|
+
description: 'Error rate exceeded 5%'
|
|
90
|
+
},
|
|
91
|
+
labels: { severity: 'high' }
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
// Pause alert
|
|
95
|
+
grafana.alerting.pauseAlertRule({ uid: 'alert-uid', paused: true })
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Annotations
|
|
99
|
+
```typescript
|
|
100
|
+
// Create annotation
|
|
101
|
+
grafana.annotations.postAnnotation({
|
|
102
|
+
dashboardUid: 'dashboard-uid',
|
|
103
|
+
time: Date.now(),
|
|
104
|
+
timeEnd: Date.now(),
|
|
105
|
+
tags: ['deployment'],
|
|
106
|
+
text: 'Deployed version 1.2.0'
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
// Get annotations
|
|
110
|
+
grafana.annotations.getAnnotations({
|
|
111
|
+
from: Date.now() - 86400000, // Last 24h
|
|
112
|
+
to: Date.now(),
|
|
113
|
+
tags: ['deployment']
|
|
114
|
+
})
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Organizations & Users
|
|
118
|
+
```typescript
|
|
119
|
+
// Get organization
|
|
120
|
+
grafana.orgs.getOrgByName({ orgName: 'Main Org' })
|
|
121
|
+
|
|
122
|
+
// Add user
|
|
123
|
+
grafana.users.createUser({
|
|
124
|
+
email: 'user@example.com',
|
|
125
|
+
login: 'username',
|
|
126
|
+
password: 'secure-password',
|
|
127
|
+
name: 'User Name'
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
// Update user permissions
|
|
131
|
+
grafana.org.updateOrgUser({
|
|
132
|
+
userId: 123,
|
|
133
|
+
role: 'Editor' // Viewer, Editor, Admin
|
|
134
|
+
})
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Common Patterns
|
|
138
|
+
|
|
139
|
+
### Deployment Tracking
|
|
140
|
+
```typescript
|
|
141
|
+
// Mark deployment on dashboard
|
|
142
|
+
await grafana.annotations.postAnnotation({
|
|
143
|
+
time: Date.now(),
|
|
144
|
+
tags: ['deployment', 'production'],
|
|
145
|
+
text: `Deployed ${process.env.GIT_SHA}`,
|
|
146
|
+
dashboardUid: 'main-dashboard'
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
// Create snapshot after deployment
|
|
150
|
+
const snapshot = await grafana.snapshots.createDashboardSnapshot({
|
|
151
|
+
dashboard: dashboard,
|
|
152
|
+
name: `Production Metrics - ${new Date().toISOString()}`,
|
|
153
|
+
expires: 86400 // 24 hours
|
|
154
|
+
})
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Automated Dashboard Creation
|
|
158
|
+
```typescript
|
|
159
|
+
// Create dashboard for new service
|
|
160
|
+
async function createServiceDashboard(serviceName) {
|
|
161
|
+
const dashboard = {
|
|
162
|
+
title: `${serviceName} Metrics`,
|
|
163
|
+
tags: ['microservices', serviceName],
|
|
164
|
+
panels: [
|
|
165
|
+
{
|
|
166
|
+
title: 'Request Rate',
|
|
167
|
+
type: 'graph',
|
|
168
|
+
targets: [{
|
|
169
|
+
expr: `rate(http_requests_total{service="${serviceName}"}[5m])`
|
|
170
|
+
}]
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
title: 'Error Rate',
|
|
174
|
+
type: 'graph',
|
|
175
|
+
targets: [{
|
|
176
|
+
expr: `rate(http_errors_total{service="${serviceName}"}[5m])`
|
|
177
|
+
}]
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
title: 'Response Time (p95)',
|
|
181
|
+
type: 'graph',
|
|
182
|
+
targets: [{
|
|
183
|
+
expr: `histogram_quantile(0.95, rate(http_duration_seconds_bucket{service="${serviceName}"}[5m]))`
|
|
184
|
+
}]
|
|
185
|
+
}
|
|
186
|
+
]
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return await grafana.dashboards.postDashboard({
|
|
190
|
+
dashboard,
|
|
191
|
+
overwrite: false
|
|
192
|
+
})
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Alert Management
|
|
197
|
+
```typescript
|
|
198
|
+
// Check for firing alerts
|
|
199
|
+
const alerts = await grafana.alerting.getAlerts({ state: 'alerting' })
|
|
200
|
+
|
|
201
|
+
if (alerts.length > 0) {
|
|
202
|
+
console.log(`${alerts.length} alerts firing:`)
|
|
203
|
+
|
|
204
|
+
for (const alert of alerts) {
|
|
205
|
+
console.log(`- ${alert.labels.alertname}: ${alert.annotations.description}`)
|
|
206
|
+
|
|
207
|
+
// Create incident ticket
|
|
208
|
+
await jira.issues.createIssue({
|
|
209
|
+
fields: {
|
|
210
|
+
project: { key: 'OPS' },
|
|
211
|
+
summary: `Alert: ${alert.labels.alertname}`,
|
|
212
|
+
description: alert.annotations.description,
|
|
213
|
+
issuetype: { name: 'Incident' },
|
|
214
|
+
priority: { name: alert.labels.severity === 'critical' ? 'Highest' : 'High' }
|
|
215
|
+
}
|
|
216
|
+
})
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Metrics Reporting
|
|
222
|
+
```typescript
|
|
223
|
+
// Generate daily metrics report
|
|
224
|
+
async function generateDailyReport() {
|
|
225
|
+
const datasourceId = 1 // Prometheus
|
|
226
|
+
const from = Date.now() - 86400000 // 24h ago
|
|
227
|
+
const to = Date.now()
|
|
228
|
+
|
|
229
|
+
// Query metrics
|
|
230
|
+
const requestRate = await grafana.datasources.queryDataSource({
|
|
231
|
+
datasourceId,
|
|
232
|
+
from,
|
|
233
|
+
to,
|
|
234
|
+
queries: [{ expr: 'sum(rate(http_requests_total[24h]))', refId: 'A' }]
|
|
235
|
+
})
|
|
236
|
+
|
|
237
|
+
const errorRate = await grafana.datasources.queryDataSource({
|
|
238
|
+
datasourceId,
|
|
239
|
+
from,
|
|
240
|
+
to,
|
|
241
|
+
queries: [{ expr: 'sum(rate(http_errors_total[24h]))', refId: 'A' }]
|
|
242
|
+
})
|
|
243
|
+
|
|
244
|
+
// Create report
|
|
245
|
+
const report = {
|
|
246
|
+
date: new Date().toISOString(),
|
|
247
|
+
totalRequests: requestRate.results.A.frames[0].data.values[1][0],
|
|
248
|
+
totalErrors: errorRate.results.A.frames[0].data.values[1][0],
|
|
249
|
+
errorPercentage: (totalErrors / totalRequests * 100).toFixed(2)
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Post to Confluence/Notion
|
|
253
|
+
await notion.pages.create({
|
|
254
|
+
parent: { database_id: reportsDbId },
|
|
255
|
+
properties: {
|
|
256
|
+
'Title': { title: [{ text: { content: `Daily Metrics - ${report.date}` } }] },
|
|
257
|
+
'Requests': { number: report.totalRequests },
|
|
258
|
+
'Errors': { number: report.totalErrors },
|
|
259
|
+
'Error Rate': { number: parseFloat(report.errorPercentage) }
|
|
260
|
+
}
|
|
261
|
+
})
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
## Best Practices
|
|
266
|
+
|
|
267
|
+
✅ **DO:**
|
|
268
|
+
- Use dashboard folders for organization
|
|
269
|
+
- Tag dashboards appropriately
|
|
270
|
+
- Set up proper alert thresholds
|
|
271
|
+
- Use variables for flexibility
|
|
272
|
+
- Create snapshots before changes
|
|
273
|
+
- Document dashboard purpose
|
|
274
|
+
- Use templating for multi-instance dashboards
|
|
275
|
+
|
|
276
|
+
❌ **DON'T:**
|
|
277
|
+
- Create duplicate dashboards
|
|
278
|
+
- Set alerts without testing
|
|
279
|
+
- Ignore alert fatigue
|
|
280
|
+
- Hardcode dashboard IDs
|
|
281
|
+
- Skip dashboard backups
|
|
282
|
+
- Over-complicate queries
|
|
283
|
+
|
|
284
|
+
## Configuration
|
|
285
|
+
|
|
286
|
+
```json
|
|
287
|
+
{
|
|
288
|
+
"mcpServers": {
|
|
289
|
+
"grafana": {
|
|
290
|
+
"command": "npx",
|
|
291
|
+
"args": ["-y", "@modelcontextprotocol/server-grafana"],
|
|
292
|
+
"env": {
|
|
293
|
+
"GRAFANA_URL": "http://grafana:3000",
|
|
294
|
+
"GRAFANA_API_KEY": "your-api-key",
|
|
295
|
+
"GRAFANA_ORG_ID": "1"
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**Setup:**
|
|
303
|
+
1. Create API key: Configuration → API Keys → Add API key
|
|
304
|
+
2. Grant appropriate permissions (Admin for management, Viewer for read-only)
|
|
305
|
+
3. Store securely
|
|
306
|
+
|
|
307
|
+
## Integration with CI/CD
|
|
308
|
+
|
|
309
|
+
```typescript
|
|
310
|
+
// Add deployment annotation on successful deploy
|
|
311
|
+
if (deploymentSuccess) {
|
|
312
|
+
await grafana.annotations.postAnnotation({
|
|
313
|
+
time: Date.now(),
|
|
314
|
+
tags: ['deployment', process.env.ENVIRONMENT],
|
|
315
|
+
text: `Deployed ${process.env.GIT_SHA} to ${process.env.ENVIRONMENT}`,
|
|
316
|
+
dashboardUid: process.env.GRAFANA_DASHBOARD_UID
|
|
317
|
+
})
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// Check alerts before deployment
|
|
321
|
+
const alerts = await grafana.alerting.getAlerts({ state: 'alerting' })
|
|
322
|
+
if (alerts.length > 0) {
|
|
323
|
+
console.warn('⚠️ Active alerts detected. Deployment may be risky.')
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
<!-- GRAFANA:END -->
|
|
328
|
+
|