Repository navigation
Meter proxy traffic per run and stop at a 10 MB budget - #7
Merged
Merged
Conversation
A run through a local proxy now counts the bytes it moves (Playwright request.sizes(), CDP encodedDataLength in pyppeteer and Selenium). The shared page loop, and every --concurrency worker, stops once --proxy-budget-mb (default 10, 0 = no cap) is exceeded, with stop_reason proxy_budget_exceeded (exit 6 with rows, 5 without), and records proxy_bytes / proxy_budget_bytes / proxy_budget_exceeded in <out>.meta.json and <out>.latest_attempt.meta.json. The canary passes the budget explicitly, reports each run's traffic in the step summary and fails when the cap was hit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CKsd7q25N19WzUZjrAdzx8
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
A residential proxy is billed by the byte, and a run had no idea how many bytes it had used. A retry loop, a long walk of pages or a
--concurrencyrun across several workers could spend a proxy balance with no record anywhere except the provider's invoice. Nothing capped it either.What changes
Only when traffic goes through a local proxy (
--proxy/--proxy-file/WEBMOTORS_PROXY). Nothing changes without a proxy or over--cdp-endpoint(the 2Captcha Scraping Browser API has its own billing).proxy_meter.py), installed by each engine on every browser it opens, every worker's included. All of them count into one budget per run.request.sizes()(request headers + body, response headers + body) onrequestfinished/requestfailed.Network.loadingFinished.encodedDataLength(bytes received, headers included) plus each request's line, headers and body fromNetwork.requestWillBeSent, on a CDP session of its own. Requests the browser blocked itself (--block-media) cost nothing.fetch(), and before the driver quits.--proxy-budget-mb(default 10,0= no cap,WEBMOTORS_PROXY_BUDGET_MB). Negative or non-numeric values are a usage error (exit 2). An unparseable env value stops the run rather than falling back. The check lives in the shared loop (page_flow), so the three engines cannot drift. Once the total is over the budget:Network.setBlockedURLs ["*"].fetch_one_pagestops before its next landing or API request.--concurrencyworker stops at its next request and returns its page to the queue, so that page is reported unattempted, not fetched.stop_reason: proxy_budget_exceeded, exit 6 with rows and exit 5 without.BaseException, so a worker's broadexcept Exceptioncannot swallow it.proxy_bytes,proxy_budget_bytes(nullwith no cap) andproxy_budget_exceededgo in<out>.meta.json. Every metered run also writes<out>.latest_attempt.meta.json, so a run that wrote no rows still records what it spent. Without a proxy no such file is written, as before. The log ends withProxy traffic: X.X MB of Y MB budget.--proxy-budget-mb 10. After each run,.github/proxy_traffic.pyappends**search**: proxy traffic X.X MB of 10 MB(or "not metered" overWEBMOTORS_CDP_ENDPOINT, "unknown" when there is no sidecar) to$GITHUB_STEP_SUMMARY. When the cap was hit it prints::error::stopped: proxy budget 10 MB exceededand fails.--block-media. Rows come from the JSON API, so pages are small, but the landing renders the site. If a run reaches 10 MB the canary goes red with that message, which is the intended signal.--help,.env.example(commented out, like the other optional settings), Dockerfile COPY list, CHANGELOG[Unreleased].Evidence
Offline suite, core-only venv:
python smoke_test.py→ 537 checks passed, 0 failed, and.github/ci_checks.py --all→ OK. The new checks cover:sizes()and CDP events (exact byte counts), plus blocked, failed and redirect cases;fetch_one_pagemakes no request at all, not even the landing;Engine venvs (playwright 1.64, pyppeteer, selenium; no browser download), with the opt-in real-browser check (
PROXY_METER_BROWSER=1, local Chromium): 565 / 553 / 553 checks passed, 0 failed.Real browser (the shared
proxy_meterinstall functions the engines call), through a local stub proxy that counted every byte it carried (60 kB page + 30 kB CSS + 90 kB JS):Past a 0.15 MB budget, a request the page made never reached the proxy, and
check()stopped the run.Planted-fault controls. Each went red on the named check and was green again after restoring:
proxy_meter.checkmade a no-op: the sequential and concurrent checks;No proxy, no paid call and no canary dispatch was used.
Not changed
--cdp-endpoint.🤖 Generated with Claude Code
https://claude.ai/code/session_01CKsd7q25N19WzUZjrAdzx8