perf-skills 1.0.2 → 1.0.4
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-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +35 -35
- package/package.json +1 -1
- package/skills/perf/SKILL.md +226 -71
- package/skills/perf/evals/evals.json +149 -0
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
},
|
|
7
7
|
"metadata": {
|
|
8
8
|
"description": "Expert AI skill for performance testing — covers the full lifecycle using JMeter, k6, Gatling, Locust, NeoLoad, LoadRunner, and OctoPerf.",
|
|
9
|
-
"version": "1.0.
|
|
9
|
+
"version": "1.0.4"
|
|
10
10
|
},
|
|
11
11
|
"plugins": [
|
|
12
12
|
{
|
|
13
13
|
"name": "perf",
|
|
14
14
|
"source": "./",
|
|
15
15
|
"description": "Expert guidance for performance testing: planning, scripting, executing, and analyzing load/stress/soak/spike tests across 7 tools and 10 topic areas.",
|
|
16
|
-
"version": "1.0.
|
|
16
|
+
"version": "1.0.4",
|
|
17
17
|
"author": {
|
|
18
18
|
"name": "NaveenKumar Namachivayam",
|
|
19
19
|
"email": "contact@qainsights.com"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "perf",
|
|
3
3
|
"description": "Expert guidance for performance testing: planning, scripting, executing, and analyzing load/stress/soak/spike tests using JMeter, k6, Gatling, Locust, NeoLoad, LoadRunner, OctoPerf.",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.4",
|
|
5
5
|
"skills": "./skills/"
|
|
6
6
|
}
|
package/README.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# perf-skills
|
|
2
2
|
|
|
3
|
-
> *"The more you sweat in training, the less you bleed in battle."*
|
|
3
|
+
> *"The more you sweat in training, the less you bleed in battle."* - Richard Marcinko
|
|
4
4
|
>
|
|
5
5
|
> The more relevant skills your AI loads during development, the fewer fires you fight in production.
|
|
6
6
|
|
|
7
7
|
## What Is This?
|
|
8
8
|
|
|
9
|
-
`perf-skills` is a structured knowledge base that gives AI coding assistants deep, opinionated expertise in performance testing. It works with any AI tool that supports custom instructions, rules, or skill files
|
|
9
|
+
`perf-skills` is a structured knowledge base that gives AI coding assistants deep, opinionated expertise in performance testing. It works with any AI tool that supports custom instructions, rules, or skill files - helping you plan, script, execute, and analyze load tests using any major tool.
|
|
10
10
|
|
|
11
11
|
### Supported Tools
|
|
12
12
|
|
|
@@ -19,22 +19,22 @@
|
|
|
19
19
|
|
|
20
20
|
### Topics Covered
|
|
21
21
|
|
|
22
|
-
- **Workload design**
|
|
23
|
-
- **Test data**
|
|
24
|
-
- **Script generation**
|
|
25
|
-
- **Test execution**
|
|
26
|
-
- **Results analysis**
|
|
27
|
-
- **Observability**
|
|
28
|
-
- **Production testing**
|
|
29
|
-
- **Protocol testing**
|
|
30
|
-
- **Database testing**
|
|
31
|
-
- **Modern architectures**
|
|
22
|
+
- **Workload design** - concurrency models, Little's Law, transaction mix, SLA targets
|
|
23
|
+
- **Test data** - parameterization, CSV feeds, synthetic data, data isolation
|
|
24
|
+
- **Script generation** - correlation, assertions, error handling, session management
|
|
25
|
+
- **Test execution** - local, distributed, CI/CD pipelines, cloud execution
|
|
26
|
+
- **Results analysis** - percentiles, bottleneck identification, trend comparison, reporting
|
|
27
|
+
- **Observability** - APM integration, Prometheus/Grafana, distributed tracing, log correlation
|
|
28
|
+
- **Production testing** - canary, shadow traffic, chaos engineering, safety controls
|
|
29
|
+
- **Protocol testing** - gRPC, GraphQL, WebSocket/SSE, Kafka/message queues
|
|
30
|
+
- **Database testing** - JDBC load testing, connection pools, query concurrency, replication lag
|
|
31
|
+
- **Modern architectures** - microservices, Kubernetes (HPA, service mesh), serverless (cold starts), frontend (Core Web Vitals)
|
|
32
32
|
|
|
33
33
|
## Compatible AI Coding Assistants
|
|
34
34
|
|
|
35
35
|
| Tool | Integration Method | Setup |
|
|
36
36
|
|---|---|---|
|
|
37
|
-
| **Windsurf (Cascade)** | Skills | Copy to skills directory
|
|
37
|
+
| **Windsurf (Cascade)** | Skills | Copy to skills directory - auto-triggers on perf questions |
|
|
38
38
|
| **Cursor** | Rules / Docs | Add as project rules or index via `@Docs` |
|
|
39
39
|
| **Claude Code** | CLAUDE.md / Custom instructions | Reference files in `CLAUDE.md` or feed as context |
|
|
40
40
|
| **Cline** | Custom instructions / `.clinerules` | Add to `.clinerules` or workspace instructions |
|
|
@@ -88,12 +88,12 @@ cp -r perf-skills/skills/perf ~/.claude/skills/
|
|
|
88
88
|
|
|
89
89
|
### Cursor (Rules / Docs)
|
|
90
90
|
|
|
91
|
-
**Option A
|
|
91
|
+
**Option A - Project Rules:**
|
|
92
92
|
1. Clone the repository: `git clone https://github.com/QAInsights/perf-skills.git`
|
|
93
93
|
2. Create `.cursor/rules/perf.mdc` in your project root.
|
|
94
94
|
3. Copy content from `perf-skills/skills/perf/SKILL.md` into the rule file.
|
|
95
95
|
|
|
96
|
-
**Option B
|
|
96
|
+
**Option B - @Docs indexing:**
|
|
97
97
|
1. Clone the repository into your project or a known location.
|
|
98
98
|
2. Open Cursor Settings → Features → Docs.
|
|
99
99
|
3. Add the `perf-skills/skills/perf/` directory as a doc source.
|
|
@@ -154,7 +154,7 @@ The skill is plain markdown files. Any AI tool that can read files or accept cus
|
|
|
154
154
|
|
|
155
155
|
### As a Standalone Knowledge Base
|
|
156
156
|
|
|
157
|
-
Browse the markdown files directly
|
|
157
|
+
Browse the markdown files directly - they're self-contained references useful even without an AI assistant.
|
|
158
158
|
|
|
159
159
|
## File Structure
|
|
160
160
|
|
|
@@ -167,16 +167,16 @@ perf-skills/ # Repository root
|
|
|
167
167
|
├── LICENSE.md
|
|
168
168
|
└── skills/
|
|
169
169
|
└── perf/ # Skill module
|
|
170
|
-
├── SKILL.md # Entry point
|
|
170
|
+
├── SKILL.md # Entry point - tool selection, lifecycle, key principles
|
|
171
171
|
└── references/
|
|
172
172
|
├── tools/ # Tool-specific syntax and configuration
|
|
173
|
-
│ ├── jmeter.md # JMeter 5.6+
|
|
174
|
-
│ ├── k6.md # k6 v0.50+
|
|
175
|
-
│ ├── gatling.md # Gatling 3.10+
|
|
176
|
-
│ ├── locust.md # Locust 2.20+
|
|
177
|
-
│ ├── neoload.md # NeoLoad
|
|
178
|
-
│ ├── loadrunner.md # LoadRunner
|
|
179
|
-
│ └── octoperf.md # OctoPerf
|
|
173
|
+
│ ├── jmeter.md # JMeter 5.6+ - samplers, extractors, plugins, Groovy
|
|
174
|
+
│ ├── k6.md # k6 v0.50+ - executors, checks, thresholds, modules
|
|
175
|
+
│ ├── gatling.md # Gatling 3.10+ - Scala/Java DSL, feeders, injection
|
|
176
|
+
│ ├── locust.md # Locust 2.20+ - Python scripts, events, FastHttpUser
|
|
177
|
+
│ ├── neoload.md # NeoLoad - GUI workflow, CLI, API execution
|
|
178
|
+
│ ├── loadrunner.md # LoadRunner - VuGen, protocols, Controller scenarios
|
|
179
|
+
│ └── octoperf.md # OctoPerf - JMeter-based SaaS, HAR import, cloud
|
|
180
180
|
└── topics/ # Cross-cutting concepts (tool-agnostic)
|
|
181
181
|
├── workload-design.md # Concurrency models, load profiles, Little's Law
|
|
182
182
|
├── test-data.md # CSV, DB seeding, Faker, data isolation patterns
|
|
@@ -196,16 +196,16 @@ perf-skills/ # Repository root
|
|
|
196
196
|
|
|
197
197
|
`SKILL.md` acts as the entry point and router. It contains:
|
|
198
198
|
|
|
199
|
-
1. **Loading Priority Rules**
|
|
200
|
-
2. **Reference Map**
|
|
201
|
-
3. **Protocol Routing Table**
|
|
202
|
-
4. **Tool Selection Matrix**
|
|
203
|
-
5. **Key Principles**
|
|
199
|
+
1. **Loading Priority Rules** - tells the AI which file(s) to load based on the user's question (never all at once).
|
|
200
|
+
2. **Reference Map** - maps user intent to the right file.
|
|
201
|
+
3. **Protocol Routing Table** - maps protocols (gRPC, GraphQL, etc.) to recommended tools and reference files.
|
|
202
|
+
4. **Tool Selection Matrix** - helps recommend a tool when the user hasn't chosen one.
|
|
203
|
+
5. **Key Principles** - the single source of truth for cross-cutting best practices (assertions, think time, parameterization, correlation).
|
|
204
204
|
|
|
205
205
|
### Design Principles
|
|
206
206
|
|
|
207
207
|
- **Token-efficient**: Tool files contain only tool-specific syntax. Cross-cutting concepts live in topic files. No duplication.
|
|
208
|
-
- **Selective loading**: The AI loads 1
|
|
208
|
+
- **Selective loading**: The AI loads 1-2 files per question, not the entire knowledge base.
|
|
209
209
|
- **Single source of truth**: Each concept is defined in exactly one place. Tool files cross-reference topic files for shared concepts.
|
|
210
210
|
- **Opinionated**: The skill prescribes best practices, not just documentation. It tells you what to do, not just what's possible.
|
|
211
211
|
|
|
@@ -216,7 +216,7 @@ perf-skills/ # Repository root
|
|
|
216
216
|
| "Help me write a k6 load test for our REST API" | `k6.md` |
|
|
217
217
|
| "How should I design the workload for our e-commerce app?" | `workload-design.md` |
|
|
218
218
|
| "Set up JMeter in our GitHub Actions pipeline" | `test-execution.md` + `jmeter.md` |
|
|
219
|
-
| "Our p95 latency is spiking at 500 VUs
|
|
219
|
+
| "Our p95 latency is spiking at 500 VUs - how do I debug?" | `results-analysis.md` + `observability.md` |
|
|
220
220
|
| "How do I load test a gRPC service?" | `protocol-testing.md` + `k6.md` |
|
|
221
221
|
| "What tool should I use? We're a Python team." | `SKILL.md` (Tool Selection Matrix) |
|
|
222
222
|
| "Test our Kafka consumer throughput" | `protocol-testing.md` |
|
|
@@ -227,10 +227,10 @@ perf-skills/ # Repository root
|
|
|
227
227
|
|
|
228
228
|
To add or update content:
|
|
229
229
|
|
|
230
|
-
1. **Tool-specific content** goes in `references/tools/<tool>.md`
|
|
231
|
-
2. **Cross-cutting concepts** go in `references/topics/<topic>.md`
|
|
232
|
-
3. **Never duplicate**
|
|
233
|
-
4. **Update SKILL.md** if you add a new file
|
|
230
|
+
1. **Tool-specific content** goes in `references/tools/<tool>.md` - syntax, config, tool-unique tips only.
|
|
231
|
+
2. **Cross-cutting concepts** go in `references/topics/<topic>.md` - patterns that apply across tools.
|
|
232
|
+
3. **Never duplicate** - if a concept exists in a topic file, tool files should cross-reference it, not restate it.
|
|
233
|
+
4. **Update SKILL.md** if you add a new file - add it to the Reference Map and Protocol Routing Table if applicable.
|
|
234
234
|
5. **Add a version indicator** (`> Targets: ...`) to new tool files.
|
|
235
235
|
|
|
236
236
|
## License
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "perf-skills",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "Expert AI skill for performance testing — covers JMeter, k6, Gatling, Locust, NeoLoad, LoadRunner, OctoPerf across the full lifecycle",
|
|
5
5
|
"main": "skills/perf/SKILL.md",
|
|
6
6
|
"files": [
|
package/skills/perf/SKILL.md
CHANGED
|
@@ -1,63 +1,80 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: perf
|
|
3
|
-
description:
|
|
3
|
+
description: Performance testing expert covering the full lifecycle for
|
|
4
|
+
JMeter, k6, Gatling, Locust, NeoLoad, and LoadRunner. Use this skill
|
|
5
|
+
whenever writing or reviewing load test scripts, setting thresholds,
|
|
6
|
+
choosing executors, configuring CI/CD pipelines, diagnosing latency
|
|
7
|
+
issues, designing workloads, analyzing results, or recommending tools
|
|
8
|
+
— even if the tool is not named explicitly. Always consult before
|
|
9
|
+
suggesting thresholds, executor types, or output configuration.
|
|
10
|
+
Prefer this skill over general knowledge for any performance testing
|
|
11
|
+
decision, debugging session, or tool comparison.
|
|
4
12
|
---
|
|
5
13
|
|
|
6
14
|
# Performance Testing Skill
|
|
7
15
|
|
|
8
|
-
This skill provides expert, opinionated guidance across the full
|
|
16
|
+
This skill provides expert, opinionated guidance across the full
|
|
17
|
+
performance testing lifecycle — from workload design through production
|
|
18
|
+
observation. It covers both commercial tools (LoadRunner, NeoLoad,
|
|
19
|
+
OctoPerf) and open-source tools (JMeter, k6, Gatling, Locust).
|
|
9
20
|
|
|
10
21
|
---
|
|
11
22
|
|
|
12
23
|
## How to Use This Skill
|
|
13
24
|
|
|
14
|
-
Read the relevant reference files based on what the user needs.
|
|
25
|
+
Read the relevant reference files based on what the user needs.
|
|
26
|
+
Multiple files may apply.
|
|
15
27
|
|
|
16
28
|
### Loading Priority Rules
|
|
17
29
|
|
|
18
30
|
1. **Tool-specific syntax/config** → load the tool file only.
|
|
19
|
-
2. **Strategy/concepts** (workload design, test data, analysis) → load
|
|
20
|
-
|
|
31
|
+
2. **Strategy/concepts** (workload design, test data, analysis) → load
|
|
32
|
+
the topic file only.
|
|
33
|
+
3. **Both apply** (e.g., "JMeter CI/CD") → load the topic file first
|
|
34
|
+
for patterns, then the tool file for syntax.
|
|
21
35
|
4. **Never load all files at once** — select the 1–2 most relevant.
|
|
22
|
-
5. **Cross-cutting principles** (assertions, think time,
|
|
36
|
+
5. **Cross-cutting principles** (assertions, think time,
|
|
37
|
+
parameterization) → this file's Key Principles section is the
|
|
38
|
+
single source of truth.
|
|
23
39
|
|
|
24
40
|
### Reference Map
|
|
25
41
|
|
|
26
|
-
| User needs help with...
|
|
27
|
-
|
|
28
|
-
| Choosing the right tool
|
|
29
|
-
| JMeter scripts, plugins, config
|
|
30
|
-
| k6 scripting, extensions, cloud
|
|
31
|
-
| Gatling simulations, Scala/Java DSL
|
|
32
|
-
| Locust Python tests, distributed
|
|
33
|
-
| NeoLoad projects, GUI, APIs
|
|
34
|
-
| LoadRunner scripts, protocols, VuGen
|
|
35
|
-
| OctoPerf cloud test management
|
|
36
|
-
| Designing workloads, concurrency, pacing
|
|
37
|
-
| Test data, parameterization, CSV feeds
|
|
38
|
-
| Script patterns, correlation, best practices
|
|
39
|
-
| CI/CD, distributed execution, cloud runners
|
|
40
|
-
| Analyzing results, percentiles, SLAs
|
|
41
|
-
| APM, metrics, tracing, dashboards
|
|
42
|
-
| Staging vs production testing strategies
|
|
43
|
-
| gRPC, GraphQL, WebSocket, messaging protocols
|
|
44
|
-
| Database load testing (JDBC, connection pools)
|
|
45
|
-
| Microservices, K8s, serverless performance
|
|
42
|
+
| User needs help with... | Read this file |
|
|
43
|
+
|--------------------------------------------------|---------------------------------------------------|
|
|
44
|
+
| Choosing the right tool | This file — see Tool Selection Matrix below |
|
|
45
|
+
| JMeter scripts, plugins, config | `references/tools/jmeter.md` |
|
|
46
|
+
| k6 scripting, extensions, cloud | `references/tools/k6.md` |
|
|
47
|
+
| Gatling simulations, Scala/Java DSL | `references/tools/gatling.md` |
|
|
48
|
+
| Locust Python tests, distributed | `references/tools/locust.md` |
|
|
49
|
+
| NeoLoad projects, GUI, APIs | `references/tools/neoload.md` |
|
|
50
|
+
| LoadRunner scripts, protocols, VuGen | `references/tools/loadrunner.md` |
|
|
51
|
+
| OctoPerf cloud test management | `references/tools/octoperf.md` |
|
|
52
|
+
| Designing workloads, concurrency, pacing | `references/topics/workload-design.md` |
|
|
53
|
+
| Test data, parameterization, CSV feeds | `references/topics/test-data.md` |
|
|
54
|
+
| Script patterns, correlation, best practices | `references/topics/script-generation.md` |
|
|
55
|
+
| CI/CD, distributed execution, cloud runners | `references/topics/test-execution.md` |
|
|
56
|
+
| Analyzing results, percentiles, SLAs | `references/topics/results-analysis.md` |
|
|
57
|
+
| APM, metrics, tracing, dashboards | `references/topics/observability.md` |
|
|
58
|
+
| Staging vs production testing strategies | `references/topics/production-testing.md` |
|
|
59
|
+
| gRPC, GraphQL, WebSocket, messaging protocols | `references/topics/protocol-testing.md` |
|
|
60
|
+
| Database load testing (JDBC, connection pools) | `references/topics/database-testing.md` |
|
|
61
|
+
| Microservices, K8s, serverless performance | `references/topics/modern-architectures.md` |
|
|
46
62
|
|
|
47
63
|
### Protocol Routing Table
|
|
48
64
|
|
|
49
|
-
When the user's question is protocol-specific, use this to select the
|
|
65
|
+
When the user's question is protocol-specific, use this to select the
|
|
66
|
+
right tool and reference:
|
|
50
67
|
|
|
51
|
-
| Protocol
|
|
52
|
-
|
|
53
|
-
| HTTP / REST
|
|
54
|
-
| gRPC
|
|
55
|
-
| GraphQL
|
|
56
|
-
| WebSocket / SSE
|
|
57
|
-
| JDBC / Database
|
|
58
|
-
| Kafka / Message Queues | k6 (xk6-kafka), JMeter
|
|
59
|
-
| SOAP / WSDL
|
|
60
|
-
| SAP / Citrix
|
|
68
|
+
| Protocol | Recommended Tools | Reference |
|
|
69
|
+
|------------------------|------------------------------|---------------------------------------------------------------|
|
|
70
|
+
| HTTP / REST | k6, Gatling, JMeter | Tool file |
|
|
71
|
+
| gRPC | k6, Gatling, JMeter (plugin) | `references/topics/protocol-testing.md` + tool file |
|
|
72
|
+
| GraphQL | k6, Gatling | `references/topics/protocol-testing.md` + tool file |
|
|
73
|
+
| WebSocket / SSE | Gatling, k6 | `references/topics/protocol-testing.md` + tool file |
|
|
74
|
+
| JDBC / Database | JMeter | `references/topics/database-testing.md` + `references/tools/jmeter.md` |
|
|
75
|
+
| Kafka / Message Queues | k6 (xk6-kafka), JMeter | `references/topics/protocol-testing.md` |
|
|
76
|
+
| SOAP / WSDL | LoadRunner, JMeter | Tool file |
|
|
77
|
+
| SAP / Citrix | LoadRunner, NeoLoad | Tool file |
|
|
61
78
|
|
|
62
79
|
---
|
|
63
80
|
|
|
@@ -65,45 +82,173 @@ When the user's question is protocol-specific, use this to select the right tool
|
|
|
65
82
|
|
|
66
83
|
Use this to recommend the right tool when the user hasn't decided yet.
|
|
67
84
|
|
|
68
|
-
| Criteria
|
|
69
|
-
|
|
70
|
-
| **Language**
|
|
71
|
-
| **Open source**
|
|
85
|
+
| Criteria | JMeter | k6 | Gatling | Locust | NeoLoad | LoadRunner | OctoPerf |
|
|
86
|
+
|----------------------|---------------------|-----------------------|----------------------|----------------|------------------|-------------------------|-----------------------|
|
|
87
|
+
| **Language** | GUI/XML + Groovy | JavaScript/TypeScript | Scala/Java | Python | GUI + NeoLoad DSL| VuGen C-like | Web UI (JMeter-based) |
|
|
88
|
+
| **Open source** | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ (SaaS) |
|
|
72
89
|
| **Protocol support** | HTTP, JDBC, JMS, MQTT, FTP, gRPC | HTTP, gRPC, WS | HTTP, JMS, gRPC | HTTP, gRPC | HTTP, gRPC, WS, SAP | HTTP, Citrix, SAP, Flex | HTTP (JMeter-backed) |
|
|
73
|
-
| **Developer-friendly** | Medium
|
|
74
|
-
| **Enterprise support** | Community + BlazeMeter | Grafana Cloud
|
|
75
|
-
| **CI/CD integration** | Good (Maven/Gradle) | Excellent
|
|
76
|
-
| **Cloud execution**
|
|
77
|
-
| **Best for**
|
|
90
|
+
| **Developer-friendly** | Medium | High | High | High | Low | Low | Medium |
|
|
91
|
+
| **Enterprise support** | Community + BlazeMeter | Grafana Cloud | Gatling Enterprise | Limited | ✅ | ✅ | ✅ |
|
|
92
|
+
| **CI/CD integration** | Good (Maven/Gradle) | Excellent | Excellent | Good | Good | Moderate | Good |
|
|
93
|
+
| **Cloud execution** | BlazeMeter, OctoPerf | Grafana Cloud | Gatling Enterprise | Self-managed | NeoLoad Cloud | AWS/on-prem | OctoPerf Cloud |
|
|
94
|
+
| **Best for** | Legacy systems, JDBC, protocols | Modern APIs, TypeScript devs | High-throughput HTTP | Python teams, flexible | SAP/Citrix enterprise | Mainframe, legacy enterprise | JMeter teams needing cloud UI |
|
|
78
95
|
|
|
79
96
|
### Quick decision rules
|
|
97
|
+
|
|
80
98
|
- **Team writes code** → k6 or Gatling
|
|
81
99
|
- **Team uses GUI** → JMeter or NeoLoad
|
|
82
100
|
- **Python shop** → Locust
|
|
83
101
|
- **SAP / mainframe / Citrix** → LoadRunner or NeoLoad
|
|
84
|
-
- **Need cloud SaaS with minimal setup** → OctoPerf (JMeter) or
|
|
102
|
+
- **Need cloud SaaS with minimal setup** → OctoPerf (JMeter) or
|
|
103
|
+
Grafana Cloud (k6)
|
|
85
104
|
- **Free + protocol variety** → JMeter
|
|
86
|
-
- **Correlation needed for session-heavy flows** → JMeter (with
|
|
105
|
+
- **Correlation needed for session-heavy flows** → JMeter (with
|
|
106
|
+
Correlation Recorder) or LoadRunner
|
|
87
107
|
- **gRPC or GraphQL APIs** → k6 or Gatling
|
|
88
108
|
- **Message queues (Kafka, RabbitMQ)** → k6 (xk6-kafka) or JMeter
|
|
89
109
|
|
|
90
110
|
---
|
|
91
111
|
|
|
112
|
+
## Common Mistakes by Tool
|
|
113
|
+
|
|
114
|
+
These are the mistakes that cause silent CI failures, misleading
|
|
115
|
+
results, or test collapse at scale. Flag them proactively whenever
|
|
116
|
+
reviewing scripts or diagnosing problems — users often don't know to
|
|
117
|
+
ask about them.
|
|
118
|
+
|
|
119
|
+
### k6
|
|
120
|
+
|
|
121
|
+
- **`check()` without `thresholds`** — checks log pass/fail but do
|
|
122
|
+
NOT fail the test run. Without thresholds, CI always reports green
|
|
123
|
+
regardless of latency. Always add `thresholds` to `options`.
|
|
124
|
+
- **Data loaded inside `default()`** — loading CSV or JSON inside the
|
|
125
|
+
VU function runs on every iteration, causing massive per-iteration
|
|
126
|
+
overhead and OOM at scale. Always use `SharedArray` in the init
|
|
127
|
+
scope.
|
|
128
|
+
- **`shared-iterations` for user journeys** — VUs race to claim
|
|
129
|
+
iterations and may skip steps, producing incomplete journey metrics.
|
|
130
|
+
Use `per-vu-iterations` for any multi-step flow.
|
|
131
|
+
- **No `sleep()` between steps** — 100 VUs with zero think time
|
|
132
|
+
generates the absolute maximum RPS for that iteration time, far
|
|
133
|
+
exceeding what 100 real concurrent users produce. Always add
|
|
134
|
+
realistic think time.
|
|
135
|
+
- **`console.log` in `default()`** — causes 30–50% throughput drop
|
|
136
|
+
under load. Use custom metrics (`Counter`, `Trend`) instead.
|
|
137
|
+
- **Hardcoded `BASE_URL`** — use `__ENV.BASE_URL` for environment
|
|
138
|
+
portability.
|
|
139
|
+
|
|
140
|
+
### JMeter
|
|
141
|
+
|
|
142
|
+
- **Listeners enabled in non-GUI runs** — View Results Tree, Aggregate
|
|
143
|
+
Report etc. buffer all samples in memory during headless runs,
|
|
144
|
+
causing memory leak and eventual crash. Disable all listeners before
|
|
145
|
+
CI execution; use `-l results.jtl` for output.
|
|
146
|
+
- **Missing correlation on session-heavy apps** — JSESSIONID, CSRF
|
|
147
|
+
tokens, ViewState, OAuth codes must be extracted and reused. Without
|
|
148
|
+
correlation, the test fails for every user after the first.
|
|
149
|
+
- **Hardcoded thread counts** — parameterize via JMeter properties
|
|
150
|
+
(`${__P(threads,10)}`) so CI can override without editing the JMX.
|
|
151
|
+
- **Zero think time** — never reflects real user behavior; always add
|
|
152
|
+
at minimum a Constant Timer (300–500ms) between samplers.
|
|
153
|
+
- **Throughput Controller % mode misuse** — percentage applies per
|
|
154
|
+
iteration of the parent controller, not globally. Most users expect
|
|
155
|
+
global percentage; use `Total Executions` mode instead or be
|
|
156
|
+
explicit.
|
|
157
|
+
|
|
158
|
+
### Gatling
|
|
159
|
+
|
|
160
|
+
- **Blocking calls inside `exec()`** — any blocking I/O inside an exec
|
|
161
|
+
block stalls the entire Akka actor, killing simulation concurrency.
|
|
162
|
+
Use Gatling's async feed/session API exclusively.
|
|
163
|
+
- **Missing `.check()` on responses** — without checks, 4xx and 5xx
|
|
164
|
+
responses are silently counted as successful. Always add at minimum
|
|
165
|
+
`.check(status.is(200))`.
|
|
166
|
+
- **Fixed `pause()` values** — use `uniformPaused(min, max)` or
|
|
167
|
+
`normalPausedWithPercentageDuration` for realistic think time
|
|
168
|
+
distribution.
|
|
169
|
+
|
|
170
|
+
### Locust
|
|
171
|
+
|
|
172
|
+
- **`self.client` without `catch_response=True`** — by default, Locust
|
|
173
|
+
marks any HTTP response as success regardless of status code. Use
|
|
174
|
+
`with self.client.get(..., catch_response=True) as r:` and call
|
|
175
|
+
`r.failure()` explicitly.
|
|
176
|
+
- **Unequal task weights without intent** — tasks default to equal
|
|
177
|
+
weight; if your user journey has unequal step frequency, set weights
|
|
178
|
+
explicitly or the journey ratio will be wrong.
|
|
179
|
+
- **Master + workers on same machine** — causes resource contention
|
|
180
|
+
that skews both throughput and latency measurements. Always run
|
|
181
|
+
workers on separate machines or containers for distributed tests.
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Cross-Tool Concept Mapping
|
|
186
|
+
|
|
187
|
+
Use this when users are migrating between tools or asking how a
|
|
188
|
+
concept from one tool maps to another. Claude should always provide
|
|
189
|
+
the specific mapping rather than a generic explanation.
|
|
190
|
+
|
|
191
|
+
| Concept | JMeter | k6 | Gatling | Locust | LoadRunner |
|
|
192
|
+
|------------------|-------------------------|-------------------------|--------------------------|--------------------------|---------------------|
|
|
193
|
+
| Virtual user | Thread | VU | User | User | Vuser |
|
|
194
|
+
| Test plan | .jmx file | .js / .ts script | Simulation class | .py file | VuGen script (.usr) |
|
|
195
|
+
| User entrypoint | Thread Group | `default()` function | `scenario()` | task methods | `Action()` |
|
|
196
|
+
| Concurrency ctrl | Thread Group settings | executor | `inject()` | `spawn_rate` | Vuser Group |
|
|
197
|
+
| Think time | Constant/Uniform Timer | `sleep()` | `pause()` | `time.sleep()` | `lr_think_time()` |
|
|
198
|
+
| Inline assertion | Response Assertion | `check()` | `.check()` | `catch_response` | `lr_eval_string()` |
|
|
199
|
+
| SLA enforcement | Duration Assertion | `thresholds` | Assertions (Enterprise) | custom + exit code | SLA definition |
|
|
200
|
+
| Correlation | Regex / CSS Extractor | `res.json()` / regex | `.check()` + `saveAs()` | `response.text` + regex | `web_reg_save_param`|
|
|
201
|
+
| Data feed | CSV Data Set Config | `SharedArray` | `feeder` | CSV reader | `lr_paramarr()` |
|
|
202
|
+
| Grouping | Transaction Controller | `group()` | `group()` | task sets | Transaction |
|
|
203
|
+
| Distributed | Controller + Agents | k6 cloud / k6 operator | Gatling Enterprise | master + workers | Load Generator |
|
|
204
|
+
| Results output | .jtl (CSV/XML) | JSON / InfluxDB / cloud | simulation.log | CSV / Locust web UI | .lrr file |
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Threshold Starting Points
|
|
209
|
+
|
|
210
|
+
These are community baselines — always tell the user to adjust these
|
|
211
|
+
to their actual SLA requirements. Never present them as universal
|
|
212
|
+
targets.
|
|
213
|
+
|
|
214
|
+
| Endpoint type | p95 | p99 | Error rate | Notes |
|
|
215
|
+
|------------------|-----------|------------|------------|------------------------------------|
|
|
216
|
+
| Web page (HTML) | < 3000ms | < 5000ms | < 1% | Aligns with Google CWV LCP < 2.5s |
|
|
217
|
+
| REST API | < 500ms | < 1000ms | < 1% | Common industry baseline |
|
|
218
|
+
| Auth / Login | < 300ms | < 500ms | < 0.1% | Stricter — security-sensitive path |
|
|
219
|
+
| Search / Query | < 800ms | < 1500ms | < 0.5% | Varies heavily by dataset size |
|
|
220
|
+
| Write (POST/PUT) | < 800ms | < 1500ms | < 0.5% | Includes DB write latency |
|
|
221
|
+
| Checkout/Payment | < 1000ms | < 2000ms | < 0.1% | Stricter — revenue-critical path |
|
|
222
|
+
| Background/async | < 5000ms | < 10000ms | < 2% | Batch jobs, async processors |
|
|
223
|
+
|
|
224
|
+
**k6 specific:** Always define both `http_req_duration` AND
|
|
225
|
+
`http_req_waiting` as separate thresholds. `http_req_waiting`
|
|
226
|
+
(TTFB) isolates server-side latency from network overhead — it is
|
|
227
|
+
the first metric to check when diagnosing high p95. Always include
|
|
228
|
+
`checks: ['rate>0.99']`.
|
|
229
|
+
|
|
230
|
+
**JMeter specific:** Add both a Response Assertion and a Duration
|
|
231
|
+
Assertion per sampler. Never rely on listener output alone for
|
|
232
|
+
CI pass/fail; use the JMeter exit code driven by assertions.
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
92
236
|
## Performance Testing Lifecycle Overview
|
|
93
237
|
|
|
94
|
-
Always think through these phases when helping a user — they often ask
|
|
238
|
+
Always think through these phases when helping a user — they often ask
|
|
239
|
+
about one phase but need context from others.
|
|
95
240
|
|
|
96
241
|
```
|
|
97
242
|
1. PLAN
|
|
98
|
-
└─ Workload design → concurrency model → SLA targets → test type
|
|
243
|
+
└─ Workload design → concurrency model → SLA targets → test type
|
|
99
244
|
→ references/topics/workload-design.md
|
|
100
245
|
|
|
101
246
|
2. DATA
|
|
102
|
-
└─ Identify variables → parameterization strategy →
|
|
247
|
+
└─ Identify variables → parameterization strategy → data generation
|
|
103
248
|
→ references/topics/test-data.md
|
|
104
249
|
|
|
105
250
|
3. SCRIPT
|
|
106
|
-
└─ Record or code → correlation → parameterization → assertions
|
|
251
|
+
└─ Record or code → correlation → parameterization → assertions
|
|
107
252
|
→ references/topics/script-generation.md + tool-specific file
|
|
108
253
|
|
|
109
254
|
4. EXECUTE
|
|
@@ -127,38 +272,48 @@ Always think through these phases when helping a user — they often ask about o
|
|
|
127
272
|
|
|
128
273
|
## Common Performance Test Types
|
|
129
274
|
|
|
130
|
-
| Test Type
|
|
131
|
-
|
|
132
|
-
| **Load**
|
|
133
|
-
| **Stress**
|
|
134
|
-
| **Soak/Endurance** | Detect memory leaks, slow degradation | Resource trend over time (hours)
|
|
135
|
-
| **Spike**
|
|
136
|
-
| **Capacity**
|
|
137
|
-
| **Smoke**
|
|
138
|
-
| **Breakpoint**
|
|
275
|
+
| Test Type | Goal | Key Metric |
|
|
276
|
+
|------------------|---------------------------------------|-----------------------------------------|
|
|
277
|
+
| **Load** | Validate system at expected load | Response time, throughput, error rate |
|
|
278
|
+
| **Stress** | Find the breaking point | Max VUs before degradation, error onset |
|
|
279
|
+
| **Soak/Endurance** | Detect memory leaks, slow degradation | Resource trend over time (hours) |
|
|
280
|
+
| **Spike** | Behavior under sudden traffic burst | Recovery time, error spike |
|
|
281
|
+
| **Capacity** | Find max sustainable load | Throughput ceiling at SLA thresholds |
|
|
282
|
+
| **Smoke** | Quick sanity check | Single VU — no errors |
|
|
283
|
+
| **Breakpoint** | Incremental ramp until failure | Failure threshold VU count |
|
|
139
284
|
|
|
140
285
|
---
|
|
141
286
|
|
|
142
287
|
## Key Principles to Always Apply
|
|
143
288
|
|
|
144
|
-
1. **Never test against production blindly** — always have a rollback
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
289
|
+
1. **Never test against production blindly** — always have a rollback
|
|
290
|
+
plan and alerting in place.
|
|
291
|
+
2. **Baseline first** — always establish a baseline before stress or
|
|
292
|
+
soak runs.
|
|
293
|
+
3. **Think time and pacing matter** — unrealistic zero-think-time tests
|
|
294
|
+
produce misleading results.
|
|
295
|
+
4. **Parameterize everything** — hardcoded credentials, tokens, and IDs
|
|
296
|
+
will fail at scale.
|
|
297
|
+
5. **Assertions are not optional** — tests without assertions are just
|
|
298
|
+
generating traffic, not validating behavior.
|
|
299
|
+
6. **Isolate the system under test** — shared environments invalidate
|
|
300
|
+
results.
|
|
301
|
+
7. **Correlate dynamic values** — session tokens, CSRF, ViewState etc.
|
|
302
|
+
must be extracted and reused.
|
|
151
303
|
|
|
152
304
|
---
|
|
153
305
|
|
|
154
306
|
## Asking the Right Questions
|
|
155
307
|
|
|
156
|
-
When a user brings a performance problem, ask (or infer) these before
|
|
308
|
+
When a user brings a performance problem, ask (or infer) these before
|
|
309
|
+
prescribing a solution:
|
|
157
310
|
|
|
158
311
|
- What is the **target concurrency** (VUs or RPS)?
|
|
159
312
|
- What is the **SLA** (e.g., p95 < 500ms, error rate < 1%)?
|
|
160
313
|
- What is the **protocol** (HTTP/REST, gRPC, JDBC, WebSocket)?
|
|
161
|
-
- Is the app **stateful** (session-based) or **stateless**
|
|
314
|
+
- Is the app **stateful** (session-based) or **stateless**
|
|
315
|
+
(token-based)?
|
|
162
316
|
- Where will tests **run from** (local, CI, cloud)?
|
|
163
317
|
- What **environment** is being tested (dev, staging, prod)?
|
|
164
|
-
- Is there an **APM tool** in place (Datadog, Dynatrace, Grafana,
|
|
318
|
+
- Is there an **APM tool** in place (Datadog, Dynatrace, Grafana,
|
|
319
|
+
New Relic)?
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "perf",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "I'm using k6 checks to validate all my API responses. My CI pipeline shows all tests passing but users are complaining about slowness. What am I missing?",
|
|
7
|
+
"expected_output": "Identifies that checks do not fail the test run — thresholds are required for CI enforcement. Provides a concrete threshold example.",
|
|
8
|
+
"files": [],
|
|
9
|
+
"assertions": [
|
|
10
|
+
{
|
|
11
|
+
"id": "checks-vs-thresholds-distinction",
|
|
12
|
+
"text": "Explicitly states that checks do NOT produce a non-zero exit code and cannot fail a CI pipeline"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "thresholds-required",
|
|
16
|
+
"text": "States that thresholds in options.thresholds are required to enforce SLA in CI"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": "concrete-example",
|
|
20
|
+
"text": "Provides a concrete threshold code example, not just an explanation"
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": 2,
|
|
26
|
+
"prompt": "I need to load test a Kafka consumer that processes order events. What tool should I use and how do I get started?",
|
|
27
|
+
"expected_output": "Recommends xk6-kafka with the custom build command, or JMeter with Kafka plugin. Does not suggest a generic HTTP tool.",
|
|
28
|
+
"files": [],
|
|
29
|
+
"assertions": [
|
|
30
|
+
{
|
|
31
|
+
"id": "correct-tool",
|
|
32
|
+
"text": "Recommends xk6-kafka or JMeter Kafka plugin — not a generic HTTP tool like plain k6 or Gatling HTTP"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "xk6-build-command",
|
|
36
|
+
"text": "Includes the xk6 custom build command or JMeter plugin installation reference"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": "not-http",
|
|
40
|
+
"text": "Does not suggest testing Kafka via HTTP endpoints as a primary approach"
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": 3,
|
|
46
|
+
"prompt": "My JMeter test runs fine locally but JMeter crashes after 20 minutes in CI with an OutOfMemoryError. The test plan works on my machine with 50 threads.",
|
|
47
|
+
"expected_output": "Identifies listeners enabled in non-GUI run as the primary cause. Recommends disabling listeners and using -l flag for output.",
|
|
48
|
+
"files": [],
|
|
49
|
+
"assertions": [
|
|
50
|
+
{
|
|
51
|
+
"id": "listener-root-cause",
|
|
52
|
+
"text": "Identifies enabled listeners (View Results Tree, Aggregate Report etc.) in non-GUI runs as the memory leak cause"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"id": "disable-listeners",
|
|
56
|
+
"text": "Recommends disabling listeners in the test plan for CI runs"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "jtl-output",
|
|
60
|
+
"text": "Mentions using -l results.jtl flag as the correct output method for non-GUI runs"
|
|
61
|
+
}
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": 4,
|
|
66
|
+
"prompt": "We're migrating our load tests from LoadRunner to k6. What does a VuGen Action map to in k6, and what about think time and correlation?",
|
|
67
|
+
"expected_output": "Maps VuGen Action → k6 default() function. Maps lr_think_time() → sleep(). Maps web_reg_save_param → res.json() or regex extraction.",
|
|
68
|
+
"files": [],
|
|
69
|
+
"assertions": [
|
|
70
|
+
{
|
|
71
|
+
"id": "action-mapping",
|
|
72
|
+
"text": "Maps VuGen Action() specifically to k6 default() function"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": "think-time-mapping",
|
|
76
|
+
"text": "Maps lr_think_time() to k6 sleep()"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"id": "correlation-mapping",
|
|
80
|
+
"text": "Maps web_reg_save_param or LoadRunner correlation to k6 res.json() or regex extraction"
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"id": 5,
|
|
86
|
+
"prompt": "I'm writing a k6 script for an e-commerce checkout flow: login → browse → add to cart → checkout. Should I use shared-iterations or per-vu-iterations?",
|
|
87
|
+
"expected_output": "Recommends per-vu-iterations. Explains that shared-iterations causes VUs to skip steps in multi-step journeys, producing incorrect metrics.",
|
|
88
|
+
"files": [],
|
|
89
|
+
"assertions": [
|
|
90
|
+
{
|
|
91
|
+
"id": "correct-executor",
|
|
92
|
+
"text": "Recommends per-vu-iterations for the user journey"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"id": "shared-iterations-problem",
|
|
96
|
+
"text": "Explains why shared-iterations is wrong for journeys — VUs race for iterations and may skip steps"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"id": "not-ambiguous",
|
|
100
|
+
"text": "Gives a clear recommendation, not a 'it depends' answer without a conclusion"
|
|
101
|
+
}
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": 6,
|
|
106
|
+
"prompt": "My Locust test shows zero failures even though I can see 404 and 500 errors in the server logs during the test run.",
|
|
107
|
+
"expected_output": "Identifies missing catch_response=True as the cause. Without it, Locust counts all HTTP responses as success regardless of status code.",
|
|
108
|
+
"files": [],
|
|
109
|
+
"assertions": [
|
|
110
|
+
{
|
|
111
|
+
"id": "catch-response-cause",
|
|
112
|
+
"text": "Identifies missing catch_response=True as the root cause"
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"id": "failure-call",
|
|
116
|
+
"text": "Explains that r.failure() must be called explicitly inside the catch_response context manager"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"id": "code-example",
|
|
120
|
+
"text": "Provides a corrected code snippet using catch_response=True"
|
|
121
|
+
}
|
|
122
|
+
]
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"id": 7,
|
|
126
|
+
"prompt": "What are good starting threshold values for a REST API and a checkout payment endpoint in k6?",
|
|
127
|
+
"expected_output": "Provides differentiated thresholds: REST API p95<500ms, checkout p95<1000ms with stricter error rate. Includes both http_req_duration and http_req_waiting. Notes these are baselines to adjust.",
|
|
128
|
+
"files": [],
|
|
129
|
+
"assertions": [
|
|
130
|
+
{
|
|
131
|
+
"id": "differentiated-thresholds",
|
|
132
|
+
"text": "Gives different threshold values for REST API vs checkout — not the same value for both"
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"id": "http-req-waiting",
|
|
136
|
+
"text": "Includes http_req_waiting as a separate threshold alongside http_req_duration"
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"id": "checks-threshold",
|
|
140
|
+
"text": "Includes checks: rate>0.99 threshold"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"id": "adjust-caveat",
|
|
144
|
+
"text": "Notes that values are baselines and should be adjusted to actual SLA requirements"
|
|
145
|
+
}
|
|
146
|
+
]
|
|
147
|
+
}
|
|
148
|
+
]
|
|
149
|
+
}
|