Skip to content

Commit 3662eca

Browse files
committed
test(antithesis): floor buffer size, multi-value packed metrics
Sample dogstatsd_buffer_size mostly >=128 so a tiny buffer does not silently zero delivery. Emit multi-value :-packed metrics ~5% with a Sometimes anchor. Rename the send-success anchor to 'workload sent a dogstatsd line'.
1 parent 63eded0 commit 3662eca

4 files changed

Lines changed: 58 additions & 12 deletions

File tree

test/antithesis/harness/src/bin/first_sample_config/config.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,13 +163,25 @@ pub(crate) struct DogStatsdConfig {
163163
dogstatsd_stats_enable: bool,
164164
}
165165

166+
/// Receive-buffer size in bytes. Mostly realistic so delivery actually happens,
167+
/// rarely tiny or wild so the truncation edge still gets probed. A sampled `0`
168+
/// gives ADP a 4-byte buffer that silently drops every line and vacuously
169+
/// satisfies the delivery anchors, so keep `0` and sub-128 values rare.
170+
fn sample_buffer_size<R: Rng + ?Sized>(rng: &mut R) -> u64 {
171+
if rng.random_ratio(1, 16) {
172+
Probe.sample(rng)
173+
} else {
174+
rng.random_range(128..=65_536)
175+
}
176+
}
177+
166178
impl DogStatsdConfig {
167179
/// Sample the `DogStatsD` options from `rng`, taking the socket from the
168180
/// environment.
169181
fn sample<R: Rng + ?Sized>(rng: &mut R, dogstatsd_socket: &Path) -> Self {
170182
Self {
171183
dogstatsd_socket: dogstatsd_socket.to_path_buf(),
172-
dogstatsd_buffer_size: Probe.sample(rng),
184+
dogstatsd_buffer_size: sample_buffer_size(rng),
173185
dogstatsd_so_rcvbuf: Probe.sample(rng),
174186
dogstatsd_packet_buffer_size: Probe.sample(rng),
175187
dogstatsd_packet_buffer_flush_timeout: Probe.sample(rng),

test/antithesis/harness/src/bin/parallel_driver_send_dogstatsd.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,18 +58,22 @@ fn main() -> anyhow::Result<()> {
5858

5959
let producer = thread::spawn(move || {
6060
let mut rng = UnwrapErr(AntithesisRng);
61+
let mut multi_value = false;
6162
for _ in 0..count {
6263
let vibe = match batch {
6364
Batch::Clean => dogstatsd::Vibe::Clean,
6465
Batch::Feral => dogstatsd::Vibe::Feral,
6566
Batch::Mixed => dogstatsd::sample_vibe(),
6667
};
6768
let mut line = Vec::new();
68-
dogstatsd::send(&mut rng, &mut line, vibe);
69+
if dogstatsd::send(&mut rng, &mut line, vibe) {
70+
multi_value = true;
71+
}
6972
if tx.send(line).is_err() {
7073
break;
7174
}
7275
}
76+
multi_value
7377
});
7478

7579
let consumer = thread::spawn(move || {
@@ -82,7 +86,7 @@ fn main() -> anyhow::Result<()> {
8286
attempted
8387
});
8488

85-
producer.join().expect("producer thread panicked");
89+
let multi_value = producer.join().expect("producer thread panicked");
8690
let attempted = consumer.join().expect("consumer thread panicked");
8791

8892
assert_reachable!(
@@ -91,7 +95,12 @@ fn main() -> anyhow::Result<()> {
9195
);
9296
assert_sometimes!(
9397
attempted > 0,
94-
"workload delivered a dogstatsd line",
98+
"workload sent a dogstatsd line",
99+
&json!({ "attempted": attempted })
100+
);
101+
assert_sometimes!(
102+
multi_value,
103+
"workload emitted a multi-value metric",
95104
&json!({ "attempted": attempted })
96105
);
97106
assert_sometimes!(

test/antithesis/harness/src/payload/dogstatsd.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,18 @@ fn choose_message<R: Rng + ?Sized>(rng: &mut R) -> Message {
101101
}
102102

103103
/// Write one `DogStatsD` message of a sampled type to `buf` at the given vibe.
104-
pub fn send<R: Rng + ?Sized>(rng: &mut R, buf: &mut Vec<u8>, vibe: Vibe) {
104+
/// Returns true when a multi-value packed metric was emitted.
105+
pub fn send<R: Rng + ?Sized>(rng: &mut R, buf: &mut Vec<u8>, vibe: Vibe) -> bool {
105106
buf.clear();
106107
match choose_message(rng) {
107-
Message::Event => events::write(rng, buf, vibe),
108-
Message::ServiceCheck => service_checks::write(rng, buf, vibe),
108+
Message::Event => {
109+
events::write(rng, buf, vibe);
110+
false
111+
}
112+
Message::ServiceCheck => {
113+
service_checks::write(rng, buf, vibe);
114+
false
115+
}
109116
Message::Metric => metrics::write(rng, buf, vibe),
110117
}
111118
}

test/antithesis/harness/src/payload/dogstatsd/metrics.rs

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
use antithesis_sdk::random::random_choice;
44
use rand::distr::Distribution;
5-
use rand::Rng;
5+
use rand::{Rng, RngExt};
66

77
use super::common::{self, Vibe};
88
use crate::rand::{Boundary, Wide};
@@ -49,24 +49,41 @@ enum Ext {
4949
Cardinality,
5050
}
5151

52-
/// Append one metric line `<NAME>:<VALUE>|<TYPE>[|ext...]` to `buf`.
53-
pub(crate) fn write<R: Rng + ?Sized>(rng: &mut R, buf: &mut Vec<u8>, vibe: Vibe) {
52+
/// Append one metric line `<NAME>:<VALUE>|<TYPE>[|ext...]` to `buf`. Returns
53+
/// true when the value was multi-value packed.
54+
pub(crate) fn write<R: Rng + ?Sized>(rng: &mut R, buf: &mut Vec<u8>, vibe: Vibe) -> bool {
5455
common::write_words(rng, buf, vibe);
5556
buf.push(b':');
56-
write_value(rng, buf, vibe);
57+
let packed = write_value(rng, buf, vibe);
5758
buf.push(b'|');
5859
if let Some(&t) = random_choice(METRIC_TYPES) {
5960
buf.extend_from_slice(t);
6061
}
6162
common::write_tags(rng, buf, vibe);
6263
write_extensions(rng, buf, vibe);
6364
buf.push(b'\n');
65+
packed
6466
}
6567

6668
/// Clean: a wide log-uniform value. Feral: an aberrant literal, a wide integer,
6769
/// or a wide float in a compact or cursed-but-equivalent expanded encoding.
68-
fn write_value<R: Rng + ?Sized>(rng: &mut R, buf: &mut Vec<u8>, vibe: Vibe) {
70+
/// ~5% of the time emits a multi-value `:`-packed run, which returns true.
71+
fn write_value<R: Rng + ?Sized>(rng: &mut R, buf: &mut Vec<u8>, vibe: Vibe) -> bool {
6972
let mut ryu = ryu::Buffer::new();
73+
74+
// Multi-value packed: `v1:v2:...`, the codec's colon-split path. Low rate.
75+
if rng.random_range(0..20u8) == 0 {
76+
let extra = rng.random_range(1..=4u8);
77+
for i in 0..=extra {
78+
if i > 0 {
79+
buf.push(b':');
80+
}
81+
let v: f64 = Wide.sample(rng);
82+
buf.extend_from_slice(ryu.format(v).as_bytes());
83+
}
84+
return true;
85+
}
86+
7087
match vibe {
7188
Vibe::Clean => {
7289
let v: f64 = Wide.sample(rng);
@@ -89,6 +106,7 @@ fn write_value<R: Rng + ?Sized>(rng: &mut R, buf: &mut Vec<u8>, vibe: Vibe) {
89106
}
90107
},
91108
}
109+
false
92110
}
93111

94112
/// A boundary-sampled count of extension fields, each a random kind. Repeats and

0 commit comments

Comments
 (0)