Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions datadog-ipc/src/shm_stats.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ use zwohash::ZwoHasher;
use libdd_ddsketch::DDSketch;
use libdd_trace_protobuf::pb;
use libdd_trace_stats::span_concentrator::{
FixedAggregationKey, FlushResult, FlushableConcentrator,
FixedAggregationKey, FlushResult, FlushableConcentrator, StatsBucketCollapseTelemetry,
};

use crate::platform::{FileBackedHandle, MappedMem, NamedShmHandle};
Expand Down Expand Up @@ -827,7 +827,7 @@ impl FlushableConcentrator for ShmSpanConcentrator {
FlushResult {
obfuscated_buckets: vec![],
unobfuscated_buckets: self.drain_buckets(force),
collapsed_spans: 0,
collapsed_spans: StatsBucketCollapseTelemetry::default(),
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion libdd-data-pipeline-ffi/cbindgen.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,4 @@ must_use = "DDOG_CHECK_RETURN"

[parse]
parse_deps = true
include = ["libdd-common", "libdd-common-ffi", "libdd-shared-runtime", "libdd-data-pipeline", "libdd-trace-utils"]
include = ["libdd-common", "libdd-common-ffi", "libdd-shared-runtime", "libdd-data-pipeline", "libdd-trace-utils", "libdd-trace-stats"]
37 changes: 28 additions & 9 deletions libdd-data-pipeline-ffi/src/trace_exporter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use libdd_common_ffi::{
CharSlice,
{slice::AsBytes, slice::ByteSlice},
};
use libdd_data_pipeline::trace_exporter::stats::CardinalityLimitConfig;
use libdd_data_pipeline::trace_exporter::{
TelemetryConfig, TelemetryInstrumentationSessions, TraceExporter as GenericTraceExporter,
TraceExporterInputFormat, TraceExporterOutputFormat,
Expand Down Expand Up @@ -90,7 +91,7 @@ pub struct TraceExporterConfig {
otlp_protocol: Option<OtlpProtocol>,
output_to_log: bool,
log_max_line_size: Option<usize>,
stats_cardinality_limit: Option<usize>,
stats_cardinality_limits: Option<CardinalityLimitConfig>,
}

#[no_mangle]
Expand Down Expand Up @@ -555,11 +556,11 @@ pub unsafe extern "C" fn ddog_trace_exporter_config_set_otlp_protocol(
#[no_mangle]
pub unsafe extern "C" fn ddog_trace_exporter_config_set_stats_cardinality_limit(
config: Option<&mut TraceExporterConfig>,
limit: usize,
limits: CardinalityLimitConfig,
) -> Option<Box<ExporterError>> {
catch_panic!(
if let Some(handle) = config {
handle.stats_cardinality_limit = Some(limit);
handle.stats_cardinality_limits = Some(limits);
None
} else {
gen_error!(ErrorCode::InvalidArgument)
Expand Down Expand Up @@ -645,7 +646,7 @@ pub unsafe extern "C" fn ddog_trace_exporter_new(
.set_output_format(config.output_format)
.set_connection_timeout(config.connection_timeout);

if let Some(limit) = config.stats_cardinality_limit {
if let Some(limit) = config.stats_cardinality_limits {
builder.set_stats_cardinality_limit(limit);
}

Expand Down Expand Up @@ -782,7 +783,7 @@ mod tests {
assert!(cfg.connection_timeout.is_none());
assert!(!cfg.output_to_log);
assert_eq!(cfg.log_max_line_size, None);
assert_eq!(cfg.stats_cardinality_limit, None);
assert_eq!(cfg.stats_cardinality_limits, None);

ddog_trace_exporter_config_free(cfg);
}
Expand Down Expand Up @@ -1501,16 +1502,34 @@ mod tests {
fn config_stats_cardinality_limit_test() {
unsafe {
// Null config → InvalidArgument
let error = ddog_trace_exporter_config_set_stats_cardinality_limit(None, 100);
let error = ddog_trace_exporter_config_set_stats_cardinality_limit(
None,
CardinalityLimitConfig {
whole_key_limit: 100,
..Default::default()
},
);
assert_eq!(error.as_ref().unwrap().code, ErrorCode::InvalidArgument);
ddog_trace_exporter_error_free(error);

// Valid config → value stored
let mut config = Some(TraceExporterConfig::default());
let error =
ddog_trace_exporter_config_set_stats_cardinality_limit(config.as_mut(), 500);
let error = ddog_trace_exporter_config_set_stats_cardinality_limit(
config.as_mut(),
CardinalityLimitConfig {
whole_key_limit: 500,
..Default::default()
},
);
assert_eq!(error, None);
assert_eq!(config.unwrap().stats_cardinality_limit, Some(500));
assert_eq!(
config
.unwrap()
.stats_cardinality_limits
.unwrap()
.whole_key_limit,
500
);
}
}

Expand Down
14 changes: 9 additions & 5 deletions libdd-data-pipeline/src/trace_exporter/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ use libdd_dogstatsd_client::new;
use libdd_shared_runtime::SharedRuntime;
#[cfg(not(target_arch = "wasm32"))]
use libdd_shared_runtime::{BlockingRuntime, ForkSafeRuntime};
use libdd_trace_stats::span_concentrator::CardinalityLimitConfig;
use libdd_trace_utils::trace_filter::TraceFilterer;
use std::sync::Arc;
use std::time::Duration;
Expand Down Expand Up @@ -75,7 +76,7 @@ pub struct TraceExporterBuilder<R: SharedRuntime> {
peer_tags_aggregation: bool,
compute_stats_by_span_kind: bool,
peer_tags: Vec<String>,
stats_cardinality_limit: Option<usize>,
stats_cardinality_limits: Option<CardinalityLimitConfig>,
#[cfg(feature = "stats-obfuscation")]
client_side_stats_obfuscation_enabled: bool,
#[cfg(feature = "telemetry")]
Expand Down Expand Up @@ -143,7 +144,7 @@ impl<R: SharedRuntime> TraceExporterBuilder<R> {
peer_tags_aggregation: false,
compute_stats_by_span_kind: false,
peer_tags: Vec::new(),
stats_cardinality_limit: None,
stats_cardinality_limits: None,
#[cfg(feature = "stats-obfuscation")]
client_side_stats_obfuscation_enabled: false,
#[cfg(feature = "telemetry")]
Expand Down Expand Up @@ -333,8 +334,11 @@ impl<R: SharedRuntime> TraceExporterBuilder<R> {
/// This bounds memory usage when the trace population has very high cardinality.
///
/// Has no effect unless stats computation is enabled.
pub fn set_stats_cardinality_limit(&mut self, cardinality_limit: usize) -> &mut Self {
self.stats_cardinality_limit = Some(cardinality_limit);
pub fn set_stats_cardinality_limit(
&mut self,
cardinality_limits: CardinalityLimitConfig,
) -> &mut Self {
self.stats_cardinality_limits = Some(cardinality_limits);
self
}

Expand Down Expand Up @@ -820,7 +824,7 @@ impl<R: SharedRuntime> TraceExporterBuilder<R> {
common_stats_tags: vec![libdatadog_version],
client_side_stats: StatsComputationConfig {
status: ArcSwap::new(stats.into()),
stats_cardinality_limit: self.stats_cardinality_limit,
stats_cardinality_limits: self.stats_cardinality_limits,
#[cfg(feature = "stats-obfuscation")]
obfuscation_config: Arc::new(ArcSwap::from_pointee(
StatsComputationObfuscationConfig::default(),
Expand Down
6 changes: 3 additions & 3 deletions libdd-data-pipeline/src/trace_exporter/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -469,7 +469,7 @@ impl<
metadata: &self.metadata,
endpoint_url: &self.endpoint.url,
shared_runtime: &*self.shared_runtime,
stats_cardinality_limit: self.client_side_stats.stats_cardinality_limit,
stats_cardinality_limits: self.client_side_stats.stats_cardinality_limits,
dogstatsd: if self.health_metrics_enabled {
self.dogstatsd.clone()
} else {
Expand Down Expand Up @@ -875,8 +875,8 @@ impl<
&& self.v1_active.swap(false, Ordering::Relaxed)
{
warn!(
"V1 trace send returned 404; agent no longer advertises {V1_TRACES_ENDPOINT} — falling back to V0.4"
);
"V1 trace send returned 404; agent no longer advertises {V1_TRACES_ENDPOINT} — falling back to V0.4"
);
self.info_response_observer.manual_trigger();
}
}
Expand Down
8 changes: 5 additions & 3 deletions libdd-data-pipeline/src/trace_exporter/stats.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
//! including starting/stopping stats workers, managing the span concentrator,
//! and processing traces for stats collection.

pub use libdd_trace_stats::span_concentrator::CardinalityLimitConfig;

#[cfg(not(target_arch = "wasm32"))]
use super::add_path;
use super::TracerMetadata;
Expand Down Expand Up @@ -49,7 +51,7 @@ pub(crate) struct StatsContext<'a, R: SharedRuntime> {
pub metadata: &'a TracerMetadata,
pub endpoint_url: &'a http::Uri,
pub shared_runtime: &'a R,
pub stats_cardinality_limit: Option<usize>,
pub stats_cardinality_limits: Option<CardinalityLimitConfig>,
/// Optional DogStatsD client forwarded to the [`StatsExporter`].
pub dogstatsd: Option<std::sync::Arc<libdd_dogstatsd_client::Client>>,
/// Optional telemetry handle forwarded to the [`StatsExporter`].
Expand Down Expand Up @@ -77,7 +79,7 @@ pub(crate) enum StatsComputationStatus {
#[cfg_attr(target_arch = "wasm32", allow(dead_code))]
pub(crate) struct StatsComputationConfig {
pub(crate) status: ArcSwap<StatsComputationStatus>,
pub(crate) stats_cardinality_limit: Option<usize>,
pub(crate) stats_cardinality_limits: Option<CardinalityLimitConfig>,
#[cfg(feature = "stats-obfuscation")]
pub(crate) obfuscation_config: SharedStatsComputationObfuscationConfig,
/// Builder-level opt-in. When false, stats obfuscation stays off
Expand Down Expand Up @@ -142,7 +144,7 @@ pub(crate) fn start_stats_computation<
std::time::SystemTime::now(),
span_kinds,
peer_tags,
ctx.stats_cardinality_limit,
ctx.stats_cardinality_limits,
#[cfg(feature = "stats-obfuscation")]
Some(client_side_stats.obfuscation_config.clone()),
)));
Expand Down
Loading
Loading