feat(telemetry): split perf-run annotations by load driver

A single "Annotate perf-iac runs" layer matched only `perf-iac`, so a Locust
load window was indistinguishable from a JMeter one. perf-iac now tags every
region with its load driver, so each driver can have its own layer and colour.

- Replace that layer with `Perf Runs (JMeter)` and `Perf Runs (Locust)`, each
  matching ["perf-iac", "<driver>"] with matchAny:false, on 12 dashboards.
- job-queue, ledger-data-sync and log-derived-insights had an empty annotations
  list and drew no perf regions at all; they now carry the builtIn layer plus
  both driver layers.
- Grafana tag matching is a superset AND with no negation, so a generic
  `perf-iac` layer also matches every driver region. Keeping one alongside the
  driver layers would draw each load window twice, so it is replaced, not kept.
- Document the layers in the telemetry runbook, including two rendering limits:
  annotations draw only on timeseries, state-timeline and candlestick panels,
  and the shaded fill is 10% opacity so the region edges carry the colour.
- Add `jmeter` to the cspell dictionary; the hook rejects the bare word.
This commit is contained in:
Pratik Mankawde
2026-08-20 18:33:19 +01:00
parent 308e77d003
commit 62ef753804
17 changed files with 430 additions and 39 deletions

View File

@@ -163,6 +163,7 @@ words:
- itype
- jemalloc
- jlog
- jmeter
- jtnofill
- keylet
- keylets

View File

@@ -20,12 +20,29 @@
},
"enable": true,
"hide": false,
"iconColor": "rgb(70, 70, 70)",
"name": "Annotate perf-iac runs",
"iconColor": "rgb(144, 133, 233)",
"name": "Perf Runs (JMeter)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac"],
"tags": ["perf-iac", "jmeter"],
"type": "tags"
},
"type": "tags"
},
{
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": false,
"iconColor": "rgb(25, 158, 112)",
"name": "Perf Runs (Locust)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac", "locust"],
"type": "tags"
},
"type": "tags"

View File

@@ -20,12 +20,29 @@
},
"enable": true,
"hide": false,
"iconColor": "rgb(70, 70, 70)",
"name": "Annotate perf-iac runs",
"iconColor": "rgb(144, 133, 233)",
"name": "Perf Runs (JMeter)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac"],
"tags": ["perf-iac", "jmeter"],
"type": "tags"
},
"type": "tags"
},
{
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": false,
"iconColor": "rgb(25, 158, 112)",
"name": "Perf Runs (Locust)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac", "locust"],
"type": "tags"
},
"type": "tags"

View File

@@ -1,6 +1,53 @@
{
"annotations": {
"list": []
"list": [
{
"builtIn": 1,
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations & Alerts",
"type": "dashboard"
},
{
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": false,
"iconColor": "rgb(144, 133, 233)",
"name": "Perf Runs (JMeter)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac", "jmeter"],
"type": "tags"
},
"type": "tags"
},
{
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": false,
"iconColor": "rgb(25, 158, 112)",
"name": "Perf Runs (Locust)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac", "locust"],
"type": "tags"
},
"type": "tags"
}
]
},
"description": "What this shows: Per-job-type throughput, queue wait times, and execution times for the node's internal worker job queue.\nUse it to: Find job types that are backing up or running slowly and causing internal processing delays.",
"editable": true,

View File

@@ -1,6 +1,53 @@
{
"annotations": {
"list": []
"list": [
{
"builtIn": 1,
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations & Alerts",
"type": "dashboard"
},
{
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": false,
"iconColor": "rgb(144, 133, 233)",
"name": "Perf Runs (JMeter)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac", "jmeter"],
"type": "tags"
},
"type": "tags"
},
{
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": false,
"iconColor": "rgb(25, 158, 112)",
"name": "Perf Runs (Locust)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac", "locust"],
"type": "tags"
},
"type": "tags"
}
]
},
"description": "What this shows: Ledger data exchange and object-fetch traffic between this node and its peers: ledger sync, tree-node retrieval, and transaction-set exchange.\nUse it to: See how much ledger data the node is pulling or serving and spot catch-up activity.",
"editable": true,

View File

@@ -20,12 +20,29 @@
},
"enable": true,
"hide": false,
"iconColor": "rgb(70, 70, 70)",
"name": "Annotate perf-iac runs",
"iconColor": "rgb(144, 133, 233)",
"name": "Perf Runs (JMeter)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac"],
"tags": ["perf-iac", "jmeter"],
"type": "tags"
},
"type": "tags"
},
{
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": false,
"iconColor": "rgb(25, 158, 112)",
"name": "Perf Runs (Locust)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac", "locust"],
"type": "tags"
},
"type": "tags"

View File

@@ -14,7 +14,54 @@
"uid": "log-derived-insights",
"refresh": "60s",
"annotations": {
"list": []
"list": [
{
"builtIn": 1,
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations & Alerts",
"type": "dashboard"
},
{
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": false,
"iconColor": "rgb(144, 133, 233)",
"name": "Perf Runs (JMeter)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac", "jmeter"],
"type": "tags"
},
"type": "tags"
},
{
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": false,
"iconColor": "rgb(25, 158, 112)",
"name": "Perf Runs (Locust)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac", "locust"],
"type": "tags"
},
"type": "tags"
}
]
},
"templating": {
"list": [

View File

@@ -20,12 +20,29 @@
},
"enable": true,
"hide": false,
"iconColor": "rgb(70, 70, 70)",
"name": "Annotate perf-iac runs",
"iconColor": "rgb(144, 133, 233)",
"name": "Perf Runs (JMeter)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac"],
"tags": ["perf-iac", "jmeter"],
"type": "tags"
},
"type": "tags"
},
{
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": false,
"iconColor": "rgb(25, 158, 112)",
"name": "Perf Runs (Locust)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac", "locust"],
"type": "tags"
},
"type": "tags"

View File

@@ -20,12 +20,29 @@
},
"enable": true,
"hide": false,
"iconColor": "rgb(70, 70, 70)",
"name": "Annotate perf-iac runs",
"iconColor": "rgb(144, 133, 233)",
"name": "Perf Runs (JMeter)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac"],
"tags": ["perf-iac", "jmeter"],
"type": "tags"
},
"type": "tags"
},
{
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": false,
"iconColor": "rgb(25, 158, 112)",
"name": "Perf Runs (Locust)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac", "locust"],
"type": "tags"
},
"type": "tags"

View File

@@ -20,12 +20,29 @@
},
"enable": true,
"hide": false,
"iconColor": "rgb(70, 70, 70)",
"name": "Annotate perf-iac runs",
"iconColor": "rgb(144, 133, 233)",
"name": "Perf Runs (JMeter)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac"],
"tags": ["perf-iac", "jmeter"],
"type": "tags"
},
"type": "tags"
},
{
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": false,
"iconColor": "rgb(25, 158, 112)",
"name": "Perf Runs (Locust)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac", "locust"],
"type": "tags"
},
"type": "tags"

View File

@@ -20,12 +20,29 @@
},
"enable": true,
"hide": false,
"iconColor": "rgb(70, 70, 70)",
"name": "Annotate perf-iac runs",
"iconColor": "rgb(144, 133, 233)",
"name": "Perf Runs (JMeter)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac"],
"tags": ["perf-iac", "jmeter"],
"type": "tags"
},
"type": "tags"
},
{
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": false,
"iconColor": "rgb(25, 158, 112)",
"name": "Perf Runs (Locust)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac", "locust"],
"type": "tags"
},
"type": "tags"

View File

@@ -20,12 +20,29 @@
},
"enable": true,
"hide": false,
"iconColor": "rgb(70, 70, 70)",
"name": "Annotate perf-iac runs",
"iconColor": "rgb(144, 133, 233)",
"name": "Perf Runs (JMeter)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac"],
"tags": ["perf-iac", "jmeter"],
"type": "tags"
},
"type": "tags"
},
{
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": false,
"iconColor": "rgb(25, 158, 112)",
"name": "Perf Runs (Locust)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac", "locust"],
"type": "tags"
},
"type": "tags"

View File

@@ -20,12 +20,29 @@
},
"enable": true,
"hide": false,
"iconColor": "rgb(70, 70, 70)",
"name": "Annotate perf-iac runs",
"iconColor": "rgb(144, 133, 233)",
"name": "Perf Runs (JMeter)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac"],
"tags": ["perf-iac", "jmeter"],
"type": "tags"
},
"type": "tags"
},
{
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": false,
"iconColor": "rgb(25, 158, 112)",
"name": "Perf Runs (Locust)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac", "locust"],
"type": "tags"
},
"type": "tags"

View File

@@ -20,12 +20,29 @@
},
"enable": true,
"hide": false,
"iconColor": "rgb(70, 70, 70)",
"name": "Annotate perf-iac runs",
"iconColor": "rgb(144, 133, 233)",
"name": "Perf Runs (JMeter)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac"],
"tags": ["perf-iac", "jmeter"],
"type": "tags"
},
"type": "tags"
},
{
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": false,
"iconColor": "rgb(25, 158, 112)",
"name": "Perf Runs (Locust)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac", "locust"],
"type": "tags"
},
"type": "tags"

View File

@@ -20,12 +20,29 @@
},
"enable": true,
"hide": false,
"iconColor": "rgb(70, 70, 70)",
"name": "Annotate perf-iac runs",
"iconColor": "rgb(144, 133, 233)",
"name": "Perf Runs (JMeter)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac"],
"tags": ["perf-iac", "jmeter"],
"type": "tags"
},
"type": "tags"
},
{
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": false,
"iconColor": "rgb(25, 158, 112)",
"name": "Perf Runs (Locust)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac", "locust"],
"type": "tags"
},
"type": "tags"

View File

@@ -20,12 +20,29 @@
},
"enable": true,
"hide": false,
"iconColor": "rgb(70, 70, 70)",
"name": "Annotate perf-iac runs",
"iconColor": "rgb(144, 133, 233)",
"name": "Perf Runs (JMeter)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac"],
"tags": ["perf-iac", "jmeter"],
"type": "tags"
},
"type": "tags"
},
{
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": false,
"iconColor": "rgb(25, 158, 112)",
"name": "Perf Runs (Locust)",
"target": {
"limit": 100,
"matchAny": false,
"tags": ["perf-iac", "locust"],
"type": "tags"
},
"type": "tags"

View File

@@ -1985,6 +1985,51 @@ attributes from their own alloy pipeline. Outside those runs the labels are
absent; leaving the filters on **All** keeps every dashboard rendering
normally.
### Perf Run Annotations
Perf load windows are drawn on the dashboards as shaded region annotations
rather than single markers. perf-iac's
`.github/scripts/post_grafana_annotation.sh` opens an annotation when a load
phase starts and closes it with an end time when that phase finishes, so the
shaded band covers exactly the interval over which the load was applied.
Every dashboard carries two tag-matched annotation layers, one per load driver:
| Layer | Tags | Color |
| -------------------- | --------------------- | ------ |
| `Perf Runs (JMeter)` | `perf-iac` + `jmeter` | violet |
| `Perf Runs (Locust)` | `perf-iac` + `locust` | aqua |
Both layers set `matchAny: false`, so a region is drawn only if it carries
**both** of the layer's tags — the tag list is an AND, not an OR. Grafana tag
matching is a superset AND-match with no negation, so a layer listing only
`perf-iac` would also match every driver region, and "`perf-iac` but neither
driver" cannot be expressed at all. That is why there is no catch-all layer
beside these two: a generic layer could only ever redraw the same regions the
driver layers already show, giving two overlapping bands and two tooltips for
one load window.
JMeter posts **two** regions per load job, one around the warm-up phase and one
around the measured phase. Locust posts **one**, for the measured phase only,
because it has no warm-up step — so a Locust leg shows a single band where a
JMeter leg shows two.
The driver tag is not something a run supplies. Each load workflow hardcodes it
as a `LOAD_DRIVER` environment value (`reusable-jmeter-test.yml` sets `jmeter`,
`reusable-locust-test.yml` sets `locust`), so it is never a dispatch input and no
current workflow can omit it; the script warns in CI if one ever does. Alongside
the driver, each region also carries the ticket (work item), the side (`test` or
`baseline`), the ref, the commit, and the phase; blank values are dropped. The
tooltip lists those, which is how one band is told from another when several runs
overlap. The driver is carried only as a tag, not in the tooltip — which layer
drew the band is what identifies it.
Two rendering limits are worth knowing. Grafana draws annotations only on time
series, state timeline and candlestick panels, so on a board of mostly stats and
gauges most panels show no band. And the shaded fill is rendered at 10% opacity,
so the two drivers' colours are near-identical inside the band; the region's two
full-colour dashed edges and the toolbar toggles are what tell them apart.
### Who owns which attribute
- **Node and service** come from xrpld config (`service_instance_id`,