@@ -3,8 +3,10 @@ use std::time::Duration;
3
3
use async_trait:: async_trait;
4
4
use fuel_web_utils:: { api_key:: ApiKeyId , telemetry:: metrics:: TelemetryMetrics } ;
5
5
use prometheus:: {
6
+ register_gauge,
6
7
register_histogram_vec,
7
8
register_int_counter_vec,
9
+ Gauge ,
8
10
HistogramVec ,
9
11
IntCounterVec ,
10
12
Registry ,
@@ -15,6 +17,7 @@ pub struct Metrics {
15
17
pub registry : Registry ,
16
18
pub db_queries_error_rates : IntCounterVec ,
17
19
pub connection_duration : HistogramVec ,
20
+ pub latest_block_height : Gauge ,
18
21
}
19
22
20
23
impl Default for Metrics {
@@ -60,6 +63,12 @@ impl Metrics {
60
63
)
61
64
. expect ( "metric must be created" ) ;
62
65
66
+ let latest_block_height = register_gauge ! (
67
+ format!( "{}api_latest_block_height" , metric_prefix) ,
68
+ "The latest block height in the database"
69
+ )
70
+ . expect ( "metric must be created" ) ;
71
+
63
72
let registry =
64
73
Registry :: new_custom ( prefix, None ) . expect ( "registry to be created" ) ;
65
74
registry. register ( Box :: new ( db_queries_error_rates. clone ( ) ) ) ?;
@@ -69,6 +78,7 @@ impl Metrics {
69
78
registry,
70
79
db_queries_error_rates,
71
80
connection_duration,
81
+ latest_block_height,
72
82
} )
73
83
}
74
84
@@ -88,6 +98,10 @@ impl Metrics {
88
98
. with_label_values ( & [ & user_id. to_string ( ) , user_name] )
89
99
. observe ( duration. as_secs_f64 ( ) ) ;
90
100
}
101
+
102
+ pub fn update_latest_block_height ( & self , height : u32 ) {
103
+ self . latest_block_height . set ( height as f64 ) ;
104
+ }
91
105
}
92
106
93
107
#[ cfg( test) ]
@@ -124,4 +138,21 @@ mod tests {
124
138
assert ! ( output. contains( "timeout" ) ) ;
125
139
assert ! ( output. contains( "1" ) ) ;
126
140
}
141
+
142
+ #[ test]
143
+ fn test_latest_block_height_metric ( ) {
144
+ let metrics = Metrics :: random ( ) ;
145
+
146
+ metrics. update_latest_block_height ( 123 ) ;
147
+
148
+ let metric_families = gather ( ) ;
149
+ let mut buffer = Vec :: new ( ) ;
150
+ let encoder = TextEncoder :: new ( ) ;
151
+ encoder. encode ( & metric_families, & mut buffer) . unwrap ( ) ;
152
+
153
+ let output = String :: from_utf8 ( buffer. clone ( ) ) . unwrap ( ) ;
154
+
155
+ assert ! ( output. contains( "api_latest_block_height" ) ) ;
156
+ assert ! ( output. contains( "123" ) ) ;
157
+ }
127
158
}
0 commit comments