diff --git a/opentelemetry-exporter-geneva/geneva-uploader/Cargo.toml b/opentelemetry-exporter-geneva/geneva-uploader/Cargo.toml index 57411d1a..36627df5 100644 --- a/opentelemetry-exporter-geneva/geneva-uploader/Cargo.toml +++ b/opentelemetry-exporter-geneva/geneva-uploader/Cargo.toml @@ -32,6 +32,8 @@ wiremock = "0.6" futures = "0.3" num_cpus = "1.16" lz4_flex = { version = "0.11" } +criterion = {version = "0.6"} +rand = {version = "0.9"} [lints] workspace = true \ No newline at end of file diff --git a/opentelemetry-exporter-geneva/geneva-uploader/src/bench.rs b/opentelemetry-exporter-geneva/geneva-uploader/src/bench.rs new file mode 100644 index 00000000..a07a3333 --- /dev/null +++ b/opentelemetry-exporter-geneva/geneva-uploader/src/bench.rs @@ -0,0 +1,46 @@ +#[cfg(test)] +mod benchmarks { + use crate::payload_encoder::lz4_chunked_compression::lz4_chunked_compression; + use criterion::{BenchmarkId, Criterion, Throughput}; + use rand::{rngs::StdRng, Rng, SeedableRng}; + use std::hint::black_box; + + fn setup_test_data(size: usize) -> Vec { + let mut data = vec![0u8; size]; + let mut rng = StdRng::seed_from_u64(42); + rng.fill(&mut data[..]); + data + } + + /* + - Criterion benchmarks (lz4_chunked_compression, lz4_flex backend): + + | Input size | Median time | Throughput | + |-------------|--------------------|--------------------| + | 1 byte | ~533 ns | ~1.6 MiB/s | + | 1 KiB | ~597 ns | ~1.5 GiB/s | + | 1 MiB | ~42 us | ~22.1 GiB/s | + - No significant regressions or improvements detected. + - Machine: Apple M4 Pro, 24 GB, Total Number of Cores: 14 (10 performance and 4 efficiency) + */ + #[test] + #[ignore = "benchmark on crate private, ignored by default during normal test runs"] + /// To run: $cargo test --release lz4_benchmark -- --nocapture --ignored + fn lz4_benchmark() { + let mut criterion = Criterion::default(); + + let mut group = criterion.benchmark_group("lz4_compression"); + + for size in [1, 1024, 1024 * 1024] { + let data = setup_test_data(size); + + group.throughput(Throughput::Bytes(size as u64)); + group.bench_with_input(BenchmarkId::new("lz4_flex", size), &data, |b, data| { + b.iter(|| black_box(lz4_chunked_compression(data).unwrap())); + }); + } + + group.finish(); + criterion.final_summary(); + } +} diff --git a/opentelemetry-exporter-geneva/geneva-uploader/src/lib.rs b/opentelemetry-exporter-geneva/geneva-uploader/src/lib.rs index 8a853c05..c5cf70fa 100644 --- a/opentelemetry-exporter-geneva/geneva-uploader/src/lib.rs +++ b/opentelemetry-exporter-geneva/geneva-uploader/src/lib.rs @@ -1,9 +1,12 @@ mod config_service; pub mod ingestion_service; -mod payload_encoder; +pub(crate) mod payload_encoder; mod uploader; +#[cfg(test)] +mod bench; + #[allow(unused_imports)] pub(crate) use config_service::client::{ AuthMethod, GenevaConfigClient, GenevaConfigClientConfig, GenevaConfigClientError, diff --git a/opentelemetry-exporter-geneva/geneva-uploader/src/payload_encoder/lz4_chunked_compression.rs b/opentelemetry-exporter-geneva/geneva-uploader/src/payload_encoder/lz4_chunked_compression.rs index 2b4d5630..aa860c4d 100644 --- a/opentelemetry-exporter-geneva/geneva-uploader/src/payload_encoder/lz4_chunked_compression.rs +++ b/opentelemetry-exporter-geneva/geneva-uploader/src/payload_encoder/lz4_chunked_compression.rs @@ -39,7 +39,13 @@ use lz4_flex::block::{compress_into, get_maximum_output_size}; pub(crate) fn lz4_chunked_compression( input: &[u8], ) -> Result, lz4_flex::block::CompressError> { - const CHUNK_SIZE: usize = 64 * 1024; + lz4_chunked_compression_custom::<{ 64 * 1024 }>(input) +} + +#[allow(dead_code)] +pub(crate) fn lz4_chunked_compression_custom( + input: &[u8], +) -> Result, lz4_flex::block::CompressError> { let max_chunk_compressed = get_maximum_output_size(CHUNK_SIZE); // Pre-allocate an output buffer large enough for the worst-case total output size: diff --git a/opentelemetry-exporter-geneva/geneva-uploader/src/payload_encoder/mod.rs b/opentelemetry-exporter-geneva/geneva-uploader/src/payload_encoder/mod.rs index 84ee9d81..3aae0dd6 100644 --- a/opentelemetry-exporter-geneva/geneva-uploader/src/payload_encoder/mod.rs +++ b/opentelemetry-exporter-geneva/geneva-uploader/src/payload_encoder/mod.rs @@ -1 +1 @@ -mod lz4_chunked_compression; +pub(crate) mod lz4_chunked_compression;