Repository navigation
This release centers on YANG-Push robustness and caching: a new global YANG module cache with in-flight de-duplication, canonical XPath filter normalization, a stable order-independent content-id, and an upgrade to yang-rs-5 (libyang 5.4.9) enabling anydata nodes validation. It also ships the Kafka YANG consumer as its own released binary and expands OTEL metrics across the collector and yang-push.
✨ Highlights
YANG-Push & NETCONF
- Global YANG module cache shared across SSH sessions — skips redundant get-schema RPCs per (name, revision), with single-flight de-duplication to kill the startup thundering herd (coalesced/hit/miss/size OTEL counters).
- Stable content-id: module/feature/submodule hashing is now canonical (sorted, length-prefixed, kind-tagged), so semantically identical module sets no longer produce duplicate cache directories.
- XPath target-filter normalization for both NETCONF- and JSON-sourced filters, with a new normalize_path engine, prefix/binding validation, and warnings on non-canonical or unresolvable targets.
- yang-rs-5 (libyang 5.4.9) upgrade for the validation actor, with (configurable) ANYDATA_STRICT parsing enabling validation of nested anydata nodes.
- Other fixes such as deferred subscription updates while a schema fetch is in-flight and more accurate content-id logging and datastore-scoped prefix module lookup.
Collector & observability
- New schema cache and registry metrics; cache_actor pending gauge replaced with a duration histogram.
- OTEL metrics reader isolated on a dedicated runtime; validation-actor metrics improved with enum-based attributes.
Packaging & CLI
- Kafka YANG consumer extracted into a standalone netcalyx-yang-consumer crate, now built and released as a binary (Linux + macOS).
- Consolidated --help/--version across all binaries.
Other
- bgp-pkt: Display for ExtendedCommunityIpv6, derive Hash.
- Fixes for empty-container handling in copy_buffer, IPFIX enum name sanitization, and example logging to stderr.
⚠️ Breaking changes
- YANG-Push cache invalidation — the subscription-info format changed (no peer port anymore) and the content-id computation changed (now order-independent). Old on-disk yang-push cache directories are not supported and cannot be loaded: you need to clear the old cache directory before restarting the collector.
- Metrics renamed/changed — the cache_actor pending gauge is replaced by a duration histogram, and several counters/attributes changed. Update dashboards and alerts.
- API rename — YangSchemaFormat → GetSchemaFormat (per RFC 6022) for consumers of netconf-proto.
- Binary relocation — the Kafka YANG consumer moved out of the collector into the standalone netcalyx-yang-consumer crate/binary.
What's Changed
- ci(commitlint): limit commit message lines to 72 characters by @ustorbeck in #26
- fix(bgp-speaker): use paused clock in hold-timer tests by @ustorbeck in #27
- fix(examples): keep example stdout clean and stop panicking on JSON serialization errors by @rodonile in #33
- feat(bgp-pkt): add Display for ExtendedCommunityIpv6 and derive Hash for path attributes by @rodonile in #32
- fix(netconf-proto): handle empty containers in copy_buffer_till functions by @riccardo-negri in #28
- feat(yang-push): migrate to yang-rs-5 / libyang 5.4.9, revamp OTEL metrics, refresh example YANG modules by @rodonile in #23
- feat(yang-push): separate transport session info from subscription identity by @rodonile in #29
- fix(ipfix-code-generator): drop invalid identifier chars in registry-derived enum names by @rodonile in #41
- fix(yang-push): defer subscription updates while a schema fetch is in-flight by @rodonile in #35
- fix(collector): subscribe to flow-recv actor only when needed for flow-options handler actor by @rodonile in #38
- feat(collector): add schema cache and registry metrics to kafka yang publisher by @rodonile in #34
- refactor(yang-consumer): extract kafka-yang-consumer example into standalone crate by @rodonile in #39
- feat(yang-push): make anydata_strict validation configurable by @rodonile in #42
- build(deps): bump schema_registry_converter from 4.9.0 to 4.10.0 by @dependabot[bot] in #47
- feat(cli): consolidate --help and --version output across all binaries by @rodonile in #40
- feat(netconf-proto): add global YANG module cache by @riccardo-negri in #22
- fix(yang-push): resolve xpath-filter target modules by prefix by @rodonile in #43
- fix(netconf-proto): make YANG library content-id calculation independent on the module order by @rodonile in #44
- fix(collector): switch PeriodicReader on async runtime to enable tonic metrics logs by @rodonile in #50
- style: reflow comments to match rustfmt comment_width by @ustorbeck in #51
- feat(yang-push): normalize target xpath filters and add failed xpath resolution check with libyang by @rodonile in #45
- chore: release v0.3.0 by @riccardo-negri in #52
Full Changelog: v0.2.0...v0.3.0