You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
v3.2.4 (2026-10-15)
Redis persistence off the request path and Python agent parity (v3.2.4)
Fixed
addEvent and addMetric no longer await Redis, so a slow or failing Redis no longer delays requests that emit events. A Redis failure that reported through sendEvent used to re-enter persistence through unbounded async recursion; persists are now tracked background promises scoped by AsyncLocalStorage and drained on stop. In-flight persists are capped at bufferSize (shared by events and metrics): past the cap the item stays in memory only, counts toward redisPersistFailures, and one warning is logged per degradation episode. The startup encryption error now includes the cause. Lockstep release with the agent family at 3.2.4.
The rules loop starts only when projectId is set, like the Python agent. Without a project id there is nothing to fetch rules for.
Redis keys use a wall-clock epoch nanosecond stamp at microsecond resolution (performance.timeOrigin + performance.now()), like time.time_ns() in the Python agent. Reload keeps the reference semantics: keys are walked in the order Redis returns them.
SecurityEvent keeps unknown fields as extra and eventToWire sends them, like the reference extra="allow". They survive metadata redaction and a Redis round trip and never override a known field.
getStats() keeps the reference key set (pinned by a test). The code comment on signing.ts now states that the signature covers the uncompressed body.