Vector v0.57.0 release notes
vector validate --no-environmentdoesn’t catch unconfined routing templates (see the template confinement breaking change) (#25840); runvector validatewithout that flag to catch confinement issues before startup.
Breaking Changes
See the 0.57 upgrade guide for full details and migration steps. At a glance, you are affected if you:
- rely on
${VAR}interpolation in Vector configuration files: environment variable interpolation is now disabled by default. Pass--dangerously-allow-env-var-interpolation(or setVECTOR_DANGEROUSLY_ALLOW_ENV_VAR_INTERPOLATION=true) to restore the previous behavior. - use
{{ field }}references in sink routing templates (object keys, file paths, HTTP headers, table or stream names): sinks now enforce a confinement boundary and reject templates with no literal prefix at startup. Set a static prefix in the template, or usedangerously_allow_unconfined_template_resolution: trueto opt out.
Confinement was applied uniformly across most templated fields rather than tailoring it
field by field. The intent is to over-restrict now and relax later as specific cases are
analyzed. The dangerously_allow_* flags fully restore pre-0.57 behavior. The name is intentionally loud,
but it is not a verdict that every use is reckless, but rather a motivation to assess the risk for your deployments.
If you believe confinement is unwarranted for a specific field, please open an issue with a detailed rationale. Proposals are always welcome.
Placeholders (${VAR} and SECRET[backend.key]) in structural positions of
a Vector configuration file are deprecated and will be removed in a future
release. Current behavior is unchanged.
Affected patterns:
- Unquoted placeholders in non-string fields (
count = ${MY_COUNT}). - Placeholders in map keys (
${KEY} = value). - Placeholders in TOML table headers (
[${SECTION}]). - Placeholders as inline array elements that expand to multiple values
(
inputs = [${VECTOR_INPUTS}]whereVECTOR_INPUTS=a,b).
Migration guidance will accompany the removal PR. envsubst can be used today
to pre-expand env-var placeholders into a fully static config as a workaround.
See RFC: parse-first config interpolation for the full rationale.
Vector Changelog
2 security changes
- Environment variable interpolation in configuration files is now disabled by default. Previously, Vector interpolated
${VAR}references in config files automatically. To restore the previous behavior, pass--dangerously-allow-env-var-interpolation(or setVECTOR_DANGEROUSLY_ALLOW_ENV_VAR_INTERPOLATION=true). The--disable-env-var-interpolationflag andVECTOR_DISABLE_ENV_VAR_INTERPOLATIONenvironment variable have been removed.
Thanks to thomasqueirozb for contributing this change! Sinks that accept
{{ field }}references in routing templates now enforce a confinement boundary: the rendered value must stay within the literal prefix declared in the template. Templates with no literal prefix (e.g.key_prefix: "{{ host }}/") are rejected at startup. Thefilesink is the only exception: itsbase_dirconfig field can provide an explicit confinement root forpathtemplates with no usable literal prefix.Any sink that includes a templated config field can be affected.
The
filesink gains abase_dirconfig field to set the confinement root explicitly when thepathtemplate has no usable literal prefix.HTTP-family templates: HTTP/HTTPS URI templates that use
{{ field }}references must not contain?or#. A field-rendered value could smuggle additional query parameters or fragments into the rendered URI. Fully static URI templates (no{{ }}) with a query string or fragment are still accepted. Dynamic query or fragment segments (e.g.https://api.internal/ingest?tenant={{ tenant }}) are rejected at startup. Templatedrequest.headersvalues are also confined for HTTP-family sinks.Opt-out: set
dangerously_allow_unconfined_template_resolution: trueon the affected sink to disable all confinement checks for that sink β both at startup and at runtime. Vector logs a warning per template on startup and setsvector_security_confinement_disabled{component_type=...}to1.Observability:
component_errors_total{error_type="confinement_failed"}β increments on each violation; events that trigger it are dropped.vector_security_confinement_disabledβ set to1while a sink is running with confinement disabled.
Thanks to pront for contributing this change!
7 new features
The
host_metricssource can now collect hardware temperature readings via a newtemperaturecollector. When enabled, it emitstemperature_celsius,temperature_max_celsius, andtemperature_critical_celsiusgauges, each tagged with thecomponentlabel of the sensor it was read from.The collector is opt-in: add
temperatureto thecollectorslist to enable it. Components that do not report a given value (for example a missing critical threshold) are skipped, and environments without temperature sensors simply produce no metrics.
Thanks to somaz94 for contributing this change!- Added a way to keep memory enrichment table state between configuration reloads, using the new
reload_behavioroption.
Thanks to esensar, Quad9DNS for contributing this change! - Added support for configuring gRPC source maximum connection age, allowing
long-lived client connections to be gracefully recycled for better load balancer
distribution.
Thanks to fpytloun for contributing this change! Added a new counter metric
component_cpu_usage_ns_totalcounting the CPU time consumed by a transform in nanoseconds.The metric is opt-in: set
measure_cpu_usage: trueon individual transform configurations to enable it. When disabled (the default), no counter is registered and no per-poll clock sampling takes place.
Thanks to gwenaskell for contributing this change!- Add
--chunk-size-events/VECTOR_CHUNK_SIZE_EVENTSto configure the source sender batch size and source output buffer base capacity (defaults to 1000 events).
Thanks to sakateka for contributing this change! - The
tag_cardinality_limittransform now supportsmode: exact_fingerprint, a new storage mode that can reduce memory usage for high-cardinality tag values compared tomode: exact. Instead of storing the full tag-value strings, only a 64 bit fingerprint hash of each value is kept. The trade-off is that throughput is slightly impacted due to extra hashing operations, and there is a small (unlikely) chance of collisions at very high cardinalities.
Thanks to ArunPiduguDD for contributing this change! - Add support for configuring multiple endpoints in the
vectorsink via the newrouting.endpointsoption, enabling built-inload_balance,failover, andfailover_primaryendpoint strategies across downstream Vector instances. The previousaddressoption is now deprecated in favor ofrouting.endpoints.
Thanks to fpytloun for contributing this change!
10 enhancements
- Adds support for including attributes from the
X-Amz-Firehose-Common-Attributesheader in the log events for theaws_kinesis_firehosesource.
Thanks to tchanturia for contributing this change! - The
databricks_zerobussink now supports auser_agentoption whose value is appended to theuser-agentheader sent to Databricks. The header always identifies Vector (Vector/<version>); when set, the configured value is appended after it.
Thanks to flaviocruz for contributing this change! - Optional Arrow IPC compression for Flight payloads. Defaults to no compression.
Thanks to flaviofcruz for contributing this change! - Improved the warning log emitted by the
datadog_logssink when a field with a Datadog reserved attribute semantic meaning needs to be relocated but the destination path already exists. The log now includessource_path,destination_path, andrenamed_existing_tofields to make the conflict easier to diagnose; additionally, it will now also increment a new counterdatadog_logs_reserved_attribute_conflicts_total.
Thanks to gwenaskell for contributing this change! - Add support for optionally applying rate limiting to the
internal_logssource controlled by the--internal-logs-source-rate-limitCLI option andVECTOR_INTERNAL_LOGS_SOURCE_RATE_LIMITenvironment variable. This provides the same rate limiting functionality as was available before version 0.51.1 but with a rate limit window separate from the console one.
Thanks to bruceg for contributing this change! - The
socketsource (UDP mode) now supports amulticast_interfaceoption that controls which local network interface is used when joining multicast groups. This is useful on hosts with multiple interfaces and on macOS, where specifying0.0.0.0only joins on the default interface (unlike Linux, which joins on all interfaces).
Thanks to thomasqueirozb for contributing this change! - Updated the
source send cancellederror message to point towards possible causes. This error usually happens either because a pipeline is shutting down or because of backpressure.
Thanks to clementd-dd for contributing this change! - Adds a per-tag
cache_size_per_keyoption to configuration options in probabilistic mode. Previously, per-tag overrides always inherited the bloom filter cache size from the enclosing config, which could cause a higher false positive rate when the per-tagvalue_limitis higher than the global or per-metricvalue_limit. When omitted, the cache size value from the enclosing config is used. Only valid inprobabilisticmode β using it inexactmode will cause a configuration error.
Thanks to ArunPiduguDD for contributing this change! - The
vectorsink now supports optional HTTP/2 keepalive on its pooled gRPC connections, configured via a newkeepaliveblock (interval_secsandtimeout_secs). When enabled, the sink periodically sends HTTP/2 PING frames so that a connection to a downstream Vector instance that has gone away is detected and evicted rather than reused indefinitely (which could otherwise stall delivery until the connection was replaced). Keepalive is disabled by default; when enabled,interval_secsdefaults to 60 (aligned with gRPC keepalive guidance to avoid trippingtoo_many_pingspolicies) andtimeout_secsdefaults to 20. PINGs are sent on idle connections so an idle-but-dead connection is still detected.
Thanks to graphcareful for contributing this change! Improved the VRL playground UX:
- Added resizable panels via draggable gutters.
- Added a dark/light/system theme toggle that syncs with the OS preference.
- Added run history persisted in localStorage, with a clear button.
- Added a Shift+Enter shortcut to run the program.
- The Share button now copies the shareable URL to the clipboard.
- Various visual polish (unified header, purple accents, tightened spacing).
Thanks to pront for contributing this change!
28 bug fixes
- Fixed
vector validate --no-environmentso it reports VRL and condition compilation errors for transforms without requiring full environment-dependent component initialization.
Thanks to pront for contributing this change! - Fixed the
logstashsource to close the connection on a malformed frame instead of attempting to continue. A failed JSON decode or decompression previously left the decoder desynchronized but still running, which could busy-loop and emit ACKs for bogus sequence numbers (surfacing asinvalid sequence number receivedon the client). The source now treats any decode error as fatal and closes the connection β matching the upstreamlogstash-input-beatsserver β so the client reconnects and retransmits the unacknowledged window.
Thanks to graphcareful for contributing this change! - Fixed the
filesource silently dropping all but the first member of concatenated (multi-stream) gzip files. This regression was introduced in v0.50.0.
Thanks to thomasqueirozb for contributing this change! - Added support for DOQ socket protocol in dnstap source. This will prevent error messages when DOQ
traffic is encountered.
Thanks to esensar, Quad9DNS for contributing this change! - Fixed the
logstashsource to preserve writer window boundaries when generating ACKs. This prevents batched reads from producing ACK sequences that advance past the current window, which could lead to “invalid sequence number received” errors and duplicate retransmits under load.
Thanks to bruceg for contributing this change! - Fixed SQL injection via identifier names in the
clickhousesink. Thedatabaseandtableconfig values are now passed as ClickHouse query parameters with theIdentifiertype ({database:Identifier}.{table:Identifier}), letting the server handle quoting rather than relying on client-side string escaping.
Thanks to pront, thomasqueirozb for contributing this change! - Fixed
vector topfreezes when using a high number of components.
Thanks to esensar, Quad9DNS for contributing this change! - Fixed a bug in the
datadog_metricssink where the metric type name was compared against itself (instead of the peer metric) when sorting metrics before encoding. The sort key is(type_name, metric_name, timestamp), but the type comparison was a no-op, makingmetric_namethe effective primary key. The fix restores the intended ordering.
Thanks to gwenaskell for contributing this change! - Fixed a config reload bug that could silently stop event delivery. If a reload changes a component’s kind while keeping the same name (for example, replacing an enrichment table’s derived source named
Xwith a regular source namedX, or replacing a transform namedXwith a source namedX), any downstream sink or transform that still reads fromXnow correctly reconnects to the new component instead of going silent until the next restart.
Thanks to pront for contributing this change! - Fixed a
reducetransform bug where a timestamp field with a name that requires quoting in a VRL path (e.g."created.at"or"event-time") would have its_endcompanion silently dropped from the reduced event. The companion path is now built structurally and correctly lands next to the base field.
Thanks to pront for contributing this change! - Fixed the
logstashsource to ACK only completed writer windows rather than sometimes emitting a partial ACK before the window is complete. While partial ACKs are permitted by the official protocol spec and cause no problems for the referencego-lumberclient in Beats, they appear to confuse proxies that assume there will only be one ACK per window, causing errors on subsequent batches.
Thanks to bruceg for contributing this change! - The
logstashsource now rejects aWindowSizeframe that arrives before the current window has received all of its advertised events, closing the connection with a fatal decode error instead of making any attempt to continue. While this is allowed by the protocol spec, no known client makes use of this and the reference server ingo-lumbertreats it as a protocol violation.
Thanks to bruceg for contributing this change! - The
aws_kinesis_firehosesource no longer falls back to forwarding raw, undecoded bytes for a record that hits the decompressed-size cap underCompression::Auto; such records are now rejected instead of forwarded.
Thanks to thomasqueirozb for contributing this change! - Updated the zlib backend (
zlib-rs) from 0.6.0 to 0.6.6, pulling in an upstream fix for an aarch64 NEON Adler-32 bug that could produce incorrect checksums. On arm64, valid zlib-format (RFC 1950) payloads, such asdeflatecontent-encoding handled by HTTP-based sources, could previously be rejected as corrupt with anincorrect data checkerror.
Thanks to Stunned1 for contributing this change! - Fixed the syslog codec silently ignoring short-form severity keywords (
crit,emerg,err,info,warn) and falling back to the defaultinformational. The encoder now accepts both short-form and full-form severity names, matching the values used by VRL’sto_syslog_severityandto_syslog_levelfunctions.
Thanks to vparfonov for contributing this change! - The
fluentsource now caps how large a single msgpack frame may grow while being buffered, using the same limit, so a peer can no longer stream an oversized array/map/string without ever completing a message. Frames that exceed the limit before a complete message is decoded are now rejected and the connection is closed.
Thanks to thomasqueirozb for contributing this change! - The
vectorsource and theopentelemetrysource’s gRPC mode now bound gRPC message size at the header read and capgzip/zstddecompression mid-stream, matching the decompressed-size limit enforced elsewhere, so a compressed gRPC message can no longer expand past the cap during decompression before being rejected.
Thanks to thomasqueirozb for contributing this change! - Fix programmatic defaults for endpoint health configuration to match the documented deserialization defaults.
Thanks to fpytloun for contributing this change! - HTTP-based sources (
http_server,prometheus_pushgateway,prometheus_remote_write,heroku_logs,opentelemetry) now cap decompressed request bodies at 100 MiB. Previously, a single unauthenticated request carrying a compressed payload (e.g. a gzip bomb) could allocate unbounded memory and OOM-kill the Vector process. Decompressed payloads exceeding the cap are rejected with HTTP 413, as are requests whose declaredContent-Lengthexceeds the same limit. The cap can be raised or lowered via--max-decompressed-size-bytes(orVECTOR_MAX_DECOMPRESSED_SIZE_BYTES).
Thanks to pront, thomasqueirozb for contributing this change! - The
logstashsource now caps the size of compressed frame payloads. Previously, the 32-bit payload size field of a compressed (C) frame was read straight from the wire and used to reserve a buffer, so a 6-byte malformed frame advertising a multi-gigabyte size could trigger an allocation large enough to abort the process. The size of the decompressed output is now 100 MiB by default and can be configured by--max-decompressed-size-bytesorVECTOR_MAX_DECOMPRESSED_SIZE_BYTES. Oversized frames are rejected as a decode error.
Thanks to thomasqueirozb for contributing this change! - The
logstashsource now rejects compressed frames that are nested inside other compressed frames. Previously, a malicious sender could nest compressed (C) frames arbitrarily deep, driving unbounded recursion in the decoder until the process exhausted its stack and aborted. Compressed payloads may now contain only a single layer of compression; no known Lumberjack/Beats client (e.g. Filebeat) ever emits more than one.
Thanks to thomasqueirozb for contributing this change! - Fixed an integer underflow in the octet-counting framer (used by TCP
syslogsources) that occurred when an over-length, length-prefixed message was split across multiple reads. Previously the decoder could panic in debug builds, or in release builds wrap the remaining-bytes counter to a huge value, wedging the decoder and silently dropping all subsequent input on that connection.
Thanks to hhh6593 for contributing this change! - A new
--raise-fd-limitCLI flag (orVECTOR_RAISE_FD_LIMITenvironment variable) raises the file descriptor soft limit to the hard limit at startup. This prevents “Too many open files” errors when Vector monitors large numbers of log files. On macOS, Vector falls back to the kernel-enforced per-process file limit if the hard limit is too high.
Thanks to vparfonov for contributing this change! - Sources that can decompress potentially untrusted input now cap compressed and decompressed payload sizes, preventing a small compressed payload (e.g. a gzip/zlib/zstd bomb) from allocating unbounded memory and OOM-killing the Vector process. The decompressed-output cap defaults to 100 MiB and can be configured via
--max-decompressed-size-bytesorVECTOR_MAX_DECOMPRESSED_SIZE_BYTES. Affected sources:http_server,heroku_logs,prometheus_pushgateway,prometheus_remote_write,datadog_agent,splunk_hec,aws_kinesis_firehose,fluent,logstash,vector, andopentelemetry(both its HTTP and gRPC modes). Thedatadog_agent,splunk_hec, andaws_kinesis_firehosesources additionally now cap the size of the raw (compressed) request body they buffer in memory before decompression, matchinghttp_serverandopentelemetry; oversized requests are rejected with413 Payload Too Largeinstead of being read into memory unbounded. Relatedly, zstd decoders across all affected sources now also bound the decoder’s internal window allocation, derived from the decompressed-size cap (and for HTTP-based sources, additionally clamped to the 8 MB ceiling suggested by RFC 9659), so a crafted frame can no longer declare a largeWindow_Sizeand drive a big allocation before the cap has a chance to trip.
Thanks to thomasqueirozb for contributing this change! - Internal telemetry (metrics and logs) emitted from work that Vector runs on spawned
tokiotasks now correctly inherits the owning component’s tags (component_id,component_kind,component_type). Previously, several components spawned background tasks without propagating the tracing span, so some internal events emitted from those tasks were missing their component tags. Affected emissions include thedatadog_logssink’scomponent_discarded_events_total(events too large to encode), thegcp_pubsubsource’scomponent_errors_total/component_discarded_events_totalfrom its per-stream tasks, and thesplunk_hecsinks’ acknowledgement-handlingcomponent_errors_total.
Thanks to gwenaskell for contributing this change! - Fixed a potential panic in the
statsdsource when a gauge metric value begins with a multi-byte UTF-8 character. The invalid value now returns a parse error instead.
Thanks to pront for contributing this change! - Fixed the VRL Playground truncating large integers (such as
xxhashandseahashresults) to their least-significant digits. Results are now serialized with full precision instead of being coerced to JavaScript floating-point numbers.
Thanks to stigglor for contributing this change! - Fixed a typo in the
WebSocketMessageReceivedinternal event emitted by thewebsocketsource: theprotocolfield was previously misspelled asprotcol. Users filtering on this field in trace-level logs should update their queries accordingly.
Thanks to pront for contributing this change!
VRL Changelog
0.34.0 (2026-07-13)
New Features
- Added support for dynamic regex patterns in
parse_regex, allowing variables and runtime expressions to be passed as thepatternargument.
- Add
strictparameter toparse_cef(default:true). When set tofalse, the function performs best-effort parsing of non-compliant CEF input, treating unescaped=characters within field values as literals rather than field delimiters. This improves compatibility with vendors such as Infoblox and Palo Alto Networks whose CEF output does not fully conform to the spec.
Enhancements
- Improved performance of
parse_regexandparse_regex_allby pre-computing capture group names and indices at compile time, replacing name-based hash lookups with direct index-based access at runtime.
- Improved performance of
truncatefunction if suffix parameter is provided.
- Improved performance of
parse_regex_allwhen using a literal regex pattern in concurrent workloads.
Fixes
- Fixed a panic in
parse_key_value,parse_cef,decode_mime_q, andparse_ruby_hashon inputs with lines β₯ 65,535 bytes. This is a workaround until rust-bakery/nom#1867 is fixed.
- Fixed
findβs type definition and documentation. Previously, the function advertised its return type as an integer, but never as nullable. Now it correctly states that the function returnsnullwhenvaluedoesnβt matchpattern.