website/content/en/blog/highlights-july-2026.md
It has been a while since our [February 2025 highlights]({{< ref "/blog/highlights-february-2025" >}}). In this post we cover the most impactful features shipped across 0.46 through 0.56, and a set of CI improvements that make life easier for external contributors.
| Component | Kind | Description | Author | PR |
|---|---|---|---|---|
[mqtt]({{< ref "/docs/reference/configuration/sources/mqtt" >}}) | Source | Ingest from MQTT brokers | @StormStake | #22752 |
[okta]({{< ref "/docs/reference/configuration/sources/okta" >}}) | Source | Consume Okta system logs | @sonnens | #22968 |
[websocket]({{< ref "/docs/reference/configuration/sources/websocket" >}}) | Source | Real-time ingestion from WebSocket APIs | @benjamin-awd | #23449 |
[windows_event_log]({{< ref "/docs/reference/configuration/sources/windows_event_log" >}}) | Source | Native Windows Event Log with bookmark-based checkpointing | @tot19 | #24305 |
[delay]({{< ref "/docs/reference/configuration/transforms/delay" >}}) | Transform | Delay events by a fixed duration or VRL condition | @esensar, @Quad9DNS | #25407 |
[incremental_to_absolute]({{< ref "/docs/reference/configuration/transforms/incremental_to_absolute" >}}) | Transform | Reconstruct absolute metrics from incremental data | @GreyLilac09 | #23374 |
[trace_to_log]({{< ref "/docs/reference/configuration/transforms/trace_to_log" >}}) | Transform | Convert traces to logs | @spencerho777 | #24168 |
[window]({{< ref "/docs/reference/configuration/transforms/window" >}}) | Transform | Sliding-window ring-buffer for noise reduction | @ilinas | #22609 |
[azure_logs_ingestion]({{< ref "/docs/reference/configuration/sinks/azure_logs_ingestion" >}}) | Sink | Send logs to Azure Monitor via the Logs Ingestion API | @jlaundry | #22912 |
[databricks_zerobus]({{< ref "/docs/reference/configuration/sinks/databricks_zerobus" >}}) | Sink | Stream to Databricks Unity Catalog via Zerobus | @flaviofcruz | #24840 |
[doris]({{< ref "/docs/reference/configuration/sinks/doris" >}}) | Sink | Apache Doris via the Stream Load API | @bingquanzhao | #23117 |
[postgres]({{< ref "/docs/reference/configuration/sinks/postgres" >}}) | Sink | Send logs, metrics, and traces to Postgres | @jorgehermo9 | #21248 |
otlp | Codec | Bidirectional Vector <-> OTLP conversion (logs and traces) | @pront | #24003 |
syslog | Encoder | Encode Vector events as syslog (RFC5424 and RFC3164) | @vparfonov | #23777 |
varint_length_delimited | Framer | Varint length-delimited framing for protobuf streaming (ClickHouse-compatible) | @modev2301 | #23352 |
opentelemetry source gained metrics ingestion and now performs full OTLP decoding for logs, metrics, and traces, removing the need for complex remap steps in OTEL -> Vector -> OTEL pipelines.docker_logs source retries Docker daemon communication failures with exponential backoff instead of giving up on transient hiccups.file and kubernetes_logs sources (introduced in 0.50.0) was found and fixed.tag_cardinality_limit transform gained several new controls: per-tag cardinality overrides (per_tag_limits), per-metric tracking isolation (tracking_scope: per_metric), a global key cap (max_tracked_keys), and the ability to opt entire metrics out of cardinality tracking.syslog encoding transform gained improved RFC compliance, support for scalars, nested objects, and arrays in structured data, and better UTF-8 safety.retry_strategy for HTTP-based sinks gives users control over which response codes are retried (default / none / all / custom).aws_s3 sink gained Apache Parquet batch encoding.datadog_metrics sink switched to the Series v2 endpoint with zstd compression by default, and datadog_logs switched its default to zstd as well.--watch-config now also watches enrichment table files.vector top gained scrollable, sortable, and filterable views (press ? for keybinds).expected_event_count field on outputs to assert on emitted event counts.utilization no longer counts downstream wait time, giving a more accurate saturation view.source_buffer_max_size_bytes, source_buffer_max_size_eventstransform_buffer_max_size_bytes, transform_buffer_max_size_eventssource_buffer_utilization_mean, transform_buffer_utilization_mean (EWMA-smoothed)component_latency_seconds (histogram), component_latency_mean_seconds (gauge)source_send_latency_seconds, source_send_batch_latency_secondsFor the complete list of changes, breaking changes, and upgrade steps, see the [releases page]({{< ref "/releases" >}}).
| Function | Author | PR |
|---|---|---|
[aggregate_vector_metrics]({{< ref "/docs/reference/vrl/functions/#aggregate_vector_metrics" >}}) | @esensar, @Quad9DNS | vector#23430 |
[basename]({{< ref "/docs/reference/vrl/functions/#basename" >}}) | @titaneric | vrl#1531 |
[decode_lz4]({{< ref "/docs/reference/vrl/functions/#decode_lz4" >}}) | @jimmystewpot | vrl#1339 |
[dirname]({{< ref "/docs/reference/vrl/functions/#dirname" >}}) | @titaneric | vrl#1532 |
[encode_csv]({{< ref "/docs/reference/vrl/functions/#encode_csv" >}}) | @armleth | vrl#1649 |
[encode_lz4]({{< ref "/docs/reference/vrl/functions/#encode_lz4" >}}) | @jimmystewpot | vrl#1339 |
[find_vector_metrics]({{< ref "/docs/reference/vrl/functions/#find_vector_metrics" >}}) | @esensar, @Quad9DNS | vector#23430 |
[from_entries]({{< ref "/docs/reference/vrl/functions/#from_entries" >}}) | @close2code-palm | vrl#1653 |
[get_vector_metric]({{< ref "/docs/reference/vrl/functions/#get_vector_metric" >}}) | @esensar, @Quad9DNS | vector#23430 |
[haversine]({{< ref "/docs/reference/vrl/functions/#haversine" >}}) | @esensar, @Quad9DNS | vrl#1442 |
[http_request]({{< ref "/docs/reference/vrl/functions/#http_request" >}}) | @benjamin-awd | vrl#1360 |
[decrypt_ip]({{< ref "/docs/reference/vrl/functions/#decrypt_ip" >}}) | @alterstep | vrl#1506 |
[encrypt_ip]({{< ref "/docs/reference/vrl/functions/#encrypt_ip" >}}) | @alterstep | vrl#1506 |
[parse_yaml]({{< ref "/docs/reference/vrl/functions/#parse_yaml" >}}) | @juchem | vrl#1602 |
[pop]({{< ref "/docs/reference/vrl/functions/#pop" >}}) | @jlambatl | vrl#1501 |
[split_path]({{< ref "/docs/reference/vrl/functions/#split_path" >}}) | @titaneric | vrl#1533 |
[to_entries]({{< ref "/docs/reference/vrl/functions/#to_entries" >}}) | @close2code-palm | vrl#1653 |
[xxhash]({{< ref "/docs/reference/vrl/functions/#xxhash" >}}) | @stigglor | vrl#1473 |
else and else if can now appear on a new line after the closing } of an if block. Previously the newline terminated the expression, forcing } else if { on a single line.\u{HEX} Unicode escape sequences ("hello\u{1F30E}world"). Invalid sequences (empty braces, non-hex digits, surrogate codepoints, or values above U+10FFFF) fail at compile time with a specific error.find now returns null when no match is found, instead of -1. Audit existing programs that branch on find(...) < 0.vector vrl) and in codec VRL transforms, closing a long-standing surface gap.from / to) and wildcard match support.encode_proto gained looser scalar coercion: integers and strings are accepted for bool fields, integers for float and double fields, and integer or boolean map keys are stringified per the protobuf JSON mapping. A new allow_lossy_string_coercion flag lets strict callers opt back into spec-only encoding.encode_gzip / decode_gzip / encode_zlib / decode_zlib switched to the zlib-rs backend for significantly faster compression and decompression.encode_base64 / decode_base64 / decode_mime_q moved to a SIMD backend.parse_regex_all reuses the compiled regex across invocations.now() or environment variables in outgoing requests).%field = value writes.http sink's uri and request.headers fields.--watch-config also watches external VRL files referenced by remap transforms.SIGHUP.The VRL Playground gained a timezone selector, performance timing display, output-panel line wrap, and a series of dropdown and rendering fixes.
! or , err = on an earlier call could cause the diagnostic to point at a later, unrelated assignment. Now the error is reported on the actual fallible expression, including inside for_each and map_values closures.E900) fixed. A variable used before being reassigned (shadowed) is no longer flagged as unused at its original assignment.E209 invalid escape character) instead of the generic E202 syntax error, and their spans now point at the exact character rather than the whole call.vector test output honors --color {auto|always|never} and VECTOR_COLOR; VRL diagnostics stop emitting stray ANSI escape sequences when color is disabled or when running non-interactively.A recurring source of friction for contributors was hitting CI failures that were hard to reproduce locally or caused by false positives. Several checks were replaced or improved to reduce that gap. We also fixed long-standing flaky tests.
All of the following checks can be run locally before pushing, so there are no surprises on the PR.
typos replaces check-spelling. The old check-spelling workflow produced enough false positives to be a constant source of friction on PRs. It has been replaced with typos, a Rust-native spell checker that understands identifiers and hex literals natively. Run it locally with cargo binstall typos-cli && typos.make check-prettier locally and make fix-prettier to auto-fix.markdownlint configuration was tightened to catch more common style issues. Run make check-markdown locally and make fix-markdown to auto-fix.Vector genuinely would not be where it is without its community.
We are very happy to notice growing interest in Vector:
| Year | Unique | New | Returning |
|---|---|---|---|
| 2024 | 177 | 130 | 47 |
| 2025 | 191 | 144 | 47 |
| 2026 (YTD, 5 months) | 133 | 90 | 43 |
Thank you to every PR contributor behind those numbers, and to everyone who opened an issue, reviewed code, improved docs, or started a discussion.
We look forward to the future.
0.46.0]({{< ref "/releases/0.46.0" >}}) — 2025-04-040.47.0]({{< ref "/releases/0.47.0" >}}) — 2025-05-200.48.0]({{< ref "/releases/0.48.0" >}}) — 2025-06-300.49.0]({{< ref "/releases/0.49.0" >}}) — 2025-08-120.50.0]({{< ref "/releases/0.50.0" >}}) — 2025-09-230.51.0]({{< ref "/releases/0.51.0" >}}) — 2025-11-040.52.0]({{< ref "/releases/0.52.0" >}}) — 2025-12-160.53.0]({{< ref "/releases/0.53.0" >}}) — 2026-01-270.54.0]({{< ref "/releases/0.54.0" >}}) — 2026-03-100.55.0]({{< ref "/releases/0.55.0" >}}) — 2026-04-220.56.0]({{< ref "/releases/0.56.0" >}}) — 2026-06-03