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
1after 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 status0. - 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:
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.