Changelog
View SourceAll notable changes to this project are documented here. The format follows Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
[0.1.0] - TBD
Initial public release. Alpha — public API and wire format may
change before v1.0 based on real-deployment feedback.
Added
- Wire format v1 (
PhiAccrualUdp.Packet) — 12-byte fixed format with magic0xCEA6, version0x01, reserved flags byte (must be zero in v1), and 64-bit unsigned millisecond timestamp. - UDP listener (
PhiAccrualUdp.Listener) — opens a UDP socket on a configurable port, decodes incoming packets, callsPhiAccrual.observe/2with local monotonic receipt time. Decode failures emit[:phi_accrual_udp, :decode, :error]telemetry with reason classification. - Periodic UDP sender (
PhiAccrualUdp.Sender) — sends heartbeat packets to a list of{host, port}targets at a configurable interval. Configurable timestamp source. - Custom node resolution — listener accepts a
:node_resolverfunction mapping(ip, port)to user-defined node identifiers. Default:{ip, port}tuple. - Telemetry schema —
[:listener, :started],[:sample, :received],[:decode, :error],[:sender, :started],[:sender, :tick].
Notes
- Wire format and telemetry schema are not yet committed. Both
may change before
v1.0. Magic/version/flags structure is deliberately chosen to permit format evolution without breaking on-the-wire compatibility for v1 senders. - Receiver-driven clock discipline: the EWMA uses local monotonic
receipt time, never the packet timestamp. This preserves
phi_accrual's contract that cross-node timestamps are meaningless.