Commit Graph
360 Commits
Author SHA1 Message Date
n30nex dab228e9bb feat(logging): configure levels and structured runtime output (#144)
* feat(logging): configure levels and structured runtime output

* fix(logging): bound request-derived log fields

* fix(logging): retain malformed IATA source attributes safely

* test(logging): capture structured REST rate-limit records
2026-09-19 10:36:26 -04:00
n30nex 595ef4442b feat(api): rate limit REST requests by trusted client IP (#140) 2026-09-19 08:43:24 -04:00
n30nex 0067e51357 feat(cache): add payload-free debug cache diagnostics (#145) 2026-09-18 06:18:42 -04:00
n30nex 93f85cab51 feat(auth): protect the admin subtree with a bearer key (#146) 2026-09-18 06:18:27 -04:00
n30nex 85b1c3961d feat(packets): populate advert summaries in history and live events (#143) 2026-09-18 06:18:19 -04:00
n30nex bcdea76c26 feat(stats): filter scope counts by IATA and region (#142)
* feat(stats): filter scope counts by IATA and region

* perf(stats): aggregate region observations before counting scopes
2026-09-18 06:18:06 -04:00
n30nex b21279c747 feat(db): add operator account lifecycle storage (#148) 2026-09-18 06:17:59 -04:00
n30nex 9164659544 feat(backup): export private database and saved-config bundles (#151)
* feat(backup): export bounded database and saved-config bundles

* test(backup): preserve synthetic channel keys in exports

* fix(backup): check writable file closure before publication
2026-09-18 06:17:52 -04:00
n30nex ce8c6cdf8b fix(ingest): honor explicit zero locations in adverts (#139) 2026-09-18 06:17:44 -04:00
n30nex b44769bef8 fix(observers): preserve advert pages with missing origin keys (#138)
* test(observers): cover adverts with a missing origin key

* fix(observers): preserve advert pages with missing origin keys
2026-09-18 06:17:33 -04:00
MrAlders0n e15f873597 fix(api): return JSON 500 when bucketed telemetry query fails (#137) 2026-09-10 07:55:52 -04:00
MrAlders0n d202205659 fix(observers): rename telemetry airtime fields to seconds (#136) 2026-09-10 07:17:29 -04:00
MrAlders0n b66573b3b7 feat(observers): per-observer activity endpoint (#135) 2026-09-10 06:53:00 -04:00
MrAlders0n 6521fddbb6 recover from interrupted CREATE INDEX CONCURRENTLY in migrations (#134) 2026-09-09 20:42:45 -04:00
n30nex 22410cf4a6 fix(api): trust client IP headers only from configured proxies (#133) 2026-09-09 20:42:35 -04:00
n30nex f390086058 fix(channels): preserve timestamp ties in page cursors (#132) 2026-09-09 20:25:07 -04:00
n30nex 5c5de43e83 perf(db): bound route pages to the requested IATA (#118) 2026-09-09 18:53:30 -04:00
n30nex 04fc0266d1 fix(packets): preserve captured endpoint names in history (#128) 2026-09-09 18:45:52 -04:00
n30nex 88bc0dc88a feat(retention): age out unreferenced observers when enabled (#126) 2026-09-09 18:45:08 -04:00
n30nex 2125df5b61 perf(db): include observation IATAs in trace packet reads (#120) 2026-09-09 18:44:52 -04:00
n30nex 04d059d7b3 perf(db): enrich clock-drift nodes after selecting the page (#122) 2026-09-09 18:44:39 -04:00
n30nex e234965f19 fix(db): paginate complete trace tag groups (#124) 2026-09-09 18:44:27 -04:00
n30nex f66d43106b fix(ingest): isolate MQTT client IDs across workers (#117) 2026-09-09 18:44:12 -04:00
n30nex a78ea368a3 fix(background): preserve refresh failures in task outcomes (#113) 2026-09-06 10:21:45 -04:00
n30nex 69e7e196af fix(db): tolerate packets before their first observation (#115) 2026-09-06 10:21:18 -04:00
n30nex 30327cd98d fix(api): bound list limits consistently (#112) 2026-09-06 10:20:45 -04:00
n30nex dfaa31d1dd perf(db): enrich nodes after selecting the directory page (#111) 2026-09-06 10:20:24 -04:00
MrAlders0n b5ab592534 fix: re-land IATA paging fix on Go 1.26.6 (#108) 2026-09-03 21:54:58 -04:00
Ded 137e3d265a Revert "fix: keep IATA packet paging alive past short pages"
This reverts commit ddc6dc1ca9.
2026-08-20 08:35:23 -07:00
MrAlders0n ddc6dc1ca9 fix: keep IATA packet paging alive past short pages
A packet repeats once per observer in the site scan, so grouping can
collapse a scan_depth window to fewer packets than the page asked for.
That short page set hasMore=false and stranded all older history: YOW
dead-ended after 45 packets, ~6 minutes back.

Report scan saturation and the floor the scans covered, and treat a
saturated short page as more data. Clamp the cursor to the floor so
paging on cannot skip the band the scan never read.
2026-08-19 16:21:26 -07:00
MrAlders0n 7d759d0a0f perf: known_routes retention, digest identity, and a working batched reconfirm (#98)
* fix: cascade channel_messages on packet delete

* rebuild known_routes keyed on (iata, path_key)

* add route retention delete, batch reconfirm, path_key upsert

* compute route path_key in store, add DeleteOldRoutes

* add routes retention config

* wire route retention into cleanup, batch reconfirm

* prune routes in reconfirm task, not cleanup

* expand routes retention docs in example config
2026-08-12 09:30:03 -04:00
MrAlders0n c6d23a2b52 fix: cascade channel_messages on packet delete 2026-08-11 12:59:10 -07:00
Enot (ded) Skelly b44cae89d7 add neighbor message parsing
closes #94
2026-07-30 13:19:18 -07:00
Enot (ded) Skelly 2cbd211e11 add IATA validation checks on ingest
closes #89
2026-07-30 13:00:29 -07:00
Enot (ded) Skelly ae0669ccbe enrich packet observations 2026-07-27 09:41:11 -07:00
Enot (ded) Skelly 336b734a42 feat: add stats api for new clock drift tracking
closes: #91
2026-07-24 14:01:12 -07:00
Enot (ded) Skelly d8371f04d0 feat: split top adverts into flood/direct
closes: #90
2026-07-24 13:49:40 -07:00
Enot (ded) Skelly 3799242bce docs: update for v1.6.0 2026-07-24 13:40:57 -07:00
Enot (ded) Skelly 201cd9e364 chore: version bump v1.6.0 v1.6.0 2026-07-24 13:31:23 -07:00
Enot (ded) Skelly 3cad2dfda1 feat: process messages for new channels at boot
any new channel added to config will get backfilled if there
are any messages to decrypt

closes: #68
2026-07-24 13:27:27 -07:00
Enot (ded) Skelly 976a38c09e chore: bump chi to 5.3.0 2026-07-24 13:21:51 -07:00
Enot (ded) Skelly 572f14b94b fix: formatting in cache test file 2026-07-24 13:18:14 -07:00
Enot (ded) Skelly 99d7eb0bab feat: add node stale/delete config
closes: #93
2026-07-24 13:09:51 -07:00
Enot (ded) Skelly 3f2506fc8b feat: add geojson for iatas
closes #66
2026-07-24 12:59:48 -07:00
MrAlders0n cbde3d02da perf(stats): matview-back top talkers and advertisers 2026-07-24 12:07:05 -07:00
MrAlders0n bc3a375816 perf(stats): bucket payload & observer matviews by hour for windowed queries
The payload-breakdown and top-observers matviews stored a single 7-day
total per group, so the 24h/7d/30d selector did nothing: payload ignored
the window entirely (the store discarded `since`) and top-observers only
varied which rows cleared the last_heard cutoff, never the counts.

Bucket both views by hour over a 30-day horizon and sum the buckets in
range, mirroring mv_hourly_iata_stats. The stats endpoints now honour the
requested window while still reading a small precomputed table.
2026-07-24 12:07:05 -07:00
MrAlders0n b93ce7aba6 serve top observers from a matview instead of scanning per request 2026-07-24 12:07:05 -07:00
MrAlders0n d8ff7d0542 track payload_type on observations and serve the breakdown from a matview 2026-07-24 12:07:05 -07:00
MrAlders0n 63c0b9779d perf(routes): index known_routes(last_seen)
The routes list orders by last_seen with no index, so every page
seq-scanned and sorted ~150k rows. Same fix as the packets list got
in 008.
2026-07-24 12:07:05 -07:00
MrAlders0n 42edcdeb7b perf(scopes): stop cross-joining packets in scope stats
GetScopeStats left-joined packets, observer_scopes and nodes at once,
multiplying rows into the millions before COUNT(DISTINCT) deduped them
(~10s per call). Count each table on its own and index packets(scope_id).
2026-07-24 12:07:05 -07:00