nginx-ipng-stats-plugin (0.8.2-1) unstable; urgency=medium

  * Pre-release v0.8.2.
    - New per (source_tag, vip) in-flight gauges:
      nginx_ipng_active, nginx_ipng_reading, nginx_ipng_writing.
      Lifecycle: POST_READ handler increments active+reading
      on each main request, a header filter transitions
      reading->writing when headers are sent, and a pool
      cleanup decrements on request finalization. Gauges live
      in a dedicated rbtree in the shared zone; the slab mutex
      is taken only on first insert per (source, vip) pair —
      subsequent transitions are lock-free atomic inc/dec on
      the cached node. Subrequests and internal redirects do
      not double-count. Gauges are emitted in both Prometheus
      (`gauge` typed) and JSON (`"gauges":{...}` per record)
      scrape outputs. Invariant: reading + writing = active.

 -- Pim van Pelt <pim@ipng.ch>  Thu, 23 Apr 2026 12:00:00 +0200

nginx-ipng-stats-plugin (0.8.1-1) unstable; urgency=medium

  * Pre-release v0.8.1.
    - Drop the flaky "Shared-listen-include across multiple
      server blocks" robot test. It asserted that nginx's NOTICE
      log line "ipng_stats: stripped socket options from
      duplicate listen" appeared on stderr of `nginx -t 2>&1`,
      but the NOTICE lands in the configured error_log
      destination (which the lab routes into docker's log stream)
      rather than the subprocess's stderr. The stripping
      behaviour itself still works — it's just not observable
      from `nginx -t` output in this harness.

 -- Pim van Pelt <pim@ipng.ch>  Wed, 22 Apr 2026 10:10:00 +0200

nginx-ipng-stats-plugin (0.8.0-1) unstable; urgency=medium

  * Pre-release v0.8.0.
    - Log handler now accounts for request bodies that nginx
      discarded before any handler could read them (rate-limit
      403, auth_request denial, 413 on fixed Content-Length,
      early `return 4xx;` on POST). Those paths route through
      ngx_http_discard_request_body / HTTP/2 skip_data, both of
      which drop bytes without touching r->request_length —
      leaving nginx_ipng_bytes_in_total blind to most of the
      wire on rate-limited POST-heavy workloads (observed ~20x
      gap against btop on a CT-log-style box). When
      r->discard_body is set and the client advertised a
      Content-Length, we now add content_length_n to bin_sz.
      Normal 200-OK POSTs are unchanged. See docs/nginx-issues.md
      for the full analysis of which nginx paths update
      r->request_length and which don't.

 -- Pim van Pelt <pim@ipng.ch>  Wed, 22 Apr 2026 09:59:53 +0200

nginx-ipng-stats-plugin (0.7.2-1) unstable; urgency=medium

  * Pre-release v0.7.2.
    - Listen wrapper now strips socket-level options (reuseport,
      bind, backlog=, rcvbuf=, sndbuf=, setfib=, fastopen=,
      accept_filter=, deferred, ipv6only=, so_keepalive=) from
      cf->args when a sockaddr recurs under a different server
      block. Previously this pattern — typical with a shared
      `include listens.conf;` across vhosts — tripped nginx's
      "duplicate listen options for <addr>" check because those
      options are one-shot per kernel socket. The first cscf now
      owns the options on the shared kernel socket and later
      cscfs merge cleanly via ngx_http_add_server. A NOTICE is
      logged each time socket options are stripped. This makes
      `reuseport` usable with the shared-include deployment
      pattern from docs/user-guide.md, which helps worker
      load-balancing on busy hosts.

 -- Pim van Pelt <pim@ipng.ch>  Sun, 19 Apr 2026 16:30:00 +0200

nginx-ipng-stats-plugin (0.7.1-1) unstable; urgency=medium

  * Pre-release v0.7.1.
    - Listen wrapper now deduplicates on (server block, sockaddr)
      across both plain and device-tagged listens. A plain
      `listen 80;` and `listen 80 device=eth0 ...;` in the same
      server block now coexist, matching the runtime reality under
      the IP_PKTINFO attribution model (all same-sockaddr listens
      collapse to one wildcard kernel socket). Docs updated to
      drop the "must be device-tagged" restriction.

 -- Pim van Pelt <pim@ipng.ch>  Sun, 19 Apr 2026 10:00:00 +0200

nginx-ipng-stats-plugin (0.7.0-1) unstable; urgency=medium

  * Pre-release v0.7.0.
    - New ipng_stats_rescan_interval directive (default 60s, 0 to
      disable). Per-worker timer that re-resolves every device= →
      ifindex mapping, self-healing attribution after interface
      teardown/recreate without requiring nginx -s reload.
    - New nginx_ipng_ifindex_misses_total counter: connections whose
      ingress ifindex didn't match any configured binding. Surfaces
      stale mappings and genuinely-unconfigured interfaces.
    - Expose the existing nginx_ipng_zone_full_events_total and
      nginx_ipng_flushes_total meta counters in both the Prometheus
      and JSON scrape outputs. JSON gains a top-level "meta" object
      alongside "records" (schema unchanged, additive).

 -- Pim van Pelt <pim@ipng.ch>  Sat, 18 Apr 2026 19:36:36 +0200

nginx-ipng-stats-plugin (0.6.0-1) unstable; urgency=medium

  * Pre-release v0.6.0.

 -- Pim van Pelt <pim@ipng.ch>  Sat, 18 Apr 2026 15:30:40 +0200

nginx-ipng-stats-plugin (0.5.0-1) unstable; urgency=medium

  * Pre-release v0.5.0.

 -- Pim van Pelt <pim@ipng.ch>  Sat, 18 Apr 2026 14:38:25 +0200

nginx-ipng-stats-plugin (0.4.0-1) unstable; urgency=medium

  * Pre-release v0.4.0.

 -- Pim van Pelt <pim@ipng.ch>  Sat, 18 Apr 2026 13:15:15 +0200

nginx-ipng-stats-plugin (0.3.0-1) unstable; urgency=medium

  * Pre-release v0.3.0.

 -- Pim van Pelt <pim@ipng.ch>  Sat, 18 Apr 2026 11:47:26 +0200

nginx-ipng-stats-plugin (0.2.0-1) unstable; urgency=medium

  * Reduce scrape cardinality.
    - Status codes are collapsed to six class lanes
      (1xx/2xx/3xx/4xx/5xx/unknown) on the counter key. Per-(source, vip)
      counter cardinality is now bounded at six regardless of response mix.
    - Histograms drop the code label entirely and aggregate across classes
      per (source, vip).
    - New nginx_ipng_latency_total counter (with code class label) exposes
      per-class mean latency via latency_total / requests_total.
    - New nginx_ipng_bytes_in and nginx_ipng_bytes_out histograms; bucket
      bounds configurable via the new ipng_stats_byte_buckets directive.
    - JSON schema bumped to 2. Records are now per-(source, vip) with an
      inner `classes` map.
    - Operators needing per-three-digit-code breakdowns should consume
      ipng_stats_logtail off-host; the stats zone intentionally trades
      that resolution for a smaller, bounded scrape.

 -- Pim van Pelt <pim@ipng.ch>  Fri, 17 Apr 2026 12:36:57 +0000

nginx-ipng-stats-plugin (0.1.0-1) unstable; urgency=medium

  * Initial release.
    - ngx_http_ipng_stats_module: per-VIP, per-device HTTP traffic
      counters, attributed via SO_BINDTODEVICE on per-interface
      listening sockets, exposed as Prometheus text and JSON from a
      single scrape endpoint.
    - Debian package libnginx-mod-http-ipng-stats builds against the
      target release's nginx-dev headers with --with-compat and loads
      into stock upstream nginx without recompiling nginx itself.

 -- Pim van Pelt <pim@ipng.ch>  Thu, 16 Apr 2026 00:00:00 +0000
