Skip to content

benchmarking/nighthawk-egress: add egress spec and counter parser - #3707

Draft
Yuan Gao (ygao-g) wants to merge 7 commits into
agent-substrate:mainfrom
ygao-g:nighthawk-egress-b1-lib
Draft

Yuan Gao (ygao-g) wants to merge 7 commits into
agent-substrate:mainfrom
ygao-g:nighthawk-egress-b1-lib

Conversation

@ygao-g

@ygao-g Yuan Gao (ygao-g) commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator

The egress gateway has a manual Nighthawk setup, but no benchmark that searches for its capacity. Such a benchmark needs a load definition for each egress mode: http, mitm and passthrough. It also needs proof that the load went through the gateway path of that mode. A rate that is measured on another path is not a capacity of the mode.

A new library, with tests, provides both parts. The first part builds the adaptive Nighthawk session for each mode, with the TLS settings of that mode. The second part reads the gateway counters from before and after a run, and adds the differences and four checks to the capacity summary. The checks are ext_proc_invariant_ok, mode_exclusivity_ok, forward_proxy_overflow_ok and gateway_counter_reset. Nothing calls the library until the runner is added. In the shared Nighthawk library, a tail_latency_slo_ms of 0 now disables the latency threshold, as the nighthawk-ingress README states.

Part of #3624

AI use: AI-assisted for the diff, the split and the test runs; I reviewed the diff.

  • Tests pass
  • Docs updated (none needed)

…f nighthawk-ingress

Move nighthawk-ingress/output.py to nighthawk_common unchanged so
nighthawk-egress can reuse it. The ingress Dockerfile copies the package
into the image and the ingress tests put benchmarking/ on sys.path.

Signed-off-by: Yuan Gao <ypgao@google.com>
… out of nighthawk-ingress

Move nighthawk-ingress/spec.py to nighthawk_common unchanged and point its importers at the new path. actors.py imported it without using it.

Signed-off-by: Yuan Gao <ypgao@google.com>
…ut of nighthawk_common

build_session_spec in nighthawk_common now takes a finished traffic template. The router SNI, the certificate paths and build_spec_dict, which assembles that template, move back to nighthawk-ingress/spec.py.

Signed-off-by: Yuan Gao <ypgao@google.com>
Nighthawk divides achieved-rps and send-rate by execution_duration
truncated to whole seconds, so a stage that overran its nominal length
by a fraction of a second read high, by up to 1/N for an N-second
stage. stage_rows() now computes both from the exact duration and keeps
Nighthawk's values under the *_cpp keys. Stage verdicts come from
Nighthawk's threshold scores and do not change. The nighthawk-ingress
README notes how far runs recorded before this change read high.

Each stage row also records the queue_to_connect and sequencer.blocking
statistics and the latency pstdev, so a client-side stall can be told
apart from gateway latency. The tests for the new behavior live in
benchmarking/nighthawk_common/tests; the ingress suite is unchanged.

Signed-off-by: Yuan Gao <ypgao@google.com>
Rename _builtin_key, _global_result and _counters to builtin_key,
global_result and counters, because nighthawk-egress/output.py imports
them in the next commit. capacity_summary() takes actors as an optional
argument and emits it only when given, since the egress benchmark has no
actor fleet. build_session_spec() treats a tail_latency_slo_ms of 0 as
disabled, as the ingress README documents.

Signed-off-by: Yuan Gao <ypgao@google.com>
@ygao-g

Copy link
Copy Markdown
Collaborator Author

Stack: #3628, then #3711, then this PR. Review the last three commits. The diff of this PR alone is at https://github.com/ygao-g/substrate/pull/86/files

hack/verify/benchmarking-python.sh passes at the head: nighthawk-egress 7 passed and 22 subtests passed, nighthawk_common 2 passed, nighthawk-ingress 12 passed.

The counter snapshots under tests/testdata come from GKE runs, one before and after pair for each mode. Each file keeps only the series that the parser reads.

…nter parser

Define the egress-specific failure predicates and Nighthawk template
for the adaptive load search, targeting the atenet-egress gateways.
Add the prometheus output parser for the egress metrics.

Signed-off-by: Yuan Gao <ypgao@google.com>
benchmarking/nighthawk-egress/tests covers spec.py and output.py. Add
the suite to benchmarking-python.sh so it runs with the other
benchmarking suites.

Signed-off-by: Yuan Gao <ypgao@google.com>

This branch has not been deployed

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant