diff --git a/benchmarks/hyperliquid-frontends.yml b/benchmarks/hyperliquid-frontends.yml
index ace7ecf0..36e56160 100644
--- a/benchmarks/hyperliquid-frontends.yml
+++ b/benchmarks/hyperliquid-frontends.yml
@@ -99,7 +99,7 @@ prometheus:
# explode in cardinality.
#
# hl_frontend_fees_usd_24h_v2{builder} gauge (p50 headline)
-# hl_frontend_d7_retention_pct{builder} gauge (p90 column)
+# hl_frontend_volume_usd_24h_v2{builder} gauge (p90 column)
# hl_frontend_d30_retention_pct{builder} gauge (also exposed)
# hl_frontend_fees_per_user_usd_v2{builder} gauge (p99 column)
# hl_frontend_volume_usd_24h{builder} gauge (secondary)
@@ -113,11 +113,12 @@ prometheus:
# hl_frontend_csv_fetch_status_total{builder,code} counter (per HTTP code)
#
# Bench page column mapping. The p50/p90/p99 slots are repurposed since the
-# unit is bps and there is no native percentile semantics: p50 = effective
-# fee, p90 = D7 cohort retention, p99 = USD fees per unique trader. The
-# repurposing is called out in the methodology + FAQ so readers don't
-# misread the columns. Fee discipline (30d stddev) is computable in
-# Prom via the MCP server but not surfaced in a column.
+# unit is USD and there is no native percentile semantics: p50 = builder
+# fees collected 24h, p90 = volume routed 24h, p99 = builder fees per unique
+# trader. p90 was previously d7_retention_pct but that metric is only emitted
+# for the original 8 builders, which silently dropped the other 52 from the
+# leaderboard (spec.ts skips any provider with a null p90 or p99). Switching
+# p90 to volume_usd_24h_v2 unblocks the full 60-builder cohort.
providers:
- slug: phantom-perps
@@ -126,7 +127,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the last complete UTC day, computed from Hyperliquid's public attributed-fills CSV for Phantom's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="phantom-perps"}
- p90: hl_frontend_d7_retention_pct{builder="phantom-perps"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="phantom-perps"}
p99: hl_frontend_fees_per_user_usd_v2{builder="phantom-perps"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="phantom-perps"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -139,7 +140,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the last complete UTC day, computed from Hyperliquid's public attributed-fills CSV for Axiom's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="axiom"}
- p90: hl_frontend_d7_retention_pct{builder="axiom"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="axiom"}
p99: hl_frontend_fees_per_user_usd_v2{builder="axiom"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="axiom"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -152,7 +153,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the last complete UTC day, computed from Hyperliquid's public attributed-fills CSV for pvp.trade's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="pvp-trade"}
- p90: hl_frontend_d7_retention_pct{builder="pvp-trade"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="pvp-trade"}
p99: hl_frontend_fees_per_user_usd_v2{builder="pvp-trade"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="pvp-trade"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -165,7 +166,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the last complete UTC day, computed from Hyperliquid's public attributed-fills CSV for Insilico's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="insilico"}
- p90: hl_frontend_d7_retention_pct{builder="insilico"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="insilico"}
p99: hl_frontend_fees_per_user_usd_v2{builder="insilico"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="insilico"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -178,7 +179,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the last complete UTC day, computed from Hyperliquid's public attributed-fills CSV for Defiapp's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="defiapp"}
- p90: hl_frontend_d7_retention_pct{builder="defiapp"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="defiapp"}
p99: hl_frontend_fees_per_user_usd_v2{builder="defiapp"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="defiapp"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -191,7 +192,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the last complete UTC day, computed from Hyperliquid's public attributed-fills CSV for MetaMask's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="metamask"}
- p90: hl_frontend_d7_retention_pct{builder="metamask"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="metamask"}
p99: hl_frontend_fees_per_user_usd_v2{builder="metamask"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="metamask"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -204,7 +205,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the last complete UTC day, computed from Hyperliquid's public attributed-fills CSV for Dexari's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="dexari"}
- p90: hl_frontend_d7_retention_pct{builder="dexari"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="dexari"}
p99: hl_frontend_fees_per_user_usd_v2{builder="dexari"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="dexari"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -217,7 +218,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the last complete UTC day, computed from Hyperliquid's public attributed-fills CSV for Okto's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="okto"}
- p90: hl_frontend_d7_retention_pct{builder="okto"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="okto"}
p99: hl_frontend_fees_per_user_usd_v2{builder="okto"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="okto"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -229,7 +230,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Trust Wallet's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="trust-wallet"}
- p90: hl_frontend_d7_retention_pct{builder="trust-wallet"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="trust-wallet"}
p99: hl_frontend_fees_per_user_usd_v2{builder="trust-wallet"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="trust-wallet"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -242,7 +243,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Sushi's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="sushi"}
- p90: hl_frontend_d7_retention_pct{builder="sushi"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="sushi"}
p99: hl_frontend_fees_per_user_usd_v2{builder="sushi"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="sushi"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -255,7 +256,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Dreamcash's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="dreamcash"}
- p90: hl_frontend_d7_retention_pct{builder="dreamcash"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="dreamcash"}
p99: hl_frontend_fees_per_user_usd_v2{builder="dreamcash"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="dreamcash"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -268,7 +269,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Based's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="based-app"}
- p90: hl_frontend_d7_retention_pct{builder="based-app"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="based-app"}
p99: hl_frontend_fees_per_user_usd_v2{builder="based-app"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="based-app"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -281,7 +282,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Blink's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="blink"}
- p90: hl_frontend_d7_retention_pct{builder="blink"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="blink"}
p99: hl_frontend_fees_per_user_usd_v2{builder="blink"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="blink"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -294,7 +295,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Perpmate's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="perpmate"}
- p90: hl_frontend_d7_retention_pct{builder="perpmate"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="perpmate"}
p99: hl_frontend_fees_per_user_usd_v2{builder="perpmate"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="perpmate"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -307,7 +308,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Arena's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="arena"}
- p90: hl_frontend_d7_retention_pct{builder="arena"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="arena"}
p99: hl_frontend_fees_per_user_usd_v2{builder="arena"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="arena"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -320,7 +321,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for MinaraAI's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="minaraai"}
- p90: hl_frontend_d7_retention_pct{builder="minaraai"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="minaraai"}
p99: hl_frontend_fees_per_user_usd_v2{builder="minaraai"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="minaraai"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -333,7 +334,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for ApexLiquid's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="apexliquid"}
- p90: hl_frontend_d7_retention_pct{builder="apexliquid"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="apexliquid"}
p99: hl_frontend_fees_per_user_usd_v2{builder="apexliquid"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="apexliquid"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -346,7 +347,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Coin98's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="coin98"}
- p90: hl_frontend_d7_retention_pct{builder="coin98"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="coin98"}
p99: hl_frontend_fees_per_user_usd_v2{builder="coin98"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="coin98"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -359,7 +360,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for CoinPilot's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="coinpilot"}
- p90: hl_frontend_d7_retention_pct{builder="coinpilot"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="coinpilot"}
p99: hl_frontend_fees_per_user_usd_v2{builder="coinpilot"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="coinpilot"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -372,7 +373,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Echosync's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="echosync"}
- p90: hl_frontend_d7_retention_pct{builder="echosync"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="echosync"}
p99: hl_frontend_fees_per_user_usd_v2{builder="echosync"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="echosync"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -385,7 +386,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for FOMO's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="fomo"}
- p90: hl_frontend_d7_retention_pct{builder="fomo"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="fomo"}
p99: hl_frontend_fees_per_user_usd_v2{builder="fomo"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="fomo"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -398,7 +399,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Gem Wallet's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="gemwallet"}
- p90: hl_frontend_d7_retention_pct{builder="gemwallet"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="gemwallet"}
p99: hl_frontend_fees_per_user_usd_v2{builder="gemwallet"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="gemwallet"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -411,7 +412,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for GTR Trade's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="gtr-trade"}
- p90: hl_frontend_d7_retention_pct{builder="gtr-trade"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="gtr-trade"}
p99: hl_frontend_fees_per_user_usd_v2{builder="gtr-trade"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="gtr-trade"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -424,7 +425,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Hyprearn's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="hyprearn"}
- p90: hl_frontend_d7_retention_pct{builder="hyprearn"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="hyprearn"}
p99: hl_frontend_fees_per_user_usd_v2{builder="hyprearn"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="hyprearn"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -437,7 +438,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Legend Trade's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="legend-trade"}
- p90: hl_frontend_d7_retention_pct{builder="legend-trade"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="legend-trade"}
p99: hl_frontend_fees_per_user_usd_v2{builder="legend-trade"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="legend-trade"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -450,7 +451,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Katoshi's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="katoshi"}
- p90: hl_frontend_d7_retention_pct{builder="katoshi"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="katoshi"}
p99: hl_frontend_fees_per_user_usd_v2{builder="katoshi"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="katoshi"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -463,7 +464,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Metascalp's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="metascalp"}
- p90: hl_frontend_d7_retention_pct{builder="metascalp"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="metascalp"}
p99: hl_frontend_fees_per_user_usd_v2{builder="metascalp"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="metascalp"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -476,7 +477,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Moontrader's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="moontrader"}
- p90: hl_frontend_d7_retention_pct{builder="moontrader"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="moontrader"}
p99: hl_frontend_fees_per_user_usd_v2{builder="moontrader"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="moontrader"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -489,7 +490,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for OneKey's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="onekey"}
- p90: hl_frontend_d7_retention_pct{builder="onekey"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="onekey"}
p99: hl_frontend_fees_per_user_usd_v2{builder="onekey"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="onekey"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -502,7 +503,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Pear's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="pear"}
- p90: hl_frontend_d7_retention_pct{builder="pear"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="pear"}
p99: hl_frontend_fees_per_user_usd_v2{builder="pear"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="pear"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -515,7 +516,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Rabby's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="rabby"}
- p90: hl_frontend_d7_retention_pct{builder="rabby"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="rabby"}
p99: hl_frontend_fees_per_user_usd_v2{builder="rabby"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="rabby"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -528,7 +529,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Ranger Finance's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="ranger-finance"}
- p90: hl_frontend_d7_retention_pct{builder="ranger-finance"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="ranger-finance"}
p99: hl_frontend_fees_per_user_usd_v2{builder="ranger-finance"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="ranger-finance"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -541,7 +542,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Senpi's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="senpi"}
- p90: hl_frontend_d7_retention_pct{builder="senpi"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="senpi"}
p99: hl_frontend_fees_per_user_usd_v2{builder="senpi"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="senpi"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -554,7 +555,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for SuperX's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="superx"}
- p90: hl_frontend_d7_retention_pct{builder="superx"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="superx"}
p99: hl_frontend_fees_per_user_usd_v2{builder="superx"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="superx"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -567,7 +568,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Supurr's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="supurr"}
- p90: hl_frontend_d7_retention_pct{builder="supurr"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="supurr"}
p99: hl_frontend_fees_per_user_usd_v2{builder="supurr"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="supurr"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -580,7 +581,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Unigox's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="unigox"}
- p90: hl_frontend_d7_retention_pct{builder="unigox"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="unigox"}
p99: hl_frontend_fees_per_user_usd_v2{builder="unigox"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="unigox"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -593,7 +594,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for UXUY's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="uxuy"}
- p90: hl_frontend_d7_retention_pct{builder="uxuy"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="uxuy"}
p99: hl_frontend_fees_per_user_usd_v2{builder="uxuy"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="uxuy"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -606,7 +607,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Wunder's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="wunder"}
- p90: hl_frontend_d7_retention_pct{builder="wunder"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="wunder"}
p99: hl_frontend_fees_per_user_usd_v2{builder="wunder"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="wunder"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -619,7 +620,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Grider's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="grider"}
- p90: hl_frontend_d7_retention_pct{builder="grider"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="grider"}
p99: hl_frontend_fees_per_user_usd_v2{builder="grider"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="grider"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -632,7 +633,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Tradoor's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="tradoor"}
- p90: hl_frontend_d7_retention_pct{builder="tradoor"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="tradoor"}
p99: hl_frontend_fees_per_user_usd_v2{builder="tradoor"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="tradoor"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -645,7 +646,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for BullpenFi's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="bullpenfi"}
- p90: hl_frontend_d7_retention_pct{builder="bullpenfi"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="bullpenfi"}
p99: hl_frontend_fees_per_user_usd_v2{builder="bullpenfi"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="bullpenfi"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -658,7 +659,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Dexly Trade's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="dexly-trade"}
- p90: hl_frontend_d7_retention_pct{builder="dexly-trade"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="dexly-trade"}
p99: hl_frontend_fees_per_user_usd_v2{builder="dexly-trade"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="dexly-trade"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -671,7 +672,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Hyperdash's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="hyperdash"}
- p90: hl_frontend_d7_retention_pct{builder="hyperdash"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="hyperdash"}
p99: hl_frontend_fees_per_user_usd_v2{builder="hyperdash"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="hyperdash"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -684,7 +685,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Infinex's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="infinex"}
- p90: hl_frontend_d7_retention_pct{builder="infinex"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="infinex"}
p99: hl_frontend_fees_per_user_usd_v2{builder="infinex"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="infinex"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -697,7 +698,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Liminal's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="liminal"}
- p90: hl_frontend_d7_retention_pct{builder="liminal"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="liminal"}
p99: hl_frontend_fees_per_user_usd_v2{builder="liminal"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="liminal"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -710,7 +711,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Liquid Perps's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="liquid-perps"}
- p90: hl_frontend_d7_retention_pct{builder="liquid-perps"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="liquid-perps"}
p99: hl_frontend_fees_per_user_usd_v2{builder="liquid-perps"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="liquid-perps"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -723,7 +724,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Lit Trade's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="lit-trade"}
- p90: hl_frontend_d7_retention_pct{builder="lit-trade"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="lit-trade"}
p99: hl_frontend_fees_per_user_usd_v2{builder="lit-trade"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="lit-trade"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -736,7 +737,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Lootbase's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="lootbase"}
- p90: hl_frontend_d7_retention_pct{builder="lootbase"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="lootbase"}
p99: hl_frontend_fees_per_user_usd_v2{builder="lootbase"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="lootbase"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -749,7 +750,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Mass.money's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="mass-dot-money"}
- p90: hl_frontend_d7_retention_pct{builder="mass-dot-money"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="mass-dot-money"}
p99: hl_frontend_fees_per_user_usd_v2{builder="mass-dot-money"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="mass-dot-money"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -762,7 +763,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Moonbot's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="moonbot"}
- p90: hl_frontend_d7_retention_pct{builder="moonbot"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="moonbot"}
p99: hl_frontend_fees_per_user_usd_v2{builder="moonbot"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="moonbot"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -775,7 +776,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Rainbow's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="rainbow"}
- p90: hl_frontend_d7_retention_pct{builder="rainbow"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="rainbow"}
p99: hl_frontend_fees_per_user_usd_v2{builder="rainbow"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="rainbow"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -788,7 +789,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for SuperCEXy's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="supercexy"}
- p90: hl_frontend_d7_retention_pct{builder="supercexy"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="supercexy"}
p99: hl_frontend_fees_per_user_usd_v2{builder="supercexy"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="supercexy"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -801,7 +802,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Superstack's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="superstack"}
- p90: hl_frontend_d7_retention_pct{builder="superstack"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="superstack"}
p99: hl_frontend_fees_per_user_usd_v2{builder="superstack"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="superstack"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -814,7 +815,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Wallet V's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="wallet-v"}
- p90: hl_frontend_d7_retention_pct{builder="wallet-v"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="wallet-v"}
p99: hl_frontend_fees_per_user_usd_v2{builder="wallet-v"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="wallet-v"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -827,7 +828,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for xTrade Protocol's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="xtrade-protocol"}
- p90: hl_frontend_d7_retention_pct{builder="xtrade-protocol"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="xtrade-protocol"}
p99: hl_frontend_fees_per_user_usd_v2{builder="xtrade-protocol"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="xtrade-protocol"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -840,7 +841,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Taco Trade's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="taco-trade"}
- p90: hl_frontend_d7_retention_pct{builder="taco-trade"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="taco-trade"}
p99: hl_frontend_fees_per_user_usd_v2{builder="taco-trade"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="taco-trade"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -853,7 +854,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Silhouette's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="silhouette"}
- p90: hl_frontend_d7_retention_pct{builder="silhouette"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="silhouette"}
p99: hl_frontend_fees_per_user_usd_v2{builder="silhouette"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="silhouette"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -866,7 +867,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Tread.fi's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="tread-fi"}
- p90: hl_frontend_d7_retention_pct{builder="tread-fi"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="tread-fi"}
p99: hl_frontend_fees_per_user_usd_v2{builder="tread-fi"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="tread-fi"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -879,7 +880,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for FlowBot's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="flowbot"}
- p90: hl_frontend_d7_retention_pct{builder="flowbot"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="flowbot"}
p99: hl_frontend_fees_per_user_usd_v2{builder="flowbot"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="flowbot"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
@@ -892,7 +893,7 @@ providers:
formula: "Volume-weighted effective builder fee in basis points over the rolling 24h window, computed from the local hl-node fills stream for Nautilus Trader's builder address."
queries:
p50: hl_frontend_fees_usd_24h_v2{builder="nautilus-trader"}
- p90: hl_frontend_d7_retention_pct{builder="nautilus-trader"}
+ p90: hl_frontend_volume_usd_24h_v2{builder="nautilus-trader"}
p99: hl_frontend_fees_per_user_usd_v2{builder="nautilus-trader"}
mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="nautilus-trader"}[7d])
success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120))
diff --git a/src/components/benchmark-body.tsx b/src/components/benchmark-body.tsx
index ad7a4629..5d4e58cb 100644
--- a/src/components/benchmark-body.tsx
+++ b/src/components/benchmark-body.tsx
@@ -426,6 +426,8 @@ export function BenchmarkBody({
topNControl={topNControl}
headerActions={}
seriesOverride={activePanel?.seriesByProvider}
+ seriesOverride7d={activePanel?.seriesByProvider7d}
+ seriesOverride30d={activePanel?.seriesByProvider30d}
metricLabelOverride={activePanel?.label}
unitOverride={activePanel?.unit}
/>
diff --git a/src/components/time-series-chart.tsx b/src/components/time-series-chart.tsx
index f6a72136..e5274df4 100644
--- a/src/components/time-series-chart.tsx
+++ b/src/components/time-series-chart.tsx
@@ -32,6 +32,10 @@ type Props = {
* header, and switches the Y-axis unit. Used by the bench page when
* the reader selects a companion metric from the panel tab row. */
seriesOverride?: Record;
+ /** Optional 7 day and 30 day variants of the panel override. The chart
+ * picks the matching one when the range tab is 7d or 30d. */
+ seriesOverride7d?: Record;
+ seriesOverride30d?: Record;
metricLabelOverride?: string;
unitOverride?: Benchmark["unit"];
topNControl?: { topN: number | null; setTopN: (n: number | null) => void };
@@ -85,6 +89,8 @@ export function TimeSeriesChart({
excluded: controlledExcluded,
onToggleExclude,
seriesOverride,
+ seriesOverride7d,
+ seriesOverride30d,
metricLabelOverride,
unitOverride,
onResetExcluded,
@@ -142,15 +148,19 @@ export function TimeSeriesChart({
// (excluded values are dropped from min/max so the remaining lines
// can spread out vertically when an outlier is hidden).
const allLines = useMemo(() => {
- // Panel overrides ship as a 24h series with 72 datapoints (one per
- // ~20 min). Without slicing them by the active range the 1h / 6h
- // tabs would replay the same 24h shape on a shorter axis, which is
- // why every range looks identical when a companion-panel tab is
- // selected. Mirror what `pickSeries` does for the base series:
- // when the range is sub-24h, take the trailing slice corresponding
- // to that ratio. The 7d / 30d tabs degrade to the 24h slice because
- // panels don't ship long-horizon series.
+ // Panel overrides ship in up to three variants: 24h (72 pts), 7d (84
+ // pts) and 30d (60 pts). When the chart range is 7d or 30d we pick
+ // the matching variant if it exists. Sub 24h tabs slice the 24h
+ // variant trailing edge. Long range tabs fall back to the 24h
+ // variant when the longer one is missing (older specs).
+ const pickPanel = (): Record | undefined => {
+ if (range === "30d" && seriesOverride30d) return seriesOverride30d;
+ if (range === "7d" && seriesOverride7d) return seriesOverride7d;
+ return seriesOverride;
+ };
+ const panel = pickPanel();
const sliceOverride = (full: number[]): number[] => {
+ // Sub 24h ranges slice the 24h panel series trailing edge.
if (range === "24h" || range === "7d" || range === "30d") return full;
const ratio = RANGE_HOURS[range] / 24;
const take = Math.max(2, Math.round(full.length * ratio));
@@ -161,8 +171,8 @@ export function TimeSeriesChart({
slug: r.slug,
name: r.name,
color: colors.get(r.slug) ?? "var(--color-ink-soft)",
- values: seriesOverride
- ? sliceOverride(seriesOverride[r.slug] ?? [])
+ values: panel
+ ? sliceOverride(panel[r.slug] ?? [])
: pickSeries(benchmark, r.slug, range, region),
excluded: excluded.has(r.slug),
}))
@@ -170,7 +180,7 @@ export function TimeSeriesChart({
built.sort((a, b) => mean(b.values.slice(-6)) - mean(a.values.slice(-6)));
return built;
- }, [benchmark, range, region, colors, excluded, seriesOverride]);
+ }, [benchmark, range, region, colors, excluded, seriesOverride, seriesOverride7d, seriesOverride30d]);
// Top-N selector — sized off the post-filter line count via the
// shared `useTopN` hook so the option set agrees across every
@@ -1214,6 +1224,22 @@ function fmtTick(v: number, unit: string) {
if (pct >= 1) return `${pct.toFixed(1)}%`;
return `${pct.toFixed(2)}%`;
}
+ if (unit === "usd") {
+ const abs = Math.abs(v);
+ if (abs >= 1e9) return `$${(v / 1e9).toFixed(1)}B`;
+ if (abs >= 1e6) return `$${(v / 1e6).toFixed(1)}M`;
+ if (abs >= 1e3) return `$${(v / 1e3).toFixed(1)}K`;
+ if (abs >= 1) return `$${v.toFixed(0)}`;
+ if (abs >= 0.01) return `$${v.toFixed(2)}`;
+ return `$${v.toFixed(4)}`;
+ }
+ if (unit === "count") {
+ const abs = Math.abs(v);
+ if (abs >= 1e9) return `${(v / 1e9).toFixed(1)}B`;
+ if (abs >= 1e6) return `${(v / 1e6).toFixed(1)}M`;
+ if (abs >= 1e3) return `${(v / 1e3).toFixed(1)}K`;
+ return `${Math.round(v)}`;
+ }
if (unit === "s") {
const s = v / 1000;
if (s >= 60) return `${(s / 60).toFixed(0)}m`;
diff --git a/src/lib/spec.ts b/src/lib/spec.ts
index bc57f4a8..7af4a2ed 100644
--- a/src/lib/spec.ts
+++ b/src/lib/spec.ts
@@ -682,15 +682,21 @@ async function tryLoadLive(
for (const panel of spec.metric_panels ?? []) {
const values: Record = {};
const seriesByProvider: Record = {};
+ const seriesByProvider7d: Record = {};
+ const seriesByProvider30d: Record = {};
await Promise.all(
spec.providers.map(async (p) => {
const q = `${panel.metric}{${panel.label_key}="${escapePromLabelValue(p.slug)}"}`;
- const [v, series] = await Promise.all([
+ const [v, s24, s7, s30] = await Promise.all([
prom.scalar(q),
prom.series(q, winSec, 72),
+ prom.series(q, sevenDaysSec, 84),
+ prom.series(q, thirtyDaysSec, 60),
]);
if (v != null && Number.isFinite(v)) values[p.slug] = v;
- if (series && series.length > 0) seriesByProvider[p.slug] = series;
+ if (s24 && s24.length > 0) seriesByProvider[p.slug] = s24;
+ if (s7 && s7.length > 0) seriesByProvider7d[p.slug] = s7;
+ if (s30 && s30.length > 0) seriesByProvider30d[p.slug] = s30;
})
);
metricPanels.push({
@@ -702,6 +708,10 @@ async function tryLoadLive(
higherIsBetter: panel.higher_is_better,
values,
seriesByProvider,
+ seriesByProvider7d:
+ Object.keys(seriesByProvider7d).length > 0 ? seriesByProvider7d : undefined,
+ seriesByProvider30d:
+ Object.keys(seriesByProvider30d).length > 0 ? seriesByProvider30d : undefined,
});
}
diff --git a/src/types/benchmark.ts b/src/types/benchmark.ts
index 9843454f..cf88bb6a 100644
--- a/src/types/benchmark.ts
+++ b/src/types/benchmark.ts
@@ -81,6 +81,12 @@ export type MetricPanel = {
* provider slug. Powers the multi-line chart view of the panel.
* Providers with no Prom data for the query are absent from the map. */
seriesByProvider?: Record;
+ /** Per-provider 7 day time-series (84 points by default). Used by the
+ * chart's 7D range tab when a panel is active. */
+ seriesByProvider7d?: Record;
+ /** Per-provider 30 day time-series (60 points by default). Used by the
+ * chart's 30D range tab when a panel is active. */
+ seriesByProvider30d?: Record;
};
export type ResultExtras = {