Skip to content

Move V3 protocol into a separate crate#1920

Draft
StephenWakely wants to merge 13 commits into
mainfrom
stephen/v3_vector
Draft

Move V3 protocol into a separate crate#1920
StephenWakely wants to merge 13 commits into
mainfrom
stephen/v3_vector

Conversation

@StephenWakely

Copy link
Copy Markdown
Contributor

Summary

Change Type

  • Bug fix
  • New feature
  • Non-functional (chore, refactoring, docs)
  • Performance

How did you test this PR?

References

@datadog-official

datadog-official Bot commented Jun 24, 2026

Copy link
Copy Markdown

Pipelines

Fix all issues with BitsAI

⚠️ Warnings

🚦 3 Pipeline jobs failed

DataDog/saluki | check-clippy   View in Datadog   GitLab

DataDog/saluki | check-unused-deps   View in Datadog   GitLab

Semantic PR Title Check | Check For Semantic PR Title   View in Datadog   GitHub Actions

Useful? React with 👍 / 👎

This comment will be updated automatically if new data arrives.
🔗 Commit SHA: 2f8686b | Docs | Datadog PR Page | Give us feedback!

@dd-octo-sts dd-octo-sts Bot added area/components Sources, transforms, and destinations. encoder/datadog-metrics Datadog Metrics encoder. labels Jun 24, 2026
@pr-commenter

pr-commenter Bot commented Jun 26, 2026

Copy link
Copy Markdown

Binary Size Analysis (Agent Data Plane)

Baseline: 7b98c6f · Comparison: 2f8686b · diff
Analysis Configuration: stripped binaries · Pass/Fail Threshold: +5%
Sizes: 41.63 MiB (baseline) vs 41.49 MiB (comparison)
Size Change: -149.04 KiB (-0.35%)

✅ Binary size difference within threshold

Changes by Module
Module File Size Symbols
figment -72.47 KiB 530
core -62.10 KiB 9029
tonic_prost +57.21 KiB 40
saluki_components::encoders::datadog -42.03 KiB 470
prost -32.29 KiB 227
datadog_metrics_v3::writer::write_packed_column +21.60 KiB 18
otlp_protos::otlp_include::opentelemetry -20.69 KiB 147
tonic -19.88 KiB 366
crossbeam_channel -19.21 KiB 76
tracing_appender +18.84 KiB 2
datadog_protos::trace_piecemeal_include::datadog -15.20 KiB 21
piecemeal +14.72 KiB 42
http_body_util +13.70 KiB 152
saluki_components::sources::dogstatsd -13.47 KiB 377
saluki_components::common::datadog +9.67 KiB 563
anyhow -9.46 KiB 1101
datadog_metrics_v3::writer::V3Writer +9.21 KiB 4
axum +9.19 KiB 302
datadog_metrics_v3::writer::V3MetricBuilder +9.10 KiB 6
anon.5c4223d7f930cb2ba7333a036601883f.1172.llvm.6976130372670450011 +8.59 KiB 1
Detailed Symbol Changes
    FILE SIZE        VM SIZE    
 --------------  -------------- 
  [NEW] +56.4Ki  [NEW] +56.2Ki    saluki_components::common::datadog::io::run_endpoint_io_loop::_{{closure}}::hbc76ccd734c4784a
  [NEW] +44.7Ki  [NEW] +44.6Ki    agent_data_plane::cli::run::handle_run_command::_{{closure}}::h1d5f690c4b2333f6
  [NEW] +38.5Ki  [NEW] +38.3Ki    _<saluki_components::forwarders::otlp::OtlpForwarder as saluki_core::components::forwarders::Forwarder>::run::_{{closure}}::hd4275ddb2cfdbdc2
  [NEW] +30.0Ki  [NEW] +29.8Ki    _<saluki_components::transforms::aggregate::Aggregate as saluki_core::components::transforms::Transform>::run::_{{closure}}::h401070a4b855ddb5
  [NEW] +28.9Ki  [NEW] +28.8Ki    saluki_components::sources::otlp::metrics::translator::OtlpMetricsTranslator::translate_metrics::hc9fd0f9a15a67bcc
  [NEW] +28.6Ki  [NEW] +28.5Ki    agent_data_plane::cli::dogstatsd::handle_dogstatsd_command::_{{closure}}::h3bd5b84a0703b5aa
  [NEW] +26.6Ki  [NEW] +26.4Ki    _<saluki_components::sources::dogstatsd::DogStatsDConfiguration as saluki_core::components::sources::builder::SourceBuilder>::build::_{{closure}}::ha7243c8d65a9b7fd
  [NEW] +25.7Ki  [NEW] +25.5Ki    saluki_components::sources::dogstatsd::drive_stream::_{{closure}}::h34b1a9a65fb5c6b0
  [NEW] +25.0Ki  [NEW] +24.8Ki    agent_data_plane::internal::remote_agent::run_remote_agent_registration_loop::_{{closure}}::h3c1836d1c1812922
  [DEL] -24.1Ki  [DEL] -23.9Ki    _<agent_data_plane::components::host_tags::HostTagsConfiguration as saluki_core::components::transforms::builder::SynchronousTransformBuilder>::build::_{{closure}}::hc48efdb3c628e5e0
  [DEL] -25.0Ki  [DEL] -24.8Ki    agent_data_plane::internal::remote_agent::run_remote_agent_registration_loop::_{{closure}}::h64859e60eb17f920
  [DEL] -25.6Ki  [DEL] -25.4Ki    saluki_components::sources::dogstatsd::drive_stream::_{{closure}}::h3fe2520e3abdfc38
  [DEL] -26.6Ki  [DEL] -26.4Ki    _<saluki_components::sources::dogstatsd::DogStatsDConfiguration as saluki_core::components::sources::builder::SourceBuilder>::build::_{{closure}}::h2c2a33d551977c6d
  [DEL] -27.2Ki  [DEL] -26.9Ki    _<saluki_components::sources::dogstatsd::_::<impl serde_core::de::Deserialize for saluki_components::sources::dogstatsd::DogStatsDConfiguration>::deserialize::__Visitor as serde_core::de::Visitor>::visit_map::hfc578ba92a99992a
  [DEL] -28.6Ki  [DEL] -28.5Ki    saluki_components::sources::otlp::metrics::translator::OtlpMetricsTranslator::translate_metrics::h1e8351a6f731e9df
  [DEL] -28.6Ki  [DEL] -28.5Ki    agent_data_plane::cli::dogstatsd::handle_dogstatsd_command::_{{closure}}::h84db3f7ad161eab2
  [DEL] -32.6Ki  [DEL] -32.4Ki    _<saluki_components::transforms::aggregate::Aggregate as saluki_core::components::transforms::Transform>::run::_{{closure}}::h72e4b09fd816d94f
  [DEL] -38.7Ki  [DEL] -38.5Ki    _<saluki_components::forwarders::otlp::OtlpForwarder as saluki_core::components::forwarders::Forwarder>::run::_{{closure}}::h3cd6ee67f0471508
  [DEL] -44.7Ki  [DEL] -44.6Ki    agent_data_plane::cli::run::handle_run_command::_{{closure}}::h83501a7881036c5f
  [DEL] -56.8Ki  [DEL] -56.6Ki    saluki_components::common::datadog::io::run_endpoint_io_loop::_{{closure}}::h54fbb73bb30184e6
  -0.6% -94.9Ki  -0.5% -63.5Ki    [32284 Others]
  -0.3%  -149Ki  -0.3%  -117Ki    TOTAL

@pr-commenter

pr-commenter Bot commented Jun 26, 2026

Copy link
Copy Markdown

Regression Detector (Agent Data Plane)

Run ID: b68df238-bd77-4ed8-811d-139035f53529
Baseline: 7b98c6f1 · Comparison: 2f8686bc · diff

Optimization Goals: ✅ No significant changes detected

Fine details of change detection per experiment (5)

Experiments configured erratic: true are tagged (ignored) and skipped when determining which experiments regressed or improved. Experiments which are detected as erratic at runtime are tagged (erratic) to flag that the run's sample dispersion was high, but their regression / improvement signal still counts.

experiment goal Δ mean % links
quality_gates_rss_dsd_ultraheavy memory ⚪ +0.26 metrics profiles logs
quality_gates_rss_dsd_medium memory ⚪ +0.06 metrics profiles logs
quality_gates_rss_dsd_heavy memory ⚪ -0.10 metrics profiles logs
quality_gates_rss_idle memory ⚪ -0.19 metrics profiles logs
quality_gates_rss_dsd_low memory ⚪ -0.26 metrics profiles logs
Bounds Checks: ❌ Failed (5)
experiment check replicates observed links
quality_gates_rss_dsd_heavy memory_usage 9/10 ❌ 140 MiB ≤ 140 MiB metrics profiles logs
quality_gates_rss_dsd_low memory_usage 10/10 ✅ 42.8 MiB ≤ 50 MiB metrics profiles logs
quality_gates_rss_dsd_medium memory_usage 10/10 ✅ 64.6 MiB ≤ 75 MiB metrics profiles logs
quality_gates_rss_dsd_ultraheavy memory_usage 10/10 ✅ 192 MiB ≤ 200 MiB metrics profiles logs
quality_gates_rss_idle memory_usage 10/10 ✅ 28.8 MiB ≤ 40 MiB metrics profiles logs
Explanation

A change is flagged as a regression when |Δ mean %| > 5.00% in the regressing direction for its optimization goal AND SMP marks the experiment as a regression (is_regression: true). Improvements use the matching criteria for the improving direction. Experiments configured erratic: true (tagged (ignored)) are skipped outright; experiments detected as erratic at runtime (tagged (erratic)) still count, since that flag describes sample dispersion rather than directional certainty. The Δ mean % cell is colored accordingly: 🟢 = improvement, 🔴 = regression, ⚪ = neutral. Reduction in CPU or memory is an improvement; reduction in ingress throughput is a regression.

@dd-octo-sts dd-octo-sts Bot added area/core Core functionality, event model, etc. area/io General I/O and networking. area/docs Reference documentation. area/test All things testing: unit/integration, correctness, SMP regression, etc. forwarder/datadog Datadog forwarder. labels Jun 29, 2026
@StephenWakely StephenWakely changed the base branch from main to tobz/datadog-metrics-v3-payload-support June 29, 2026 16:00
@dd-octo-sts dd-octo-sts Bot removed area/core Core functionality, event model, etc. area/io General I/O and networking. area/docs Reference documentation. area/test All things testing: unit/integration, correctness, SMP regression, etc. forwarder/datadog Datadog forwarder. labels Jun 29, 2026
@tobz tobz force-pushed the tobz/datadog-metrics-v3-payload-support branch from 6b21d5a to b86c488 Compare June 30, 2026 14:37
Base automatically changed from tobz/datadog-metrics-v3-payload-support to main June 30, 2026 17:00
…ics-v3 crate

Extract the pure-protocol V3 codec (interner, types, writer, serializer) from
lib/saluki-components into a zero-dependency lib/datadog-metrics-v3 crate. The
serializer is reimplemented using raw protobuf wire-format encoding with no
external deps. saluki-components now re-exports from this crate.

fix(metrics): fix V3 codec correctness issues found in code review

Three issues addressed:

1. compact_values() skipped for Sketch metrics.
   Sketch summary values (sum/min/max) must stay in vals_float64. The old
   code could move them to vals_float32 or vals_sint64 based on magnitude,
   corrupting the payload — the decoder reads these from vals_float64 by
   position, not by type tag.

2. V3MetricBuilder Drop guard.
   Without a Drop impl, forgetting close() silently left value-type bits
   unset in the types column. Now panics in debug builds if close() is not
   called before drop.

3. MetricsV3EndpointEncoder::encode() now writes to buffer.
   The EndpointEncoder contract requires each encode() call to write to
   buffer so the request builder can track sizes. Previously the V3 encoder
   accumulated into self.writer but wrote nothing to buffer, producing empty
   payloads. Fixed by serializing a single-metric V3 payload per encode()
   call. Full cross-metric deduplication requires a batch-flush hook on
   EndpointEncoder (tracked via TODO comment).

chore(metrics): remove unused WIRE_VARINT constant and redundant field_numbers module

field_numbers was a duplicate of the private mod field in serializer.rs and
was not referenced anywhere. WIRE_VARINT (protobuf wire type 0) is not used
by the current serializer.
…ics-v3 crate

After rebasing stephen/v3_vector on tobz/datadog-metrics-v3-payload-support
(PR #1175), extract the codec internals into lib/datadog-metrics-v3 so
Vector can reuse them without depending on saluki-core or saluki-common.

Extracted into standalone crate (zero external deps):
- Interner: Borrow-trait based get_or_insert — no clone on cache hits
- Types: V3MetricType, V3ValueType, PointKind, value_type_for_values
  (the precision-safe compaction algorithm from PR #1175)
- Writer: unit support (FLAG_HAS_UNIT / dict_unit_bytes / unit_refs),
  FLAG_NO_INDEX, set_unit(), set_no_index()
- Serializer: fields 25 (dictUnitStr) and 26 (unitRefs)

Removed from saluki-components (now re-exported from standalone crate):
- v3/interner.rs → deleted; use datadog_metrics_v3::Interner
- v3/types.rs    → deleted; use datadog_metrics_v3::{V3MetricType, V3ValueType, ...}
- v3/writer.rs   → kept (saluki-specific output types + protobuf serialization)
  but now imports Interner, V3MetricType, V3ValueType from the standalone crate

The saluki-components v3/writer.rs retains its own value_type_for_values
(identical algorithm) and protobuf::CodedOutputStream serialization since
those are appropriate for saluki. The standalone crate uses a zero-dep
hand-rolled serializer for Vector compatibility.
…dOutputStream

Replace the zero-dep hand-rolled protobuf serializer with protobuf::CodedOutputStream.
This eliminates the duplicate serialization implementation — the crate now uses the
same serialization path as saluki-components' v3/writer.rs.

API change: V3Writer::close() now returns Vec<u8> (serialized bytes) instead of
V3EncodedData. Callers no longer need a separate serialize_v3_payload() call.
finalize_inner() is kept as pub(crate) for testing internal columnar state.

serializer.rs is deleted; the field constants move to writer.rs.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/components Sources, transforms, and destinations. encoder/datadog-metrics Datadog Metrics encoder.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant