From 4914882e97b764150e70df858ba597be8f0bcf70 Mon Sep 17 00:00:00 2001 From: terence Date: Fri, 14 Nov 2025 18:18:56 -0500 Subject: [PATCH] Record gossip KZG batch verification durations (#16018) * Record gossip KZG batch verification durations * Add path --- beacon-chain/sync/batch_verifier.go | 6 ++++++ beacon-chain/verification/data_column.go | 2 +- beacon-chain/verification/metrics.go | 3 ++- changelog/terence_gossip-kzg-latency.md | 3 +++ 4 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 changelog/terence_gossip-kzg-latency.md diff --git a/beacon-chain/sync/batch_verifier.go b/beacon-chain/sync/batch_verifier.go index 0f1e61f35d..d6109daec1 100644 --- a/beacon-chain/sync/batch_verifier.go +++ b/beacon-chain/sync/batch_verifier.go @@ -5,6 +5,7 @@ import ( "time" "github.com/OffchainLabs/prysm/v7/beacon-chain/core/peerdas" + "github.com/OffchainLabs/prysm/v7/beacon-chain/verification" "github.com/OffchainLabs/prysm/v7/config/params" "github.com/OffchainLabs/prysm/v7/consensus-types/blocks" "github.com/OffchainLabs/prysm/v7/crypto/bls" @@ -183,11 +184,13 @@ func (s *Service) validateWithKzgBatchVerifier(ctx context.Context, dataColumns func (s *Service) validateUnbatchedColumnsKzg(ctx context.Context, columns []blocks.RODataColumn) (pubsub.ValidationResult, error) { _, span := trace.StartSpan(ctx, "sync.validateUnbatchedColumnsKzg") defer span.End() + start := time.Now() if err := peerdas.VerifyDataColumnsSidecarKZGProofs(columns); err != nil { err = errors.Wrap(err, "could not verify") tracing.AnnotateError(span, err) return pubsub.ValidationReject, err } + verification.DataColumnBatchKZGVerificationHistogram.WithLabelValues("fallback").Observe(float64(time.Since(start).Milliseconds())) return pubsub.ValidationAccept, nil } @@ -202,9 +205,12 @@ func verifyKzgBatch(kzgBatch []*kzgVerifier) { } var verificationErr error + start := time.Now() err := peerdas.VerifyDataColumnsSidecarKZGProofs(allDataColumns) if err != nil { verificationErr = errors.Wrap(err, "batch KZG verification failed") + } else { + verification.DataColumnBatchKZGVerificationHistogram.WithLabelValues("batch").Observe(float64(time.Since(start).Milliseconds())) } // Send the same result to all verifiers in the batch diff --git a/beacon-chain/verification/data_column.go b/beacon-chain/verification/data_column.go index b27b8df8c9..9d350b4fc0 100644 --- a/beacon-chain/verification/data_column.go +++ b/beacon-chain/verification/data_column.go @@ -473,7 +473,7 @@ func (dv *RODataColumnsVerifier) SidecarKzgProofVerified() (err error) { return columnErrBuilder(errors.Wrap(err, "verify data column commitment")) } - dataColumnBatchKZGVerificationHistogram.Observe(float64(time.Since(startTime).Milliseconds())) + DataColumnBatchKZGVerificationHistogram.WithLabelValues("direct").Observe(float64(time.Since(startTime).Milliseconds())) return nil } diff --git a/beacon-chain/verification/metrics.go b/beacon-chain/verification/metrics.go index 3083c2291a..c135723bc0 100644 --- a/beacon-chain/verification/metrics.go +++ b/beacon-chain/verification/metrics.go @@ -27,11 +27,12 @@ var ( Buckets: []float64{5, 10, 50, 100, 150, 250, 500, 1000, 2000}, }, ) - dataColumnBatchKZGVerificationHistogram = promauto.NewHistogram( + DataColumnBatchKZGVerificationHistogram = promauto.NewHistogramVec( prometheus.HistogramOpts{ Name: "beacon_kzg_verification_data_column_batch_milliseconds", Help: "Captures the time taken for batched data column kzg verification.", Buckets: []float64{5, 10, 50, 100, 150, 250, 500, 1000, 2000}, }, + []string{"path"}, ) ) diff --git a/changelog/terence_gossip-kzg-latency.md b/changelog/terence_gossip-kzg-latency.md new file mode 100644 index 0000000000..d643658724 --- /dev/null +++ b/changelog/terence_gossip-kzg-latency.md @@ -0,0 +1,3 @@ +### Added + +- Record data column gossip KZG batch verification latency in both the pooled worker and fallback paths so the `beacon_kzg_verification_data_column_batch_milliseconds` histogram reflects gossip traffic, annotated with `path` labels to distinguish the sources.