55 "encoding/json"
66 "fmt"
77 "maps"
8+ "math"
89 "os"
910 "path"
1011 "time"
@@ -20,12 +21,14 @@ type Collector interface {
2021type BlockMetrics struct {
2122 BlockNumber uint64
2223 Timestamp time.Time
24+ prevMetrics map [string ]* io_prometheus_client.Metric
2325 ExecutionMetrics map [string ]interface {}
2426}
2527
2628func NewBlockMetrics () * BlockMetrics {
2729 return & BlockMetrics {
2830 BlockNumber : 0 ,
31+ prevMetrics : make (map [string ]* io_prometheus_client.Metric ),
2932 ExecutionMetrics : make (map [string ]interface {}),
3033 Timestamp : time .Now (),
3134 }
@@ -37,20 +40,22 @@ func (m *BlockMetrics) SetBlockNumber(blockNumber uint64) {
3740
3841func (m * BlockMetrics ) Copy () * BlockMetrics {
3942 newMetrics := make (map [string ]interface {})
43+ newPrevMetrics := make (map [string ]* io_prometheus_client.Metric )
4044 maps .Copy (newMetrics , m .ExecutionMetrics )
45+ maps .Copy (newPrevMetrics , m .prevMetrics )
4146 return & BlockMetrics {
4247 BlockNumber : m .BlockNumber ,
48+ prevMetrics : newPrevMetrics ,
4349 ExecutionMetrics : newMetrics ,
4450 Timestamp : m .Timestamp ,
4551 }
4652}
4753
4854func (m * BlockMetrics ) UpdatePrometheusMetric (name string , value * io_prometheus_client.Metric ) error {
4955 if value .Histogram != nil {
50- avgName := name + "_avg"
5156 // get the average change in sum divided by the average change in count
5257 prevSum := 0.0
53- prevValue , ok := m .ExecutionMetrics [name ].( * io_prometheus_client. Metric )
58+ prevValue , ok := m .prevMetrics [name ]
5459 if ! ok {
5560 prevValue = nil
5661 }
@@ -64,6 +69,8 @@ func (m *BlockMetrics) UpdatePrometheusMetric(name string, value *io_prometheus_
6469 sum = * value .Histogram .SampleSum
6570 }
6671 prevCount := 0.0
72+ m .prevMetrics [name ] = value
73+
6774 if prevValue != nil {
6875 if prevValue .Histogram .SampleCount != nil {
6976 prevCount = float64 (* prevValue .Histogram .SampleCount )
@@ -73,22 +80,29 @@ func (m *BlockMetrics) UpdatePrometheusMetric(name string, value *io_prometheus_
7380 if value .Histogram .SampleCount != nil {
7481 count = float64 (* value .Histogram .SampleCount )
7582 }
76- if count == 0 {
77- count = 1
83+ deltaCount := count - prevCount
84+ if deltaCount != 0 {
85+ averageChange := (sum - prevSum ) / deltaCount
86+
87+ if ! math .IsNaN (averageChange ) {
88+ m .ExecutionMetrics [name ] = averageChange
89+ }
7890 }
79- averageChange := (sum - prevSum ) / (count - prevCount )
80- m .ExecutionMetrics [name ] = value
81- m .ExecutionMetrics [avgName ] = averageChange
8291 } else if value .Gauge != nil {
83- m .ExecutionMetrics [name ] = * value .Gauge .Value
92+ if value .Gauge .Value != nil && ! math .IsNaN (* value .Gauge .Value ) {
93+ m .ExecutionMetrics [name ] = * value .Gauge .Value
94+ }
95+ // NaN values and nil values are silently omitted
8496 } else if value .Counter != nil {
85- m .ExecutionMetrics [name ] = * value .Counter .Value
97+ if value .Counter .Value != nil && ! math .IsNaN (* value .Counter .Value ) {
98+ m .ExecutionMetrics [name ] = * value .Counter .Value
99+ }
100+ // NaN values and nil values are silently omitted
86101 } else if value .Summary != nil {
87- avgName := name + "_avg"
88102 // get the average change in sum divided by the average change in count
89103 prevSum := 0.0
90104
91- prevValue , ok := m .ExecutionMetrics [name ].( * io_prometheus_client. Metric )
105+ prevValue , ok := m .prevMetrics [name ]
92106 if ! ok {
93107 prevValue = nil
94108 }
@@ -111,12 +125,15 @@ func (m *BlockMetrics) UpdatePrometheusMetric(name string, value *io_prometheus_
111125 if value .Summary .SampleCount != nil {
112126 count = float64 (* value .Summary .SampleCount )
113127 }
114- if count == 0 {
115- count = 1
128+ denom := count - prevCount
129+ m .prevMetrics [name ] = value
130+ if denom != 0 {
131+ averageChange := (sum - prevSum ) / denom
132+ if ! math .IsNaN (averageChange ) {
133+ m .ExecutionMetrics [name ] = averageChange
134+ }
116135 }
117- averageChange := (sum - prevSum ) / (count - prevCount )
118- m .ExecutionMetrics [name ] = value
119- m .ExecutionMetrics [avgName ] = averageChange
136+
120137 } else {
121138 return fmt .Errorf ("invalid metric type for %s: %#v" , name , value )
122139 }
0 commit comments