perf-ecosystem.yml
perf-ecosystem.yml is a single configuration file that all ecosystem tools discover automatically. Place it in your project root and each tool connects itself to the configured services.
Discovery
Section titled “Discovery”Tools walk up the directory tree from the current working directory until they find perf-ecosystem.yml or reach the .git boundary. No environment variable or flag is needed — discovery is automatic.
Full Reference
Section titled “Full Reference”# Schema version: 1.0
version: "1.0"
workspace: name: "my-application" # Project name, used in reports team: "platform-team" environment: staging # dev | staging | prod
services: dummydatagenpro: url: "https://dummydatagenpro.co.uk" api_key: "${DUMMYDATA_API_KEY}"
perf_lint_api: url: "https://perflint.martkos-it.co.uk" api_key: "${PERF_LINT_API_KEY}"
licenses: perf_reporting: "${PERF_REPORTING_LICENSE}" perf_lab: "${PERF_LAB_LICENSE}" perf_script_studio: "${PERF_SCRIPT_STUDIO_LICENSE}" # perf_migrator is still read, so existing configuration keeps working. There has # never been a perf_autocorrelator_pro key: the binary does not look for one, and a # licence configured under that name is silently ignored. perf_migrator: "${PERF_MIGRATOR_LICENSE}"
tools: default: jmeter # jmeter | k6 | gatling jmeter: home: "/opt/apache-jmeter-5.6.3" image: "ghcr.io/markslilley/perf-jmeter:latest" k6: image: "ghcr.io/markslilley/perf-k6:latest" gatling: image: "ghcr.io/markslilley/perf-gatling:latest"
thresholds: response_time: avg_max_ms: 500 p95_max_ms: 1500 p99_max_ms: 3000 error_rate: max_percent: 1.0 apdex: min_score: 0.85
notifications: slack: webhook_url: "${SLACK_WEBHOOK_URL}" channel: "#perf-alerts" on_failure: true on_sla_breach: true on_regression: true
integrations: auto_lint_on_run: false # Run perf-lint before executing scripts migrator_validate: false # Auto-run perf-lint on perf-script-studio outputEnvironment Variable Interpolation
Section titled “Environment Variable Interpolation”Values matching ${VAR_NAME} are substituted before parsing. An unresolved variable resolves to null — the integration is silently disabled rather than throwing an error. This means a partial config — only perf_lint_api, say — works correctly without needing to remove unconfigured sections.
services: perf_lint_api: api_key: "${PERF_LINT_API_KEY}" # → null if var not set → remote rule sync disabledStore secrets in .env (excluded from git) or your CI/CD secrets store. Never commit API keys directly.
Minimal Config
Section titled “Minimal Config”You don’t need all sections. A minimal setup that licenses the tools and sets one SLA:
version: "1.0"
licenses: perf_script_studio: "${PERF_SCRIPT_STUDIO_LICENSE}" perf_reporting: "${PERF_REPORTING_LICENSE}"
thresholds: response_time: p95_max_ms: 1500 error_rate: max_percent: 1.0Which Tools Consume Which Sections
Section titled “Which Tools Consume Which Sections”| Section | Consumed By |
|---|---|
services.perf_lint_api | perf-lint (remote rule sync), perf-script-studio (post-convert lint) |
services.dummydatagenpro | test-data generation steps |
licenses.* | perf-reporting, perf-lab, perf-script-studio (perf_migrator still read) |
tools.* | executor image selection |
thresholds.* | perf-reporting (SLA checks and regression gating) |
integrations.* | All tools — control auto-integration behaviour |
Getting the Example File
Section titled “Getting the Example File”curl -O https://raw.githubusercontent.com/markslilley/perf-ecosystem/main/perf-ecosystem.example.ymlcp perf-ecosystem.example.yml perf-ecosystem.yml