diff --git a/CHANGELOG.md b/CHANGELOG.md index f18b1bc..7c346fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,11 @@ Release history focused on **features, settings, default behavior, compatibility ## 0.36.11 — more Backends metrics -- **Backends overview — new columns:** seven more metrics, each sortable and switchable under **Columns**, fill the empty space of wide screens. **HTTP codes** (on by default) shows the 2xx share, any 4xx/5xx shares and a stacked 2xx/3xx/4xx/5xx bar. **Cache** (on by default) shows a HIT-ratio ring and how many bytes were served from cache versus fetched from the backend (ORIGIN); the tooltip lists HIT/MISS/BYPASS counts. **Req/s** shows the current request rate of the backend. **p95 / p99** shows latency percentiles, read from the latency histogram (shown as the bucket's upper bound; above 5 s is shown as ">5 s"). **Probe** shows the last active health-check latency and how long ago it ran. **Error causes** shows up to three most frequent failure counters (5xx, timeout, connect, TLS, DNS, I/O, queue, limit, retry). **Protocol** shows the last observed upstream protocol (H1/H2) and the HTTP/2 share. HTTP codes, Cache and p95 / p99 are counted per vhost, so all backends of one vhost show the same value. The vhosts panel backend table offers the same columns as text. +- **Backends overview — new columns:** seven more metrics, each sortable and switchable under **Columns**, fill the empty space of wide screens. **HTTP codes** (on by default) shows the 2xx share, any 4xx/5xx shares and a stacked 2xx/3xx/4xx/5xx bar. **Cache** (on by default) shows a HIT-ratio ring, the response bytes served from the vhost's cache (CACHE) and the response bytes this backend delivered (ORIGIN); the tooltip lists HIT/MISS/BYPASS counts. **Req/s** shows the current request rate of the backend. **p95 / p99** shows latency percentiles, read from the latency histogram (shown as the bucket's upper bound; above 5 s is shown as ">5 s"). **Probe** shows the last active health-check latency and how long ago it ran. **Error causes** shows up to three most frequent failure counters (5xx, timeout, connect, TLS, DNS, I/O, queue, limit, retry). **Protocol** shows the last observed upstream protocol (H1/H2) and the HTTP/2 share. HTTP codes, Cache and p95 / p99 are counted per vhost, so all backends of one vhost show the same value. The vhosts panel backend table offers the same columns as text. - **Status API:** each `vhost_metrics` entry in `GET /api/status` (full and `view=live`) adds `status_classes` (1xx–5xx counters), `p95_latency_ms` and `p99_latency_ms` (`null` without traffic). A new top-level `vhost_cache_totals` object (vhost ID → `hits`, `misses`, `bypasses`, `saved_body_bytes`) sums the cache domain statistics per vhost. - **Preferences API:** `backend_table_columns` and `backend_table_sort` accept `rate`, `statuses`, `p95`, `cache`, `probe`, `causes` and `protocol`. The default column set adds `statuses` and `cache`; the other new columns are opt-in. +- **Info popovers:** the "i" explanations (for example next to Response time history) were drawn as one long line running past the card when they sat in a single-line chart header; they now wrap inside the popover. +- **Documentation:** refreshed screenshots (dark theme, 90% scale, interface icons, collapsed menu, colour-blind safe charts) and a new Backends card screenshot in the screenshot tour. - **Upgrade notes:** no configuration or database migration is required. An account that has already saved its own column choice keeps it, so enable the new columns under **Columns** in the Backends card. ## 0.36.10 — Fit to screen, collapsible menu and smoother startup diff --git a/docs/SCREENSHOTS.md b/docs/SCREENSHOTS.md index 7c63779..6293179 100644 --- a/docs/SCREENSHOTS.md +++ b/docs/SCREENSHOTS.md @@ -2,6 +2,8 @@ A tour of the RustProxy administration panel. The panel runs on the separate administration listener (by default `http://127.0.0.1:9090`) and is available in English and Polish, with light and dark themes. +The screenshots show demo data with the dark theme, 90% interface scale, SVG interface icons, the collapsed left menu and the colour-blind safe chart palette. + ## Sign-in Local administrator sign-in. The first account is created with a one-time setup token; there is no default password. @@ -14,6 +16,10 @@ Live requests per second, bandwidth, status codes, cache hit ratio, protocol mix ![Overview dashboard](images/overview.png) +The Backends card lists every backend with request rate, HTTP status classes, latency trend, p95/p99, health probe, cache HIT ratio with cache/origin bytes, traffic and the last event. Columns can be chosen under **Columns**. + +![Backends card](images/overview-backends.png) + ## Vhosts Every published domain with its listeners, backends, health, request rate and security options. The editor groups frontend, backends, balancing, security, cache and custom locations. diff --git a/docs/images/about.png b/docs/images/about.png index f76b08b..190d424 100644 Binary files a/docs/images/about.png and b/docs/images/about.png differ diff --git a/docs/images/api.png b/docs/images/api.png index f70815d..2e162c2 100644 Binary files a/docs/images/api.png and b/docs/images/api.png differ diff --git a/docs/images/cache.png b/docs/images/cache.png index b59197f..b33ef6f 100644 Binary files a/docs/images/cache.png and b/docs/images/cache.png differ diff --git a/docs/images/certificates.png b/docs/images/certificates.png index 0aa2c58..67ae8ba 100644 Binary files a/docs/images/certificates.png and b/docs/images/certificates.png differ diff --git a/docs/images/documentation.png b/docs/images/documentation.png index a2e6a08..4df0c5d 100644 Binary files a/docs/images/documentation.png and b/docs/images/documentation.png differ diff --git a/docs/images/login.png b/docs/images/login.png index fefdac2..98da967 100644 Binary files a/docs/images/login.png and b/docs/images/login.png differ diff --git a/docs/images/logs.png b/docs/images/logs.png index fac1f24..0e12e85 100644 Binary files a/docs/images/logs.png and b/docs/images/logs.png differ diff --git a/docs/images/overview-backends.png b/docs/images/overview-backends.png new file mode 100644 index 0000000..3e09742 Binary files /dev/null and b/docs/images/overview-backends.png differ diff --git a/docs/images/overview.png b/docs/images/overview.png index d8a07b3..fa5f91f 100644 Binary files a/docs/images/overview.png and b/docs/images/overview.png differ diff --git a/docs/images/settings.png b/docs/images/settings.png index f1ca95b..a66fe59 100644 Binary files a/docs/images/settings.png and b/docs/images/settings.png differ diff --git a/docs/images/traffic.png b/docs/images/traffic.png index c739d2d..ce6974d 100644 Binary files a/docs/images/traffic.png and b/docs/images/traffic.png differ diff --git a/docs/images/vhost-editor.png b/docs/images/vhost-editor.png index 285e885..e32e506 100644 Binary files a/docs/images/vhost-editor.png and b/docs/images/vhost-editor.png differ diff --git a/docs/images/vhosts.png b/docs/images/vhosts.png index d151ae0..ef401b4 100644 Binary files a/docs/images/vhosts.png and b/docs/images/vhosts.png differ diff --git a/docs/images/web-server.png b/docs/images/web-server.png index ed17560..10bbf24 100644 Binary files a/docs/images/web-server.png and b/docs/images/web-server.png differ diff --git a/src/admin/web/css/10-base.css b/src/admin/web/css/10-base.css index 06315bf..164a672 100644 --- a/src/admin/web/css/10-base.css +++ b/src/admin/web/css/10-base.css @@ -1324,6 +1324,9 @@ html[data-interface-icons="true"] .network-interface-hidden .quiet>svg.ui-icon { border-radius: var(--rp-radius-surface, 6px); background: var(--panel2); box-shadow: 0 12px 30px var(--shadow-mid); + white-space: normal; + text-align: left; + overflow-wrap: break-word; } .metric-info-popover .fine { diff --git a/src/admin/web/vhosts/render.js b/src/admin/web/vhosts/render.js index 4f525a9..b71a166 100644 --- a/src/admin/web/vhosts/render.js +++ b/src/admin/web/vhosts/render.js @@ -297,7 +297,7 @@ function backendExtraMetrics(pool, member, status, snapshot, now, seen) { const classes = Array.isArray(vhost.status_classes) ? vhost.status_classes.map(value => Math.max(0, Number(value) || 0)) : [0, 0, 0, 0, 0]; const classTotal = classes.reduce((sum, value) => sum + value, 0); const hits = Number(cacheTotals?.hits) || 0, misses = Number(cacheTotals?.misses) || 0, bypasses = Number(cacheTotals?.bypasses) || 0, lookups = hits + misses + bypasses; - const cacheBytes = Math.max(0, Number(cacheTotals?.saved_body_bytes) || 0), outBytes = Math.max(cacheBytes, Number(vhost.bytes_out) || 0), originBytes = Math.max(0, outBytes - cacheBytes); + const cacheBytes = Math.max(0, Number(cacheTotals?.saved_body_bytes) || 0), originBytes = Math.max(0, Number(member.bytes_out) || 0), outBytes = cacheBytes + originBytes; const p95 = Number(vhost.p95_latency_ms) || 0, p99 = Number(vhost.p99_latency_ms) || 0; const probeOff = member.health_mode === "off", probeLatency = Number(member.latency_ms) || 0, probeAt = Number(member.last_probe_ms) || 0; const causes = BO_CAUSES.map(([field, label]) => ({ label, value: Math.max(0, Number(member[field]) || 0) })).filter(cause => cause.value > 0).sort((a, b) => b.value - a.value);