Skip to content

Commit f1de8b7

Browse files
authored
add aggregated attestation signature metrics (#535)
1 parent 049ff5d commit f1de8b7

File tree

3 files changed

+68
-3
lines changed

3 files changed

+68
-3
lines changed

pkgs/metrics/src/lib.zig

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ const Metrics = struct {
4646
lean_attestation_validation_time_seconds: ForkChoiceAttestationValidationTimeHistogram,
4747
lean_pq_signature_attestation_signing_time_seconds: PQSignatureSigningHistogram,
4848
lean_pq_signature_attestation_verification_time_seconds: PQSignatureVerificationHistogram,
49+
// Aggregated attestation signature metrics
50+
lean_pq_sig_aggregated_signatures_total: PQSigAggregatedSignaturesTotalCounter,
51+
lean_pq_sig_attestations_in_aggregated_signatures_total: PQSigAttestationsInAggregatedTotalCounter,
52+
lean_pq_sig_attestation_signatures_building_time_seconds: PQSigBuildingTimeHistogram,
53+
lean_pq_sig_aggregated_signatures_verification_time_seconds: PQSigAggregatedVerificationHistogram,
54+
lean_pq_sig_aggregated_signatures_valid_total: PQSigAggregatedValidCounter,
55+
lean_pq_sig_aggregated_signatures_invalid_total: PQSigAggregatedInvalidCounter,
4956
// Network peer metrics
5057
lean_connected_peers: LeanConnectedPeersGauge,
5158
lean_peer_connection_events_total: PeerConnectionEventsCounter,
@@ -79,6 +86,13 @@ const Metrics = struct {
7986
const ForkChoiceAttestationsValidLabeledCounter = metrics_lib.CounterVec(u64, struct { source: []const u8 });
8087
const ForkChoiceAttestationsInvalidLabeledCounter = metrics_lib.CounterVec(u64, struct { source: []const u8 });
8188
const ForkChoiceAttestationValidationTimeHistogram = metrics_lib.Histogram(f32, &[_]f32{ 0.005, 0.01, 0.025, 0.05, 0.1, 1 });
89+
// Aggregated attestation signature metric types
90+
const PQSigAggregatedSignaturesTotalCounter = metrics_lib.Counter(u64);
91+
const PQSigAttestationsInAggregatedTotalCounter = metrics_lib.Counter(u64);
92+
const PQSigBuildingTimeHistogram = metrics_lib.Histogram(f32, &[_]f32{ 0.005, 0.01, 0.025, 0.05, 0.1, 1 });
93+
const PQSigAggregatedVerificationHistogram = metrics_lib.Histogram(f32, &[_]f32{ 0.005, 0.01, 0.025, 0.05, 0.1, 1 });
94+
const PQSigAggregatedValidCounter = metrics_lib.Counter(u64);
95+
const PQSigAggregatedInvalidCounter = metrics_lib.Counter(u64);
8296
// Network peer metric types
8397
const LeanConnectedPeersGauge = metrics_lib.Gauge(u64);
8498
const PeerConnectionEventsCounter = metrics_lib.CounterVec(u64, struct { direction: []const u8, result: []const u8 });
@@ -189,6 +203,18 @@ fn observePQSignatureAttestationVerification(ctx: ?*anyopaque, value: f32) void
189203
histogram.observe(value);
190204
}
191205

206+
fn observePQSigBuildingTime(ctx: ?*anyopaque, value: f32) void {
207+
const histogram_ptr = ctx orelse return; // No-op if not initialized
208+
const histogram: *Metrics.PQSigBuildingTimeHistogram = @ptrCast(@alignCast(histogram_ptr));
209+
histogram.observe(value);
210+
}
211+
212+
fn observePQSigAggregatedVerification(ctx: ?*anyopaque, value: f32) void {
213+
const histogram_ptr = ctx orelse return; // No-op if not initialized
214+
const histogram: *Metrics.PQSigAggregatedVerificationHistogram = @ptrCast(@alignCast(histogram_ptr));
215+
histogram.observe(value);
216+
}
217+
192218
/// The public variables the application interacts with.
193219
/// Calling `.start()` on these will start a new timer.
194220
pub var chain_onblock_duration_seconds: Histogram = .{
@@ -232,6 +258,14 @@ pub var lean_pq_signature_attestation_verification_time_seconds: Histogram = .{
232258
.context = null,
233259
.observe = &observePQSignatureAttestationVerification,
234260
};
261+
pub var lean_pq_sig_attestation_signatures_building_time_seconds: Histogram = .{
262+
.context = null,
263+
.observe = &observePQSigBuildingTime,
264+
};
265+
pub var lean_pq_sig_aggregated_signatures_verification_time_seconds: Histogram = .{
266+
.context = null,
267+
.observe = &observePQSigAggregatedVerification,
268+
};
235269

236270
/// Initializes the metrics system. Must be called once at startup.
237271
pub fn init(allocator: std.mem.Allocator) !void {
@@ -263,6 +297,13 @@ pub fn init(allocator: std.mem.Allocator) !void {
263297
.lean_attestation_validation_time_seconds = Metrics.ForkChoiceAttestationValidationTimeHistogram.init("lean_attestation_validation_time_seconds", .{ .help = "Time taken to validate attestation." }, .{}),
264298
.lean_pq_signature_attestation_signing_time_seconds = Metrics.PQSignatureSigningHistogram.init("lean_pq_signature_attestation_signing_time_seconds", .{ .help = "Time taken to sign an attestation." }, .{}),
265299
.lean_pq_signature_attestation_verification_time_seconds = Metrics.PQSignatureVerificationHistogram.init("lean_pq_signature_attestation_verification_time_seconds", .{ .help = "Time taken to verify an attestation signature." }, .{}),
300+
// Aggregated attestation signature metrics
301+
.lean_pq_sig_aggregated_signatures_total = Metrics.PQSigAggregatedSignaturesTotalCounter.init("lean_pq_sig_aggregated_signatures_total", .{ .help = "Total number of aggregated signatures." }, .{}),
302+
.lean_pq_sig_attestations_in_aggregated_signatures_total = Metrics.PQSigAttestationsInAggregatedTotalCounter.init("lean_pq_sig_attestations_in_aggregated_signatures_total", .{ .help = "Total number of attestations included into aggregated signatures." }, .{}),
303+
.lean_pq_sig_attestation_signatures_building_time_seconds = Metrics.PQSigBuildingTimeHistogram.init("lean_pq_sig_attestation_signatures_building_time_seconds", .{ .help = "Time taken to build aggregated attestation signatures." }, .{}),
304+
.lean_pq_sig_aggregated_signatures_verification_time_seconds = Metrics.PQSigAggregatedVerificationHistogram.init("lean_pq_sig_aggregated_signatures_verification_time_seconds", .{ .help = "Time taken to verify an aggregated attestation signature." }, .{}),
305+
.lean_pq_sig_aggregated_signatures_valid_total = Metrics.PQSigAggregatedValidCounter.init("lean_pq_sig_aggregated_signatures_valid_total", .{ .help = "Total number of valid aggregated signatures." }, .{}),
306+
.lean_pq_sig_aggregated_signatures_invalid_total = Metrics.PQSigAggregatedInvalidCounter.init("lean_pq_sig_aggregated_signatures_invalid_total", .{ .help = "Total number of invalid aggregated signatures." }, .{}),
266307
// Network peer metrics
267308
.lean_connected_peers = Metrics.LeanConnectedPeersGauge.init("lean_connected_peers", .{ .help = "Number of currently connected peers." }, .{}),
268309
.lean_peer_connection_events_total = try Metrics.PeerConnectionEventsCounter.init(allocator, "lean_peer_connection_events_total", .{ .help = "Total peer connection events by direction and result." }, .{}),
@@ -293,6 +334,8 @@ pub fn init(allocator: std.mem.Allocator) !void {
293334
lean_attestation_validation_time_seconds.context = @ptrCast(&metrics.lean_attestation_validation_time_seconds);
294335
lean_pq_signature_attestation_signing_time_seconds.context = @ptrCast(&metrics.lean_pq_signature_attestation_signing_time_seconds);
295336
lean_pq_signature_attestation_verification_time_seconds.context = @ptrCast(&metrics.lean_pq_signature_attestation_verification_time_seconds);
337+
lean_pq_sig_attestation_signatures_building_time_seconds.context = @ptrCast(&metrics.lean_pq_sig_attestation_signatures_building_time_seconds);
338+
lean_pq_sig_aggregated_signatures_verification_time_seconds.context = @ptrCast(&metrics.lean_pq_sig_aggregated_signatures_verification_time_seconds);
296339

297340
g_initialized = true;
298341
}

pkgs/node/src/chain.zig

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,12 +323,29 @@ pub const BeamChain = struct {
323323
// Lock mutex to protect concurrent access to gossip_signatures and aggregated_payloads
324324
self.forkChoice.signatures_mutex.lock();
325325
defer self.forkChoice.signatures_mutex.unlock();
326+
const building_timer = zeam_metrics.lean_pq_sig_attestation_signatures_building_time_seconds.start();
326327
try aggregation.computeAggregatedSignatures(
327328
attestations,
328329
&pre_state.validators,
329330
&self.forkChoice.gossip_signatures,
330331
&self.forkChoice.aggregated_payloads,
331332
);
333+
_ = building_timer.observe();
334+
335+
// Record aggregated signature metrics
336+
const num_agg_sigs = aggregation.attestation_signatures.len();
337+
zeam_metrics.metrics.lean_pq_sig_aggregated_signatures_total.incrBy(num_agg_sigs);
338+
339+
var total_attestations_in_agg: u64 = 0;
340+
for (aggregation.attestations.constSlice()) |agg_att| {
341+
const bits_len = agg_att.aggregation_bits.len();
342+
for (0..bits_len) |i| {
343+
if (agg_att.aggregation_bits.get(i) catch false) {
344+
total_attestations_in_agg += 1;
345+
}
346+
}
347+
}
348+
zeam_metrics.metrics.lean_pq_sig_attestations_in_aggregated_signatures_total.incrBy(total_attestations_in_agg);
332349

333350
// keeping for later when execution will be integrated into lean
334351
// const timestamp = self.config.genesis.genesis_time + opts.slot * params.SECONDS_PER_SLOT;

pkgs/state-transition/src/transition.zig

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,14 @@ pub fn verifySignatures(
139139
const epoch: u64 = aggregated_attestation.data.slot;
140140

141141
// Verify the aggregated signature proof
142-
const verification_timer = zeam_metrics.lean_pq_signature_attestation_verification_time_seconds.start();
143-
try signature_proof.verify(public_keys.items, &message_hash, epoch);
144-
_ = verification_timer.observe();
142+
const agg_verification_timer = zeam_metrics.lean_pq_sig_aggregated_signatures_verification_time_seconds.start();
143+
signature_proof.verify(public_keys.items, &message_hash, epoch) catch |err| {
144+
_ = agg_verification_timer.observe();
145+
zeam_metrics.metrics.lean_pq_sig_aggregated_signatures_invalid_total.incr();
146+
return err;
147+
};
148+
_ = agg_verification_timer.observe();
149+
zeam_metrics.metrics.lean_pq_sig_aggregated_signatures_valid_total.incr();
145150
}
146151

147152
// Verify proposer signature (still individual)

0 commit comments

Comments
 (0)