Repository navigation
refactor(relay): render /metrics through prometheus-client - #7363
Conversation
Quest-Claim: 355f70a54807ca92
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The relay's /metrics endpoint now encodes through prometheus-client 0.25.1 instead of hand-written text exposition. Each scrape still reads a snapshot of the existing atomics and encodes it through a per-scrape collector, so nothing on the hot path changes. Every series keeps its name, labels, type, and value; the series golden test passes unchanged apart from comparing labels as a set, since the crate writes a histogram's `le` first. The exposition is now OpenMetrics text: the content type is application/openmetrics-text, counter families are named without `_total` in HELP/TYPE (samples keep it), floats print as `0.0`, and histogram bounds as `le="1.0"`. The crate writes label values verbatim, so `Label` still escapes them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 6 minutes. View limit details
No actionable comments were generated in the recent review.
|
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Landing. Maintainer decision (2026-10-30): accept the OpenMetrics format changes. Reporting (Written by Claude Opus 5.5) |
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed commit: 206b388
No actionable bugs found in the changed areas. The direction is sound: retain the existing counters/snapshot model and delegate exposition to the maintained encoder, without introducing a second hot-path registry. The label-escaping wrapper and cumulative-to-per-bucket histogram adapter are justified; the golden-series and nonzero-histogram tests cover the main migration risks. The explicitly accepted OpenMetrics metadata/content-type and histogram-bound formatting changes are compatibility tradeoffs, not new findings.
Verification: static review of the diff, surrounding renderer and histogram source, and existing review threads. I did not run builds/tests or validate a live Prometheus scrape.
|
quest land removed this pull request from the queue: the batch check failed (exit 1). test_core 0.6.20 (0.6.21 available)
vm_service 15.3.0 (15.4.0 available)
web 1.1.1 (1.1.2 available)
Got dependencies!
14 packages have newer versions incompatible with dependency constraints.
Try `dart pub outdated` for more information.
Resolving dependencies...
Downloading packages...
_fe_analyzer_shared 105.0.0 (111.0.0 available)
analyzer 14.1.0 (14.7.0 available)
code_assets 2.0.0 (2.1.0 available)
coverage 1.15.1 (1.16.0 available)
crypto 3.0.7 (3.0.8 available)
frontend_server_client 4.0.0 (4.2.0 available)
http_multi_server 3.2.2 (3.2.3 available)
! moq_ffi 0.0.0-dev from path ../moq_ffi (overridden)
shelf 1.4.2 (1.4.3 available)
shelf_static 1.1.3 (1.2.0 available)
test 1.32.0 (1.33.0 available)
test_api 0.7.14 (0.7.15 available)
test_core 0.6.20 (0.6.21 available)
vm_service 15.3.0 (15.4.0 available)
web 1.1.1 (1.1.2 available)
Got dependencies!
14 packages have newer versions incompatible with dependency constraints.
Try `dart pub outdated` for more information.
Publishing moq 0.1.0 to https://pub.dev:
├── CHANGELOG.md (<1 KB)
├── LICENSE (1 KB)
├── MIGRATE.md (16 KB)
├── README.md (1 KB)
├── analysis_options.yaml (<1 KB)
├── bench
│ └── ffi.dart (5 KB)
├── lib
│ ├── audio.dart (2 KB)
│ ├── json.dart (2 KB)
│ ├── media.dart (4 KB)
│ ├── moq.dart (<1 KB)
│ ├── src
│ │ ├── aliases.dart (7 KB)
│ │ ├── client.dart (10 KB)
│ │ ├── durations.dart (<1 KB)
│ │ ├── epoch.dart (<1 KB)
│ │ ├── server.dart (5 KB)
│ │ ├── stream.dart (2 KB)
│ │ └── version.dart (<1 KB)
│ └── video.dart (3 KB)
├── pubspec.yaml (<1 KB)
└── test
├── cancellation_test.dart (7 KB)
├── docs
│ ├── prelude.dart (<1 KB)
│ └── samples.dart (4 KB)
└── moq_test.dart (24 KB)
Total compressed archive size: 29 KB.
Validating package...
Package validation found the following hint:
* Non-dev dependencies are overridden in pubspec.yaml.
This indicates you are not testing your package against the same versions of its
dependencies that users will have when they use it.
This might be necessary for packages with cyclic dependencies.
Please be extra careful when publishing.
The server may enforce additional checks.
Package has 0 warnings and 1 hint.
ci: check gh failed
ci: seconds per module
176 check py
32 test py
460 check rs
304 test rs
937 check rs_shapes
223 check c
158 check cpp
19 check obs_compile
213 check js
49 test js
31 check markdown
2 check gh (failed)
103 check kt
84 check flake
0 check swift
330 check go
1 check drill
3 check quest
1 check obs
1 check ts_paths
18 check shell
1 check large_files
4 check toml
1 check nix
0 check justfile
211 check dart
1912 wall time
error: recipe `ci` failed on line 104 with exit code 1
. |
|
Codex land fixer: …inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-pattern#0.1.2 not found in Cargo.lock �[2m2026-10-31T05:08:12.510300Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-loc#0.2.19 not found in Cargo.lock �[2m2026-10-31T05:08:12.531747Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-msf#0.5.1 not found in Cargo.lock �[2m2026-10-31T05:08:12.558253Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/hang#0.21.11 not found in Cargo.lock �[2m2026-10-31T05:08:12.558290Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/kio#0.6.2 not found in Cargo.lock �[2m2026-10-31T05:08:12.558299Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/kio/macros#kio-macros@0.1.0 not found in Cargo.lock �[2m2026-10-31T05:08:12.558307Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-clock#0.11.0 not found in Cargo.lock �[2m2026-10-31T05:08:12.558315Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-clock/macros#moq-clock-macros@0.1.0 not found in Cargo.lock �[2m2026-10-31T05:08:12.558330Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-json#0.5.8 not found in Cargo.lock �[2m2026-10-31T05:08:12.558338Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-loc#0.2.19 not found in Cargo.lock �[2m2026-10-31T05:08:12.558346Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-msf#0.5.1 not found in Cargo.lock �[2m2026-10-31T05:08:12.558353Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-mux#0.10.11 not found in Cargo.lock �[2m2026-10-31T05:08:12.558371Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-net#0.3.10 not found in Cargo.lock �[2m2026-10-31T05:08:12.558380Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-nvenc#0.1.2 not found in Cargo.lock �[2m2026-10-31T05:08:12.558387Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-pattern#0.1.2 not found in Cargo.lock �[2m2026-10-31T05:08:12.560927Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-video#0.1.10 not found in Cargo.lock �[2m2026-10-31T05:08:12.582964Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-nvenc#0.1.2 not found in Cargo.lock �[2m2026-10-31T05:08:12.602086Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-v4l#0.1.0 not found in Cargo.lock �[2m2026-10-31T05:08:12.618145Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/libmoq#0.6.12 not found in Cargo.lock �[2m2026-10-31T05:08:12.644467Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/kio#0.6.2 not found in Cargo.lock �[2m2026-10-31T05:08:12.644504Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/kio/macros#kio-macros@0.1.0 not found in Cargo.lock �[2m2026-10-31T05:08:12.644513Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-clock#0.11.0 not found in Cargo.lock �[2m2026-10-31T05:08:12.644522Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-clock/macros#moq-clock-macros@0.1.0 not found in Cargo.lock �[2m2026-10-31T05:08:12.644530Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-net#0.3.10 not found in Cargo.lock �[2m2026-10-31T05:08:12.644547Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-pattern#0.1.2 not found in Cargo.lock �[2m2026-10-31T05:08:12.646871Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-archive#0.0.11 not found in Cargo.lock �[2m2026-10-31T05:08:12.673020Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/hang#0.21.11 not found in Cargo.lock �[2m2026-10-31T05:08:12.673052Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/kio#0.6.2 not found in Cargo.lock �[2m2026-10-31T05:08:12.673061Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/kio/macros#kio-macros@0.1.0 not found in Cargo.lock �[2m2026-10-31T05:08:12.673070Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-clock#0.11.0 not found in Cargo.lock �[2m2026-10-31T05:08:12.673079Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-clock/macros#moq-clock-macros@0.1.0 not found in Cargo.lock �[2m2026-10-31T05:08:12.673087Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-json#0.5.8 not found in Cargo.lock �[2m2026-10-31T05:08:12.673095Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-loc#0.2.19 not found in Cargo.lock �[2m2026-10-31T05:08:12.673107Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-msf#0.5.1 not found in Cargo.lock �[2m2026-10-31T05:08:12.673116Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-mux#0.10.11 not found in Cargo.lock �[2m2026-10-31T05:08:12.673132Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-net#0.3.10 not found in Cargo.lock �[2m2026-10-31T05:08:12.673142Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-pattern#0.1.2 not found in Cargo.lock �[2m2026-10-31T05:08:12.675005Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-audio#0.1.10 not found in Cargo.lock �[2m2026-10-31T05:08:12.700424Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/kio#0.6.2 not found in Cargo.lock �[2m2026-10-31T05:08:12.700463Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/kio/macros#kio-macros@0.1.0 not found in Cargo.lock �[2m2026-10-31T05:08:12.700473Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-clock#0.11.0 not found in Cargo.lock �[2m2026-10-31T05:08:12.700482Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-clock/macros#moq-clock-macros@0.1.0 not found in Cargo.lock �[2m2026-10-31T05:08:12.700490Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-pattern#0.1.2 not found in Cargo.lock �[2m2026-10-31T05:08:12.702902Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/moq-auth#0.2.1 not found in Cargo.lock �[2m2026-10-31T05:08:12.731250Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hash for package ID path+file:///work/rs/kio#0.6.2 not found in Cargo.lock �[2m2026-10-31T05:08:12.731284Z�[0m �[34mDEBUG�[0m �[1mdevelop_cmd�[0m:�[1mbuild_wheels�[0m:�[1mbuild_wheels_inner�[0m:�[1mgenerate�[0m: �[2mcargo_cyclonedx::generator�[0m�[2m:�[0m Hquest: fixer agent exited 101 (written by Codex) |
|
quest land removed this pull request from the queue: the batch check failed (exit 1). Checking rcgen v0.14.10
Checking ashpd v0.13.13
Compiling proc-macro2-diagnostics v0.10.1
Checking http-cache v1.0.0-alpha.8
Checking moq-sock v0.2.0 (/work/rs/moq-sock)
Checking fs-err v3.3.1
Checking p256 v0.14.0
Checking p384 v0.14.0
Checking arboard v3.7.0
Checking reqwest-middleware v0.5.2
Checking web-transport-trait v0.5.2
Checking egui-winit v0.36.2
Checking prometheus-client v0.25.1
Checking axum v0.8.9
Checking axum-server v0.8.0
Checking egui-wgpu v0.36.2
Checking http-cache-reqwest v1.0.0-alpha.9
Checking moq-auth v0.2.1 (/work/rs/moq-auth)
Compiling duplicate v2.0.1
Checking moq-stats v0.2.12 (/work/rs/moq-stats)
Checking eframe v0.36.2
Checking egui_dock v0.21.1
Checking moq-tokio v0.19.23 (/work/rs/moq-tokio)
Checking moq-relay v0.17.2 (/work/rs/moq-relay)
Checking pipewire v0.10.1
Checking cpal v0.18.2
Checking moq-audio v0.1.10 (/work/rs/moq-audio)
Checking moq-scene v0.1.0 (/work/rs/moq-scene)
Checking moq-studio v0.1.0 (/work/rs/moq-studio)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 16.87s
info: running `cargo clippy --locked --tests --all-features -- -D warnings` on moq-wasm (51/52)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.32s
info: running `cargo clippy --locked --tests --all-features -- -D warnings` on uniffi-bindgen (52/52)
Compiling getrandom v0.4.3
Compiling winnow v1.0.4
Compiling uniffi_internal_macros v0.32.2 (https://github.com/kixelated/uniffi-rs?rev=88d835d#88d835d6)
Compiling serde v1.0.229
Compiling libc v0.2.191
Checking indexmap v2.14.2
Compiling fs-err v3.3.1
Compiling askama_parser v0.16.1
Compiling basic-toml v0.1.10
Checking nom v7.1.3
Compiling scroll_derive v0.12.1
Checking smawk v0.3.3
Compiling askama_derive v0.16.1
Checking tempfile v3.27.0
Checking serde_json v1.0.154
Checking weedle2 v5.0.0 (https://github.com/kixelated/uniffi-rs?rev=88d835d#88d835d6)
Checking textwrap v0.16.4
Compiling toml_parser v1.1.3+spec-1.1.0
Checking uniffi_pipeline v0.32.2 (https://github.com/kixelated/uniffi-rs?rev=88d835d#88d835d6)
Checking scroll v0.12.0
Compiling toml_datetime v1.1.1+spec-1.1.0
Checking uniffi_meta v0.32.2 (https://github.com/kixelated/uniffi-rs?rev=88d835d#88d835d6)
Compiling askama_macros v0.16.1
Checking plain v0.2.3
Checking clap_builder v4.6.7
Checking cargo_metadata v0.23.1
Compiling toml v1.1.6+spec-1.1.0
Checking uniffi_udl v0.32.2 (https://github.com/kixelated/uniffi-rs?rev=88d835d#88d835d6)
Checking goblin v0.8.2
Checking askama v0.16.1
Checking clap v4.6.7
Checking uniffi_core v0.32.2 (https://github.com/kixelated/uniffi-rs?rev=88d835d#88d835d6)
Checking uniffi_bindgen v0.32.2 (https://github.com/kixelated/uniffi-rs?rev=88d835d#88d835d6)
Compiling uniffi_macros v0.32.2 (https://github.com/kixelated/uniffi-rs?rev=88d835d#88d835d6)
Checking uniffi v0.32.2 (https://github.com/kixelated/uniffi-rs?rev=88d835d#88d835d6)
Checking uniffi-bindgen v0.1.0 (/work/rs/uniffi-bindgen)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.74s
mbx[cache]: object cache: 1328 hits, 58 misses, 40 not looked up; 0 B downloaded, 0 B uploaded, 192.7 KiB stored locally
mbx[cache]: 2m 41s session; 27m 41s estimated compiler time avoided (summed across compilations)
mbx[cache]: 40 compilations had no usable prior inputs or matching prediction for a lookup
mbx[cache]: Cargo artifact reuse and CI cache archive transfers are not included above
mbx[savings]: every checkout believes it owns 2.5 TiB of outputs. the disk keeps one copy and says nothing.
ci: check quest failed
ci: seconds per module
310 check rs
159 test rs
326 check rs_shapes
170 check obs_compile
498 check js
80 test js
15 check markdown
3 check gh
73 test gh
218 check flake
0 check drill
10 check quest (failed)
4 check obs
12 check ts_paths
48 check shell
1 check large_files
1 check toml
0 check nix
0 check justfile
796 wall time
error: recipe `ci` failed on line 106 with exit code 1
. |
|
codex / Codex land fixer: (written by codex / Codex) |
|
quest land removed this pull request from the queue: GitHub refused /repos/moq-dev/moq/pulls/7363: Pull Request has merge conflicts; the rest of the batch was not merged. |
|
codex / Codex land fixer: (written by codex / Codex) |
|
quest land removed this pull request from the queue: the batch check failed (exit 101). moq-doc:check | (pass) tables render as tables > draft-lcurley-moq-epoch [4.95ms]
moq-doc:check | (pass) tables render as tables > draft-lcurley-moq-flate [4.33ms]
moq-doc:check | (pass) tables render as tables > draft-lcurley-moq-hang [38.46ms]
moq-doc:check | (pass) tables render as tables > draft-lcurley-moq-hidden [6.51ms]
moq-doc:check | (pass) tables render as tables > draft-lcurley-moq-ietf [9.82ms]
moq-doc:check | (pass) tables render as tables > draft-lcurley-moq-lite [54.98ms]
moq-doc:check | (pass) tables render as tables > draft-lcurley-moq-mpegts [17.77ms]
moq-doc:check | (pass) tables render as tables > draft-lcurley-moq-probe [6.17ms]
moq-doc:check | (pass) tables render as tables > draft-lcurley-moq-sign [4.93ms]
moq-doc:check | (pass) tables render as tables > draft-lcurley-moq-solicit [4.24ms]
moq-doc:check | (pass) tables render as tables > draft-lcurley-moq-timestamp [5.23ms]
moq-doc:check | (pass) tables render as tables > draft-lcurley-moq-use-cases [9.06ms]
moq-doc:check | (pass) tables render as tables > draft-lcurley-qmux-websocket [4.76ms]
moq-doc:check | (pass) tables render as tables > row separators do not split a table apart [88.83ms]
moq-doc:check |
moq-doc:check | .vitepress/api/index.test.ts:
moq-doc:check | (pass) a rendered workspace > each entrypoint gets a page named by its import specifier [9.10ms]
moq-doc:check | (pass) a rendered workspace > a re-export from another workspace package links to its owner [8.68ms]
moq-doc:check | (pass) a rendered workspace > an external re-export is documented under each public name [3.71ms]
moq-doc:check | (pass) a rendered workspace > a namespace export keeps its public name [3.65ms]
moq-doc:check | (pass) a rendered workspace > a hidden declaration is documented under the alias that re-exports it [3.99ms]
moq-doc:check | �[93m[warning]�[0m Value, defined in @test/hidden/src/access.ts, is referenced by read but not included in the documentation
moq-doc:check | �[93m[warning]�[0m Value, defined in @test/hidden/src/access.ts, is referenced by read but not included in the documentation
moq-doc:check | (pass) an unexported declaration that a public one names fails the run [582.31ms]
moq-doc:check | �[93m[warning]�[0m Failed to resolve link to "Missing" in comment for value
moq-doc:check | (pass) a link that does not resolve fails the run [453.08ms]
moq-doc:check |
moq-doc:check | concept/audio-jitter/corpus.test.ts:
moq-doc:check | (pass) audio jitter corpus > paced > matches the checked-in file [0.22ms]
moq-doc:check | (pass) audio jitter corpus > paced > is a trace of equal-length clocks [0.05ms]
moq-doc:check | (pass) audio jitter corpus > paced > arrives in a monotonic order [1.75ms]
moq-doc:check | (pass) audio jitter corpus > paced > names a target for the first frame [0.03ms]
moq-doc:check | (pass) audio jitter corpus > paced > reports every target as a change [0.11ms]
moq-doc:check | (pass) audio jitter corpus > flush > matches the checked-in file [0.05ms]
moq-doc:check | (pass) audio jitter corpus > flush > is a trace of equal-length clocks
moq-doc:check | (pass) audio jitter corpus > flush > arrives in a monotonic order [0.60ms]
moq-doc:check | (pass) audio jitter corpus > flush > names a target for the first frame
moq-doc:check | (pass) audio jitter corpus > flush > reports every target as a change [0.02ms]
moq-doc:check | (pass) audio jitter corpus > advertised > matches the checked-in file [0.05ms]
moq-doc:check | (pass) audio jitter corpus > advertised > is a trace of equal-length clocks
moq-doc:check | (pass) audio jitter corpus > advertised > arrives in a monotonic order [0.38ms]
moq-doc:check | (pass) audio jitter corpus > advertised > names a target for the first frame
moq-doc:check | (pass) audio jitter corpus > advertised > reports every target as a change
moq-doc:check | (pass) audio jitter corpus > buildup > matches the checked-in file [0.07ms]
moq-doc:check | (pass) audio jitter corpus > buildup > is a trace of equal-length clocks
moq-doc:check | (pass) audio jitter corpus > buildup > arrives in a monotonic order [0.61ms]
moq-doc:check | (pass) audio jitter corpus > buildup > names a target for the first frame
moq-doc:check | (pass) audio jitter corpus > buildup > reports every target as a change [0.03ms]
moq-doc:check | (pass) audio jitter corpus > reorder > matches the checked-in file [0.04ms]
moq-doc:check | (pass) audio jitter corpus > reorder > is a trace of equal-length clocks
moq-doc:check | (pass) audio jitter corpus > reorder > arrives in a monotonic order [0.40ms]
moq-doc:check | (pass) audio jitter corpus > reorder > names a target for the first frame
moq-doc:check | (pass) audio jitter corpus > reorder > reports every target as a change
moq-doc:check | (pass) audio jitter corpus > backlog > matches the checked-in file [0.07ms]
moq-doc:check | (pass) audio jitter corpus > backlog > is a trace of equal-length clocks
moq-doc:check | (pass) audio jitter corpus > backlog > arrives in a monotonic order [0.72ms]
moq-doc:check | (pass) audio jitter corpus > backlog > names a target for the first frame
moq-doc:check | (pass) audio jitter corpus > backlog > reports every target as a change [0.01ms]
moq-doc:check | (pass) audio jitter corpus > idle > matches the checked-in file [0.04ms]
moq-doc:check | (pass) audio jitter corpus > idle > is a trace of equal-length clocks
moq-doc:check | (pass) audio jitter corpus > idle > arrives in a monotonic order [0.25ms]
moq-doc:check | (pass) audio jitter corpus > idle > names a target for the first frame
moq-doc:check | (pass) audio jitter corpus > idle > reports every target as a change [0.01ms]
moq-doc:check | (pass) audio jitter corpus > tunein > matches the checked-in file [0.06ms]
moq-doc:check | (pass) audio jitter corpus > tunein > is a trace of equal-length clocks
moq-doc:check | (pass) audio jitter corpus > tunein > arrives in a monotonic order [0.36ms]
moq-doc:check | (pass) audio jitter corpus > tunein > names a target for the first frame
moq-doc:check | (pass) audio jitter corpus > tunein > reports every target as a change
moq-doc:check | (pass) audio jitter corpus > spike > matches the checked-in file [0.09ms]
moq-doc:check | (pass) audio jitter corpus > spike > is a trace of equal-length clocks
moq-doc:check | (pass) audio jitter corpus > spike > arrives in a monotonic order [0.75ms]
moq-doc:check | (pass) audio jitter corpus > spike > names a target for the first frame
moq-doc:check | (pass) audio jitter corpus > spike > reports every target as a change [0.02ms]
moq-doc:check | (pass) audio jitter corpus > straggler > matches the checked-in file [0.09ms]
moq-doc:check | (pass) audio jitter corpus > straggler > is a trace of equal-length clocks
moq-doc:check | (pass) audio jitter corpus > straggler > arrives in a monotonic order [0.49ms]
moq-doc:check | (pass) audio jitter corpus > straggler > names a target for the first frame
moq-doc:check | (pass) audio jitter corpus > straggler > reports every target as a change [0.01ms]
moq-doc:check | (pass) audio jitter corpus > fixed > matches the checked-in file [0.03ms]
moq-doc:check | (pass) audio jitter corpus > fixed > is a trace of equal-length clocks [0.03ms]
moq-doc:check | (pass) audio jitter corpus > fixed > arrives in a monotonic order [0.56ms]
moq-doc:check | (pass) audio jitter corpus > fixed > names a target for the first frame [0.01ms]
moq-doc:check | (pass) audio jitter corpus > fixed > reports every target as a change [0.02ms]
moq-doc:check |
moq-doc:check | 134 pass
moq-doc:check | 0 fail
moq-doc:check | 15964 expect() calls
moq-doc:check | Ran 134 tests across 3 files. [5.46s]
error: recipe `check-changed` failed on line 31 with exit code 143
ci: check rs failed
ci: seconds per module
126 check rs (failed)
127 check js (cancelled)
68 check flake
1 check drill
8 check quest
4 check ts_paths
45 check shell (cancelled)
128 wall time
error: recipe `ci` failed on line 107 with exit code 101
. |
|
codex / Codex land fixer: (written by codex / Codex) |
|
quest land: this pull request conflicts with a pull request queued ahead of it, in these files:
Once one of them lands, this one conflicts with the base and is ejected when its turn comes. Resolve the overlap before then, such as by coordinating with that author, or by merging the base once it lands. |
|
quest land removed this pull request from the queue: the batch check failed (exit 100). ----------------------------------------------------------------------
Ran 30 tests in 25.778s
OK
python3 sh/dispatch-query.test.py --bench
ci: 1 paths, median 342.2 ms
ci: 100 paths, median 395.8 ms
ci: 1000 paths, median 371.9 ms
python3 sh/gh/test-inventory.test.py
..........
----------------------------------------------------------------------
Ran 10 tests in 4.081s
OK
bun test sh/gh/setup.test.ts
bun test v1.4.2 (744846f84)
sh/gh/setup.test.ts:
(pass) check queries before setup and keeps its required check name [1.16ms]
(pass) check keeps release checks on a hosted runner [0.03ms]
(pass) self-hosted queue jobs use local caches without R2 credentials [1.04ms]
(pass) one job runs one CI dispatch with one checkout and cache restore [0.14ms]
(pass) nightly fuzzing restores and saves minimized target-specific corpora [1.36ms]
5 pass
0 fail
59 expect() calls
Ran 5 tests across 1 file. [103.00ms]
bun sh/gh/queue.test.ts
queue event policy passed
python3 sh/gh/install-formula.test.py
.
----------------------------------------------------------------------
Ran 1 test in 0.343s
OK
sh/gh/release.test.sh
release.sh ffi-unreleased: ok
python3 sh/gh/ffi.test.py
............
----------------------------------------------------------------------
Ran 12 tests in 5.867s
OK
bun test sh/gh/ffi.test.ts sh/gh/cpp.test.ts
bun test v1.4.2 (744846f84)
sh/gh/cpp.test.ts:
(pass) OBS builds on branch dry runs, and on tags only after the C++ release succeeds [7.93ms]
sh/gh/ffi.test.ts:
(pass) shared default builds cover each consumer exactly once [7.38ms]
(pass) wrapper gates preserve trusted tag inputs and inspect only their publisher [5.56ms]
(pass) privileged workflow_run jobs require a protected release tag before running its code [6.00ms]
(pass) Nightly and alert chains retain packaged outputs with one shared producer [5.37ms]
5 pass
0 fail
113 expect() calls
Ran 5 tests across 2 files. [116.00ms]
python3 sh/rs/package-rename.test.py
using deb packager...
created package: /tmp/tmpr8hkk_oj/moq-nfpm.deb
using deb packager...
created package: /tmp/tmpr8hkk_oj/moq-transition.deb
using rpm packager...
created package: /tmp/tmpr8hkk_oj/moq-nfpm.rpm
.
----------------------------------------------------------------------
Ran 1 test in 1.470s
OK
python3 sh/dart/build.test.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.581s
OK
python3 sh/rs/select.test.py
...error: recipe `test` was terminated on line 59 by signal 15
ci: test rs failed
ci: seconds per module
132 check rs
206 test rs (failed)
166 check js
14 test js
77 check markdown
13 check gh
68 test gh (cancelled)
67 check flake
1 check drill
8 check quest
1 check ts_paths
15 check shell
1 check large_files
2 check toml
0 check nix
0 check justfile
338 wall time
error: recipe `ci` failed on line 107 with exit code 100
. |
|
codex / Codex land fixer: (written by codex / Codex) |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
main renders /metrics through prometheus-client now (#7363), so the demux drop counter becomes an `encode_demux` family on `Scrape`, and the pinned series test covers it. Also rename the two `kio::Producer::is_used` calls to `wanted`, which #7036 renamed; the previous merge left them uncompiled. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- relay-end-reason becomes browser-bench-consoles: #7396 fixed the malformed-track end code and publish-done-codes owns the rest. - relay-stack-all-features: drop the added evidence; #7595 finishes and deletes the quest, and the #7363 citation was wrong. - nextest-pin: name the Dockerfile's NEXTEST_VERSION arg. - quic-lb-forward-extras: define the peer-map fields and counter owner, and require relay-quic-lb-forward. - subscriber-fin-fold: the predicates differ on lite-05/06 until #7296 lands; require its quest. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Finishes
quest/m2/relay-prometheus-client.md: the relay's/metricsendpoint now renders throughprometheus-client0.25.1 instead of hand-written text exposition.Summary
a08322a349):metrics_series_are_pinnedscrapes a fixture covering every source (traffic, sessions, control, accept, stun, drain, refusals, panics, plus io_uring underio-uring). It normalizes the output intokind name{labels} valuerows plus one# TYPErow per family, so a renamed, relabeled, retyped, or revalued series fails. It was committed and passing against the old renderer before the switch.6b3426bce6): each scrape reads the same snapshot as before into aScrapeand encodes it through a per-scrapeprometheus-clientcollector. The hot path is untouched (the Plan's snapshot model). Small helpers (family,counter,gauge,single,render) replace thewriteln!blocks, andstun.rsencodes through the same helpers. The io_uring histograms go throughencode_histogramafter converting the cumulative buckets to the per-bucket counts the crate expects. A new unit test covers that with non-zero counts.lebeforeworker, and Prometheus sorts labels on ingest anyway. The re-sorted constants were checked to hold the same 155 rows.doc/bin/relay/http.mdand the module doc now say OpenMetrics. The quest is deleted andquest/m2/audit-deps.mdupdated.prometheus-client,prometheus-client-derive-encode,dtoa(protobuf features off).itoaandparking_lotwere already in the lock.Choices made without asking
Labelstays. The Plan expected the crate's encoder to replace the hand escaping, but 0.25.1 writes label values verbatim (impl EncodeLabelValue for &str→write_str).Labelis now anEncodeLabelValuethat still escapes\,", and newlines, andlabel_values_are_escapedstill passes._total, a trailing# EOF), so the response'sContent-Typeis nowapplication/openmetrics-text; version=1.0.0; charset=utf-8rather thantext/plain; version=0.0.4. Labeling OpenMetrics output as the classic format would mismatch the# TYPEnames.Decisions
✅ Accept the exposition-format changes. Maintainer decision, 2026-10-30. The question was: accept, or no-go? The Plan allows a no-go "if the crate cannot reproduce the existing series without renames". Every sample name, label set, type, and value is unchanged (the golden proves it), but the text around them changes in ways a scraper or dashboard can see:
# HELP/# TYPEname counter families without_total(# TYPE moq_relay_bytes counter), so Prometheus's metadata API lists them under that name. Samples are stillmoq_relay_bytes_total{...}.application/openmetrics-text, plus# EOF.0.0, and histogram bounds asle="1.0"instead ofle="1". Prometheus 3 normalizesleto the float form on ingest (per its 3.0 migration guide), but on Prometheus 2 a query pinningle="1"onmoq_relay_uring_{sqes,cqes}_per_enter_bucketwould need updating. Nothing in this repo queries those.Accepted because series identity is preserved, the crate is the Prometheus project's own client, and the golden test now guards future edits.
Report
prometheus-client's label-escaping bug upstream? Not approved: nothing is filed on prometheus/client_rust, andLabelkeeps escaping label values itself.Checks
just check origin/main(throughquest gate): all modules pass.cargo test -p moq-relay --libwith--features io-uring,stun(295) and with defaults (279): pass.cargo test -p moq-relay --features io-uring --test integration: 126 passed.cargo clippy -p moq-relay --all-targets -D warningswithio-uring,stunand with defaults: clean.quest check --base origin/main: ok.977b064143, with main merged at878e91b359, these pass:just rs test -p moq-relay(402 tests),just rs test -p moq-relay -p moq-cli -p moq-studio --features moq-relay/io-uring(683 tests, the feature set CI picks),just rs check -p moq-relay --features io-uring, andquest check --base origin/main.Ejection 2026-11-01T20:24Z (failed_checks)
The batch was this PR plus moq-dev/moq#7258, and its
test rsmodule failed. That failure came from #7258, not this PR. #7258 renames moq-congestion's API, and main's new moq-quic/moq-tokio sim tests (from moq-dev/moq#7377) still used the old names. #7258 has since pushed8778db5529("test(quic): follow congestion API renames in base tests") to fix that. #7258 touches nothing underrs/moq-relay. With current main merged, this PR's relay, cli, and studio tests pass under CI's feature set (above). The only change here is a conflict-free merge of main.Review
mechanical fix by codex / Codex:
Merged base and mechanically re·solved audit text and relay import/test conflicts, preserving both sides.(head 624880e)quest review), gpt-6.1-sol, medium effort.206b388b412a815741db7f2a37bc0b431d1703bb, round 1.e81705c6a1, and a conflict-free merge of main,977b064143. None of these changes behavior, so they need no new review.🤖 Generated with Claude Code
(Written by Claude Opus 5.5)