Skip to content

Commit

Permalink
Use cimetrics-rs
Browse files Browse the repository at this point in the history
  • Loading branch information
JonathanWoollett-Light committed Apr 13, 2024
1 parent b2247bc commit 640b0ce
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 145 deletions.
63 changes: 7 additions & 56 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ edition = "2021"
[dependencies]

[dev-dependencies]
serde = "1.0.195"
rand = "0.8.5"
rand = "0.8.5"
cimetrics-rs = "0.1.0"
44 changes: 22 additions & 22 deletions metrics.csv
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
constant,1
inconsistent_constant,2
inconsistent_random,0
random_many_five,41340
random_many_four,22238
random_many_one,46205
random_many_seven,14263
random_many_six,55351
random_many_three,47000
random_many_two,44152
random_one,165
random_two,23786
random_u16_one,33072
random_u16_three,20772
random_u16_two,46266
random_u32_one,172148772
random_u32_three,846543351
random_u32_two,2924622195
random_u8_one,74
random_u8_three,23
random_u8_two,160
standard_one,847951
standard_three,613723
standard_two,319561
inconsistent_random,90
random_many_five,52398
random_many_four,18135
random_many_one,13248
random_many_seven,32553
random_many_six,50113
random_many_three,19787
random_many_two,38536
random_one,7
random_two,3017
random_u16_one,7831
random_u16_three,20177
random_u16_two,59389
random_u32_one,442696873
random_u32_three,2742354946
random_u32_two,1572729518
random_u8_one,245
random_u8_three,93
random_u8_two,163
standard_one,682996
standard_three,933753
standard_two,8863
71 changes: 6 additions & 65 deletions tests/integration_tests.rs
Original file line number Diff line number Diff line change
@@ -1,91 +1,32 @@
use rand::distributions::{Distribution, Standard};
use rand::thread_rng;
use rand::Rng;
use std::collections::BTreeMap;
use std::io::Write;
use std::sync::Mutex;
use std::sync::OnceLock;

static METRICS: Metrics = Metrics::new();

struct Metrics(OnceLock<MetricsInner>);

/// Use a `BTreeMap` over a `HashMap` so metrics are output in a consistent order and give a useful
/// diff when commited.
struct MetricsInner(Mutex<(u64, BTreeMap<&'static str, u64>)>);

struct MetricsHandle<'a>(&'a MetricsInner);

impl Metrics {
pub const fn new() -> Self {
Self(OnceLock::new())
}
fn handle(&self) -> MetricsHandle<'_> {
let metrics = self
.0
.get_or_init(|| MetricsInner(Mutex::new((0, BTreeMap::new()))));
let mut guard = metrics.0.lock().unwrap();
let (count, _map) = &mut *guard;
*count += 1;

MetricsHandle(metrics)
}
}
impl MetricsHandle<'_> {
fn add(&self, name: &'static str, value: u64) {
let mut guard = self.0 .0.lock().unwrap();
let (_count, map) = &mut *guard;
map.insert(name, value);
}
}
impl Drop for MetricsHandle<'_> {
fn drop(&mut self) {
use std::fmt::Write;

let mut guard = self.0 .0.lock().unwrap();
let (count, map) = &mut *guard;
*count -= 1;
if *count == 0 {
let mut file = std::fs::OpenOptions::new()
.create(true)
.truncate(true)
.write(true)
.open("metrics.csv")
.unwrap();
let csv = map.iter_mut().fold(String::new(), |mut acc, (k, v)| {
writeln!(acc, "{k},{v}").unwrap();
acc
});
file.write_all(csv.as_bytes()).unwrap();
}
}
}

// Upload 1.
#[test]
fn constant() {
let handle = METRICS.handle();
let handle = cimetrics_rs::handle();
handle.add("constant", 1);
}

// Upload a random integer between 0 and 2^8.
#[test]
fn random_one() {
let handle = METRICS.handle();
let handle = cimetrics_rs::handle();
handle.add("random_one", rand::thread_rng().gen::<u8>() as u64);
}

// Upload a random integer between 0 and 2^16.
#[test]
fn random_two() {
let handle = METRICS.handle();
let handle = cimetrics_rs::handle();
handle.add("random_two", rand::thread_rng().gen::<u16>() as u64);
}

// 1/4 of the time doesn't upload metrics.
#[test]
fn inconsistent() {
let handle = METRICS.handle();
let handle = cimetrics_rs::handle();
if rand::thread_rng().gen::<u8>() > (u8::MAX / 4) {
handle.add("inconsistent_constant", 2);
handle.add("inconsistent_random", rand::thread_rng().gen::<u8>() as u64);
Expand All @@ -94,7 +35,7 @@ fn inconsistent() {

#[test]
fn many() {
let handle = METRICS.handle();
let handle = cimetrics_rs::handle();
let mut rng = rand::thread_rng();
handle.add("random_u8_one", rng.gen::<u8>() as u64);
handle.add("random_u8_two", rng.gen::<u8>() as u64);
Expand All @@ -117,7 +58,7 @@ fn many() {

#[test]
fn standard_distribution() {
let handle = METRICS.handle();
let handle = cimetrics_rs::handle();
let mut rng = thread_rng();
let mut iter = Standard
.sample_iter(&mut rng)
Expand Down

0 comments on commit 640b0ce

Please sign in to comment.