ForgeOps-Tracker
view release on metacpan or search on metacpan
CHANGELOG.md view on Meta::CPAN
# Changelog
## 0.13.0 (2026-10-13)
- Fixed: a batch the server refused was re-sent at every flush for as long as the process lived, with everything recorded since added to it. Performance samples and custom and infrastructure metrics are now dropped when the server answers with a 4xx ...
- A batch that could not be delivered for now (a network error, a timeout, a 5xx, a 408 or a 429) is still kept for the next flush, but only for 5 flushes in a row. After the fifth it is dropped and the buffer starts clean, so a long outage no longer...
- With a `logger`, each dropped batch is logged once with how many entries were dropped and why, and a 4xx answer is logged as rejected rather than failed.
- `flush_metrics()` no longer dies if a delivery dies; it counts as a failed flush.
- New `ForgeOps::Tracker::Client->last_status` returns `delivered`, `rejected` or `failed` for the client's most recent attempt (see `ForgeOps::Tracker::DeliveryStatus`). Every `deliver*` method still returns 1 or 0 as before.
## 0.12.3 (2026-10-03)
- `IO::Socket::SSL` (1.42+) and `Net::SSLeay` (1.49+) are now prerequisites, so `cpanm ForgeOps::Tracker` installs them. `HTTP::Tiny` needs both to send over https, which a ForgeOps DSN always is, and neither is core Perl: on a perl without them the ...
- When the DSN is https and this perl can't make https requests, `init()` now logs one line, once per process, through `logger` (or `warn` when no logger is set): `[ForgeOps] Not sending: the DSN is https, and this perl can't make https requests. Ins...
## 0.12.2 (2026-10-02)
- `cpanm ForgeOps::Tracker` now passes its own tests on a clean Perl. The tests' local HTTP server needs `HTTP::Server::PSGI`, and several tests use `Plack::Test`, but only `Test::More` was listed as a test requirement, so the install failed. `Plack`...
- With a DSN set and an environment that isn't enabled, `init()` now logs one line, once per process, through `logger` (or `warn` when no logger is set): `[ForgeOps] Not sending: this environment is "development", and only production, staging are ena...
## 0.12.1 (2026-10-01)
- A script that reports an error and exits straight away no longer loses it. When the program ends normally, the client now sends whatever errors, changes and traces are still waiting and lets a delivery already under way finish, for at most 5 second...
- New `ForgeOps::Tracker::flush($timeout)` sends everything still waiting right now and returns 1 once it has gone out (timeout in seconds, default 5). Use it before `POSIX::_exit` or `exec`, which skip the automatic send.
## 0.12.0 (2026-09-29)
- SQL masking now also catches strings with a backslash-escaped quote (`'o\'brien'`, `E'o\'brien'`), prefixed strings (`E''`, `X''`, `N''`, `B''`, `U&''`, prefix included), hex, binary and exponent numbers (`0x1F`, `0b101`, `3e10`, `1.5E-3`, `.5`), a...
## 0.11.0 (2026-09-25)
- A database span can now carry the SQL it ran: `ForgeOps::Tracker::span('Load orders', sub { ... }, kind => 'database', statement => $sql, db_system => 'postgresql')`, plus `record_database_span($name, $sql, $started_at, $duration_ms, db_system => ....
## 0.10.0 (2026-09-25)
- New `ForgeOps::Tracker::record_change(kind => ..., title => ..., details => {...}, environment => ..., service => ..., actor => ..., url => ..., id => ..., occurred_at => ...)` records something that changed in your system (a feature flag, a config...
- Changes between deploys are now detected automatically. Once per process, `init()` queues a snapshot of the Perl version for the background thread, and ForgeOps records whatever changed since the previous boot. Module versions are left out, since P...
- New `track_env_var_names` option (default 0) adds environment variable names, never values, to that snapshot. Host-specific names (`HOSTNAME`, `PATH`, `PORT`, `LC_*`, Kubernetes service variables, and others) and the client's own `FORGE_OPS_*` sett...
## 0.9.0
- Distributed tracing across services, using the W3C Trace Context standard (`traceparent`). Every request that passes through `PSGIPerformance` or `Dancer2Performance` now gets a trace id; one that arrives with a valid `traceparent` header continues...
- Every error reported during a request now says where it happened: `trace_id`, plus, under Dancer2, `transaction_name` (the same `GET /users/:id` name performance samples and traces already use) and `endpoint` (the HTTP method plus the route pattern...
- `ForgeOps::Tracker::http_span($method, $url, sub { my ($headers) = @_; ... }, data => {})` records an outgoing HTTP call as an `http` span named after the method and host, and hands your code the `traceparent` header to add to it; its parent id is ...
- An errored request's trace is always sent, however fast it was: an error reported while the request ran, or one escaping it. A Dancer2 route that dies now has its trace finished and sent (Dancer2 never runs `after_request` for it, so before this it...
- An error escaping a request keeps its trace id, transaction name, endpoint, user and breadcrumbs when it's reported after the performance integration has already finished the request: `Integrations::PSGI` enabled outside `PSGIPerformance` (the docu...
- With `track_tracing => 0`, requests still get a trace id (attached to errors and handed out by `http_span`, since that is also what links errors across services); only span reporting stops.
- Trace and span ids were already W3C shaped (32 and 16 lowercase hex characters); they are now also guaranteed never to be all zeros, the one value the standard reserves as invalid.
This client has earlier CPAN releases (see `$ForgeOps::Tracker::VERSION`'s history in source control), but no `CHANGELOG.md` existed for it before this entry; like `sdks/java`'s, it starts here without backfilling earlier versions.
( run in 1.078 second using v1.01-cache-2.11-cpan-16aabcbfbcb )