@@ -13,6 +13,34 @@ const (
1313 MetricsSubsystem = "sequencer"
1414)
1515
16+ // DASubmitterFailureReason represents a typed failure reason for DA submission failures
17+ type DASubmitterFailureReason string
18+
19+ const (
20+ DASubmitterFailureReasonAlreadyRejected DASubmitterFailureReason = "already_rejected"
21+ DASubmitterFailureReasonInsufficientFee DASubmitterFailureReason = "insufficient_fee"
22+ DASubmitterFailureReasonTimeout DASubmitterFailureReason = "timeout"
23+ DASubmitterFailureReasonAlreadyInMempool DASubmitterFailureReason = "already_in_mempool"
24+ DASubmitterFailureReasonNotIncludedInBlock DASubmitterFailureReason = "not_included_in_block"
25+ DASubmitterFailureReasonTooBig DASubmitterFailureReason = "too_big"
26+ DASubmitterFailureReasonContextCanceled DASubmitterFailureReason = "context_canceled"
27+ DASubmitterFailureReasonUnknown DASubmitterFailureReason = "unknown"
28+ )
29+
30+ // AllDASubmitterFailureReasons returns all possible failure reasons
31+ func AllDASubmitterFailureReasons () []DASubmitterFailureReason {
32+ return []DASubmitterFailureReason {
33+ DASubmitterFailureReasonAlreadyRejected ,
34+ DASubmitterFailureReasonInsufficientFee ,
35+ DASubmitterFailureReasonTimeout ,
36+ DASubmitterFailureReasonAlreadyInMempool ,
37+ DASubmitterFailureReasonNotIncludedInBlock ,
38+ DASubmitterFailureReasonTooBig ,
39+ DASubmitterFailureReasonContextCanceled ,
40+ DASubmitterFailureReasonUnknown ,
41+ }
42+ }
43+
1644// Metrics contains all metrics exposed by this package.
1745type Metrics struct {
1846 // Original metrics
@@ -63,6 +91,12 @@ type Metrics struct {
6391 // State transition metrics
6492 StateTransitions map [string ]metrics.Counter
6593 InvalidTransitions metrics.Counter
94+
95+ // DA Submitter metrics
96+ DASubmitterFailures map [DASubmitterFailureReason ]metrics.Counter // Counter with reason label
97+ DASubmitterLastFailure map [DASubmitterFailureReason ]metrics.Gauge // Timestamp gauge with reason label
98+ DASubmitterPendingBlobs metrics.Gauge // Total number of blobs awaiting submission (backlog)
99+ DASubmitterResends metrics.Counter // Number of resend attempts
66100}
67101
68102// PrometheusMetrics returns Metrics built using Prometheus client library
@@ -73,10 +107,12 @@ func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics {
73107 }
74108
75109 m := & Metrics {
76- ChannelBufferUsage : make (map [string ]metrics.Gauge ),
77- ErrorsByType : make (map [string ]metrics.Counter ),
78- OperationDuration : make (map [string ]metrics.Histogram ),
79- StateTransitions : make (map [string ]metrics.Counter ),
110+ ChannelBufferUsage : make (map [string ]metrics.Gauge ),
111+ ErrorsByType : make (map [string ]metrics.Counter ),
112+ OperationDuration : make (map [string ]metrics.Histogram ),
113+ StateTransitions : make (map [string ]metrics.Counter ),
114+ DASubmitterFailures : make (map [DASubmitterFailureReason ]metrics.Counter ),
115+ DASubmitterLastFailure : make (map [DASubmitterFailureReason ]metrics.Gauge ),
80116 }
81117
82118 // Original metrics
@@ -349,6 +385,44 @@ func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics {
349385 }, labels ).With (labelsAndValues ... )
350386 }
351387
388+ // DA Submitter metrics
389+ m .DASubmitterPendingBlobs = prometheus .NewGaugeFrom (stdprometheus.GaugeOpts {
390+ Namespace : namespace ,
391+ Subsystem : MetricsSubsystem ,
392+ Name : "da_submitter_pending_blobs" ,
393+ Help : "Total number of blobs awaiting DA submission (backlog)" ,
394+ }, labels ).With (labelsAndValues ... )
395+
396+ m .DASubmitterResends = prometheus .NewCounterFrom (stdprometheus.CounterOpts {
397+ Namespace : namespace ,
398+ Subsystem : MetricsSubsystem ,
399+ Name : "da_submitter_resends_total" ,
400+ Help : "Total number of DA submission retry attempts" ,
401+ }, labels ).With (labelsAndValues ... )
402+
403+ // Initialize DA submitter failure counters and timestamps for various reasons
404+ for _ , reason := range AllDASubmitterFailureReasons () {
405+ m .DASubmitterFailures [reason ] = prometheus .NewCounterFrom (stdprometheus.CounterOpts {
406+ Namespace : namespace ,
407+ Subsystem : MetricsSubsystem ,
408+ Name : "da_submitter_failures_total" ,
409+ Help : "Total number of DA submission failures by reason" ,
410+ ConstLabels : map [string ]string {
411+ "reason" : string (reason ),
412+ },
413+ }, labels ).With (labelsAndValues ... )
414+
415+ m .DASubmitterLastFailure [reason ] = prometheus .NewGaugeFrom (stdprometheus.GaugeOpts {
416+ Namespace : namespace ,
417+ Subsystem : MetricsSubsystem ,
418+ Name : "da_submitter_last_failure_timestamp" ,
419+ Help : "Unix timestamp of the last DA submission failure by reason" ,
420+ ConstLabels : map [string ]string {
421+ "reason" : string (reason ),
422+ },
423+ }, labels ).With (labelsAndValues ... )
424+ }
425+
352426 return m
353427}
354428
@@ -363,34 +437,38 @@ func NopMetrics() *Metrics {
363437 CommittedHeight : discard .NewGauge (),
364438
365439 // Extended metrics
366- ChannelBufferUsage : make (map [string ]metrics.Gauge ),
367- ErrorsByType : make (map [string ]metrics.Counter ),
368- OperationDuration : make (map [string ]metrics.Histogram ),
369- StateTransitions : make (map [string ]metrics.Counter ),
370- DroppedSignals : discard .NewCounter (),
371- RecoverableErrors : discard .NewCounter (),
372- NonRecoverableErrors : discard .NewCounter (),
373- GoroutineCount : discard .NewGauge (),
374- DASubmissionAttempts : discard .NewCounter (),
375- DASubmissionSuccesses : discard .NewCounter (),
376- DASubmissionFailures : discard .NewCounter (),
377- DARetrievalAttempts : discard .NewCounter (),
378- DARetrievalSuccesses : discard .NewCounter (),
379- DARetrievalFailures : discard .NewCounter (),
380- DAInclusionHeight : discard .NewGauge (),
381- PendingHeadersCount : discard .NewGauge (),
382- PendingDataCount : discard .NewGauge (),
383- SyncLag : discard .NewGauge (),
384- HeadersSynced : discard .NewCounter (),
385- DataSynced : discard .NewCounter (),
386- BlocksApplied : discard .NewCounter (),
387- InvalidHeadersCount : discard .NewCounter (),
388- BlockProductionTime : discard .NewHistogram (),
389- EmptyBlocksProduced : discard .NewCounter (),
390- LazyBlocksProduced : discard .NewCounter (),
391- NormalBlocksProduced : discard .NewCounter (),
392- TxsPerBlock : discard .NewHistogram (),
393- InvalidTransitions : discard .NewCounter (),
440+ ChannelBufferUsage : make (map [string ]metrics.Gauge ),
441+ ErrorsByType : make (map [string ]metrics.Counter ),
442+ OperationDuration : make (map [string ]metrics.Histogram ),
443+ StateTransitions : make (map [string ]metrics.Counter ),
444+ DroppedSignals : discard .NewCounter (),
445+ RecoverableErrors : discard .NewCounter (),
446+ NonRecoverableErrors : discard .NewCounter (),
447+ GoroutineCount : discard .NewGauge (),
448+ DASubmissionAttempts : discard .NewCounter (),
449+ DASubmissionSuccesses : discard .NewCounter (),
450+ DASubmissionFailures : discard .NewCounter (),
451+ DARetrievalAttempts : discard .NewCounter (),
452+ DARetrievalSuccesses : discard .NewCounter (),
453+ DARetrievalFailures : discard .NewCounter (),
454+ DAInclusionHeight : discard .NewGauge (),
455+ PendingHeadersCount : discard .NewGauge (),
456+ PendingDataCount : discard .NewGauge (),
457+ SyncLag : discard .NewGauge (),
458+ HeadersSynced : discard .NewCounter (),
459+ DataSynced : discard .NewCounter (),
460+ BlocksApplied : discard .NewCounter (),
461+ InvalidHeadersCount : discard .NewCounter (),
462+ BlockProductionTime : discard .NewHistogram (),
463+ EmptyBlocksProduced : discard .NewCounter (),
464+ LazyBlocksProduced : discard .NewCounter (),
465+ NormalBlocksProduced : discard .NewCounter (),
466+ TxsPerBlock : discard .NewHistogram (),
467+ InvalidTransitions : discard .NewCounter (),
468+ DASubmitterFailures : make (map [DASubmitterFailureReason ]metrics.Counter ),
469+ DASubmitterLastFailure : make (map [DASubmitterFailureReason ]metrics.Gauge ),
470+ DASubmitterPendingBlobs : discard .NewGauge (),
471+ DASubmitterResends : discard .NewCounter (),
394472 }
395473
396474 // Initialize maps with no-op metrics
@@ -414,5 +492,11 @@ func NopMetrics() *Metrics {
414492 m .StateTransitions [transition ] = discard .NewCounter ()
415493 }
416494
495+ // Initialize DA submitter failure maps with no-op metrics
496+ for _ , reason := range AllDASubmitterFailureReasons () {
497+ m .DASubmitterFailures [reason ] = discard .NewCounter ()
498+ m .DASubmitterLastFailure [reason ] = discard .NewGauge ()
499+ }
500+
417501 return m
418502}
0 commit comments