Skip to content
This repository was archived by the owner on Jul 11, 2021. It is now read-only.

Commit ae8e966

Browse files
committed
add REDISQL.STATISTICS function
1 parent 90b87b5 commit ae8e966

File tree

3 files changed

+173
-2
lines changed

3 files changed

+173
-2
lines changed

redisql_lib/src/statistics.rs

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,4 +196,133 @@ impl Statistics {
196196
pub fn copy_err(&self) {
197197
STATISTICS.copy_err.fetch_add(1, Ordering::Relaxed);
198198
}
199+
pub fn values(&self) -> Vec<(&'static str, usize)> {
200+
let mut stats: Vec<(&'static str, usize)> = Vec::new();
201+
stats.push((
202+
"CREATE_DB",
203+
self.create_db.load(Ordering::Relaxed),
204+
));
205+
stats.push((
206+
"CREATE_DB OK",
207+
self.create_db_ok.load(Ordering::Relaxed),
208+
));
209+
stats.push((
210+
"CREATE_DB ERR",
211+
self.create_db_err.load(Ordering::Relaxed),
212+
));
213+
stats.push(("EXEC", self.exec.load(Ordering::Relaxed)));
214+
stats.push(("EXEC OK", self.exec_ok.load(Ordering::Relaxed)));
215+
stats.push((
216+
"EXEC ERR",
217+
self.exec_err.load(Ordering::Relaxed),
218+
));
219+
220+
stats.push(("QUERY", self.query.load(Ordering::Relaxed)));
221+
stats.push((
222+
"QUERY OK",
223+
self.query_ok.load(Ordering::Relaxed),
224+
));
225+
stats.push((
226+
"QUERY ERR",
227+
self.query_err.load(Ordering::Relaxed),
228+
));
229+
stats.push((
230+
"QUERY.INTO",
231+
self.query_into.load(Ordering::Relaxed),
232+
));
233+
stats.push((
234+
"QUERY.INTO OK",
235+
self.query_into_ok.load(Ordering::Relaxed),
236+
));
237+
stats.push((
238+
"QUERY.INTO ERR",
239+
self.query_into_err.load(Ordering::Relaxed),
240+
));
241+
stats.push((
242+
"CREATE_STATEMENT",
243+
self.create_statement.load(Ordering::Relaxed),
244+
));
245+
stats.push((
246+
"CREATE_STATEMENT OK",
247+
self.create_statement_ok.load(Ordering::Relaxed),
248+
));
249+
stats.push((
250+
"CREATE_STATEMENT ERR",
251+
self.create_statement_err.load(Ordering::Relaxed),
252+
));
253+
254+
stats.push((
255+
"EXEC_STATEMENT",
256+
self.exec_statement.load(Ordering::Relaxed),
257+
));
258+
stats.push((
259+
"EXEC_STATEMENT OK",
260+
self.exec_statement_ok.load(Ordering::Relaxed),
261+
));
262+
stats.push((
263+
"EXEC_STATEMENT ERR",
264+
self.exec_statement_err.load(Ordering::Relaxed),
265+
));
266+
267+
stats.push((
268+
"UPDATE_STATEMENT",
269+
self.update_statement.load(Ordering::Relaxed),
270+
));
271+
stats.push((
272+
"UPDATE_STATEMENT OK",
273+
self.update_statement_ok.load(Ordering::Relaxed),
274+
));
275+
stats.push((
276+
"UPDATE_STATEMENT ERR",
277+
self.update_statement_err.load(Ordering::Relaxed),
278+
));
279+
280+
stats.push((
281+
"DELETE_STATEMENT",
282+
self.delete_statement.load(Ordering::Relaxed),
283+
));
284+
stats.push((
285+
"DELETE_STATEMENT OK",
286+
self.delete_statement_ok.load(Ordering::Relaxed),
287+
));
288+
stats.push((
289+
"DELETE_STATEMENT ERR",
290+
self.delete_statement_err.load(Ordering::Relaxed),
291+
));
292+
293+
stats.push((
294+
"QUERY_STATEMENT",
295+
self.query_statement.load(Ordering::Relaxed),
296+
));
297+
stats.push((
298+
"QUERY_STATEMENT OK",
299+
self.query_statement_ok.load(Ordering::Relaxed),
300+
));
301+
stats.push((
302+
"QUERY_STATEMENT ERR",
303+
self.query_statement_err.load(Ordering::Relaxed),
304+
));
305+
306+
stats.push((
307+
"QUERY_STATEMENT.INTO",
308+
self.query_statement_into.load(Ordering::Relaxed),
309+
));
310+
stats.push((
311+
"QUERY_STATEMENT.INTO OK",
312+
self.query_statement_into_ok.load(Ordering::Relaxed),
313+
));
314+
stats.push((
315+
"QUERY_STATEMENT.INTO ERR",
316+
self.query_statement_into_err.load(Ordering::Relaxed),
317+
));
318+
319+
stats.push(("COPY", self.copy.load(Ordering::Relaxed)));
320+
stats.push(("COPY OK", self.copy_ok.load(Ordering::Relaxed)));
321+
stats.push((
322+
"COPY ERR",
323+
self.copy_err.load(Ordering::Relaxed),
324+
));
325+
326+
return stats;
327+
}
199328
}

src/commands.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::ffi::{CStr, CString};
2+
use std::os::raw::c_long;
23
use std::sync::mpsc::channel;
34
use std::thread;
45

@@ -802,6 +803,7 @@ pub extern "C" fn CreateDB(
802803
r::rm::ffi::REDISMODULE_OK => {
803804
let ok =
804805
r::QueryResult::OK {};
806+
STATISTICS.create_db_ok();
805807
ReplicateVerbatim(&context);
806808
ok.reply(&context)
807809
}
@@ -969,3 +971,33 @@ pub extern "C" fn MakeCopy(
969971
Err(_) => r::rm::ffi::REDISMODULE_OK,
970972
}
971973
}
974+
975+
#[allow(non_snake_case)]
976+
pub extern "C" fn GetStatistics(
977+
ctx: *mut r::rm::ffi::RedisModuleCtx,
978+
argv: *mut *mut r::rm::ffi::RedisModuleString,
979+
argc: ::std::os::raw::c_int,
980+
) -> i32 {
981+
let (context, _argvector) = r::create_argument(ctx, argv, argc);
982+
let data = STATISTICS.values();
983+
984+
let len = data.len() as c_long;
985+
unsafe {
986+
r::rm::ffi::RedisModule_ReplyWithArray.unwrap()(
987+
context.as_ptr(),
988+
len,
989+
);
990+
}
991+
for statics in data {
992+
unsafe {
993+
r::rm::ffi::RedisModule_ReplyWithArray.unwrap()(
994+
context.as_ptr(),
995+
2,
996+
);
997+
}
998+
r::rm::ReplyWithStringBuffer(&context, statics.0.as_bytes());
999+
r::rm::ReplyWithLongLong(&context, statics.1 as i64);
1000+
}
1001+
1002+
r::rm::ffi::REDISMODULE_OK
1003+
}

src/lib.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ use engine_pro::{register, WriteAOF};
3434

3535
use commands::{
3636
CreateDB, CreateStatement, DeleteStatement, Exec, ExecStatement,
37-
MakeCopy, Query, QueryInto, QueryStatement, QueryStatementInto,
38-
UpdateStatement,
37+
GetStatistics, MakeCopy, Query, QueryInto, QueryStatement,
38+
QueryStatementInto, UpdateStatement,
3939
};
4040

4141
unsafe extern "C" fn rdb_save(
@@ -311,6 +311,16 @@ pub extern "C" fn RedisModule_OnLoad(
311311
Err(e) => return e,
312312
}
313313

314+
match register_function(
315+
&ctx,
316+
"REDISQL.STATISTICS",
317+
"readonly",
318+
GetStatistics,
319+
) {
320+
Ok(()) => (),
321+
Err(e) => return e,
322+
}
323+
314324
#[cfg(feature = "pro")]
315325
match register(ctx) {
316326
Ok(()) => (),

0 commit comments

Comments
 (0)