Skip to content

v3.0.0

Choose a tag to compare

@rknightion rknightion released this 23 Jul 23:36
28f5234

3.0.0 (2026-07-23)

⚠ BREAKING CHANGES

  • zenarmor,syslog: close username-only auth bypass, bound receiver resources
  • zenarmor: the receiver no longer ships records describing its own ingest connection. Set --logs.zenarmor.drop-self-traffic=false to restore the old behaviour.
  • logship: opnsense_exporter_logs_parse_errors_total and opnsense_exporter_logs_rejected_total gain a source label. Aggregations such as sum by (stage) / sum by (reason) are unaffected; only exact full-label-set matches need updating.
  • pyroscope: --pyroscope.enable-mutex-block (default off) is replaced by --pyroscope.disable-mutex-block (default off = contention profiling ON), following the repo disable-* convention for default-on features. Env var is now OPNSENSE_EXPORTER_PYROSCOPE_DISABLE_MUTEX_BLOCK.
  • logship: --logs.diaglog.enabled DEFAULTED TO TRUE, so this is not a quiet opt-in removal -- every existing log-shipping user loses the config-change/gateway/CARP/portal audit trail until they configure a syslog target on the firewall pointing at the exporter. --logs.firewall.enabled and --logs.scopes are removed with it.

Features

  • collector: add StatusTracker + RunCollector for web UI (33e4976), closes #302
  • collector: decouple serving from collection via internal poll scheduler (#336 phase 1) (ac86cb9)
  • collector: derive bounded counters from Zenarmor records (a632f14), closes #276
  • collector: flow volume metrics, flags, docs and dashboard (280dcb5), closes #346
  • collector: per-collector poll tiers + interval config (#336 phase 2) (165d400)
  • collector: poll-observability metrics + interval in status snapshot (#336 phase 3) (8edea9c)
  • flow: bounded top-N rollup with monotone other folding (c266b48), closes #346
  • flow: correlator + DNS answer cache (#346 phase 3 seam) (8e35af9)
  • flow: DNS-domain enrichment, §9 metrics, Zenarmor conn attrs in place (#353) (8c1be6c)
  • flow: interface topology and the NetFlow ifIndex map (b303514)
  • flow: NetFlow pipeline, metrics, flags, docs and dashboard (20d5684)
  • flow: NetFlow v5/v9 decoder and hardened UDP receiver (d56d1c6)
  • flow: normalized flow.Record seam and community-id join key (0f14ede), closes #346
  • flow: OTLP flow-log emission path (#346 phase 3) (c00e524)
  • flow: VLAN de-dup, WAN egress correction and direction inference (06701db)
  • flow: wire correlator -> OTLP flow logs, phase-4 dashboard + rules (#346) (c974d21)
  • grafana: comprehensive coverage — Zenarmor tab, mixed Prometheus+Loki panels, curated alerts/recording rules (8818c03), closes #301
  • grafana: overhaul OPNsense dashboard (659c98a), closes #303
  • logship: add debug-capture mode for unmodelled receiver signals (f973082), closes #330
  • logship: add opnsense.action, a binary pass/block resource attribute (19d407b), closes #276
  • logship: add the Zenarmor Elasticsearch receiver (02edcdc), closes #276
  • logship: align syslog log attributes with OTel semantic conventions (f461953), closes #266
  • logship: map every lane's disposition onto opnsense.action (1060108), closes #276
  • logship: per-record source override for transport-agnostic sources (47c4476)
  • logship: replace the firewall and diaglog poll lanes with the syslog receiver (6f98b35), closes #238 #248
  • logship: source-label the receiver self-metrics (c990cc7), closes #276
  • logship: syslog receiver with OPNsense API log enrichment (174212d), closes #248
  • metricsnap: passive last-scrape family recorder (7b815cc), closes #302
  • opnsense: CacheSnapshot accessor for web UI freshness card (39d9323), closes #302
  • options: add --logs.zenarmor.transport selector (elasticsearch|syslog) (cf87f79)
  • options: require the syslog receiver for zenarmor transport=syslog (f6610a5)
  • options: web UI flags + redacted EffectiveConfig (53081ff), closes #302
  • options: wire the Zenarmor receiver behind --logs.zenarmor.* (6d0cbae), closes #276
  • pyroscope: collect all profile types by default incl. goroutine-leak (f5ab4d8), closes #269
  • syslog: add optional ProgramProcessor delegation hook (4d27493)
  • syslog: derive metrics from received logs, sample raw lines, and add TLS transport (18c2024), closes #258 #259
  • syslog: enrich every record, not just filterlog (+ parser registry) (310dd28), closes #261
  • syslog: optional program and severity filtering (269c7e9), closes #261
  • syslog: parse Suricata EVE alerts, and refuse to double-ship them (8ce1e9b), closes #261
  • syslog: parse the residual unparsed tail (cron, radvd, kea-dhcp6, dnsmasq-dhcp, configd.py) (2d1a718), closes #335
  • syslog: parse unbound local-zone query log (fecf5e3), closes #332
  • syslog: structure unbound SERVFAIL resolution failures (b169933), closes #334
  • syslog: structured parsers for audit, sshd, DHCP and HAProxy + tunnel names (e829bf6), closes #261
  • webui: active-series, log-throughput and fleet trend charts (58e48bb), closes #347
  • webui: cardinality suite (hub, drill-downs, label-values, export) (68cc734), closes #302
  • webui: connected-devices page with embedded OUI lookup (8211cce), closes #302
  • webui: fold cardinality into status snapshot for the single-page tabs (#337) (1705605)
  • webui: per-collector interval/next-run/freshness on CollectorRow (#337) (e5f55b2)
  • webui: redacted /config page with kill switch (d37523d), closes #302
  • webui: Run Now trigger endpoint + live-polling/filter/sort JS (6f2ce75), closes #302
  • webui: runtime-stats sampler for Overview parity (#337) (3f0e3bc)
  • webui: show pretty + raw collector names on /config (d9ed4fd), closes #302
  • webui: single inline tabbed console page (#337) (99630de)
  • webui: status console page + /api/status.json + render core (5e7a5b1), closes #302
  • webui: wire operator console into main + passive metrics recorder (0d34fcd), closes #302
  • zenarmor: derive flow.Record from conn documents (fbf51a1), closes #346
  • zenarmor: drive the shared processor from the syslog receiver (142575f)
  • zenarmor: drop records describing our own ingest connection (b454b0e), closes #278
  • zenarmor: handle _alias / _settings control-plane probes (b74523a), closes #331
  • zenarmor: let operators exclude known-boring traffic from the log stream (d31296f), closes #279
  • zenarmor: parse the daemon=zenarmor syslog message envelope (f2e1fba)

Bug Fixes

  • canary: exempt firmware upgrade_packages[].size as box state, not drift (47c8d9b)
  • canary: triage the live-box drift, and stop plugin-gated 404s warning (1473097), closes #243
  • config: reject telemetry paths that collide with health/ready routes (f3a96b1), closes #291
  • deps: update module github.com/prometheus/client_golang to v1.24.0 (#339) (9b126b8)
  • deps: update module github.com/prometheus/common to v0.70.1 (#352) (1e60b7f)
  • deps: update module google.golang.org/grpc to v1.82.1 (#273) (3eb0fac)
  • logship,collector: bound sender-controlled derived metric cardinality (8dc167f), closes #311 #326 #327
  • logship: actually rename subsystem to opnsense.subsystem on the wire (1ea8afd), closes #266
  • logship: HAProxy status_class label was always empty (e312922), closes #277
  • logship: make OTLP delivery observable with in-memory at-least-once (736289b), closes #290
  • logship: publish labelled counters at zero from startup (9f64c66), closes #280
  • logship: stop a permanently-refused batch wedging delivery, bound queue bytes (f697018), closes #304 #318 #325
  • opnsense: block credential-forwarding redirects, redact URL secrets, reject non-finite floats (2be2b4c), closes #305 #306 #307 #321 #323
  • opnsense: drop the metadata.subsystems model; it exists on no release (80649b1), closes #284
  • pyroscope: always collect goroutine profiles, not just under mutex/block (31d2aa7), closes #268
  • pyroscope: cap backend response bodies and make the flush timeout bound shutdown (1bb8c2e), closes #309 #310
  • server,otlp: bound scrape admission and stop echoing header secrets (342d15e), closes #308 #313 #324
  • server: gate /-/ready on poll-scheduler warm-up (9d43334), closes #341 #338
  • syslog: reassemble multi-line messages, and put promotable keys on the resource (9763ebf), closes #262 #263
  • syslog: satisfy errcheck and staticcheck (1788afb), closes #248
  • zenarmor,syslog: close username-only auth bypass, bound receiver resources (4865dca), closes #314 #315 #316 #317 #328
  • zenarmor: bound decompressed body size and request-body time (1605294), closes #288 #289
  • zenarmor: decode alertinfo arrays/number/string sid (9b2a0fb), closes #297
  • zenarmor: log which endpoint an unhandled call hit (bc800b0), closes #285
  • zenarmor: match self-traffic against any bound syslog port (ccf8b9d), closes #299

Performance

  • collector: tier wholly-static collectors cold/slow, dedupe plugin-gated list (bcb5caf), closes #344
  • runtime: bound concurrent OPNsense API fan-out during scrapes (8847e3f), closes #294

Refactoring

  • remove per-collector Run Now (POST trigger + inflight guard + RunCollector plumbing) (#337) (0d4b061)
  • zenarmor: extract shared docProcessor from handleDoc (6e8e988)

Miscellaneous

  • deps: update actions/checkout action to v7.0.1 (#340) (527651d)
  • deps: update actions/setup-go action to v7 (#275) (0896994)
  • deps: update actions/setup-python action to v7 (#333) (bbe5c45)
  • deps: update anthropics/claude-code-action action to v1.0.172 (#245) (260c8da)
  • deps: update anthropics/claude-code-action action to v1.0.173 (#247) (373c8dc)
  • deps: update anthropics/claude-code-action action to v1.0.174 (#265) (b4ae77e)
  • deps: update anthropics/claude-code-action action to v1.0.175 (#272) (27eeb7a)
  • deps: update anthropics/claude-code-action action to v1.0.176 (#287) (a334691)
  • deps: update anthropics/claude-code-action action to v1.0.177 (#300) (7e1fa25)
  • deps: update anthropics/claude-code-action action to v1.0.178 (#329) (84d20d2)
  • deps: update anthropics/claude-code-action action to v1.0.179 (#342) (892c72c)
  • deps: update anthropics/claude-code-action action to v1.0.180 (#351) (842351d)
  • deps: update anthropics/claude-code-action action to v1.0.181 (#354) (d20f894)
  • deps: update gcr.io/distroless/static-debian13:nonroot docker digest to f7f8f72 (#244) (047ef4e)
  • deps: update module github.com/anchore/syft to v1.47.0 (#274) (c3bfe94)
  • deps: update module github.com/anchore/syft to v1.48.0 (#282) (b2a1da5)
  • deps: update module github.com/anchore/syft to v1.49.0 (#345) (9cc3f33)
  • deps: update module github.com/anchore/syft/cmd/syft to v1.47.0 (#281) (94a3eec)
  • deps: update module github.com/anchore/syft/cmd/syft to v1.48.0 (#283) (98b3166)
  • deps: update module github.com/anchore/syft/cmd/syft to v1.49.0 (#348) (310c0c3)
  • deps: update opnsense-docs digest to aced3de (#355) (46f85a4)
  • deps: update opnsense-docs digest to c296d26 (#264) (12de5b4)
  • deps: update opnsense-docs digest to ee0a0c6 (#343) (92e8b7d)
  • deps: update opnsense-docs digest to f9807ac (#349) (a8da466)

Documentation

  • assets: replace the hub's social card with a real project card (efda35b)
  • canary: record healthCheck subsystems and nginxVts cacheZones as box state (dfd73ee), closes #271
  • claude: add box-state as the fifth canary drift verdict (5a5c62a)
  • collector: document the poll model + fix stale references (#336 phase 4) (7ebc2cb)
  • config: regenerate flag reference for the web UI flags (9b19a00)
  • correct two false claims left behind by #92 and #248 (c1ae453)
  • deployment: document the web UI operator console (28ff317), closes #302
  • docker: show the receiver ports in the compose example (37a0e7f)
  • nav: add the syslog receiver page to the site nav (7fd56da), closes #248
  • readme,site: lead with OTLP, syslog and flow differentiators; add GitHub backlinks (ce54152)
  • security: fix distroless private-CA trust recipe (ea9b864), closes #292
  • syslog: align prose with the phase-4 receiver features (0dd307e), closes #267
  • syslog: document the LogQL name mangling, and fix a duplicated bullet (69a7a62)
  • syslog: document the parsers, universal enrichment and filtering (cabb84a), closes #261
  • syslog: setup guide, k8s manifests and dashboard panels for the receiver (f41a600), closes #248
  • telemetry: document the OTLP resource-attribute convention (eee3006), closes #270
  • voice + de-AI pass across the docs base (63fb0ef), closes #267
  • webui: describe the single-page tabbed console; drop multi-page/Run-Now refs (#337) (eaa00c5)
  • zenarmor: document the elasticsearch|syslog transport selector (410b0f0)
  • zenarmor: document the receiver and add its dashboard panels (9e217a8), closes #276

Tests

  • cache: guard body TTLs against fast-polling collectors (e43abb4)
  • flow: fix flaky TestReplayRepair_VLANParentDuplicateSuppressed (06e5262)
  • flow: golden NetFlow v9 replay fixture from real capture (#346) (2d20aeb)
  • syslog: benchmark the enrichment path and pin its allocations (54e62fc), closes #286
  • zenarmor: cover the syslog-transport factory branch; note filter bypass (cf5f150)
  • zenarmor: end-to-end syslog transport across all five families (20ca1b7)

CI/CD

  • add a clean go test -race gate (87b705e), closes #295