@@ -12,6 +12,7 @@ use crate::{get_config, Error, OgmiosPort, State};
12
12
#[ derive( Clone ) ]
13
13
pub struct Metrics {
14
14
pub dcu : IntCounterVec ,
15
+ pub usage : IntCounterVec ,
15
16
pub reconcile_failures : IntCounterVec ,
16
17
pub metrics_failures : IntCounterVec ,
17
18
}
@@ -24,6 +25,12 @@ impl Default for Metrics {
24
25
)
25
26
. unwrap ( ) ;
26
27
28
+ let usage = IntCounterVec :: new (
29
+ opts ! ( "usage" , "Feature usage" , ) ,
30
+ & [ "feature" , "project" , "resource_name" , "tier" ] ,
31
+ )
32
+ . unwrap ( ) ;
33
+
27
34
let reconcile_failures = IntCounterVec :: new (
28
35
opts ! (
29
36
"ogmios_operator_reconciliation_errors_total" ,
@@ -44,6 +51,7 @@ impl Default for Metrics {
44
51
45
52
Metrics {
46
53
reconcile_failures,
54
+ usage,
47
55
dcu,
48
56
metrics_failures,
49
57
}
@@ -55,6 +63,7 @@ impl Metrics {
55
63
registry. register ( Box :: new ( self . dcu . clone ( ) ) ) ?;
56
64
registry. register ( Box :: new ( self . metrics_failures . clone ( ) ) ) ?;
57
65
registry. register ( Box :: new ( self . reconcile_failures . clone ( ) ) ) ?;
66
+ registry. register ( Box :: new ( self . usage . clone ( ) ) ) ?;
58
67
59
68
Ok ( self )
60
69
}
@@ -82,6 +91,15 @@ impl Metrics {
82
91
. with_label_values ( & [ project, & service, & service_type, tenancy] )
83
92
. inc_by ( dcu) ;
84
93
}
94
+
95
+ pub fn count_usage ( & self , project : & str , resource_name : & str , tier : & str , value : f64 ) {
96
+ let feature = & OgmiosPort :: kind ( & ( ) ) ;
97
+ let value: u64 = value. ceil ( ) as u64 ;
98
+
99
+ self . usage
100
+ . with_label_values ( & [ feature, project, resource_name, tier] )
101
+ . inc_by ( value) ;
102
+ }
85
103
}
86
104
87
105
#[ instrument( "metrics collector run" , skip_all) ]
@@ -91,7 +109,7 @@ pub async fn run_metrics_collector(state: Arc<State>) {
91
109
92
110
let config = get_config ( ) ;
93
111
let client = reqwest:: Client :: builder ( ) . build ( ) . unwrap ( ) ;
94
- let project_regex = Regex :: new ( r"prj-(.+)\..+ " ) . unwrap ( ) ;
112
+ let project_regex = Regex :: new ( r"prj-(.+)\.(.+)$ " ) . unwrap ( ) ;
95
113
let network_regex = Regex :: new ( r"([\w-]+)-.+" ) . unwrap ( ) ;
96
114
let mut last_execution = Utc :: now ( ) ;
97
115
@@ -104,7 +122,7 @@ pub async fn run_metrics_collector(state: Arc<State>) {
104
122
last_execution = end;
105
123
106
124
let query = format ! (
107
- "sum by (consumer, route) (increase(ogmios_proxy_ws_total_frame[{start}s] @ {}))" ,
125
+ "sum by (consumer, route, tier ) (increase(ogmios_proxy_ws_total_frame[{start}s] @ {}))" ,
108
126
end. timestamp_millis( ) / 1000
109
127
) ;
110
128
@@ -148,6 +166,7 @@ pub async fn run_metrics_collector(state: Arc<State>) {
148
166
}
149
167
let project_captures = project_captures. unwrap ( ) ;
150
168
let project = project_captures. get ( 1 ) . unwrap ( ) . as_str ( ) ;
169
+ let resource_name = project_captures. get ( 2 ) . unwrap ( ) . as_str ( ) ;
151
170
152
171
let route = result. metric . route . unwrap ( ) ;
153
172
let network_captures = network_regex. captures ( & route) ;
@@ -171,6 +190,12 @@ pub async fn run_metrics_collector(state: Arc<State>) {
171
190
172
191
let dcu = result. value * dcu_per_frame;
173
192
state. metrics . count_dcu_consumed ( project, network, dcu) ;
193
+
194
+ if let Some ( tier) = result. metric . tier {
195
+ state
196
+ . metrics
197
+ . count_usage ( project, resource_name, & tier, result. value ) ;
198
+ }
174
199
}
175
200
}
176
201
} ) ;
@@ -180,6 +205,7 @@ pub async fn run_metrics_collector(state: Arc<State>) {
180
205
struct PrometheusDataResultMetric {
181
206
consumer : Option < String > ,
182
207
route : Option < String > ,
208
+ tier : Option < String > ,
183
209
}
184
210
185
211
#[ derive( Debug , Deserialize ) ]
0 commit comments