Commit Graph
49 Commits
Author SHA1 Message Date
n30nex a9b8c60a97 feat: stage current preview on dev for dev1 evaluation
Port the qualified server preview at 84ac3c8781 onto
org dev c7209b7043. Preserve upstream changes and
branch policies; keep the independent private Collector service separate.

Preview-Version: 2.2.0-n30nex.1
Preview-Revision: 84ac3c8781
2026-10-04 16:31:48 -04:00
MrAlders0n 52fc3e1e48 fix(ingest): validate topic keys and harden against malformed input
A short topic pubkey panicked a lane worker and killed the process; keys must
now be 32 bytes and lane workers recover. Also reject non-finite radio values
before airtime, strip NULs from advert names and neighbour scopes, guard the
MQTT client pointer, and never stream a broker copy of a hearing as a repeat.
2026-10-02 16:53:32 -04:00
MrAlders0n 98006a9364 feat(stats): serve historical stats from hourly rollups
Stats endpoints read hourly rollup tables filled once per closed hour by one
advisory-locked task, instead of materialized views that re-scanned every
observation on each refresh. IATA-set tables give exact distinct counts for any
IATA set or region. Cleanup holds raw rows for unrolled hours (up to 24h).

Adds /stats/series; ingest keeps packet observation counts, observer last IATA,
channel message counts and trace tag summaries. 001_baseline.sql is rewritten,
so pre-release 2.0 databases must be recreated. See docs/historical-stats.md.
2026-10-02 07:43:56 -04:00
MrAlders0n 5b177d6fc9 fix(ingest): strip NUL bytes from observer status
An observer sending NUL-padded status strings had every status update rejected
by Postgres, freezing its status and telemetry. Strip them from the text fields
and the stored JSON, and warn with the fields affected.

Also drop the timestamp-clamp, empty-timestamp and malformed-IATA logs to debug;
they're expected and outnumbered inserted packets several times over.
2026-09-30 18:31:42 -04:00
MrAlders0n 6852074180 fix(ingest): record hearing paths right after the insert
MarkSent ran after the side effects, so a broker copy on another worker could win it and be streamed as a repeat of the first hearing. It now runs before any further DB work, unconditionally so the set is warm before anyone opts in, and never for TRACE, whose path bytes are per-hop SNR.
2026-09-30 10:31:08 -04:00
MrAlders0n fd57c8b00c fix(ingest): accept space-separated and colonless-offset timestamps 2026-09-30 07:48:21 -04:00
n30nex 89a376c291 fix(ingest): accept RFC3339 timestamp offsets and precision 2026-09-30 07:33:53 -04:00
n30nex 3b806c1c39 fix(ingest): resolve advert endpoints after node updates 2026-09-30 07:33:45 -04:00
n30nex 574bba4e13 fix: address maintainer review for #174 2026-09-30 07:19:03 -04:00
n30nex c18e059e0d feat(scopes): import cached regional MeshMapper catalogues 2026-09-30 07:19:03 -04:00
n30nex 5fbba24a4a fix(observers): separate packet metrics from presence updates 2026-09-30 07:19:02 -04:00
MrAlders0n 1887fccb8d perf(ingest): reduce database work and buffer MQTT bursts (#179) 2026-09-27 22:56:03 -04:00
MrAlders0n 876d99704f feat(ws): opt-in includeRepeats streams later hearings over new paths (#178)
Duplicate observations are dropped before the hub today, so a live map only sees each packet's first hearing per observer. Clients that configure includeRepeats also get later hearings whose path is new; nothing is stored, repeats skip the count query, and they are dropped first when the broadcast channel is half full.
2026-09-27 20:38:49 -04:00
MrAlders0n dec643a2ad feat(ws): opt-in allowed origins and observer key (#170) 2026-09-27 11:41:11 -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
n30nex c02317a4ac feat(packets): summarize ACK and trace references (#161) 2026-09-23 20:18:48 -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
MrAlders0n b66573b3b7 feat(observers): per-observer activity endpoint (#135) 2026-09-10 06:53:00 -04:00
n30nex 04fc0266d1 fix(packets): preserve captured endpoint names in history (#128) 2026-09-09 18:45:52 -04:00
Enot (ded) Skelly b44cae89d7 add neighbor message parsing
closes #94
2026-07-30 13:19:18 -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 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
MrAlders0n ba0e85c44e fix(channels): review fixes for channel_iatas
Refresh last_heard on duplicate observations too, capped at hourly, so
steady traffic can't age a channel out of the filter while its packets
stay retained (dedup key has no heard_at). Guard the seed join against
the docker /dev/shm cap like the trace one, and drop the unused
last_heard index column so the upserts stay HOT.
2026-07-24 12:07:05 -07:00
MrAlders0n dff9c6cf00 perf(channels): track channel activity per IATA in its own table
The IATA filter ran a correlated EXISTS over packets/observations with
ILIKE, which skipped the iata index and took ~7s live. Keep a small
channel_iatas table at ingest (like node_iatas) and filter against it.
Also honor the iatas= param so multi-site regions stop getting the
global list. Filter now ages out with packet retention rather than
matching any retained packet.
2026-07-24 12:07:05 -07:00
Enot (ded) Skelly f07edf9fb6 feat: include source and destination in path data where available
realted to #85
2026-07-23 09:44:27 -07:00
Enot (ded) Skelly 7a58a07bbd fix: trace packet paths
closes #86
2026-07-23 09:20:00 -07:00
Enot (ded) Skelly 975f2f3656 feat(ws): make resolved paths a config toggle in session 2026-07-02 13:54:41 -07:00
Enot (ded) Skelly ca65ed1d9d fix(ingest): add more possible heard at timestamp formats 2026-07-02 13:09:26 -07:00
Enot (ded) Skelly a14a0ac658 feat(paths): included resolved path in ws observation events
changes to shared helper for resolve paths
2026-07-02 09:39:10 -07:00
Enot (ded) Skelly ee2fac1b20 fix(ingest): verify adverts 2026-07-02 08:27:36 -07:00
Enot (ded) Skelly 7aa5aa3d3a feat(neighbors): grab neighbors for nodes in traces w/ snr 2026-06-16 16:07:35 -07:00
Enot (ded) Skelly f6f94acad8 feat(neighbors): add zero hop advert neighbors for observers w/ snr 2026-06-16 14:47:30 -07:00
Enot (ded) Skelly fd24a71143 feat(neighbors): add observer neighbor snr on discovery response 2026-06-16 14:26:33 -07:00
Enot (ded) Skelly af6fbf627b docs(ingest): document other parsed payload structs 2026-06-16 09:48:37 -07:00
Enot (ded) Skelly b1501dfc1f feat(ingest): parse discover request and response 2026-06-16 09:47:53 -07:00
Enot (ded) Skelly 2619d0b904 chore: bump meshcore-go v1.0.8 2026-06-16 09:20:52 -07:00
Enot (ded) Skelly b58e5a1edc feat(api): differentiate traces and pings 2026-06-11 14:52:31 -07:00
Enot (ded) Skelly 73fa0be858 fix(routes): don't store single hop routes
migration to remove old single hop routes included
2026-06-11 14:09:10 -07:00
Enot (ded) Skelly cda4905815 docs: update SPDX license lines 2026-06-08 16:08:39 -07:00
Enot (ded) Skelly 14cb9e6e2d docs: add APGL3 license 2026-06-08 15:46:01 -07:00
Enot (ded) Skelly cace46b004 feat(ingest): status and nodeUpdate events on par with summary analogies
observer status updates are now at data parity with
observer summary and node update events are at data
parity with node summaries

closes #38
2026-06-08 12:17:16 -07:00
Enot (ded) Skelly 533225b46a hack: use server time for suspicious timestamps
i don't like it but multiple observer softwares are
sending the heard at timestamp with time zone errors
when it should be unix epoch ms
2026-06-08 08:20:03 -07:00
Enot (ded) Skelly 65cb8c9d61 add routes api
any route observer where all hops are high confidence
are now stored and available at /routes

you can also search for a src dest route and it will
return any recored route subset that can link the src
and dest hash
2026-06-05 15:57:08 -07:00
Enot (ded) Skelly f0c57fde45 add traces endpoint 2026-06-05 15:20:53 -07:00
Enot (ded) Skelly 882067455d add scope to ws packet events 2026-06-05 11:09:52 -07:00
Enot (ded) Skelly a943660778 rename to beacon 2026-06-05 08:10:43 -07:00
Enot (ded) Skelly 4425e3ffa2 refactor ingest package 2026-06-04 14:29:25 -07:00