From 6803ae1c20a356b77ad409b010f9c1011cfe4db7 Mon Sep 17 00:00:00 2001 From: Florent Tapponnier Date: Fri, 24 Jul 2026 17:35:54 +0200 Subject: [PATCH] hotfix(wormhole-vaa-latency): emit milliseconds not seconds Site display bug: harness emitted latency in seconds (4.25s BNB p50), but the site formatter divides all latency histograms by 1000 to convert its internal ms to display seconds. 4.25s / 1000 = 0.00425s rendered as '0.0 s' across all 4 rows. Fix: rename metric wormhole_vaa_latency_seconds -> _milliseconds, emit delta * 1000, scale buckets 1000x (2s -> 2000ms etc). Update spec queries to point at the new metric names. Bump cache keys v44->v45, v47->v48. Existing metric samples become orphaned; new samples start populating the correct series immediately. Diff: metrics.go rename + main.go .Seconds() -> .Milliseconds() + spec sed s/_seconds/_milliseconds/g + unit: s -> ms + cache key bump. Bench YAML rest unchanged. --- benchmarks/wormhole-vaa-latency.yml | 202 +++++++++--------- .../wormhole-vaa-latency/cmd/script/main.go | 6 +- .../cmd/script/metrics.go | 26 ++- src/lib/spec.ts | 6 +- 4 files changed, 122 insertions(+), 118 deletions(-) diff --git a/benchmarks/wormhole-vaa-latency.yml b/benchmarks/wormhole-vaa-latency.yml index d62800ac..fa35a1e2 100644 --- a/benchmarks/wormhole-vaa-latency.yml +++ b/benchmarks/wormhole-vaa-latency.yml @@ -10,7 +10,7 @@ subtitle: Wall-clock seconds from a source-chain transaction being observed by t category: Bridges status: live metric: VAA finalization -unit: s +unit: ms higher_is_better: false seo_intro: | @@ -87,237 +87,237 @@ providers: tag: Solana → any chain, VAA finality via Guardian quorum on 32-slot Solana confirmation formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from Solana: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="solana"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="solana"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="solana"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="solana"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="solana"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="solana"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="solana"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="solana"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="solana"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="solana"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="solana"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="solana"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="solana"}[1h]))) - slug: ethereum name: Ethereum tag: Ethereum → any chain, VAA finality after Casper FFG epoch inclusion formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from Ethereum: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="ethereum"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="ethereum"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="ethereum"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="ethereum"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="ethereum"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="ethereum"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="ethereum"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="ethereum"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="ethereum"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="ethereum"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="ethereum"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="ethereum"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="ethereum"}[1h]))) - slug: bnb name: BNB Chain tag: BNB Chain → any chain, VAA finality via BEP-126 fast-finality formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from BNB Chain: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="bnb"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="bnb"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="bnb"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="bnb"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="bnb"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="bnb"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="bnb"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="bnb"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="bnb"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="bnb"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="bnb"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="bnb"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="bnb"}[1h]))) - slug: polygon name: Polygon tag: Polygon PoS → any chain, VAA finality after Bor block confirmation formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from Polygon: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="polygon"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="polygon"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="polygon"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="polygon"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="polygon"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="polygon"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="polygon"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="polygon"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="polygon"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="polygon"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="polygon"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="polygon"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="polygon"}[1h]))) - slug: avalanche name: Avalanche tag: Avalanche C-Chain → any chain, VAA finality via Snowman++ sub-second consensus formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from Avalanche: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="avalanche"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="avalanche"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="avalanche"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="avalanche"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="avalanche"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="avalanche"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="avalanche"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="avalanche"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="avalanche"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="avalanche"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="avalanche"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="avalanche"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="avalanche"}[1h]))) - slug: celo name: Celo tag: Celo → any chain, VAA finality after single-block deterministic finalization formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from Celo: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="celo"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="celo"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="celo"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="celo"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="celo"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="celo"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="celo"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="celo"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="celo"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="celo"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="celo"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="celo"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="celo"}[1h]))) - slug: moonbeam name: Moonbeam tag: Moonbeam parachain → any chain, VAA finality after GRANDPA relay-chain justification formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from Moonbeam: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="moonbeam"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="moonbeam"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="moonbeam"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="moonbeam"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="moonbeam"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="moonbeam"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="moonbeam"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="moonbeam"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="moonbeam"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="moonbeam"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="moonbeam"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="moonbeam"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="moonbeam"}[1h]))) - slug: sui name: Sui tag: Sui → any chain, VAA finality via Mysticeti DAG-BFT checkpoint commit formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from Sui: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="sui"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="sui"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="sui"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="sui"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="sui"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="sui"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="sui"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="sui"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="sui"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="sui"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="sui"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="sui"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="sui"}[1h]))) - slug: arbitrum name: Arbitrum tag: Arbitrum One → any chain, VAA finality after Nitro block posted + Ethereum L1 confirmation formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from Arbitrum: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="arbitrum"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="arbitrum"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="arbitrum"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="arbitrum"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="arbitrum"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="arbitrum"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="arbitrum"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="arbitrum"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="arbitrum"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="arbitrum"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="arbitrum"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="arbitrum"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="arbitrum"}[1h]))) - slug: optimism name: Optimism tag: Optimism → any chain, VAA finality after OP Stack sequencer block + settlement confirmation formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from Optimism: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="optimism"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="optimism"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="optimism"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="optimism"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="optimism"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="optimism"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="optimism"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="optimism"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="optimism"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="optimism"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="optimism"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="optimism"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="optimism"}[1h]))) - slug: base name: Base tag: Base → any chain, VAA finality after OP Stack sequencer block + settlement confirmation formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from Base: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="base"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="base"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="base"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="base"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="base"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="base"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="base"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="base"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="base"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="base"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="base"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="base"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="base"}[1h]))) - slug: scroll name: Scroll tag: Scroll zkEVM → any chain, VAA finality after L2 sequencer block formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from Scroll: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="scroll"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="scroll"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="scroll"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="scroll"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="scroll"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="scroll"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="scroll"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="scroll"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="scroll"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="scroll"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="scroll"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="scroll"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="scroll"}[1h]))) - slug: mantle name: Mantle tag: Mantle → any chain, VAA finality after L2 sequencer block formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from Mantle: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="mantle"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="mantle"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="mantle"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="mantle"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="mantle"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="mantle"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="mantle"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="mantle"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="mantle"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="mantle"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="mantle"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="mantle"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="mantle"}[1h]))) - slug: linea name: Linea tag: Linea zkEVM → any chain, VAA finality after L2 sequencer block formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from Linea: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="linea"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="linea"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="linea"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="linea"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="linea"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="linea"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="linea"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="linea"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="linea"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="linea"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="linea"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="linea"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="linea"}[1h]))) - slug: berachain name: Berachain tag: Berachain → any chain, VAA finality via BeaconKit consensus formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from Berachain: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="berachain"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="berachain"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="berachain"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="berachain"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="berachain"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="berachain"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="berachain"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="berachain"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="berachain"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="berachain"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="berachain"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="berachain"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="berachain"}[1h]))) - slug: unichain name: Unichain tag: Unichain → any chain, VAA finality after OP Stack sequencer + Flashblocks formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from Unichain: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="unichain"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="unichain"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="unichain"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="unichain"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="unichain"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="unichain"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="unichain"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="unichain"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="unichain"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="unichain"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="unichain"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="unichain"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="unichain"}[1h]))) - slug: world-chain name: World Chain tag: World Chain → any chain, VAA finality after OP Stack sequencer block formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from World Chain: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="world-chain"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="world-chain"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="world-chain"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="world-chain"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="world-chain"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="world-chain"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="world-chain"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="world-chain"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="world-chain"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="world-chain"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="world-chain"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="world-chain"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="world-chain"}[1h]))) - slug: monad name: Monad tag: Monad → any chain, VAA finality after MonadBFT ~800 ms consensus formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from Monad: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="monad"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="monad"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="monad"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="monad"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="monad"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="monad"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="monad"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="monad"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="monad"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="monad"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="monad"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="monad"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="monad"}[1h]))) - slug: ink name: Ink tag: Ink → any chain, VAA finality after OP Stack sequencer block formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from Ink: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="ink"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="ink"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="ink"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="ink"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="ink"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="ink"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="ink"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="ink"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="ink"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="ink"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="ink"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="ink"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="ink"}[1h]))) - slug: injective name: Injective tag: Injective → any chain, VAA finality after CometBFT block commit formula: "50th percentile over 24h of Wormhole VAA finalization latency for VAAs emitted from Injective: wall-clock delta from source-chain observation to Guardian quorum, indexed via wormholescan." queries: - p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="injective"}[24h]))) - p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="injective"}[24h]))) - p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="injective"}[24h]))) - mean: sum(rate(wormhole_vaa_latency_seconds_sum{source_chain="injective"}[24h])) / sum(rate(wormhole_vaa_latency_seconds_count{source_chain="injective"}[24h])) + p50: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="injective"}[24h]))) + p90: histogram_quantile(0.90, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="injective"}[24h]))) + p99: histogram_quantile(0.99, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="injective"}[24h]))) + mean: sum(rate(wormhole_vaa_latency_milliseconds_sum{source_chain="injective"}[24h])) / sum(rate(wormhole_vaa_latency_milliseconds_count{source_chain="injective"}[24h])) sample_size: increase(wormhole_vaa_seen_total{source_chain="injective"}[24h]) - series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_seconds_bucket{source_chain="injective"}[1h]))) + series: histogram_quantile(0.50, sum by(le) (rate(wormhole_vaa_latency_milliseconds_bucket{source_chain="injective"}[1h]))) diff --git a/harnesses/wormhole-vaa-latency/cmd/script/main.go b/harnesses/wormhole-vaa-latency/cmd/script/main.go index 60e696d0..d6ed0808 100644 --- a/harnesses/wormhole-vaa-latency/cmd/script/main.go +++ b/harnesses/wormhole-vaa-latency/cmd/script/main.go @@ -129,15 +129,15 @@ func poll(ctx context.Context, client *http.Client, seen *lruSet) error { seen.add(v.ID) continue } - delta := ix.Sub(ts).Seconds() - if delta < 0 || delta > 3600 { + deltaMs := float64(ix.Sub(ts).Milliseconds()) + if deltaMs < 0 || deltaMs > 3_600_000 { // Guard against clock skew / backfilled VAAs whose // indexedAt refers to a much later re-indexing event. seen.add(v.ID) continue } slug := chainSlug(v.EmitterChain) - vaaLatencySeconds.WithLabelValues(slug).Observe(delta) + vaaLatencyMs.WithLabelValues(slug).Observe(deltaMs) vaaSeenTotal.WithLabelValues(slug).Inc() seen.add(v.ID) fresh++ diff --git a/harnesses/wormhole-vaa-latency/cmd/script/metrics.go b/harnesses/wormhole-vaa-latency/cmd/script/metrics.go index 8da7e695..b2f0621e 100644 --- a/harnesses/wormhole-vaa-latency/cmd/script/metrics.go +++ b/harnesses/wormhole-vaa-latency/cmd/script/metrics.go @@ -4,20 +4,24 @@ import ( "github.com/prometheus/client_golang/prometheus" ) -// wormhole_vaa_latency_seconds is a histogram of finalization latency, -// bucketed by source chain (Wormhole emitterChain). Latency is defined -// as `updatedAt − timestamp` from the wormholescan `/api/v1/vaas` -// payload: source-chain observation → Guardian quorum + indexer. +// wormhole_vaa_latency_milliseconds is a histogram of Wormhole VAA +// finalization latency, bucketed by source chain (Wormhole emitterChain). +// Latency = `indexedAt − timestamp` from the wormholescan /api/v1/vaas +// payload: source-chain block observation → Guardian quorum reached + +// wormholescan first-index. Emitted in MILLISECONDS to match the site's +// display convention (unit: ms auto-formatting to "1.2 s" for values > +// 1000ms, "234 ms" otherwise). Emitting seconds instead broke the +// display formatter (2026-07-24 diagnosis: 4.25s displayed as "0.0 s" +// after the site's built-in /1000 normalization). // // Buckets are geometric across the observed distribution (BSC ~5-11s, -// Ethereum ~15-25s, Solana ~17-26s, Moonbeam ~40s, worst case >5min on -// slow chains during backfills). +// Ethereum ~15-25s, Solana ~17-26s, Moonbeam ~40s, tail up to 5min). var ( - vaaLatencySeconds = prometheus.NewHistogramVec( + vaaLatencyMs = prometheus.NewHistogramVec( prometheus.HistogramOpts{ - Name: "wormhole_vaa_latency_seconds", - Help: "Time from source-chain observation to Guardian quorum for a Wormhole VAA, by source chain.", - Buckets: []float64{2, 5, 10, 15, 20, 30, 45, 60, 90, 120, 180, 300, 600}, + Name: "wormhole_vaa_latency_milliseconds", + Help: "Time in milliseconds from source-chain observation to Guardian quorum for a Wormhole VAA, by source chain.", + Buckets: []float64{2_000, 5_000, 10_000, 15_000, 20_000, 30_000, 45_000, 60_000, 90_000, 120_000, 180_000, 300_000, 600_000}, }, []string{"source_chain"}, ) @@ -46,7 +50,7 @@ var ( ) func init() { - prometheus.MustRegister(vaaLatencySeconds) + prometheus.MustRegister(vaaLatencyMs) prometheus.MustRegister(vaaSeenTotal) prometheus.MustRegister(pollErrors) prometheus.MustRegister(dedupeCacheSize) diff --git a/src/lib/spec.ts b/src/lib/spec.ts index 557d7fbf..cfdbb300 100644 --- a/src/lib/spec.ts +++ b/src/lib/spec.ts @@ -304,7 +304,7 @@ const loadBenchmarkUnfilteredCached = unstable_cache( // Wormhole VAA latency ship (bench 101). // v44: 027 solana-tx-landing-latency spec removed from main (never got prod data, // duplicate of 016 solana-tx-landing). Bench SET shrank. - ["bench-unfiltered-v44", process.env.VERCEL_ENV === "production" ? "prod" : "all"], + ["bench-unfiltered-v45", process.env.VERCEL_ENV === "production" ? "prod" : "all"], { revalidate: 300, tags: ["benchmarks"] }, ); @@ -509,8 +509,8 @@ const loadAllBenchmarksCached = unstable_cache( // -> ws-head-latency-ethereum + ungate on prod). // v34: bumped with bench-unfiltered-v31 (084 indexer-latency dropped). // Wormhole VAA latency ship (bench 101). - // v47: 027 solana-tx-landing-latency removed from main (see bench-unfiltered-v44). - ["all-benchmarks-v47", process.env.VERCEL_ENV === "production" ? "prod" : "all"], + // v47: 027 solana-tx-landing-latency removed from main (see bench-unfiltered-v45). + ["all-benchmarks-v48", process.env.VERCEL_ENV === "production" ? "prod" : "all"], { revalidate: 300, tags: ["benchmarks"] }, ); export const loadAllBenchmarks = cache(loadAllBenchmarksCached);