Skip to content

EvSnow 0.3.0 release notes

EvSnow 0.3.0 adds optional Snowflake Elastic Channels for streaming Azure Event Hubs into Snowflake. Existing configurations continue to use Named Channels.

Changes

  • Add an Elastic adapter that obtains one implicit channel and waits for Snowflake to acknowledge each source batch before allowing a checkpoint.
  • Preserve the original acknowledgement Future after a wait timeout. A retry of that same source batch observes the pending append instead of submitting it again. In-memory receipts also avoid resubmitting an acknowledged partition when another partition or a checkpoint write fails.
  • Bound acknowledgement waits and Elastic adapter close waits. An unresolved acknowledgement or close error raises an incomplete-shutdown error; unacknowledged source batches remain uncheckpointed for replay.
  • Return CLI exit status 1 after a terminal batch failure, failed final drain, or client shutdown error. Cleanup continues through every component, and a failed mapping stops its healthy peers. Signal-driven shutdown reports failures too; a successful graceful shutdown exits with status 0.
  • Preserve the full event envelope, including namespace, hub, partition, offset, sequence number, event body, and producer event identity.
  • Require snowpipe-streaming>=1.8.1; the dependency lock selects SDK 1.8.1.
  • Add configuration validation, a generated JSON schema, and an Elastic Channels usage guide.
  • Include the CLI and all pipeline modules in built distributions, so an installed wheel runs without the source checkout.

Dependency refresh

Runtime, development, documentation, and build dependencies are refreshed to their current stable releases. This update supersedes the six pending Dependabot updates and includes these locked runtime versions:

Library Version
Snowflake connector 4.8.0
aiohttp 3.14.4
Cryptography 50.0.2
Typer 0.27.2
Pydantic AI 2.54.0
Logfire 5.1.1

The optional AI retry code preserves OpenAI Chat Completions behavior after the Pydantic AI 2 upgrade and maps the existing gemini setting to the Google provider. The declared Groq and Cohere providers now have explicit SDK extras. Existing retry policy safeguards remain in place.

Configuration

Three settings belong to the Snowflake connection. Environment variables override the equivalent settings in a complete [snowflake_connection] TOML table.

Setting Environment variable Default
channel_mode SNOWFLAKE_CHANNEL_MODE named
ack_timeout_seconds SNOWFLAKE_ACK_TIMEOUT_SECONDS 60 seconds
close_timeout_seconds SNOWFLAKE_CLOSE_TIMEOUT_SECONDS 60 seconds

Set SNOWFLAKE_CHANNEL_MODE=elastic to enable Elastic Channels. Both timeout settings must be positive integers. The existing pipe and key-pair credentials are still required. Follow Enable Elastic Channels for the complete setup and verification steps.

Delivery behavior

Elastic mode provides at-least-once delivery. An acknowledgement confirms durable buffering in Snowflake; it does not confirm table visibility or a successful pipe transformation. Query the destination and the error table to verify those outcomes.

Elastic Channels have no source offset recovery API and do not guarantee ordering or exactly-once delivery. Append tokens identify requests for acknowledgement handling; they do not remove duplicates. A process restart or a failed append can cause source replay and duplicate rows. Use stable event IDs when downstream deduplication is required. See Elastic acknowledgements and replay.

Upgrade and validation

From the repository root, refresh dependencies and confirm the runtime version:

uv sync --locked
uv run evsnow version

The CLI reports EvSnow v0.3.0. Named Channels remain the default; enable Elastic mode explicitly when you are ready to use its delivery behavior.