v0.34.3_ht2
This commit is contained in:
1 parent
29d9a7dd6c
commit
1fd81eaf5f
9 files changed
+78
-35
No files matched your search
+1
-1
@@ -13,7 +13,7 @@ Release history focused on **features, settings, default behavior, compatibility
|
|||||||
- QUIC now opens the UDP listener socket with per-listener receive/send buffer targets (4 MiB each by default; `udp_receive_buffer_bytes`, `udp_send_buffer_bytes`; `0` uses OS defaults). Reports the effective buffer sizes and warns if kernel limits clamp them. Linux `SO_RCVBUF` / `SO_SNDBUF` accounting is accommodated, so observed `ss` values correspond to the configured effective target when permitted. UDP buffer modifications require restart, not silent hot application. Existing configs without these fields load the new defaults.
|
- QUIC now opens the UDP listener socket with per-listener receive/send buffer targets (4 MiB each by default; `udp_receive_buffer_bytes`, `udp_send_buffer_bytes`; `0` uses OS defaults). Reports the effective buffer sizes and warns if kernel limits clamp them. Linux `SO_RCVBUF` / `SO_SNDBUF` accounting is accommodated, so observed `ss` values correspond to the configured effective target when permitted. UDP buffer modifications require restart, not silent hot application. Existing configs without these fields load the new defaults.
|
||||||
- HTTP/3 `Alt-Svc` follows newly saved listener lifetime immediately on H1/H2 TLS responses for an already-bound H3 socket; disabling H3 publishes `Alt-Svc: clear`. New QUIC handshakes use saved stream/idle limits and reduced connection caps. Listener binding/TLS/H1-H2 changes, a new/disabled UDP listener or expanding startup capacity still need restart; UI restart indicator reflects this.
|
- HTTP/3 `Alt-Svc` follows newly saved listener lifetime immediately on H1/H2 TLS responses for an already-bound H3 socket; disabling H3 publishes `Alt-Svc: clear`. New QUIC handshakes use saved stream/idle limits and reduced connection caps. Listener binding/TLS/H1-H2 changes, a new/disabled UDP listener or expanding startup capacity still need restart; UI restart indicator reflects this.
|
||||||
- DEBUG-level bulk QUIC snapshots expose packet loss, congestion window, RTT, MTU and datagram syscall counters to investigate slow H3 and CPU usage, without assuming an unmeasured throughput improvement.
|
- DEBUG-level bulk QUIC snapshots expose packet loss, congestion window, RTT, MTU and datagram syscall counters to investigate slow H3 and CPU usage, without assuming an unmeasured throughput improvement.
|
||||||
- Overview includes a **cumulative HTTP cache outcomes** 100% stacked bar with HIT, MISS, BYPASS and OTHER (requests without a cache decision), using totals since service start instead of sampled deltas. Hotfix: each category now shows counts and percentages, including before a second browser poll. Invalid/inconsistent totals are not normalized into misleading percentages. The widget remains **hidden by default** and opt-in via the layout editor. Saved layout visibility, the lifetime HIT/MISS donut and the separate recent cache trend chart are preserved. Both UI languages are supported.
|
- Overview includes a **cumulative HTTP cache outcomes** 100% stacked bar with HIT, MISS, BYPASS and OTHER (requests without a cache decision), using totals since service start instead of sampled deltas. Hotfix: each category now shows counts and percentages, including before a second browser poll; the lifetime HTTP request count sits compactly in the upper-right corner with the full label available as a tooltip and accessibility text. Invalid/inconsistent totals are not normalized into misleading percentages. The widget remains **hidden by default** and opt-in via the layout editor. Saved layout visibility, the lifetime HIT/MISS donut and the separate recent cache trend chart are preserved. Both UI languages are supported.
|
||||||
- Delivered as source for compilation and protocol acceptance on supported targets; no compiled Rust binary or measured post-patch benchmark is included in this candidate.
|
- Delivered as source for compilation and protocol acceptance on supported targets; no compiled Rust binary or measured post-patch benchmark is included in this candidate.
|
||||||
|
|
||||||
## 0.34.2 — configuration storage visibility and public HTTP error responses
|
## 0.34.2 — configuration storage visibility and public HTTP error responses
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ Features and default settings vary by component; configure only the capabilities
|
|||||||
|
|
||||||
- HTTP/3 now explicitly requests **4 MiB effective UDP receive and send buffers** per QUIC listener (configurable as `udp_receive_buffer_bytes` and `udp_send_buffer_bytes` in Settings > HTTP/3). On Linux the kernel can cap them using `net.core.rmem_max` / `net.core.wmem_max`; RustProxy logs the effective values and a warning if the target is not met. Setting either value to `0` leaves the OS default. Changing UDP buffers requires service restart.
|
- HTTP/3 now explicitly requests **4 MiB effective UDP receive and send buffers** per QUIC listener (configurable as `udp_receive_buffer_bytes` and `udp_send_buffer_bytes` in Settings > HTTP/3). On Linux the kernel can cap them using `net.core.rmem_max` / `net.core.wmem_max`; RustProxy logs the effective values and a warning if the target is not met. Setting either value to `0` leaves the OS default. Changing UDP buffers requires service restart.
|
||||||
- HTTP/3 Alt-Svc response headers follow saved policy immediately; turning off an already-bound H3 service emits `Alt-Svc: clear`. New QUIC handshakes pick up modified stream/idle limits without socket rebinding. Increasing the connection cap beyond the startup bound or changing the UDP endpoint still requires restart. QUIC bulk-transfer diagnostic snapshots are available at debug log level.
|
- HTTP/3 Alt-Svc response headers follow saved policy immediately; turning off an already-bound H3 service emits `Alt-Svc: clear`. New QUIC handshakes pick up modified stream/idle limits without socket rebinding. Increasing the connection cap beyond the startup bound or changing the UDP endpoint still requires restart. QUIC bulk-transfer diagnostic snapshots are available at debug log level.
|
||||||
- The Overview has an **optional, hidden-by-default cumulative cache-outcome bar** showing HIT, MISS, BYPASS and OTHER request counts and percentages **since service start**. Enable it in the dashboard layout editor when needed. This complements the existing cumulative HIT/MISS donut and separate recent cache trend chart. OTHER denotes HTTP requests without a cache decision. Percentages use all HTTP requests, unlike the HIT/MISS donut.
|
- The Overview has an **optional, hidden-by-default cumulative cache-outcome bar** showing HIT, MISS, BYPASS and OTHER request counts and percentages **since service start**. Enable it in the dashboard layout editor when needed. This complements the existing cumulative HIT/MISS donut and separate recent cache trend chart. OTHER denotes HTTP requests without a cache decision. Percentages use all HTTP requests, unlike the HIT/MISS donut. The upper-right counter displays only the lifetime HTTP request count; its full meaning is available on hover or to assistive technology.
|
||||||
|
|
||||||
## 0.34.2
|
## 0.34.2
|
||||||
|
|
||||||
|
|||||||
+8
-8
@@ -2,11 +2,11 @@
|
|||||||
4140a2956264b44f259e6a37fc00ba02097bbe68b09296e04d3d243c1287129b .env.example
|
4140a2956264b44f259e6a37fc00ba02097bbe68b09296e04d3d243c1287129b .env.example
|
||||||
9e6356475bf587091bab72246ec9e325b498f7e48a6220e9a18baa50d0a385a6 .gitignore
|
9e6356475bf587091bab72246ec9e325b498f7e48a6220e9a18baa50d0a385a6 .gitignore
|
||||||
00e914cd6a8f8962d857b92bdfa172aa7ce0bdbcafcebe8c9c67f452ac8479f2 AGENTS.md
|
00e914cd6a8f8962d857b92bdfa172aa7ce0bdbcafcebe8c9c67f452ac8479f2 AGENTS.md
|
||||||
a8e1e36e38e2a6ad9fe00cc605f9e8d31a9c446ab2bd620af969f6dab8193864 CHANGELOG.md
|
a5ff03509541769856ed56c98370a1dce3a0f059b15128a6a4495f8d4e00fe57 CHANGELOG.md
|
||||||
789f77a2ecb443f171197d002c0911779bf1a8d8f0c151a18a6a4ee54d8c97eb Cargo.lock
|
789f77a2ecb443f171197d002c0911779bf1a8d8f0c151a18a6a4ee54d8c97eb Cargo.lock
|
||||||
b6cf2ee2017e6a0ad99f66a809713f031b7b5480a4c97d74e2ed2c07c5c4f210 Cargo.toml
|
b6cf2ee2017e6a0ad99f66a809713f031b7b5480a4c97d74e2ed2c07c5c4f210 Cargo.toml
|
||||||
25c7f3c8162cbf5cc156439774118a81dae9fdc52b611ec7e40c230fc99a772c Dockerfile
|
25c7f3c8162cbf5cc156439774118a81dae9fdc52b611ec7e40c230fc99a772c Dockerfile
|
||||||
b09ec16a9045006967d8c00a7f3ea98bb69dfccf804e001e29a3e148fd2e8cd8 README.md
|
06a8e6bdf44aaa434fe4b9767b9f336188317954a01c99174fcacb770c1c4682 README.md
|
||||||
ae6d14ada6fde7d0b8514840b821678418cf5b1816c18434e3b7fb2ae27a0b21 ROADMAP.md
|
ae6d14ada6fde7d0b8514840b821678418cf5b1816c18434e3b7fb2ae27a0b21 ROADMAP.md
|
||||||
da8311e3db945290666324a2f24bf4521b365272d7ac3f862ded1be993eea646 UPDATE_CHECK.toml
|
da8311e3db945290666324a2f24bf4521b365272d7ac3f862ded1be993eea646 UPDATE_CHECK.toml
|
||||||
f645f218dd062bf6cb54a8ee634290562cad364a4cccf09f16e3c8303582af8c build.rs
|
f645f218dd062bf6cb54a8ee634290562cad364a4cccf09f16e3c8303582af8c build.rs
|
||||||
@@ -36,7 +36,7 @@ b0eaa2cfe4f6e86582f67891e457591ae650d15145e025d85cab43e37c883ac8 docs/ACCESS.md
|
|||||||
e6d9feabc7a4fcb9a56a2028accbab19ca44479ee67deeefd0ab37f29c45cf4a docs/CONFIGURATION.md
|
e6d9feabc7a4fcb9a56a2028accbab19ca44479ee67deeefd0ab37f29c45cf4a docs/CONFIGURATION.md
|
||||||
80bcc666736b10f6202386d0342e8d6feeba858d77aea310bf3ec6de01c2bfb3 docs/CONTAINER.md
|
80bcc666736b10f6202386d0342e8d6feeba858d77aea310bf3ec6de01c2bfb3 docs/CONTAINER.md
|
||||||
dc670d912a6a946160c2f8528c9bb710ec38ebe406dcb7dcaf18fb2653f667b6 docs/CUSTOM_LOCATIONS.md
|
dc670d912a6a946160c2f8528c9bb710ec38ebe406dcb7dcaf18fb2653f667b6 docs/CUSTOM_LOCATIONS.md
|
||||||
47d5e758870a1a81ddc8a66a64f1c5eee7bb154fee5335918b385939ffc88584 docs/DASHBOARD.md
|
9fb2d0bcac70d1883dd16557622851a1f0527b3d3569a4b5177f5e6dedd3c74d docs/DASHBOARD.md
|
||||||
5a8d311c7ab36af9fb84964585bd974b92d8ea4979829b5735fb834ef10156ce docs/DOCKER_DISCOVERY.md
|
5a8d311c7ab36af9fb84964585bd974b92d8ea4979829b5735fb834ef10156ce docs/DOCKER_DISCOVERY.md
|
||||||
dbae1a739874ac7b61e276c1ad6fd7c3465acc95afa4db3751224c8426ad6569 docs/INSTALL.md
|
dbae1a739874ac7b61e276c1ad6fd7c3465acc95afa4db3751224c8426ad6569 docs/INSTALL.md
|
||||||
37001cbf8ed248ca05ec40f12dd9876d33f6e0c97dcb21eb2e6f53c3d97a60bb docs/INTEGRATIONS.md
|
37001cbf8ed248ca05ec40f12dd9876d33f6e0c97dcb21eb2e6f53c3d97a60bb docs/INTEGRATIONS.md
|
||||||
@@ -77,7 +77,7 @@ cb01fdef286f38b442dd9252c23c4f8e44eb72e9ecdd99adb926e8e9f6318bb1 integrations/r
|
|||||||
3f267cafa16006e5456ade78ee2d5fae02cc7ce747839523068ffd8d7c98798a integrations/routeros-oci-build/docker-entrypoint.sh
|
3f267cafa16006e5456ade78ee2d5fae02cc7ce747839523068ffd8d7c98798a integrations/routeros-oci-build/docker-entrypoint.sh
|
||||||
13189fa546c3488dddd8efc80c47f6da5241e5fc28b79cbfe795414ea05c7a4f langs/README.md
|
13189fa546c3488dddd8efc80c47f6da5241e5fc28b79cbfe795414ea05c7a4f langs/README.md
|
||||||
3b176f3983616312589c4cb0e47365658bca7af13a4f8f3be264b4d3b6c82c16 langs/en_US.json
|
3b176f3983616312589c4cb0e47365658bca7af13a4f8f3be264b4d3b6c82c16 langs/en_US.json
|
||||||
42a5f15bce232663dbc8efe6073675f09f1e93ee65e279f4382202f36853d044 langs/pl_pl.json
|
ecfc9babcae633bfd16a1b686d14bb35641ae6fc1b9bff8f247d54db6b788c49 langs/pl_pl.json
|
||||||
a99ad040be10fa028351e290b9363236b3513a1cadbdc9fb9e0260d517b9b0ae make_zip.py
|
a99ad040be10fa028351e290b9363236b3513a1cadbdc9fb9e0260d517b9b0ae make_zip.py
|
||||||
e830d37dd1f81a4b0aa7d535f5bba69e34e433b0fd99cc8ee0b296786c32379a migrations/0002_admin.sql
|
e830d37dd1f81a4b0aa7d535f5bba69e34e433b0fd99cc8ee0b296786c32379a migrations/0002_admin.sql
|
||||||
20112cc82192098b8d602f1c4f7ca08712e9e1366c845fabb92753187c370d35 migrations/0003_certificate_renewals.sql
|
20112cc82192098b8d602f1c4f7ca08712e9e1366c845fabb92753187c370d35 migrations/0003_certificate_renewals.sql
|
||||||
@@ -175,7 +175,7 @@ d997f62e8bd7ac9d4f16bb302800c98ad943afab663bb0b212ea26c35b58de11 src/admin/web/
|
|||||||
5bde5f0881320464eb133cd44de9eff5211e6816e79f7f7e9574b16784fab126 src/admin/web/app/preferences.js
|
5bde5f0881320464eb133cd44de9eff5211e6816e79f7f7e9574b16784fab126 src/admin/web/app/preferences.js
|
||||||
8e75b0915edfbadefc4388701431541f4d35fd5d717363297b63740b3afd34d2 src/admin/web/app/rate-sampling.js
|
8e75b0915edfbadefc4388701431541f4d35fd5d717363297b63740b3afd34d2 src/admin/web/app/rate-sampling.js
|
||||||
43f4dddd1c3ea7fa42eeb9d7b655a8db48b5ddcc6c68213e08dfc2fcfbe8b17d src/admin/web/app/refresh.js
|
43f4dddd1c3ea7fa42eeb9d7b655a8db48b5ddcc6c68213e08dfc2fcfbe8b17d src/admin/web/app/refresh.js
|
||||||
25378ae93a9c26cf65f1c7ff67136d073b5a5d7de74f289fe21cf79e2d6e2ffd src/admin/web/app/runtime.js
|
f1a764691f3e2cdb7c6c43e37dae78249561c017a1b74e973a378cb780b72835 src/admin/web/app/runtime.js
|
||||||
31201586925e6f4792071d7d03fb05dcc4a69a03c02a4e85eb0746f45af68074 src/admin/web/app/session-resume.js
|
31201586925e6f4792071d7d03fb05dcc4a69a03c02a4e85eb0746f45af68074 src/admin/web/app/session-resume.js
|
||||||
86ac42bd4a6a84bb137d5a3c3dc3d1f4e404a543447845e6ea6e6e8210e268ce src/admin/web/app/settings.js
|
86ac42bd4a6a84bb137d5a3c3dc3d1f4e404a543447845e6ea6e6e8210e268ce src/admin/web/app/settings.js
|
||||||
8386710827e5ccc9432fb46413368f94afc1016425404a6092b460903636837e src/admin/web/app/stream-dashboard.js
|
8386710827e5ccc9432fb46413368f94afc1016425404a6092b460903636837e src/admin/web/app/stream-dashboard.js
|
||||||
@@ -212,13 +212,13 @@ cbd41678eadd994dc5252628ee8ef9551fa9f7d8694ca5abd206240d9a96ad30 src/admin/web/
|
|||||||
c2e5f554810b8e34fb47361fb90a01073a2e332ee26d82e030956fad3ec1f83e src/admin/web/login.js
|
c2e5f554810b8e34fb47361fb90a01073a2e332ee26d82e030956fad3ec1f83e src/admin/web/login.js
|
||||||
097fdb41aa1cd526c4d9bc65e502b05a62e664ef9fff8e69f706b93b0b124dc2 src/admin/web/management.js
|
097fdb41aa1cd526c4d9bc65e502b05a62e664ef9fff8e69f706b93b0b124dc2 src/admin/web/management.js
|
||||||
4481a592fcce9a2aa1db5e4a25619e19fd459c39039b86c0549dfc427eec1b45 src/admin/web/partials/overview-charts.html
|
4481a592fcce9a2aa1db5e4a25619e19fd459c39039b86c0549dfc427eec1b45 src/admin/web/partials/overview-charts.html
|
||||||
9fe5d80abc751c55c3cc8f2e2e1110e2b3bcf0098ab49247f056ec0fb52a01fe src/admin/web/partials/overview-metrics.html
|
a8afc6e70950bc70b98725eb049d73cff35dc3a3ee659229a15a8e08d3eb4f12 src/admin/web/partials/overview-metrics.html
|
||||||
3928afce2ed6d5f2d3e29475dd29e4c3bd3c6df180ad5119beaff0c7a58e3b3b src/admin/web/prometheus-token.js
|
3928afce2ed6d5f2d3e29475dd29e4c3bd3c6df180ad5119beaff0c7a58e3b3b src/admin/web/prometheus-token.js
|
||||||
90d9a0836662135b79fb6f183c4f3eff60f8a64392d6c5795ccf1d8ef6862263 src/admin/web/redirects.js
|
90d9a0836662135b79fb6f183c4f3eff60f8a64392d6c5795ccf1d8ef6862263 src/admin/web/redirects.js
|
||||||
17784875e475d6df42964d7ecfe50ca82b74bad0e942342bc17537e727224796 src/admin/web/settings.js
|
17784875e475d6df42964d7ecfe50ca82b74bad0e942342bc17537e727224796 src/admin/web/settings.js
|
||||||
8eadbada619b15087783dcfa0e889a81f88e78034d084c5ab616f7912b835940 src/admin/web/status_200.html
|
8eadbada619b15087783dcfa0e889a81f88e78034d084c5ab616f7912b835940 src/admin/web/status_200.html
|
||||||
c13cffe18a616fe5faa5ee945ab0d94d8d392ae8f32474c62fe41010e063ddb1 src/admin/web/streams.js
|
c13cffe18a616fe5faa5ee945ab0d94d8d392ae8f32474c62fe41010e063ddb1 src/admin/web/streams.js
|
||||||
96fe0459ef3204beb0ac35cefddd852fb9808558f02b2802842b09e60ded4aef src/admin/web/style.css
|
005b814a4deb2d98fb4d55f37579b153f47a2b91b143d0bd80137059b44b7e3c src/admin/web/style.css
|
||||||
d290c048450655b3eeae7c6ec54a82d645d1965513694ab29fdf7eef796a1abd src/admin/web/traffic-panel.js
|
d290c048450655b3eeae7c6ec54a82d645d1965513694ab29fdf7eef796a1abd src/admin/web/traffic-panel.js
|
||||||
dfb4ded2fefb90fc1e2d33370cdef10b040a85cb43235ea9dbc1d73bef823a79 src/admin/web/transform-panel.js
|
dfb4ded2fefb90fc1e2d33370cdef10b040a85cb43235ea9dbc1d73bef823a79 src/admin/web/transform-panel.js
|
||||||
d816f2f70eef398c18091479320c36d07f9afe07278a250b840ebcdd7bc715f2 src/admin/web/vhosts/core.js
|
d816f2f70eef398c18091479320c36d07f9afe07278a250b840ebcdd7bc715f2 src/admin/web/vhosts/core.js
|
||||||
@@ -501,7 +501,7 @@ b35e00e4084b4de2125e9b6fff9699358b881277427bed8706fb2e8286e3cf28 src/web_server
|
|||||||
400e1c8aa2fe857d96036a64499fbc3de44c1e3a53811c5b25101fb843359792 src/web_server/security.rs
|
400e1c8aa2fe857d96036a64499fbc3de44c1e3a53811c5b25101fb843359792 src/web_server/security.rs
|
||||||
c645740e5175e32a9ee743700e99a2f16b6fd894de5f734b84021b774dd747eb src/web_server/serve.rs
|
c645740e5175e32a9ee743700e99a2f16b6fd894de5f734b84021b774dd747eb src/web_server/serve.rs
|
||||||
dc3a18c14c3cc28519103e860b0f42a59d163db15df3f68b76778cdfa6786e46 src/web_server/tests.rs
|
dc3a18c14c3cc28519103e860b0f42a59d163db15df3f68b76778cdfa6786e46 src/web_server/tests.rs
|
||||||
c4d02f937694eeb7d45b955afee6438a3090312cc5318f2168f5d3430d2418ff tests/cache_outcomes.cjs
|
8bfee0027ce317f3427ecdf9193549d4a52db58a7b2b99db7cdeebc458d7d4c0 tests/cache_outcomes.cjs
|
||||||
f00743af2cf4a5952caef7a1dcf68e7817b5599a252a9973e1c22045517c0b0e tests/fixtures/argon2id.json
|
f00743af2cf4a5952caef7a1dcf68e7817b5599a252a9973e1c22045517c0b0e tests/fixtures/argon2id.json
|
||||||
1725c10331745dc04a07675784d385260da7b14567b8dba3cbae5e891eb5dadf tests/http2.rs
|
1725c10331745dc04a07675784d385260da7b14567b8dba3cbae5e891eb5dadf tests/http2.rs
|
||||||
347a4ff9e028a1e999ad129590c355b5734cf928dd81e5099aea0c8aca8d5908 tests/http3.rs
|
347a4ff9e028a1e999ad129590c355b5734cf928dd81e5099aea0c8aca8d5908 tests/http3.rs
|
||||||
|
|||||||
+1
-1
@@ -27,7 +27,7 @@ Unfinished editors may be minimized into a draft dock; this is a UI convenience
|
|||||||
## Interpreting charts
|
## Interpreting charts
|
||||||
|
|
||||||
- The **Cache hit ratio** donut shows cumulative `HIT / (HIT + MISS)`: BYPASS and requests outside cache are deliberately excluded from its denominator.
|
- The **Cache hit ratio** donut shows cumulative `HIT / (HIT + MISS)`: BYPASS and requests outside cache are deliberately excluded from its denominator.
|
||||||
- The **Cache outcomes** compact horizontal 100% bar is **hidden by default**; enable it in **Settings → Appearance → Dashboard layout** or the Overview layout editor. It summarizes **cumulative request counters since the current service process started**, not recent polling intervals. The legend shows the count and percentage for each category: HIT, MISS, BYPASS and OTHER. The percentages use all HTTP requests as the denominator. BYPASS includes requests where the cache path was considered but disabled/skipped (including globally disabled cache); OTHER covers requests without a cache decision, e.g. early rejected or redirect paths. These are request counts, not bytes; service restarts reset them. Values appear immediately with the first HTTP request; refreshing or pausing the browser does not reset totals. If independently counted cache outcomes exceed the request counter (e.g. while snapshots are inconsistent or a request incurs multiple cache events), the summary shows unavailable rather than fabricating OTHER or a normalized 100% breakdown. The separate recent cache trend chart remains unchanged.
|
- The **Cache outcomes** compact horizontal 100% bar is **hidden by default**; enable it in **Settings → Appearance → Dashboard layout** or the Overview layout editor. It summarizes **cumulative request counters since the current service process started**, not recent polling intervals. The upper-right number shows the total HTTP requests since service start (full description in its tooltip and accessible label); the legend shows counts and percentages for HIT, MISS, BYPASS and OTHER. The percentages use all HTTP requests as the denominator. BYPASS includes requests where the cache path was considered but disabled/skipped (including globally disabled cache); OTHER covers requests without a cache decision, e.g. early rejected or redirect paths. These are request counts, not bytes; service restarts reset them. Values appear immediately with the first HTTP request; refreshing or pausing the browser does not reset totals. If independently counted cache outcomes exceed the request counter (e.g. while snapshots are inconsistent or a request incurs multiple cache events), the summary shows unavailable rather than fabricating OTHER or a normalized 100% breakdown. The separate recent cache trend chart remains unchanged.
|
||||||
|
|
||||||
|
|
||||||
- Live views are process/sampling-based and can show no-data when an integration has not reported yet.
|
- Live views are process/sampling-based and can show no-data when an integration has not reported yet.
|
||||||
|
|||||||
+1
-1
@@ -2771,7 +2771,7 @@
|
|||||||
"h3_udp_receive_buffer_mib": "Bufor odbiorczy UDP (MiB; 0 = domyślny systemowy)",
|
"h3_udp_receive_buffer_mib": "Bufor odbiorczy UDP (MiB; 0 = domyślny systemowy)",
|
||||||
"h3_udp_send_buffer_mib": "Bufor nadawczy UDP (MiB; 0 = domyślny systemowy)",
|
"h3_udp_send_buffer_mib": "Bufor nadawczy UDP (MiB; 0 = domyślny systemowy)",
|
||||||
"http3ApplyPolicy": "NA ŻYWO / RESTART",
|
"http3ApplyPolicy": "NA ŻYWO / RESTART",
|
||||||
"cacheMixTitle": "Wyniki cache (łącznie)",
|
"cacheMixTitle": "Wyniki cache",
|
||||||
"cacheMixHelp": "Udział HIT/MISS/BYPASS i INNE we wszystkich żądaniach HTTP od startu usługi. INNE oznacza brak decyzji cache. Każda kategoria pokazuje liczbę i procent.",
|
"cacheMixHelp": "Udział HIT/MISS/BYPASS i INNE we wszystkich żądaniach HTTP od startu usługi. INNE oznacza brak decyzji cache. Każda kategoria pokazuje liczbę i procent.",
|
||||||
"cacheMixOther": "INNE",
|
"cacheMixOther": "INNE",
|
||||||
"cacheMixSample": "Od startu usługi · {count} żądań HTTP",
|
"cacheMixSample": "Od startu usługi · {count} żądań HTTP",
|
||||||
|
|||||||
@@ -352,9 +352,15 @@ function renderCacheMix(mix, totalRequests) {
|
|||||||
$(`cache-mix-${name}-percent`).textContent = mix ? `${fmt(pct, 1)}%` : "-";
|
$(`cache-mix-${name}-percent`).textContent = mix ? `${fmt(pct, 1)}%` : "-";
|
||||||
});
|
});
|
||||||
$("cache-mix-headline").textContent = mix ? `${fmt(mix.percentages[0], 1)}% HIT` : "-";
|
$("cache-mix-headline").textContent = mix ? `${fmt(mix.percentages[0], 1)}% HIT` : "-";
|
||||||
$("cache-mix-caption").textContent = mix
|
const caption = $("cache-mix-caption");
|
||||||
? t("cacheMixSample").replace("{count}", fmt(mix.requests))
|
const validTotal = Number.isSafeInteger(totalRequests) && totalRequests >= 0;
|
||||||
: unavailable;
|
const total = validTotal ? fmt(totalRequests) : "-";
|
||||||
|
const totalLabel = validTotal
|
||||||
|
? t("cacheMixSample").replace("{count}", total)
|
||||||
|
: t("cacheMixInvalid");
|
||||||
|
caption.textContent = total;
|
||||||
|
caption.setAttribute("title", totalLabel);
|
||||||
|
caption.setAttribute("aria-label", totalLabel);
|
||||||
$("cache-mix-bar").setAttribute("aria-label", mix
|
$("cache-mix-bar").setAttribute("aria-label", mix
|
||||||
? t("cacheMixAria").replace("{hit}", fmt(mix.counts[0]))
|
? t("cacheMixAria").replace("{hit}", fmt(mix.counts[0]))
|
||||||
.replace("{miss}", fmt(mix.counts[1]))
|
.replace("{miss}", fmt(mix.counts[1]))
|
||||||
|
|||||||
@@ -32,27 +32,24 @@
|
|||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
<article class="stat stat-cache-outcomes" data-dashboard-widget="cache_outcomes">
|
<article class="stat stat-cache-outcomes" data-dashboard-widget="cache_outcomes">
|
||||||
|
<div class="cache-mix-header">
|
||||||
<span data-i18n="cacheMixTitle">Cache outcomes</span>
|
<span data-i18n="cacheMixTitle">Cache outcomes</span>
|
||||||
|
<small class="cache-mix-caption" id="cache-mix-caption" aria-label="HTTP requests since service start" title="HTTP requests since service start">-</small>
|
||||||
|
</div>
|
||||||
<strong id="cache-mix-headline">-</strong>
|
<strong id="cache-mix-headline">-</strong>
|
||||||
<div class="cache-mix-bar" id="cache-mix-bar" role="img"
|
<div class="cache-mix-bar" id="cache-mix-bar" role="img" aria-label="Cumulative HTTP cache outcomes since service start">
|
||||||
aria-label="Cumulative HTTP cache outcomes since service start">
|
|
||||||
<span class="cache-mix-hit" id="cache-mix-hit" style="width:0%"></span>
|
<span class="cache-mix-hit" id="cache-mix-hit" style="width:0%"></span>
|
||||||
<span class="cache-mix-miss" id="cache-mix-miss" style="width:0%"></span>
|
<span class="cache-mix-miss" id="cache-mix-miss" style="width:0%"></span>
|
||||||
<span class="cache-mix-bypass" id="cache-mix-bypass" style="width:0%"></span>
|
<span class="cache-mix-bypass" id="cache-mix-bypass" style="width:0%"></span>
|
||||||
<span class="cache-mix-other" id="cache-mix-other" style="width:0%"></span>
|
<span class="cache-mix-other" id="cache-mix-other" style="width:0%"></span>
|
||||||
</div>
|
</div>
|
||||||
<small class="cache-mix-legend">
|
<small class="cache-mix-legend">
|
||||||
<span class="cache-mix-hit-key"><i></i>HIT <b><span id="cache-mix-hit-count">-</span><span
|
<span class="cache-mix-hit-key"><i></i>HIT <b><span id="cache-mix-hit-count">-</span><span class="cache-mix-percent" id="cache-mix-hit-percent">-</span></b></span>
|
||||||
class="cache-mix-percent" id="cache-mix-hit-percent">-</span></b></span>
|
<span class="cache-mix-miss-key"><i></i>MISS <b><span id="cache-mix-miss-count">-</span><span class="cache-mix-percent" id="cache-mix-miss-percent">-</span></b></span>
|
||||||
<span class="cache-mix-miss-key"><i></i>MISS <b><span id="cache-mix-miss-count">-</span><span
|
<span class="cache-mix-bypass-key"><i></i>BYPASS <b><span id="cache-mix-bypass-count">-</span><span class="cache-mix-percent" id="cache-mix-bypass-percent">-</span></b></span>
|
||||||
class="cache-mix-percent" id="cache-mix-miss-percent">-</span></b></span>
|
<span class="cache-mix-other-key"><i></i><span data-i18n="cacheMixOther">OTHER</span> <b><span id="cache-mix-other-count">-</span><span class="cache-mix-percent"
|
||||||
<span class="cache-mix-bypass-key"><i></i>BYPASS <b><span id="cache-mix-bypass-count">-</span><span
|
|
||||||
class="cache-mix-percent" id="cache-mix-bypass-percent">-</span></b></span>
|
|
||||||
<span class="cache-mix-other-key"><i></i><span data-i18n="cacheMixOther">OTHER</span> <b><span
|
|
||||||
id="cache-mix-other-count">-</span><span class="cache-mix-percent"
|
|
||||||
id="cache-mix-other-percent">-</span></b></span>
|
id="cache-mix-other-percent">-</span></b></span>
|
||||||
</small>
|
</small>
|
||||||
<small class="cache-mix-caption" id="cache-mix-caption" data-i18n="cacheMixWaiting">No HTTP requests yet</small>
|
|
||||||
</article>
|
</article>
|
||||||
<article class="stat" data-dashboard-widget="memory"><span data-i18n="processMemory">Process
|
<article class="stat" data-dashboard-widget="memory"><span data-i18n="processMemory">Process
|
||||||
memory</span><strong id="metric-rss">-</strong><small id="process-summary">-</small>
|
memory</span><strong id="metric-rss">-</strong><small id="process-summary">-</small>
|
||||||
|
|||||||
+33
-6
@@ -12195,6 +12195,39 @@ html[data-dashboard-density] #panel-overview .dashboard-overview-grid>.card.pool
|
|||||||
overflow-wrap: anywhere;
|
overflow-wrap: anywhere;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#panel-overview .stat-cache-outcomes .cache-mix-header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: baseline;
|
||||||
|
gap: 6px;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#panel-overview .stat-cache-outcomes .cache-mix-header>span {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
min-width: 0;
|
||||||
|
color: var(--muted);
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#panel-overview .stat-cache-outcomes .cache-mix-caption {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
margin-left: auto;
|
||||||
|
color: var(--muted);
|
||||||
|
font: 500 10px/1.35 var(--mono);
|
||||||
|
font-variant-numeric: tabular-nums;
|
||||||
|
text-align: right;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
html[data-dashboard-density=ultra] #panel-overview .stat-cache-outcomes .cache-mix-header>span {
|
||||||
|
font-size: 9px;
|
||||||
|
}
|
||||||
|
|
||||||
|
html[data-dashboard-density=ultra] #panel-overview .stat-cache-outcomes .cache-mix-caption {
|
||||||
|
font-size: 9px;
|
||||||
|
}
|
||||||
|
|
||||||
#panel-overview .stat-cache-outcomes .cache-mix-bar {
|
#panel-overview .stat-cache-outcomes .cache-mix-bar {
|
||||||
display: flex;
|
display: flex;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@@ -12281,9 +12314,3 @@ html[data-dashboard-density] #panel-overview .dashboard-overview-grid>.card.pool
|
|||||||
color: var(--muted);
|
color: var(--muted);
|
||||||
font: 400 10px var(--mono);
|
font: 400 10px var(--mono);
|
||||||
}
|
}
|
||||||
|
|
||||||
#panel-overview .stat-cache-outcomes .cache-mix-caption {
|
|
||||||
display: block;
|
|
||||||
margin-top: 8px;
|
|
||||||
color: var(--muted);
|
|
||||||
}
|
|
||||||
@@ -44,7 +44,9 @@ const render = vm.runInNewContext(`${src.slice(renderBegin + 1, end)}; renderCac
|
|||||||
});
|
});
|
||||||
render(result, 10);
|
render(result, 10);
|
||||||
assert.equal(dom("cache-mix-headline").textContent, "40.0% HIT");
|
assert.equal(dom("cache-mix-headline").textContent, "40.0% HIT");
|
||||||
assert.equal(dom("cache-mix-caption").textContent, "Since service start · 10 HTTP requests");
|
assert.equal(dom("cache-mix-caption").textContent, "10");
|
||||||
|
assert.equal(dom("cache-mix-caption").attributes.title, "Since service start · 10 HTTP requests");
|
||||||
|
assert.equal(dom("cache-mix-caption").attributes["aria-label"], "Since service start · 10 HTTP requests");
|
||||||
for (const [name, count, percent] of [["hit", 4, 40], ["miss", 2, 20],
|
for (const [name, count, percent] of [["hit", 4, 40], ["miss", 2, 20],
|
||||||
["bypass", 3, 30], ["other", 1, 10]]) {
|
["bypass", 3, 30], ["other", 1, 10]]) {
|
||||||
assert.equal(dom(`cache-mix-${name}-count`).textContent, String(count));
|
assert.equal(dom(`cache-mix-${name}-count`).textContent, String(count));
|
||||||
@@ -53,12 +55,17 @@ for (const [name, count, percent] of [["hit", 4, 40], ["miss", 2, 20],
|
|||||||
}
|
}
|
||||||
assert.match(dom("cache-mix-bar").attributes["aria-label"], /4 HIT, 2 MISS, 3 BYPASS, 1 OTHER/);
|
assert.match(dom("cache-mix-bar").attributes["aria-label"], /4 HIT, 2 MISS, 3 BYPASS, 1 OTHER/);
|
||||||
render(null, 0);
|
render(null, 0);
|
||||||
assert.equal(dom("cache-mix-caption").textContent, english.cacheMixWaiting);
|
assert.equal(dom("cache-mix-caption").textContent, "0");
|
||||||
|
assert.equal(dom("cache-mix-caption").attributes.title, "Since service start · 0 HTTP requests");
|
||||||
assert.equal(dom("cache-mix-hit-count").textContent, "-");
|
assert.equal(dom("cache-mix-hit-count").textContent, "-");
|
||||||
assert.equal(dom("cache-mix-hit").style.width, "0%");
|
assert.equal(dom("cache-mix-hit").style.width, "0%");
|
||||||
render(null, 10);
|
render(null, 10);
|
||||||
assert.equal(dom("cache-mix-caption").textContent, english.cacheMixInvalid);
|
assert.equal(dom("cache-mix-caption").textContent, "10");
|
||||||
|
assert.equal(dom("cache-mix-caption").attributes.title, "Since service start · 10 HTTP requests");
|
||||||
assert.equal(dom("cache-mix-bar").attributes["aria-label"], english.cacheMixInvalid);
|
assert.equal(dom("cache-mix-bar").attributes["aria-label"], english.cacheMixInvalid);
|
||||||
|
render(null, NaN);
|
||||||
|
assert.equal(dom("cache-mix-caption").textContent, "-");
|
||||||
|
assert.equal(dom("cache-mix-caption").attributes.title, english.cacheMixInvalid);
|
||||||
|
|
||||||
const widgets = JSON.parse(fs.readFileSync(path.join(root, "src/admin/web/dashboard-widgets.json"), "utf8"));
|
const widgets = JSON.parse(fs.readFileSync(path.join(root, "src/admin/web/dashboard-widgets.json"), "utf8"));
|
||||||
const defaults = JSON.parse(fs.readFileSync(path.join(root, "src/admin/web/dashboard-defaults.json"), "utf8"));
|
const defaults = JSON.parse(fs.readFileSync(path.join(root, "src/admin/web/dashboard-defaults.json"), "utf8"));
|
||||||
@@ -68,6 +75,12 @@ assert.equal(widgets.find(widget => widget.id === "cache_outcomes").default_hidd
|
|||||||
assert.equal(defaults.dashboard_hidden_widgets.filter(id => id === "cache_outcomes").length, 1, "hidden in factory layout");
|
assert.equal(defaults.dashboard_hidden_widgets.filter(id => id === "cache_outcomes").length, 1, "hidden in factory layout");
|
||||||
const html = fs.readFileSync(path.join(root, "src/admin/web/partials/overview-metrics.html"), "utf8");
|
const html = fs.readFileSync(path.join(root, "src/admin/web/partials/overview-metrics.html"), "utf8");
|
||||||
assert.match(html, /data-dashboard-widget="cache_outcomes"/);
|
assert.match(html, /data-dashboard-widget="cache_outcomes"/);
|
||||||
|
assert.match(html, /class="cache-mix-header">\s*<span data-i18n="cacheMixTitle">[^<]+<\/span>\s*<small class="cache-mix-caption" id="cache-mix-caption"/);
|
||||||
|
assert.equal((html.match(/id="cache-mix-caption"/g) || []).length, 1, "counter shown only in top-right header");
|
||||||
|
const css = fs.readFileSync(path.join(root, "src/admin/web/style.css"), "utf8");
|
||||||
|
assert.match(css, /\.stat-cache-outcomes \.cache-mix-header \{\s*display: flex;/);
|
||||||
|
assert.match(css, /\.stat-cache-outcomes \.cache-mix-caption \{[^}]*text-align: right;/);
|
||||||
|
|
||||||
for (const key of ["hit", "miss", "bypass", "other"]) {
|
for (const key of ["hit", "miss", "bypass", "other"]) {
|
||||||
assert.match(html, new RegExp(`id="cache-mix-${key}"`));
|
assert.match(html, new RegExp(`id="cache-mix-${key}"`));
|
||||||
assert.match(html, new RegExp(`id="cache-mix-${key}-count"`));
|
assert.match(html, new RegExp(`id="cache-mix-${key}-count"`));
|
||||||
|
|||||||
Reference in new issue
Block a user