specweave 0.18.0 → 0.20.0
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.md +229 -1817
- package/README.md +68 -0
- package/bin/specweave.js +62 -6
- package/dist/locales/de/.gitkeep +0 -0
- package/dist/locales/de/cli.json +108 -0
- package/dist/locales/en/cli.json +287 -0
- package/dist/locales/en/errors.json +7 -0
- package/dist/locales/en/templates.json +6 -0
- package/dist/locales/es/.gitkeep +0 -0
- package/dist/locales/es/cli.json +41 -0
- package/dist/locales/fr/.gitkeep +0 -0
- package/dist/locales/fr/cli.json +108 -0
- package/dist/locales/ja/.gitkeep +0 -0
- package/dist/locales/ja/cli.json +108 -0
- package/dist/locales/ko/.gitkeep +0 -0
- package/dist/locales/ko/cli.json +108 -0
- package/dist/locales/pt/.gitkeep +0 -0
- package/dist/locales/pt/cli.json +108 -0
- package/dist/locales/ru/.gitkeep +0 -0
- package/dist/locales/ru/cli.json +269 -0
- package/dist/locales/zh/.gitkeep +0 -0
- package/dist/locales/zh/cli.json +108 -0
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts.map +1 -1
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js +3 -0
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js.map +1 -1
- package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts +21 -0
- package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts.map +1 -0
- package/dist/plugins/specweave/lib/hooks/update-ac-status.js +162 -0
- package/dist/plugins/specweave/lib/hooks/update-ac-status.js.map +1 -0
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js +65 -6
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts +25 -0
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js +191 -0
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js.map +1 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.d.ts +112 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.js +301 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.js.map +1 -0
- package/dist/plugins/specweave-github/lib/duplicate-detector.d.ts +3 -3
- package/dist/plugins/specweave-github/lib/duplicate-detector.js +3 -3
- package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts +70 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.js +258 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +14 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.js +51 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts +2 -2
- package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-epic-sync.js +20 -5
- package/dist/plugins/specweave-github/lib/github-epic-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts +87 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.js +412 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js +64 -13
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/progress-comment-builder.d.ts +78 -0
- package/dist/plugins/specweave-github/lib/progress-comment-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/progress-comment-builder.js +237 -0
- package/dist/plugins/specweave-github/lib/progress-comment-builder.js.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.d.ts +97 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.js +301 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.js.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts +83 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.js +386 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.js.map +1 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts +28 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js +156 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.d.ts +57 -0
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.js +248 -0
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.d.ts +82 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.js +13 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.d.ts +49 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.js +316 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.d.ts +70 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.js +23 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.d.ts +85 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.js +281 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.d.ts +75 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.js +238 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.js.map +1 -0
- package/dist/spec-parser.js +629 -0
- package/dist/src/cli/commands/import-docs.js +4 -4
- package/dist/src/cli/commands/import-docs.js.map +1 -1
- package/dist/src/cli/commands/init-multiproject.d.ts.map +1 -1
- package/dist/src/cli/commands/init-multiproject.js +17 -18
- package/dist/src/cli/commands/init-multiproject.js.map +1 -1
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +107 -3
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/migrate-to-multiproject.d.ts.map +1 -1
- package/dist/src/cli/commands/migrate-to-multiproject.js +8 -4
- package/dist/src/cli/commands/migrate-to-multiproject.js.map +1 -1
- package/dist/src/cli/commands/switch-project.d.ts.map +1 -1
- package/dist/src/cli/commands/switch-project.js +9 -26
- package/dist/src/cli/commands/switch-project.js.map +1 -1
- package/dist/src/cli/commands/sync-spec-content.js +3 -0
- package/dist/src/cli/commands/sync-spec-content.js.map +1 -1
- package/dist/src/core/deduplication/command-deduplicator.d.ts +166 -0
- package/dist/src/core/deduplication/command-deduplicator.d.ts.map +1 -0
- package/dist/src/core/deduplication/command-deduplicator.js +254 -0
- package/dist/src/core/deduplication/command-deduplicator.js.map +1 -0
- package/dist/src/core/increment/active-increment-manager.d.ts +42 -15
- package/dist/src/core/increment/active-increment-manager.d.ts.map +1 -1
- package/dist/src/core/increment/active-increment-manager.js +113 -46
- package/dist/src/core/increment/active-increment-manager.js.map +1 -1
- package/dist/src/core/increment/conflict-resolver.d.ts +40 -0
- package/dist/src/core/increment/conflict-resolver.d.ts.map +1 -0
- package/dist/src/core/increment/conflict-resolver.js +219 -0
- package/dist/src/core/increment/conflict-resolver.js.map +1 -0
- package/dist/src/core/increment/discipline-checker.d.ts.map +1 -1
- package/dist/src/core/increment/discipline-checker.js +7 -1
- package/dist/src/core/increment/discipline-checker.js.map +1 -1
- package/dist/src/core/increment/duplicate-detector.d.ts +52 -0
- package/dist/src/core/increment/duplicate-detector.d.ts.map +1 -0
- package/dist/src/core/increment/duplicate-detector.js +276 -0
- package/dist/src/core/increment/duplicate-detector.js.map +1 -0
- package/dist/src/core/increment/increment-archiver.d.ts +90 -0
- package/dist/src/core/increment/increment-archiver.d.ts.map +1 -0
- package/dist/src/core/increment/increment-archiver.js +368 -0
- package/dist/src/core/increment/increment-archiver.js.map +1 -0
- package/dist/src/core/increment/increment-reopener.d.ts +165 -0
- package/dist/src/core/increment/increment-reopener.d.ts.map +1 -0
- package/dist/src/core/increment/increment-reopener.js +390 -0
- package/dist/src/core/increment/increment-reopener.js.map +1 -0
- package/dist/src/core/increment/metadata-manager.d.ts +26 -1
- package/dist/src/core/increment/metadata-manager.d.ts.map +1 -1
- package/dist/src/core/increment/metadata-manager.js +143 -5
- package/dist/src/core/increment/metadata-manager.js.map +1 -1
- package/dist/src/core/increment/recent-work-scanner.d.ts +121 -0
- package/dist/src/core/increment/recent-work-scanner.d.ts.map +1 -0
- package/dist/src/core/increment/recent-work-scanner.js +303 -0
- package/dist/src/core/increment/recent-work-scanner.js.map +1 -0
- package/dist/src/core/increment/types.d.ts +1 -0
- package/dist/src/core/increment/types.d.ts.map +1 -1
- package/dist/src/core/increment-utils.d.ts +112 -0
- package/dist/src/core/increment-utils.d.ts.map +1 -0
- package/dist/src/core/increment-utils.js +210 -0
- package/dist/src/core/increment-utils.js.map +1 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.d.ts +65 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.js +175 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.js.map +1 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts +130 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -0
- package/dist/src/core/living-docs/feature-archiver.js +549 -0
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -0
- package/dist/src/core/living-docs/feature-id-manager.d.ts +81 -0
- package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -0
- package/dist/src/core/living-docs/feature-id-manager.js +339 -0
- package/dist/src/core/living-docs/feature-id-manager.js.map +1 -0
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts +144 -83
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -1
- package/dist/src/core/living-docs/hierarchy-mapper.js +488 -270
- package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
- package/dist/src/core/living-docs/index.d.ts +6 -0
- package/dist/src/core/living-docs/index.d.ts.map +1 -1
- package/dist/src/core/living-docs/index.js +6 -0
- package/dist/src/core/living-docs/index.js.map +1 -1
- package/dist/src/core/living-docs/project-detector.d.ts +6 -0
- package/dist/src/core/living-docs/project-detector.d.ts.map +1 -1
- package/dist/src/core/living-docs/project-detector.js +35 -1
- package/dist/src/core/living-docs/project-detector.js.map +1 -1
- package/dist/src/core/living-docs/spec-distributor.d.ts +100 -26
- package/dist/src/core/living-docs/spec-distributor.d.ts.map +1 -1
- package/dist/src/core/living-docs/spec-distributor.js +1275 -258
- package/dist/src/core/living-docs/spec-distributor.js.map +1 -1
- package/dist/src/core/living-docs/task-project-specific-generator.d.ts +109 -0
- package/dist/src/core/living-docs/task-project-specific-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/task-project-specific-generator.js +221 -0
- package/dist/src/core/living-docs/task-project-specific-generator.js.map +1 -0
- package/dist/src/core/living-docs/types.d.ts +143 -0
- package/dist/src/core/living-docs/types.d.ts.map +1 -1
- package/dist/src/core/project-manager.d.ts +2 -17
- package/dist/src/core/project-manager.d.ts.map +1 -1
- package/dist/src/core/project-manager.js +68 -48
- package/dist/src/core/project-manager.js.map +1 -1
- package/dist/src/core/spec-content-sync.d.ts +1 -1
- package/dist/src/core/spec-content-sync.d.ts.map +1 -1
- package/dist/src/core/sync/enhanced-content-builder.d.ts +32 -54
- package/dist/src/core/sync/enhanced-content-builder.d.ts.map +1 -1
- package/dist/src/core/sync/enhanced-content-builder.js +142 -138
- package/dist/src/core/sync/enhanced-content-builder.js.map +1 -1
- package/dist/src/core/sync/performance-optimizer.d.ts +153 -0
- package/dist/src/core/sync/performance-optimizer.d.ts.map +1 -0
- package/dist/src/core/sync/performance-optimizer.js +220 -0
- package/dist/src/core/sync/performance-optimizer.js.map +1 -0
- package/dist/src/core/sync/retry-handler.d.ts +98 -0
- package/dist/src/core/sync/retry-handler.d.ts.map +1 -0
- package/dist/src/core/sync/retry-handler.js +196 -0
- package/dist/src/core/sync/retry-handler.js.map +1 -0
- package/dist/src/core/sync/spec-content-sync.d.ts +88 -0
- package/dist/src/core/sync/spec-content-sync.d.ts.map +1 -0
- package/dist/src/core/sync/spec-content-sync.js +5 -0
- package/dist/src/core/sync/spec-content-sync.js.map +1 -0
- package/dist/src/core/sync/types.d.ts +52 -0
- package/dist/src/core/sync/types.d.ts.map +1 -0
- package/dist/src/core/sync/types.js +5 -0
- package/dist/src/core/sync/types.js.map +1 -0
- package/dist/src/core/types/config.d.ts +125 -0
- package/dist/src/core/types/config.d.ts.map +1 -1
- package/dist/src/core/types/config.js +25 -0
- package/dist/src/core/types/config.js.map +1 -1
- package/dist/src/core/types/increment-metadata.d.ts +10 -0
- package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
- package/dist/src/core/types/increment-metadata.js +10 -1
- package/dist/src/core/types/increment-metadata.js.map +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.js +4 -8
- package/dist/src/integrations/jira/jira-incremental-mapper.js.map +1 -1
- package/dist/src/integrations/jira/jira-mapper.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-mapper.js +4 -8
- package/dist/src/integrations/jira/jira-mapper.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +1 -1
- package/plugins/specweave/COMMANDS.md +13 -4
- package/plugins/specweave/agents/pm/AGENT.md +159 -12
- package/plugins/specweave/commands/specweave-abandon.md +22 -20
- package/plugins/specweave/commands/specweave-archive-features.md +121 -0
- package/plugins/specweave/commands/specweave-archive-increments.md +82 -0
- package/plugins/specweave/commands/specweave-archive.md +363 -0
- package/plugins/specweave/commands/specweave-backlog.md +211 -0
- package/plugins/specweave/commands/specweave-fix-duplicates.md +517 -0
- package/plugins/specweave/commands/specweave-increment.md +4 -3
- package/plugins/specweave/commands/specweave-progress.md +176 -27
- package/plugins/specweave/commands/specweave-reopen.md +391 -0
- package/plugins/specweave/commands/specweave-restore-feature.md +90 -0
- package/plugins/specweave/commands/specweave-restore.md +309 -0
- package/plugins/specweave/commands/specweave-resume.md +51 -23
- package/plugins/specweave/commands/specweave-status.md +41 -7
- package/plugins/specweave/commands/specweave-sync-specs.md +425 -0
- package/plugins/specweave/commands/specweave.md +70 -405
- package/plugins/specweave/hooks/hooks.json +4 -0
- package/plugins/specweave/hooks/lib/sync-spec-content.sh +2 -2
- package/plugins/specweave/hooks/post-increment-planning.sh +26 -2
- package/plugins/specweave/hooks/post-task-completion.sh +39 -0
- package/plugins/specweave/hooks/pre-command-deduplication.sh +83 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh +1 -1
- package/plugins/specweave/lib/hooks/sync-living-docs.js +2 -0
- package/plugins/specweave/lib/hooks/sync-living-docs.ts +4 -0
- package/plugins/specweave/lib/hooks/update-ac-status.js +102 -0
- package/plugins/specweave/lib/hooks/update-ac-status.ts +192 -0
- package/plugins/specweave/skills/archive-increments/SKILL.md +198 -0
- package/plugins/specweave/skills/increment-planner/scripts/feature-utils.js +14 -0
- package/plugins/specweave/skills/smart-reopen-detector/SKILL.md +244 -0
- package/plugins/specweave-ado/lib/ado-spec-content-sync.js +49 -5
- package/plugins/specweave-ado/lib/ado-spec-content-sync.ts +72 -6
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +170 -0
- package/plugins/specweave-confluent/.claude-plugin/plugin.json +23 -0
- package/plugins/specweave-confluent/README.md +375 -0
- package/plugins/specweave-confluent/agents/confluent-architect/AGENT.md +306 -0
- package/plugins/specweave-confluent/skills/confluent-kafka-connect/SKILL.md +453 -0
- package/plugins/specweave-confluent/skills/confluent-ksqldb/SKILL.md +470 -0
- package/plugins/specweave-confluent/skills/confluent-schema-registry/SKILL.md +316 -0
- package/plugins/specweave-github/agents/github-task-splitter/AGENT.md +2 -2
- package/plugins/specweave-github/agents/user-story-updater/AGENT.md +148 -0
- package/plugins/specweave-github/commands/specweave-github-cleanup-duplicates.md +1 -1
- package/plugins/specweave-github/commands/specweave-github-update-user-story.md +156 -0
- package/plugins/specweave-github/hooks/post-task-completion.sh +42 -9
- package/plugins/specweave-github/lib/completion-calculator.js +262 -0
- package/plugins/specweave-github/lib/completion-calculator.ts +434 -0
- package/plugins/specweave-github/lib/duplicate-detector.js +3 -3
- package/plugins/specweave-github/lib/duplicate-detector.ts +4 -4
- package/plugins/specweave-github/lib/epic-content-builder.js +265 -0
- package/plugins/specweave-github/lib/epic-content-builder.ts +376 -0
- package/plugins/specweave-github/lib/github-client-v2.js +49 -0
- package/plugins/specweave-github/lib/github-client-v2.ts +59 -0
- package/plugins/specweave-github/lib/github-epic-sync.js +23 -24
- package/plugins/specweave-github/lib/github-epic-sync.ts +30 -5
- package/plugins/specweave-github/lib/github-feature-sync.js +381 -0
- package/plugins/specweave-github/lib/github-feature-sync.ts +568 -0
- package/plugins/specweave-github/lib/github-spec-content-sync.js +40 -10
- package/plugins/specweave-github/lib/github-spec-content-sync.ts +82 -14
- package/plugins/specweave-github/lib/progress-comment-builder.js +229 -0
- package/plugins/specweave-github/lib/progress-comment-builder.ts +324 -0
- package/plugins/specweave-github/lib/user-story-content-builder.js +299 -0
- package/plugins/specweave-github/lib/user-story-content-builder.ts +413 -0
- package/plugins/specweave-github/lib/user-story-issue-builder.js +344 -0
- package/plugins/specweave-github/lib/user-story-issue-builder.ts +543 -0
- package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +189 -0
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +134 -0
- package/plugins/specweave-jira/lib/{enhanced-jira-sync.ts.disabled → enhanced-jira-sync.ts} +26 -52
- package/plugins/specweave-kafka/.claude-plugin/plugin.json +26 -0
- package/plugins/specweave-kafka/IMPLEMENTATION-COMPLETE.md +483 -0
- package/plugins/specweave-kafka/README.md +242 -0
- package/plugins/specweave-kafka/agents/kafka-architect/AGENT.md +235 -0
- package/plugins/specweave-kafka/agents/kafka-devops/AGENT.md +209 -0
- package/plugins/specweave-kafka/agents/kafka-observability/AGENT.md +266 -0
- package/plugins/specweave-kafka/commands/deploy.md +99 -0
- package/plugins/specweave-kafka/commands/dev-env.md +176 -0
- package/plugins/specweave-kafka/commands/mcp-configure.md +101 -0
- package/plugins/specweave-kafka/commands/monitor-setup.md +96 -0
- package/plugins/specweave-kafka/docker/kafka-local/docker-compose.yml +187 -0
- package/plugins/specweave-kafka/docker/redpanda/docker-compose.yml +199 -0
- package/plugins/specweave-kafka/docker/templates/consumer-nodejs.js +225 -0
- package/plugins/specweave-kafka/docker/templates/consumer-python.py +220 -0
- package/plugins/specweave-kafka/docker/templates/producer-nodejs.js +168 -0
- package/plugins/specweave-kafka/docker/templates/producer-python.py +167 -0
- package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.js +438 -0
- package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.ts +541 -0
- package/plugins/specweave-kafka/lib/adapters/platform-adapter.js +47 -0
- package/plugins/specweave-kafka/lib/adapters/platform-adapter.ts +343 -0
- package/plugins/specweave-kafka/lib/cli/kcat-wrapper.js +258 -0
- package/plugins/specweave-kafka/lib/cli/kcat-wrapper.ts +298 -0
- package/plugins/specweave-kafka/lib/cli/types.js +10 -0
- package/plugins/specweave-kafka/lib/cli/types.ts +92 -0
- package/plugins/specweave-kafka/lib/connectors/connector-catalog.js +305 -0
- package/plugins/specweave-kafka/lib/connectors/connector-catalog.ts +528 -0
- package/plugins/specweave-kafka/lib/documentation/diagram-generator.js +114 -0
- package/plugins/specweave-kafka/lib/documentation/diagram-generator.ts +195 -0
- package/plugins/specweave-kafka/lib/documentation/exporter.js +210 -0
- package/plugins/specweave-kafka/lib/documentation/exporter.ts +338 -0
- package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.js +60 -0
- package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.ts +130 -0
- package/plugins/specweave-kafka/lib/documentation/topology-generator.js +143 -0
- package/plugins/specweave-kafka/lib/documentation/topology-generator.ts +290 -0
- package/plugins/specweave-kafka/lib/mcp/detector.js +298 -0
- package/plugins/specweave-kafka/lib/mcp/detector.ts +352 -0
- package/plugins/specweave-kafka/lib/mcp/types.js +21 -0
- package/plugins/specweave-kafka/lib/mcp/types.ts +77 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.js +193 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.ts +362 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.js +188 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.ts +359 -0
- package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.js +195 -0
- package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.ts +380 -0
- package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.js +209 -0
- package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.ts +358 -0
- package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.js +354 -0
- package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.ts +563 -0
- package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.js +259 -0
- package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.ts +516 -0
- package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.js +233 -0
- package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.ts +423 -0
- package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.js +266 -0
- package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.ts +445 -0
- package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.js +312 -0
- package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.ts +561 -0
- package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.js +289 -0
- package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.ts +607 -0
- package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.js +264 -0
- package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.ts +498 -0
- package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.js +263 -0
- package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.ts +549 -0
- package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.js +205 -0
- package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.ts +399 -0
- package/plugins/specweave-kafka/lib/performance/performance-optimizer.js +249 -0
- package/plugins/specweave-kafka/lib/performance/performance-optimizer.ts +427 -0
- package/plugins/specweave-kafka/lib/security/kafka-security.js +252 -0
- package/plugins/specweave-kafka/lib/security/kafka-security.ts +494 -0
- package/plugins/specweave-kafka/lib/utils/capacity-planner.js +203 -0
- package/plugins/specweave-kafka/lib/utils/capacity-planner.ts +469 -0
- package/plugins/specweave-kafka/lib/utils/config-validator.js +419 -0
- package/plugins/specweave-kafka/lib/utils/config-validator.ts +564 -0
- package/plugins/specweave-kafka/lib/utils/partitioning.js +329 -0
- package/plugins/specweave-kafka/lib/utils/partitioning.ts +473 -0
- package/plugins/specweave-kafka/lib/utils/sizing.js +221 -0
- package/plugins/specweave-kafka/lib/utils/sizing.ts +374 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-broker-metrics.json +628 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-cluster-overview.json +564 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-consumer-lag.json +509 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-jvm-metrics.json +674 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-topic-metrics.json +578 -0
- package/plugins/specweave-kafka/monitoring/grafana/provisioning/dashboards/kafka.yml +17 -0
- package/plugins/specweave-kafka/monitoring/grafana/provisioning/datasources/prometheus.yml +17 -0
- package/plugins/specweave-kafka/monitoring/prometheus/kafka-alerts.yml +415 -0
- package/plugins/specweave-kafka/monitoring/prometheus/kafka-jmx-exporter.yml +256 -0
- package/plugins/specweave-kafka/package.json +41 -0
- package/plugins/specweave-kafka/skills/kafka-architecture/SKILL.md +647 -0
- package/plugins/specweave-kafka/skills/kafka-cli-tools/SKILL.md +433 -0
- package/plugins/specweave-kafka/skills/kafka-iac-deployment/SKILL.md +449 -0
- package/plugins/specweave-kafka/skills/kafka-kubernetes/SKILL.md +667 -0
- package/plugins/specweave-kafka/skills/kafka-mcp-integration/SKILL.md +273 -0
- package/plugins/specweave-kafka/skills/kafka-observability/SKILL.md +576 -0
- package/plugins/specweave-kafka/templates/config/broker-production.properties +254 -0
- package/plugins/specweave-kafka/templates/config/consumer-low-latency.properties +112 -0
- package/plugins/specweave-kafka/templates/config/producer-high-throughput.properties +120 -0
- package/plugins/specweave-kafka/templates/migration/mirrormaker2-config.properties +234 -0
- package/plugins/specweave-kafka/templates/monitoring/grafana/multi-cluster-dashboard.json +686 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/main.tf +347 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/outputs.tf +107 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/templates/kafka-broker-init.sh.tpl +216 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/variables.tf +156 -0
- package/plugins/specweave-kafka/terraform/aws-msk/main.tf +362 -0
- package/plugins/specweave-kafka/terraform/aws-msk/outputs.tf +93 -0
- package/plugins/specweave-kafka/terraform/aws-msk/templates/server.properties.tpl +32 -0
- package/plugins/specweave-kafka/terraform/aws-msk/variables.tf +235 -0
- package/plugins/specweave-kafka/terraform/azure-event-hubs/main.tf +281 -0
- package/plugins/specweave-kafka/terraform/azure-event-hubs/outputs.tf +118 -0
- package/plugins/specweave-kafka/terraform/azure-event-hubs/variables.tf +148 -0
- package/plugins/specweave-kafka/tsconfig.json +21 -0
- package/plugins/specweave-kafka-streams/.claude-plugin/plugin.json +23 -0
- package/plugins/specweave-kafka-streams/README.md +310 -0
- package/plugins/specweave-kafka-streams/skills/kafka-streams-topology/SKILL.md +539 -0
- package/plugins/specweave-n8n/.claude-plugin/plugin.json +22 -0
- package/plugins/specweave-n8n/README.md +354 -0
- package/plugins/specweave-n8n/skills/n8n-kafka-workflows/SKILL.md +504 -0
- package/plugins/specweave-release/commands/specweave-release-platform.md +1 -1
- package/plugins/specweave-release/hooks/post-task-completion.sh +2 -2
- package/src/templates/AGENTS.md.template +601 -7
- package/src/templates/CLAUDE.md.template +188 -88
- package/plugins/specweave-ado/commands/specweave-ado-sync-spec.md +0 -255
- package/plugins/specweave-github/commands/specweave-github-sync-epic.md +0 -248
- package/plugins/specweave-github/commands/specweave-github-sync-from.md +0 -147
- package/plugins/specweave-github/commands/specweave-github-sync-spec.md +0 -208
- package/plugins/specweave-github/commands/specweave-github-sync-tasks.md +0 -530
- package/plugins/specweave-jira/commands/specweave-jira-sync-epic.md +0 -267
- package/plugins/specweave-jira/commands/specweave-jira-sync-spec.md +0 -240
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
# ==================================================
|
|
2
|
+
# Prometheus Alerting Rules for Apache Kafka
|
|
3
|
+
# ==================================================
|
|
4
|
+
#
|
|
5
|
+
# Usage (Kubernetes):
|
|
6
|
+
# kubectl apply -f kafka-alerts.yml
|
|
7
|
+
#
|
|
8
|
+
# Usage (Prometheus standalone):
|
|
9
|
+
# Copy to /etc/prometheus/rules/kafka-alerts.yml
|
|
10
|
+
# Add to prometheus.yml:
|
|
11
|
+
# rule_files:
|
|
12
|
+
# - "rules/kafka-alerts.yml"
|
|
13
|
+
# Reload: kill -HUP $(pidof prometheus)
|
|
14
|
+
|
|
15
|
+
apiVersion: monitoring.coreos.com/v1
|
|
16
|
+
kind: PrometheusRule
|
|
17
|
+
metadata:
|
|
18
|
+
name: kafka-alerts
|
|
19
|
+
namespace: monitoring
|
|
20
|
+
labels:
|
|
21
|
+
app: kafka
|
|
22
|
+
prometheus: kube-prometheus
|
|
23
|
+
spec:
|
|
24
|
+
groups:
|
|
25
|
+
# ==================================================
|
|
26
|
+
# Group 1: CRITICAL Alerts (Immediate Action Required)
|
|
27
|
+
# ==================================================
|
|
28
|
+
- name: kafka.critical
|
|
29
|
+
interval: 30s
|
|
30
|
+
rules:
|
|
31
|
+
# ALERT 1: Under-Replicated Partitions
|
|
32
|
+
- alert: KafkaUnderReplicatedPartitions
|
|
33
|
+
expr: sum(kafka_server_replica_manager_under_replicated_partitions) > 0
|
|
34
|
+
for: 5m
|
|
35
|
+
labels:
|
|
36
|
+
severity: critical
|
|
37
|
+
component: kafka
|
|
38
|
+
alert_type: data_loss_risk
|
|
39
|
+
annotations:
|
|
40
|
+
summary: "Kafka has under-replicated partitions ({{ $value }} partitions)"
|
|
41
|
+
description: |
|
|
42
|
+
**CRITICAL**: {{ $value }} partitions are under-replicated.
|
|
43
|
+
|
|
44
|
+
**Impact**: Data loss risk if broker fails.
|
|
45
|
+
**Possible Causes**:
|
|
46
|
+
- Broker down or unreachable
|
|
47
|
+
- Network issues between brokers
|
|
48
|
+
- High replication lag
|
|
49
|
+
- Disk I/O saturation
|
|
50
|
+
|
|
51
|
+
**Action**:
|
|
52
|
+
1. Check broker status: `kubectl get pods -n kafka` (K8s) or `systemctl status kafka` (VM)
|
|
53
|
+
2. Check network connectivity between brokers
|
|
54
|
+
3. Check disk I/O: `iostat -x 1`
|
|
55
|
+
4. Check broker logs for errors
|
|
56
|
+
runbook_url: "https://kafka.apache.org/documentation/#replication"
|
|
57
|
+
|
|
58
|
+
# ALERT 2: Offline Partitions
|
|
59
|
+
- alert: KafkaOfflinePartitions
|
|
60
|
+
expr: kafka_controller_offline_partitions_count > 0
|
|
61
|
+
for: 1m
|
|
62
|
+
labels:
|
|
63
|
+
severity: critical
|
|
64
|
+
component: kafka
|
|
65
|
+
alert_type: service_degradation
|
|
66
|
+
annotations:
|
|
67
|
+
summary: "Kafka has offline partitions ({{ $value }} partitions)"
|
|
68
|
+
description: |
|
|
69
|
+
**CRITICAL**: {{ $value }} partitions are OFFLINE (no in-sync replicas).
|
|
70
|
+
|
|
71
|
+
**Impact**: Complete data loss for these partitions! Producers/consumers cannot access them.
|
|
72
|
+
**Possible Causes**:
|
|
73
|
+
- All replicas for partition are down
|
|
74
|
+
- Unclean leader election disabled (good) but no ISR available
|
|
75
|
+
- Disk corruption
|
|
76
|
+
|
|
77
|
+
**Action**:
|
|
78
|
+
1. Identify offline partitions: `kafka-topics.sh --describe --under-min-isr-partitions`
|
|
79
|
+
2. Check broker logs for failures
|
|
80
|
+
3. Restart failed brokers if safe
|
|
81
|
+
4. As last resort: Enable unclean.leader.election.enable=true (DATA LOSS!)
|
|
82
|
+
runbook_url: "https://kafka.apache.org/documentation/#design_ha"
|
|
83
|
+
|
|
84
|
+
# ALERT 3: No Active Controller
|
|
85
|
+
- alert: KafkaNoActiveController
|
|
86
|
+
expr: kafka_controller_active_controller_count == 0
|
|
87
|
+
for: 1m
|
|
88
|
+
labels:
|
|
89
|
+
severity: critical
|
|
90
|
+
component: kafka
|
|
91
|
+
alert_type: cluster_unavailable
|
|
92
|
+
annotations:
|
|
93
|
+
summary: "No active Kafka controller in cluster"
|
|
94
|
+
description: |
|
|
95
|
+
**CRITICAL**: Cluster has NO active controller.
|
|
96
|
+
|
|
97
|
+
**Impact**: Cannot perform:
|
|
98
|
+
- Topic creation/deletion
|
|
99
|
+
- Partition reassignment
|
|
100
|
+
- Preferred leader election
|
|
101
|
+
- Metadata updates
|
|
102
|
+
|
|
103
|
+
**Possible Causes**:
|
|
104
|
+
- Controller broker crashed
|
|
105
|
+
- ZooKeeper connection lost (if using ZooKeeper mode)
|
|
106
|
+
- Split-brain scenario
|
|
107
|
+
|
|
108
|
+
**Action**:
|
|
109
|
+
1. Check all broker status
|
|
110
|
+
2. Check ZooKeeper status (if not KRaft mode)
|
|
111
|
+
3. Check broker logs for controller election messages
|
|
112
|
+
4. Restart brokers in sequence if needed
|
|
113
|
+
runbook_url: "https://kafka.apache.org/documentation/#controller"
|
|
114
|
+
|
|
115
|
+
# ALERT 4: Multiple Active Controllers
|
|
116
|
+
- alert: KafkaMultipleActiveControllers
|
|
117
|
+
expr: kafka_controller_active_controller_count > 1
|
|
118
|
+
for: 1m
|
|
119
|
+
labels:
|
|
120
|
+
severity: critical
|
|
121
|
+
component: kafka
|
|
122
|
+
alert_type: split_brain
|
|
123
|
+
annotations:
|
|
124
|
+
summary: "Multiple active controllers detected ({{ $value }} controllers)"
|
|
125
|
+
description: |
|
|
126
|
+
**CRITICAL**: {{ $value }} controllers are active (should be exactly 1).
|
|
127
|
+
|
|
128
|
+
**Impact**: Split-brain! Conflicting metadata updates, undefined behavior.
|
|
129
|
+
**Possible Causes**:
|
|
130
|
+
- Network partition
|
|
131
|
+
- ZooKeeper issues (if not KRaft mode)
|
|
132
|
+
- KRaft quorum issues
|
|
133
|
+
|
|
134
|
+
**Action**:
|
|
135
|
+
1. STOP all operations immediately
|
|
136
|
+
2. Check network partitioning
|
|
137
|
+
3. Identify which controller is legitimate
|
|
138
|
+
4. Restart non-legitimate controllers
|
|
139
|
+
5. Verify only 1 active controller: `kafka-broker-api-versions.sh --bootstrap-server :9092`
|
|
140
|
+
runbook_url: "https://kafka.apache.org/documentation/#controller"
|
|
141
|
+
|
|
142
|
+
# ALERT 5: Unclean Leader Elections
|
|
143
|
+
- alert: KafkaUncleanLeaderElections
|
|
144
|
+
expr: sum(rate(kafka_controller_unclean_leader_elections_total[5m])) > 0
|
|
145
|
+
for: 1m
|
|
146
|
+
labels:
|
|
147
|
+
severity: critical
|
|
148
|
+
component: kafka
|
|
149
|
+
alert_type: data_loss
|
|
150
|
+
annotations:
|
|
151
|
+
summary: "Unclean leader elections detected ({{ $value }}/sec)"
|
|
152
|
+
description: |
|
|
153
|
+
**CRITICAL**: Unclean leader elections are happening.
|
|
154
|
+
|
|
155
|
+
**Impact**: DATA LOSS! Partition leader elected from out-of-sync replica.
|
|
156
|
+
**Possible Causes**:
|
|
157
|
+
- unclean.leader.election.enable=true (should be false in production!)
|
|
158
|
+
- All ISRs went down, cluster elected non-ISR as leader
|
|
159
|
+
|
|
160
|
+
**Action**:
|
|
161
|
+
1. **DO NOT** set unclean.leader.election.enable=true in production
|
|
162
|
+
2. Investigate why all ISRs went down
|
|
163
|
+
3. Check broker logs for failures
|
|
164
|
+
4. Review replication.factor and min.insync.replicas settings
|
|
165
|
+
runbook_url: "https://kafka.apache.org/documentation/#design_ha"
|
|
166
|
+
|
|
167
|
+
# ==================================================
|
|
168
|
+
# Group 2: HIGH Priority Alerts (Action Within Hours)
|
|
169
|
+
# ==================================================
|
|
170
|
+
- name: kafka.high
|
|
171
|
+
interval: 30s
|
|
172
|
+
rules:
|
|
173
|
+
# ALERT 6: High Consumer Lag
|
|
174
|
+
- alert: KafkaConsumerLagHigh
|
|
175
|
+
expr: sum by (consumergroup) (kafka_consumergroup_lag) > 10000
|
|
176
|
+
for: 10m
|
|
177
|
+
labels:
|
|
178
|
+
severity: high
|
|
179
|
+
component: kafka
|
|
180
|
+
alert_type: performance_degradation
|
|
181
|
+
annotations:
|
|
182
|
+
summary: "Consumer group '{{ $labels.consumergroup }}' has high lag ({{ $value }} messages)"
|
|
183
|
+
description: |
|
|
184
|
+
**HIGH**: Consumer group is falling behind.
|
|
185
|
+
|
|
186
|
+
**Impact**: Delayed processing, stale data, potential timeout issues.
|
|
187
|
+
**Possible Causes**:
|
|
188
|
+
- Consumer processing too slow
|
|
189
|
+
- Insufficient consumer instances
|
|
190
|
+
- Network issues
|
|
191
|
+
- Partition imbalance
|
|
192
|
+
|
|
193
|
+
**Action**:
|
|
194
|
+
1. Check consumer logs for errors
|
|
195
|
+
2. Scale up consumer instances
|
|
196
|
+
3. Optimize consumer processing logic
|
|
197
|
+
4. Check partition distribution: `kafka-consumer-groups.sh --describe --group {{ $labels.consumergroup }}`
|
|
198
|
+
threshold: 10000 messages
|
|
199
|
+
runbook_url: "https://kafka.apache.org/documentation/#consumerconfigs"
|
|
200
|
+
|
|
201
|
+
# ALERT 7: ISR Shrinks (High Rate)
|
|
202
|
+
- alert: KafkaISRShrinksHigh
|
|
203
|
+
expr: sum(rate(kafka_server_replica_manager_isr_shrinks_total[5m])) > 5
|
|
204
|
+
for: 5m
|
|
205
|
+
labels:
|
|
206
|
+
severity: high
|
|
207
|
+
component: kafka
|
|
208
|
+
alert_type: replication_issue
|
|
209
|
+
annotations:
|
|
210
|
+
summary: "High rate of ISR shrinks ({{ $value }}/sec)"
|
|
211
|
+
description: |
|
|
212
|
+
**HIGH**: Replicas are frequently falling out of sync.
|
|
213
|
+
|
|
214
|
+
**Impact**: Reduced fault tolerance, potential under-replication.
|
|
215
|
+
**Possible Causes**:
|
|
216
|
+
- Network instability
|
|
217
|
+
- Slow disk I/O
|
|
218
|
+
- Overloaded brokers
|
|
219
|
+
- High producer throughput
|
|
220
|
+
|
|
221
|
+
**Action**:
|
|
222
|
+
1. Check network latency between brokers
|
|
223
|
+
2. Check disk I/O: `iostat -x 1`
|
|
224
|
+
3. Review broker CPU/memory usage
|
|
225
|
+
4. Consider increasing replica.fetch.max.bytes
|
|
226
|
+
runbook_url: "https://kafka.apache.org/documentation/#replication"
|
|
227
|
+
|
|
228
|
+
# ALERT 8: Leader Election Rate High
|
|
229
|
+
- alert: KafkaLeaderElectionRateHigh
|
|
230
|
+
expr: sum(rate(kafka_controller_leader_election_total[5m])) > 0.5
|
|
231
|
+
for: 5m
|
|
232
|
+
labels:
|
|
233
|
+
severity: high
|
|
234
|
+
component: kafka
|
|
235
|
+
alert_type: cluster_instability
|
|
236
|
+
annotations:
|
|
237
|
+
summary: "High leader election rate ({{ $value }}/sec)"
|
|
238
|
+
description: |
|
|
239
|
+
**HIGH**: Frequent leader elections indicate cluster instability.
|
|
240
|
+
|
|
241
|
+
**Impact**: Increased latency, potential client errors during elections.
|
|
242
|
+
**Possible Causes**:
|
|
243
|
+
- Broker failures/restarts
|
|
244
|
+
- Network issues
|
|
245
|
+
- ZooKeeper issues (if not KRaft)
|
|
246
|
+
- Auto leader rebalancing enabled
|
|
247
|
+
|
|
248
|
+
**Action**:
|
|
249
|
+
1. Check broker uptime and logs
|
|
250
|
+
2. Disable auto.leader.rebalance.enable if enabled
|
|
251
|
+
3. Check network stability
|
|
252
|
+
4. Review recent broker restarts
|
|
253
|
+
runbook_url: "https://kafka.apache.org/documentation/#controller"
|
|
254
|
+
|
|
255
|
+
# ==================================================
|
|
256
|
+
# Group 3: WARNING Alerts (Action Within Days)
|
|
257
|
+
# ==================================================
|
|
258
|
+
- name: kafka.warning
|
|
259
|
+
interval: 30s
|
|
260
|
+
rules:
|
|
261
|
+
# ALERT 9: Broker High CPU
|
|
262
|
+
- alert: KafkaBrokerHighCPU
|
|
263
|
+
expr: os_process_cpu_load{job="kafka"} > 0.8
|
|
264
|
+
for: 5m
|
|
265
|
+
labels:
|
|
266
|
+
severity: warning
|
|
267
|
+
component: kafka
|
|
268
|
+
alert_type: resource_saturation
|
|
269
|
+
annotations:
|
|
270
|
+
summary: "Broker {{ $labels.instance }} has high CPU usage ({{ $value | humanizePercentage }})"
|
|
271
|
+
description: |
|
|
272
|
+
**WARNING**: Broker CPU usage is high.
|
|
273
|
+
|
|
274
|
+
**Impact**: Slower request processing, potential client timeouts.
|
|
275
|
+
**Possible Causes**:
|
|
276
|
+
- High message throughput
|
|
277
|
+
- Complex consumer queries
|
|
278
|
+
- Insufficient brokers for load
|
|
279
|
+
|
|
280
|
+
**Action**:
|
|
281
|
+
1. Review broker metrics for throughput spikes
|
|
282
|
+
2. Consider scaling horizontally (add brokers)
|
|
283
|
+
3. Optimize producer/consumer configurations
|
|
284
|
+
4. Review compaction settings (if using log compaction)
|
|
285
|
+
threshold: 80%
|
|
286
|
+
|
|
287
|
+
# ALERT 10: Broker Low Heap Memory
|
|
288
|
+
- alert: KafkaBrokerLowHeapMemory
|
|
289
|
+
expr: jvm_memory_heap_used_bytes{job="kafka"} / jvm_memory_heap_max_bytes{job="kafka"} > 0.85
|
|
290
|
+
for: 5m
|
|
291
|
+
labels:
|
|
292
|
+
severity: warning
|
|
293
|
+
component: kafka
|
|
294
|
+
alert_type: memory_pressure
|
|
295
|
+
annotations:
|
|
296
|
+
summary: "Broker {{ $labels.instance }} has low heap memory ({{ $value | humanizePercentage }})"
|
|
297
|
+
description: |
|
|
298
|
+
**WARNING**: JVM heap usage is high.
|
|
299
|
+
|
|
300
|
+
**Impact**: Risk of OutOfMemoryError, frequent GC pauses.
|
|
301
|
+
**Possible Causes**:
|
|
302
|
+
- Too many partitions per broker
|
|
303
|
+
- High message cache usage
|
|
304
|
+
- Memory leak (rare)
|
|
305
|
+
|
|
306
|
+
**Action**:
|
|
307
|
+
1. Increase JVM heap: -Xmx (up to 50% of system RAM, leave room for page cache)
|
|
308
|
+
2. Reduce partitions per broker
|
|
309
|
+
3. Monitor GC metrics
|
|
310
|
+
4. Review log.segment.bytes and segment.ms settings
|
|
311
|
+
threshold: 85%
|
|
312
|
+
|
|
313
|
+
# ALERT 11: High GC Time
|
|
314
|
+
- alert: KafkaBrokerHighGCTime
|
|
315
|
+
expr: rate(jvm_gc_collection_time_ms_total{job="kafka"}[5m]) > 500
|
|
316
|
+
for: 5m
|
|
317
|
+
labels:
|
|
318
|
+
severity: warning
|
|
319
|
+
component: kafka
|
|
320
|
+
alert_type: gc_pressure
|
|
321
|
+
annotations:
|
|
322
|
+
summary: "Broker {{ $labels.instance }} spending too much time in GC ({{ $value }}ms/sec)"
|
|
323
|
+
description: |
|
|
324
|
+
**WARNING**: Application spending significant time in garbage collection.
|
|
325
|
+
|
|
326
|
+
**Impact**: Stop-the-world pauses, increased latency.
|
|
327
|
+
**Possible Causes**:
|
|
328
|
+
- High heap usage
|
|
329
|
+
- Wrong GC algorithm
|
|
330
|
+
- Too small heap size
|
|
331
|
+
|
|
332
|
+
**Action**:
|
|
333
|
+
1. Increase JVM heap size
|
|
334
|
+
2. Use G1GC (recommended for Kafka): -XX:+UseG1GC
|
|
335
|
+
3. Tune GC parameters: -XX:MaxGCPauseMillis=20
|
|
336
|
+
4. Monitor heap usage and adjust
|
|
337
|
+
threshold: 500ms/sec
|
|
338
|
+
|
|
339
|
+
# ALERT 12: Open File Descriptors High
|
|
340
|
+
- alert: KafkaBrokerHighOpenFiles
|
|
341
|
+
expr: os_open_file_descriptors{job="kafka"} / os_max_file_descriptors{job="kafka"} > 0.8
|
|
342
|
+
for: 5m
|
|
343
|
+
labels:
|
|
344
|
+
severity: warning
|
|
345
|
+
component: kafka
|
|
346
|
+
alert_type: resource_exhaustion
|
|
347
|
+
annotations:
|
|
348
|
+
summary: "Broker {{ $labels.instance }} has high file descriptor usage ({{ $value | humanizePercentage }})"
|
|
349
|
+
description: |
|
|
350
|
+
**WARNING**: Running out of file descriptors.
|
|
351
|
+
|
|
352
|
+
**Impact**: Broker may crash when limit reached.
|
|
353
|
+
**Possible Causes**:
|
|
354
|
+
- Too many partitions
|
|
355
|
+
- Too many concurrent connections
|
|
356
|
+
- File descriptor limit too low
|
|
357
|
+
|
|
358
|
+
**Action**:
|
|
359
|
+
1. Increase system file descriptor limit: `ulimit -n 100000`
|
|
360
|
+
2. Add to /etc/security/limits.conf: `kafka soft nofile 100000; kafka hard nofile 100000`
|
|
361
|
+
3. Reduce partitions per broker
|
|
362
|
+
4. Close idle connections
|
|
363
|
+
threshold: 80%
|
|
364
|
+
|
|
365
|
+
# ALERT 13: Request Handler Idle Percentage Low
|
|
366
|
+
- alert: KafkaRequestHandlerBusy
|
|
367
|
+
expr: kafka_server_request_handler_avg_idle_percent{job="kafka"} < 0.3
|
|
368
|
+
for: 5m
|
|
369
|
+
labels:
|
|
370
|
+
severity: warning
|
|
371
|
+
component: kafka
|
|
372
|
+
alert_type: thread_saturation
|
|
373
|
+
annotations:
|
|
374
|
+
summary: "Broker {{ $labels.instance }} request handlers are busy ({{ $value | humanizePercentage }} idle)"
|
|
375
|
+
description: |
|
|
376
|
+
**WARNING**: Request handlers are saturated.
|
|
377
|
+
|
|
378
|
+
**Impact**: Slow request processing, client timeouts.
|
|
379
|
+
**Possible Causes**:
|
|
380
|
+
- High request rate
|
|
381
|
+
- Slow disk I/O
|
|
382
|
+
- Insufficient num.network.threads or num.io.threads
|
|
383
|
+
|
|
384
|
+
**Action**:
|
|
385
|
+
1. Increase num.network.threads (default: 3, try 8)
|
|
386
|
+
2. Increase num.io.threads (default: 8, try 16)
|
|
387
|
+
3. Check disk I/O performance
|
|
388
|
+
4. Scale horizontally (add brokers)
|
|
389
|
+
threshold: 30% idle (70% busy)
|
|
390
|
+
|
|
391
|
+
# ALERT 14: Disk Usage High
|
|
392
|
+
- alert: KafkaBrokerHighDiskUsage
|
|
393
|
+
expr: (node_filesystem_size_bytes{mountpoint="/data/kafka"} - node_filesystem_free_bytes{mountpoint="/data/kafka"}) / node_filesystem_size_bytes{mountpoint="/data/kafka"} > 0.85
|
|
394
|
+
for: 5m
|
|
395
|
+
labels:
|
|
396
|
+
severity: warning
|
|
397
|
+
component: kafka
|
|
398
|
+
alert_type: disk_pressure
|
|
399
|
+
annotations:
|
|
400
|
+
summary: "Broker {{ $labels.instance }} has high disk usage ({{ $value | humanizePercentage }})"
|
|
401
|
+
description: |
|
|
402
|
+
**WARNING**: Kafka data disk is filling up.
|
|
403
|
+
|
|
404
|
+
**Impact**: Broker will fail when disk full.
|
|
405
|
+
**Possible Causes**:
|
|
406
|
+
- High message retention
|
|
407
|
+
- Insufficient disk space
|
|
408
|
+
- Log compaction not running
|
|
409
|
+
|
|
410
|
+
**Action**:
|
|
411
|
+
1. Reduce log.retention.hours (default: 168 hours = 7 days)
|
|
412
|
+
2. Reduce log.retention.bytes per partition
|
|
413
|
+
3. Expand disk volume
|
|
414
|
+
4. Enable log compaction for topics where appropriate
|
|
415
|
+
threshold: 85%
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
# ==================================================
|
|
2
|
+
# Prometheus JMX Exporter Configuration for Kafka
|
|
3
|
+
# ==================================================
|
|
4
|
+
#
|
|
5
|
+
# Usage: Download JMX Prometheus agent JAR and add to Kafka startup:
|
|
6
|
+
# KAFKA_OPTS="-javaagent:/opt/jmx_prometheus_javaagent.jar=7071:/opt/kafka-jmx-exporter.yml"
|
|
7
|
+
|
|
8
|
+
# Lowercase metric names
|
|
9
|
+
lowercaseOutputName: true
|
|
10
|
+
lowercaseOutputLabelNames: true
|
|
11
|
+
|
|
12
|
+
# ==================================================
|
|
13
|
+
# Whitelist patterns (what to export)
|
|
14
|
+
# ==================================================
|
|
15
|
+
whitelistObjectNames:
|
|
16
|
+
# Broker metrics
|
|
17
|
+
- "kafka.server:type=BrokerTopicMetrics,name=*"
|
|
18
|
+
- "kafka.server:type=ReplicaManager,name=*"
|
|
19
|
+
- "kafka.server:type=ReplicaFetcherManager,name=*"
|
|
20
|
+
- "kafka.server:type=KafkaRequestHandlerPool,name=*"
|
|
21
|
+
- "kafka.server:type=DelayedOperationPurgatory,name=*"
|
|
22
|
+
- "kafka.server:type=SessionExpireListener,name=*"
|
|
23
|
+
|
|
24
|
+
# Network metrics
|
|
25
|
+
- "kafka.network:type=RequestMetrics,name=*,request=*"
|
|
26
|
+
- "kafka.network:type=SocketServer,name=*"
|
|
27
|
+
- "kafka.network:type=Processor,name=*,networkProcessor=*"
|
|
28
|
+
|
|
29
|
+
# Controller metrics
|
|
30
|
+
- "kafka.controller:type=KafkaController,name=*"
|
|
31
|
+
- "kafka.controller:type=ControllerStats,name=*"
|
|
32
|
+
|
|
33
|
+
# Log metrics
|
|
34
|
+
- "kafka.log:type=LogFlushStats,name=*"
|
|
35
|
+
- "kafka.log:type=Log,name=*,topic=*,partition=*"
|
|
36
|
+
- "kafka.log:type=LogCleaner,name=*"
|
|
37
|
+
- "kafka.log:type=LogCleanerManager,name=*"
|
|
38
|
+
|
|
39
|
+
# Partition metrics
|
|
40
|
+
- "kafka.cluster:type=Partition,name=*,topic=*,partition=*"
|
|
41
|
+
|
|
42
|
+
# Group coordinator
|
|
43
|
+
- "kafka.coordinator.group:type=GroupMetadataManager,name=*"
|
|
44
|
+
|
|
45
|
+
# JVM metrics
|
|
46
|
+
- "java.lang:type=Memory,*"
|
|
47
|
+
- "java.lang:type=GarbageCollector,name=*"
|
|
48
|
+
- "java.lang:type=Threading,*"
|
|
49
|
+
- "java.lang:type=OperatingSystem,*"
|
|
50
|
+
|
|
51
|
+
# ==================================================
|
|
52
|
+
# Custom metric rules
|
|
53
|
+
# ==================================================
|
|
54
|
+
rules:
|
|
55
|
+
# ========================================
|
|
56
|
+
# Broker Topic Metrics
|
|
57
|
+
# ========================================
|
|
58
|
+
|
|
59
|
+
- pattern: kafka.server<type=BrokerTopicMetrics, name=(.+)><>Count
|
|
60
|
+
name: kafka_server_broker_topic_metrics_$1_total
|
|
61
|
+
type: COUNTER
|
|
62
|
+
help: "Broker topic metrics: $1"
|
|
63
|
+
|
|
64
|
+
- pattern: kafka.server<type=BrokerTopicMetrics, name=(.+)><>OneMinuteRate
|
|
65
|
+
name: kafka_server_broker_topic_metrics_$1_rate
|
|
66
|
+
type: GAUGE
|
|
67
|
+
help: "Broker topic metrics rate: $1"
|
|
68
|
+
|
|
69
|
+
# ========================================
|
|
70
|
+
# Replica Manager
|
|
71
|
+
# ========================================
|
|
72
|
+
|
|
73
|
+
- pattern: kafka.server<type=ReplicaManager, name=(.+)><>Value
|
|
74
|
+
name: kafka_server_replica_manager_$1
|
|
75
|
+
type: GAUGE
|
|
76
|
+
help: "Replica manager: $1"
|
|
77
|
+
|
|
78
|
+
- pattern: kafka.server<type=ReplicaManager, name=(.+)><>Count
|
|
79
|
+
name: kafka_server_replica_manager_$1_total
|
|
80
|
+
type: COUNTER
|
|
81
|
+
help: "Replica manager counter: $1"
|
|
82
|
+
|
|
83
|
+
# ========================================
|
|
84
|
+
# Under-replicated partitions (CRITICAL)
|
|
85
|
+
# ========================================
|
|
86
|
+
|
|
87
|
+
- pattern: kafka.server<type=ReplicaManager, name=UnderReplicatedPartitions><>Value
|
|
88
|
+
name: kafka_server_replica_manager_under_replicated_partitions
|
|
89
|
+
type: GAUGE
|
|
90
|
+
help: "Number of under-replicated partitions (CRITICAL METRIC)"
|
|
91
|
+
|
|
92
|
+
# ========================================
|
|
93
|
+
# Offline partitions (CRITICAL)
|
|
94
|
+
# ========================================
|
|
95
|
+
|
|
96
|
+
- pattern: kafka.controller<type=KafkaController, name=OfflinePartitionsCount><>Value
|
|
97
|
+
name: kafka_controller_offline_partitions_count
|
|
98
|
+
type: GAUGE
|
|
99
|
+
help: "Number of offline partitions (CRITICAL METRIC)"
|
|
100
|
+
|
|
101
|
+
# ========================================
|
|
102
|
+
# Active controller count (should be 1)
|
|
103
|
+
# ========================================
|
|
104
|
+
|
|
105
|
+
- pattern: kafka.controller<type=KafkaController, name=ActiveControllerCount><>Value
|
|
106
|
+
name: kafka_controller_active_controller_count
|
|
107
|
+
type: GAUGE
|
|
108
|
+
help: "Active controller count (should be exactly 1)"
|
|
109
|
+
|
|
110
|
+
# ========================================
|
|
111
|
+
# Request metrics
|
|
112
|
+
# ========================================
|
|
113
|
+
|
|
114
|
+
- pattern: kafka.network<type=RequestMetrics, name=(.+), request=(.+)><>Count
|
|
115
|
+
name: kafka_network_request_metrics_$1_total
|
|
116
|
+
labels:
|
|
117
|
+
request: $2
|
|
118
|
+
type: COUNTER
|
|
119
|
+
help: "Request metrics: $1 for request type $2"
|
|
120
|
+
|
|
121
|
+
- pattern: kafka.network<type=RequestMetrics, name=(.+), request=(.+)><>OneMinuteRate
|
|
122
|
+
name: kafka_network_request_metrics_$1_rate
|
|
123
|
+
labels:
|
|
124
|
+
request: $2
|
|
125
|
+
type: GAUGE
|
|
126
|
+
help: "Request metrics rate: $1 for request type $2"
|
|
127
|
+
|
|
128
|
+
# ========================================
|
|
129
|
+
# Request handler pool
|
|
130
|
+
# ========================================
|
|
131
|
+
|
|
132
|
+
- pattern: kafka.server<type=KafkaRequestHandlerPool, name=RequestHandlerAvgIdlePercent><>OneMinuteRate
|
|
133
|
+
name: kafka_server_request_handler_avg_idle_percent
|
|
134
|
+
type: GAUGE
|
|
135
|
+
help: "Request handler average idle percentage (low = CPU saturation)"
|
|
136
|
+
|
|
137
|
+
# ========================================
|
|
138
|
+
# Log flush metrics
|
|
139
|
+
# ========================================
|
|
140
|
+
|
|
141
|
+
- pattern: kafka.log<type=LogFlushStats, name=LogFlushRateAndTimeMs><>Count
|
|
142
|
+
name: kafka_log_flush_total
|
|
143
|
+
type: COUNTER
|
|
144
|
+
help: "Number of log flushes"
|
|
145
|
+
|
|
146
|
+
- pattern: kafka.log<type=LogFlushStats, name=LogFlushRateAndTimeMs><>50thPercentile
|
|
147
|
+
name: kafka_log_flush_time_ms_p50
|
|
148
|
+
type: GAUGE
|
|
149
|
+
help: "Log flush time p50 (ms)"
|
|
150
|
+
|
|
151
|
+
- pattern: kafka.log<type=LogFlushStats, name=LogFlushRateAndTimeMs><>99thPercentile
|
|
152
|
+
name: kafka_log_flush_time_ms_p99
|
|
153
|
+
type: GAUGE
|
|
154
|
+
help: "Log flush time p99 (ms)"
|
|
155
|
+
|
|
156
|
+
# ========================================
|
|
157
|
+
# Leader election rate
|
|
158
|
+
# ========================================
|
|
159
|
+
|
|
160
|
+
- pattern: kafka.controller<type=ControllerStats, name=LeaderElectionRateAndTimeMs><>Count
|
|
161
|
+
name: kafka_controller_leader_election_total
|
|
162
|
+
type: COUNTER
|
|
163
|
+
help: "Number of leader elections (high = instability)"
|
|
164
|
+
|
|
165
|
+
# ========================================
|
|
166
|
+
# Unclean leader elections (BAD!)
|
|
167
|
+
# ========================================
|
|
168
|
+
|
|
169
|
+
- pattern: kafka.controller<type=ControllerStats, name=UncleanLeaderElectionsPerSec><>Count
|
|
170
|
+
name: kafka_controller_unclean_leader_elections_total
|
|
171
|
+
type: COUNTER
|
|
172
|
+
help: "Number of unclean leader elections (SHOULD BE ZERO!)"
|
|
173
|
+
|
|
174
|
+
# ========================================
|
|
175
|
+
# ISR shrinks/expands
|
|
176
|
+
# ========================================
|
|
177
|
+
|
|
178
|
+
- pattern: kafka.server<type=ReplicaManager, name=IsrShrinksPerSec><>Count
|
|
179
|
+
name: kafka_server_replica_manager_isr_shrinks_total
|
|
180
|
+
type: COUNTER
|
|
181
|
+
help: "Number of ISR shrinks (replica falling out of sync)"
|
|
182
|
+
|
|
183
|
+
- pattern: kafka.server<type=ReplicaManager, name=IsrExpandsPerSec><>Count
|
|
184
|
+
name: kafka_server_replica_manager_isr_expands_total
|
|
185
|
+
type: COUNTER
|
|
186
|
+
help: "Number of ISR expands (replica catching up)"
|
|
187
|
+
|
|
188
|
+
# ========================================
|
|
189
|
+
# JVM Memory
|
|
190
|
+
# ========================================
|
|
191
|
+
|
|
192
|
+
- pattern: java.lang<type=Memory><HeapMemoryUsage>used
|
|
193
|
+
name: jvm_memory_heap_used_bytes
|
|
194
|
+
type: GAUGE
|
|
195
|
+
help: "JVM heap memory used"
|
|
196
|
+
|
|
197
|
+
- pattern: java.lang<type=Memory><HeapMemoryUsage>max
|
|
198
|
+
name: jvm_memory_heap_max_bytes
|
|
199
|
+
type: GAUGE
|
|
200
|
+
help: "JVM heap memory max"
|
|
201
|
+
|
|
202
|
+
# ========================================
|
|
203
|
+
# JVM GC
|
|
204
|
+
# ========================================
|
|
205
|
+
|
|
206
|
+
- pattern: java.lang<type=GarbageCollector, name=(.+)><>CollectionCount
|
|
207
|
+
name: jvm_gc_collection_count_total
|
|
208
|
+
labels:
|
|
209
|
+
gc: $1
|
|
210
|
+
type: COUNTER
|
|
211
|
+
help: "JVM garbage collection count"
|
|
212
|
+
|
|
213
|
+
- pattern: java.lang<type=GarbageCollector, name=(.+)><>CollectionTime
|
|
214
|
+
name: jvm_gc_collection_time_ms_total
|
|
215
|
+
labels:
|
|
216
|
+
gc: $1
|
|
217
|
+
type: COUNTER
|
|
218
|
+
help: "JVM garbage collection time (ms)"
|
|
219
|
+
|
|
220
|
+
# ========================================
|
|
221
|
+
# JVM Threads
|
|
222
|
+
# ========================================
|
|
223
|
+
|
|
224
|
+
- pattern: java.lang<type=Threading><>ThreadCount
|
|
225
|
+
name: jvm_threads_count
|
|
226
|
+
type: GAUGE
|
|
227
|
+
help: "JVM thread count"
|
|
228
|
+
|
|
229
|
+
- pattern: java.lang<type=Threading><>DaemonThreadCount
|
|
230
|
+
name: jvm_threads_daemon_count
|
|
231
|
+
type: GAUGE
|
|
232
|
+
help: "JVM daemon thread count"
|
|
233
|
+
|
|
234
|
+
# ========================================
|
|
235
|
+
# OS metrics
|
|
236
|
+
# ========================================
|
|
237
|
+
|
|
238
|
+
- pattern: java.lang<type=OperatingSystem><>OpenFileDescriptorCount
|
|
239
|
+
name: os_open_file_descriptors
|
|
240
|
+
type: GAUGE
|
|
241
|
+
help: "Open file descriptors"
|
|
242
|
+
|
|
243
|
+
- pattern: java.lang<type=OperatingSystem><>MaxFileDescriptorCount
|
|
244
|
+
name: os_max_file_descriptors
|
|
245
|
+
type: GAUGE
|
|
246
|
+
help: "Max file descriptors"
|
|
247
|
+
|
|
248
|
+
- pattern: java.lang<type=OperatingSystem><>ProcessCpuLoad
|
|
249
|
+
name: os_process_cpu_load
|
|
250
|
+
type: GAUGE
|
|
251
|
+
help: "Process CPU load"
|
|
252
|
+
|
|
253
|
+
- pattern: java.lang<type=OperatingSystem><>SystemCpuLoad
|
|
254
|
+
name: os_system_cpu_load
|
|
255
|
+
type: GAUGE
|
|
256
|
+
help: "System CPU load"
|