agentleFS
canyonlabzcanyonlabz/perfpilot-hub/.cursor/skills/performance-testing-workflow/SKILL.md

performance-testing-workflow

Skill5 starsChanged 6 months agoMITView on GitHub

End-to-end performance testing pipeline orchestrating BlazeMeter, Datadog, PerfAnalysis, PerfReport, and Confluence MCP workflows sequentially. Use when the user mentions performance testing workflow, E2E pipeline, BlazeMeter results, test run analysis, performance report generation, or end-to-end test processing.

We split this skill into the rules it gives an agent

43 rules. About 0 are common, 35 are distinctive, and 8 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈35

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 8

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    After completing this workflow, the user can proceed to:

    line 138
  2. Distinctive:

    Context management: Use task tracking to maintain state.

    line 152
  3. Distinctive:

    Follow these steps exactly, in order.

    line 159
  4. Distinctive:

    Ask the user for the following values.

    line 165
  5. Distinctive:

    If the user provides Confluence information, assume they want to publish results.

    line 184
  6. Distinctive:

    Update task status as each step completes.

    line 200
  7. Distinctive:

    If start/end times cannot be extracted, fall back to extracting from the aggregate report in step 2e.

    line 223
  8. Very specific:

    Idempotent: If status is "partial" or "error", re-run with the same parameters.

    line 249
  9. Distinctive:

    When: Only if the JMeter MCP server is available.

    line 280
  10. Distinctive:

    If the JMeter MCP server is not available, skip this step.

    line 291
  11. Distinctive:

    Verify these files exist before proceeding:

    line 295
  12. Distinctive:

    On error: If API calls fail, retry up to 3 times.

    line 302
  13. Distinctive:

    Do not proceed to the next workflow if BlazeMeter fails.

    line 303
  14. Distinctive:

    Do not proceed until all prerequisites are met.

    line 322
  15. Distinctive:

    When: Only if the user provides a list of custom KPI query names.

    line 399
  16. Distinctive:

    Do not proceed to the next workflow if Datadog fails.

    line 428
  17. Distinctive:

    Do not proceed until both BlazeMeter and Datadog workflows have completed successfully.

    line 446
  18. Distinctive:

    Do NOT attempt to fix code or modify files.

    line 518
  19. Distinctive:

    Do not proceed until PerfAnalysis has completed successfully.

    line 536
  20. Very specific:

    Default format is Markdown ("md"), but can also generate PDF ("pdf") or Word ("docx").

    line 548
  21. Very specific:

    If regenerating an existing report, check artifacts/{run_id}/reports/report_metadata_{run_id}.json for the template_used field and pass …

    line 550
  22. Very specific:

    If no template is specified, defaults to default_report_template.md.

    line 553
  23. Distinctive:

    When: Only execute if Confluence details were provided in Collect Inputs.

    line 617
  24. Distinctive:

    Do not proceed until all prerequisites are met and PerfReport has completed.

    line 626
  25. Very specific:

    Search for the space matching confluence_space.

    line 636
  26. Very specific:

    If parent_page_id is provided:

    line 652
  27. Very specific:

    Search results for the page matching parent_page_name.

    line 670
  28. Distinctive:

    If no title is provided, the title is extracted from the Markdown H1 heading.

    line 701
  29. Distinctive:

    Check response for attached/failed counts.

    line 717
  30. Very specific:

    Check response for placeholders_replaced and placeholders_remaining.

    line 731
  31. Distinctive:

    On error: If API calls fail, retry up to 3 times.

    line 746
  32. Distinctive:

    Input: All data collected throughout the workflow.

    line 755
  33. Distinctive:

    Action: After all test runs are processed, generate a comprehensive summary.

    line 757
  34. Distinctive:

    Do not include per-API breakdowns, only aggregate metrics.

    line 789
  35. Distinctive:

    If multiple test runs were processed, provide a side-by-side comparison table:

    line 793
  36. Distinctive:

    Wait 5-10 seconds between retries to prevent HTTP 429

    line 824
  37. Distinctive:

    If retries fail, stop and report to user

    line 825
  38. Distinctive:

    Do NOT retry on failure

    line 828
  39. Distinctive:

    Do NOT attempt to fix code or modify MCP source files

    line 830
  40. Distinctive:

    Stop and report to user

    line 831
  41. Distinctive:

    Sequential execution: Do not proceed to the next workflow if the current one fails.

    line 833
  42. Distinctive:

    Do NOT write code to fix MCP tool issues.

    line 835
  43. Distinctive:

    Ask the user for next steps on any unrecoverable failure.

    line 836

≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

End-to-End Performance Testing Workflow

When to Use This Skill

  • User wants to run the full performance testing pipeline (BlazeMeter through Confluence)
  • User mentions E2E workflow, performance testing workflow, or test run processing
  • User has BlazeMeter test run IDs and wants to generate reports
  • User wants to collect BlazeMeter results, Datadog metrics, analyze, and report
  • User wants to run any individual sub-workflow (BlazeMeter, Datadog, PerfAnalysis, PerfReport, or Confluence) standalone

Reference

This section provides context for humans and capable models. For the step-by-step execution instructions, skip to the Execution section below.

What This Workflow Does

Orchestrates the complete performance testing pipeline from retrieving BlazeMeter/JMeter test results through publishing reports to Confluence. It coordinates multiple MCP workflows sequentially, ensuring data flows correctly between each step.

The pipeline executes in this order:

  1. BlazeMeter MCP — Retrieves and processes test results
  2. Datadog MCP — Collects infrastructure metrics, logs, and APM traces
  3. PerfAnalysis MCP — Analyzes performance data and correlates results
  4. PerfReport MCP — Generates formatted reports and charts
  5. Confluence MCP (Optional) — Publishes reports to Confluence

Each workflow can also be run independently if needed (e.g., running Datadog workflow days after test completion).

Data Flow Between Workflows

Variables that must be passed between workflows:

VariableSourceDestination
run_idUser inputAll workflows
start_timeBlazeMeter get_run_resultsDatadog workflow
end_timeBlazeMeter get_run_resultsDatadog workflow
environmentUser inputDatadog, PerfAnalysis, PerfReport
sessionsIdBlazeMeter get_run_resultsBlazeMeter process_session_artifacts
space_refConfluence list_spacesConfluence create_page
parent_idConfluence get_page_by_id / list_pagesConfluence create_page
page_refConfluence create_pageConfluence attach_images, update_page

Tool Reference

BlazeMeter MCP Tools

ToolPurposeKey Parameters
get_run_resultsGet test run results, extract start/end times and sessionsIdtest_run_id
get_artifacts_pathGet local artifact storage pathrun_id
process_session_artifactsDownload, extract, and process session artifactsrun_id, sessions_id_list
get_public_reportGet public BlazeMeter report URLtest_run_id
get_aggregate_reportGet aggregate performance report CSVtest_run_id

Datadog MCP Tools

ToolPurposeKey Parameters
load_environmentLoad environment config (host-based or k8s-based)env_name
get_host_metricsGet CPU/Memory metrics for host-based environmentsrun_id, env_name, start_time, end_time
get_kubernetes_metricsGet CPU/Memory metrics for k8s-based environmentsrun_id, env_name, start_time, end_time
get_logsGet logs from Datadogrun_id, env_name, query_type, start_time, end_time
get_apm_tracesGet APM traces from Datadogrun_id, env_name, query_type, start_time, end_time
get_kpi_timeseriesGet custom KPI metrics (optional)env_name, query_names (list), start_time, end_time, run_id, scope (optional)

PerfAnalysis MCP Tools

ToolPurposeKey Parameters
analyze_test_resultsAnalyze BlazeMeter test resultstest_run_id
analyze_environment_metricsAnalyze Datadog infrastructure metricstest_run_id, environment
correlate_test_resultsCross-correlate BlazeMeter and Datadog datatest_run_id
analyze_logsAnalyze JMeter/BlazeMeter and Datadog logstest_run_id
identify_bottlenecksBottleneck analysis and concurrency threshold detectiontest_run_id

PerfReport MCP Tools

ToolPurposeKey Parameters
create_performance_test_reportGenerate performance report (MD/PDF/DOCX)run_id, template (optional), format
list_chart_typesList available chart options and chart_id values—
create_chartCreate a chart image (PNG)run_id, chart_id, env_name (for infra charts)

Confluence MCP Tools

ToolPurposeKey Parameters
list_spacesList Confluence spacesmode
get_space_detailsGet space metadataspace_ref, mode
get_page_by_idLook up page by IDpage_id, mode
list_pagesList pages in a space (search by name)space_ref, mode
get_available_reportsList available reports for a test runtest_run_id
create_pageCreate Confluence page from Markdown reportspace_ref, test_run_id, filename, mode, parent_id, report_type
attach_imagesAttach chart PNGs to a pagepage_ref, test_run_id, mode, report_type
update_pageReplace chart placeholders with embedded imagespage_ref, test_run_id, mode, report_type

JMeter MCP Tools (Optional)

ToolPurposeKey Parameters
analyze_jmeter_logAnalyze JMeter log for errors and issuestest_run_id, log_source

report_type Parameter

The report_type parameter determines artifact paths for Confluence publishing:

  • "single_run" — Individual test run reports (this workflow)
    • Reports: artifacts/{test_run_id}/reports/
    • Charts: artifacts/{test_run_id}/charts/
  • "comparison" — Comparison reports (see .cursor/skills/comparison-report-workflow/SKILL.md)
    • Reports: artifacts/comparisons/{comparison_id}/
    • Charts: artifacts/comparisons/{comparison_id}/charts/

Related Rules

  • prerequisites.mdc — test_run_id and artifact structure validation
  • skill-execution-rules.mdc — Follow steps in order, collect inputs first, do not skip
  • mcp-error-handling.mdc — MCP tool error handling (retry policy, reporting format)

Downstream Workflows

After completing this workflow, the user can proceed to:

  • AI HITL Report Revision — .cursor/skills/report-revision-workflow/SKILL.md Iterative AI-assisted revision of report sections (executive summary, key observations, issues table) with version tracking.
  • Comparison Report — .cursor/skills/comparison-report-workflow/SKILL.md Multi-run comparison report with comparison charts and Confluence publishing. Requires the E2E workflow to have completed for each individual test run first.

Important Notes

  • Sequential execution: Each workflow must complete before proceeding to the next.
  • Independence: Each sub-workflow can run standalone if needed.
  • Multiple test runs: Process sequentially (Run 1 complete -> Run 2 complete).
  • Context management: Use task tracking to maintain state. If context is lost, the task list can be referenced to resume from the last completed step.

Execution

Follow these steps exactly, in order. Each step has one or more actions.


Collect Inputs

Ask the user for the following values. Do not proceed until all required values are collected.

REQUIRED:
  test_mode = [single test run or multiple test runs]
  run_id    = [for each test run — e.g., "7654321"]
  env_name  = [environment name — e.g., "QA", "UAT"]

OPTIONAL:
  test_name = [informational label for the test run]
  env_type  = [for validation — "Hosts-based" or "Kubernetes-based"]

CONDITIONAL (only if publishing to Confluence):
  confluence_mode  = ["cloud" or "onprem"]
  confluence_space = [space name — e.g., "Quality Engineering"]
  parent_page_name = [e.g., "AI Generated Test Reports"]
  parent_page_id   = [optional — e.g., "123456789"]

If the user provides Confluence information, assume they want to publish results.


Step 1 — Initialize Task Tracking

Input: run_id(s), workflow list

Action: For each test run, create granular task items to monitor progress:

  • BlazeMeter workflow steps (6 steps)
  • Datadog workflow steps (5 steps)
  • PerfAnalysis workflow steps (5 steps)
  • PerfReport workflow steps (4 steps)
  • Confluence workflow steps (7 steps, if applicable)

Update task status as each step completes. This allows resuming if context is lost.


Step 2 — BlazeMeter MCP Workflow

Prerequisites: run_id collected from user.

For each test run, process sequentially (Run 1 complete -> Run 2).

2a. Get Test Run Results

get_run_results(
  test_run_id = {run_id}
)

Save:

  • start_time = extracted from the test run results
  • end_time = extracted from the test run results
  • sessionsId = list of session IDs from the response

If start/end times cannot be extracted, fall back to extracting from the aggregate report in step 2e.

2b. Get Artifacts Path

get_artifacts_path(
  run_id = {run_id}
)

Save: artifacts_path from the response.

2c. Process Session Artifacts

process_session_artifacts(
  run_id          = {run_id},
  sessions_id_list = {sessionsId}
)

This single tool handles downloading, extracting, and processing all session artifacts:

  • Single-session (1 entry in sessionsId): produces test-results.csv and jmeter.log
  • Multi-session (N entries): produces combined test-results.csv and jmeter-1.log through jmeter-N.log
  • Built-in retry: each session retried up to 3 times automatically
  • Idempotent: If status is "partial" or "error", re-run with the same parameters. It skips completed sessions and retries only failed ones.

2d. Get Public Report

get_public_report(
  test_run_id = {run_id}
)

Save: public_url from the response.

Action: Save the returned URL to artifacts/{run_id}/blazemeter/public_report.json:

{"run_id": "{run_id}", "public_url": "{url}", "public_token": "{token}"}

This enables PerfReport to include a direct link to the BlazeMeter report.

2e. Get Aggregate Report

get_aggregate_report(
  test_run_id = {run_id}
)

2f. Analyze JMeter Logs (Optional)

When: Only if the JMeter MCP server is available.

analyze_jmeter_log(
  test_run_id = {run_id},
  log_source  = "blazemeter"
)

Discovers all .log files in artifacts/{run_id}/blazemeter/ automatically. Output files are used downstream by PerfAnalysis and PerfReport. If the JMeter MCP server is not available, skip this step.

2g. Validation

Verify these files exist before proceeding:

  • artifacts/{run_id}/blazemeter/aggregate_performance_report.csv
  • artifacts/{run_id}/blazemeter/test-results.csv
  • artifacts/{run_id}/blazemeter/jmeter.log (single-session) OR artifacts/{run_id}/blazemeter/jmeter-*.log (multi-session)
  • artifacts/{run_id}/blazemeter/sessions/session_manifest.json

On error: If API calls fail, retry up to 3 times. If retries fail, stop and report. Do not proceed to the next workflow if BlazeMeter fails.

Save forward:

  • run_id -> all downstream workflows
  • start_time -> Datadog workflow
  • end_time -> Datadog workflow

Update task tracking: Mark all BlazeMeter steps as completed.


Step 3 — Datadog MCP Workflow

Prerequisites:

  • env_name provided by the user
  • run_id from BlazeMeter workflow
  • start_time and end_time from BlazeMeter workflow
  • BlazeMeter workflow must have completed successfully

Do not proceed until all prerequisites are met.

3a. Load Environment

load_environment(
  env_name = {env_name}
)

This automatically loads the complete environment configuration, identifies the environment type (host-based or k8s-based), and loads all resources with CPU/Memory specs.

Save: env_type = host-based or k8s-based from the response.

3b. Get Infrastructure Metrics

Decision gate — choose based on env_type:

If host-based:

get_host_metrics(
  run_id     = {run_id},
  env_name   = {env_name},
  start_time = {start_time},
  end_time   = {end_time}
)

If k8s-based:

get_kubernetes_metrics(
  run_id     = {run_id},
  env_name   = {env_name},
  start_time = {start_time},
  end_time   = {end_time}
)

Metrics pulled should be CPU and Memory only.

3c. Get Logs

get_logs(
  run_id     = {run_id},
  env_name   = {env_name},
  query_type = {query_type},
  start_time = {start_time},
  end_time   = {end_time}
)

Log query types: "warnings", "all_errors", "api_errors", "service_errors", "host_errors", "kubernetes_errors", or "custom". Custom log queries are defined in datadog-mcp/custom_queries.json using "Keys" for query_type.

3d. Get APM Traces

get_apm_traces(
  run_id     = {run_id},
  env_name   = {env_name},
  query_type = {query_type},
  start_time = {start_time},
  end_time   = {end_time}
)

APM query types: "all_errors", "service_errors", "http_500_errors", "http_errors", "slow_requests", or "custom". Custom APM queries are defined in datadog-mcp/custom_queries.json using "Keys" for query_type.

3e. Get Custom KPI Metrics (Optional)

When: Only if the user provides a list of custom KPI query names.

get_kpi_timeseries(
  env_name    = {env_name},
  query_names = {list of query group keys},
  start_time  = {start_time},
  end_time    = {end_time},
  run_id      = {run_id},
  scope       = {scope}
)
  • query_names is a list of query group keys from the "kpi_queries" section in datadog-mcp/custom_queries.json (e.g., ["cpu_usage", "memory_pressure"]).
  • scope is optional ("host" or "k8s"). If omitted, it is auto-detected from the loaded environment configuration.
  • KPI queries can be template-based using placeholders ({{service_name}}, {{env_tag}}) or hard-coded.

3f. Validation

Verify these files exist before proceeding:

  • artifacts/{run_id}/datadog/host_metrics_*.csv OR artifacts/{run_id}/datadog/k8s_metrics_*.csv
  • artifacts/{run_id}/datadog/logs_*.csv (optional)
  • artifacts/{run_id}/datadog/kpi_metrics_*.csv (optional)

On error: If API calls fail, retry up to 3 times. If retries fail, stop and report. Do not proceed to the next workflow if Datadog fails.

Save forward:

  • run_id -> all downstream workflows
  • env_name -> PerfAnalysis and PerfReport workflows

Update task tracking: Mark all Datadog steps as completed.


Step 4 — PerfAnalysis MCP Workflow

Prerequisites:

  • test_run_id = same as BlazeMeter run_id
  • environment = same as Datadog env_name
  • BlazeMeter workflow completed (required: artifacts/{test_run_id}/blazemeter/aggregate_performance_report.csv)
  • Datadog workflow completed (required: artifacts/{test_run_id}/datadog/host_metrics_*.csv or k8s_metrics_*.csv)

Do not proceed until both BlazeMeter and Datadog workflows have completed successfully.

4a. Analyze Test Results

analyze_test_results(
  test_run_id = {test_run_id}
)

This must run BEFORE steps 4b and 4c. Requires: artifacts/{test_run_id}/blazemeter/aggregate_performance_report.csv

4b. Analyze Environment Metrics

analyze_environment_metrics(
  test_run_id = {test_run_id},
  environment = {environment}
)

Requires: artifacts/{test_run_id}/datadog/host_metrics_*.csv or k8s_metrics_*.csv

4c. Correlate Test Results

correlate_test_results(
  test_run_id = {test_run_id}
)

Requires: Outputs from steps 4a and 4b must be completed first.

4d. Analyze Logs

analyze_logs(
  test_run_id = {test_run_id}
)

Requires:

  • artifacts/{test_run_id}/blazemeter/jmeter.log (single-session) OR jmeter-*.log (multi-session)
  • artifacts/{test_run_id}/datadog/logs_*.csv

4e. Identify Bottlenecks

identify_bottlenecks(
  test_run_id = {test_run_id}
)

Performs bottleneck analysis and identifies the concurrency threshold where degradation begins. Requires: artifacts/{test_run_id}/blazemeter/test-results.csv Optional: artifacts/{test_run_id}/datadog/k8s_metrics_*.csv, host_metrics_*.csv, or kpi_metrics_*.csv

4f. Validation

Verify these files exist before proceeding:

  • artifacts/{run_id}/analysis/performance_analysis.json
  • artifacts/{run_id}/analysis/infrastructure_analysis.json
  • artifacts/{run_id}/analysis/correlation_analysis.json
  • artifacts/{run_id}/analysis/log_analysis.json
  • artifacts/{run_id}/analysis/blazemeter_log_analysis.json
  • artifacts/{run_id}/analysis/bottleneck_analysis.json
  • artifacts/{run_id}/analysis/kpi_analysis.json

On error: These are Python code executions (not API calls). Do NOT retry. Report the error with: error message, missing file paths, expected vs. actual structure. Do NOT attempt to fix code or modify files. Stop and report to user.

Save forward:

  • run_id -> PerfReport workflow
  • env_name -> PerfReport workflow

Update task tracking: Mark all PerfAnalysis steps as completed.


Step 5 — PerfReport MCP Workflow

Prerequisites:

  • run_id = same as PerfAnalysis test_run_id
  • env_name = same as used in Datadog and PerfAnalysis (required for infrastructure charts)
  • PerfAnalysis completed (required: artifacts/{run_id}/analysis/performance_analysis.json, infrastructure_analysis.json, correlation_analysis.json)

Do not proceed until PerfAnalysis has completed successfully.

5a. Create Performance Test Report

create_performance_test_report(
  run_id   = {run_id},
  template = {template},
  format   = "md"
)
  • Default format is Markdown ("md"), but can also generate PDF ("pdf") or Word ("docx").
  • Template selection:
    • If regenerating an existing report, check artifacts/{run_id}/reports/report_metadata_{run_id}.json for the template_used field and pass that value as template to maintain consistency.
    • For new reports, optionally specify a template name for a custom template.
    • If no template is specified, defaults to default_report_template.md.

5b. List Chart Types

list_chart_types()

This identifies the correct chart_id values for chart creation.

5c. Create Infrastructure Charts

create_chart(
  run_id   = {run_id},
  chart_id = "CPU_CORES_LINE",
  env_name = {env_name}
)
create_chart(
  run_id   = {run_id},
  chart_id = "MEMORY_USAGE_LINE",
  env_name = {env_name}
)

These line charts show CPU and Memory utilization for all hosts/services. Output: CPU_CORES_LINE-{resource-name}.png, MEMORY_USAGE_LINE-{resource-name}.png

5d. Create Performance Charts

create_chart(
  run_id   = {run_id},
  chart_id = "RESP_TIME_P90_VUSERS_DUALAXIS"
)

This dual-axis chart shows correlation between P90 response time and virtual users over time. Output: RESP_TIME_P90_VUSERS_DUALAXIS.png

5e. Validation

Verify these files exist before proceeding:

  • artifacts/{run_id}/reports/performance_report_{run_id}.md
  • artifacts/{run_id}/charts/*.png (at least CPU, Memory, and P90 charts)

On error: These are Python code executions (not API calls). Do NOT retry. Report the error with: error message, missing file paths, expected vs. actual structure. Do NOT attempt to fix code or modify files. Stop and report to user.

Save forward:

  • run_id -> Confluence workflow (if applicable)
  • Report file paths -> Confluence workflow (if applicable)

Update task tracking: Mark all PerfReport steps as completed.


Step 6 — Confluence MCP Workflow (Optional)

When: Only execute if Confluence details were provided in Collect Inputs.

Prerequisites:

  • test_run_id = same as PerfReport run_id
  • confluence_mode = "cloud" or "onprem"
  • confluence_space = space name from user
  • parent_page_name or parent_page_id from user
  • PerfReport completed (required: artifacts/{test_run_id}/reports/*.md)

Do not proceed until all prerequisites are met and PerfReport has completed.

6a. List Spaces (Optional)

list_spaces(
  mode = {confluence_mode}
)

Search for the space matching confluence_space. Extract space_ref (space_id for cloud, space_key for onprem).

6b. Get Space Details (Optional)

get_space_details(
  space_ref = {space_ref},
  mode      = {confluence_mode}
)

6c. Locate Parent Page

Decision gate:

If parent_page_id is provided:

get_page_by_id(
  page_id = {parent_page_id},
  mode    = {confluence_mode}
)

If parent_page_name is provided:

list_pages(
  space_ref = {space_ref},
  mode      = {confluence_mode}
)

Search results for the page matching parent_page_name.

Save: parent_id = the parent page ID for use in step 6e.

6d. Get Available Reports

get_available_reports(
  test_run_id = {test_run_id}
)

Select the report filename to publish (typically performance_report_{test_run_id}.md).

Save: report_filename from the selected report.

6e. Create Confluence Page

create_page(
  space_ref   = {space_ref},
  test_run_id = {test_run_id},
  filename    = {report_filename},
  mode        = {confluence_mode},
  parent_id   = {parent_id},
  report_type = "single_run",
  title       = {optional custom title}
)

The tool converts Markdown to Confluence XHTML and creates the page nested under the parent. If no title is provided, the title is extracted from the Markdown H1 heading.

Save: page_ref = returned page ID for use in steps 6f and 6g.

6f. Attach Chart Images

attach_images(
  page_ref    = {page_ref},
  test_run_id = {test_run_id},
  mode        = {confluence_mode},
  report_type = "single_run"
)

Uploads ALL PNG chart images from artifacts/{test_run_id}/charts/ to the page. Check response for attached/failed counts. Continue even if some fail.

6g. Update Page with Embedded Images

update_page(
  page_ref    = {page_ref},
  test_run_id = {test_run_id},
  mode        = {confluence_mode},
  report_type = "single_run"
)

Replaces {{CHART_PLACEHOLDER: ID}} markers with embedded <ac:image> markup. Check response for placeholders_replaced and placeholders_remaining.

Note on report_type:

  • This workflow uses report_type: "single_run" for individual test run reports.
  • Comparison reports use report_type: "comparison" with comparison_id as the test_run_id. See .cursor/skills/comparison-report-workflow/SKILL.md for the comparison Confluence flow.

6h. Validation

Verify:

  • Page was created successfully (check for page_ref and URL in create_page response)
  • Images were attached (check attach_images status: "success" or "partial")
  • Placeholders were replaced (check update_page placeholders_replaced list)

On error: If API calls fail, retry up to 3 times. If retries fail, report error but continue (do not block other runs).

Update task tracking: Mark all Confluence steps as completed.


Step 7 — Generate End-to-End Summary

Input: All data collected throughout the workflow.

Action: After all test runs are processed, generate a comprehensive summary.

7a. File Locations Summary

For each test run, list all generated artifacts:

  • BlazeMeter: artifacts/{run_id}/blazemeter/
  • Datadog: artifacts/{run_id}/datadog/
  • Analysis: artifacts/{run_id}/analysis/
  • Reports: artifacts/{run_id}/reports/
  • Charts: artifacts/{run_id}/charts/
  • Confluence page URLs (if published)

7b. Aggregate Metrics Summary

For each test run, provide aggregate metrics in a table:

BlazeMeter Metrics:

  • Total samples
  • Success rate (%)
  • Average response time (ms)
  • P90 response time (ms)
  • P95 response time (ms)
  • Peak throughput (req/sec)
  • Error rate (%)

Datadog Infrastructure Metrics:

  • Peak CPU Cores/mCPU Usage — per host or per k8s service
  • Average CPU Cores/mCPU Usage — per host or per k8s service
  • Peak Memory Usage MB/GB — per host or per k8s service
  • Average Memory Usage MB/GB — per host or per k8s service

Do not include per-API breakdowns, only aggregate metrics.

7c. Multiple Test Runs Comparison (if applicable)

If multiple test runs were processed, provide a side-by-side comparison table:

  • Test run IDs
  • Key performance metrics (response times, throughput, error rates)
  • Infrastructure metrics (CPU/Memory KPIs)
  • Notable differences or trends

Step 8 — Final Task Status and Next Steps

Action: Display final task tracking status:

  • Total test runs processed
  • Completed workflows per test run
  • Any failed steps (with error details)
  • Overall workflow status (Success / Partial Success / Failed)

Ask the user:

  • "Would you like to proceed with AI HITL report revision?" — If yes, follow the skill at .cursor/skills/report-revision-workflow/SKILL.md.
  • "Would you like to create a comparison report across multiple test runs?" — If yes, follow the skill at .cursor/skills/comparison-report-workflow/SKILL.md.

Error Handling

These rules apply to every step:

  • API-based workflows (BlazeMeter, Datadog, Confluence):
    • Retry up to 3 times on transient failures
    • Wait 5-10 seconds between retries to prevent HTTP 429
    • If retries fail, stop and report to user
  • Code-based workflows (PerfAnalysis, PerfReport):
    • Do NOT retry on failure
    • Report the error with: full error message, missing file paths, expected vs. actual structure
    • Do NOT attempt to fix code or modify MCP source files
    • Stop and report to user
  • Sequential execution: Do not proceed to the next workflow if the current one fails.
  • Multiple test runs: Process sequentially. Complete Run 1 fully before starting Run 2.
  • Do NOT write code to fix MCP tool issues.
  • Ask the user for next steps on any unrecoverable failure.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.