Skip to content

chore(antithesis): Add Pyld25, series are not empty#1961

Open
blt wants to merge 1 commit into
blt/chore_antithesis_add_two_new_pyld_propertiesfrom
blt/chore_antithesis_add_pyld25_series_are_not_empty
Open

chore(antithesis): Add Pyld25, series are not empty#1961
blt wants to merge 1 commit into
blt/chore_antithesis_add_two_new_pyld_propertiesfrom
blt/chore_antithesis_add_pyld25_series_are_not_empty

Conversation

@blt

@blt blt commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Summary

This commit adds a new simple payload property asserting that
series if shipped are not empty. It's not really a correctness
bug per se but it is wasteful.

Change Type

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

How did you test this PR?

References

@dd-octo-sts dd-octo-sts Bot added the area/test All things testing: unit/integration, correctness, SMP regression, etc. label Jul 1, 2026
@datadog-datadog-us1-prod

This comment has been minimized.

@pr-commenter

pr-commenter Bot commented Jul 1, 2026

Copy link
Copy Markdown

Binary Size Analysis (Agent Data Plane)

Baseline: 92cb9bd · Comparison: 5d2184d · diff
Analysis Configuration: stripped binaries · Pass/Fail Threshold: +5%
Sizes: 41.68 MiB (baseline) vs 41.68 MiB (comparison)
Size Change: -1.34 KiB (-0.00%)

✅ Binary size difference within threshold

Changes by Module
Module File Size Symbols
anon.bc27ec12f8abfd741d2cc888c8b01dc7.6.llvm.4158422603915796461 -1.87 KiB 1
anon.2c42b77b551de5ce0eb4683a5f3348ef.394.llvm.6471492298253374226 +1.87 KiB 1
anon.d851f2884fec383d59770b6e1053557d.496.llvm.14733898691217894837 -1.77 KiB 1
anon.d851f2884fec383d59770b6e1053557d.496.llvm.2729676012635161149 +1.77 KiB 1
anon.9af47ef3bc1f734053efc1a81f309c81.30.llvm.17299067839495397339 -1.69 KiB 1
anon.d851f2884fec383d59770b6e1053557d.181.llvm.2729676012635161149 +1.69 KiB 1
anon.1ae064f8f7c88592968577f5572fe6a1.81.llvm.10427259948598879219 -1.45 KiB 1
anon.84c2a157bbf679719fc5fed5de7b9895.104.llvm.17643131471645320202 +1.45 KiB 1
anon.1ae064f8f7c88592968577f5572fe6a1.76.llvm.10427259948598879219 -1.45 KiB 1
anon.b91e3af34c069ae48e7bbe7df595d981.128.llvm.10130343606843929883 +1.44 KiB 1
anon.1ae064f8f7c88592968577f5572fe6a1.78.llvm.10427259948598879219 -1.43 KiB 1
anon.105ca0d0b09b38782024af0b4190a881.82.llvm.10103066070350205741 +1.43 KiB 1
anon.168fdbdcbd293237ddac692d5d37499c.1219.llvm.13116985673205370977 -1.33 KiB 1
anon.1ae064f8f7c88592968577f5572fe6a1.597.llvm.12508115777240049810 +1.33 KiB 1
anon.d851f2884fec383d59770b6e1053557d.1940.llvm.14733898691217894837 -1.07 KiB 1
anon.19577c0eeee3802814ec8984397e7805.38.llvm.4244394631308212861 +1.07 KiB 1
anon.d851f2884fec383d59770b6e1053557d.1582.llvm.14733898691217894837 -1000 B 1
anon.56afeeebbb405e88722c851be8501b5f.28.llvm.9557380210322302320 +999 B 1
_RNvMs5_NtNtCsebJFismJkYh_3std2io5errorNtB5_5Error4kind.llvm.13116985673205370977 -971 B 1
_RNvMs5_NtNtCsebJFismJkYh_3std2io5errorNtB5_5Error4kind.llvm.3824531816487215769 +970 B 1
Detailed Symbol Changes
    FILE SIZE        VM SIZE    
 --------------  -------------- 
  [NEW] +4.72Ki  [NEW]     +49    core::ptr::drop_in_place<tower::util::map_future::MapFuture<axum::util::MapIntoResponse<tower::util::map_request::MapRequest<otlp_protos::otlp_include::opentelemetry::proto::collector::metrics::v1::metrics_service_server::MetricsServiceServer<saluki_components::common::otlp::GrpcServiceImpl<saluki_components::relays::otlp::RelayHandler>>,tonic::service::router::Routes::add_service<otlp_protos::otlp_include::opentelemetry::proto::collector::metrics::v1::metrics_service_server::MetricsServiceServer<saluki_components::common::otlp::GrpcServiceImpl<saluki_components::relays::otlp::RelayHandler>>>::{{closure}}>>,tower::util::boxed_clone_sync::BoxCloneSyncService<http::request::Request<axum_core::body::Body>,http::response::Response<axum_core::body::Body>,core::convert::Infallible>::new<axum::util::MapIntoResponse<tower::util::map_request::MapRequest<otlp_protos::otlp_include::opentelemetry::proto::collector::metrics
  [NEW] +2.49Ki  [NEW]    +422    core::ptr::drop_in_place<tokio::sync::mpsc::bounded::Permit<saluki_components::common::datadog::validation::ValidationReadiness>>::hca0a8333f13b4a04
  [NEW] +1.87Ki  [NEW]     +97    anon.2c42b77b551de5ce0eb4683a5f3348ef.394.llvm.6471492298253374226
  [NEW] +1.77Ki  [NEW] +1.68Ki    anon.d851f2884fec383d59770b6e1053557d.496.llvm.2729676012635161149
  [NEW] +1.75Ki  [NEW]     +33    core::ptr::drop_in_place<http_body_util::combinators::map_err::MapErr<tonic::codec::encode::EncodeBody<tonic_prost::codec::ProstEncoder<otlp_protos::otlp_include::opentelemetry::proto::collector::metrics::v1::ExportMetricsServiceResponse>,tokio_stream::once::Once<core::result::Result<otlp_protos::otlp_include::opentelemetry::proto::collector::metrics::v1::ExportMetricsServiceResponse,tonic::status::Status>>>,tonic::status::Status::map_error<tonic::status::Status>>>::hc7bb46af7020a455
  [NEW] +1.69Ki  [NEW]     +90    anon.d851f2884fec383d59770b6e1053557d.181.llvm.2729676012635161149
  [NEW] +1.45Ki  [NEW]     +22    anon.84c2a157bbf679719fc5fed5de7b9895.104.llvm.17643131471645320202
  [NEW] +1.44Ki  [NEW]     +22    anon.b91e3af34c069ae48e7bbe7df595d981.128.llvm.10130343606843929883
  [NEW] +1.43Ki  [NEW]     +92    anon.105ca0d0b09b38782024af0b4190a881.82.llvm.10103066070350205741
  [NEW] +1.33Ki  [NEW]     +91    anon.1ae064f8f7c88592968577f5572fe6a1.597.llvm.12508115777240049810
  -0.1% -1.32Ki  [ = ]       0    [2750 Others]
  [DEL] -1.33Ki  [DEL]     -91    anon.168fdbdcbd293237ddac692d5d37499c.1219.llvm.13116985673205370977
  [DEL] -1.43Ki  [DEL]     -92    anon.1ae064f8f7c88592968577f5572fe6a1.78.llvm.10427259948598879219
  [DEL] -1.45Ki  [DEL]     -22    anon.1ae064f8f7c88592968577f5572fe6a1.76.llvm.10427259948598879219
  [DEL] -1.45Ki  [DEL]     -22    anon.1ae064f8f7c88592968577f5572fe6a1.81.llvm.10427259948598879219
  [DEL] -1.69Ki  [DEL]     -90    anon.9af47ef3bc1f734053efc1a81f309c81.30.llvm.17299067839495397339
  [DEL] -1.75Ki  [DEL]     -33    core::ptr::drop_in_place<http_body_util::combinators::map_err::MapErr<tonic::codec::encode::EncodeBody<tonic_prost::codec::ProstEncoder<otlp_protos::otlp_include::opentelemetry::proto::collector::logs::v1::ExportLogsServiceResponse>,tokio_stream::once::Once<core::result::Result<otlp_protos::otlp_include::opentelemetry::proto::collector::logs::v1::ExportLogsServiceResponse,tonic::status::Status>>>,tonic::status::Status::map_error<tonic::status::Status>>>::h1fa0da3cd6bc290b
  [DEL] -1.77Ki  [DEL] -1.68Ki    anon.d851f2884fec383d59770b6e1053557d.496.llvm.14733898691217894837
  [DEL] -1.87Ki  [DEL]     -97    anon.bc27ec12f8abfd741d2cc888c8b01dc7.6.llvm.4158422603915796461
  [DEL] -2.50Ki  [DEL]    -422    core::ptr::drop_in_place<tokio::sync::mpsc::bounded::Permit<saluki_components::common::datadog::transaction::Transaction<saluki_common::buf::chunked::FrozenChunkedBytesBuffer>>>::h352480850e3af1cc
  [DEL] -4.72Ki  [DEL]     -49    core::ptr::drop_in_place<tower::util::map_future::MapFuture<axum::util::MapIntoResponse<tower::util::map_request::MapRequest<otlp_protos::otlp_include::opentelemetry::proto::collector::trace::v1::trace_service_server::TraceServiceServer<saluki_components::common::otlp::GrpcServiceImpl<saluki_components::relays::otlp::RelayHandler>>,tonic::service::router::Routes::add_service<otlp_protos::otlp_include::opentelemetry::proto::collector::trace::v1::trace_service_server::TraceServiceServer<saluki_components::common::otlp::GrpcServiceImpl<saluki_components::relays::otlp::RelayHandler>>>::{{closure}}>>,tower::util::boxed_clone_sync::BoxCloneSyncService<http::request::Request<axum_core::body::Body>,http::response::Response<axum_core::body::Body>,core::convert::Infallible>::new<axum::util::MapIntoResponse<tower::util::map_request::MapRequest<otlp_protos::otlp_include::opentelemetry::proto::collector::trace::v1::trace_se
  -0.0% -1.34Ki  [ = ]       0    TOTAL

@pr-commenter

pr-commenter Bot commented Jul 1, 2026

Copy link
Copy Markdown

Regression Detector (Agent Data Plane)

Run ID: f6e1a9b9-732c-4c09-b804-5840730c61bb
Baseline: 92cb9bda · Comparison: 5d2184dd · 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.36 metrics profiles logs
quality_gates_rss_dsd_heavy memory ⚪ +0.24 metrics profiles logs
quality_gates_rss_dsd_medium memory ⚪ -0.00 metrics profiles logs
quality_gates_rss_idle memory ⚪ -0.04 metrics profiles logs
quality_gates_rss_dsd_low memory ⚪ -0.05 metrics profiles logs
Bounds Checks: ✅ Passed (5)
experiment check replicates observed links
quality_gates_rss_dsd_heavy memory_usage 10/10 ✅ 132 MiB ≤ 140 MiB metrics profiles logs
quality_gates_rss_dsd_low memory_usage 10/10 ✅ 43.3 MiB ≤ 50 MiB metrics profiles logs
quality_gates_rss_dsd_medium memory_usage 10/10 ✅ 65 MiB ≤ 75 MiB metrics profiles logs
quality_gates_rss_dsd_ultraheavy memory_usage 10/10 ✅ 191 MiB ≤ 200 MiB metrics profiles logs
quality_gates_rss_idle memory_usage 10/10 ✅ 29 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.

@blt blt force-pushed the blt/chore_antithesis_add_pyld25_series_are_not_empty branch from 4b011df to 67ce101 Compare July 2, 2026 13:44
@blt blt force-pushed the blt/chore_antithesis_add_two_new_pyld_properties branch 2 times, most recently from 2f2246a to d82dd16 Compare July 2, 2026 16:57
@blt blt force-pushed the blt/chore_antithesis_add_pyld25_series_are_not_empty branch 2 times, most recently from 7024db6 to 9d89983 Compare July 2, 2026 21:11
@blt blt force-pushed the blt/chore_antithesis_add_two_new_pyld_properties branch from d82dd16 to 8696828 Compare July 2, 2026 21:11
@blt blt force-pushed the blt/chore_antithesis_add_pyld25_series_are_not_empty branch from 9d89983 to d652f5f Compare July 2, 2026 21:40
@blt blt force-pushed the blt/chore_antithesis_add_two_new_pyld_properties branch from 8696828 to 7f923d5 Compare July 2, 2026 21:40
@blt blt force-pushed the blt/chore_antithesis_add_pyld25_series_are_not_empty branch from d652f5f to f924078 Compare July 2, 2026 22:08
@blt blt force-pushed the blt/chore_antithesis_add_two_new_pyld_properties branch 2 times, most recently from ba11f8a to 7830217 Compare July 2, 2026 22:17
@blt blt force-pushed the blt/chore_antithesis_add_pyld25_series_are_not_empty branch 2 times, most recently from 3436479 to f08152f Compare July 2, 2026 22:41
@blt blt force-pushed the blt/chore_antithesis_add_two_new_pyld_properties branch from 7830217 to 3ddec3a Compare July 2, 2026 22:41
@blt blt marked this pull request as ready for review July 2, 2026 22:50
Copilot AI review requested due to automatic review settings July 2, 2026 22:50
@blt blt requested review from a team as code owners July 2, 2026 22:50

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new Antithesis intake payload property (Pyld25) to assert that certain /api/v2/series MetricSeries entries are not shipped with empty points, and wires it into the per-series evaluation flow so it is checked for each observed series.

Changes:

  • Add a new per-series payload property points_non_empty (Pyld25) for MetricSeries.
  • Invoke Pyld25 as part of /api/v2/series observation evaluation.
  • Document Pyld25 in the intake README property table.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

File Description
test/antithesis/intake/src/series_observation.rs Wires the new Pyld25 assertion into per-series evaluation.
test/antithesis/intake/src/properties/payload/series.rs Implements Pyld25 (points_non_empty) to detect empty-point series.
test/antithesis/intake/README.md Adds Pyld25 to the documented payload property list.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +164 to +173
/// Pyld25 -- a flushed COUNT or GAUGE series carries at least one point.
pub(crate) fn points_non_empty(target: Target, ms: &MetricSeries) {
let materialized = matches!(ms.type_.enum_value(), Ok(MetricType::COUNT | MetricType::GAUGE));
let empty = (materialized && ms.points.is_empty()).then(|| ms.type_.value());
assert_always!(
empty.is_none(),
"Pyld25.series_points_non_empty",
&json!({ "lane": target, "metric": ms.metric(), "type": ms.type_.value() })
);
}
| Pyld22 | Bytes | Content-Length | `Content-Length` absent or value equals body byte count |
| Pyld23 | MetricSeries | Tag Length | each tag `<= 200` bytes (`MaxTagLength`) |
| Pyld24 | MetricSeries | Tag Set Size | total tag bytes per series `<= 100 KiB` (`MaxTagSetSize`) |
| Pyld25 | MetricSeries | Points Non-Empty | a flushed `COUNT` or `GAUGE` series carries at least one point |

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f08152f058

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".


/// Pyld25 -- a flushed COUNT or GAUGE series carries at least one point.
pub(crate) fn points_non_empty(target: Target, ms: &MetricSeries) {
let materialized = matches!(ms.type_.enum_value(), Ok(MetricType::COUNT | MetricType::GAUGE));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Include RATE series in the non-empty check

When an empty RATE MetricSeries is flushed, materialized is false here, so empty stays None and Pyld25 passes; RATE is already an in-domain /api/v2/series type under Pyld12 and the v2 encoder writes rate metrics into the same MetricSeries.points field, so the empty-series scenario remains uncaught for rates while the point-level Pyld20/Pyld21 checks are vacuous on an empty points list.

Useful? React with 👍 / 👎.

| Pyld22 | Bytes | Content-Length | `Content-Length` absent or value equals body byte count |
| Pyld23 | MetricSeries | Tag Length | each tag `<= 200` bytes (`MaxTagLength`) |
| Pyld24 | MetricSeries | Tag Set Size | total tag bytes per series `<= 100 KiB` (`MaxTagSetSize`) |
| Pyld25 | MetricSeries | Points Non-Empty | a flushed `COUNT` or `GAUGE` series carries at least one point |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Update the scratchbook for Pyld25

Adding Pyld25 here changes the Antithesis property catalog, but test/antithesis/AGENTS.md says the scratchbook contains property catalogs and to “Keep it up to date as Antithesis-related decisions change.” The persistent notes in test/antithesis/scratchbook/w-property-intake.md still describe W1-W22 as the full set, so operators using that scratchbook will miss this new assertion unless it is updated alongside the README entry.

Useful? React with 👍 / 👎.

@blt blt force-pushed the blt/chore_antithesis_add_two_new_pyld_properties branch from 3ddec3a to e676f37 Compare July 6, 2026 14:19
@blt blt force-pushed the blt/chore_antithesis_add_pyld25_series_are_not_empty branch from f08152f to 55effb5 Compare July 6, 2026 14:19
This commit adds a new simple payload property asserting that
series if shipped are not empty. It's not really a correctness
bug per se but it is wasteful.
Copilot AI review requested due to automatic review settings July 6, 2026 17:50
@blt blt force-pushed the blt/chore_antithesis_add_pyld25_series_are_not_empty branch from 55effb5 to 5d2184d Compare July 6, 2026 17:50
@blt blt force-pushed the blt/chore_antithesis_add_two_new_pyld_properties branch from e676f37 to 490d1fa Compare July 6, 2026 17:50

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated no new comments.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/test All things testing: unit/integration, correctness, SMP regression, etc.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants