diff --git a/opentelemetry-sdk/CHANGELOG.md b/opentelemetry-sdk/CHANGELOG.md index ac35ff1695..00c3d3495a 100644 --- a/opentelemetry-sdk/CHANGELOG.md +++ b/opentelemetry-sdk/CHANGELOG.md @@ -2,6 +2,7 @@ ## vNext +- Implement function to set cardinality limits for metrics streams using `set_stream_cardinality_limit` function. - Add "metrics", "logs" to default features. With this, default feature list is "trace", "metrics" and "logs". - Add `with_resource` on Builder for LoggerProvider, replacing the `with_config` diff --git a/opentelemetry-sdk/src/metrics/internal/aggregate.rs b/opentelemetry-sdk/src/metrics/internal/aggregate.rs index 93fcc6a69c..d7bf4f0e7d 100644 --- a/opentelemetry-sdk/src/metrics/internal/aggregate.rs +++ b/opentelemetry-sdk/src/metrics/internal/aggregate.rs @@ -1,4 +1,4 @@ -use std::{marker, sync::Arc}; +use std::{marker, sync::atomic::AtomicU64, sync::Arc}; use once_cell::sync::Lazy; use opentelemetry::KeyValue; @@ -16,7 +16,7 @@ use super::{ Number, }; -const STREAM_CARDINALITY_LIMIT: u32 = 2000; +static STREAM_CARDINALITY_LIMIT: AtomicU64 = AtomicU64::new(2000); pub(crate) static STREAM_OVERFLOW_ATTRIBUTE_SET: Lazy = Lazy::new(|| { let key_values: [KeyValue; 1] = [KeyValue::new("otel.metric.overflow", "true")]; AttributeSet::from(&key_values[..]) @@ -24,7 +24,12 @@ pub(crate) static STREAM_OVERFLOW_ATTRIBUTE_SET: Lazy = Lazy::new( /// Checks whether aggregator has hit cardinality limit for metric streams pub(crate) fn is_under_cardinality_limit(size: usize) -> bool { - size < STREAM_CARDINALITY_LIMIT as usize + size < STREAM_CARDINALITY_LIMIT.load(std::sync::atomic::Ordering::Relaxed) as usize +} + +/// Set cardinality limit for metric streams +pub fn set_stream_cardinality_limit(size: u64) { + STREAM_CARDINALITY_LIMIT.store(size, std::sync::atomic::Ordering::Relaxed) } /// Receives measurements to be aggregated. diff --git a/opentelemetry-sdk/src/metrics/internal/mod.rs b/opentelemetry-sdk/src/metrics/internal/mod.rs index 92bc3d947f..1dd066a9e7 100644 --- a/opentelemetry-sdk/src/metrics/internal/mod.rs +++ b/opentelemetry-sdk/src/metrics/internal/mod.rs @@ -9,6 +9,8 @@ use std::ops::{Add, AddAssign, Sub}; use std::sync::atomic::{AtomicI64, AtomicU64, Ordering}; use std::sync::Mutex; +pub use aggregate::set_stream_cardinality_limit; + pub(crate) use aggregate::{AggregateBuilder, ComputeAggregation, Measure}; pub(crate) use exponential_histogram::{EXPO_MAX_SCALE, EXPO_MIN_SCALE}; diff --git a/opentelemetry-sdk/src/metrics/mod.rs b/opentelemetry-sdk/src/metrics/mod.rs index 2c6b709fef..9c8563ad2e 100644 --- a/opentelemetry-sdk/src/metrics/mod.rs +++ b/opentelemetry-sdk/src/metrics/mod.rs @@ -54,6 +54,7 @@ pub(crate) mod view; pub use aggregation::*; pub use instrument::*; +pub use internal::set_stream_cardinality_limit; pub use manual_reader::*; pub use meter::*; pub use meter_provider::*;