Skip to content

Commit aabf5f8

Browse files
authored
feat(slots): add memory, disk I/O, and network charts (#419)
* feat: add Node Resources tab to slot detail page Add CPU utilization visualization to the slot detail page, powered by observoor eBPF agent data via the new fct_node_cpu_utilization model. Features: - Per-node CL/EL CPU utilization chart (0-12s slot window) - Aggregate view (mean/min/max toggle) and single-node detailed view - Normalized system utilization (sys mean/min/max) and hottest single core - EIP-7870 reference nodes filter toggle - Block arrival time overlay (markLines) - URL-backed state for node selection, metric, and filter * refactor: redesign CPU chart with min-max bands and clearer labels Replace 8 separate line series with shaded min-max bands and clean mean lines. Legend drops from 8 items to 2-4. "sys" terminology replaced with "% of all cores". Slot number added to subtitle. Peak core series hidden by default (toggle-able in legend). * feat: add timeline event annotations to CPU chart Replace broken stacking bands with clean gradient area fills. Add annotation overlay system with toggleable markLines for block arrival, head update, execution duration, and data column range. Single-node view shows exact per-node events; aggregate view shows p50 values. Execution timing data fetched from intEngineNewPayload API. * feat: add markArea annotations, slot phase boundaries, and UX improvements - Add markArea support to MultiLineChart (colored regions on chart) - Add slot phase boundary markLines (Block/Attestations/Aggregations) - Move metric dropdown into chart PopoutCard header - Change aggregate annotation ranges from p25-p75 to min-p95 - Fix double-toggle on annotation/7870 checkboxes (pointer-events-none) - Fix scroll-to-top on control changes (resetScroll: false) - Extract shared CL/EL client sets to utils/ethereum.ts - Update subtitle to link to Observoor repo * fix: resolve build and lint errors - Update IntEngineNewPayloadFastest → IntEngineNewPayloadFastestExecutionByNodeClass after table rename (pre-existing master issue) - Fix navigate type narrowing by using search spread instead of prev callback - Replace any casts with EChartsTooltipParam interface in tooltip formatter - Move PHASE_BOUNDARY_COLORS to module scope to fix exhaustive-deps warning - Regenerate API types from local cbt-api (removes stale max_single_core_pct) * refactor: deduplicate client name lists into single source of truth * fix(slots): align node resource annotations and CL/EL layer detection * rename: fct_node_cpu_utilization → fct_node_cpu_utilization_by_process Regenerated API types and updated component/hook imports to match the renamed xatu-cbt table. * feat(slots): add memory, disk I/O, and network charts to node resources Add three new resource charts alongside existing CPU utilization: - Memory Usage: RSS total/anon/file/swap per CL/EL process - Disk I/O: read/write bytes with CL/EL breakdown per node - Network I/O: traffic by port label (P2P, discovery, etc.) with beacon API/RPC ports hidden by default Resource type tabs allow switching between charts. All charts share the same annotation overlays, node selector, and sync group. * Show all 4 resource charts in 2x2 grid, add smoothing and zero-padding Replace tab-based switching with a 2-column grid showing CPU, Memory, Disk I/O, and Network charts simultaneously. Zero-pad all 250ms buckets so charts show continuous lines (no gaps in quiet periods). Add smooth curve interpolation (0.4) to all series for cleaner visualization. * Break down Disk I/O by CL/EL in aggregate mode Show CL Read, CL Write, EL Read, EL Write series (matching the single-node view pattern) instead of just Read/Write totals. * Plot data points at end of aggregation window Shift bucket offset by BUCKET_SIZE (250ms) so each data point represents the end of its aggregation window rather than the start. * Forward-fill gauge metrics (CPU, memory) instead of zero-filling Gauge metrics always have a value, so empty leading buckets should use the first known value rather than 0. Prevents false spike from 0 at chart start. Delta metrics (disk, network) still zero-fill correctly. * fixes * fix(slots): address node resources review findings and CI stability
1 parent 8774ba2 commit aabf5f8

File tree

35 files changed

+19755
-8497
lines changed

35 files changed

+19755
-8497
lines changed

src/api/@tanstack/react-query.gen.ts

Lines changed: 486 additions & 30 deletions
Large diffs are not rendered by default.

src/api/client/client.gen.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,10 +162,16 @@ export const createClient = (config: Config = {}): Client => {
162162
case 'arrayBuffer':
163163
case 'blob':
164164
case 'formData':
165-
case 'json':
166165
case 'text':
167166
data = await response[parseAs]();
168167
break;
168+
case 'json': {
169+
// Some servers return 200 with no Content-Length and empty body.
170+
// response.json() would throw; read as text and parse if non-empty.
171+
const text = await response.text();
172+
data = text ? JSON.parse(text) : {};
173+
break;
174+
}
169175
case 'stream':
170176
return opts.responseStyle === 'data'
171177
? response.body

src/api/index.ts

Lines changed: 120 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,14 @@ export {
181181
fctMissedSlotRateHourlyServiceList,
182182
fctNodeActiveLast24hServiceGet,
183183
fctNodeActiveLast24hServiceList,
184+
fctNodeCpuUtilizationByProcessServiceGet,
185+
fctNodeCpuUtilizationByProcessServiceList,
186+
fctNodeDiskIoByProcessServiceGet,
187+
fctNodeDiskIoByProcessServiceList,
188+
fctNodeMemoryUsageByProcessServiceGet,
189+
fctNodeMemoryUsageByProcessServiceList,
190+
fctNodeNetworkIoByProcessServiceGet,
191+
fctNodeNetworkIoByProcessServiceList,
184192
fctOpcodeGasByOpcodeDailyServiceGet,
185193
fctOpcodeGasByOpcodeDailyServiceList,
186194
fctOpcodeGasByOpcodeHourlyServiceGet,
@@ -257,6 +265,10 @@ export {
257265
intBlockOpcodeGasServiceList,
258266
intBlockProposerCanonicalServiceGet,
259267
intBlockProposerCanonicalServiceList,
268+
intContractCreationServiceGet,
269+
intContractCreationServiceList,
270+
intContractSelfdestructServiceGet,
271+
intContractSelfdestructServiceList,
260272
intContractStorageExpiry12mServiceGet,
261273
intContractStorageExpiry12mServiceList,
262274
intContractStorageExpiry18mServiceGet,
@@ -297,12 +309,14 @@ export {
297309
intCustodyProbeServiceList,
298310
intEngineGetBlobsServiceGet,
299311
intEngineGetBlobsServiceList,
300-
intEngineNewPayloadFastestServiceGet,
301-
intEngineNewPayloadFastestServiceList,
312+
intEngineNewPayloadFastestExecutionByNodeClassServiceGet,
313+
intEngineNewPayloadFastestExecutionByNodeClassServiceList,
302314
intEngineNewPayloadServiceGet,
303315
intEngineNewPayloadServiceList,
304316
intExecutionBlockByDateServiceGet,
305317
intExecutionBlockByDateServiceList,
318+
intStorageSelfdestructDiffsServiceGet,
319+
intStorageSelfdestructDiffsServiceList,
306320
intStorageSlotDiffByAddressSlotServiceGet,
307321
intStorageSlotDiffByAddressSlotServiceList,
308322
intStorageSlotDiffServiceGet,
@@ -1343,6 +1357,50 @@ export type {
13431357
FctNodeActiveLast24hServiceListErrors,
13441358
FctNodeActiveLast24hServiceListResponse,
13451359
FctNodeActiveLast24hServiceListResponses,
1360+
FctNodeCpuUtilizationByProcess,
1361+
FctNodeCpuUtilizationByProcessServiceGetData,
1362+
FctNodeCpuUtilizationByProcessServiceGetError,
1363+
FctNodeCpuUtilizationByProcessServiceGetErrors,
1364+
FctNodeCpuUtilizationByProcessServiceGetResponse,
1365+
FctNodeCpuUtilizationByProcessServiceGetResponses,
1366+
FctNodeCpuUtilizationByProcessServiceListData,
1367+
FctNodeCpuUtilizationByProcessServiceListError,
1368+
FctNodeCpuUtilizationByProcessServiceListErrors,
1369+
FctNodeCpuUtilizationByProcessServiceListResponse,
1370+
FctNodeCpuUtilizationByProcessServiceListResponses,
1371+
FctNodeDiskIoByProcess,
1372+
FctNodeDiskIoByProcessServiceGetData,
1373+
FctNodeDiskIoByProcessServiceGetError,
1374+
FctNodeDiskIoByProcessServiceGetErrors,
1375+
FctNodeDiskIoByProcessServiceGetResponse,
1376+
FctNodeDiskIoByProcessServiceGetResponses,
1377+
FctNodeDiskIoByProcessServiceListData,
1378+
FctNodeDiskIoByProcessServiceListError,
1379+
FctNodeDiskIoByProcessServiceListErrors,
1380+
FctNodeDiskIoByProcessServiceListResponse,
1381+
FctNodeDiskIoByProcessServiceListResponses,
1382+
FctNodeMemoryUsageByProcess,
1383+
FctNodeMemoryUsageByProcessServiceGetData,
1384+
FctNodeMemoryUsageByProcessServiceGetError,
1385+
FctNodeMemoryUsageByProcessServiceGetErrors,
1386+
FctNodeMemoryUsageByProcessServiceGetResponse,
1387+
FctNodeMemoryUsageByProcessServiceGetResponses,
1388+
FctNodeMemoryUsageByProcessServiceListData,
1389+
FctNodeMemoryUsageByProcessServiceListError,
1390+
FctNodeMemoryUsageByProcessServiceListErrors,
1391+
FctNodeMemoryUsageByProcessServiceListResponse,
1392+
FctNodeMemoryUsageByProcessServiceListResponses,
1393+
FctNodeNetworkIoByProcess,
1394+
FctNodeNetworkIoByProcessServiceGetData,
1395+
FctNodeNetworkIoByProcessServiceGetError,
1396+
FctNodeNetworkIoByProcessServiceGetErrors,
1397+
FctNodeNetworkIoByProcessServiceGetResponse,
1398+
FctNodeNetworkIoByProcessServiceGetResponses,
1399+
FctNodeNetworkIoByProcessServiceListData,
1400+
FctNodeNetworkIoByProcessServiceListError,
1401+
FctNodeNetworkIoByProcessServiceListErrors,
1402+
FctNodeNetworkIoByProcessServiceListResponse,
1403+
FctNodeNetworkIoByProcessServiceListResponses,
13461404
FctOpcodeGasByOpcodeDaily,
13471405
FctOpcodeGasByOpcodeDailyServiceGetData,
13481406
FctOpcodeGasByOpcodeDailyServiceGetError,
@@ -1708,6 +1766,10 @@ export type {
17081766
GetFctMissedSlotRateDailyResponse,
17091767
GetFctMissedSlotRateHourlyResponse,
17101768
GetFctNodeActiveLast24hResponse,
1769+
GetFctNodeCpuUtilizationByProcessResponse,
1770+
GetFctNodeDiskIoByProcessResponse,
1771+
GetFctNodeMemoryUsageByProcessResponse,
1772+
GetFctNodeNetworkIoByProcessResponse,
17111773
GetFctOpcodeGasByOpcodeDailyResponse,
17121774
GetFctOpcodeGasByOpcodeHourlyResponse,
17131775
GetFctOpcodeOpsDailyResponse,
@@ -1746,6 +1808,8 @@ export type {
17461808
GetIntBlockMevCanonicalResponse,
17471809
GetIntBlockOpcodeGasResponse,
17481810
GetIntBlockProposerCanonicalResponse,
1811+
GetIntContractCreationResponse,
1812+
GetIntContractSelfdestructResponse,
17491813
GetIntContractStorageExpiry12mResponse,
17501814
GetIntContractStorageExpiry18mResponse,
17511815
GetIntContractStorageExpiry1mResponse,
@@ -1766,9 +1830,10 @@ export type {
17661830
GetIntCustodyProbeOrderBySlotResponse,
17671831
GetIntCustodyProbeResponse,
17681832
GetIntEngineGetBlobsResponse,
1769-
GetIntEngineNewPayloadFastestResponse,
1833+
GetIntEngineNewPayloadFastestExecutionByNodeClassResponse,
17701834
GetIntEngineNewPayloadResponse,
17711835
GetIntExecutionBlockByDateResponse,
1836+
GetIntStorageSelfdestructDiffsResponse,
17721837
GetIntStorageSlotDiffByAddressSlotResponse,
17731838
GetIntStorageSlotDiffResponse,
17741839
GetIntStorageSlotExpiry12mResponse,
@@ -1936,6 +2001,28 @@ export type {
19362001
IntBlockProposerCanonicalServiceListErrors,
19372002
IntBlockProposerCanonicalServiceListResponse,
19382003
IntBlockProposerCanonicalServiceListResponses,
2004+
IntContractCreation,
2005+
IntContractCreationServiceGetData,
2006+
IntContractCreationServiceGetError,
2007+
IntContractCreationServiceGetErrors,
2008+
IntContractCreationServiceGetResponse,
2009+
IntContractCreationServiceGetResponses,
2010+
IntContractCreationServiceListData,
2011+
IntContractCreationServiceListError,
2012+
IntContractCreationServiceListErrors,
2013+
IntContractCreationServiceListResponse,
2014+
IntContractCreationServiceListResponses,
2015+
IntContractSelfdestruct,
2016+
IntContractSelfdestructServiceGetData,
2017+
IntContractSelfdestructServiceGetError,
2018+
IntContractSelfdestructServiceGetErrors,
2019+
IntContractSelfdestructServiceGetResponse,
2020+
IntContractSelfdestructServiceGetResponses,
2021+
IntContractSelfdestructServiceListData,
2022+
IntContractSelfdestructServiceListError,
2023+
IntContractSelfdestructServiceListErrors,
2024+
IntContractSelfdestructServiceListResponse,
2025+
IntContractSelfdestructServiceListResponses,
19392026
IntContractStorageExpiry12m,
19402027
IntContractStorageExpiry12mServiceGetData,
19412028
IntContractStorageExpiry12mServiceGetError,
@@ -2157,17 +2244,17 @@ export type {
21572244
IntEngineGetBlobsServiceListResponse,
21582245
IntEngineGetBlobsServiceListResponses,
21592246
IntEngineNewPayload,
2160-
IntEngineNewPayloadFastest,
2161-
IntEngineNewPayloadFastestServiceGetData,
2162-
IntEngineNewPayloadFastestServiceGetError,
2163-
IntEngineNewPayloadFastestServiceGetErrors,
2164-
IntEngineNewPayloadFastestServiceGetResponse,
2165-
IntEngineNewPayloadFastestServiceGetResponses,
2166-
IntEngineNewPayloadFastestServiceListData,
2167-
IntEngineNewPayloadFastestServiceListError,
2168-
IntEngineNewPayloadFastestServiceListErrors,
2169-
IntEngineNewPayloadFastestServiceListResponse,
2170-
IntEngineNewPayloadFastestServiceListResponses,
2247+
IntEngineNewPayloadFastestExecutionByNodeClass,
2248+
IntEngineNewPayloadFastestExecutionByNodeClassServiceGetData,
2249+
IntEngineNewPayloadFastestExecutionByNodeClassServiceGetError,
2250+
IntEngineNewPayloadFastestExecutionByNodeClassServiceGetErrors,
2251+
IntEngineNewPayloadFastestExecutionByNodeClassServiceGetResponse,
2252+
IntEngineNewPayloadFastestExecutionByNodeClassServiceGetResponses,
2253+
IntEngineNewPayloadFastestExecutionByNodeClassServiceListData,
2254+
IntEngineNewPayloadFastestExecutionByNodeClassServiceListError,
2255+
IntEngineNewPayloadFastestExecutionByNodeClassServiceListErrors,
2256+
IntEngineNewPayloadFastestExecutionByNodeClassServiceListResponse,
2257+
IntEngineNewPayloadFastestExecutionByNodeClassServiceListResponses,
21712258
IntEngineNewPayloadServiceGetData,
21722259
IntEngineNewPayloadServiceGetError,
21732260
IntEngineNewPayloadServiceGetErrors,
@@ -2189,6 +2276,17 @@ export type {
21892276
IntExecutionBlockByDateServiceListErrors,
21902277
IntExecutionBlockByDateServiceListResponse,
21912278
IntExecutionBlockByDateServiceListResponses,
2279+
IntStorageSelfdestructDiffs,
2280+
IntStorageSelfdestructDiffsServiceGetData,
2281+
IntStorageSelfdestructDiffsServiceGetError,
2282+
IntStorageSelfdestructDiffsServiceGetErrors,
2283+
IntStorageSelfdestructDiffsServiceGetResponse,
2284+
IntStorageSelfdestructDiffsServiceGetResponses,
2285+
IntStorageSelfdestructDiffsServiceListData,
2286+
IntStorageSelfdestructDiffsServiceListError,
2287+
IntStorageSelfdestructDiffsServiceListErrors,
2288+
IntStorageSelfdestructDiffsServiceListResponse,
2289+
IntStorageSelfdestructDiffsServiceListResponses,
21922290
IntStorageSlotDiff,
21932291
IntStorageSlotDiffByAddressSlot,
21942292
IntStorageSlotDiffByAddressSlotServiceGetData,
@@ -2532,6 +2630,10 @@ export type {
25322630
ListFctMissedSlotRateDailyResponse,
25332631
ListFctMissedSlotRateHourlyResponse,
25342632
ListFctNodeActiveLast24hResponse,
2633+
ListFctNodeCpuUtilizationByProcessResponse,
2634+
ListFctNodeDiskIoByProcessResponse,
2635+
ListFctNodeMemoryUsageByProcessResponse,
2636+
ListFctNodeNetworkIoByProcessResponse,
25352637
ListFctOpcodeGasByOpcodeDailyResponse,
25362638
ListFctOpcodeGasByOpcodeHourlyResponse,
25372639
ListFctOpcodeOpsDailyResponse,
@@ -2570,6 +2672,8 @@ export type {
25702672
ListIntBlockMevCanonicalResponse,
25712673
ListIntBlockOpcodeGasResponse,
25722674
ListIntBlockProposerCanonicalResponse,
2675+
ListIntContractCreationResponse,
2676+
ListIntContractSelfdestructResponse,
25732677
ListIntContractStorageExpiry12mResponse,
25742678
ListIntContractStorageExpiry18mResponse,
25752679
ListIntContractStorageExpiry1mResponse,
@@ -2590,9 +2694,10 @@ export type {
25902694
ListIntCustodyProbeOrderBySlotResponse,
25912695
ListIntCustodyProbeResponse,
25922696
ListIntEngineGetBlobsResponse,
2593-
ListIntEngineNewPayloadFastestResponse,
2697+
ListIntEngineNewPayloadFastestExecutionByNodeClassResponse,
25942698
ListIntEngineNewPayloadResponse,
25952699
ListIntExecutionBlockByDateResponse,
2700+
ListIntStorageSelfdestructDiffsResponse,
25962701
ListIntStorageSlotDiffByAddressSlotResponse,
25972702
ListIntStorageSlotDiffResponse,
25982703
ListIntStorageSlotExpiry12mResponse,

0 commit comments

Comments
 (0)