From b4152e0e5fead7afdc37bfc73577b6498e744617 Mon Sep 17 00:00:00 2001 From: "Enot (ded) Skelly" Date: Tue, 16 Jun 2026 09:00:06 -0700 Subject: [PATCH] feat(ingest): use last seen in observer online check now uses last seen (packet message) as well as last status (status message) as indicators of observer being online or not --- db/observers.go | 3 ++- db/observers_test.go | 4 ++-- db/queries/queries.sql | 4 ++-- db/sqlc/queries.sql.go | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/db/observers.go b/db/observers.go index 25aec9b..0eb0ce9 100644 --- a/db/observers.go +++ b/db/observers.go @@ -140,7 +140,8 @@ func (s *Store) GetObserver(ctx context.Context, observerID uuid.UUID) (*api.Obs }) } observer.Brokers = brokers - if obs.LastStatusAt.Valid && time.Since(obs.LastStatusAt.Time) < 5*time.Minute { + if (obs.LastStatusAt.Valid && time.Since(obs.LastStatusAt.Time) < 5*time.Minute) || + (obs.LastSeen.Valid && time.Since(obs.LastSeen.Time) < 5*time.Minute) { observer.Status = "online" } var lastStatusAt *int64 diff --git a/db/observers_test.go b/db/observers_test.go index e4ec75e..07f738f 100644 --- a/db/observers_test.go +++ b/db/observers_test.go @@ -184,7 +184,7 @@ func TestGetObserver_OnlineStatus(t *testing.T) { PublicKey: []byte{0x01}, ObservationCount: &obsCount, FirstSeen: pgtype.Timestamptz{Time: time.Now().Add(-time.Hour), Valid: true}, - LastSeen: pgtype.Timestamptz{Time: time.Now(), Valid: true}, + LastSeen: pgtype.Timestamptz{Time: time.Now().Add(-time.Minute), Valid: true}, LastStatusAt: pgtype.Timestamptz{Time: time.Now().Add(-time.Minute), Valid: true}, }, nil) @@ -227,7 +227,7 @@ func TestGetObserver_OfflineStatus(t *testing.T) { PublicKey: []byte{0x01}, ObservationCount: &obsCount, FirstSeen: pgtype.Timestamptz{Time: time.Now().Add(-time.Hour), Valid: true}, - LastSeen: pgtype.Timestamptz{Time: time.Now(), Valid: true}, + LastSeen: pgtype.Timestamptz{Time: time.Now().Add(-10 * time.Minute), Valid: true}, LastStatusAt: pgtype.Timestamptz{Time: time.Now().Add(-10 * time.Minute), Valid: true}, }, nil) diff --git a/db/queries/queries.sql b/db/queries/queries.sql index 935d22d..7afbb4a 100644 --- a/db/queries/queries.sql +++ b/db/queries/queries.sql @@ -146,7 +146,7 @@ SELECT o.radio_bw_khz, array_remove(array_agg(DISTINCT ts.name ORDER BY ts.name), NULL)::text[] AS scopes, COALESCE(CASE - WHEN o.last_status_at > NOW() - INTERVAL '5 minutes' THEN 'online' + WHEN GREATEST(COALESCE(o.last_status_at, o.last_seen), o.last_seen) > NOW() - INTERVAL '5 minutes' THEN 'online' ELSE 'offline' END, 'offline')::text AS status, COALESCE(( @@ -169,7 +169,7 @@ WHERE AND ($2 = '' OR o.observer_type = $2) AND ($3 = '' OR ob.broker_name = $3) AND ($4 = '' OR CASE - WHEN o.last_status_at > NOW() - INTERVAL '5 minutes' THEN 'online' + WHEN GREATEST(COALESCE(o.last_status_at, o.last_seen), o.last_seen) > NOW() - INTERVAL '5 minutes' THEN 'online' ELSE 'offline' END = $4) AND ($5 = '' OR o.display_name ILIKE '%' || $5 || '%') diff --git a/db/sqlc/queries.sql.go b/db/sqlc/queries.sql.go index c385605..735c00e 100644 --- a/db/sqlc/queries.sql.go +++ b/db/sqlc/queries.sql.go @@ -2279,7 +2279,7 @@ SELECT o.radio_bw_khz, array_remove(array_agg(DISTINCT ts.name ORDER BY ts.name), NULL)::text[] AS scopes, COALESCE(CASE - WHEN o.last_status_at > NOW() - INTERVAL '5 minutes' THEN 'online' + WHEN GREATEST(COALESCE(o.last_status_at, o.last_seen), o.last_seen) > NOW() - INTERVAL '5 minutes' THEN 'online' ELSE 'offline' END, 'offline')::text AS status, COALESCE(( @@ -2302,7 +2302,7 @@ WHERE AND ($2 = '' OR o.observer_type = $2) AND ($3 = '' OR ob.broker_name = $3) AND ($4 = '' OR CASE - WHEN o.last_status_at > NOW() - INTERVAL '5 minutes' THEN 'online' + WHEN GREATEST(COALESCE(o.last_status_at, o.last_seen), o.last_seen) > NOW() - INTERVAL '5 minutes' THEN 'online' ELSE 'offline' END = $4) AND ($5 = '' OR o.display_name ILIKE '%' || $5 || '%')