@@ -23,7 +23,7 @@ use crate::{InMemoryBufferable, config::MemoryBufferSize};
2323/// The alpha value for the Exponentially Weighted Moving Average (EWMA) calculation. This is a
2424/// measure of how much weight to give to the current value versus the previous values. A value of
2525/// 0.9 results in a "half life" of 6-7 measurements.
26- const EWMA_ALPHA : f64 = 0.9 ;
26+ pub const DEFAULT_EWMA_ALPHA : f64 = 0.9 ;
2727
2828/// Error returned by `LimitedSender::send` when the receiver has disconnected.
2929#[ derive( Debug , PartialEq , Eq ) ]
@@ -127,7 +127,11 @@ struct Metrics {
127127
128128impl Metrics {
129129 #[ expect( clippy:: cast_precision_loss) ] // We have to convert buffer sizes for a gauge, it's okay to lose precision here.
130- fn new ( limit : MemoryBufferSize , metadata : ChannelMetricMetadata ) -> Self {
130+ fn new (
131+ limit : MemoryBufferSize ,
132+ metadata : ChannelMetricMetadata ,
133+ ewma_alpha : Option < f64 > ,
134+ ) -> Self {
131135 let ChannelMetricMetadata { prefix, output } = metadata;
132136 let ( gauge_suffix, max_value) = match limit {
133137 MemoryBufferSize :: MaxEvents ( max_events) => ( "_max_event_size" , max_events. get ( ) as f64 ) ,
@@ -137,7 +141,7 @@ impl Metrics {
137141 let histogram_name = format ! ( "{prefix}_utilization" ) ;
138142 let gauge_name = format ! ( "{prefix}_utilization_level" ) ;
139143 let mean_name = format ! ( "{prefix}_utilization_mean" ) ;
140- let ewma = Arc :: new ( AtomicEwma :: new ( EWMA_ALPHA ) ) ;
144+ let ewma = Arc :: new ( AtomicEwma :: new ( ewma_alpha . unwrap_or ( DEFAULT_EWMA_ALPHA ) ) ) ;
141145 #[ cfg( test) ]
142146 let recorded_values = Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ;
143147 if let Some ( label_value) = output {
@@ -202,9 +206,13 @@ impl<T> Clone for Inner<T> {
202206}
203207
204208impl < T : InMemoryBufferable > Inner < T > {
205- fn new ( limit : MemoryBufferSize , metric_metadata : Option < ChannelMetricMetadata > ) -> Self {
209+ fn new (
210+ limit : MemoryBufferSize ,
211+ metric_metadata : Option < ChannelMetricMetadata > ,
212+ ewma_alpha : Option < f64 > ,
213+ ) -> Self {
206214 let read_waker = Arc :: new ( Notify :: new ( ) ) ;
207- let metrics = metric_metadata. map ( |metadata| Metrics :: new ( limit, metadata) ) ;
215+ let metrics = metric_metadata. map ( |metadata| Metrics :: new ( limit, metadata, ewma_alpha ) ) ;
208216 match limit {
209217 MemoryBufferSize :: MaxEvents ( max_events) => Inner {
210218 data : Arc :: new ( ArrayQueue :: new ( max_events. get ( ) ) ) ,
@@ -397,8 +405,9 @@ impl<T> Drop for LimitedReceiver<T> {
397405pub fn limited < T : InMemoryBufferable + fmt:: Debug > (
398406 limit : MemoryBufferSize ,
399407 metric_metadata : Option < ChannelMetricMetadata > ,
408+ ewma_alpha : Option < f64 > ,
400409) -> ( LimitedSender < T > , LimitedReceiver < T > ) {
401- let inner = Inner :: new ( limit, metric_metadata) ;
410+ let inner = Inner :: new ( limit, metric_metadata, ewma_alpha ) ;
402411
403412 let sender = LimitedSender {
404413 inner : inner. clone ( ) ,
@@ -426,7 +435,7 @@ mod tests {
426435 #[ tokio:: test]
427436 async fn send_receive ( ) {
428437 let limit = MemoryBufferSize :: MaxEvents ( NonZeroUsize :: new ( 2 ) . unwrap ( ) ) ;
429- let ( mut tx, mut rx) = limited ( limit, None ) ;
438+ let ( mut tx, mut rx) = limited ( limit, None , None ) ;
430439
431440 assert_eq ! ( 2 , tx. available_capacity( ) ) ;
432441
@@ -458,6 +467,7 @@ mod tests {
458467 let ( mut tx, mut rx) = limited (
459468 limit,
460469 Some ( ChannelMetricMetadata :: new ( "test_channel" , None ) ) ,
470+ None ,
461471 ) ;
462472
463473 let metrics = tx. inner . metrics . as_ref ( ) . unwrap ( ) . recorded_values . clone ( ) ;
@@ -477,7 +487,7 @@ mod tests {
477487
478488 // With this configuration a maximum of exactly 10 messages can fit in the channel
479489 let limit = MemoryBufferSize :: MaxSize ( NonZeroUsize :: new ( max_allowed_bytes) . unwrap ( ) ) ;
480- let ( mut tx, mut rx) = limited ( limit, None ) ;
490+ let ( mut tx, mut rx) = limited ( limit, None , None ) ;
481491
482492 assert_eq ! ( max_allowed_bytes, tx. available_capacity( ) ) ;
483493
@@ -511,7 +521,7 @@ mod tests {
511521 #[ test]
512522 fn sender_waits_for_more_capacity_when_none_available ( ) {
513523 let limit = MemoryBufferSize :: MaxEvents ( NonZeroUsize :: new ( 1 ) . unwrap ( ) ) ;
514- let ( mut tx, mut rx) = limited ( limit, None ) ;
524+ let ( mut tx, mut rx) = limited ( limit, None , None ) ;
515525
516526 assert_eq ! ( 1 , tx. available_capacity( ) ) ;
517527
@@ -573,7 +583,7 @@ mod tests {
573583 #[ test]
574584 fn sender_waits_for_more_capacity_when_partial_available ( ) {
575585 let limit = MemoryBufferSize :: MaxEvents ( NonZeroUsize :: new ( 7 ) . unwrap ( ) ) ;
576- let ( mut tx, mut rx) = limited ( limit, None ) ;
586+ let ( mut tx, mut rx) = limited ( limit, None , None ) ;
577587
578588 assert_eq ! ( 7 , tx. available_capacity( ) ) ;
579589
@@ -662,7 +672,7 @@ mod tests {
662672 #[ test]
663673 fn empty_receiver_returns_none_when_last_sender_drops ( ) {
664674 let limit = MemoryBufferSize :: MaxEvents ( NonZeroUsize :: new ( 1 ) . unwrap ( ) ) ;
665- let ( mut tx, mut rx) = limited ( limit, None ) ;
675+ let ( mut tx, mut rx) = limited ( limit, None , None ) ;
666676
667677 assert_eq ! ( 1 , tx. available_capacity( ) ) ;
668678
@@ -705,7 +715,7 @@ mod tests {
705715 #[ test]
706716 fn receiver_returns_none_once_empty_when_last_sender_drops ( ) {
707717 let limit = MemoryBufferSize :: MaxEvents ( NonZeroUsize :: new ( 1 ) . unwrap ( ) ) ;
708- let ( tx, mut rx) = limited :: < Sample > ( limit, None ) ;
718+ let ( tx, mut rx) = limited :: < Sample > ( limit, None , None ) ;
709719
710720 assert_eq ! ( 1 , tx. available_capacity( ) ) ;
711721
@@ -735,7 +745,7 @@ mod tests {
735745 #[ test]
736746 fn oversized_send_allowed_when_empty ( ) {
737747 let limit = MemoryBufferSize :: MaxEvents ( NonZeroUsize :: new ( 1 ) . unwrap ( ) ) ;
738- let ( mut tx, mut rx) = limited ( limit, None ) ;
748+ let ( mut tx, mut rx) = limited ( limit, None , None ) ;
739749
740750 assert_eq ! ( 1 , tx. available_capacity( ) ) ;
741751
@@ -768,7 +778,7 @@ mod tests {
768778 #[ test]
769779 fn oversized_send_allowed_when_partial_capacity ( ) {
770780 let limit = MemoryBufferSize :: MaxEvents ( NonZeroUsize :: new ( 2 ) . unwrap ( ) ) ;
771- let ( mut tx, mut rx) = limited ( limit, None ) ;
781+ let ( mut tx, mut rx) = limited ( limit, None , None ) ;
772782
773783 assert_eq ! ( 2 , tx. available_capacity( ) ) ;
774784
0 commit comments