apppack-stats
Live response-time stats from streamed AppPack web logs.
apppack-stats shells out to apppack logs --raw --follow for the app you
name, parses the JSON request lines, and renders a live Textual data
table grouped by (method, normalized path). Click any column header to
re-sort by it; click again to flip the direction.
Slowest endpoints — 1842/1903 lines parsed, 47s elapsed
┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━┓
┃ Method ┃ Path ┃ Count ┃ Avg ms ┃ p95 ms ┃ Max ms ┃ Err ┃
┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━┩
│ GET │ /reports/<id>/export │ 7 │ 1842 │ 2210 │ 2480 │ │
│ POST │ /api/v1/orders │ 23 │ 412 │ 711 │ 980 │ 2 │
│ GET │ /dashboard │ 91 │ 188 │ 320 │ 640 │ │
└────────┴───────────────────────────────┴───────┴────────┴────────┴────────┴─────┘
Usage
No install required — run it straight from PyPI with
uv:
uvx apppack-stats <appname>
Press q (or Ctrl+C) to stop.
Keys
| Key | Action |
|---|---|
| Click column header | Sort by that column (click again to reverse) |
n |
Toggle URL normalization on/off |
q |
Quit |
The AppPack CLI must be on
your PATH and authenticated against the account that owns the app.
Options
| Flag | Default | Notes |
|---|---|---|
--refresh SEC |
1.0 |
Seconds between redraws |
--start DUR |
5m |
How far back to seed history (30m, 2h, 1d, …) |
--prefix STRING |
none | AppPack log-group prefix filter — see note below |
--no-normalize |
off | Group by raw path instead of normalizing IDs |
-o, --output PATH |
none | On exit, write the final stats to PATH as CSV (- for stdout). Rows are sorted by whichever column was active in the UI when you quit. |
The table fills the terminal and scrolls when there are more rows than fit.
A note on --prefix
apppack logs --prefix filters on AppPack's underlying CloudWatch
log-group names, which don't always begin with the service name shown in
the rendered (web/web/<task>) label. Different AppPack apps use
different log-group naming conventions, so a fixed default like web
silently drops everything for some apps. By default apppack-stats
passes no prefix and lets the parser filter — only access-log JSON lines
(those with method, path, status, response_time_us) are counted;
everything else is skipped.
URL normalization
By default, paths are normalized so that /orders/12345 and /orders/67890
share a row as /orders/<id>. UUIDs become /<uuid>, long hex hashes
become /<hash>. Pass --no-normalize to keep raw paths.
Adding support for another log shape
Access-log shapes live in
src/apppack_stats/extractors.py.
Append a new LogShape(...) to the SHAPES list — pick a time_field
key that doesn't collide with existing ones, set time_unit to "us",
"ms", or "s", and the parser will pick it up automatically.
Metadata
Release files for apppack-stats 0.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| apppack_stats-0.6.0.tar.gz | 19.9 kB | Without provenance | Details for apppack_stats-0.6.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| apppack_stats-0.6.0-py3-none-any.whl | Python 3 | none | any | Details for apppack_stats-0.6.0-py3-none-any.whl |
Total release size: 38.6 kB
Release files / apppack_stats-0.6.0.tar.gz
| Download URL | apppack_stats-0.6.0.tar.gz |
|---|---|
| Size | 19.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
de3eb8f50b77c7bc11f78c5823306bc2f00ce7bcc785afe2afd3bd7f854ec169
|
|
BLAKE2b-256 checksum How to use checksums |
71f9ea64f47456daed5ca567aa4824bfbaf2dcd2d1e515d70398ca5cdef092ee
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / apppack_stats-0.6.0-py3-none-any.whl
| Download URL | apppack_stats-0.6.0-py3-none-any.whl |
|---|---|
| Size | 18.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d015330de9d4a898171eb2a34589eadf91a3e60d8d42fb396a9af9f38de4461f
|
|
BLAKE2b-256 checksum How to use checksums |
f6ab4a5d5f26714f31c88e3ae853729905f28b69baf8a5c3c210b8507e10135b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for apppack-stats 0.6.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.