0.9.0
GeoMetrikks can now watch several machines. Agents tail logs where they run, write to a shared database, and feed one map.
Added
APP_MODE=agentruns the same image as a remote agent. It tails, geolocates, writes, and publishes to the live map, serving only/healthand/health/ready. An agent reports not-ready until the primary's schema has arrived, so an orchestrator restarts it into a fresh wait instead of leaving it idle.LOGPARSER_ENABLED=falseturns a full instance into a UI head with no local tailing, shown as a neutral "Ingestion off" state rather than as bad health.LOGPARSER_HOST_NAMEtakes a JSON list matched positionally toLOGPARSER_LOG_PATHS, so one instance tailing logs shipped from several machines records each file under its source hostname.litestar import-logs --hostnamesets the stamped hostname per import, and the command echoes which hostname it stamps.- Source filtering on the map: a Sources control beside the country and city filters, filter state in the URL for shareable links, live traffic and vitals limited to the selected sources, and the source hostname on live popups and feed rows.
- Multi-site home locations. Each agent detects its own public-IP location and records it per hostname, and live routes fly to their source's home with one beacon per site.
MAP_HOME_LOCATIONSoverrides coordinates for sites that geolocate wrong or whose logs ship from another machine. Detection refreshes on its ownMAP_HOME_REFRESH_HOURScadence (24h by default).GET /api/v1/geo-locations/site-homesserves each hostname's home plus the instance default, and Settings > Status lists them with whether they came from detection or an override. - Settings > Status shows operator advisories from the health endpoint. The first warns when recorded hostnames look like Docker container IDs, and gives the command that consolidates them.
dev/, a committed local multi-source harness.docker compose -f dev/docker-compose.agents.yml --env-file .env up --buildstarts a dedicated TimescaleDB, a UI head, two agents (nginx and traefik formats), and a log injector feeding them synthetic traffic for as long as the stack runs.
Changed
/ws/livefans out through PostgreSQL LISTEN/NOTIFY, so committed traffic from any writer process reaches the map, and live events carry the source hostname. Batch imports no longer feed the live map.- The map layer choice and the Live toggle persist across visits.
- Upgrade note. The location aggregates rebuild once at startup with a per-hostname dimension, which keeps source-filtered maps fast. History older than the raw retention window (180 days by default) cannot be rebuilt and is dropped at that upgrade. Installs carrying many container-ID hostnames skip the rebuild until they consolidate; the status page advisory says so.
Fixed
- The compose files size the TimescaleDB worker pool for the app's ~32 background jobs (
timescaledb.max_background_workers=40,max_worker_processes=51). That stops the periodic "failed to launch job ... out of background workers" warnings when the aggregate refresh policies all fire at once. Existing installs: copy thecommand:block fromdocker-compose.ymlonto the database service and recreate it. docker-compose.ymlsetsstop_grace_period: 20son the app service, as the deployment docs already prescribed. Docker's 10s default raced Granian's 15s worker-kill timeout, sodocker stopcould SIGKILL the container mid-teardown and lose the ingestion batch still in flight. Existing installs: add the same line to your app and agent services.
What's Changed
- feat: per-file source hostnames (LOGPARSER_HOST_NAME list) by @GilbN in #131
- feat: live feed over Postgres LISTEN/NOTIFY (channels) by @GilbN in #132
- feat: agent mode, UI-head, and channels hardening by @GilbN in #134
- feat: map source filter with hostname-dimensioned location CAGGs by @GilbN in #140
- feat: multi-site home locations by @GilbN in #141
- fix(compose): give the app a 20s stop grace period by @GilbN in #151
- Release 0.9.0 by @GilbN in #152
Full Changelog: v0.8.0...v0.9.0