Release notes — 0.18.0
Released 2026-07-04 with DNS Conduit 0.18.0.
Changes merged to main that are not yet tagged. Staging area for the next operator release.
Breaking changes — Rule Rhai host API
Rule Rhai scripts must be updated before upgrading to this release. Legacy host symbols are removed; there are no compatibility aliases.
Run conduitctl validate --file <config> after updating every .rhai script referenced in your config.
Migration table
| Legacy | New | Notes |
|---|---|---|
table_lookup(table, key) |
lookup(table, key) |
Global function; same lookup semantics |
txn.metric_inc(name, delta) |
metrics.inc(name, delta) |
metrics object is in hook scope |
txn.metric_inc_labels(name, delta, labels) |
metrics.inc_labels(name, delta, labels) |
Same |
log_info(msg) |
log.info(msg) |
log object in hook scope |
log_warn(msg) |
log.warn(msg) |
Same |
question_qname(txn) |
txn.question().qname |
Use txn.question() when you also need qtype, class, or opcode |
New read-only surface: runtime.routing
On pools with health enabled, scripts can read Route-consistent routing/health state at hook entry:
runtime.routing().pool(name)—configured_count,eligible_count,fail_open_active, and pool aggregates (minimum latency EWMA viamin_latency_ewma_ms,max_outstanding)runtime.routing().backend(pool, id)—applied,observed,eligible,frozen, latency EWMA (latency_ewma_ms),weight_factor,outstanding,last_transition_unix_ms(id= backendnameorip:port)runtime.routing().backend_for_attempt(pool, backend_id)— same backend view for a named attempt; passtxn.selected_pool()andtxn.selected_backend_name()for the current attempt
Use method call syntax: runtime.routing().pool("default"), not runtime.routing.pool(...).
Values reflect host state at hook entry on this worker (the same sources Route uses). There is no stronger transactional guarantee against concurrent probe or passive health updates.
Unknown pool or backend at runtime returns an empty view (documented sentinel field values).
Unchanged on txn
Policy effects remain on txn: set_pool, tags, retry/drop, egress overrides, question(), response(), sampling helpers, selected_*, and related methods.
Operator action
- Update every rule
.rhaifile using the migration table above. - Re-run
conduitctl validateon each config before reload. - See Host API overview, Runtime API, Data sources and lookups, and User metrics for the updated reference.
Backend health
Shipped in the same release as the Rhai host API changes above:
- Active health probing, passive fast-trip, and health-aware Route selection (including latency EWMA-weighted backend shares) — Backend health
- Operator controls via
conduitctl health(show, set down/up, freeze, resume) — gRPC and conduitctl — health - Health-related Prometheus metrics when
metrics.profile: full— Built-in metrics — Backend health - Config:
pools[].health
Scripts read live health through runtime.routing on the hot path — not control-plane RPC per query. See Runtime API — routing.
Health and forward metrics
conduit_probe_results_total(fullonly) — active health-probe outcomes per backend (success,failure,timeout,send_error).conduit_forward_errors_totalnow includes abackendlabel (pool,backend,reason) so timeouts and other forward errors are attributable per upstream. Existing PromQL that only groups bypool/reasonstill works; series identity gains the new label.- Passive fast-trip logs each counting failure and the trip event at WARN with query and client context — Backend health.
All changes in this release (automated pull request list).