mirror of
https://github.com/XRPLF/rippled.git
synced 2026-08-19 21:30:56 +00:00
The harness manifests asserted things the code cannot produce and missed most of what it does. Two assertions were failing every run, and the metric set covered 16 of the ~41 emitted names. expected_spans.json: rpc.process was required with rpc.ws_message as its parent, but it is created only in ServerHandler::processRequest() on the HTTP path, so a WebSocket-only workload never produces it -- it is now optional and parented to rpc.http_request, and the rpc.process -> rpc.command.* edge is skipped with the real reason instead of a coroutine-context-loss diagnosis that was never the cause. Adds the missing rpc.ws_upgrade span, corrects four parents (consensus.mode_change, pathfind.request, and update_positions/check, which are children of consensus.establish rather than consensus.round), and demotes conditionally-set attributes out of required_attributes so a healthy run stops failing. Counts recomputed from the file: 41 span types, 62 unique required attributes. expected_metrics.json: 16 -> 52 asserted entries across the job-queue, RPC method, reduce-relay, overflow and validation families, plus the fifteenth dashboard uid. Metrics the harness workload cannot exercise -- erroring RPC, ledger-mismatch, TxQ overflow, and the lazily-created getobject_* instruments -- are listed in a not_asserted group the validator skips, rather than as assertions that would fail on a healthy node. The workflow's push trigger listed two globs matching nothing (include/xrpl/basics/Telemetry*.h, src/xrpld/app/misc/Telemetry*), so no C++ telemetry change ever triggered validation. Replaced with the paths the code actually lives in, including src/libxrpl/beast/insight/** for the insight export path the harness depends on. The four inert workflow_dispatch inputs are now labelled UNUSED rather than looking like working knobs. Docs: the workload README described a StatsD dirty-flag mechanism under a member name that does not exist, on a code path the harness never uses -- it sets [insight] server=otel, so gauges export through an observable-gauge callback every cycle. Adds the missing txq-burst phase, reconciles three different dashboard counts, and drops "posts summary to PR", which the workflow has no permission to do. The runbook's phase-10 section loses the last sampling_ratio reference (not a config key), gains a Regression Gate and CI subsection covering the gate that can fail CI, and its compose-logs command now names the workload compose file. cmake --preset default is left for a separate change: no CMakePresets.json is tracked, so it is wrong everywhere it appears. Also drops the dead exporter=otlp_http key the harness wrote into every node config, and stops capture_timings.py defaulting --profile to a profile that does not exist.
109 lines
3.4 KiB
JSON
109 lines
3.4 KiB
JSON
{
|
|
"profiles": {
|
|
"full-validation": {
|
|
"description": "Full coverage of all 15 provisioned dashboards (14 assert metric data; log-derived-insights is Loki-backed and only checked for provisioning) with burst/idle/plateau patterns across 7 phases",
|
|
"phases": [
|
|
{
|
|
"name": "warmup",
|
|
"description": "Low load to populate baseline gauges and node health metrics",
|
|
"duration_sec": 30,
|
|
"rpc": {
|
|
"rate": 5,
|
|
"weights": { "server_info": 50, "fee": 30, "ledger": 20 }
|
|
},
|
|
"tx": null
|
|
},
|
|
{
|
|
"name": "steady-state",
|
|
"description": "Medium sustained load — plateau data for all dashboards",
|
|
"duration_sec": 60,
|
|
"rpc": { "rate": 30 },
|
|
"tx": { "tps": 3 }
|
|
},
|
|
{
|
|
"name": "rpc-burst",
|
|
"description": "Heavy RPC to saturate job queue and spike latency",
|
|
"duration_sec": 30,
|
|
"rpc": { "rate": 100 },
|
|
"tx": null
|
|
},
|
|
{
|
|
"name": "tx-flood",
|
|
"description": "High TX rate for fee escalation and TxQ pressure",
|
|
"duration_sec": 30,
|
|
"rpc": { "rate": 5, "weights": { "server_info": 50, "fee": 50 } },
|
|
"tx": {
|
|
"tps": 20,
|
|
"weights": { "Payment": 70, "OfferCreate": 20, "TrustSet": 10 }
|
|
}
|
|
},
|
|
{
|
|
"name": "txq-burst",
|
|
"description": "Single-type Payment burst at high TPS to force open-ledger fee escalation and TxQ queueing, exercising the txq.* spans (txq.enqueue / txq.accept / txq.accept_tx / txq.cleanup)",
|
|
"duration_sec": 30,
|
|
"rpc": { "rate": 5, "weights": { "fee": 100 } },
|
|
"tx": {
|
|
"tps": 60,
|
|
"weights": { "Payment": 100 }
|
|
}
|
|
},
|
|
{
|
|
"name": "mixed-peak",
|
|
"description": "Realistic peak load — consensus and ledger ops under stress",
|
|
"duration_sec": 60,
|
|
"rpc": { "rate": 50 },
|
|
"tx": { "tps": 10 }
|
|
},
|
|
{
|
|
"name": "cooldown",
|
|
"description": "Low load for recovery metrics and state transition data",
|
|
"duration_sec": 30,
|
|
"rpc": { "rate": 5, "weights": { "server_info": 80, "fee": 20 } },
|
|
"tx": null
|
|
}
|
|
],
|
|
"propagation_wait_sec": 60
|
|
},
|
|
"quick-smoke": {
|
|
"description": "Fast smoke test — minimal data for CI quick checks",
|
|
"phases": [
|
|
{
|
|
"name": "smoke",
|
|
"description": "Single phase covering all generator types",
|
|
"duration_sec": 30,
|
|
"rpc": { "rate": 20 },
|
|
"tx": { "tps": 3 }
|
|
}
|
|
],
|
|
"propagation_wait_sec": 30
|
|
},
|
|
"stress": {
|
|
"description": "Heavy sustained load for performance benchmarking",
|
|
"phases": [
|
|
{
|
|
"name": "ramp-up",
|
|
"description": "Gradually increasing load",
|
|
"duration_sec": 30,
|
|
"rpc": { "rate": 20 },
|
|
"tx": { "tps": 5 }
|
|
},
|
|
{
|
|
"name": "peak",
|
|
"description": "Maximum sustained load",
|
|
"duration_sec": 120,
|
|
"rpc": { "rate": 150 },
|
|
"tx": { "tps": 25 }
|
|
},
|
|
{
|
|
"name": "sustain",
|
|
"description": "Continued high load for stability check",
|
|
"duration_sec": 60,
|
|
"rpc": { "rate": 100 },
|
|
"tx": { "tps": 15 }
|
|
}
|
|
],
|
|
"propagation_wait_sec": 60
|
|
}
|
|
}
|
|
}
|