1
1
use chrono:: Utc ;
2
- use kube:: { api:: ListParams , Api , Client , Resource , ResourceExt } ;
2
+ use kube:: { api:: ListParams , core :: object :: HasSpec , Api , Client , Resource , ResourceExt } ;
3
3
use prometheus:: { opts, IntCounterVec , Registry } ;
4
4
use serde:: { Deserialize , Deserializer } ;
5
5
use std:: sync:: Arc ;
@@ -14,6 +14,7 @@ pub struct Metrics {
14
14
pub reconcile_failures : IntCounterVec ,
15
15
pub metrics_failures : IntCounterVec ,
16
16
pub dcu : IntCounterVec ,
17
+ pub usage : IntCounterVec ,
17
18
}
18
19
19
20
impl Default for Metrics {
@@ -60,12 +61,19 @@ impl Default for Metrics {
60
61
)
61
62
. unwrap ( ) ;
62
63
64
+ let usage = IntCounterVec :: new (
65
+ opts ! ( "usage" , "Feature usage" , ) ,
66
+ & [ "feature" , "project" , "resource_name" , "tier" ] ,
67
+ )
68
+ . unwrap ( ) ;
69
+
63
70
Metrics {
64
71
users_created,
65
72
users_dropped,
66
73
reconcile_failures,
67
74
metrics_failures,
68
75
dcu,
76
+ usage,
69
77
}
70
78
}
71
79
}
@@ -76,6 +84,7 @@ impl Metrics {
76
84
registry. register ( Box :: new ( self . users_created . clone ( ) ) ) ?;
77
85
registry. register ( Box :: new ( self . users_dropped . clone ( ) ) ) ?;
78
86
registry. register ( Box :: new ( self . dcu . clone ( ) ) ) ?;
87
+ registry. register ( Box :: new ( self . usage . clone ( ) ) ) ?;
79
88
Ok ( self )
80
89
}
81
90
@@ -105,18 +114,26 @@ impl Metrics {
105
114
. inc ( ) ;
106
115
}
107
116
108
- pub fn count_dcu_consumed ( & self , namespace : & str , network : & str , dcu : f64 ) {
109
- let project = get_project_id ( namespace) ;
117
+ pub fn count_dcu_consumed ( & self , project : & str , network : & str , dcu : f64 ) {
110
118
let service = format ! ( "{}-{}" , DbSyncPort :: kind( & ( ) ) , network) ;
111
119
let service_type = format ! ( "{}.{}" , DbSyncPort :: plural( & ( ) ) , DbSyncPort :: group( & ( ) ) ) ;
112
120
let tenancy = "proxy" ;
113
121
114
122
let dcu: u64 = dcu. ceil ( ) as u64 ;
115
123
116
124
self . dcu
117
- . with_label_values ( & [ & project, & service, & service_type, tenancy] )
125
+ . with_label_values ( & [ project, & service, & service_type, tenancy] )
118
126
. inc_by ( dcu) ;
119
127
}
128
+
129
+ pub fn count_usage ( & self , project : & str , resource_name : & str , tier : & str , value : f64 ) {
130
+ let feature = & DbSyncPort :: kind ( & ( ) ) ;
131
+ let value: u64 = value. ceil ( ) as u64 ;
132
+
133
+ self . usage
134
+ . with_label_values ( & [ feature, project, resource_name, tier] )
135
+ . inc_by ( value) ;
136
+ }
120
137
}
121
138
122
139
fn get_project_id ( namespace : & str ) -> String {
@@ -196,9 +213,21 @@ pub async fn run_metrics_collector(state: Arc<State>) {
196
213
let total_exec_time = result. value * ( interval as f64 ) ;
197
214
198
215
let dcu = total_exec_time * dcu_per_second;
216
+
217
+ let project = get_project_id ( & crd. namespace ( ) . unwrap ( ) ) ;
218
+
199
219
state
200
220
. metrics
201
- . count_dcu_consumed ( & crd. namespace ( ) . unwrap ( ) , & crd. spec . network , dcu) ;
221
+ . count_dcu_consumed ( & project, & crd. spec . network , dcu) ;
222
+ state. metrics . count_usage (
223
+ & project,
224
+ & crd. name_any ( ) ,
225
+ & crd. spec ( )
226
+ . throughput_tier
227
+ . clone ( )
228
+ . unwrap_or ( "0" . to_string ( ) ) ,
229
+ total_exec_time,
230
+ ) ;
202
231
}
203
232
}
204
233
} ) ;
0 commit comments