From 0e9da44aa12ffb3e62247b8ad0e235581d44f183 Mon Sep 17 00:00:00 2001 From: Adam Weil Date: Thu, 30 Jul 2026 01:10:12 -0400 Subject: [PATCH] feat(shred): add latency histogram metrics to Receiver - Add ReceiverMetrics with per-method LatencyHistograms for reset, updateSlotRange, and processPacket - Add ResultLatencyHistogram to telemetry lib, which flattens an `Error!Payload` into one series per outcome via `variant` labels - Wire metrics through Receiver.init and observe timings around each method, exposing outcome-tagged series for processPacket - Add Grafana dashboard for the shred receiver - Make error sets explicit on shred parsing, merkle root computation, and ed25519 signature verification so processPacket's error set is nameable --- conformance/src/shred_parse.zig | 2 +- v2/components/shred/ReceiverMetrics.zig | 84 + v2/components/shred/api.zig | 31 +- v2/components/shred/component.zig | 2 + v2/components/shred/receiver.zig | 94 +- v2/lib/crypto/ed25519.zig | 12 +- v2/lib/solana/signature.zig | 6 +- v2/lib/telemetry.zig | 474 ++++ v2/lib/telemetry/metric.zig | 125 + .../grafana/dashboards/shred_receiver.json | 2347 +++++++++++++++++ v2/services/shred_receiver.zig | 25 +- 11 files changed, 3186 insertions(+), 16 deletions(-) create mode 100644 v2/components/shred/ReceiverMetrics.zig create mode 100644 v2/metrics/grafana/dashboards/shred_receiver.json diff --git a/conformance/src/shred_parse.zig b/conformance/src/shred_parse.zig index 63a90ef133..3f29e497f2 100644 --- a/conformance/src/shred_parse.zig +++ b/conformance/src/shred_parse.zig @@ -197,7 +197,7 @@ const HarnessState = struct { ls.base_slot = 0; @memset(&ls.leaders, .ZEROES); - const receiver = try Receiver.init(allocator, IN_PROGRESS_CAPACITY, DONE_CAPACITY); + const receiver = try Receiver.init(allocator, IN_PROGRESS_CAPACITY, DONE_CAPACITY, .initNoop()); self.* = .{ .allocator = allocator, diff --git a/v2/components/shred/ReceiverMetrics.zig b/v2/components/shred/ReceiverMetrics.zig new file mode 100644 index 0000000000..84efab5c3a --- /dev/null +++ b/v2/components/shred/ReceiverMetrics.zig @@ -0,0 +1,84 @@ +const std = @import("std"); +const builtin = @import("builtin"); + +comptime { + _ = std.testing.refAllDecls(@This()); +} + +const lib = @import("lib"); +const tel = lib.telemetry; + +const LatencyHistogram = tel.LatencyHistogram; +const Receiver = @import("receiver.zig").Receiver; + +const ReceiverMetrics = @This(); + +reset_elapsed_ns: LatencyHistogram, +update_slot_range_elapsed_ns: LatencyHistogram, +process_packet_elapsed_ns: ProcessPacketElapsedHistogram, + +/// One latency series per `processPacket` outcome: each `NonErrorStatus` variant plus each error, +/// flattened into `variant="