n30nex
d3c330e8fb
fix: address maintainer review for #169
2026-09-30 07:19:02 -04:00
n30nex
5977e42c5c
test(observers): exercise non-finite raw and archived samples
2026-09-30 07:19:02 -04:00
n30nex
47342abc99
fix(observers): keep non-finite signal samples out of JSON
2026-09-30 07:19:02 -04:00
n30nex
5fbba24a4a
fix(observers): separate packet metrics from presence updates
2026-09-30 07:19:02 -04:00
n30nex
fd7c6b3eb7
feat(db): retain 30-day analytics independently of packet expiry ( #167 )
2026-09-30 07:16:27 -04:00
MrAlders0n
db30c9b573
fix(db): batch route reconfirmation to avoid ingest stalls ( #180 )
2026-09-28 08:41:48 -04:00
MrAlders0n
91b4b457b5
perf(db): resolve packet endpoints at read time ( #163 )
...
Storing a full candidate snapshot on every observation was the wrong call. The same node lists got copied thousands of times, about 22 GB on prod. Resolve endpoints live like path hops and drop the column.
2026-09-25 13:59:07 -04:00
MrAlders0n
3dee2098ba
perf(db): batch retention deletes and tune autovacuum ( #162 )
...
Default packets.retention drops to 7 days.
2026-09-25 11:38:04 -04:00
n30nex
c02317a4ac
feat(packets): summarize ACK and trace references ( #161 )
2026-09-23 20:18:48 -04:00
n30nex
8a3fa7e6bf
feat(stats): add bounded path and hash-width analytics ( #159 )
2026-09-23 20:18:41 -04:00
n30nex
6107578c25
feat(stats): add bounded reception signal analytics ( #157 )
2026-09-23 20:16:22 -04:00
n30nex
cf5ff7a974
feat(stats): compare flood packets reported by two observers ( #152 )
...
* feat(stats): compare distinct flood packets across observers
* test(stats): use the migrated observation deduplication key
2026-09-19 10:36:39 -04:00
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
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
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
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
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
69e7e196af
fix(db): tolerate packets before their first observation ( #115 )
2026-09-06 10:21:18 -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
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
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
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
MrAlders0n
a84112f7fb
fix(traces): review fixes for trace_iatas
...
Refresh last_heard on duplicate observations too, capped at hourly, so
steady traffic can't age a trace out of the filter (dedup key has no
heard_at). Drop the unused last_heard index column so upserts stay HOT,
and share one retention cutoff across the cleanup deletes.
2026-07-24 12:07:05 -07:00
MrAlders0n
457747b353
perf(traces): track trace activity per IATA in its own table
...
The trace list joined every trace packet to ~50M observations to apply
the IATA filter; the parallel hash join overran docker's 64MB /dev/shm
and the filtered list errored. Keep a small trace_iatas table at ingest
(like channel_iatas) and group packets by tag instead. Filtered stats
are now per tag rather than per matching packet.
2026-07-24 12:07:05 -07:00