diff --git a/lading_payload/src/dogstatsd.rs b/lading_payload/src/dogstatsd.rs index eed745059..de983ca75 100644 --- a/lading_payload/src/dogstatsd.rs +++ b/lading_payload/src/dogstatsd.rs @@ -170,9 +170,9 @@ pub struct Config { pub multivalue_count: ConfRange, /// Range of possible values for the sampling rate sent in dogstatsd messages pub sampling_range: ConfRange, - /// Probability between 0 and 1 that a given dogstatsd msg will specify a sampling rate. + /// Probability that a given dogstatsd msg will specify a sampling rate. /// The sampling rate is chosen from `sampling_range` - pub sampling_probability: f32, + pub sampling_probability: Probability, /// Defines the relative probability of each kind of `DogStatsD` kinds of /// payload. pub kind_weights: KindWeights, @@ -273,7 +273,7 @@ impl Default for Config { multivalue_count: ConfRange::Inclusive { min: 2, max: 32 }, multivalue_pack_probability: 0.08, sampling_range: ConfRange::Inclusive { min: 0.1, max: 1.0 }, - sampling_probability: 0.5, + sampling_probability: Probability::try_new(0.5).expect("0.5 is in [0.0, 1.0]"), kind_weights: KindWeights::default(), metric_weights: MetricWeights::default(), value: ValueConf::default(), @@ -371,16 +371,6 @@ impl Config { } } - if !self.sampling_probability.is_finite() - || self.sampling_probability < 0.0 - || self.sampling_probability > 1.0 - { - return Result::Err(format!( - "Sampling probability {} must be finite and in range [0.0, 1.0]", - self.sampling_probability - )); - } - self.timestamp.valid()?; if self.kind_weights.metric == 0 @@ -432,7 +422,7 @@ impl MemberGenerator { multivalue_count: ConfRange, multivalue_pack_probability: f32, sampling: ConfRange, - sampling_probability: f32, + sampling_probability: Probability, kind_weights: KindWeights, metric_weights: MetricWeights, value_conf: ValueConf, diff --git a/lading_payload/src/dogstatsd/metric.rs b/lading_payload/src/dogstatsd/metric.rs index 6dc18162c..03754b408 100644 --- a/lading_payload/src/dogstatsd/metric.rs +++ b/lading_payload/src/dogstatsd/metric.rs @@ -35,7 +35,7 @@ pub(crate) struct MetricGenerator { pub(crate) multivalue_count: ConfRange, pub(crate) multivalue_pack_probability: f32, pub(crate) sampling: ConfRange, - pub(crate) sampling_probability: f32, + pub(crate) sampling_probability: Probability, pub(crate) num_value_generator: NumValueGenerator, pub(crate) pools: StringPools, /// Tags for each template. Each position in this Vec corresponds to the @@ -52,7 +52,7 @@ impl MetricGenerator { multivalue_count: ConfRange, multivalue_pack_probability: f32, sampling: ConfRange, - sampling_probability: f32, + sampling_probability: Probability, metric_weights: &WeightedIndex, container_ids: Vec, external_data: Vec, @@ -148,7 +148,7 @@ impl<'a> Generator<'a> for MetricGenerator { let cardinality = choose_or_not_ref(&mut rng, &self.cardinality).map(String::as_str); // https://docs.datadoghq.com/metrics/custom_metrics/dogstatsd_metrics_submission/#sample-rates let prob: f32 = OpenClosed01.sample(&mut rng); - let sample_rate = if prob < self.sampling_probability { + let sample_rate = if prob < self.sampling_probability.get() { let sample_rate = self.sampling.sample(&mut rng).clamp(0.0, 1.0); let sample_rate = common::ZeroToOne::try_from(sample_rate) .expect("failed to convert sample rate to ZeroToOne");