Skip to content

Commit c5a0e4b

Browse files
ZhiXiao-LinRoyLin
andauthored
v0.9.3 — soak validation + test coverage (72→79.6%) (#1)
* test: cover all 14 SNI provider mappings + no-SNI case Classifier (the LLM-detection core) only tested 6/14 providers; add Gemini/Cohere/XAi/Groq/ Together/Perplexity/Fireworks/OpenRouter + the None-SNI path. traits.rs classify fully covered; lib total 78->79.6%. * release: v0.9.3 — soak validation + test coverage; add README Tested section 0.9.2 -> 0.9.3 (test/docs only, no runtime change). CHANGELOG records the 15-case soak suite (observe + intervene) and the 72->79.6% lib coverage; README gains a Tested section. --------- Co-authored-by: RoyLin <roylin@RoyLindeMacBook-Pro.local>
1 parent 7f0c4fd commit c5a0e4b

8 files changed

Lines changed: 60 additions & 8 deletions

File tree

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,18 @@
22

33
All notable changes to a3s-observer will be documented in this file.
44

5+
## [0.9.3] — soak validation + test coverage (no runtime change)
6+
7+
### Tested
8+
9+
- Full-stack soak validation — 15 cases, leak-free and correct under load on a prod host + an
10+
isolated VM. Observe: steady 20 min, edge-input, a real a3s-code agent, throughput (110k ev/60s),
11+
memory-bound (256 Mi), restart ×8, idle + heartbeat, SIGTERM, concurrent collectors,
12+
backpressure, connection-churn. Intervene: egress, file/exec, and SSL-content guards — plus all
13+
three running alongside the collector.
14+
- Lib line coverage 72% → **79.6%** (`cargo llvm-cov`): adversarial SNI/DNS parser tests, the
15+
cgroup→pod parser, the full 14-provider SNI classifier, and the v0.9.2 writer-thread path.
16+
517
## [0.9.2] — fix: output backpressure no longer stalls the event loop
618

719
### Fixed

Cargo.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "a3s-observer"
3-
version = "0.9.2"
3+
version = "0.9.3"
44
edition = "2021"
55
license = "MIT"
66
description = "General-purpose, language-agnostic eBPF observability for AI agents (LLM calls, tools, files, network egress)."

README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,19 @@ a3s-observer → NDJSON → OTel Collector (filelog → OTLP) → your bac
194194

195195
Rust + [Aya](https://aya-rs.dev). Validated on Linux 6.8.
196196

197+
## Tested
198+
199+
Soak-tested under sustained load — observe on a production host, intervene in an isolated VM:
200+
201+
| path | cases (all leak-free + correct under load) |
202+
|---|---|
203+
| **observe** | steady 20 min · edge-input · **a real a3s-code agent** · throughput 110k ev/60s · memory-bound (256 Mi) · restart ×8 · idle + heartbeat · SIGTERM · concurrent collectors · backpressure · connection-churn |
204+
| **intervene** | egress · file/exec · SSL-content guards — and all three running alongside the collector |
205+
206+
Two robustness bugs surfaced and were fixed this way: NDJSON stdout pollution (v0.9.1) and an
207+
output-backpressure event-loop stall (v0.9.2). Lib line coverage **79.6%** (`cargo llvm-cov`) —
208+
the untrusted SNI / DNS / cgroup parsers and the full 14-provider classifier are unit-tested.
209+
197210
## Security
198211

199212
Privileged component — see [SECURITY.md](SECURITY.md) for the disclosure policy and how to

a3s-observer-collector/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "a3s-observer-collector"
3-
version = "0.9.2"
3+
version = "0.9.3"
44
edition = "2021"
55
license = "MIT"
66
description = "a3s-observer collector: loads the eBPF probes and exports enriched events."

a3s-observer-common/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "a3s-observer-common"
3-
version = "0.9.2"
3+
version = "0.9.3"
44
edition = "2021"
55
license = "MIT"
66
description = "Shared no_std types crossing the eBPF <-> userspace boundary for a3s-observer."

a3s-observer-ebpf/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "a3s-observer-ebpf"
3-
version = "0.9.2"
3+
version = "0.9.3"
44
edition = "2021"
55
license = "MIT"
66
publish = false

src/traits.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,33 @@ mod tests {
276276
c.classify(Some("bedrock-runtime.us-east-1.amazonaws.com"), ip),
277277
Some(Provider::Bedrock)
278278
);
279+
assert_eq!(
280+
c.classify(Some("generativelanguage.googleapis.com"), ip),
281+
Some(Provider::Gemini)
282+
);
283+
assert_eq!(
284+
c.classify(Some("api.cohere.ai"), ip),
285+
Some(Provider::Cohere)
286+
);
287+
assert_eq!(c.classify(Some("api.x.ai"), ip), Some(Provider::XAi));
288+
assert_eq!(c.classify(Some("api.groq.com"), ip), Some(Provider::Groq));
289+
assert_eq!(
290+
c.classify(Some("api.together.xyz"), ip),
291+
Some(Provider::Together)
292+
);
293+
assert_eq!(
294+
c.classify(Some("api.perplexity.ai"), ip),
295+
Some(Provider::Perplexity)
296+
);
297+
assert_eq!(
298+
c.classify(Some("api.fireworks.ai"), ip),
299+
Some(Provider::Fireworks)
300+
);
301+
assert_eq!(
302+
c.classify(Some("openrouter.ai"), ip),
303+
Some(Provider::OpenRouter)
304+
);
305+
assert_eq!(c.classify(None, ip), None); // no SNI → unclassified
279306
assert_eq!(c.classify(Some("example.com"), ip), None);
280307
}
281308

0 commit comments

Comments
 (0)