5
5
"encoding/json"
6
6
"fmt"
7
7
"maps"
8
+ "math"
8
9
"os"
9
10
"path"
10
11
"time"
@@ -20,12 +21,14 @@ type Collector interface {
20
21
type BlockMetrics struct {
21
22
BlockNumber uint64
22
23
Timestamp time.Time
24
+ prevMetrics map [string ]* io_prometheus_client.Metric
23
25
ExecutionMetrics map [string ]interface {}
24
26
}
25
27
26
28
func NewBlockMetrics () * BlockMetrics {
27
29
return & BlockMetrics {
28
30
BlockNumber : 0 ,
31
+ prevMetrics : make (map [string ]* io_prometheus_client.Metric ),
29
32
ExecutionMetrics : make (map [string ]interface {}),
30
33
Timestamp : time .Now (),
31
34
}
@@ -37,20 +40,22 @@ func (m *BlockMetrics) SetBlockNumber(blockNumber uint64) {
37
40
38
41
func (m * BlockMetrics ) Copy () * BlockMetrics {
39
42
newMetrics := make (map [string ]interface {})
43
+ newPrevMetrics := make (map [string ]* io_prometheus_client.Metric )
40
44
maps .Copy (newMetrics , m .ExecutionMetrics )
45
+ maps .Copy (newPrevMetrics , m .prevMetrics )
41
46
return & BlockMetrics {
42
47
BlockNumber : m .BlockNumber ,
48
+ prevMetrics : newPrevMetrics ,
43
49
ExecutionMetrics : newMetrics ,
44
50
Timestamp : m .Timestamp ,
45
51
}
46
52
}
47
53
48
54
func (m * BlockMetrics ) UpdatePrometheusMetric (name string , value * io_prometheus_client.Metric ) error {
49
55
if value .Histogram != nil {
50
- avgName := name + "_avg"
51
56
// get the average change in sum divided by the average change in count
52
57
prevSum := 0.0
53
- prevValue , ok := m .ExecutionMetrics [name ].( * io_prometheus_client. Metric )
58
+ prevValue , ok := m .prevMetrics [name ]
54
59
if ! ok {
55
60
prevValue = nil
56
61
}
@@ -64,6 +69,8 @@ func (m *BlockMetrics) UpdatePrometheusMetric(name string, value *io_prometheus_
64
69
sum = * value .Histogram .SampleSum
65
70
}
66
71
prevCount := 0.0
72
+ m .prevMetrics [name ] = value
73
+
67
74
if prevValue != nil {
68
75
if prevValue .Histogram .SampleCount != nil {
69
76
prevCount = float64 (* prevValue .Histogram .SampleCount )
@@ -73,22 +80,29 @@ func (m *BlockMetrics) UpdatePrometheusMetric(name string, value *io_prometheus_
73
80
if value .Histogram .SampleCount != nil {
74
81
count = float64 (* value .Histogram .SampleCount )
75
82
}
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
+ }
78
90
}
79
- averageChange := (sum - prevSum ) / (count - prevCount )
80
- m .ExecutionMetrics [name ] = value
81
- m .ExecutionMetrics [avgName ] = averageChange
82
91
} 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
84
96
} 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
86
101
} else if value .Summary != nil {
87
- avgName := name + "_avg"
88
102
// get the average change in sum divided by the average change in count
89
103
prevSum := 0.0
90
104
91
- prevValue , ok := m .ExecutionMetrics [name ].( * io_prometheus_client. Metric )
105
+ prevValue , ok := m .prevMetrics [name ]
92
106
if ! ok {
93
107
prevValue = nil
94
108
}
@@ -111,12 +125,15 @@ func (m *BlockMetrics) UpdatePrometheusMetric(name string, value *io_prometheus_
111
125
if value .Summary .SampleCount != nil {
112
126
count = float64 (* value .Summary .SampleCount )
113
127
}
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
+ }
116
135
}
117
- averageChange := (sum - prevSum ) / (count - prevCount )
118
- m .ExecutionMetrics [name ] = value
119
- m .ExecutionMetrics [avgName ] = averageChange
136
+
120
137
} else {
121
138
return fmt .Errorf ("invalid metric type for %s: %#v" , name , value )
122
139
}
0 commit comments