Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,28 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

---

## v26.05.10 (2026-05-31)

### Admin dashboard — HTTP request analytics on Traces

- The **Traces** view now leads with **live request analytics** computed from the
trace stream:
- **Stat cards**: Total Requests, Avg Duration, **Error Rate** (4xx+5xx %, tinted
amber/red when elevated), and Max Latency.
- **Status Mix**: a segmented bar + legend showing the 2xx/3xx/4xx/5xx split with
counts and percentages.
- **Latency Distribution**: a histogram across latency buckets (<10 ms … ≥1 s)
plus a **p50 / p90 / p95 / p99** percentile strip.
- Everything updates live as requests arrive (debounced) and resets on **Clear**.
- The client trace buffer is now **bounded to 500 entries** (matching the server
ring buffer): the in-memory array, the table DOM and the per-refresh analytics
cost no longer grow without bound on a long-lived dashboard tab.
- Responsive (cards/charts stack and resize on mobile, dark + light themes) and
accessible (the decorative mix bar is `aria-hidden`; the legend carries the
numbers). Avg Duration reads `--` (not `0.0 ms`) when no trace carries a duration.

---

## v26.05.09 (2026-05-31)

### Admin dashboard — live time-series metrics
Expand Down
2 changes: 1 addition & 1 deletion docs/modules/admin.md
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ stream for live updates.
|------|-----------|-------------|
| **Metrics** | `metrics` | Built-in process metrics (CPU, memory, threads, GC, uptime) always available without external dependencies. Optional Prometheus metrics included when `prometheus_client` is installed. Selecting a numeric metric opens a **live time-series trend** — a rolling chart polled at the configured refresh interval with a Value / Rate (Δ/s) toggle, pause/resume, Current/Min/Max/Avg summary, a measurement selector for multi-series (tagged) metrics, and a live-refreshing measurements table. Non-numeric metrics show a snapshot instead. |
| **Scheduled Tasks** | `scheduled` | All `@scheduled` tasks with cron expressions, fixed-rate/delay configuration, and execution status. |
| **HTTP Traces** | `traces` | Recent HTTP request/response traces captured by `TraceCollectorFilter`. Shows method, path, status code, duration, query string, client host, content type, user agent, and response content-length. Click-to-detail panel. Status code filter pills (All, 2xx, 3xx, 4xx, 5xx). Real-time SSE for new traces. Ring buffer of 500 entries. |
| **HTTP Traces** | `traces` | Recent HTTP request/response traces captured by `TraceCollectorFilter`. **Live request analytics**: total requests, average/max latency, error rate (4xx+5xx), a status-code mix bar (2xx/3xx/4xx/5xx), a latency-distribution histogram and latency percentiles (p50/p90/p95/p99) — all updating live as requests arrive. Shows method, path, status code, duration, query string, client host, content type, user agent, and response content-length. Click-to-detail panel. Status code filter pills (All, 2xx, 3xx, 4xx, 5xx). Real-time SSE for new traces. Client buffer bounded to the 500-entry ring buffer. |

### Infrastructure

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ name = "pyfly"
# CalVer YY.MM.PATCH — package metadata uses PEP 440 normalized form (26.5.4);
# git tag, GitHub release and human-readable display use leading-zero form
# (v26.05.04) to match the Java/.NET/Go siblings.
version = "26.5.9"
version = "26.5.10"
description = "The official Python implementation of the Firefly Framework — DI, CQRS, EDA, hexagonal architecture, and more."
readme = "README.md"
license = "Apache-2.0"
Expand Down
2 changes: 1 addition & 1 deletion src/pyfly/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@
# limitations under the License.
"""PyFly — Enterprise Python Framework."""

__version__ = "26.05.09"
__version__ = "26.05.10"
49 changes: 49 additions & 0 deletions src/pyfly/admin/static/css/admin.css
Original file line number Diff line number Diff line change
Expand Up @@ -2010,3 +2010,52 @@ body.wallboard-mode .admin-content {
grid-template-columns: repeat(2, 1fr);
}
}

/* ── Traces: status-mix bar ─────────────────────────────────────── */
.status-bar {
display: flex;
height: 14px;
border-radius: 999px;
overflow: hidden;
background: var(--admin-bg-subtle);
border: 1px solid var(--admin-border-subtle);
}

.status-bar-seg {
height: 100%;
transition: width var(--admin-transition);
min-width: 0;
}

.status-legend {
display: flex;
flex-wrap: wrap;
gap: 10px 20px;
margin-top: 16px;
}

.status-legend-item {
display: flex;
align-items: center;
gap: 8px;
font-size: 0.8rem;
color: var(--admin-text-secondary);
}

.status-legend-dot {
width: 10px;
height: 10px;
border-radius: 3px;
flex-shrink: 0;
}

.status-legend-count {
font-family: var(--admin-font-mono);
font-weight: 600;
color: var(--admin-text);
}

.status-legend-pct {
color: var(--admin-text-muted);
font-size: 0.72rem;
}
Loading
Loading