javi-forge 1.2.0 → 1.3.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/ci-local/ci-local.sh +20 -8
- package/package.json +1 -1
- package/ai-config/.skillignore +0 -15
- package/ai-config/AUTO_INVOKE.md +0 -300
- package/ai-config/agents/_TEMPLATE.md +0 -93
- package/ai-config/agents/business/api-designer.md +0 -1657
- package/ai-config/agents/business/business-analyst.md +0 -1331
- package/ai-config/agents/business/product-strategist.md +0 -206
- package/ai-config/agents/business/project-manager.md +0 -178
- package/ai-config/agents/business/requirements-analyst.md +0 -1277
- package/ai-config/agents/business/technical-writer.md +0 -1679
- package/ai-config/agents/creative/ux-designer.md +0 -205
- package/ai-config/agents/data-ai/ai-engineer.md +0 -487
- package/ai-config/agents/data-ai/analytics-engineer.md +0 -953
- package/ai-config/agents/data-ai/data-engineer.md +0 -173
- package/ai-config/agents/data-ai/data-scientist.md +0 -672
- package/ai-config/agents/data-ai/mlops-engineer.md +0 -814
- package/ai-config/agents/data-ai/prompt-engineer.md +0 -772
- package/ai-config/agents/development/angular-expert.md +0 -620
- package/ai-config/agents/development/backend-architect.md +0 -795
- package/ai-config/agents/development/database-specialist.md +0 -212
- package/ai-config/agents/development/frontend-specialist.md +0 -686
- package/ai-config/agents/development/fullstack-engineer.md +0 -668
- package/ai-config/agents/development/golang-pro.md +0 -338
- package/ai-config/agents/development/java-enterprise.md +0 -400
- package/ai-config/agents/development/javascript-pro.md +0 -422
- package/ai-config/agents/development/nextjs-pro.md +0 -474
- package/ai-config/agents/development/python-pro.md +0 -570
- package/ai-config/agents/development/react-pro.md +0 -487
- package/ai-config/agents/development/rust-pro.md +0 -246
- package/ai-config/agents/development/spring-boot-4-expert.md +0 -326
- package/ai-config/agents/development/typescript-pro.md +0 -336
- package/ai-config/agents/development/vue-specialist.md +0 -605
- package/ai-config/agents/infrastructure/cloud-architect.md +0 -472
- package/ai-config/agents/infrastructure/deployment-manager.md +0 -358
- package/ai-config/agents/infrastructure/devops-engineer.md +0 -455
- package/ai-config/agents/infrastructure/incident-responder.md +0 -519
- package/ai-config/agents/infrastructure/kubernetes-expert.md +0 -705
- package/ai-config/agents/infrastructure/monitoring-specialist.md +0 -674
- package/ai-config/agents/infrastructure/performance-engineer.md +0 -658
- package/ai-config/agents/orchestrator.md +0 -241
- package/ai-config/agents/quality/accessibility-auditor.md +0 -1204
- package/ai-config/agents/quality/code-reviewer-compact.md +0 -123
- package/ai-config/agents/quality/code-reviewer.md +0 -363
- package/ai-config/agents/quality/dependency-manager.md +0 -743
- package/ai-config/agents/quality/e2e-test-specialist.md +0 -1005
- package/ai-config/agents/quality/performance-tester.md +0 -1086
- package/ai-config/agents/quality/security-auditor.md +0 -133
- package/ai-config/agents/quality/test-engineer.md +0 -453
- package/ai-config/agents/specialists/api-designer.md +0 -87
- package/ai-config/agents/specialists/backend-architect.md +0 -73
- package/ai-config/agents/specialists/code-reviewer.md +0 -77
- package/ai-config/agents/specialists/db-optimizer.md +0 -75
- package/ai-config/agents/specialists/devops-engineer.md +0 -83
- package/ai-config/agents/specialists/documentation-writer.md +0 -78
- package/ai-config/agents/specialists/frontend-developer.md +0 -75
- package/ai-config/agents/specialists/performance-analyst.md +0 -82
- package/ai-config/agents/specialists/refactor-specialist.md +0 -74
- package/ai-config/agents/specialists/security-auditor.md +0 -74
- package/ai-config/agents/specialists/test-engineer.md +0 -81
- package/ai-config/agents/specialists/ux-consultant.md +0 -76
- package/ai-config/agents/specialized/agent-generator.md +0 -1190
- package/ai-config/agents/specialized/blockchain-developer.md +0 -149
- package/ai-config/agents/specialized/code-migrator.md +0 -892
- package/ai-config/agents/specialized/context-manager.md +0 -978
- package/ai-config/agents/specialized/documentation-writer.md +0 -1078
- package/ai-config/agents/specialized/ecommerce-expert.md +0 -1756
- package/ai-config/agents/specialized/embedded-engineer.md +0 -1714
- package/ai-config/agents/specialized/error-detective.md +0 -1034
- package/ai-config/agents/specialized/fintech-specialist.md +0 -1659
- package/ai-config/agents/specialized/freelance-project-planner-v2.md +0 -1988
- package/ai-config/agents/specialized/freelance-project-planner-v3.md +0 -2136
- package/ai-config/agents/specialized/freelance-project-planner-v4.md +0 -4503
- package/ai-config/agents/specialized/freelance-project-planner.md +0 -722
- package/ai-config/agents/specialized/game-developer.md +0 -1963
- package/ai-config/agents/specialized/healthcare-dev.md +0 -1620
- package/ai-config/agents/specialized/mobile-developer.md +0 -188
- package/ai-config/agents/specialized/parallel-plan-executor.md +0 -506
- package/ai-config/agents/specialized/plan-executor.md +0 -485
- package/ai-config/agents/specialized/solo-dev-planner-modular/00-INDEX.md +0 -485
- package/ai-config/agents/specialized/solo-dev-planner-modular/01-CORE.md +0 -3493
- package/ai-config/agents/specialized/solo-dev-planner-modular/02-SELF-CORRECTION.md +0 -778
- package/ai-config/agents/specialized/solo-dev-planner-modular/03-PROGRESSIVE-SETUP.md +0 -918
- package/ai-config/agents/specialized/solo-dev-planner-modular/04-DEPLOYMENT.md +0 -1537
- package/ai-config/agents/specialized/solo-dev-planner-modular/05-TESTING.md +0 -2633
- package/ai-config/agents/specialized/solo-dev-planner-modular/06-OPERATIONS.md +0 -5610
- package/ai-config/agents/specialized/solo-dev-planner-modular/INSTALL.md +0 -335
- package/ai-config/agents/specialized/solo-dev-planner-modular/QUICK-REFERENCE.txt +0 -215
- package/ai-config/agents/specialized/solo-dev-planner-modular/README.md +0 -260
- package/ai-config/agents/specialized/solo-dev-planner-modular/START-HERE.md +0 -379
- package/ai-config/agents/specialized/solo-dev-planner-modular/WORKFLOW-DIAGRAM.md +0 -355
- package/ai-config/agents/specialized/solo-dev-planner-modular/solo-dev-planner.md +0 -279
- package/ai-config/agents/specialized/template-writer.md +0 -347
- package/ai-config/agents/specialized/test-runner.md +0 -99
- package/ai-config/agents/specialized/vibekanban-smart-worker.md +0 -244
- package/ai-config/agents/specialized/wave-executor.md +0 -138
- package/ai-config/agents/specialized/workflow-optimizer.md +0 -1114
- package/ai-config/commands/git/changelog.md +0 -32
- package/ai-config/commands/git/ci-local.md +0 -70
- package/ai-config/commands/git/commit.md +0 -35
- package/ai-config/commands/git/fix-issue.md +0 -23
- package/ai-config/commands/git/pr-create.md +0 -42
- package/ai-config/commands/git/pr-review.md +0 -50
- package/ai-config/commands/git/worktree.md +0 -39
- package/ai-config/commands/refactoring/cleanup.md +0 -24
- package/ai-config/commands/refactoring/dead-code.md +0 -40
- package/ai-config/commands/refactoring/extract.md +0 -31
- package/ai-config/commands/testing/e2e.md +0 -30
- package/ai-config/commands/testing/tdd.md +0 -36
- package/ai-config/commands/testing/test-coverage.md +0 -30
- package/ai-config/commands/testing/test-fix.md +0 -24
- package/ai-config/commands/workflow/generate-agents-md.md +0 -85
- package/ai-config/commands/workflow/planning.md +0 -47
- package/ai-config/commands/workflows/compound.md +0 -89
- package/ai-config/commands/workflows/diagnose.md +0 -70
- package/ai-config/commands/workflows/discover.md +0 -86
- package/ai-config/commands/workflows/plan.md +0 -77
- package/ai-config/commands/workflows/review.md +0 -78
- package/ai-config/commands/workflows/work.md +0 -75
- package/ai-config/config.yaml +0 -18
- package/ai-config/hooks/_TEMPLATE.md +0 -96
- package/ai-config/hooks/block-dangerous-commands.md +0 -75
- package/ai-config/hooks/commit-guard.md +0 -90
- package/ai-config/hooks/context-loader.md +0 -73
- package/ai-config/hooks/improve-prompt.md +0 -91
- package/ai-config/hooks/learning-log.md +0 -72
- package/ai-config/hooks/model-router.md +0 -86
- package/ai-config/hooks/secret-scanner.md +0 -64
- package/ai-config/hooks/skill-validator.md +0 -102
- package/ai-config/hooks/task-artifact.md +0 -114
- package/ai-config/hooks/validate-workflow.md +0 -100
- package/ai-config/prompts/base.md +0 -71
- package/ai-config/prompts/modes/debug.md +0 -34
- package/ai-config/prompts/modes/deploy.md +0 -40
- package/ai-config/prompts/modes/research.md +0 -32
- package/ai-config/prompts/modes/review.md +0 -33
- package/ai-config/prompts/review-policy.md +0 -79
- package/ai-config/skills/_TEMPLATE.md +0 -157
- package/ai-config/skills/backend/api-gateway/SKILL.md +0 -254
- package/ai-config/skills/backend/bff-concepts/SKILL.md +0 -239
- package/ai-config/skills/backend/bff-spring/SKILL.md +0 -364
- package/ai-config/skills/backend/chi-router/SKILL.md +0 -396
- package/ai-config/skills/backend/error-handling/SKILL.md +0 -255
- package/ai-config/skills/backend/exceptions-spring/SKILL.md +0 -323
- package/ai-config/skills/backend/fastapi/SKILL.md +0 -302
- package/ai-config/skills/backend/gateway-spring/SKILL.md +0 -390
- package/ai-config/skills/backend/go-backend/SKILL.md +0 -457
- package/ai-config/skills/backend/gradle-multimodule/SKILL.md +0 -274
- package/ai-config/skills/backend/graphql-concepts/SKILL.md +0 -352
- package/ai-config/skills/backend/graphql-spring/SKILL.md +0 -398
- package/ai-config/skills/backend/grpc-concepts/SKILL.md +0 -283
- package/ai-config/skills/backend/grpc-spring/SKILL.md +0 -445
- package/ai-config/skills/backend/jwt-auth/SKILL.md +0 -412
- package/ai-config/skills/backend/notifications-concepts/SKILL.md +0 -259
- package/ai-config/skills/backend/recommendations-concepts/SKILL.md +0 -261
- package/ai-config/skills/backend/search-concepts/SKILL.md +0 -263
- package/ai-config/skills/backend/search-spring/SKILL.md +0 -375
- package/ai-config/skills/backend/spring-boot-4/SKILL.md +0 -172
- package/ai-config/skills/backend/websockets/SKILL.md +0 -532
- package/ai-config/skills/data-ai/ai-ml/SKILL.md +0 -423
- package/ai-config/skills/data-ai/analytics-concepts/SKILL.md +0 -195
- package/ai-config/skills/data-ai/analytics-spring/SKILL.md +0 -340
- package/ai-config/skills/data-ai/duckdb-analytics/SKILL.md +0 -440
- package/ai-config/skills/data-ai/langchain/SKILL.md +0 -238
- package/ai-config/skills/data-ai/mlflow/SKILL.md +0 -302
- package/ai-config/skills/data-ai/onnx-inference/SKILL.md +0 -290
- package/ai-config/skills/data-ai/powerbi/SKILL.md +0 -352
- package/ai-config/skills/data-ai/pytorch/SKILL.md +0 -274
- package/ai-config/skills/data-ai/scikit-learn/SKILL.md +0 -321
- package/ai-config/skills/data-ai/vector-db/SKILL.md +0 -301
- package/ai-config/skills/database/graph-databases/SKILL.md +0 -218
- package/ai-config/skills/database/graph-spring/SKILL.md +0 -361
- package/ai-config/skills/database/pgx-postgres/SKILL.md +0 -512
- package/ai-config/skills/database/redis-cache/SKILL.md +0 -343
- package/ai-config/skills/database/sqlite-embedded/SKILL.md +0 -388
- package/ai-config/skills/database/timescaledb/SKILL.md +0 -320
- package/ai-config/skills/docs/api-documentation/SKILL.md +0 -293
- package/ai-config/skills/docs/docs-spring/SKILL.md +0 -377
- package/ai-config/skills/docs/mustache-templates/SKILL.md +0 -190
- package/ai-config/skills/docs/technical-docs/SKILL.md +0 -447
- package/ai-config/skills/frontend/astro-ssr/SKILL.md +0 -441
- package/ai-config/skills/frontend/frontend-design/SKILL.md +0 -54
- package/ai-config/skills/frontend/frontend-web/SKILL.md +0 -368
- package/ai-config/skills/frontend/mantine-ui/SKILL.md +0 -396
- package/ai-config/skills/frontend/tanstack-query/SKILL.md +0 -439
- package/ai-config/skills/frontend/zod-validation/SKILL.md +0 -417
- package/ai-config/skills/frontend/zustand-state/SKILL.md +0 -350
- package/ai-config/skills/infrastructure/chaos-engineering/SKILL.md +0 -244
- package/ai-config/skills/infrastructure/chaos-spring/SKILL.md +0 -378
- package/ai-config/skills/infrastructure/devops-infra/SKILL.md +0 -435
- package/ai-config/skills/infrastructure/docker-containers/SKILL.md +0 -420
- package/ai-config/skills/infrastructure/kubernetes/SKILL.md +0 -456
- package/ai-config/skills/infrastructure/opentelemetry/SKILL.md +0 -546
- package/ai-config/skills/infrastructure/traefik-proxy/SKILL.md +0 -474
- package/ai-config/skills/infrastructure/woodpecker-ci/SKILL.md +0 -315
- package/ai-config/skills/mobile/ionic-capacitor/SKILL.md +0 -504
- package/ai-config/skills/mobile/mobile-ionic/SKILL.md +0 -448
- package/ai-config/skills/prompt-improver/SKILL.md +0 -125
- package/ai-config/skills/quality/ghagga-review/SKILL.md +0 -216
- package/ai-config/skills/references/hooks-patterns/SKILL.md +0 -238
- package/ai-config/skills/references/mcp-servers/SKILL.md +0 -275
- package/ai-config/skills/references/plugins-reference/SKILL.md +0 -110
- package/ai-config/skills/references/skills-reference/SKILL.md +0 -420
- package/ai-config/skills/references/subagent-templates/SKILL.md +0 -193
- package/ai-config/skills/systems-iot/modbus-protocol/SKILL.md +0 -410
- package/ai-config/skills/systems-iot/mqtt-rumqttc/SKILL.md +0 -408
- package/ai-config/skills/systems-iot/rust-systems/SKILL.md +0 -386
- package/ai-config/skills/systems-iot/tokio-async/SKILL.md +0 -324
- package/ai-config/skills/testing/playwright-e2e/SKILL.md +0 -289
- package/ai-config/skills/testing/testcontainers/SKILL.md +0 -299
- package/ai-config/skills/testing/vitest-testing/SKILL.md +0 -381
- package/ai-config/skills/workflow/ci-local-guide/SKILL.md +0 -118
- package/ai-config/skills/workflow/claude-automation-recommender/SKILL.md +0 -299
- package/ai-config/skills/workflow/claude-md-improver/SKILL.md +0 -158
- package/ai-config/skills/workflow/finishing-a-development-branch/SKILL.md +0 -117
- package/ai-config/skills/workflow/git-github/SKILL.md +0 -334
- package/ai-config/skills/workflow/git-github/references/examples.md +0 -160
- package/ai-config/skills/workflow/git-workflow/SKILL.md +0 -214
- package/ai-config/skills/workflow/ide-plugins/SKILL.md +0 -277
- package/ai-config/skills/workflow/ide-plugins-intellij/SKILL.md +0 -401
- package/ai-config/skills/workflow/obsidian-brain-workflow/SKILL.md +0 -199
- package/ai-config/skills/workflow/using-git-worktrees/SKILL.md +0 -100
- package/ai-config/skills/workflow/verification-before-completion/SKILL.md +0 -73
- package/ai-config/skills/workflow/wave-workflow/SKILL.md +0 -178
- package/schemas/agent.schema.json +0 -34
- package/schemas/ai-config.schema.json +0 -28
- package/schemas/plugin.schema.json +0 -62
- package/schemas/skill.schema.json +0 -44
|
@@ -1,378 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: chaos-spring
|
|
3
|
-
description: >
|
|
4
|
-
Spring Boot chaos engineering. Chaos Monkey, fault simulators, test orchestration.
|
|
5
|
-
Trigger: apigen-chaos, ChaosMonkey, NetworkChaosSimulator, DatabaseChaosSimulator
|
|
6
|
-
tools:
|
|
7
|
-
- Read
|
|
8
|
-
- Write
|
|
9
|
-
- Edit
|
|
10
|
-
- Bash
|
|
11
|
-
- Grep
|
|
12
|
-
metadata:
|
|
13
|
-
author: apigen-team
|
|
14
|
-
version: "1.0"
|
|
15
|
-
tags: [chaos, spring-boot, testing, java]
|
|
16
|
-
scope: ["apigen-chaos/**"]
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
# Chaos Spring Boot (apigen-chaos)
|
|
20
|
-
|
|
21
|
-
## Configuration
|
|
22
|
-
|
|
23
|
-
```yaml
|
|
24
|
-
apigen:
|
|
25
|
-
chaos:
|
|
26
|
-
enabled: true
|
|
27
|
-
# Only enable in non-production by default
|
|
28
|
-
environment: ${SPRING_PROFILES_ACTIVE:dev}
|
|
29
|
-
|
|
30
|
-
network:
|
|
31
|
-
enabled: true
|
|
32
|
-
latency:
|
|
33
|
-
min-ms: 100
|
|
34
|
-
max-ms: 500
|
|
35
|
-
probability: 0.1
|
|
36
|
-
packet-loss:
|
|
37
|
-
probability: 0.05
|
|
38
|
-
|
|
39
|
-
service:
|
|
40
|
-
enabled: true
|
|
41
|
-
failure-probability: 0.1
|
|
42
|
-
slow-response:
|
|
43
|
-
enabled: true
|
|
44
|
-
delay-ms: 2000
|
|
45
|
-
probability: 0.05
|
|
46
|
-
|
|
47
|
-
database:
|
|
48
|
-
enabled: true
|
|
49
|
-
connection-failure:
|
|
50
|
-
probability: 0.02
|
|
51
|
-
slow-query:
|
|
52
|
-
delay-ms: 3000
|
|
53
|
-
probability: 0.05
|
|
54
|
-
|
|
55
|
-
resource:
|
|
56
|
-
enabled: true
|
|
57
|
-
cpu-stress:
|
|
58
|
-
enabled: false
|
|
59
|
-
cores: 2
|
|
60
|
-
load-percent: 80
|
|
61
|
-
memory-stress:
|
|
62
|
-
enabled: false
|
|
63
|
-
allocation-mb: 512
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## Chaos Monkey Configuration
|
|
67
|
-
|
|
68
|
-
```java
|
|
69
|
-
@Configuration
|
|
70
|
-
@ConditionalOnProperty(prefix = "apigen.chaos", name = "enabled", havingValue = "true")
|
|
71
|
-
public class ChaosMonkeyConfiguration {
|
|
72
|
-
|
|
73
|
-
@Bean
|
|
74
|
-
public ChaosMonkeySettings chaosMonkeySettings(ChaosProperties props) {
|
|
75
|
-
return ChaosMonkeySettings.builder()
|
|
76
|
-
.enabled(props.isEnabled())
|
|
77
|
-
.latencyActive(props.getNetwork().isEnabled())
|
|
78
|
-
.latencyRangeStart(props.getNetwork().getLatency().getMinMs())
|
|
79
|
-
.latencyRangeEnd(props.getNetwork().getLatency().getMaxMs())
|
|
80
|
-
.exceptionActive(props.getService().isEnabled())
|
|
81
|
-
.killApplicationActive(false) // Never auto-kill
|
|
82
|
-
.build();
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
@Bean
|
|
86
|
-
public AssaultProperties assaultProperties(ChaosProperties props) {
|
|
87
|
-
return AssaultProperties.builder()
|
|
88
|
-
.level(props.getService().getFailureProbability())
|
|
89
|
-
.exceptionsActive(true)
|
|
90
|
-
.exception(new RuntimeException("Chaos Monkey attack!"))
|
|
91
|
-
.build();
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
## Network Chaos Simulator
|
|
97
|
-
|
|
98
|
-
```java
|
|
99
|
-
@Component
|
|
100
|
-
@ConditionalOnProperty(prefix = "apigen.chaos.network", name = "enabled")
|
|
101
|
-
public class NetworkChaosSimulator {
|
|
102
|
-
|
|
103
|
-
private final ChaosProperties.NetworkProperties config;
|
|
104
|
-
private final Random random = new SecureRandom();
|
|
105
|
-
private final MeterRegistry meterRegistry;
|
|
106
|
-
|
|
107
|
-
public void maybeInjectLatency() {
|
|
108
|
-
if (shouldInject(config.getLatency().getProbability())) {
|
|
109
|
-
int delay = random.nextInt(
|
|
110
|
-
config.getLatency().getMaxMs() - config.getLatency().getMinMs()
|
|
111
|
-
) + config.getLatency().getMinMs();
|
|
112
|
-
|
|
113
|
-
meterRegistry.counter("chaos.network.latency.injected").increment();
|
|
114
|
-
log.info("Chaos: Injecting {}ms latency", delay);
|
|
115
|
-
|
|
116
|
-
try {
|
|
117
|
-
Thread.sleep(delay);
|
|
118
|
-
} catch (InterruptedException e) {
|
|
119
|
-
Thread.currentThread().interrupt();
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
public void maybeInjectPacketLoss() {
|
|
125
|
-
if (shouldInject(config.getPacketLoss().getProbability())) {
|
|
126
|
-
meterRegistry.counter("chaos.network.packet_loss.injected").increment();
|
|
127
|
-
log.info("Chaos: Simulating packet loss (dropping request)");
|
|
128
|
-
throw new NetworkChaosException("Simulated packet loss");
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
private boolean shouldInject(double probability) {
|
|
133
|
-
return random.nextDouble() < probability;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
## Database Chaos Simulator
|
|
139
|
-
|
|
140
|
-
```java
|
|
141
|
-
@Component
|
|
142
|
-
@ConditionalOnProperty(prefix = "apigen.chaos.database", name = "enabled")
|
|
143
|
-
public class DatabaseChaosSimulator {
|
|
144
|
-
|
|
145
|
-
private final ChaosProperties.DatabaseProperties config;
|
|
146
|
-
private final Random random = new SecureRandom();
|
|
147
|
-
|
|
148
|
-
@Around("execution(* javax.sql.DataSource.getConnection(..))")
|
|
149
|
-
public Object maybeFailConnection(ProceedingJoinPoint pjp) throws Throwable {
|
|
150
|
-
if (shouldInject(config.getConnectionFailure().getProbability())) {
|
|
151
|
-
log.info("Chaos: Simulating database connection failure");
|
|
152
|
-
throw new SQLException("Chaos: Connection refused");
|
|
153
|
-
}
|
|
154
|
-
return pjp.proceed();
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
@Around("execution(* org.springframework.data.repository.Repository+.*(..))")
|
|
158
|
-
public Object maybeSlowQuery(ProceedingJoinPoint pjp) throws Throwable {
|
|
159
|
-
if (shouldInject(config.getSlowQuery().getProbability())) {
|
|
160
|
-
int delay = config.getSlowQuery().getDelayMs();
|
|
161
|
-
log.info("Chaos: Injecting {}ms query delay", delay);
|
|
162
|
-
Thread.sleep(delay);
|
|
163
|
-
}
|
|
164
|
-
return pjp.proceed();
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
## Service Failure Simulator
|
|
170
|
-
|
|
171
|
-
```java
|
|
172
|
-
@Component
|
|
173
|
-
@ConditionalOnProperty(prefix = "apigen.chaos.service", name = "enabled")
|
|
174
|
-
public class ServiceFailureSimulator {
|
|
175
|
-
|
|
176
|
-
private final ChaosProperties.ServiceProperties config;
|
|
177
|
-
private final Random random = new SecureRandom();
|
|
178
|
-
|
|
179
|
-
@Around("@within(org.springframework.web.bind.annotation.RestController)")
|
|
180
|
-
public Object maybeFailRequest(ProceedingJoinPoint pjp) throws Throwable {
|
|
181
|
-
// Fail with configured probability
|
|
182
|
-
if (shouldInject(config.getFailureProbability())) {
|
|
183
|
-
log.info("Chaos: Simulating service failure for {}",
|
|
184
|
-
pjp.getSignature().getName());
|
|
185
|
-
throw new ServiceChaosException("Chaos: Service unavailable");
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// Slow response with configured probability
|
|
189
|
-
if (config.getSlowResponse().isEnabled() &&
|
|
190
|
-
shouldInject(config.getSlowResponse().getProbability())) {
|
|
191
|
-
|
|
192
|
-
int delay = config.getSlowResponse().getDelayMs();
|
|
193
|
-
log.info("Chaos: Injecting {}ms response delay", delay);
|
|
194
|
-
Thread.sleep(delay);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
return pjp.proceed();
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
## Resource Stress Simulator
|
|
203
|
-
|
|
204
|
-
```java
|
|
205
|
-
@Component
|
|
206
|
-
@ConditionalOnProperty(prefix = "apigen.chaos.resource", name = "enabled")
|
|
207
|
-
public class ResourceStressSimulator {
|
|
208
|
-
|
|
209
|
-
private final ChaosProperties.ResourceProperties config;
|
|
210
|
-
private final ExecutorService executor = Executors.newCachedThreadPool();
|
|
211
|
-
private volatile boolean stressActive = false;
|
|
212
|
-
|
|
213
|
-
public void startCpuStress(Duration duration) {
|
|
214
|
-
if (!config.getCpuStress().isEnabled()) return;
|
|
215
|
-
|
|
216
|
-
int cores = config.getCpuStress().getCores();
|
|
217
|
-
int loadPercent = config.getCpuStress().getLoadPercent();
|
|
218
|
-
|
|
219
|
-
log.info("Chaos: Starting CPU stress on {} cores at {}% for {}",
|
|
220
|
-
cores, loadPercent, duration);
|
|
221
|
-
|
|
222
|
-
stressActive = true;
|
|
223
|
-
for (int i = 0; i < cores; i++) {
|
|
224
|
-
executor.submit(() -> {
|
|
225
|
-
long startTime = System.currentTimeMillis();
|
|
226
|
-
while (stressActive &&
|
|
227
|
-
System.currentTimeMillis() - startTime < duration.toMillis()) {
|
|
228
|
-
// Busy work
|
|
229
|
-
if (loadPercent < 100) {
|
|
230
|
-
try {
|
|
231
|
-
Thread.sleep(100 - loadPercent);
|
|
232
|
-
} catch (InterruptedException e) {
|
|
233
|
-
Thread.currentThread().interrupt();
|
|
234
|
-
break;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// Auto-stop after duration
|
|
242
|
-
executor.submit(() -> {
|
|
243
|
-
try {
|
|
244
|
-
Thread.sleep(duration.toMillis());
|
|
245
|
-
stopCpuStress();
|
|
246
|
-
} catch (InterruptedException e) {
|
|
247
|
-
Thread.currentThread().interrupt();
|
|
248
|
-
}
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
public void stopCpuStress() {
|
|
253
|
-
stressActive = false;
|
|
254
|
-
log.info("Chaos: CPU stress stopped");
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
public void startMemoryStress(int allocationMb) {
|
|
258
|
-
if (!config.getMemoryStress().isEnabled()) return;
|
|
259
|
-
|
|
260
|
-
log.info("Chaos: Allocating {}MB of memory", allocationMb);
|
|
261
|
-
byte[][] allocations = new byte[allocationMb][];
|
|
262
|
-
for (int i = 0; i < allocationMb; i++) {
|
|
263
|
-
allocations[i] = new byte[1024 * 1024]; // 1MB chunks
|
|
264
|
-
}
|
|
265
|
-
// Hold reference to prevent GC
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
## Chaos Test Orchestrator
|
|
271
|
-
|
|
272
|
-
```java
|
|
273
|
-
@Service
|
|
274
|
-
public class ChaosTestOrchestrator {
|
|
275
|
-
|
|
276
|
-
private final NetworkChaosSimulator networkChaos;
|
|
277
|
-
private final DatabaseChaosSimulator databaseChaos;
|
|
278
|
-
private final ServiceFailureSimulator serviceFailure;
|
|
279
|
-
private final ResourceStressSimulator resourceStress;
|
|
280
|
-
|
|
281
|
-
public ChaosExperiment createExperiment(ChaosExperimentRequest request) {
|
|
282
|
-
return ChaosExperiment.builder()
|
|
283
|
-
.id(UUID.randomUUID())
|
|
284
|
-
.name(request.getName())
|
|
285
|
-
.hypothesis(request.getHypothesis())
|
|
286
|
-
.faults(request.getFaults())
|
|
287
|
-
.duration(request.getDuration())
|
|
288
|
-
.metrics(request.getMetricsToMonitor())
|
|
289
|
-
.status(ExperimentStatus.PENDING)
|
|
290
|
-
.build();
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
@Async
|
|
294
|
-
public CompletableFuture<ChaosExperimentResult> runExperiment(
|
|
295
|
-
ChaosExperiment experiment) {
|
|
296
|
-
|
|
297
|
-
log.info("Starting chaos experiment: {}", experiment.getName());
|
|
298
|
-
|
|
299
|
-
// Collect baseline metrics
|
|
300
|
-
MetricsSnapshot baseline = collectMetrics();
|
|
301
|
-
|
|
302
|
-
// Start experiment
|
|
303
|
-
experiment.setStatus(ExperimentStatus.RUNNING);
|
|
304
|
-
experiment.setStartedAt(Instant.now());
|
|
305
|
-
|
|
306
|
-
try {
|
|
307
|
-
// Inject faults
|
|
308
|
-
for (FaultConfig fault : experiment.getFaults()) {
|
|
309
|
-
injectFault(fault);
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
// Wait for duration
|
|
313
|
-
Thread.sleep(experiment.getDuration().toMillis());
|
|
314
|
-
|
|
315
|
-
// Collect experiment metrics
|
|
316
|
-
MetricsSnapshot experimentMetrics = collectMetrics();
|
|
317
|
-
|
|
318
|
-
// Stop faults
|
|
319
|
-
stopAllFaults();
|
|
320
|
-
|
|
321
|
-
// Analyze results
|
|
322
|
-
return CompletableFuture.completedFuture(
|
|
323
|
-
analyzeResults(experiment, baseline, experimentMetrics));
|
|
324
|
-
|
|
325
|
-
} catch (Exception e) {
|
|
326
|
-
log.error("Chaos experiment failed", e);
|
|
327
|
-
stopAllFaults();
|
|
328
|
-
return CompletableFuture.failedFuture(e);
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
public void abortExperiment(UUID experimentId) {
|
|
333
|
-
log.warn("Aborting chaos experiment: {}", experimentId);
|
|
334
|
-
stopAllFaults();
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
## REST API for Chaos Control
|
|
340
|
-
|
|
341
|
-
```java
|
|
342
|
-
@RestController
|
|
343
|
-
@RequestMapping("/chaos")
|
|
344
|
-
@ConditionalOnProperty(prefix = "apigen.chaos", name = "enabled")
|
|
345
|
-
public class ChaosController {
|
|
346
|
-
|
|
347
|
-
private final ChaosTestOrchestrator orchestrator;
|
|
348
|
-
|
|
349
|
-
@PostMapping("/experiments")
|
|
350
|
-
public ChaosExperiment createExperiment(
|
|
351
|
-
@RequestBody @Valid ChaosExperimentRequest request) {
|
|
352
|
-
return orchestrator.createExperiment(request);
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
@PostMapping("/experiments/{id}/start")
|
|
356
|
-
public void startExperiment(@PathVariable UUID id) {
|
|
357
|
-
orchestrator.runExperiment(id);
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
@PostMapping("/experiments/{id}/abort")
|
|
361
|
-
public void abortExperiment(@PathVariable UUID id) {
|
|
362
|
-
orchestrator.abortExperiment(id);
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
@GetMapping("/experiments/{id}/status")
|
|
366
|
-
public ChaosExperimentStatus getStatus(@PathVariable UUID id) {
|
|
367
|
-
return orchestrator.getStatus(id);
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
## Related Skills
|
|
373
|
-
|
|
374
|
-
- `chaos-engineering`: Chaos engineering concepts
|
|
375
|
-
- `spring-boot-4`: Spring Boot 4.0 patterns
|
|
376
|
-
- `testcontainers`: Integration testing
|
|
377
|
-
|
|
378
|
-
|