From f5643b687151a31c5494b46646068f1dece4df7b Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 09:36:52 -0400 Subject: [PATCH 01/85] feat(releasing): add deprecation.d fragment system with vdev check/show commands and release integration --- .github/workflows/deprecation.yaml | 40 +++ deprecation.d/README.md | 63 +++++ deprecation.d/azure-monitor-logs-sink.md | 11 + deprecation.d/bool-or-vector-compression.md | 10 + deprecation.d/buffer-bytes-events-metrics.md | 8 + deprecation.d/datadog-metrics-series-v1.md | 10 + deprecation.d/greptimedb-v0-support.md | 8 + deprecation.d/http-server-encoding.md | 7 + docs/DEPRECATION.md | 8 +- docs/DEPRECATIONS.md | 34 +-- vdev/src/commands/check/deprecations.rs | 36 +++ vdev/src/commands/check/mod.rs | 2 + vdev/src/commands/deprecation/mod.rs | 6 + vdev/src/commands/deprecation/show.rs | 93 +++++++ vdev/src/commands/mod.rs | 2 + vdev/src/commands/release/generate_cue.rs | 83 +++++- vdev/src/utils/deprecation.rs | 275 +++++++++++++++++++ vdev/src/utils/mod.rs | 1 + 18 files changed, 670 insertions(+), 27 deletions(-) create mode 100644 .github/workflows/deprecation.yaml create mode 100644 deprecation.d/README.md create mode 100644 deprecation.d/azure-monitor-logs-sink.md create mode 100644 deprecation.d/bool-or-vector-compression.md create mode 100644 deprecation.d/buffer-bytes-events-metrics.md create mode 100644 deprecation.d/datadog-metrics-series-v1.md create mode 100644 deprecation.d/greptimedb-v0-support.md create mode 100644 deprecation.d/http-server-encoding.md create mode 100644 vdev/src/commands/check/deprecations.rs create mode 100644 vdev/src/commands/deprecation/mod.rs create mode 100644 vdev/src/commands/deprecation/show.rs create mode 100644 vdev/src/utils/deprecation.rs diff --git a/.github/workflows/deprecation.yaml b/.github/workflows/deprecation.yaml new file mode 100644 index 0000000000000..556ce3bdb16c4 --- /dev/null +++ b/.github/workflows/deprecation.yaml @@ -0,0 +1,40 @@ +# Deprecation fragments +# +# Validates that all files in deprecation.d/ have the correct format. +# Runs on PRs and on merge queues. +name: Deprecation + +on: + pull_request: + types: [opened, synchronize, reopened] + paths: + - "deprecation.d/**" + + # Required by GitHub merge queue due to branch protection rules. Should always be successful. + merge_group: + types: [checks_requested] + +permissions: + contents: read + +jobs: + validate-deprecations: + runs-on: ubuntu-24.04 + + steps: + - name: Merge queue + if: ${{ github.event_name == 'merge_group' }} + run: | + echo "merge_group event – passing without running deprecation validation." + exit 0 + + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Install Rust toolchain + uses: actions-rust-lang/setup-rust-toolchain@v1 + + - name: Install vdev + run: cargo install --path vdev --locked + + - name: Validate deprecation fragments + run: cargo vdev check deprecations diff --git a/deprecation.d/README.md b/deprecation.d/README.md new file mode 100644 index 0000000000000..627b165662ec9 --- /dev/null +++ b/deprecation.d/README.md @@ -0,0 +1,63 @@ +# deprecation.d + +This directory contains deprecation notices for Vector. + +Each file describes a feature, configuration option, or behavior that is being deprecated. +These notices are collected during the release process and rendered into two sections of the +release notes: + +- **`deprecations`** – items whose removal version matches the current release (enacted now). +- **`planned_deprecations`** – items scheduled for removal in a future release. + +## File format + +Each file must be named `.md` and begin with YAML frontmatter: + +```markdown +--- +announcement_version: "0.55.0" +deprecation_version: "0.57.0" +what: "The `legacy_auth` configuration option" +--- + +The `legacy_auth` option has been replaced by the new `auth` block. + +Migrate by replacing: + +```yaml +legacy_auth: "my_token" +``` + +with: + +```yaml +auth: + token: "my_token" +``` +``` + +### Frontmatter fields + +| Field | Required | Description | +|-------|----------|-------------| +| `what` | Yes | Short one-line description of what is deprecated. | +| `deprecation_version` | Yes | Semver version when the item will be removed, or `"TBD"` if not yet decided. | +| `announcement_version` | No | Semver version when the deprecation was first announced, or `"TBD"`. Omit if not applicable. | + +### Body + +The body of the file is an optional Markdown explanation: migration instructions, rationale, +or links to further documentation. It is rendered verbatim in the release notes. + +## Lifecycle + +1. **Announce** – a PR adds a file to this directory when the deprecation is first introduced. +2. **Planned** – every subsequent release lists the entry under `planned_deprecations`. +3. **Enacted** – when the release version equals `deprecation_version`, the entry moves to + `deprecations` in the release notes and the file is removed from this directory. + +## Validation + +Run `cargo vdev check deprecations` to validate all files in this directory. + +To preview the current deprecation state, run `cargo vdev deprecation show`. diff --git a/deprecation.d/azure-monitor-logs-sink.md b/deprecation.d/azure-monitor-logs-sink.md new file mode 100644 index 0000000000000..193ddb2975e54 --- /dev/null +++ b/deprecation.d/azure-monitor-logs-sink.md @@ -0,0 +1,11 @@ +--- +what: "The `azure_monitor_logs` sink" +announcement_version: "0.58.0" +deprecation_version: "TBD" +--- + +The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink, +which uses the Azure Monitor Logs Ingestion API. + +Users should migrate before Microsoft ends support for the old Data Collector API (scheduled +for September 2026). diff --git a/deprecation.d/bool-or-vector-compression.md b/deprecation.d/bool-or-vector-compression.md new file mode 100644 index 0000000000000..7c0204ee5fd71 --- /dev/null +++ b/deprecation.d/bool-or-vector-compression.md @@ -0,0 +1,10 @@ +--- +what: "Boolean syntax for the `compression` field in the `vector` sink" +announcement_version: "0.57.0" +deprecation_version: "TBD" +--- + +The boolean syntax (`compression: true` / `compression: false`) is deprecated. +Use the string syntax instead: `compression: "gzip"`, `compression: "zstd"`, or `compression: "none"`. + +The `bool_or_vector_compression` deserializer will be removed once the boolean syntax is no longer supported. diff --git a/deprecation.d/buffer-bytes-events-metrics.md b/deprecation.d/buffer-bytes-events-metrics.md new file mode 100644 index 0000000000000..55fc8d4560416 --- /dev/null +++ b/deprecation.d/buffer-bytes-events-metrics.md @@ -0,0 +1,8 @@ +--- +what: "The `buffer_byte_size` and `buffer_events` gauge metrics" +announcement_version: "0.53.0" +deprecation_version: "TBD" +--- + +The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the +`buffer_size_bytes` and `buffer_size_events` metrics described in `docs/specs/buffer.md`. diff --git a/deprecation.d/datadog-metrics-series-v1.md b/deprecation.d/datadog-metrics-series-v1.md new file mode 100644 index 0000000000000..104def4a8b119 --- /dev/null +++ b/deprecation.d/datadog-metrics-series-v1.md @@ -0,0 +1,10 @@ +--- +what: "The `series_api_version: v1` option on the `datadog_metrics` sink" +announcement_version: "0.58.0" +deprecation_version: "TBD" +--- + +The `series_api_version: v1` option is deprecated in favor of `v2` (the default). +The v1 series endpoint (`/api/v1/series`) is a legacy endpoint. + +Users should remove `series_api_version: v1` from their configuration or set it to `v2`. diff --git a/deprecation.d/greptimedb-v0-support.md b/deprecation.d/greptimedb-v0-support.md new file mode 100644 index 0000000000000..418621b732ffb --- /dev/null +++ b/deprecation.d/greptimedb-v0-support.md @@ -0,0 +1,8 @@ +--- +what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" +announcement_version: "TBD" +deprecation_version: "0.56.0" +--- + +The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. +Users must upgrade their GreptimeDB instance to v1.x before upgrading Vector. diff --git a/deprecation.d/http-server-encoding.md b/deprecation.d/http-server-encoding.md new file mode 100644 index 0000000000000..17d44326c1f74 --- /dev/null +++ b/deprecation.d/http-server-encoding.md @@ -0,0 +1,7 @@ +--- +what: "The `encoding` field on HTTP server sources" +announcement_version: "0.50.0" +deprecation_version: "TBD" +--- + +The `encoding` field will be removed. Use `decoding` and `framing` instead. diff --git a/docs/DEPRECATION.md b/docs/DEPRECATION.md index 23ef97ec2c475..9b403146ac44c 100644 --- a/docs/DEPRECATION.md +++ b/docs/DEPRECATION.md @@ -80,7 +80,10 @@ When introducing a deprecation into Vector, the pull request introducing the dep the new name will be appended with the text `(formerly OldName)`. - Add a log message to Vector that is logged at the `WARN` level starting with the word `DEPRECATION` if Vector detects the deprecated configuration or feature being used (when possible). -- Add the deprecation to [docs/DEPRECATIONS.md](../docs/DEPRECATIONS.md) to track migration (if applicable) and removal +- Add a deprecation notice file to [`deprecation.d/`](../deprecation.d/) following the format described in + [`deprecation.d/README.md`](../deprecation.d/README.md). Set `announcement_version` to the current release and + `deprecation_version` to the planned removal version (or `"TBD"` if not yet decided). Run + `cargo vdev check deprecations` to validate the file. When removing a deprecation in a subsequent release, the pull request should: @@ -90,4 +93,5 @@ When removing a deprecation in a subsequent release, the pull request should: for transitioning if applicable. - Copy the same note from the previous step, to a changelog fragment, with type="breaking". See the changelog fragment [README.md](../changelog.d/README.md) for details. -- Remove the deprecation from [docs/DEPRECATIONS.md](../docs/DEPRECATIONS.md) +- Remove the file from [`deprecation.d/`](../deprecation.d/) (the release tooling does this automatically when + `deprecation_version` matches the release being cut) diff --git a/docs/DEPRECATIONS.md b/docs/DEPRECATIONS.md index 5d0e823165b1b..7382e1f5fa4db 100644 --- a/docs/DEPRECATIONS.md +++ b/docs/DEPRECATIONS.md @@ -1,27 +1,17 @@ -See [DEPRECATION.md](/docs/DEPRECATION.md#process) for the process for updating this file. +Deprecation notices are now tracked in [`deprecation.d/`](../deprecation.d/) at the root of +the repository. -The format for each entry should be: ` `. +Each file in that directory is a self-contained deprecation notice with YAML frontmatter. +See [`deprecation.d/README.md`](../deprecation.d/README.md) for the file format and lifecycle. -- `` should be the version of Vector in which to take the action (deprecate, migrate, or - remove) -- `` should be a unique identifier that can also be used in the code to easily find the - places to modify -- `` should be a longer form description of the change to be made +To view all current notices, run: -For example: +```shell +cargo vdev deprecation show +``` -- v0.34.0 legacy_openssl_provider OpenSSL legacy provider flag should be removed +To validate the directory, run: -## To be deprecated - -- `v0.50.0` | `http-server-encoding` | The `encoding` field will be removed. Use `decoding` and `framing` instead. -- `v0.53.0` | `buffer-bytes-events-metrics` | The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the `buffer_size_bytes`/`buffer_size_events` metrics described in `docs/specs/buffer.md`. -- `v0.58.0` | `azure-monitor-logs-sink` | The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink, which uses the Azure Monitor Logs Ingestion API. Users should migrate before Microsoft ends support for the old Data Collector API (scheduled for September 2026). -- `v0.57.0` | `bool-or-vector-compression` | The boolean syntax for the `compression` field in the `vector` sink (`compression: true`/`compression: false`) is deprecated. Use the string syntax instead (`compression: "gzip"`, `compression: "zstd"`, or `compression: "none"`). The `bool_or_vector_compression` deserializer should be removed once the boolean syntax is no longer supported. -- `v0.58.0` | `datadog-metrics-series-v1` | The `series_api_version: v1` option on the `datadog_metrics` sink is deprecated in favor of `v2` (the default). The v1 series endpoint (`/api/v1/series`) is a legacy endpoint; users should remove `series_api_version: v1` from their configuration or set it to `v2`. - -## To be migrated - -## To be removed - -- `v0.56.0` | `greptimedb-v0-support` | The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. Users must upgrade their GreptimeDB instance to v1.x before upgrading Vector. +```shell +cargo vdev check deprecations +``` diff --git a/vdev/src/commands/check/deprecations.rs b/vdev/src/commands/check/deprecations.rs new file mode 100644 index 0000000000000..2d676532335f7 --- /dev/null +++ b/vdev/src/commands/check/deprecations.rs @@ -0,0 +1,36 @@ +#![allow(clippy::print_stdout)] + +use anyhow::Result; + +use crate::utils::{deprecation, paths}; + +/// Check that all deprecation.d fragments are valid +#[derive(clap::Args, Debug)] +#[command()] +pub struct Cli {} + +impl Cli { + pub fn exec(self) -> Result<()> { + let repo_root = paths::find_repo_root()?; + let dir = repo_root.join(deprecation::DEPRECATION_DIR); + + if !dir.is_dir() { + println!("No {dir} directory found; nothing to validate.", dir = dir.display()); + return Ok(()); + } + + let entries = deprecation::read_deprecation_fragments(&dir)?; + + if entries.is_empty() { + println!("No deprecation fragments found in {}.", dir.display()); + return Ok(()); + } + + for entry in &entries { + println!(" ok {}", entry.filename); + } + println!("{} deprecation fragment(s) are valid.", entries.len()); + + Ok(()) + } +} diff --git a/vdev/src/commands/check/mod.rs b/vdev/src/commands/check/mod.rs index 91e97de05f029..6daf4cd85cf0e 100644 --- a/vdev/src/commands/check/mod.rs +++ b/vdev/src/commands/check/mod.rs @@ -1,5 +1,6 @@ mod component_features; mod deny; +mod deprecations; mod events; mod examples; mod fmt; @@ -14,6 +15,7 @@ crate::cli_subcommands! { generated_docs, component_features, deny, + deprecations, docs, events, examples, diff --git a/vdev/src/commands/deprecation/mod.rs b/vdev/src/commands/deprecation/mod.rs new file mode 100644 index 0000000000000..6caf199625cc6 --- /dev/null +++ b/vdev/src/commands/deprecation/mod.rs @@ -0,0 +1,6 @@ +mod show; + +crate::cli_subcommands! { + "Manage and inspect deprecation notices..." + show, +} diff --git a/vdev/src/commands/deprecation/show.rs b/vdev/src/commands/deprecation/show.rs new file mode 100644 index 0000000000000..8fea4352ee59b --- /dev/null +++ b/vdev/src/commands/deprecation/show.rs @@ -0,0 +1,93 @@ +#![allow(clippy::print_stdout)] + +use anyhow::Result; +use semver::Version; + +use crate::utils::{ + deprecation::{self, DeprecationEntry}, + paths, +}; + +/// Show upcoming and in-progress deprecation notices +#[derive(clap::Args, Debug)] +#[command()] +pub struct Cli { + /// Filter to only show entries whose deprecation_version matches this release version. + #[arg(long)] + version: Option, +} + +impl Cli { + pub fn exec(self) -> Result<()> { + let repo_root = paths::find_repo_root()?; + let dir = repo_root.join(deprecation::DEPRECATION_DIR); + + if !dir.is_dir() { + println!("No {} directory found.", dir.display()); + return Ok(()); + } + + let mut entries = deprecation::read_deprecation_fragments(&dir)?; + + if entries.is_empty() { + println!("No deprecation notices found."); + return Ok(()); + } + + if let Some(ref version) = self.version { + entries.retain(|e| e.deprecation_version.matches_release(version)); + if entries.is_empty() { + println!("No deprecations enacted in v{version}."); + return Ok(()); + } + } + + // Split into enacted (major.minor matches filter) vs planned + let (enacted, planned): (Vec<_>, Vec<_>) = match &self.version { + Some(v) => { + let enacted: Vec<_> = entries + .iter() + .filter(|e| e.deprecation_version.matches_release(v)) + .collect(); + let planned: Vec<_> = entries + .iter() + .filter(|e| !e.deprecation_version.matches_release(v)) + .collect(); + (enacted, planned) + } + None => (vec![], entries.iter().collect()), + }; + + if !enacted.is_empty() { + println!("Deprecations (enacted in this release):"); + for e in &enacted { + print_entry(e); + } + } + + if !planned.is_empty() { + if !enacted.is_empty() { + println!(); + } + println!("Planned deprecations:"); + for e in &planned { + print_entry(e); + } + } + + Ok(()) + } +} + +fn print_entry(e: &DeprecationEntry) { + println!(" [{}] {}", e.deprecation_version, e.what); + if let Some(ref ann) = e.announcement_version { + println!(" announced: {ann}"); + } + if !e.description.is_empty() { + // Indent description lines for readability + for line in e.description.lines() { + println!(" {line}"); + } + } +} diff --git a/vdev/src/commands/mod.rs b/vdev/src/commands/mod.rs index d80b6132e9ae4..d7ee216e5fccd 100644 --- a/vdev/src/commands/mod.rs +++ b/vdev/src/commands/mod.rs @@ -71,6 +71,7 @@ mod build; mod check; mod complete; mod crate_versions; +mod deprecation; mod e2e; mod features; mod fmt; @@ -90,6 +91,7 @@ cli_commands! { check, complete, crate_versions, + deprecation, e2e, features, fmt, diff --git a/vdev/src/commands/release/generate_cue.rs b/vdev/src/commands/release/generate_cue.rs index 5ac95237029eb..072a50536f80e 100644 --- a/vdev/src/commands/release/generate_cue.rs +++ b/vdev/src/commands/release/generate_cue.rs @@ -12,7 +12,10 @@ use regex::Regex; use semver::Version; use serde_json::json; -use crate::utils::{git, paths}; +use crate::utils::{ + deprecation::{self, DeprecationEntry}, + git, paths, +}; const RELEASES_DIR: &str = "website/cue/reference/releases"; const CHANGELOG_DIR: &str = "changelog.d"; @@ -80,10 +83,28 @@ pub(super) fn run(new_version: &Version) -> Result { let changelog_dir = repo_root.join(CHANGELOG_DIR); let changelog_entries = read_changelog_fragments(&changelog_dir)?; - let cue_text = render_release_cue(&new_version, &changelog_entries, &commits); + let deprecation_dir = repo_root.join(deprecation::DEPRECATION_DIR); + let all_deprecations = deprecation::read_deprecation_fragments(&deprecation_dir)?; + + // Partition deprecation entries: enacted (major.minor matches this release) vs planned. + // Patch is ignored: a deprecation labelled "0.56" is enacted on any 0.56.x release. + let (enacted_deprecations, planned_deprecations): (Vec<_>, Vec<_>) = all_deprecations + .into_iter() + .partition(|e| e.deprecation_version.matches_release(&new_version)); + + let cue_text = render_release_cue( + &new_version, + &changelog_entries, + &commits, + &enacted_deprecations, + &planned_deprecations, + ); fs::write(&cue_path, cue_text) .with_context(|| format!("Failed to write {}", cue_path.display()))?; + // Retire enacted deprecation fragments via `git rm`. + retire_deprecation_fragments(&deprecation_dir, &enacted_deprecations)?; + // Retire the changelog fragments via `git rm` (preserves README.md). retire_changelog_fragments(&changelog_dir)?; @@ -502,12 +523,27 @@ fn retire_changelog_fragments(dir: &Path) -> Result<()> { Ok(()) } +fn retire_deprecation_fragments(dir: &Path, enacted: &[DeprecationEntry]) -> Result<()> { + if !dir.is_dir() || enacted.is_empty() { + return Ok(()); + } + let cwd = env::current_dir()?; + for entry in enacted { + let path = dir.join(&entry.filename); + let rel = path.strip_prefix(&cwd).unwrap_or(&path); + git::rm(&rel.to_string_lossy())?; + } + Ok(()) +} + // ---------- CUE rendering ---------- fn render_release_cue( version: &Version, changelog: &[ChangelogEntry], commits: &[Commit], + enacted_deprecations: &[DeprecationEntry], + planned_deprecations: &[DeprecationEntry], ) -> String { let date = Utc::now().format("%Y-%m-%d").to_string(); let changelog_block = render_changelog(changelog); @@ -517,6 +553,9 @@ fn render_release_cue( .collect::>() .join(",\n "); + let deprecations_block = render_deprecation_section(enacted_deprecations); + let planned_deprecations_block = render_deprecation_section(planned_deprecations); + format!( "package metadata\n\ \n\ @@ -526,6 +565,14 @@ fn render_release_cue( \n\ \twhats_next: []\n\ \n\ + \tdeprecations: [\n\ + {deprecations_block}\n\ + \t]\n\ + \n\ + \tplanned_deprecations: [\n\ + {planned_deprecations_block}\n\ + \t]\n\ + \n\ \tchangelog: [\n\ {changelog_block}\n\ \t]\n\ @@ -535,6 +582,36 @@ fn render_release_cue( ) } +fn render_deprecation_section(entries: &[DeprecationEntry]) -> String { + entries + .iter() + .map(|e| { + let mut s = String::new(); + s.push_str("\t\t{\n"); + writeln!(s, "\t\t\twhat: {}", json!(e.what)).unwrap(); + writeln!( + s, + "\t\t\tdeprecation_version: {}", + json!(e.deprecation_version.to_string()) + ) + .unwrap(); + if let Some(ref ann) = e.announcement_version { + writeln!(s, "\t\t\tannouncement_version: {}", json!(ann.to_string())).unwrap(); + } + if !e.description.is_empty() { + s.push_str("\t\t\tdescription: #\"\"\"\n"); + for line in e.description.lines() { + writeln!(s, "\t\t\t\t{line}").unwrap(); + } + s.push_str("\t\t\t\t\"\"\"#\n"); + } + s.push_str("\t\t}"); + s + }) + .collect::>() + .join(",\n") +} + fn render_changelog(entries: &[ChangelogEntry]) -> String { entries .iter() @@ -703,7 +780,7 @@ mod tests { deletions_count: 3, }]; - let out = render_release_cue(&Version::new(0, 99, 0), &entries, &commits); + let out = render_release_cue(&Version::new(0, 99, 0), &entries, &commits, &[], &[]); assert!(out.starts_with("package metadata\n")); assert!(out.contains("releases: \"0.99.0\":")); diff --git a/vdev/src/utils/deprecation.rs b/vdev/src/utils/deprecation.rs new file mode 100644 index 0000000000000..7787aa6e59d87 --- /dev/null +++ b/vdev/src/utils/deprecation.rs @@ -0,0 +1,275 @@ +use std::{ + fmt, + fs, + path::{Path, PathBuf}, +}; + +use anyhow::{Context, Result, anyhow, bail}; +use semver::Version; + +pub const DEPRECATION_DIR: &str = "deprecation.d"; + +/// A version field that is either a concrete semver version or the placeholder `TBD`. +#[derive(Debug, Clone, PartialEq)] +pub enum VersionOrTbd { + Version(Version), + Tbd, +} + +impl fmt::Display for VersionOrTbd { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + VersionOrTbd::Version(v) => write!(f, "{v}"), + VersionOrTbd::Tbd => write!(f, "TBD"), + } + } +} + +impl VersionOrTbd { + /// Returns true when this version's major.minor matches `release`'s major.minor. + /// Patch is intentionally ignored: a deprecation labelled "0.56" (stored as 0.56.0) + /// is enacted on any 0.56.x release cut. + pub fn matches_release(&self, release: &Version) -> bool { + match self { + VersionOrTbd::Version(v) => v.major == release.major && v.minor == release.minor, + VersionOrTbd::Tbd => false, + } + } +} + +impl<'de> serde::Deserialize<'de> for VersionOrTbd { + fn deserialize>(d: D) -> std::result::Result { + let s = String::deserialize(d)?; + let s = s.trim(); + if s == "TBD" { + return Ok(VersionOrTbd::Tbd); + } + // Accept both "0.56" (major.minor) and "0.56.0" (major.minor.patch). + // Normalize the two-part form by appending ".0". + let normalized = if s.chars().filter(|&c| c == '.').count() == 1 { + std::borrow::Cow::Owned(format!("{s}.0")) + } else { + std::borrow::Cow::Borrowed(s) + }; + Version::parse(&normalized) + .map(VersionOrTbd::Version) + .map_err(|e| serde::de::Error::custom(format!("invalid version '{s}': {e}"))) + } +} + +use serde::Deserialize; + +#[derive(Debug, Deserialize)] +struct Frontmatter { + what: String, + deprecation_version: VersionOrTbd, + announcement_version: Option, +} + +/// A parsed and validated deprecation entry from `deprecation.d/`. +#[derive(Debug, Clone)] +pub struct DeprecationEntry { + pub filename: String, + pub what: String, + pub deprecation_version: VersionOrTbd, + pub announcement_version: Option, + /// Optional body text (everything after the closing `---` of the frontmatter). + pub description: String, +} + +/// Read and parse all deprecation fragments from the given directory. +/// Returns entries sorted by filename. +pub fn read_deprecation_fragments(dir: &Path) -> Result> { + if !dir.is_dir() { + return Ok(Vec::new()); + } + let mut paths: Vec = fs::read_dir(dir)? + .filter_map(|e| e.ok().map(|e| e.path())) + .filter(|p| p.extension().is_some_and(|x| x == "md")) + .filter(|p| p.file_name().and_then(|n| n.to_str()) != Some("README.md")) + .collect(); + paths.sort(); + paths + .into_iter() + .map(|p| parse_deprecation_fragment(&p)) + .collect() +} + +fn parse_deprecation_fragment(path: &Path) -> Result { + let filename = path + .file_name() + .and_then(|n| n.to_str()) + .unwrap_or("") + .to_string(); + + if !filename.ends_with(".md") { + bail!( + "Deprecation fragment {} must have a .md extension", + path.display() + ); + } + + let raw = + fs::read_to_string(path).with_context(|| format!("Failed to read {}", path.display()))?; + + let (frontmatter_str, body) = split_frontmatter(&raw, path)?; + + let fm: Frontmatter = serde_yaml::from_str(frontmatter_str).with_context(|| { + format!( + "Failed to parse YAML frontmatter in {}", + path.display() + ) + })?; + + if fm.what.trim().is_empty() { + bail!( + "Deprecation fragment {}: `what` field must not be empty", + path.display() + ); + } + + Ok(DeprecationEntry { + filename, + what: fm.what.trim().to_string(), + deprecation_version: fm.deprecation_version, + announcement_version: fm.announcement_version, + description: body.trim().to_string(), + }) +} + +/// Split the raw file contents into the frontmatter string and the body. +/// The file must begin with `---`, and have a closing `---` on its own line. +fn split_frontmatter<'a>(content: &'a str, path: &Path) -> Result<(&'a str, &'a str)> { + let content = content.trim_start(); + if !content.starts_with("---") { + bail!( + "Deprecation fragment {} must begin with YAML frontmatter (---)", + path.display() + ); + } + + // Advance past the opening `---` (and optional trailing whitespace on that line) + let after_open = content[3..].trim_start_matches([' ', '\t']); + let after_open = after_open.trim_start_matches('\n'); + + let close_pos = after_open + .find("\n---") + .ok_or_else(|| anyhow!("Deprecation fragment {} has unclosed frontmatter", path.display()))?; + + let frontmatter = &after_open[..close_pos]; + let rest = &after_open[close_pos + 4..]; // skip `\n---` + let body = rest.trim_start_matches(['\r', '\n']); + + Ok((frontmatter, body)) +} + +#[cfg(test)] +mod tests { + use super::*; + use std::fs; + use tempfile::tempdir; + + #[test] + fn parse_full_entry() { + let tmp = tempdir().unwrap(); + fs::write( + tmp.path().join("foo_opt.md"), + "---\nwhat: The foo option\ndeprecation_version: \"0.57.0\"\nannouncement_version: \"0.55.0\"\n---\n\nDetailed explanation.\n", + ) + .unwrap(); + let entries = read_deprecation_fragments(tmp.path()).unwrap(); + assert_eq!(entries.len(), 1); + let e = &entries[0]; + assert_eq!(e.what, "The foo option"); + assert_eq!(e.deprecation_version, VersionOrTbd::Version(Version::new(0, 57, 0))); + assert_eq!( + e.announcement_version, + Some(VersionOrTbd::Version(Version::new(0, 55, 0))) + ); + assert_eq!(e.description, "Detailed explanation."); + } + + #[test] + fn parse_tbd_versions() { + let tmp = tempdir().unwrap(); + fs::write( + tmp.path().join("bar.md"), + "---\nwhat: Bar thing\ndeprecation_version: \"TBD\"\nannouncement_version: \"TBD\"\n---\n", + ) + .unwrap(); + let entries = read_deprecation_fragments(tmp.path()).unwrap(); + assert_eq!(entries[0].deprecation_version, VersionOrTbd::Tbd); + assert_eq!(entries[0].announcement_version, Some(VersionOrTbd::Tbd)); + } + + #[test] + fn parse_no_announcement_version() { + let tmp = tempdir().unwrap(); + fs::write( + tmp.path().join("baz.md"), + "---\nwhat: Baz option\ndeprecation_version: \"0.60.0\"\n---\n", + ) + .unwrap(); + let entries = read_deprecation_fragments(tmp.path()).unwrap(); + assert!(entries[0].announcement_version.is_none()); + } + + #[test] + fn rejects_missing_frontmatter() { + let tmp = tempdir().unwrap(); + fs::write(tmp.path().join("bad.md"), "No frontmatter here.\n").unwrap(); + assert!(read_deprecation_fragments(tmp.path()).is_err()); + } + + #[test] + fn rejects_empty_what() { + let tmp = tempdir().unwrap(); + fs::write( + tmp.path().join("empty.md"), + "---\nwhat: \" \"\ndeprecation_version: \"0.60.0\"\n---\n", + ) + .unwrap(); + assert!(read_deprecation_fragments(tmp.path()).is_err()); + } + + #[test] + fn skips_readme() { + let tmp = tempdir().unwrap(); + fs::write(tmp.path().join("README.md"), "# ignored").unwrap(); + let entries = read_deprecation_fragments(tmp.path()).unwrap(); + assert!(entries.is_empty()); + } + + #[test] + fn parse_two_part_version() { + let tmp = tempdir().unwrap(); + fs::write( + tmp.path().join("short.md"), + "---\nwhat: Short version\ndeprecation_version: \"0.56\"\n---\n", + ) + .unwrap(); + let entries = read_deprecation_fragments(tmp.path()).unwrap(); + // "0.56" normalises to 0.56.0 + assert_eq!( + entries[0].deprecation_version, + VersionOrTbd::Version(Version::new(0, 56, 0)) + ); + } + + #[test] + fn matches_release_ignores_patch() { + let v = VersionOrTbd::Version(Version::new(0, 56, 0)); + // "0.56" (stored as 0.56.0) should match any 0.56.x release + assert!(v.matches_release(&Version::new(0, 56, 0))); + assert!(v.matches_release(&Version::new(0, 56, 1))); + assert!(v.matches_release(&Version::new(0, 56, 99))); + // Different minor/major must not match + assert!(!v.matches_release(&Version::new(0, 57, 0))); + assert!(!v.matches_release(&Version::new(1, 56, 0))); + } + + #[test] + fn tbd_never_matches_release() { + assert!(!VersionOrTbd::Tbd.matches_release(&Version::new(0, 56, 0))); + } +} diff --git a/vdev/src/utils/mod.rs b/vdev/src/utils/mod.rs index f676f105e7c2d..2724df2d69ad0 100644 --- a/vdev/src/utils/mod.rs +++ b/vdev/src/utils/mod.rs @@ -21,6 +21,7 @@ pub mod macros; pub mod cargo; pub mod command; +pub mod deprecation; pub mod environment; pub mod features; pub mod git; From 6d0e0c07a40a234ecb37b21a4b8d65b3f578621c Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 10:02:32 -0400 Subject: [PATCH 02/85] chore(ci): wire deprecation check into changelog.yaml via bash script --- .github/workflows/changelog.yaml | 19 +++++ .github/workflows/deprecation.yaml | 40 ----------- scripts/check_deprecation_fragments.sh | 97 ++++++++++++++++++++++++++ 3 files changed, 116 insertions(+), 40 deletions(-) delete mode 100644 .github/workflows/deprecation.yaml create mode 100755 scripts/check_deprecation_fragments.sh diff --git a/.github/workflows/changelog.yaml b/.github/workflows/changelog.yaml index 188a41d368e2b..6f5788916576a 100644 --- a/.github/workflows/changelog.yaml +++ b/.github/workflows/changelog.yaml @@ -55,3 +55,22 @@ jobs: run: | # Compare against origin/master ./scripts/check_changelog_fragments.sh + + validate-deprecations: + permissions: + contents: read + pull-requests: none + + runs-on: ubuntu-24.04 + + steps: + - name: Merge queue + if: ${{ github.event_name == 'merge_group' }} + run: | + echo "merge_group event – passing without running deprecation validation." + exit 0 + + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Run deprecation fragment checker + run: ./scripts/check_deprecation_fragments.sh diff --git a/.github/workflows/deprecation.yaml b/.github/workflows/deprecation.yaml deleted file mode 100644 index 556ce3bdb16c4..0000000000000 --- a/.github/workflows/deprecation.yaml +++ /dev/null @@ -1,40 +0,0 @@ -# Deprecation fragments -# -# Validates that all files in deprecation.d/ have the correct format. -# Runs on PRs and on merge queues. -name: Deprecation - -on: - pull_request: - types: [opened, synchronize, reopened] - paths: - - "deprecation.d/**" - - # Required by GitHub merge queue due to branch protection rules. Should always be successful. - merge_group: - types: [checks_requested] - -permissions: - contents: read - -jobs: - validate-deprecations: - runs-on: ubuntu-24.04 - - steps: - - name: Merge queue - if: ${{ github.event_name == 'merge_group' }} - run: | - echo "merge_group event – passing without running deprecation validation." - exit 0 - - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - - name: Install Rust toolchain - uses: actions-rust-lang/setup-rust-toolchain@v1 - - - name: Install vdev - run: cargo install --path vdev --locked - - - name: Validate deprecation fragments - run: cargo vdev check deprecations diff --git a/scripts/check_deprecation_fragments.sh b/scripts/check_deprecation_fragments.sh new file mode 100755 index 0000000000000..0a3e3c1c4cb81 --- /dev/null +++ b/scripts/check_deprecation_fragments.sh @@ -0,0 +1,97 @@ +#!/usr/bin/env bash + +# Validates all deprecation.d/ fragment files for correct format. +# Run locally at any time; run in CI on PRs that touch deprecation.d/. + +DEPRECATION_DIR="deprecation.d" +VERSION_RE='^[0-9]+\.[0-9]+(\.[0-9]+)?$' + +if [ ! -d "${DEPRECATION_DIR}" ]; then + echo "No ./${DEPRECATION_DIR} found. This tool must be invoked from the root of the repo." + exit 1 +fi + +FRAGMENTS=$(find "${DEPRECATION_DIR}" -maxdepth 1 -name "*.md" ! -name "README.md" | sort) + +if [ -z "$FRAGMENTS" ]; then + echo "No deprecation fragments found in ${DEPRECATION_DIR}/." + exit 0 +fi + +error=0 + +while IFS= read -r fpath; do + fname=$(basename "$fpath") + echo "validating '${fname}'" + + # Must end with .md (guaranteed by find, but be explicit) + if [[ "${fname}" != *.md ]]; then + echo " error: file must have a .md extension (${fname})" + error=1 + continue + fi + + # Must start with opening --- + first_line=$(head -n 1 "$fpath") + if [[ "${first_line}" != "---" ]]; then + echo " error: file must begin with YAML frontmatter (---) (${fname})" + error=1 + continue + fi + + # Must have a closing --- + if ! awk 'NR>1 && /^---$/ { found=1; exit } END { exit !found }' "$fpath"; then + echo " error: file has unclosed frontmatter — missing closing '---' (${fname})" + error=1 + continue + fi + + # Extract frontmatter block (between the two ---) + frontmatter=$(awk '/^---$/ { if (++n == 2) exit; next } n == 1' "$fpath") + + # what: is required and must be non-empty + what_line=$(echo "$frontmatter" | grep -E '^what:') + if [ -z "$what_line" ]; then + echo " error: missing required field 'what' (${fname})" + error=1 + continue + fi + what_value=$(echo "$what_line" | sed 's/^what:[[:space:]]*//' | tr -d '"'"'" | tr -d '[:space:]') + if [ -z "$what_value" ]; then + echo " error: 'what' field must not be empty (${fname})" + error=1 + continue + fi + + # deprecation_version: is required; value must be TBD or a semver string + dep_line=$(echo "$frontmatter" | grep -E '^deprecation_version:') + if [ -z "$dep_line" ]; then + echo " error: missing required field 'deprecation_version' (${fname})" + error=1 + continue + fi + dep_value=$(echo "$dep_line" | sed 's/^deprecation_version:[[:space:]]*//' | tr -d '"'"'") + if [[ "${dep_value}" != "TBD" ]] && ! [[ "${dep_value}" =~ $VERSION_RE ]]; then + echo " error: 'deprecation_version' must be \"TBD\" or a version like \"0.56\" or \"0.56.0\" (got '${dep_value}') (${fname})" + error=1 + continue + fi + + # announcement_version: optional; if present must be TBD or a semver string + ann_line=$(echo "$frontmatter" | grep -E '^announcement_version:') + if [ -n "$ann_line" ]; then + ann_value=$(echo "$ann_line" | sed 's/^announcement_version:[[:space:]]*//' | tr -d '"'"'") + if [[ "${ann_value}" != "TBD" ]] && ! [[ "${ann_value}" =~ $VERSION_RE ]]; then + echo " error: 'announcement_version' must be \"TBD\" or a version like \"0.56\" or \"0.56.0\" (got '${ann_value}') (${fname})" + error=1 + continue + fi + fi + +done <<< "$FRAGMENTS" + +if [ "$error" -ne 0 ]; then + exit 1 +fi + +echo "deprecation fragments are valid." From 411a95799077734160b680181a7ac919bc9823a7 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 10:14:57 -0400 Subject: [PATCH 03/85] Revert "chore(ci): wire deprecation check into changelog.yaml via bash script" This reverts commit 6d0e0c07a40a234ecb37b21a4b8d65b3f578621c. --- .github/workflows/changelog.yaml | 19 ----- .github/workflows/deprecation.yaml | 40 +++++++++++ scripts/check_deprecation_fragments.sh | 97 -------------------------- 3 files changed, 40 insertions(+), 116 deletions(-) create mode 100644 .github/workflows/deprecation.yaml delete mode 100755 scripts/check_deprecation_fragments.sh diff --git a/.github/workflows/changelog.yaml b/.github/workflows/changelog.yaml index 6f5788916576a..188a41d368e2b 100644 --- a/.github/workflows/changelog.yaml +++ b/.github/workflows/changelog.yaml @@ -55,22 +55,3 @@ jobs: run: | # Compare against origin/master ./scripts/check_changelog_fragments.sh - - validate-deprecations: - permissions: - contents: read - pull-requests: none - - runs-on: ubuntu-24.04 - - steps: - - name: Merge queue - if: ${{ github.event_name == 'merge_group' }} - run: | - echo "merge_group event – passing without running deprecation validation." - exit 0 - - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - - name: Run deprecation fragment checker - run: ./scripts/check_deprecation_fragments.sh diff --git a/.github/workflows/deprecation.yaml b/.github/workflows/deprecation.yaml new file mode 100644 index 0000000000000..556ce3bdb16c4 --- /dev/null +++ b/.github/workflows/deprecation.yaml @@ -0,0 +1,40 @@ +# Deprecation fragments +# +# Validates that all files in deprecation.d/ have the correct format. +# Runs on PRs and on merge queues. +name: Deprecation + +on: + pull_request: + types: [opened, synchronize, reopened] + paths: + - "deprecation.d/**" + + # Required by GitHub merge queue due to branch protection rules. Should always be successful. + merge_group: + types: [checks_requested] + +permissions: + contents: read + +jobs: + validate-deprecations: + runs-on: ubuntu-24.04 + + steps: + - name: Merge queue + if: ${{ github.event_name == 'merge_group' }} + run: | + echo "merge_group event – passing without running deprecation validation." + exit 0 + + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Install Rust toolchain + uses: actions-rust-lang/setup-rust-toolchain@v1 + + - name: Install vdev + run: cargo install --path vdev --locked + + - name: Validate deprecation fragments + run: cargo vdev check deprecations diff --git a/scripts/check_deprecation_fragments.sh b/scripts/check_deprecation_fragments.sh deleted file mode 100755 index 0a3e3c1c4cb81..0000000000000 --- a/scripts/check_deprecation_fragments.sh +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/bin/env bash - -# Validates all deprecation.d/ fragment files for correct format. -# Run locally at any time; run in CI on PRs that touch deprecation.d/. - -DEPRECATION_DIR="deprecation.d" -VERSION_RE='^[0-9]+\.[0-9]+(\.[0-9]+)?$' - -if [ ! -d "${DEPRECATION_DIR}" ]; then - echo "No ./${DEPRECATION_DIR} found. This tool must be invoked from the root of the repo." - exit 1 -fi - -FRAGMENTS=$(find "${DEPRECATION_DIR}" -maxdepth 1 -name "*.md" ! -name "README.md" | sort) - -if [ -z "$FRAGMENTS" ]; then - echo "No deprecation fragments found in ${DEPRECATION_DIR}/." - exit 0 -fi - -error=0 - -while IFS= read -r fpath; do - fname=$(basename "$fpath") - echo "validating '${fname}'" - - # Must end with .md (guaranteed by find, but be explicit) - if [[ "${fname}" != *.md ]]; then - echo " error: file must have a .md extension (${fname})" - error=1 - continue - fi - - # Must start with opening --- - first_line=$(head -n 1 "$fpath") - if [[ "${first_line}" != "---" ]]; then - echo " error: file must begin with YAML frontmatter (---) (${fname})" - error=1 - continue - fi - - # Must have a closing --- - if ! awk 'NR>1 && /^---$/ { found=1; exit } END { exit !found }' "$fpath"; then - echo " error: file has unclosed frontmatter — missing closing '---' (${fname})" - error=1 - continue - fi - - # Extract frontmatter block (between the two ---) - frontmatter=$(awk '/^---$/ { if (++n == 2) exit; next } n == 1' "$fpath") - - # what: is required and must be non-empty - what_line=$(echo "$frontmatter" | grep -E '^what:') - if [ -z "$what_line" ]; then - echo " error: missing required field 'what' (${fname})" - error=1 - continue - fi - what_value=$(echo "$what_line" | sed 's/^what:[[:space:]]*//' | tr -d '"'"'" | tr -d '[:space:]') - if [ -z "$what_value" ]; then - echo " error: 'what' field must not be empty (${fname})" - error=1 - continue - fi - - # deprecation_version: is required; value must be TBD or a semver string - dep_line=$(echo "$frontmatter" | grep -E '^deprecation_version:') - if [ -z "$dep_line" ]; then - echo " error: missing required field 'deprecation_version' (${fname})" - error=1 - continue - fi - dep_value=$(echo "$dep_line" | sed 's/^deprecation_version:[[:space:]]*//' | tr -d '"'"'") - if [[ "${dep_value}" != "TBD" ]] && ! [[ "${dep_value}" =~ $VERSION_RE ]]; then - echo " error: 'deprecation_version' must be \"TBD\" or a version like \"0.56\" or \"0.56.0\" (got '${dep_value}') (${fname})" - error=1 - continue - fi - - # announcement_version: optional; if present must be TBD or a semver string - ann_line=$(echo "$frontmatter" | grep -E '^announcement_version:') - if [ -n "$ann_line" ]; then - ann_value=$(echo "$ann_line" | sed 's/^announcement_version:[[:space:]]*//' | tr -d '"'"'") - if [[ "${ann_value}" != "TBD" ]] && ! [[ "${ann_value}" =~ $VERSION_RE ]]; then - echo " error: 'announcement_version' must be \"TBD\" or a version like \"0.56\" or \"0.56.0\" (got '${ann_value}') (${fname})" - error=1 - continue - fi - fi - -done <<< "$FRAGMENTS" - -if [ "$error" -ne 0 ]; then - exit 1 -fi - -echo "deprecation fragments are valid." From f2b55c226e1b67dd502a3c0cb092f52d2bc95773 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 10:15:43 -0400 Subject: [PATCH 04/85] chore(ci): use changes.yml and setup action for deprecation fragment check --- .github/workflows/changes.yml | 8 ++++ .github/workflows/deprecation.yaml | 73 +++++++++++++++++++----------- 2 files changed, 55 insertions(+), 26 deletions(-) diff --git a/.github/workflows/changes.yml b/.github/workflows/changes.yml index 246aff0001d64..5de11bf259e15 100644 --- a/.github/workflows/changes.yml +++ b/.github/workflows/changes.yml @@ -34,6 +34,8 @@ on: value: ${{ jobs.source.outputs.dependencies }} deny: value: ${{ jobs.source.outputs.deny }} + deprecations: + value: ${{ jobs.source.outputs.deprecations }} internal_events: value: ${{ jobs.source.outputs.internal_events }} cue: @@ -170,6 +172,7 @@ jobs: source: ${{ steps.filter.outputs.source }} dependencies: ${{ steps.filter.outputs.dependencies }} deny: ${{ steps.filter.outputs.deny }} + deprecations: ${{ steps.filter.outputs.deprecations }} internal_events: ${{ steps.filter.outputs.internal_events }} cue: ${{ steps.filter.outputs.cue }} component_docs: ${{ steps.filter.outputs.component_docs }} @@ -223,6 +226,11 @@ jobs: - '**/Cargo.toml' - 'Cargo.lock' - ".github/workflows/deny.yml" + deprecations: + - 'deprecation.d/**' + - "vdev/**" + - ".github/workflows/deprecation.yaml" + - ".github/workflows/changes.yml" cue: - 'website/cue/**' - "vdev/**" diff --git a/.github/workflows/deprecation.yaml b/.github/workflows/deprecation.yaml index 556ce3bdb16c4..86e4f2ae83f93 100644 --- a/.github/workflows/deprecation.yaml +++ b/.github/workflows/deprecation.yaml @@ -1,40 +1,61 @@ -# Deprecation fragments +# Deprecation Fragments # # Validates that all files in deprecation.d/ have the correct format. -# Runs on PRs and on merge queues. -name: Deprecation +# +# Runs on: +# - on PR review (see ci-review-trigger.yml) +# - on demand from GitHub Actions UI +# - on pull requests when deprecation.d/ or vdev/ files change + +name: Deprecation Fragments on: - pull_request: - types: [opened, synchronize, reopened] - paths: - - "deprecation.d/**" + workflow_call: + inputs: + ref: + description: "Git ref to checkout" + required: false + type: string + + workflow_dispatch: + inputs: + ref: + description: "Git ref to checkout" + required: false + type: string - # Required by GitHub merge queue due to branch protection rules. Should always be successful. + pull_request: merge_group: types: [checks_requested] +concurrency: + group: ${{ github.workflow }}-${{ github.event.number || github.sha }} + cancel-in-progress: true + permissions: contents: read jobs: - validate-deprecations: - runs-on: ubuntu-24.04 + changes: + if: ${{ github.event_name == 'pull_request' }} + uses: ./.github/workflows/changes.yml + secrets: inherit + check-deprecations: + runs-on: ubuntu-24.04 + timeout-minutes: 10 + if: ${{ always() && (github.event_name != 'pull_request' || needs.changes.outputs.deprecations == 'true') }} + needs: [changes] steps: - - name: Merge queue - if: ${{ github.event_name == 'merge_group' }} - run: | - echo "merge_group event – passing without running deprecation validation." - exit 0 - - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - - name: Install Rust toolchain - uses: actions-rust-lang/setup-rust-toolchain@v1 - - - name: Install vdev - run: cargo install --path vdev --locked - - - name: Validate deprecation fragments - run: cargo vdev check deprecations + - name: Checkout branch + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + ref: ${{ inputs.ref }} + + - uses: ./.github/actions/setup + with: + vdev: true + mold: false + + - name: Check deprecation fragments + run: vdev check deprecations From a42c0a4fc73a7bd881fa17d1f69a9d1af7333f88 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 10:16:47 -0400 Subject: [PATCH 05/85] chore(ci): remove stale comment from deprecation workflow --- .github/workflows/deprecation.yaml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.github/workflows/deprecation.yaml b/.github/workflows/deprecation.yaml index 86e4f2ae83f93..a11ffca020a67 100644 --- a/.github/workflows/deprecation.yaml +++ b/.github/workflows/deprecation.yaml @@ -1,12 +1,3 @@ -# Deprecation Fragments -# -# Validates that all files in deprecation.d/ have the correct format. -# -# Runs on: -# - on PR review (see ci-review-trigger.yml) -# - on demand from GitHub Actions UI -# - on pull requests when deprecation.d/ or vdev/ files change - name: Deprecation Fragments on: From 9e5a2eb22c0e8f4b3c1962fb63877e7a210db178 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 10:27:03 -0400 Subject: [PATCH 06/85] chore(internal docs): add deprecations and planned_deprecations to release CUE schema --- website/cue/reference/releases.cue | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/website/cue/reference/releases.cue b/website/cue/reference/releases.cue index f4679becfcdc9..1ec7e6265a1ec 100644 --- a/website/cue/reference/releases.cue +++ b/website/cue/reference/releases.cue @@ -28,6 +28,13 @@ releases: { contributors: [string, ...string] | *[] } + #DeprecationEntry: { + what: string + deprecation_version: string + announcement_version?: string + description?: string + } + #Release: { version: string codename?: string @@ -39,6 +46,8 @@ releases: { changelog: [#ChangeLogEntry, ...#ChangeLogEntry] | *[] vrl_changelog?: string whats_next: #Any | *[] + deprecations: [#DeprecationEntry, ...#DeprecationEntry] | *[] + planned_deprecations: [#DeprecationEntry, ...#DeprecationEntry] | *[] } {[Version=string]: #Release & {version: Version}} From 1196d69e0aaad8e4ffbe7d226aedbe2a715e22b7 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 10:29:43 -0400 Subject: [PATCH 07/85] chore(internal docs): fix deprecation fragments to use deprecation_version not announcement_version --- deprecation.d/azure-monitor-logs-sink.md | 3 +-- deprecation.d/bool-or-vector-compression.md | 3 +-- deprecation.d/buffer-bytes-events-metrics.md | 3 +-- deprecation.d/datadog-metrics-series-v1.md | 3 +-- deprecation.d/greptimedb-v0-support.md | 1 - deprecation.d/http-server-encoding.md | 3 +-- 6 files changed, 5 insertions(+), 11 deletions(-) diff --git a/deprecation.d/azure-monitor-logs-sink.md b/deprecation.d/azure-monitor-logs-sink.md index 193ddb2975e54..e29db2732c7f5 100644 --- a/deprecation.d/azure-monitor-logs-sink.md +++ b/deprecation.d/azure-monitor-logs-sink.md @@ -1,7 +1,6 @@ --- what: "The `azure_monitor_logs` sink" -announcement_version: "0.58.0" -deprecation_version: "TBD" +deprecation_version: "0.58.0" --- The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink, diff --git a/deprecation.d/bool-or-vector-compression.md b/deprecation.d/bool-or-vector-compression.md index 7c0204ee5fd71..a0b23b8de5267 100644 --- a/deprecation.d/bool-or-vector-compression.md +++ b/deprecation.d/bool-or-vector-compression.md @@ -1,7 +1,6 @@ --- what: "Boolean syntax for the `compression` field in the `vector` sink" -announcement_version: "0.57.0" -deprecation_version: "TBD" +deprecation_version: "0.57.0" --- The boolean syntax (`compression: true` / `compression: false`) is deprecated. diff --git a/deprecation.d/buffer-bytes-events-metrics.md b/deprecation.d/buffer-bytes-events-metrics.md index 55fc8d4560416..c69895006f1c5 100644 --- a/deprecation.d/buffer-bytes-events-metrics.md +++ b/deprecation.d/buffer-bytes-events-metrics.md @@ -1,7 +1,6 @@ --- what: "The `buffer_byte_size` and `buffer_events` gauge metrics" -announcement_version: "0.53.0" -deprecation_version: "TBD" +deprecation_version: "0.53.0" --- The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the diff --git a/deprecation.d/datadog-metrics-series-v1.md b/deprecation.d/datadog-metrics-series-v1.md index 104def4a8b119..aecce73f67104 100644 --- a/deprecation.d/datadog-metrics-series-v1.md +++ b/deprecation.d/datadog-metrics-series-v1.md @@ -1,7 +1,6 @@ --- what: "The `series_api_version: v1` option on the `datadog_metrics` sink" -announcement_version: "0.58.0" -deprecation_version: "TBD" +deprecation_version: "0.58.0" --- The `series_api_version: v1` option is deprecated in favor of `v2` (the default). diff --git a/deprecation.d/greptimedb-v0-support.md b/deprecation.d/greptimedb-v0-support.md index 418621b732ffb..4432a77e9a913 100644 --- a/deprecation.d/greptimedb-v0-support.md +++ b/deprecation.d/greptimedb-v0-support.md @@ -1,6 +1,5 @@ --- what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" -announcement_version: "TBD" deprecation_version: "0.56.0" --- diff --git a/deprecation.d/http-server-encoding.md b/deprecation.d/http-server-encoding.md index 17d44326c1f74..45b38f4ca184a 100644 --- a/deprecation.d/http-server-encoding.md +++ b/deprecation.d/http-server-encoding.md @@ -1,7 +1,6 @@ --- what: "The `encoding` field on HTTP server sources" -announcement_version: "0.50.0" -deprecation_version: "TBD" +deprecation_version: "0.50.0" --- The `encoding` field will be removed. Use `decoding` and `framing` instead. From d7b55a21986031413aec814390d47b39de944c0e Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 10:32:59 -0400 Subject: [PATCH 08/85] chore(internal docs): restore announcement_version to deprecation fragments --- deprecation.d/azure-monitor-logs-sink.md | 1 + deprecation.d/bool-or-vector-compression.md | 1 + deprecation.d/buffer-bytes-events-metrics.md | 1 + deprecation.d/datadog-metrics-series-v1.md | 1 + deprecation.d/greptimedb-v0-support.md | 1 + deprecation.d/http-server-encoding.md | 1 + 6 files changed, 6 insertions(+) diff --git a/deprecation.d/azure-monitor-logs-sink.md b/deprecation.d/azure-monitor-logs-sink.md index e29db2732c7f5..629a1a8bb7b4a 100644 --- a/deprecation.d/azure-monitor-logs-sink.md +++ b/deprecation.d/azure-monitor-logs-sink.md @@ -1,5 +1,6 @@ --- what: "The `azure_monitor_logs` sink" +announcement_version: "0.58.0" deprecation_version: "0.58.0" --- diff --git a/deprecation.d/bool-or-vector-compression.md b/deprecation.d/bool-or-vector-compression.md index a0b23b8de5267..1c5ee89f6b836 100644 --- a/deprecation.d/bool-or-vector-compression.md +++ b/deprecation.d/bool-or-vector-compression.md @@ -1,5 +1,6 @@ --- what: "Boolean syntax for the `compression` field in the `vector` sink" +announcement_version: "0.57.0" deprecation_version: "0.57.0" --- diff --git a/deprecation.d/buffer-bytes-events-metrics.md b/deprecation.d/buffer-bytes-events-metrics.md index c69895006f1c5..6d12725a1a43a 100644 --- a/deprecation.d/buffer-bytes-events-metrics.md +++ b/deprecation.d/buffer-bytes-events-metrics.md @@ -1,5 +1,6 @@ --- what: "The `buffer_byte_size` and `buffer_events` gauge metrics" +announcement_version: "0.53.0" deprecation_version: "0.53.0" --- diff --git a/deprecation.d/datadog-metrics-series-v1.md b/deprecation.d/datadog-metrics-series-v1.md index aecce73f67104..733076cacc3e4 100644 --- a/deprecation.d/datadog-metrics-series-v1.md +++ b/deprecation.d/datadog-metrics-series-v1.md @@ -1,5 +1,6 @@ --- what: "The `series_api_version: v1` option on the `datadog_metrics` sink" +announcement_version: "0.58.0" deprecation_version: "0.58.0" --- diff --git a/deprecation.d/greptimedb-v0-support.md b/deprecation.d/greptimedb-v0-support.md index 4432a77e9a913..c1986bae2c51c 100644 --- a/deprecation.d/greptimedb-v0-support.md +++ b/deprecation.d/greptimedb-v0-support.md @@ -1,5 +1,6 @@ --- what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" +announcement_version: "0.56.0" deprecation_version: "0.56.0" --- diff --git a/deprecation.d/http-server-encoding.md b/deprecation.d/http-server-encoding.md index 45b38f4ca184a..a68a2cd06954c 100644 --- a/deprecation.d/http-server-encoding.md +++ b/deprecation.d/http-server-encoding.md @@ -1,5 +1,6 @@ --- what: "The `encoding` field on HTTP server sources" +announcement_version: "0.50.0" deprecation_version: "0.50.0" --- From a0b1f0ff2ae17bd79063e6476d60472f15c93147 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 11:11:22 -0400 Subject: [PATCH 09/85] feat(releasing): make announcement_version required, add next version keyword, rewrite next on release --- deprecation.d/README.md | 8 +- deprecation.d/azure-monitor-logs-sink.md | 4 +- deprecation.d/bool-or-vector-compression.md | 4 +- deprecation.d/buffer-bytes-events-metrics.md | 4 +- deprecation.d/datadog-metrics-series-v1.md | 4 +- deprecation.d/greptimedb-v0-support.md | 4 +- deprecation.d/http-server-encoding.md | 4 +- vdev/src/commands/deprecation/show.rs | 5 +- vdev/src/commands/release/generate_cue.rs | 29 +++- vdev/src/utils/deprecation.rs | 137 ++++++++++++++++--- vdev/src/utils/git.rs | 5 + website/cue/reference/releases.cue | 8 +- 12 files changed, 171 insertions(+), 45 deletions(-) diff --git a/deprecation.d/README.md b/deprecation.d/README.md index 627b165662ec9..bfebf1b250339 100644 --- a/deprecation.d/README.md +++ b/deprecation.d/README.md @@ -15,8 +15,8 @@ Each file must be named `.md` and begin with YAML frontmatter: ```markdown --- -announcement_version: "0.55.0" -deprecation_version: "0.57.0" +announcement_version: 0.55.0 +deprecation_version: 0.57.0 what: "The `legacy_auth` configuration option" --- @@ -41,8 +41,8 @@ auth: | Field | Required | Description | |-------|----------|-------------| | `what` | Yes | Short one-line description of what is deprecated. | -| `deprecation_version` | Yes | Semver version when the item will be removed, or `"TBD"` if not yet decided. | -| `announcement_version` | No | Semver version when the deprecation was first announced, or `"TBD"`. Omit if not applicable. | +| `deprecation_version` | Yes | Version when the item will be removed. Accepts a semver string (`0.56`, `0.56.0`), `TBD` (unknown), or `next` (the very next release). | +| `announcement_version` | Yes | Version when the deprecation was first announced. Accepts the same values as `deprecation_version`. Set to the same value as `deprecation_version` if the announcement and removal happen in the same release. | ### Body diff --git a/deprecation.d/azure-monitor-logs-sink.md b/deprecation.d/azure-monitor-logs-sink.md index 629a1a8bb7b4a..8217c3222d75f 100644 --- a/deprecation.d/azure-monitor-logs-sink.md +++ b/deprecation.d/azure-monitor-logs-sink.md @@ -1,7 +1,7 @@ --- what: "The `azure_monitor_logs` sink" -announcement_version: "0.58.0" -deprecation_version: "0.58.0" +announcement_version: 0.58.0 +deprecation_version: 0.58.0 --- The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink, diff --git a/deprecation.d/bool-or-vector-compression.md b/deprecation.d/bool-or-vector-compression.md index 1c5ee89f6b836..0d634260c1d86 100644 --- a/deprecation.d/bool-or-vector-compression.md +++ b/deprecation.d/bool-or-vector-compression.md @@ -1,7 +1,7 @@ --- what: "Boolean syntax for the `compression` field in the `vector` sink" -announcement_version: "0.57.0" -deprecation_version: "0.57.0" +announcement_version: 0.57.0 +deprecation_version: 0.57.0 --- The boolean syntax (`compression: true` / `compression: false`) is deprecated. diff --git a/deprecation.d/buffer-bytes-events-metrics.md b/deprecation.d/buffer-bytes-events-metrics.md index 6d12725a1a43a..f010fd843801d 100644 --- a/deprecation.d/buffer-bytes-events-metrics.md +++ b/deprecation.d/buffer-bytes-events-metrics.md @@ -1,7 +1,7 @@ --- what: "The `buffer_byte_size` and `buffer_events` gauge metrics" -announcement_version: "0.53.0" -deprecation_version: "0.53.0" +announcement_version: 0.53.0 +deprecation_version: 0.53.0 --- The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the diff --git a/deprecation.d/datadog-metrics-series-v1.md b/deprecation.d/datadog-metrics-series-v1.md index 733076cacc3e4..e4e3a2cf4b4a1 100644 --- a/deprecation.d/datadog-metrics-series-v1.md +++ b/deprecation.d/datadog-metrics-series-v1.md @@ -1,7 +1,7 @@ --- what: "The `series_api_version: v1` option on the `datadog_metrics` sink" -announcement_version: "0.58.0" -deprecation_version: "0.58.0" +announcement_version: 0.58.0 +deprecation_version: 0.58.0 --- The `series_api_version: v1` option is deprecated in favor of `v2` (the default). diff --git a/deprecation.d/greptimedb-v0-support.md b/deprecation.d/greptimedb-v0-support.md index c1986bae2c51c..b5cc36aeaa93a 100644 --- a/deprecation.d/greptimedb-v0-support.md +++ b/deprecation.d/greptimedb-v0-support.md @@ -1,7 +1,7 @@ --- what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" -announcement_version: "0.56.0" -deprecation_version: "0.56.0" +announcement_version: 0.56.0 +deprecation_version: 0.56.0 --- The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. diff --git a/deprecation.d/http-server-encoding.md b/deprecation.d/http-server-encoding.md index a68a2cd06954c..a47998d59e4aa 100644 --- a/deprecation.d/http-server-encoding.md +++ b/deprecation.d/http-server-encoding.md @@ -1,7 +1,7 @@ --- what: "The `encoding` field on HTTP server sources" -announcement_version: "0.50.0" -deprecation_version: "0.50.0" +announcement_version: 0.50.0 +deprecation_version: 0.50.0 --- The `encoding` field will be removed. Use `decoding` and `framing` instead. diff --git a/vdev/src/commands/deprecation/show.rs b/vdev/src/commands/deprecation/show.rs index 8fea4352ee59b..40cb85ebe9eb3 100644 --- a/vdev/src/commands/deprecation/show.rs +++ b/vdev/src/commands/deprecation/show.rs @@ -81,11 +81,8 @@ impl Cli { fn print_entry(e: &DeprecationEntry) { println!(" [{}] {}", e.deprecation_version, e.what); - if let Some(ref ann) = e.announcement_version { - println!(" announced: {ann}"); - } + println!(" announced: {}", e.announcement_version); if !e.description.is_empty() { - // Indent description lines for readability for line in e.description.lines() { println!(" {line}"); } diff --git a/vdev/src/commands/release/generate_cue.rs b/vdev/src/commands/release/generate_cue.rs index 072a50536f80e..17b8b2c1ed408 100644 --- a/vdev/src/commands/release/generate_cue.rs +++ b/vdev/src/commands/release/generate_cue.rs @@ -102,6 +102,10 @@ pub(super) fn run(new_version: &Version) -> Result { fs::write(&cue_path, cue_text) .with_context(|| format!("Failed to write {}", cue_path.display()))?; + // In surviving (planned) fragments, replace any `next` version values with the + // concrete release version so the files stay accurate going forward. + rewrite_next_in_planned(&deprecation_dir, &planned_deprecations, &new_version)?; + // Retire enacted deprecation fragments via `git rm`. retire_deprecation_fragments(&deprecation_dir, &enacted_deprecations)?; @@ -523,6 +527,22 @@ fn retire_changelog_fragments(dir: &Path) -> Result<()> { Ok(()) } +fn rewrite_next_in_planned( + dir: &Path, + planned: &[DeprecationEntry], + release: &Version, +) -> Result<()> { + let cwd = env::current_dir()?; + for entry in planned { + let path = dir.join(&entry.filename); + if deprecation::rewrite_next_versions(&path, release)? { + let rel = path.strip_prefix(&cwd).unwrap_or(&path); + git::add(&rel.to_string_lossy())?; + } + } + Ok(()) +} + fn retire_deprecation_fragments(dir: &Path, enacted: &[DeprecationEntry]) -> Result<()> { if !dir.is_dir() || enacted.is_empty() { return Ok(()); @@ -595,9 +615,12 @@ fn render_deprecation_section(entries: &[DeprecationEntry]) -> String { json!(e.deprecation_version.to_string()) ) .unwrap(); - if let Some(ref ann) = e.announcement_version { - writeln!(s, "\t\t\tannouncement_version: {}", json!(ann.to_string())).unwrap(); - } + writeln!( + s, + "\t\t\tannouncement_version: {}", + json!(e.announcement_version.to_string()) + ) + .unwrap(); if !e.description.is_empty() { s.push_str("\t\t\tdescription: #\"\"\"\n"); for line in e.description.lines() { diff --git a/vdev/src/utils/deprecation.rs b/vdev/src/utils/deprecation.rs index 7787aa6e59d87..b45451575555e 100644 --- a/vdev/src/utils/deprecation.rs +++ b/vdev/src/utils/deprecation.rs @@ -9,11 +9,13 @@ use semver::Version; pub const DEPRECATION_DIR: &str = "deprecation.d"; -/// A version field that is either a concrete semver version or the placeholder `TBD`. +/// A version field value: a concrete semver version, `TBD` (unknown), or `next` +/// (the very next release, whatever its number turns out to be). #[derive(Debug, Clone, PartialEq)] pub enum VersionOrTbd { Version(Version), Tbd, + Next, } impl fmt::Display for VersionOrTbd { @@ -21,17 +23,22 @@ impl fmt::Display for VersionOrTbd { match self { VersionOrTbd::Version(v) => write!(f, "{v}"), VersionOrTbd::Tbd => write!(f, "TBD"), + VersionOrTbd::Next => write!(f, "next"), } } } impl VersionOrTbd { - /// Returns true when this version's major.minor matches `release`'s major.minor. - /// Patch is intentionally ignored: a deprecation labelled "0.56" (stored as 0.56.0) - /// is enacted on any 0.56.x release cut. + /// Returns true when this version should be enacted for the given release. + /// + /// `next` always matches — it means "the very next release cut". + /// Concrete versions match when major.minor equals the release's major.minor; + /// patch is ignored so that `0.56` is enacted on any `0.56.x` release. + /// `TBD` never matches. pub fn matches_release(&self, release: &Version) -> bool { match self { VersionOrTbd::Version(v) => v.major == release.major && v.minor == release.minor, + VersionOrTbd::Next => true, VersionOrTbd::Tbd => false, } } @@ -41,8 +48,10 @@ impl<'de> serde::Deserialize<'de> for VersionOrTbd { fn deserialize>(d: D) -> std::result::Result { let s = String::deserialize(d)?; let s = s.trim(); - if s == "TBD" { - return Ok(VersionOrTbd::Tbd); + match s { + "TBD" => return Ok(VersionOrTbd::Tbd), + "next" => return Ok(VersionOrTbd::Next), + _ => {} } // Accept both "0.56" (major.minor) and "0.56.0" (major.minor.patch). // Normalize the two-part form by appending ".0". @@ -63,7 +72,7 @@ use serde::Deserialize; struct Frontmatter { what: String, deprecation_version: VersionOrTbd, - announcement_version: Option, + announcement_version: VersionOrTbd, } /// A parsed and validated deprecation entry from `deprecation.d/`. @@ -72,7 +81,7 @@ pub struct DeprecationEntry { pub filename: String, pub what: String, pub deprecation_version: VersionOrTbd, - pub announcement_version: Option, + pub announcement_version: VersionOrTbd, /// Optional body text (everything after the closing `---` of the frontmatter). pub description: String, } @@ -137,6 +146,54 @@ fn parse_deprecation_fragment(path: &Path) -> Result { }) } +/// In a planned (surviving) deprecation fragment file, replace every `next` version value +/// in the frontmatter with the concrete release version (`major.minor`). +/// Returns true if the file was modified. +pub fn rewrite_next_versions(path: &Path, release: &Version) -> Result { + let content = + fs::read_to_string(path).with_context(|| format!("Failed to read {}", path.display()))?; + + let version_str = format!("{}.{}", release.major, release.minor); + + // Only rewrite within the frontmatter block (between the two `---` delimiters). + let fm_close = content[3..] // skip opening `---` + .find("\n---") + .map(|p| p + 3) // offset back into original string + .unwrap_or(content.len()); + + let (front, rest) = content.split_at(fm_close); + + let new_front: String = front + .lines() + .map(|line| { + if (line.starts_with("announcement_version:") || line.starts_with("deprecation_version:")) + && line.trim_end().ends_with("next") + { + let colon_pos = line.find(':').unwrap(); + format!("{}: {version_str}", &line[..colon_pos]) + } else { + line.to_string() + } + }) + .collect::>() + .join("\n"); + + if new_front == front { + return Ok(false); + } + + // Preserve the trailing newline that was on `front` before the split. + let rejoined = if front.ends_with('\n') { + format!("{new_front}\n{rest}") + } else { + format!("{new_front}{rest}") + }; + + fs::write(path, rejoined) + .with_context(|| format!("Failed to write {}", path.display()))?; + Ok(true) +} + /// Split the raw file contents into the frontmatter string and the body. /// The file must begin with `---`, and have a closing `---` on its own line. fn split_frontmatter<'a>(content: &'a str, path: &Path) -> Result<(&'a str, &'a str)> { @@ -182,10 +239,7 @@ mod tests { let e = &entries[0]; assert_eq!(e.what, "The foo option"); assert_eq!(e.deprecation_version, VersionOrTbd::Version(Version::new(0, 57, 0))); - assert_eq!( - e.announcement_version, - Some(VersionOrTbd::Version(Version::new(0, 55, 0))) - ); + assert_eq!(e.announcement_version, VersionOrTbd::Version(Version::new(0, 55, 0))); assert_eq!(e.description, "Detailed explanation."); } @@ -199,19 +253,18 @@ mod tests { .unwrap(); let entries = read_deprecation_fragments(tmp.path()).unwrap(); assert_eq!(entries[0].deprecation_version, VersionOrTbd::Tbd); - assert_eq!(entries[0].announcement_version, Some(VersionOrTbd::Tbd)); + assert_eq!(entries[0].announcement_version, VersionOrTbd::Tbd); } #[test] - fn parse_no_announcement_version() { + fn rejects_missing_announcement_version() { let tmp = tempdir().unwrap(); fs::write( tmp.path().join("baz.md"), "---\nwhat: Baz option\ndeprecation_version: \"0.60.0\"\n---\n", ) .unwrap(); - let entries = read_deprecation_fragments(tmp.path()).unwrap(); - assert!(entries[0].announcement_version.is_none()); + assert!(read_deprecation_fragments(tmp.path()).is_err()); } #[test] @@ -226,7 +279,7 @@ mod tests { let tmp = tempdir().unwrap(); fs::write( tmp.path().join("empty.md"), - "---\nwhat: \" \"\ndeprecation_version: \"0.60.0\"\n---\n", + "---\nwhat: \" \"\ndeprecation_version: \"0.60.0\"\nannouncement_version: \"0.60.0\"\n---\n", ) .unwrap(); assert!(read_deprecation_fragments(tmp.path()).is_err()); @@ -245,7 +298,7 @@ mod tests { let tmp = tempdir().unwrap(); fs::write( tmp.path().join("short.md"), - "---\nwhat: Short version\ndeprecation_version: \"0.56\"\n---\n", + "---\nwhat: Short version\ndeprecation_version: \"0.56\"\nannouncement_version: \"0.56\"\n---\n", ) .unwrap(); let entries = read_deprecation_fragments(tmp.path()).unwrap(); @@ -272,4 +325,52 @@ mod tests { fn tbd_never_matches_release() { assert!(!VersionOrTbd::Tbd.matches_release(&Version::new(0, 56, 0))); } + + #[test] + fn next_always_matches_release() { + assert!(VersionOrTbd::Next.matches_release(&Version::new(0, 56, 0))); + assert!(VersionOrTbd::Next.matches_release(&Version::new(1, 0, 0))); + } + + #[test] + fn parse_next() { + let tmp = tempdir().unwrap(); + fs::write( + tmp.path().join("next.md"), + "---\nwhat: Thing\ndeprecation_version: next\nannouncement_version: next\n---\n", + ) + .unwrap(); + let entries = read_deprecation_fragments(tmp.path()).unwrap(); + assert_eq!(entries[0].deprecation_version, VersionOrTbd::Next); + assert_eq!(entries[0].announcement_version, VersionOrTbd::Next); + } + + #[test] + fn rewrite_next_versions_replaces_next_in_frontmatter() { + let tmp = tempdir().unwrap(); + let path = tmp.path().join("planned.md"); + fs::write( + &path, + "---\nwhat: Thing\ndeprecation_version: next\nannouncement_version: next\n---\n\nSome body with next word.\n", + ) + .unwrap(); + let modified = rewrite_next_versions(&path, &Version::new(0, 57, 0)).unwrap(); + assert!(modified); + let updated = fs::read_to_string(&path).unwrap(); + assert!(updated.contains("deprecation_version: 0.57\n")); + assert!(updated.contains("announcement_version: 0.57\n")); + // Body must be left untouched + assert!(updated.contains("Some body with next word.")); + } + + #[test] + fn rewrite_next_versions_no_op_when_no_next() { + let tmp = tempdir().unwrap(); + let path = tmp.path().join("concrete.md"); + let original = "---\nwhat: Thing\ndeprecation_version: 0.57\nannouncement_version: 0.57\n---\n"; + fs::write(&path, original).unwrap(); + let modified = rewrite_next_versions(&path, &Version::new(0, 57, 0)).unwrap(); + assert!(!modified); + assert_eq!(fs::read_to_string(&path).unwrap(), original); + } } diff --git a/vdev/src/utils/git.rs b/vdev/src/utils/git.rs index b1b4c6faaac21..492f711b5f839 100644 --- a/vdev/src/utils/git.rs +++ b/vdev/src/utils/git.rs @@ -123,6 +123,11 @@ pub fn commit(commit_message: &str) -> Result { .check_output() } +/// Stages a specific file using `git add`. +pub fn add(path: &str) -> Result { + Command::new("git").args(["add", path]).check_output() +} + /// Removes a file from the index (and working tree) using `git rm`. pub fn rm(path: &str) -> Result { Command::new("git").args(["rm", path]).check_output() diff --git a/website/cue/reference/releases.cue b/website/cue/reference/releases.cue index 1ec7e6265a1ec..3546be0bcb363 100644 --- a/website/cue/reference/releases.cue +++ b/website/cue/reference/releases.cue @@ -29,10 +29,10 @@ releases: { } #DeprecationEntry: { - what: string - deprecation_version: string - announcement_version?: string - description?: string + what: string + deprecation_version: string + announcement_version: string + description?: string } #Release: { From 37eba350d6ba591419c1e30a90099db0afbf0e73 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 11:15:48 -0400 Subject: [PATCH 10/85] chore(internal docs): update deprecation docs and release template for new fragment fields --- .github/ISSUE_TEMPLATE/minor-release.md | 2 +- deprecation.d/README.md | 4 ++-- deprecation.d/greptimedb-v0-support.md | 4 ++-- docs/DEPRECATION.md | 7 +++++-- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/minor-release.md b/.github/ISSUE_TEMPLATE/minor-release.md index 1c1172b1552ba..ae02d1ab4a8fb 100644 --- a/.github/ISSUE_TEMPLATE/minor-release.md +++ b/.github/ISSUE_TEMPLATE/minor-release.md @@ -65,7 +65,7 @@ Automated steps include: - [ ] Ensure any deprecations are highlighted in the release upgrade guide. - [ ] Review generated changelog entries to ensure they are understandable to end-users. - [ ] Ensure the date matches the scheduled release date. - - [ ] Add a link to pending deprecation items from [DEPRECATIONS.md](https://github.com/vectordotdev/vector/blob/master/docs/DEPRECATIONS.md). + - [ ] Run `cargo vdev deprecation show --version "${NEW_VECTOR_VERSION}"` to review enacted deprecations and verify the release notes reflect them correctly. - [ ] PR review & approval. # On the day of release diff --git a/deprecation.d/README.md b/deprecation.d/README.md index bfebf1b250339..e622ab2f46e79 100644 --- a/deprecation.d/README.md +++ b/deprecation.d/README.md @@ -15,7 +15,7 @@ Each file must be named `.md` and begin with YAML frontmatter: ```markdown --- -announcement_version: 0.55.0 +announcement_version: next deprecation_version: 0.57.0 what: "The `legacy_auth` configuration option" --- @@ -42,7 +42,7 @@ auth: |-------|----------|-------------| | `what` | Yes | Short one-line description of what is deprecated. | | `deprecation_version` | Yes | Version when the item will be removed. Accepts a semver string (`0.56`, `0.56.0`), `TBD` (unknown), or `next` (the very next release). | -| `announcement_version` | Yes | Version when the deprecation was first announced. Accepts the same values as `deprecation_version`. Set to the same value as `deprecation_version` if the announcement and removal happen in the same release. | +| `announcement_version` | Yes | Version when the deprecation was first announced. Accepts the same values as `deprecation_version`. Use `next` (recommended) when opening the PR — the release tooling will replace it with the concrete version automatically. | ### Body diff --git a/deprecation.d/greptimedb-v0-support.md b/deprecation.d/greptimedb-v0-support.md index b5cc36aeaa93a..e10a6eb89e8fc 100644 --- a/deprecation.d/greptimedb-v0-support.md +++ b/deprecation.d/greptimedb-v0-support.md @@ -1,7 +1,7 @@ --- what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" -announcement_version: 0.56.0 -deprecation_version: 0.56.0 +announcement_version: next +deprecation_version: next --- The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. diff --git a/docs/DEPRECATION.md b/docs/DEPRECATION.md index 9b403146ac44c..1a5952540acf4 100644 --- a/docs/DEPRECATION.md +++ b/docs/DEPRECATION.md @@ -81,8 +81,11 @@ When introducing a deprecation into Vector, the pull request introducing the dep - Add a log message to Vector that is logged at the `WARN` level starting with the word `DEPRECATION` if Vector detects the deprecated configuration or feature being used (when possible). - Add a deprecation notice file to [`deprecation.d/`](../deprecation.d/) following the format described in - [`deprecation.d/README.md`](../deprecation.d/README.md). Set `announcement_version` to the current release and - `deprecation_version` to the planned removal version (or `"TBD"` if not yet decided). Run + [`deprecation.d/README.md`](../deprecation.d/README.md). Both `announcement_version` and `deprecation_version` + are required. Set `announcement_version` to `next` (recommended) or the current release version if known. Set + `deprecation_version` to the planned removal version, `TBD` if not yet decided, or `next` if removal is intended + for the very next release. The release tooling will replace any `next` values with the concrete version when the + release is cut. Run `cargo vdev check deprecations` to validate the file. When removing a deprecation in a subsequent release, the pull request should: From 9659a52582a8cc94e110f9dc2dce45c82dc3d100 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 11:16:57 -0400 Subject: [PATCH 11/85] feat(releasing): sort deprecation show output by version --- vdev/src/commands/deprecation/show.rs | 1 + vdev/src/utils/deprecation.rs | 22 +++++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/vdev/src/commands/deprecation/show.rs b/vdev/src/commands/deprecation/show.rs index 40cb85ebe9eb3..77863266ebb08 100644 --- a/vdev/src/commands/deprecation/show.rs +++ b/vdev/src/commands/deprecation/show.rs @@ -28,6 +28,7 @@ impl Cli { } let mut entries = deprecation::read_deprecation_fragments(&dir)?; + entries.sort_by(|a, b| a.deprecation_version.cmp(&b.deprecation_version)); if entries.is_empty() { println!("No deprecation notices found."); diff --git a/vdev/src/utils/deprecation.rs b/vdev/src/utils/deprecation.rs index b45451575555e..9fa6c9785f2d3 100644 --- a/vdev/src/utils/deprecation.rs +++ b/vdev/src/utils/deprecation.rs @@ -11,13 +11,33 @@ pub const DEPRECATION_DIR: &str = "deprecation.d"; /// A version field value: a concrete semver version, `TBD` (unknown), or `next` /// (the very next release, whatever its number turns out to be). -#[derive(Debug, Clone, PartialEq)] +#[derive(Debug, Clone, PartialEq, Eq)] pub enum VersionOrTbd { Version(Version), Tbd, Next, } +impl PartialOrd for VersionOrTbd { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for VersionOrTbd { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + match (self, other) { + (Self::Version(a), Self::Version(b)) => a.cmp(b), + (Self::Version(_), _) => std::cmp::Ordering::Less, + (Self::Next, Self::Version(_)) => std::cmp::Ordering::Greater, + (Self::Next, Self::Next) => std::cmp::Ordering::Equal, + (Self::Next, Self::Tbd) => std::cmp::Ordering::Less, + (Self::Tbd, Self::Tbd) => std::cmp::Ordering::Equal, + (Self::Tbd, _) => std::cmp::Ordering::Greater, + } + } +} + impl fmt::Display for VersionOrTbd { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { From 5ae8acdb5b2bd93d3d0504d6fbe01d9d99303bea Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 11:36:31 -0400 Subject: [PATCH 12/85] chore(internal docs): fix announcement versions for azure_monitor_logs and datadog_metrics series v1 --- deprecation.d/azure-monitor-logs-sink.md | 2 +- deprecation.d/datadog-metrics-series-v1.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deprecation.d/azure-monitor-logs-sink.md b/deprecation.d/azure-monitor-logs-sink.md index 8217c3222d75f..3c9a00a18e3e9 100644 --- a/deprecation.d/azure-monitor-logs-sink.md +++ b/deprecation.d/azure-monitor-logs-sink.md @@ -1,6 +1,6 @@ --- what: "The `azure_monitor_logs` sink" -announcement_version: 0.58.0 +announcement_version: 0.54.0 deprecation_version: 0.58.0 --- diff --git a/deprecation.d/datadog-metrics-series-v1.md b/deprecation.d/datadog-metrics-series-v1.md index e4e3a2cf4b4a1..18a521153980d 100644 --- a/deprecation.d/datadog-metrics-series-v1.md +++ b/deprecation.d/datadog-metrics-series-v1.md @@ -1,6 +1,6 @@ --- what: "The `series_api_version: v1` option on the `datadog_metrics` sink" -announcement_version: 0.58.0 +announcement_version: 0.55.0 deprecation_version: 0.58.0 --- From 0b535c6ec1ae2881bed5d9c9ce8cf69eedc18a9e Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 11:41:49 -0400 Subject: [PATCH 13/85] feat(releasing): refine deprecation show output with grouped sections and next-release detection --- vdev/src/commands/deprecation/show.rs | 101 +++++++++++++++++--------- vdev/src/utils/git.rs | 18 +++++ 2 files changed, 86 insertions(+), 33 deletions(-) diff --git a/vdev/src/commands/deprecation/show.rs b/vdev/src/commands/deprecation/show.rs index 77863266ebb08..13ee9c6a3e6f7 100644 --- a/vdev/src/commands/deprecation/show.rs +++ b/vdev/src/commands/deprecation/show.rs @@ -4,8 +4,8 @@ use anyhow::Result; use semver::Version; use crate::utils::{ - deprecation::{self, DeprecationEntry}, - paths, + deprecation::{self, DeprecationEntry, VersionOrTbd}, + git, paths, }; /// Show upcoming and in-progress deprecation notices @@ -28,64 +28,99 @@ impl Cli { } let mut entries = deprecation::read_deprecation_fragments(&dir)?; - entries.sort_by(|a, b| a.deprecation_version.cmp(&b.deprecation_version)); if entries.is_empty() { println!("No deprecation notices found."); return Ok(()); } + entries.sort_by(|a, b| a.deprecation_version.cmp(&b.deprecation_version)); + + // When --version is given, show only entries enacted in that release. if let Some(ref version) = self.version { entries.retain(|e| e.deprecation_version.matches_release(version)); if entries.is_empty() { println!("No deprecations enacted in v{version}."); return Ok(()); } + println!("Deprecations enacted in {version}:"); + println!(); + for e in &entries { + print_entry(e); + } + return Ok(()); } - // Split into enacted (major.minor matches filter) vs planned - let (enacted, planned): (Vec<_>, Vec<_>) = match &self.version { - Some(v) => { - let enacted: Vec<_> = entries - .iter() - .filter(|e| e.deprecation_version.matches_release(v)) - .collect(); - let planned: Vec<_> = entries - .iter() - .filter(|e| !e.deprecation_version.matches_release(v)) - .collect(); - (enacted, planned) - } - None => (vec![], entries.iter().collect()), + // Determine the next minor release version (best-effort). + let next_minor: Option = git::latest_release_version() + .ok() + .map(|v| Version::new(v.major, v.minor + 1, 0)); + + // Group entries into three buckets: + // 1. Enacted in next release — deprecation_version is `next` or matches the next minor + // 2. Announced in next release — announcement_version is `next` or matches next minor, + // but NOT in bucket 1 + // 3. Pre-existing — everything else + let is_next_release = |v: &VersionOrTbd| match next_minor.as_ref() { + Some(nv) => v.matches_release(nv), + None => matches!(v, VersionOrTbd::Next), }; - if !enacted.is_empty() { - println!("Deprecations (enacted in this release):"); - for e in &enacted { - print_entry(e); - } - } + let mut enacted: Vec<&DeprecationEntry> = Vec::new(); + let mut announcing: Vec<&DeprecationEntry> = Vec::new(); + let mut preexisting: Vec<&DeprecationEntry> = Vec::new(); - if !planned.is_empty() { - if !enacted.is_empty() { - println!(); - } - println!("Planned deprecations:"); - for e in &planned { - print_entry(e); + for e in &entries { + if is_next_release(&e.deprecation_version) { + enacted.push(e); + } else if is_next_release(&e.announcement_version) { + announcing.push(e); + } else { + preexisting.push(e); } } + let next_label = match &next_minor { + Some(v) => format!("{}.{}", v.major, v.minor), + None => "next".to_string(), + }; + + print_section( + &format!("Enacted in next release ({next_label})"), + &enacted, + ); + print_section( + &format!("Announced in next release ({next_label})"), + &announcing, + ); + print_section("Pre-existing deprecations", &preexisting); + Ok(()) } } +fn print_section(title: &str, entries: &[&DeprecationEntry]) { + println!("{title}:"); + println!(); + if entries.is_empty() { + println!("(none)"); + } else { + for e in entries { + print_entry(e); + } + } + println!(); +} + fn print_entry(e: &DeprecationEntry) { - println!(" [{}] {}", e.deprecation_version, e.what); - println!(" announced: {}", e.announcement_version); + println!("{}", e.what); + println!(" announced: {}", e.announcement_version); + println!(" deprecated: {}", e.deprecation_version); if !e.description.is_empty() { + println!(); for line in e.description.lines() { - println!(" {line}"); + println!(" {line}"); } } + println!(); } diff --git a/vdev/src/utils/git.rs b/vdev/src/utils/git.rs index 492f711b5f839..8c56e9c77fb4d 100644 --- a/vdev/src/utils/git.rs +++ b/vdev/src/utils/git.rs @@ -123,6 +123,24 @@ pub fn commit(commit_message: &str) -> Result { .check_output() } +/// Returns the latest semver release tag (e.g. `0.55.0`), ignoring `vdev-v…` tags. +pub fn latest_release_version() -> Result { + let output = Command::new("git") + .args(["tag", "--list", "--sort=-v:refname"]) + .check_output()?; + let re = regex::Regex::new(r"^v[0-9]+\.[0-9]+\.[0-9]+$").unwrap(); + for tag in output.lines() { + if tag.starts_with("vdev-v") { + continue; + } + if re.is_match(tag) { + return semver::Version::parse(tag.trim_start_matches('v')) + .context("Failed to parse version from tag"); + } + } + anyhow::bail!("No valid semantic version tag found") +} + /// Stages a specific file using `git add`. pub fn add(path: &str) -> Result { Command::new("git").args(["add", path]).check_output() From d1eff3ad6d4854ffb53f968204277bc00e5c6d98 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 11:43:14 -0400 Subject: [PATCH 14/85] feat(releasing): add color and styling to deprecation show output --- vdev/src/commands/deprecation/show.rs | 60 ++++++++++++++++++++------- 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/vdev/src/commands/deprecation/show.rs b/vdev/src/commands/deprecation/show.rs index 13ee9c6a3e6f7..6747a6957975b 100644 --- a/vdev/src/commands/deprecation/show.rs +++ b/vdev/src/commands/deprecation/show.rs @@ -1,6 +1,7 @@ #![allow(clippy::print_stdout)] use anyhow::Result; +use owo_colors::{OwoColorize, Stream::Stdout, Style}; use semver::Version; use crate::utils::{ @@ -43,8 +44,7 @@ impl Cli { println!("No deprecations enacted in v{version}."); return Ok(()); } - println!("Deprecations enacted in {version}:"); - println!(); + print_section_header(&format!("Deprecations enacted in {version}")); for e in &entries { print_entry(e); } @@ -56,11 +56,6 @@ impl Cli { .ok() .map(|v| Version::new(v.major, v.minor + 1, 0)); - // Group entries into three buckets: - // 1. Enacted in next release — deprecation_version is `next` or matches the next minor - // 2. Announced in next release — announcement_version is `next` or matches next minor, - // but NOT in bucket 1 - // 3. Pre-existing — everything else let is_next_release = |v: &VersionOrTbd| match next_minor.as_ref() { Some(nv) => v.matches_release(nv), None => matches!(v, VersionOrTbd::Next), @@ -99,11 +94,19 @@ impl Cli { } } -fn print_section(title: &str, entries: &[&DeprecationEntry]) { - println!("{title}:"); +fn print_section_header(title: &str) { + let style = Style::new().bold().underline(); + println!("{}", title.if_supports_color(Stdout, |t| t.style(style))); println!(); +} + +fn print_section(title: &str, entries: &[&DeprecationEntry]) { + print_section_header(title); if entries.is_empty() { - println!("(none)"); + println!( + "{}", + "(none)".if_supports_color(Stdout, |t| t.dimmed()) + ); } else { for e in entries { print_entry(e); @@ -113,14 +116,43 @@ fn print_section(title: &str, entries: &[&DeprecationEntry]) { } fn print_entry(e: &DeprecationEntry) { - println!("{}", e.what); - println!(" announced: {}", e.announcement_version); - println!(" deprecated: {}", e.deprecation_version); + println!("{}", e.what.if_supports_color(Stdout, |t| t.bold())); + println!( + " {} {}", + "announced: ".if_supports_color(Stdout, |t| t.dimmed()), + format_version(&e.announcement_version), + ); + println!( + " {} {}", + "deprecated:".if_supports_color(Stdout, |t| t.dimmed()), + format_version(&e.deprecation_version), + ); if !e.description.is_empty() { println!(); for line in e.description.lines() { - println!(" {line}"); + println!( + " {}", + line.if_supports_color(Stdout, |t| t.italic()) + ); } } println!(); } + +fn format_version(v: &VersionOrTbd) -> String { + match v { + VersionOrTbd::Next => { + let style = Style::new().bright_red().bold(); + "next" + .if_supports_color(Stdout, |t| t.style(style)) + .to_string() + } + VersionOrTbd::Tbd => "TBD" + .if_supports_color(Stdout, |t| t.bright_yellow()) + .to_string(), + VersionOrTbd::Version(ver) => ver + .to_string() + .if_supports_color(Stdout, |t| t.bright_cyan()) + .to_string(), + } +} From a2928a79209be19854cfb1d9e63fb8137536768d Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 11:44:08 -0400 Subject: [PATCH 15/85] fix(releasing): fix label alignment in deprecation show output --- vdev/src/commands/deprecation/show.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vdev/src/commands/deprecation/show.rs b/vdev/src/commands/deprecation/show.rs index 6747a6957975b..1b13235d96e13 100644 --- a/vdev/src/commands/deprecation/show.rs +++ b/vdev/src/commands/deprecation/show.rs @@ -118,7 +118,7 @@ fn print_section(title: &str, entries: &[&DeprecationEntry]) { fn print_entry(e: &DeprecationEntry) { println!("{}", e.what.if_supports_color(Stdout, |t| t.bold())); println!( - " {} {}", + " {} {}", "announced: ".if_supports_color(Stdout, |t| t.dimmed()), format_version(&e.announcement_version), ); From b575eb9dbd10001627f27914154cf96802ac924d Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 11:45:00 -0400 Subject: [PATCH 16/85] feat(releasing): colour concrete next-minor version red same as next keyword --- vdev/src/commands/deprecation/show.rs | 56 ++++++++++++--------------- 1 file changed, 25 insertions(+), 31 deletions(-) diff --git a/vdev/src/commands/deprecation/show.rs b/vdev/src/commands/deprecation/show.rs index 1b13235d96e13..2b77323dd13b9 100644 --- a/vdev/src/commands/deprecation/show.rs +++ b/vdev/src/commands/deprecation/show.rs @@ -46,7 +46,7 @@ impl Cli { } print_section_header(&format!("Deprecations enacted in {version}")); for e in &entries { - print_entry(e); + print_entry(e, None); } return Ok(()); } @@ -80,15 +80,10 @@ impl Cli { None => "next".to_string(), }; - print_section( - &format!("Enacted in next release ({next_label})"), - &enacted, - ); - print_section( - &format!("Announced in next release ({next_label})"), - &announcing, - ); - print_section("Pre-existing deprecations", &preexisting); + let nm = next_minor.as_ref(); + print_section(&format!("Enacted in next release ({next_label})"), &enacted, nm); + print_section(&format!("Announced in next release ({next_label})"), &announcing, nm); + print_section("Pre-existing deprecations", &preexisting, nm); Ok(()) } @@ -100,57 +95,56 @@ fn print_section_header(title: &str) { println!(); } -fn print_section(title: &str, entries: &[&DeprecationEntry]) { +fn print_section(title: &str, entries: &[&DeprecationEntry], next_minor: Option<&Version>) { print_section_header(title); if entries.is_empty() { - println!( - "{}", - "(none)".if_supports_color(Stdout, |t| t.dimmed()) - ); + println!("{}", "(none)".if_supports_color(Stdout, |t| t.dimmed())); } else { for e in entries { - print_entry(e); + print_entry(e, next_minor); } } println!(); } -fn print_entry(e: &DeprecationEntry) { +fn print_entry(e: &DeprecationEntry, next_minor: Option<&Version>) { println!("{}", e.what.if_supports_color(Stdout, |t| t.bold())); println!( " {} {}", "announced: ".if_supports_color(Stdout, |t| t.dimmed()), - format_version(&e.announcement_version), + format_version(&e.announcement_version, next_minor), ); println!( " {} {}", "deprecated:".if_supports_color(Stdout, |t| t.dimmed()), - format_version(&e.deprecation_version), + format_version(&e.deprecation_version, next_minor), ); if !e.description.is_empty() { println!(); for line in e.description.lines() { - println!( - " {}", - line.if_supports_color(Stdout, |t| t.italic()) - ); + println!(" {}", line.if_supports_color(Stdout, |t| t.italic())); } } println!(); } -fn format_version(v: &VersionOrTbd) -> String { +fn format_version(v: &VersionOrTbd, next_minor: Option<&Version>) -> String { + let is_next = matches!(v, VersionOrTbd::Next) + || matches!((v, next_minor), (VersionOrTbd::Version(_), Some(nv)) if v.matches_release(nv)); + + if is_next { + let style = Style::new().bright_red().bold(); + return v + .to_string() + .if_supports_color(Stdout, |t| t.style(style)) + .to_string(); + } + match v { - VersionOrTbd::Next => { - let style = Style::new().bright_red().bold(); - "next" - .if_supports_color(Stdout, |t| t.style(style)) - .to_string() - } VersionOrTbd::Tbd => "TBD" .if_supports_color(Stdout, |t| t.bright_yellow()) .to_string(), - VersionOrTbd::Version(ver) => ver + _ => v .to_string() .if_supports_color(Stdout, |t| t.bright_cyan()) .to_string(), From 0c6d24703d0e7e8602520ba9e9ed15ef85aab6f9 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 11:46:49 -0400 Subject: [PATCH 17/85] chore(internal docs): correct deprecation versions in fragments --- deprecation.d/bool-or-vector-compression.md | 4 ++-- deprecation.d/buffer-bytes-events-metrics.md | 2 +- deprecation.d/greptimedb-v0-support.md | 4 ++-- deprecation.d/http-server-encoding.md | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/deprecation.d/bool-or-vector-compression.md b/deprecation.d/bool-or-vector-compression.md index 0d634260c1d86..17e2acf345881 100644 --- a/deprecation.d/bool-or-vector-compression.md +++ b/deprecation.d/bool-or-vector-compression.md @@ -1,7 +1,7 @@ --- what: "Boolean syntax for the `compression` field in the `vector` sink" -announcement_version: 0.57.0 -deprecation_version: 0.57.0 +announcement_version: next +deprecation_version: next --- The boolean syntax (`compression: true` / `compression: false`) is deprecated. diff --git a/deprecation.d/buffer-bytes-events-metrics.md b/deprecation.d/buffer-bytes-events-metrics.md index f010fd843801d..c07cadcdac480 100644 --- a/deprecation.d/buffer-bytes-events-metrics.md +++ b/deprecation.d/buffer-bytes-events-metrics.md @@ -1,7 +1,7 @@ --- what: "The `buffer_byte_size` and `buffer_events` gauge metrics" announcement_version: 0.53.0 -deprecation_version: 0.53.0 +deprecation_version: TBD --- The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the diff --git a/deprecation.d/greptimedb-v0-support.md b/deprecation.d/greptimedb-v0-support.md index e10a6eb89e8fc..2d9a4bfde1136 100644 --- a/deprecation.d/greptimedb-v0-support.md +++ b/deprecation.d/greptimedb-v0-support.md @@ -1,7 +1,7 @@ --- what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" -announcement_version: next -deprecation_version: next +announcement_version: 0.55.0 +deprecation_version: 0.56.0 --- The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. diff --git a/deprecation.d/http-server-encoding.md b/deprecation.d/http-server-encoding.md index a47998d59e4aa..7bfde31311c80 100644 --- a/deprecation.d/http-server-encoding.md +++ b/deprecation.d/http-server-encoding.md @@ -1,7 +1,7 @@ --- what: "The `encoding` field on HTTP server sources" announcement_version: 0.50.0 -deprecation_version: 0.50.0 +deprecation_version: TBD --- The `encoding` field will be removed. Use `decoding` and `framing` instead. From 986bc3222b4ba0337b66084e34a587976e9bed70 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 11:48:40 -0400 Subject: [PATCH 18/85] feat(releasing): expose generate-cue as standalone release subcommand --- vdev/src/commands/release/generate_cue.rs | 61 +++++++++++++++++++++++ vdev/src/commands/release/mod.rs | 1 + 2 files changed, 62 insertions(+) diff --git a/vdev/src/commands/release/generate_cue.rs b/vdev/src/commands/release/generate_cue.rs index 17b8b2c1ed408..ac13f07bef638 100644 --- a/vdev/src/commands/release/generate_cue.rs +++ b/vdev/src/commands/release/generate_cue.rs @@ -34,6 +34,22 @@ const ALLOWED_TYPES: &[&str] = &[ "revert", ]; +/// Generate the release CUE file for a given version without switching branches. +#[derive(clap::Args, Debug)] +#[command()] +pub(super) struct Cli { + /// The new Vector version to generate the CUE file for. + #[arg(long)] + version: Version, +} + +impl Cli { + pub(super) fn exec(self) -> Result<()> { + run(&self.version)?; + Ok(()) + } +} + /// Generate the release CUE file for the given new version. Returns the path that was written. pub(super) fn run(new_version: &Version) -> Result { let repo_root = paths::find_repo_root()?; @@ -390,6 +406,25 @@ struct ConventionalParts { impl ConventionalParts { fn parse(message: &str) -> Self { + // Git revert commits have the form `Revert ""` and are + // not conventional commits. Treat them as type="revert" so they pass + // validation without requiring a scope. + if let Some(inner) = message.strip_prefix("Revert \"") { + let description = inner.trim_end_matches('"').to_string(); + let pr_number = Regex::new(r"\(#([0-9]+)\)$") + .unwrap() + .captures(&description) + .and_then(|c| c.get(1)) + .and_then(|m| m.as_str().parse::().ok()); + return ConventionalParts { + r#type: Some("revert".to_string()), + scopes: vec![], + breaking_change: false, + description, + pr_number, + }; + } + let re = Regex::new( r"^(?P[a-z]*)(\((?P[a-zA-Z0-9_, ]*)\))?(?P!)?: (?P.*?)( \(#(?P[0-9]+)\))?$", ) @@ -714,6 +749,32 @@ mod tests { assert_eq!(p.description, "Merge branch 'foo'"); } + #[test] + fn parse_revert_commit() { + let p = ConventionalParts::parse( + "Revert \"chore(ci): wire deprecation check into changelog.yaml (#42)\"", + ); + assert_eq!(p.r#type.as_deref(), Some("revert")); + assert!(p.scopes.is_empty()); + assert!(!p.breaking_change); + assert_eq!(p.pr_number, Some(42)); + // Must pass validation (revert doesn't require a scope) + let c = super::Commit { + sha: "abc".into(), + author: "a".into(), + date: "d".into(), + description: p.description.clone(), + r#type: p.r#type, + scopes: p.scopes, + breaking_change: p.breaking_change, + pr_number: p.pr_number, + files_count: 0, + insertions_count: 0, + deletions_count: 0, + }; + assert!(c.validate().is_ok()); + } + #[test] fn bump_type_patch_minor_major() { let last = Version::new(1, 2, 3); diff --git a/vdev/src/commands/release/mod.rs b/vdev/src/commands/release/mod.rs index 95b45ff4a041b..c17c2ca29c99f 100644 --- a/vdev/src/commands/release/mod.rs +++ b/vdev/src/commands/release/mod.rs @@ -8,6 +8,7 @@ crate::cli_subcommands! { "Manage the release process..." channel, docker, + generate_cue, github, homebrew, prepare, From 4ccc8cf603448f0e2590499a2169a4492aba8abc Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 12:30:34 -0400 Subject: [PATCH 19/85] feat(external docs): render deprecations and planned_deprecations on release pages --- website/layouts/releases/single.html | 52 ++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/website/layouts/releases/single.html b/website/layouts/releases/single.html index c1708ea955a9c..bf4280dbc93d7 100644 --- a/website/layouts/releases/single.html +++ b/website/layouts/releases/single.html @@ -54,6 +54,32 @@ {{ end }} + {{ if gt (len $release.deprecations) 0 }} +
+
+ {{ partial "heading.html" (dict "text" "Deprecations" "level" 2) }} +
+ +
+ {{ range $release.deprecations }} +
+ + {{ .what | markdownify }} + +
+ Announced in {{ .announcement_version }} · Removed in {{ .deprecation_version }} +
+ {{ with .description }} +
+ {{ . | markdownify }} +
+ {{ end }} +
+ {{ end }} +
+
+ {{ end }} +
@@ -213,6 +239,32 @@
{{ end }} + + {{ if gt (len $release.planned_deprecations) 0 }} +
+
+ {{ partial "heading.html" (dict "text" "Planned Deprecations" "level" 2) }} +
+ +
+ {{ range $release.planned_deprecations }} +
+ + {{ .what | markdownify }} + +
+ Announced in {{ .announcement_version }} · Planned removal in {{ .deprecation_version }} +
+ {{ with .description }} +
+ {{ . | markdownify }} +
+ {{ end }} +
+ {{ end }} +
+
+ {{ end }}
From 0723a0dac1cc9bd5d9992dea29f54cc6616c8ca6 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 12:45:59 -0400 Subject: [PATCH 20/85] feat(releasing): split deprecations into three buckets: enacted, announcing, planned --- vdev/src/commands/deprecation/show.rs | 28 ++++++++--------------- vdev/src/commands/release/generate_cue.rs | 23 ++++++++++++------- vdev/src/utils/deprecation.rs | 27 ++++++++++++++++++++++ website/cue/reference/releases.cue | 1 + website/layouts/releases/single.html | 26 +++++++++++++++++++++ 5 files changed, 79 insertions(+), 26 deletions(-) diff --git a/vdev/src/commands/deprecation/show.rs b/vdev/src/commands/deprecation/show.rs index 2b77323dd13b9..ff952841b8125 100644 --- a/vdev/src/commands/deprecation/show.rs +++ b/vdev/src/commands/deprecation/show.rs @@ -56,24 +56,16 @@ impl Cli { .ok() .map(|v| Version::new(v.major, v.minor + 1, 0)); - let is_next_release = |v: &VersionOrTbd| match next_minor.as_ref() { - Some(nv) => v.matches_release(nv), - None => matches!(v, VersionOrTbd::Next), - }; - - let mut enacted: Vec<&DeprecationEntry> = Vec::new(); - let mut announcing: Vec<&DeprecationEntry> = Vec::new(); - let mut preexisting: Vec<&DeprecationEntry> = Vec::new(); - - for e in &entries { - if is_next_release(&e.deprecation_version) { - enacted.push(e); - } else if is_next_release(&e.announcement_version) { - announcing.push(e); - } else { - preexisting.push(e); - } - } + // Use the computed next minor as the "release" for partitioning. + // If the next minor can't be determined, fall back to a sentinel version + // that only `next` keywords will match (major=0, minor=0 never matches real versions). + let partition_version = next_minor + .clone() + .unwrap_or_else(|| Version::new(0, 0, 0)); + let p = deprecation::partition_by_release(entries, &partition_version); + let enacted: Vec<&DeprecationEntry> = p.enacted.iter().collect(); + let announcing: Vec<&DeprecationEntry> = p.announcing.iter().collect(); + let preexisting: Vec<&DeprecationEntry> = p.planned.iter().collect(); let next_label = match &next_minor { Some(v) => format!("{}.{}", v.major, v.minor), diff --git a/vdev/src/commands/release/generate_cue.rs b/vdev/src/commands/release/generate_cue.rs index ac13f07bef638..f8182ebf463a0 100644 --- a/vdev/src/commands/release/generate_cue.rs +++ b/vdev/src/commands/release/generate_cue.rs @@ -102,24 +102,25 @@ pub(super) fn run(new_version: &Version) -> Result { let deprecation_dir = repo_root.join(deprecation::DEPRECATION_DIR); let all_deprecations = deprecation::read_deprecation_fragments(&deprecation_dir)?; - // Partition deprecation entries: enacted (major.minor matches this release) vs planned. - // Patch is ignored: a deprecation labelled "0.56" is enacted on any 0.56.x release. - let (enacted_deprecations, planned_deprecations): (Vec<_>, Vec<_>) = all_deprecations - .into_iter() - .partition(|e| e.deprecation_version.matches_release(&new_version)); + let deprecation::DeprecationPartition { + enacted: enacted_deprecations, + announcing: announcing_deprecations, + planned: planned_deprecations, + } = deprecation::partition_by_release(all_deprecations, &new_version); let cue_text = render_release_cue( &new_version, &changelog_entries, &commits, &enacted_deprecations, + &announcing_deprecations, &planned_deprecations, ); fs::write(&cue_path, cue_text) .with_context(|| format!("Failed to write {}", cue_path.display()))?; - // In surviving (planned) fragments, replace any `next` version values with the - // concrete release version so the files stay accurate going forward. + // In surviving fragments, replace any `next` version values with the concrete release version. + rewrite_next_in_planned(&deprecation_dir, &announcing_deprecations, &new_version)?; rewrite_next_in_planned(&deprecation_dir, &planned_deprecations, &new_version)?; // Retire enacted deprecation fragments via `git rm`. @@ -598,6 +599,7 @@ fn render_release_cue( changelog: &[ChangelogEntry], commits: &[Commit], enacted_deprecations: &[DeprecationEntry], + announcing_deprecations: &[DeprecationEntry], planned_deprecations: &[DeprecationEntry], ) -> String { let date = Utc::now().format("%Y-%m-%d").to_string(); @@ -609,6 +611,7 @@ fn render_release_cue( .join(",\n "); let deprecations_block = render_deprecation_section(enacted_deprecations); + let deprecation_announcements_block = render_deprecation_section(announcing_deprecations); let planned_deprecations_block = render_deprecation_section(planned_deprecations); format!( @@ -624,6 +627,10 @@ fn render_release_cue( {deprecations_block}\n\ \t]\n\ \n\ + \tdeprecation_announcements: [\n\ + {deprecation_announcements_block}\n\ + \t]\n\ + \n\ \tplanned_deprecations: [\n\ {planned_deprecations_block}\n\ \t]\n\ @@ -864,7 +871,7 @@ mod tests { deletions_count: 3, }]; - let out = render_release_cue(&Version::new(0, 99, 0), &entries, &commits, &[], &[]); + let out = render_release_cue(&Version::new(0, 99, 0), &entries, &commits, &[], &[], &[]); assert!(out.starts_with("package metadata\n")); assert!(out.contains("releases: \"0.99.0\":")); diff --git a/vdev/src/utils/deprecation.rs b/vdev/src/utils/deprecation.rs index 9fa6c9785f2d3..af40e098996e0 100644 --- a/vdev/src/utils/deprecation.rs +++ b/vdev/src/utils/deprecation.rs @@ -106,6 +106,33 @@ pub struct DeprecationEntry { pub description: String, } +/// The result of partitioning deprecation entries relative to a specific release. +pub struct DeprecationPartition { + /// Entries whose `deprecation_version` matches the release (being removed now). + pub enacted: Vec, + /// Entries whose `announcement_version` matches the release but are not enacted. + pub announcing: Vec, + /// Everything else — previously announced, future removal. + pub planned: Vec, +} + +/// Partition a list of deprecation entries into three buckets relative to `release`. +pub fn partition_by_release(entries: Vec, release: &Version) -> DeprecationPartition { + let mut enacted = Vec::new(); + let mut announcing = Vec::new(); + let mut planned = Vec::new(); + for e in entries { + if e.deprecation_version.matches_release(release) { + enacted.push(e); + } else if e.announcement_version.matches_release(release) { + announcing.push(e); + } else { + planned.push(e); + } + } + DeprecationPartition { enacted, announcing, planned } +} + /// Read and parse all deprecation fragments from the given directory. /// Returns entries sorted by filename. pub fn read_deprecation_fragments(dir: &Path) -> Result> { diff --git a/website/cue/reference/releases.cue b/website/cue/reference/releases.cue index 3546be0bcb363..7f31a3b852b7b 100644 --- a/website/cue/reference/releases.cue +++ b/website/cue/reference/releases.cue @@ -47,6 +47,7 @@ releases: { vrl_changelog?: string whats_next: #Any | *[] deprecations: [#DeprecationEntry, ...#DeprecationEntry] | *[] + deprecation_announcements: [#DeprecationEntry, ...#DeprecationEntry] | *[] planned_deprecations: [#DeprecationEntry, ...#DeprecationEntry] | *[] } diff --git a/website/layouts/releases/single.html b/website/layouts/releases/single.html index bf4280dbc93d7..6a04bc4bb5f06 100644 --- a/website/layouts/releases/single.html +++ b/website/layouts/releases/single.html @@ -80,6 +80,32 @@
{{ end }} + {{ if gt (len $release.deprecation_announcements) 0 }} +
+
+ {{ partial "heading.html" (dict "text" "Deprecation Announcements" "level" 2) }} +
+ +
+ {{ range $release.deprecation_announcements }} +
+ + {{ .what | markdownify }} + +
+ Announced in {{ .announcement_version }} · Planned removal in {{ .deprecation_version }} +
+ {{ with .description }} +
+ {{ . | markdownify }} +
+ {{ end }} +
+ {{ end }} +
+
+ {{ end }} +
From 8643b9ee251132c22e3668cd23e8eb3d0a0911b3 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 12:47:59 -0400 Subject: [PATCH 21/85] fix(releasing): fix clippy warnings in deprecation utils --- vdev/src/commands/check/deprecations.rs | 5 +- vdev/src/commands/deprecation/show.rs | 18 ++++--- vdev/src/utils/deprecation.rs | 65 ++++++++++++++----------- 3 files changed, 53 insertions(+), 35 deletions(-) diff --git a/vdev/src/commands/check/deprecations.rs b/vdev/src/commands/check/deprecations.rs index 2d676532335f7..19ac24a6f0581 100644 --- a/vdev/src/commands/check/deprecations.rs +++ b/vdev/src/commands/check/deprecations.rs @@ -15,7 +15,10 @@ impl Cli { let dir = repo_root.join(deprecation::DEPRECATION_DIR); if !dir.is_dir() { - println!("No {dir} directory found; nothing to validate.", dir = dir.display()); + println!( + "No {dir} directory found; nothing to validate.", + dir = dir.display() + ); return Ok(()); } diff --git a/vdev/src/commands/deprecation/show.rs b/vdev/src/commands/deprecation/show.rs index ff952841b8125..ae5667b79400d 100644 --- a/vdev/src/commands/deprecation/show.rs +++ b/vdev/src/commands/deprecation/show.rs @@ -13,7 +13,7 @@ use crate::utils::{ #[derive(clap::Args, Debug)] #[command()] pub struct Cli { - /// Filter to only show entries whose deprecation_version matches this release version. + /// Filter to only show entries whose `deprecation_version` matches this release version. #[arg(long)] version: Option, } @@ -59,9 +59,7 @@ impl Cli { // Use the computed next minor as the "release" for partitioning. // If the next minor can't be determined, fall back to a sentinel version // that only `next` keywords will match (major=0, minor=0 never matches real versions). - let partition_version = next_minor - .clone() - .unwrap_or_else(|| Version::new(0, 0, 0)); + let partition_version = next_minor.clone().unwrap_or_else(|| Version::new(0, 0, 0)); let p = deprecation::partition_by_release(entries, &partition_version); let enacted: Vec<&DeprecationEntry> = p.enacted.iter().collect(); let announcing: Vec<&DeprecationEntry> = p.announcing.iter().collect(); @@ -73,8 +71,16 @@ impl Cli { }; let nm = next_minor.as_ref(); - print_section(&format!("Enacted in next release ({next_label})"), &enacted, nm); - print_section(&format!("Announced in next release ({next_label})"), &announcing, nm); + print_section( + &format!("Enacted in next release ({next_label})"), + &enacted, + nm, + ); + print_section( + &format!("Announced in next release ({next_label})"), + &announcing, + nm, + ); print_section("Pre-existing deprecations", &preexisting, nm); Ok(()) diff --git a/vdev/src/utils/deprecation.rs b/vdev/src/utils/deprecation.rs index af40e098996e0..fc98d9d3bbd05 100644 --- a/vdev/src/utils/deprecation.rs +++ b/vdev/src/utils/deprecation.rs @@ -1,6 +1,5 @@ use std::{ - fmt, - fs, + fmt, fs, path::{Path, PathBuf}, }; @@ -26,14 +25,12 @@ impl PartialOrd for VersionOrTbd { impl Ord for VersionOrTbd { fn cmp(&self, other: &Self) -> std::cmp::Ordering { + use std::cmp::Ordering::{Equal, Greater, Less}; match (self, other) { (Self::Version(a), Self::Version(b)) => a.cmp(b), - (Self::Version(_), _) => std::cmp::Ordering::Less, - (Self::Next, Self::Version(_)) => std::cmp::Ordering::Greater, - (Self::Next, Self::Next) => std::cmp::Ordering::Equal, - (Self::Next, Self::Tbd) => std::cmp::Ordering::Less, - (Self::Tbd, Self::Tbd) => std::cmp::Ordering::Equal, - (Self::Tbd, _) => std::cmp::Ordering::Greater, + (Self::Version(_), _) | (Self::Next, Self::Tbd) => Less, + (Self::Next, Self::Version(_)) | (Self::Tbd, Self::Version(_) | Self::Next) => Greater, + _ => Equal, } } } @@ -117,7 +114,10 @@ pub struct DeprecationPartition { } /// Partition a list of deprecation entries into three buckets relative to `release`. -pub fn partition_by_release(entries: Vec, release: &Version) -> DeprecationPartition { +pub fn partition_by_release( + entries: Vec, + release: &Version, +) -> DeprecationPartition { let mut enacted = Vec::new(); let mut announcing = Vec::new(); let mut planned = Vec::new(); @@ -130,7 +130,11 @@ pub fn partition_by_release(entries: Vec, release: &Version) - planned.push(e); } } - DeprecationPartition { enacted, announcing, planned } + DeprecationPartition { + enacted, + announcing, + planned, + } } /// Read and parse all deprecation fragments from the given directory. @@ -158,7 +162,7 @@ fn parse_deprecation_fragment(path: &Path) -> Result { .unwrap_or("") .to_string(); - if !filename.ends_with(".md") { + if !filename.to_ascii_lowercase().ends_with(".md") { bail!( "Deprecation fragment {} must have a .md extension", path.display() @@ -170,12 +174,8 @@ fn parse_deprecation_fragment(path: &Path) -> Result { let (frontmatter_str, body) = split_frontmatter(&raw, path)?; - let fm: Frontmatter = serde_yaml::from_str(frontmatter_str).with_context(|| { - format!( - "Failed to parse YAML frontmatter in {}", - path.display() - ) - })?; + let fm: Frontmatter = serde_yaml::from_str(frontmatter_str) + .with_context(|| format!("Failed to parse YAML frontmatter in {}", path.display()))?; if fm.what.trim().is_empty() { bail!( @@ -205,15 +205,15 @@ pub fn rewrite_next_versions(path: &Path, release: &Version) -> Result { // Only rewrite within the frontmatter block (between the two `---` delimiters). let fm_close = content[3..] // skip opening `---` .find("\n---") - .map(|p| p + 3) // offset back into original string - .unwrap_or(content.len()); + .map_or(content.len(), |p| p + 3); let (front, rest) = content.split_at(fm_close); let new_front: String = front .lines() .map(|line| { - if (line.starts_with("announcement_version:") || line.starts_with("deprecation_version:")) + if (line.starts_with("announcement_version:") + || line.starts_with("deprecation_version:")) && line.trim_end().ends_with("next") { let colon_pos = line.find(':').unwrap(); @@ -236,8 +236,7 @@ pub fn rewrite_next_versions(path: &Path, release: &Version) -> Result { format!("{new_front}{rest}") }; - fs::write(path, rejoined) - .with_context(|| format!("Failed to write {}", path.display()))?; + fs::write(path, rejoined).with_context(|| format!("Failed to write {}", path.display()))?; Ok(true) } @@ -256,9 +255,12 @@ fn split_frontmatter<'a>(content: &'a str, path: &Path) -> Result<(&'a str, &'a let after_open = content[3..].trim_start_matches([' ', '\t']); let after_open = after_open.trim_start_matches('\n'); - let close_pos = after_open - .find("\n---") - .ok_or_else(|| anyhow!("Deprecation fragment {} has unclosed frontmatter", path.display()))?; + let close_pos = after_open.find("\n---").ok_or_else(|| { + anyhow!( + "Deprecation fragment {} has unclosed frontmatter", + path.display() + ) + })?; let frontmatter = &after_open[..close_pos]; let rest = &after_open[close_pos + 4..]; // skip `\n---` @@ -285,8 +287,14 @@ mod tests { assert_eq!(entries.len(), 1); let e = &entries[0]; assert_eq!(e.what, "The foo option"); - assert_eq!(e.deprecation_version, VersionOrTbd::Version(Version::new(0, 57, 0))); - assert_eq!(e.announcement_version, VersionOrTbd::Version(Version::new(0, 55, 0))); + assert_eq!( + e.deprecation_version, + VersionOrTbd::Version(Version::new(0, 57, 0)) + ); + assert_eq!( + e.announcement_version, + VersionOrTbd::Version(Version::new(0, 55, 0)) + ); assert_eq!(e.description, "Detailed explanation."); } @@ -414,7 +422,8 @@ mod tests { fn rewrite_next_versions_no_op_when_no_next() { let tmp = tempdir().unwrap(); let path = tmp.path().join("concrete.md"); - let original = "---\nwhat: Thing\ndeprecation_version: 0.57\nannouncement_version: 0.57\n---\n"; + let original = + "---\nwhat: Thing\ndeprecation_version: 0.57\nannouncement_version: 0.57\n---\n"; fs::write(&path, original).unwrap(); let modified = rewrite_next_versions(&path, &Version::new(0, 57, 0)).unwrap(); assert!(!modified); From 55fc56dce9625822817d6981bf16ad876537cf79 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 13:07:32 -0400 Subject: [PATCH 22/85] feat(releasing): in dry-run mode, create branches from current branch instead of master --- vdev/src/commands/release/prepare.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/vdev/src/commands/release/prepare.rs b/vdev/src/commands/release/prepare.rs index 8cdb4a2341db6..6bd5b0b8a275d 100644 --- a/vdev/src/commands/release/prepare.rs +++ b/vdev/src/commands/release/prepare.rs @@ -121,9 +121,13 @@ impl Prepare { /// Steps 1 & 2 fn create_release_branches(&self) -> Result<()> { debug!("create_release_branches"); - // Step 1: Create a new release branch - git::run_and_check_output(&["fetch"])?; - git::checkout_main_branch()?; + + if !self.dry_run { + // Step 1: Sync with remote and start from master. + git::run_and_check_output(&["fetch"])?; + git::checkout_main_branch()?; + } + // In dry-run mode the branches are created from whatever branch is currently checked out. git::checkout_or_create_branch(self.release_branch.as_str())?; if !self.dry_run { From 99f0cf1face6d6d88d21539f623d043b8d464154 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 13:13:41 -0400 Subject: [PATCH 23/85] fix(releasing): resolve next to concrete version before rendering CUE and partitioning --- vdev/src/utils/deprecation.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/vdev/src/utils/deprecation.rs b/vdev/src/utils/deprecation.rs index fc98d9d3bbd05..978063fa231d1 100644 --- a/vdev/src/utils/deprecation.rs +++ b/vdev/src/utils/deprecation.rs @@ -114,6 +114,7 @@ pub struct DeprecationPartition { } /// Partition a list of deprecation entries into three buckets relative to `release`. +/// Any `next` version values are resolved to the concrete `major.minor` of `release`. pub fn partition_by_release( entries: Vec, release: &Version, @@ -122,6 +123,7 @@ pub fn partition_by_release( let mut announcing = Vec::new(); let mut planned = Vec::new(); for e in entries { + let e = resolve_next(e, release); if e.deprecation_version.matches_release(release) { enacted.push(e); } else if e.announcement_version.matches_release(release) { @@ -137,6 +139,18 @@ pub fn partition_by_release( } } +fn resolve_next(e: DeprecationEntry, release: &Version) -> DeprecationEntry { + let resolve = |v: VersionOrTbd| match v { + VersionOrTbd::Next => VersionOrTbd::Version(Version::new(release.major, release.minor, 0)), + other => other, + }; + DeprecationEntry { + deprecation_version: resolve(e.deprecation_version), + announcement_version: resolve(e.announcement_version), + ..e + } +} + /// Read and parse all deprecation fragments from the given directory. /// Returns entries sorted by filename. pub fn read_deprecation_fragments(dir: &Path) -> Result> { From 53367982cf50bc5deb233713210bf106d8757432 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 13:14:07 -0400 Subject: [PATCH 24/85] chore(vdev): rename VersionOrTbd->DeprecationVersion --- vdev/src/commands/deprecation/show.rs | 10 ++-- vdev/src/utils/deprecation.rs | 66 ++++++++++++++------------- 2 files changed, 39 insertions(+), 37 deletions(-) diff --git a/vdev/src/commands/deprecation/show.rs b/vdev/src/commands/deprecation/show.rs index ae5667b79400d..69cc266eb7fa1 100644 --- a/vdev/src/commands/deprecation/show.rs +++ b/vdev/src/commands/deprecation/show.rs @@ -5,7 +5,7 @@ use owo_colors::{OwoColorize, Stream::Stdout, Style}; use semver::Version; use crate::utils::{ - deprecation::{self, DeprecationEntry, VersionOrTbd}, + deprecation::{self, DeprecationEntry, DeprecationVersion}, git, paths, }; @@ -126,9 +126,9 @@ fn print_entry(e: &DeprecationEntry, next_minor: Option<&Version>) { println!(); } -fn format_version(v: &VersionOrTbd, next_minor: Option<&Version>) -> String { - let is_next = matches!(v, VersionOrTbd::Next) - || matches!((v, next_minor), (VersionOrTbd::Version(_), Some(nv)) if v.matches_release(nv)); +fn format_version(v: &DeprecationVersion, next_minor: Option<&Version>) -> String { + let is_next = matches!(v, DeprecationVersion::Next) + || matches!((v, next_minor), (DeprecationVersion::Version(_), Some(nv)) if v.matches_release(nv)); if is_next { let style = Style::new().bright_red().bold(); @@ -139,7 +139,7 @@ fn format_version(v: &VersionOrTbd, next_minor: Option<&Version>) -> String { } match v { - VersionOrTbd::Tbd => "TBD" + DeprecationVersion::Tbd => "TBD" .if_supports_color(Stdout, |t| t.bright_yellow()) .to_string(), _ => v diff --git a/vdev/src/utils/deprecation.rs b/vdev/src/utils/deprecation.rs index 978063fa231d1..6e4ff1726f0fd 100644 --- a/vdev/src/utils/deprecation.rs +++ b/vdev/src/utils/deprecation.rs @@ -11,19 +11,19 @@ pub const DEPRECATION_DIR: &str = "deprecation.d"; /// A version field value: a concrete semver version, `TBD` (unknown), or `next` /// (the very next release, whatever its number turns out to be). #[derive(Debug, Clone, PartialEq, Eq)] -pub enum VersionOrTbd { +pub enum DeprecationVersion { Version(Version), Tbd, Next, } -impl PartialOrd for VersionOrTbd { +impl PartialOrd for DeprecationVersion { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } } -impl Ord for VersionOrTbd { +impl Ord for DeprecationVersion { fn cmp(&self, other: &Self) -> std::cmp::Ordering { use std::cmp::Ordering::{Equal, Greater, Less}; match (self, other) { @@ -35,17 +35,17 @@ impl Ord for VersionOrTbd { } } -impl fmt::Display for VersionOrTbd { +impl fmt::Display for DeprecationVersion { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - VersionOrTbd::Version(v) => write!(f, "{v}"), - VersionOrTbd::Tbd => write!(f, "TBD"), - VersionOrTbd::Next => write!(f, "next"), + DeprecationVersion::Version(v) => write!(f, "{v}"), + DeprecationVersion::Tbd => write!(f, "TBD"), + DeprecationVersion::Next => write!(f, "next"), } } } -impl VersionOrTbd { +impl DeprecationVersion { /// Returns true when this version should be enacted for the given release. /// /// `next` always matches — it means "the very next release cut". @@ -54,20 +54,20 @@ impl VersionOrTbd { /// `TBD` never matches. pub fn matches_release(&self, release: &Version) -> bool { match self { - VersionOrTbd::Version(v) => v.major == release.major && v.minor == release.minor, - VersionOrTbd::Next => true, - VersionOrTbd::Tbd => false, + DeprecationVersion::Version(v) => v.major == release.major && v.minor == release.minor, + DeprecationVersion::Next => true, + DeprecationVersion::Tbd => false, } } } -impl<'de> serde::Deserialize<'de> for VersionOrTbd { +impl<'de> serde::Deserialize<'de> for DeprecationVersion { fn deserialize>(d: D) -> std::result::Result { let s = String::deserialize(d)?; let s = s.trim(); match s { - "TBD" => return Ok(VersionOrTbd::Tbd), - "next" => return Ok(VersionOrTbd::Next), + "TBD" => return Ok(DeprecationVersion::Tbd), + "next" => return Ok(DeprecationVersion::Next), _ => {} } // Accept both "0.56" (major.minor) and "0.56.0" (major.minor.patch). @@ -78,7 +78,7 @@ impl<'de> serde::Deserialize<'de> for VersionOrTbd { std::borrow::Cow::Borrowed(s) }; Version::parse(&normalized) - .map(VersionOrTbd::Version) + .map(DeprecationVersion::Version) .map_err(|e| serde::de::Error::custom(format!("invalid version '{s}': {e}"))) } } @@ -88,8 +88,8 @@ use serde::Deserialize; #[derive(Debug, Deserialize)] struct Frontmatter { what: String, - deprecation_version: VersionOrTbd, - announcement_version: VersionOrTbd, + deprecation_version: DeprecationVersion, + announcement_version: DeprecationVersion, } /// A parsed and validated deprecation entry from `deprecation.d/`. @@ -97,8 +97,8 @@ struct Frontmatter { pub struct DeprecationEntry { pub filename: String, pub what: String, - pub deprecation_version: VersionOrTbd, - pub announcement_version: VersionOrTbd, + pub deprecation_version: DeprecationVersion, + pub announcement_version: DeprecationVersion, /// Optional body text (everything after the closing `---` of the frontmatter). pub description: String, } @@ -140,8 +140,10 @@ pub fn partition_by_release( } fn resolve_next(e: DeprecationEntry, release: &Version) -> DeprecationEntry { - let resolve = |v: VersionOrTbd| match v { - VersionOrTbd::Next => VersionOrTbd::Version(Version::new(release.major, release.minor, 0)), + let resolve = |v: DeprecationVersion| match v { + DeprecationVersion::Next => { + DeprecationVersion::Version(Version::new(release.major, release.minor, 0)) + } other => other, }; DeprecationEntry { @@ -303,11 +305,11 @@ mod tests { assert_eq!(e.what, "The foo option"); assert_eq!( e.deprecation_version, - VersionOrTbd::Version(Version::new(0, 57, 0)) + DeprecationVersion::Version(Version::new(0, 57, 0)) ); assert_eq!( e.announcement_version, - VersionOrTbd::Version(Version::new(0, 55, 0)) + DeprecationVersion::Version(Version::new(0, 55, 0)) ); assert_eq!(e.description, "Detailed explanation."); } @@ -321,8 +323,8 @@ mod tests { ) .unwrap(); let entries = read_deprecation_fragments(tmp.path()).unwrap(); - assert_eq!(entries[0].deprecation_version, VersionOrTbd::Tbd); - assert_eq!(entries[0].announcement_version, VersionOrTbd::Tbd); + assert_eq!(entries[0].deprecation_version, DeprecationVersion::Tbd); + assert_eq!(entries[0].announcement_version, DeprecationVersion::Tbd); } #[test] @@ -374,13 +376,13 @@ mod tests { // "0.56" normalises to 0.56.0 assert_eq!( entries[0].deprecation_version, - VersionOrTbd::Version(Version::new(0, 56, 0)) + DeprecationVersion::Version(Version::new(0, 56, 0)) ); } #[test] fn matches_release_ignores_patch() { - let v = VersionOrTbd::Version(Version::new(0, 56, 0)); + let v = DeprecationVersion::Version(Version::new(0, 56, 0)); // "0.56" (stored as 0.56.0) should match any 0.56.x release assert!(v.matches_release(&Version::new(0, 56, 0))); assert!(v.matches_release(&Version::new(0, 56, 1))); @@ -392,13 +394,13 @@ mod tests { #[test] fn tbd_never_matches_release() { - assert!(!VersionOrTbd::Tbd.matches_release(&Version::new(0, 56, 0))); + assert!(!DeprecationVersion::Tbd.matches_release(&Version::new(0, 56, 0))); } #[test] fn next_always_matches_release() { - assert!(VersionOrTbd::Next.matches_release(&Version::new(0, 56, 0))); - assert!(VersionOrTbd::Next.matches_release(&Version::new(1, 0, 0))); + assert!(DeprecationVersion::Next.matches_release(&Version::new(0, 56, 0))); + assert!(DeprecationVersion::Next.matches_release(&Version::new(1, 0, 0))); } #[test] @@ -410,8 +412,8 @@ mod tests { ) .unwrap(); let entries = read_deprecation_fragments(tmp.path()).unwrap(); - assert_eq!(entries[0].deprecation_version, VersionOrTbd::Next); - assert_eq!(entries[0].announcement_version, VersionOrTbd::Next); + assert_eq!(entries[0].deprecation_version, DeprecationVersion::Next); + assert_eq!(entries[0].announcement_version, DeprecationVersion::Next); } #[test] From 923269d197176275cc518a1be5f27fa4540758d1 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 13:19:52 -0400 Subject: [PATCH 25/85] feat(external docs): hide TBD removal date on release deprecation sections --- website/layouts/releases/single.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/layouts/releases/single.html b/website/layouts/releases/single.html index 6a04bc4bb5f06..f7f362d76dcb2 100644 --- a/website/layouts/releases/single.html +++ b/website/layouts/releases/single.html @@ -67,7 +67,7 @@ {{ .what | markdownify }}
- Announced in {{ .announcement_version }} · Removed in {{ .deprecation_version }} + Announced in {{ .announcement_version }}{{ if ne .deprecation_version "TBD" }} · Removed in {{ .deprecation_version }}{{ end }}
{{ with .description }}
@@ -93,7 +93,7 @@ {{ .what | markdownify }}
- Announced in {{ .announcement_version }} · Planned removal in {{ .deprecation_version }} + Announced in {{ .announcement_version }}{{ if ne .deprecation_version "TBD" }} · Planned removal in {{ .deprecation_version }}{{ end }}
{{ with .description }}
@@ -279,7 +279,7 @@ {{ .what | markdownify }}
- Announced in {{ .announcement_version }} · Planned removal in {{ .deprecation_version }} + Announced in {{ .announcement_version }}{{ if ne .deprecation_version "TBD" }} · Planned removal in {{ .deprecation_version }}{{ end }}
{{ with .description }}
From 9bc543d11370b551176c78481a014dcc3fc07a67 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 13:23:23 -0400 Subject: [PATCH 26/85] chore(internal docs): remove leading 'The' from deprecation what fields --- deprecation.d/azure-monitor-logs-sink.md | 2 +- deprecation.d/buffer-bytes-events-metrics.md | 2 +- deprecation.d/datadog-metrics-series-v1.md | 2 +- deprecation.d/http-server-encoding.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/deprecation.d/azure-monitor-logs-sink.md b/deprecation.d/azure-monitor-logs-sink.md index 3c9a00a18e3e9..0e777fed1d156 100644 --- a/deprecation.d/azure-monitor-logs-sink.md +++ b/deprecation.d/azure-monitor-logs-sink.md @@ -1,5 +1,5 @@ --- -what: "The `azure_monitor_logs` sink" +what: "`azure_monitor_logs` sink" announcement_version: 0.54.0 deprecation_version: 0.58.0 --- diff --git a/deprecation.d/buffer-bytes-events-metrics.md b/deprecation.d/buffer-bytes-events-metrics.md index c07cadcdac480..0103dd649854f 100644 --- a/deprecation.d/buffer-bytes-events-metrics.md +++ b/deprecation.d/buffer-bytes-events-metrics.md @@ -1,5 +1,5 @@ --- -what: "The `buffer_byte_size` and `buffer_events` gauge metrics" +what: "`buffer_byte_size` and `buffer_events` gauge metrics" announcement_version: 0.53.0 deprecation_version: TBD --- diff --git a/deprecation.d/datadog-metrics-series-v1.md b/deprecation.d/datadog-metrics-series-v1.md index 18a521153980d..ffac24643511c 100644 --- a/deprecation.d/datadog-metrics-series-v1.md +++ b/deprecation.d/datadog-metrics-series-v1.md @@ -1,5 +1,5 @@ --- -what: "The `series_api_version: v1` option on the `datadog_metrics` sink" +what: "`series_api_version: v1` option on the `datadog_metrics` sink" announcement_version: 0.55.0 deprecation_version: 0.58.0 --- diff --git a/deprecation.d/http-server-encoding.md b/deprecation.d/http-server-encoding.md index 7bfde31311c80..c56e3eb982a00 100644 --- a/deprecation.d/http-server-encoding.md +++ b/deprecation.d/http-server-encoding.md @@ -1,5 +1,5 @@ --- -what: "The `encoding` field on HTTP server sources" +what: "`encoding` field on HTTP server sources" announcement_version: 0.50.0 deprecation_version: TBD --- From a0d26067e61f4456909ebe1b2a9b330d3118029c Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 13:28:47 -0400 Subject: [PATCH 27/85] chore(external docs): Add fake deprecation + generated cue file --- deprecation.d/example-fake-deprecation.md | 7 + website/content/en/releases/0.56.0.md | 4 + website/cue/reference/releases/0.56.0.cue | 476 ++++++++++++++++++++++ 3 files changed, 487 insertions(+) create mode 100644 deprecation.d/example-fake-deprecation.md create mode 100644 website/content/en/releases/0.56.0.md create mode 100644 website/cue/reference/releases/0.56.0.cue diff --git a/deprecation.d/example-fake-deprecation.md b/deprecation.d/example-fake-deprecation.md new file mode 100644 index 0000000000000..6ae39549e5371 --- /dev/null +++ b/deprecation.d/example-fake-deprecation.md @@ -0,0 +1,7 @@ +--- +what: "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]" +announcement_version: next +deprecation_version: 0.58 +--- + +This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging. diff --git a/website/content/en/releases/0.56.0.md b/website/content/en/releases/0.56.0.md new file mode 100644 index 0000000000000..83e693e3434d9 --- /dev/null +++ b/website/content/en/releases/0.56.0.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.56.0 release notes +weight: 35 +--- diff --git a/website/cue/reference/releases/0.56.0.cue b/website/cue/reference/releases/0.56.0.cue new file mode 100644 index 0000000000000..936b9c939ff94 --- /dev/null +++ b/website/cue/reference/releases/0.56.0.cue @@ -0,0 +1,476 @@ +package metadata + +releases: "0.56.0": { + date: "2026-05-15" + codename: "" + + whats_next: [] + + deprecations: [ + { + what: "Boolean syntax for the `compression` field in the `vector` sink" + deprecation_version: "0.56.0" + announcement_version: "0.56.0" + description: #""" + The boolean syntax (`compression: true` / `compression: false`) is deprecated. + Use the string syntax instead: `compression: "gzip"`, `compression: "zstd"`, or `compression: "none"`. + + The `bool_or_vector_compression` deserializer will be removed once the boolean syntax is no longer supported. + """# + }, + { + what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" + deprecation_version: "0.56.0" + announcement_version: "0.55.0" + description: #""" + The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. + Users must upgrade their GreptimeDB instance to v1.x before upgrading Vector. + """# + }, + ] + + deprecation_announcements: [ + { + what: "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]" + deprecation_version: "0.58.0" + announcement_version: "0.56.0" + description: #""" + This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging. + """# + }, + ] + + planned_deprecations: [ + { + what: "`azure_monitor_logs` sink" + deprecation_version: "0.58.0" + announcement_version: "0.54.0" + description: #""" + The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink, + which uses the Azure Monitor Logs Ingestion API. + + Users should migrate before Microsoft ends support for the old Data Collector API (scheduled + for September 2026). + """# + }, + { + what: "`buffer_byte_size` and `buffer_events` gauge metrics" + deprecation_version: "TBD" + announcement_version: "0.53.0" + description: #""" + The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the + `buffer_size_bytes` and `buffer_size_events` metrics described in `docs/specs/buffer.md`. + """# + }, + { + what: "`series_api_version: v1` option on the `datadog_metrics` sink" + deprecation_version: "0.58.0" + announcement_version: "0.55.0" + description: #""" + The `series_api_version: v1` option is deprecated in favor of `v2` (the default). + The v1 series endpoint (`/api/v1/series`) is a legacy endpoint. + + Users should remove `series_api_version: v1` from their configuration or set it to `v2`. + """# + }, + { + what: "`encoding` field on HTTP server sources" + deprecation_version: "TBD" + announcement_version: "0.50.0" + description: #""" + The `encoding` field will be removed. Use `decoding` and `framing` instead. + """# + }, + ] + + changelog: [ + { + type: "feat" + description: #""" + HTTP-based sinks that use the shared retry helpers now support a `retry_strategy` configuration + option to control which HTTP response codes are retried. The `http` sink also includes a new + example showing how to retry only specific transient status codes. + + Issue: https://github.com/vectordotdev/vector/issues/10870 + """# + contributors: ["ndrsg"] + }, + { + type: "enhancement" + description: #""" + HTTP-based sinks using the shared retry logic now classify transport-layer failures with + `HttpError::is_retriable`: connection and TLS connector issues may be retried, while failures + such as invalid HTTP request construction or an invalid proxy URI are not. Setting + `retry_strategy` to `none` disables retries for these transport errors and for request + timeouts, in addition to status-code-based retries. + + Issue: https://github.com/vectordotdev/vector/issues/10870 + """# + contributors: ["ndrsg"] + }, + { + type: "fix" + description: #""" + The default `/etc/vector/vector.yaml` config file is no longer installed by the Debian, RPM, Alpine, and distroless-static Docker packages. The previous default ran a `demo_logs` source and printed synthesized syslog lines to stdout, which then surfaced in journald or `/var/log/` on hosts running Vector as a service and was a common source of confusion. + + New installs will now have no active config on disk. Provide your own configuration at `/etc/vector/vector.yaml` (or pass `--config `) before starting Vector. A reference example is shipped at `/usr/share/vector/examples/vector.yaml`, and more sample configs remain at `/etc/vector/examples/`. + + Existing installs are unaffected on upgrade: package managers preserve the on-disk `/etc/vector/vector.yaml` if you already had one. + """# + contributors: ["pront"] + }, + { + type: "feat" + description: #""" + Unit tests now support an optional `expected_event_count` field on test outputs, allowing assertions on the number of events emitted by a transform. + """# + contributors: ["pront"] + }, + { + type: "enhancement" + description: #""" + The `vector` sink now supports `zstd` compression in addition to `gzip`. This provides better + compression ratios and performance for Vector-to-Vector communication. + + The compression configuration has been enhanced to support multiple algorithms while maintaining + full backward compatibility: + + ## Legacy boolean syntax (still supported) + + ```yaml + sinks: + my_vector: + type: vector + address: "localhost:6000" + compression: true # Uses gzip (default) + # or + compression: false # No compression + ``` + + ## New string syntax + + ```yaml + sinks: + my_vector: + type: vector + address: "localhost:6000" + compression: "zstd" # Use zstd compression + # Supported values: "none", "gzip", "zstd" + ``` + + The Vector source automatically accepts both gzip and zstd compressed data, enabling seamless + communication between Vector instances using different compression algorithms. + """# + contributors: ["jpds"] + }, + { + type: "feat" + description: #""" + Add a new `databricks_zerobus` sink that streams log data to Databricks Unity Catalog tables via the Zerobus ingestion service. Supports OAuth 2.0 authentication, automatic schema fetching from Unity Catalog, and protobuf batch encoding. + """# + contributors: ["flaviocruz"] + }, + { + type: "fix" + description: #""" + The shared gRPC decompression layer now rejects request frames that set the + compressed flag without a negotiated `grpc-encoding` (e.g. `identity` or a + missing header). Previously such malformed frames were silently decoded as + gzip, which could mask client/server compression-negotiation bugs. + """# + contributors: ["jpds"] + }, + { + type: "enhancement" + description: #""" + The `opentelemetry` source's gRPC OTLP receiver now accepts `zstd`-compressed + requests in addition to `gzip`, matching the compression schemes advertised via + the `grpc-accept-encoding` response header. No configuration change is required; + clients can send OTLP payloads with `grpc-encoding: zstd` and they will be + transparently decompressed. + """# + contributors: ["jpds"] + }, + { + type: "fix" + description: #""" + Fixed issue during in place reload of a sink with a disk buffer configured, where + the component would stall for batch.timeout_sec before gracefully reloading. + This fix also resolves issues Vector had where it would ignore SIGINT during + cases where the pipeline stall had occurred. + """# + contributors: ["graphcareful"] + }, + { + type: "fix" + description: #""" + The `windows_event_log` source no longer freezes after periods of inactivity. + """# + contributors: ["tot19"] + }, + { + type: "fix" + description: #""" + Sinks using batch encoding (Parquet, Arrow IPC) now consistently emit `ComponentEventsDropped` for every encode failure path. Previously some `build_record_batch` failures (notably type mismatches) dropped events silently. A new `EncoderRecordBatchError` internal event also reports `component_errors_total` with `error_code="arrow_json_decode"` or `"arrow_record_batch_creation"` at `stage="sending"` for granular alerting. + """# + contributors: ["pront"] + }, + { + type: "fix" + description: #""" + The error log + metric that `splunk_hec` source emit on missing/invalid auth header now specifies "authentication_failed" as error_type. + """# + contributors: ["20agbekodo"] + }, + { + type: "fix" + description: #""" + Restored support for installing Vector on RHEL 8, Rocky Linux 8, AlmaLinux 8, and CentOS Stream 8, which had been broken since v0.55.0 due to an inadvertent glibc requirement bump. + """# + contributors: ["pront"] + }, + { + type: "fix" + description: #""" + Restored the full VRL stdlib, including `get_env_var`, in the standalone VRL CLI and web playground by default. + """# + contributors: ["pront"] + }, + { + type: "fix" + description: #""" + Parquet encoding in the `aws_s3` sink (`batch_encoding`) now works out of the box in the official release binaries. Previously it required compiling Vector from source with the `codecs-parquet` feature. + """# + contributors: ["pront"] + }, + { + type: "fix" + description: #""" + The `windows_event_log` source now adds standard source metadata, including `source_type`, to emitted log events. + """# + contributors: ["tot19"] + }, + { + type: "fix" + description: #""" + The `aws_s3` and `clickhouse` sinks now correctly advertise only the `batch_encoding.codec` values they actually support: `parquet` for `aws_s3` and `arrow_stream` for `clickhouse`. Previously the documentation and configuration schema listed both codecs for both sinks, even though picking the wrong one produced a startup error. + """# + contributors: ["flaviofcruz"] + }, + { + type: "fix" + description: #""" + The text content generated by the `demo_logs` source has changed: the + pool of fake usernames and the pool of fake domain TLDs are now both + defined inside Vector rather than pulled from an external crate. The + line formats (`apache_common`, `apache_error`, `json`, `syslog`, + `bsd_syslog`) are unchanged. If any of your tests or downstream + pipelines assert on specific generated usernames or TLDs, please + update those expectations. + """# + contributors: ["pront"] + }, + { + type: "chore" + description: #""" + The `greptimedb_metrics` and `greptimedb_logs` sinks now require GreptimeDB v1.x. Users running GreptimeDB v0.x must upgrade their GreptimeDB instance before upgrading Vector. + """# + contributors: ["thomasqueirozb"] + }, + { + type: "fix" + description: #""" + Fixed a bug in the `mqtt` source where user-provided TLS client certificates (`crt_file` / `key_file`) were being silently ignored, breaking mTLS connections to strict brokers like AWS IoT Core. + """# + contributors: ["mr-"] + }, + { + type: "feat" + description: #""" + Added `ratio_field` and `rate_field` options to the `sample` transform to support dynamic per-event sampling, while requiring static `rate` or `ratio` fallback configuration and disallowing `ratio_field` and `rate_field` together. + """# + contributors: ["jhammer"] + }, + { + type: "enhancement" + description: #""" + Bumped `serde_json` to `1.0.149` and `serde_with` to `3.18.0`. `serde_json` switched its float-to-string formatter from Ryū to Żmij in `1.0.147`, so floats serialized via the `native_json` codec may render with slightly different textual form (for example `1e+16` instead of `1e16`). The change is purely cosmetic: parsed `f32`/`f64` values round-trip identically, and Vector-to-Vector communication between old and new versions is unaffected. + """# + contributors: ["pront"] + }, + { + type: "enhancement" + description: #""" + The `splunk_hec` source now accepts optional per-endpoint codec configuration via `event: { framing, decoding }` and `raw: { framing, decoding }`. When `decoding` is set on an endpoint, Vector applies a second decoding pass after the HEC envelope is parsed: on `/services/collector/event` the envelope's `event` field is fed through the codec, and on `/services/collector/raw` the request body is fed through the codec directly. A single payload can fan out to multiple events. + + For example, to decode JSON payloads in `/event` requests while splitting `/raw` bodies on newlines: + + ```yaml + sources: + hec: + type: splunk_hec + address: 0.0.0.0:8088 + event: + decoding: + codec: json + raw: + framing: + method: newline_delimited + decoding: + codec: bytes + ``` + """# + contributors: ["thomasqueirozb"] + }, + { + type: "enhancement" + description: #""" + The `tag_cardinality_limit` transform gained two new configuration capabilities: + + - **Per-tag overrides** (`per_tag_limits`): configure cardinality limits per tag key within a metric, or exclude individual tags from tracking. + - **Metric exclusion**: opt entire metrics out of cardinality tracking via `mode: excluded` in `per_metric_limits`. + """# + contributors: ["ArunPiduguDD"] + }, + { + type: "enhancement" + description: #""" + The `tag_cardinality_limit` transform gained two new settings: + + - **`tracking_scope`**: isolate tag tracking per metric (`per_metric`) instead of sharing a single bucket across all metrics (`global`, the default). + - **`max_tracked_keys`**: cap the total number of tag keys tracked to bound memory usage. + """# + contributors: ["ArunPiduguDD"] + }, + ] + + commits: [ + {sha: "1c70988b54156abf8d031538f0f81f28e7c0a0e4", date: "2026-04-21 17:00:33 UTC", description: "restore HTTP GET /health endpoint", pr_number: 25234, scopes: ["api"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 6, insertions_count: 162, deletions_count: 11}, + {sha: "aafd4cb44f5649e692722b97d82973fea5509a41", date: "2026-04-21 18:21:39 UTC", description: "drop fakedata_generator, fix broken fake domains", pr_number: 25236, scopes: ["demo_logs source"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 6, insertions_count: 61, deletions_count: 26}, + {sha: "8cf773df0e3b219e40537119aa2b95b916342df2", date: "2026-04-22 18:31:21 UTC", description: "start 0.56.0 development cycle", pr_number: 25242, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 59, insertions_count: 786, deletions_count: 233}, + {sha: "f36ed0e2cebf36efdc7392aed0ed52ae28a29101", date: "2026-04-22 19:54:48 UTC", description: "render release date on per-version release page", pr_number: 25244, scopes: ["website"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 9, deletions_count: 0}, + {sha: "29b17aadc63fdd9a9bdc3b64bbd8f9c647844cdb", date: "2026-04-22 20:30:30 UTC", description: "skip re-adding WIP label on synchronize if already approved", pr_number: 25246, scopes: ["ci"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 29, deletions_count: 1}, + {sha: "d99899e2f9cb94c8d421270ada8688243402b5a1", date: "2026-04-22 20:41:08 UTC", description: "fix docs sidebar expand/collapse navigation", pr_number: 25238, scopes: ["website"], type: "fix", breaking_change: false, author: "shalk(xiao kun)", files_count: 1, insertions_count: 5, deletions_count: 2}, + {sha: "ecdaa50ac15e6a26e811bf21e3a6e33729bebb33", date: "2026-04-22 23:23:12 UTC", description: "verify choco package install after 5xx from feed", pr_number: 25116, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 4, deletions_count: 1}, + {sha: "f1557d68c8e7f36feb8e2d0c7a04286817c6bf9f", date: "2026-04-23 14:16:39 UTC", description: "add `expected_event_count` field to test outputs", pr_number: 25186, scopes: ["unit tests"], type: "feat", breaking_change: false, author: "Pavlos Rontidis", files_count: 5, insertions_count: 323, deletions_count: 11}, + {sha: "cfb942bf7d1983b9eeaeb93ba2f843a816d1db5d", date: "2026-04-23 17:39:22 UTC", description: "bump openssl from 0.10.75 to 0.10.78", pr_number: 25250, scopes: ["deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 2, insertions_count: 5, deletions_count: 5}, + {sha: "c0cdf2068f79176fd8af4dca9b27cabae5be3091", date: "2026-04-23 17:52:07 UTC", description: "extract unit tests into reusable workflow", pr_number: 25247, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 3, insertions_count: 125, deletions_count: 24}, + {sha: "f56f4fa7234440345d790a2b81c7aa880be831d8", date: "2026-04-23 20:29:50 UTC", description: "remove Chocolatey from Windows bootstrap", pr_number: 25254, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 2, insertions_count: 39, deletions_count: 40}, + {sha: "7428dc3f4b23c56f1f2eecf44b3f6b2532c28dac", date: "2026-04-24 18:40:53 UTC", description: "use dd-sts instead of DD_API_KEY", pr_number: 25235, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 11, insertions_count: 82, deletions_count: 12}, + {sha: "7815f26ef4f357c7e3e90048e4287728c9506423", date: "2026-04-24 18:43:56 UTC", description: "add Docker support for local development", pr_number: 25237, scopes: ["website"], type: "chore", breaking_change: false, author: "shalk(xiao kun)", files_count: 3, insertions_count: 83, deletions_count: 0}, + {sha: "74574a360112a4bb212915b896471320fb157b96", date: "2026-04-24 18:50:53 UTC", description: "add linux arm64 to publish matrix and bump to 0.3.2", pr_number: 25260, scopes: ["vdev"], type: "chore", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 5, deletions_count: 3}, + {sha: "3b043d33b95670ef1cbd2f5af274fa25ebb1db84", date: "2026-04-24 18:55:51 UTC", description: "add support for GreptimeDB v1.0.0", pr_number: 25178, scopes: ["greptimedb sink"], type: "feat", breaking_change: true, author: "Thomas", files_count: 12, insertions_count: 623, deletions_count: 273}, + {sha: "61cc4d84d2966e7552a308d5df5a0f03305d7eed", date: "2026-04-27 13:40:18 UTC", description: "make publish-s3 wait for generate-sha256sum", pr_number: 25265, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 1, deletions_count: 0}, + {sha: "454b096abcfd609b4e317b83fa4ec1ec79af5da8", date: "2026-04-27 14:14:28 UTC", description: "add datadog_metrics series v1 deprecation entry", pr_number: 25271, scopes: ["deprecations"], type: "docs", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 1, deletions_count: 0}, + {sha: "aa9265d6026f7d5998cada6a50e9c66790fbf054", date: "2026-04-27 14:47:04 UTC", description: "add dependabot config for scripts/environment/npm-tools", pr_number: 25175, scopes: ["deps"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 16, deletions_count: 0}, + {sha: "69fd3b6f7e544a3f4bbba1d6d7e882a67387b081", date: "2026-04-27 14:56:51 UTC", description: "bump github/codeql-action from 4.32.4 to 4.35.2", pr_number: 25280, scopes: ["ci"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 1, insertions_count: 1, deletions_count: 1}, + {sha: "413caac10f64475b509687000317e06e55de55e0", date: "2026-04-27 15:18:47 UTC", description: "allow dd-token federation to fail on fork PRs", pr_number: 25284, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 6, deletions_count: 1}, + {sha: "ba84da5d8965aef1d5eb5455dc9f4d723177e914", date: "2026-04-27 15:01:24 UTC", description: "bump actions/github-script from 7 to 9", pr_number: 25278, scopes: ["ci"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 6, insertions_count: 10, deletions_count: 10}, + {sha: "a4ea6de53b829e6ec66fadaddd78317f099207b9", date: "2026-04-27 15:34:31 UTC", description: "bump actions/upload-artifact from 7.0.0 to 7.0.1 in the artifact group across 1 directory", pr_number: 25276, scopes: ["ci"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 8, insertions_count: 15, deletions_count: 15}, + {sha: "1d4b6c2122b82997b808bba0527ec60dbb37a3ba", date: "2026-04-27 15:36:38 UTC", description: "Emit warn on unauthenticated request", pr_number: 25230, scopes: ["splunk_hec source"], type: "fix", breaking_change: false, author: "Josué AGBEKODO", files_count: 3, insertions_count: 35, deletions_count: 12}, + {sha: "156b832637c2f18b4d32fbb347e0e5f0919407d3", date: "2026-04-27 18:33:20 UTC", description: "include page title in docs search query fields", pr_number: 25255, scopes: ["website"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 1, deletions_count: 1}, + {sha: "a843435f9677fe45f482ff4604bfe92b8a3d57c7", date: "2026-04-27 20:16:32 UTC", description: "Fix for issue causing stalling on shutdown for sinks configured w/ disk buffers", pr_number: 24949, scopes: ["topology"], type: "fix", breaking_change: false, author: "Rob Blafford", files_count: 7, insertions_count: 396, deletions_count: 111}, + {sha: "ff4754ab10da5838f68cc143e507087090518f91", date: "2026-04-28 14:04:28 UTC", description: "make nightly S3 verify resilient to CDN staleness", pr_number: 25259, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 17, deletions_count: 10}, + {sha: "6f3857906d3a54d9c05aa5d3aaa8b132ac8f5e6e", date: "2026-04-28 15:12:07 UTC", description: "restore stdlib functions in CLI and playground", pr_number: 25310, scopes: ["vrl"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 3, insertions_count: 10, deletions_count: 0}, + {sha: "23016adf7d87f41a3d887d587b21d3409e71e3fe", date: "2026-04-28 15:52:16 UTC", description: "fix release issue templates", pr_number: 25318, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 2, insertions_count: 4, deletions_count: 3}, + {sha: "96ad9edc5bd894029af95961ea205e0d89b17bf0", date: "2026-04-28 18:17:38 UTC", description: "improve docs search ranking for component pages", pr_number: 25319, scopes: ["website"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 5, deletions_count: 2}, + {sha: "ce6ca439caf80bd2af10864a84e949ef244e2163", date: "2026-04-28 19:40:29 UTC", description: "centralize `events_dropped` emission for batch encoding errors", pr_number: 25199, scopes: ["codecs"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 5, insertions_count: 153, deletions_count: 61}, + {sha: "d6cdf031d16a382a38046127fbc7ff30c2457709", date: "2026-04-28 21:40:45 UTC", description: "enable codecs-parquet in all release feature sets", pr_number: 25321, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 8, insertions_count: 186, deletions_count: 23}, + {sha: "233a35c47eab1a0691b39e4af06991dfe4b0f571", date: "2026-04-28 23:33:23 UTC", description: "correct cross-build artifact name and path", pr_number: 25282, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 2, deletions_count: 2}, + {sha: "8b465f6406fd088302d42f7e879297937bb8783f", date: "2026-04-29 17:44:41 UTC", description: "bump the patches group across 1 directory with 13 updates", pr_number: 25283, scopes: ["deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 6, insertions_count: 293, deletions_count: 155}, + {sha: "75b9d07a8231e7c321652e4ff031d8ce0757d9ab", date: "2026-04-29 19:57:15 UTC", description: "improve search ranking for component reference pages", pr_number: 25327, scopes: ["website"], type: "feat", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 44, deletions_count: 6}, + {sha: "625c1d3a57a59784da7b1e42b2318d4c372649d8", date: "2026-04-29 20:06:31 UTC", description: "bump the serde group across 1 directory with 2 updates", pr_number: 25227, scopes: ["deps"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 16, insertions_count: 71, deletions_count: 26}, + {sha: "b5fb618eb24bade72d5277be6d23836810d24fa8", date: "2026-04-30 21:53:00 UTC", description: "remove unused update_counter macro", pr_number: 25333, scopes: ["dev"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 0, deletions_count: 44}, + {sha: "bd8ab1a245a439134b2bd9f2cb540ca550db860c", date: "2026-05-01 13:30:24 UTC", description: "introduce RetryStrategy / Config for http based sinks", pr_number: 25057, scopes: ["sinks"], type: "feat", breaking_change: false, author: "Andy", files_count: 32, insertions_count: 957, deletions_count: 59}, + {sha: "9c617a7b766dc95ea919384ff16da2654595f6a4", date: "2026-05-01 14:04:29 UTC", description: "grant issues:write to remove_wip_label workflow", pr_number: 25339, scopes: ["ci"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 1, deletions_count: 0}, + {sha: "308d2469b2e70153d3eafd20a647bf33a9d69d73", date: "2026-05-01 14:43:39 UTC", description: "prevent windows_event_log permanent freeze from signal-event lost wakeup", pr_number: 25195, scopes: ["sources"], type: "fix", breaking_change: false, author: "tot19", files_count: 3, insertions_count: 546, deletions_count: 112}, + {sha: "59a53b138d127fdca68d260628d1dc0035b3f711", date: "2026-05-01 17:43:39 UTC", description: "remove type-level default on StatusCode", pr_number: 25345, scopes: ["internal docs"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 13, insertions_count: 12, deletions_count: 13}, + {sha: "f1b2c3a3f14f59ab9615829852da6e65a7d2c512", date: "2026-05-01 17:06:42 UTC", description: "add windows_event_log source metadata", pr_number: 25337, scopes: ["sources"], type: "fix", breaking_change: false, author: "tot19", files_count: 2, insertions_count: 18, deletions_count: 2}, + {sha: "9f15e23943d4347a6f2171eaa97a921a5e58d457", date: "2026-05-01 17:56:58 UTC", description: "bump cue and add cue-build step to Check Cue docs", pr_number: 25346, scopes: ["ci"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 4, insertions_count: 9, deletions_count: 7}, + {sha: "7923556313d66be69e638022e10fe3fd13f468ac", date: "2026-05-01 18:57:31 UTC", description: "use dedicated batch_encoding types", pr_number: 25340, scopes: ["clickhouse sink", "aws_s3 sink"], type: "fix", breaking_change: false, author: "Flavio Cruz", files_count: 8, insertions_count: 147, deletions_count: 212}, + {sha: "e1c6139b9717f36027b0ac9fe4d20276da4da128", date: "2026-05-02 20:51:00 UTC", description: "introduce enums for metric names", pr_number: 25342, scopes: ["metrics"], type: "chore", breaking_change: false, author: "Thomas", files_count: 106, insertions_count: 1254, deletions_count: 711}, + {sha: "48be543ff3b84dfbd56a49cc6a0a0aac450bbceb", date: "2026-05-04 14:01:46 UTC", description: "scope HistogramName import to s3 module", pr_number: 25353, scopes: ["aws_sqs source"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 2, deletions_count: 1}, + {sha: "96db40ef65b0d1246f06581987e5b6428468edf0", date: "2026-05-04 17:47:01 UTC", description: "Make transform-related functions in aggregate & tag cardinality transforms public", pr_number: 25358, scopes: ["metrics"], type: "enhancement", breaking_change: false, author: "ArunPiduguDD", files_count: 2, insertions_count: 3, deletions_count: 3}, + {sha: "8073e93b48352f781aace209f816ac55280a8935", date: "2026-05-04 19:13:10 UTC", description: "rename WIP label workflows to docs review label", pr_number: 25355, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 3, insertions_count: 23, deletions_count: 10}, + {sha: "4524b52c921447dfca228338add190f0363b582e", date: "2026-05-04 23:08:38 UTC", description: "upgrade hickory-proto to 0.26.1, ignore RUSTSEC-2026-0119", pr_number: 25354, scopes: ["deps"], type: "chore", breaking_change: false, author: "Thomas", files_count: 5, insertions_count: 226, deletions_count: 240}, + {sha: "6c3116a6e0a1d44113e5e2ce0b7e5aeeef3db785", date: "2026-05-05 13:33:38 UTC", description: "retry apt fetches in deb-verify to reduce flakes", pr_number: 25367, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 2, deletions_count: 2}, + {sha: "95756d72356406d1a71625dbcc8f83e49f43947d", date: "2026-05-05 15:34:08 UTC", description: "dynamic rate for sample", pr_number: 25035, scopes: ["transforms"], type: "enhancement", breaking_change: false, author: "jh7459-gh", files_count: 5, insertions_count: 749, deletions_count: 61}, + {sha: "f7cc83e980e5af429ee040c07aab7f96dd70cb15", date: "2026-05-05 17:37:26 UTC", description: "adjust tocbot content tracking", pr_number: 25359, scopes: ["external docs"], type: "fix", breaking_change: false, author: "Aaron Zheng", files_count: 2, insertions_count: 6, deletions_count: 3}, + {sha: "bec3290d7806fbefc1923fd676bb865c95e7f115", date: "2026-05-05 17:39:34 UTC", description: "bump axios from 1.15.0 to 1.16.0 in /website", pr_number: 25369, scopes: ["website deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 1, insertions_count: 5, deletions_count: 5}, + {sha: "202c974c18a8bfdb8102f6f0a8c3580bd3e9e96a", date: "2026-05-05 18:00:29 UTC", description: "bump postcss from 8.5.6 to 8.5.14 in /website", pr_number: 25368, scopes: ["website deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 1, insertions_count: 3, deletions_count: 3}, + {sha: "92ee2b26923ea0eaf8c0b4c1bc0398c679a4b44d", date: "2026-05-06 03:49:05 UTC", description: "Add remove tag function for metrics which returns entire tag set", pr_number: 25361, scopes: ["metrics"], type: "enhancement", breaking_change: false, author: "ArunPiduguDD", files_count: 1, insertions_count: 33, deletions_count: 0}, + {sha: "249d064d75e5337efd1cd4fd2949de20e16d801e", date: "2026-05-06 12:36:13 UTC", description: "rewrite scripts/generate-component-docs.rb in Rust (#22350)", pr_number: 24781, scopes: ["dev"], type: "feat", breaking_change: false, author: "Swaraj Patil", files_count: 11, insertions_count: 1990, deletions_count: 1930}, + {sha: "e109afcff7b4d0d58bf710c797b5028c2d067250", date: "2026-05-06 15:19:22 UTC", description: "add docker run example in distribution README", pr_number: 25268, scopes: ["external"], type: "docs", breaking_change: false, author: "st-omarkhalid", files_count: 1, insertions_count: 12, deletions_count: 3}, + {sha: "66e25a90bec1e3b3def56f0c00ae49d8e71260e5", date: "2026-05-06 15:23:25 UTC", description: "use single agent to fix e2e datadog-metrics histogram flakiness", pr_number: 25363, scopes: ["tests"], type: "fix", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 26, deletions_count: 64}, + {sha: "e6c0e3f6c46dd38b3c601c473149e07f5b71eb9e", date: "2026-05-06 15:38:07 UTC", description: "add new databricks_zerobus for Databricks ingestion", pr_number: 24840, scopes: ["sinks"], type: "feat", breaking_change: false, author: "Flavio Cruz", files_count: 26, insertions_count: 3187, deletions_count: 32}, + {sha: "5112e0ae334120465b333c1777da38593a4b8c60", date: "2026-05-06 18:00:21 UTC", description: "bump openssl from 0.10.78 to 0.10.79", pr_number: 25380, scopes: ["deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 2, insertions_count: 9, deletions_count: 10}, + {sha: "27e74de2d2daa8368e4b073fa90d443eb7974ba2", date: "2026-05-06 20:34:22 UTC", description: "bump docker/login-action from 4.0.0 to 4.1.0", pr_number: 25349, scopes: ["ci"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 4, insertions_count: 6, deletions_count: 6}, + {sha: "8105f31eef65e4e3d823f382d05d63e433394777", date: "2026-05-06 21:26:46 UTC", description: "add code coverage collection for integration and e2e test suites", pr_number: 25088, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 15, insertions_count: 353, deletions_count: 46}, + {sha: "bfeb76986acc74ad7c28acd2c60053d3cbdeb2bd", date: "2026-05-07 15:26:32 UTC", description: "support second-stage framing and decoding", pr_number: 25312, scopes: ["splunk_hec source"], type: "feat", breaking_change: false, author: "Thomas", files_count: 7, insertions_count: 2683, deletions_count: 219}, + {sha: "17a720cc90ebbbab9051eb5a2479a51eddf2760d", date: "2026-05-07 16:23:08 UTC", description: "remove release-flags.sh", pr_number: 24828, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 7, insertions_count: 4, deletions_count: 24}, + {sha: "256b8fa98627f37f26d6e11a84bfeda44981fc21", date: "2026-05-07 17:52:19 UTC", description: "skip Windows UDP-excluded ports in next_addr_for_ip", pr_number: 25386, scopes: ["tests"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 10, deletions_count: 0}, + {sha: "8d83e1790cf3337f8db56c0920e629866e7a1362", date: "2026-05-07 18:03:02 UTC", description: "bump hickory-net from 0.26.0 to 0.26.1", pr_number: 25389, scopes: ["deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 1, insertions_count: 12, deletions_count: 12}, + {sha: "bbde98b342fff4d69ccc49d537feda9572c9df79", date: "2026-05-08 14:20:34 UTC", description: "fix LTO settings after release-flags.sh removal", pr_number: 25393, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 3, deletions_count: 2}, + {sha: "cdb27e859b95fda129cfbed5e2b078af0f3c42c9", date: "2026-05-08 14:36:09 UTC", description: "kill Ruby and port release scripts to native vdev", pr_number: 25379, scopes: ["dev"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 36, insertions_count: 2616, deletions_count: 1806}, + {sha: "5cedf015de0c07d9f7e6f0023264279fcf986a40", date: "2026-05-08 15:06:43 UTC", description: "fix wording in decoder and framing doc strings", pr_number: 25382, scopes: ["codecs"], type: "docs", breaking_change: false, author: "Thomas", files_count: 32, insertions_count: 639, deletions_count: 712}, + {sha: "d9b06937242d4e5f484362fab6c0506b3676347f", date: "2026-05-08 15:09:03 UTC", description: "Add zstd compression support", pr_number: 24917, scopes: ["vector sink"], type: "feat", breaking_change: false, author: "Jonathan Davies", files_count: 14, insertions_count: 528, deletions_count: 72}, + {sha: "e59ac5715d4c8cc63b2e9076d19c4ef0429a2b4e", date: "2026-05-08 15:12:02 UTC", description: "Clarify acknowledgement guarantees with disk buffers", pr_number: 25388, scopes: ["external docs"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 7, deletions_count: 2}, + {sha: "39138e0e7b73a3b1d4f9dd7f0617343c3afd42ca", date: "2026-05-08 15:27:00 UTC", description: "add /ci-run-regression trigger + accept refs in inputs", pr_number: 25245, scopes: ["ci"], type: "feat", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 85, deletions_count: 43}, + {sha: "4ff1874b38008c15afeb61902298b36593a727bb", date: "2026-05-08 16:43:29 UTC", description: "emit channel-suffixed version from publish-metadata", pr_number: 25395, scopes: ["vdev"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 4, deletions_count: 3}, + {sha: "41bc804eab5590ccb44084512eb05b4a5612e2b7", date: "2026-05-08 16:49:29 UTC", description: "replace bootstrap scripts with setup action in publish workflows", pr_number: 25311, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 56, deletions_count: 21}, + {sha: "0d9111807bc7abb24ff53ef8590b8ca3ba4d8834", date: "2026-05-08 17:41:34 UTC", description: "bump vrl to latest main", pr_number: 25398, scopes: ["deps"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 5, insertions_count: 19, deletions_count: 15}, + {sha: "63b29fb2d8d80b5be57a897e14c8d29ed23d5663", date: "2026-05-08 18:38:00 UTC", description: "skip dd-sts federation on fork PRs via ACTIONS_ID_TOKEN_REQUEST_URL guard", pr_number: 25399, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 14, deletions_count: 2}, + {sha: "81f013820839be8ab0cc28069ab943c44f0f28cb", date: "2026-05-08 19:03:05 UTC", description: "use debug profile for k8s e2e build", pr_number: 25397, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 3, insertions_count: 12, deletions_count: 10}, + {sha: "f3346607ba25645a682b4b5bbc56d95a7f4bb4dd", date: "2026-05-08 19:11:30 UTC", description: "make -D warnings the default via .cargo/config.toml", pr_number: 25400, scopes: ["dev"], type: "chore", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 2, deletions_count: 20}, + {sha: "f2f19212bb5cee15615c8d86658447a4ac096729", date: "2026-05-08 19:18:40 UTC", description: "pass client certificates to rumqttc for mTLS", pr_number: 24929, scopes: ["mqtt source"], type: "fix", breaking_change: false, author: "Martin Ruderer", files_count: 2, insertions_count: 4, deletions_count: 1}, + {sha: "eda5b866e83cf5e0e926cae8ecf89c00a3109dc8", date: "2026-05-08 22:39:20 UTC", description: "fix flaky `initial_size_correct_with_multievents` test", pr_number: 25239, scopes: ["tests"], type: "fix", breaking_change: false, author: "Vitalii Parfonov", files_count: 1, insertions_count: 32, deletions_count: 7}, + {sha: "c3676b9fa8aef8088bd341775416e4ecd91095b2", date: "2026-05-08 23:11:57 UTC", description: "centralize CARGO_INCREMENTAL=0 in setup action", pr_number: 25401, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 6, insertions_count: 2, deletions_count: 7}, + {sha: "4ddc412437c69cfa6d3b5184ff3abab7e3d75008", date: "2026-05-11 14:52:29 UTC", description: "Add setting for per-metric vs global tag cardinality tracking", pr_number: 25372, scopes: ["tag_cardinality_limit transform"], type: "enhancement", breaking_change: false, author: "ArunPiduguDD", files_count: 7, insertions_count: 385, deletions_count: 45}, + {sha: "11f1dff407534822b90d4690e446d718867d6baf", date: "2026-05-11 18:55:00 UTC", description: "include lib/ workspace crates in coverage reports", pr_number: 25402, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 1, deletions_count: 0}, + {sha: "7efd6d7b53185a2997b81b2ef8fff4162d6c6506", date: "2026-05-11 20:19:41 UTC", description: "remove cargo vdev test --container runner", pr_number: 25410, scopes: ["dev"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 2, insertions_count: 6, deletions_count: 43}, + {sha: "e38ef0cab69d8dbd02deaadbd63870aafd77081b", date: "2026-05-12 13:53:04 UTC", description: "warn about log namespace with disk buffers", pr_number: 25413, scopes: ["external docs"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 3, insertions_count: 39, deletions_count: 1}, + {sha: "fc6a2b567f08a9c229e8a4b7584d6f30e1da1c9f", date: "2026-05-12 13:58:10 UTC", description: "make regression/Dockerfile self-contained", pr_number: 25411, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 29, deletions_count: 1}, + {sha: "d06def7be6c4ac1e29e46c73f94ea3d9f99b9997", date: "2026-05-12 20:06:08 UTC", description: "bump @babel/plugin-transform-modules-systemjs from 7.28.5 to 7.29.4 in /website", pr_number: 25403, scopes: ["website deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 1, insertions_count: 85, deletions_count: 6}, + {sha: "10de0ea6c6871d14d06b741d457d3cfab3676d67", date: "2026-05-12 20:32:17 UTC", description: "publish to crates.io on tag push", pr_number: 25420, scopes: ["vdev"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 21, deletions_count: 0}, + {sha: "dce3678640998bdbaedd67a4f5c4ddea588dd3af", date: "2026-05-12 20:43:00 UTC", description: "bump version to 0.3.3", pr_number: 25419, scopes: ["vdev"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 2, insertions_count: 2, deletions_count: 2}, + {sha: "fe3871fd15e8cc07a132aba2413f4c8efa69f983", date: "2026-05-13 01:42:02 UTC", description: "bump markdownlint-cli2 to 0.22.1 and remove smol-toml override", pr_number: 25416, scopes: ["deps"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 10, deletions_count: 15}, + {sha: "c60bc0a68c30eecdf8698eddec3ee7e3c7393fbb", date: "2026-05-13 16:46:40 UTC", description: "install vdev via binstall", pr_number: 25418, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 5, insertions_count: 42, deletions_count: 90}, + {sha: "c3720d863abc606cef5c117486b6ced03f8cf134", date: "2026-05-13 17:18:52 UTC", description: "remove default OS package config", pr_number: 25425, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 7, insertions_count: 28, deletions_count: 15}, + {sha: "904f69f81c68826a982d351cc08335cea9afab5b", date: "2026-05-13 20:35:46 UTC", description: "warn on invalid json batching", pr_number: 25423, scopes: ["opentelemetry sink"], type: "enhancement", breaking_change: false, author: "Pavlos Rontidis", files_count: 2, insertions_count: 29, deletions_count: 2}, + {sha: "338fc3805f131ca9281baadccb05e4ff8ac26111", date: "2026-05-13 21:06:03 UTC", description: "restore Vector RPM/DEB install on EL8 family", pr_number: 25387, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 5, insertions_count: 116, deletions_count: 18}, + {sha: "989f2ae0af0aa3da2691cfc78f675601178edadf", date: "2026-05-13 21:38:33 UTC", description: "pass GITHUB_TOKEN to prepare.sh for authenticated binstall requests", pr_number: 25428, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 2, deletions_count: 0}, + {sha: "e1772733754c4d069928169675791b2a484375a2", date: "2026-05-14 14:28:23 UTC", description: "retire the unused Docker dev environment", pr_number: 25429, scopes: ["dev"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 10, insertions_count: 102, deletions_count: 623}, + {sha: "45b6d2b8faa9d89005abefd5d6311db9d730cd0a", date: "2026-05-14 16:08:30 UTC", description: "Add more fine grained controls tag cardinality", pr_number: 25360, scopes: ["tag_cardinality_limit transform"], type: "enhancement", breaking_change: false, author: "ArunPiduguDD", files_count: 6, insertions_count: 747, deletions_count: 122}, + {sha: "11ad4e7df2f16203357c875557230905a94cfe0d", date: "2026-05-14 17:33:09 UTC", description: "clarify JEMALLOC_SYS_WITH_LG_PAGE comment", pr_number: 25435, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 4, deletions_count: 2}, + {sha: "45c4010e78a8470177061b8257648499ba1f61fe", date: "2026-05-14 19:33:52 UTC", description: "add \"View open issues\" link to component pages", pr_number: 25437, scopes: ["external docs"], type: "feat", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 14, deletions_count: 0}, + {sha: "a1a56fe123829ab224361648165973d6ba9a5292", date: "2026-05-14 20:04:48 UTC", description: "drop gssapi from default cargo feature", pr_number: 25256, scopes: ["deps"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 4, insertions_count: 35, deletions_count: 15}, + {sha: "ec27f907e50dacdc7d1124720f1b29dfe967aac7", date: "2026-05-14 20:20:46 UTC", description: "unify Dockerfile apt deps into one script", pr_number: 25436, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 3, insertions_count: 27, deletions_count: 33}, + {sha: "f06f820a9f66a6518e01f0d7a3d43b5a2826bd9b", date: "2026-05-14 20:32:54 UTC", description: "make libz.so.1 a consistent dynamic runtime dependency in distroless-libc", pr_number: 25434, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Thomas", files_count: 3, insertions_count: 10, deletions_count: 3}, + {sha: "f5643b687151a31c5494b46646068f1dece4df7b", date: "2026-05-15 13:36:52 UTC", description: "add deprecation.d fragment system with vdev check/show commands and release integration", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 18, insertions_count: 670, deletions_count: 27}, + {sha: "6d0e0c07a40a234ecb37b21a4b8d65b3f578621c", date: "2026-05-15 14:02:32 UTC", description: "wire deprecation check into changelog.yaml via bash script", pr_number: null, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 3, insertions_count: 116, deletions_count: 40}, + {sha: "411a95799077734160b680181a7ac919bc9823a7", date: "2026-05-15 14:14:57 UTC", description: "chore(ci): wire deprecation check into changelog.yaml via bash script", pr_number: null, scopes: [], type: "revert", breaking_change: false, author: "Thomas", files_count: 3, insertions_count: 40, deletions_count: 116}, + {sha: "f2b55c226e1b67dd502a3c0cb092f52d2bc95773", date: "2026-05-15 14:15:43 UTC", description: "use changes.yml and setup action for deprecation fragment check", pr_number: null, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 55, deletions_count: 26}, + {sha: "a42c0a4fc73a7bd881fa17d1f69a9d1af7333f88", date: "2026-05-15 14:16:47 UTC", description: "remove stale comment from deprecation workflow", pr_number: null, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 0, deletions_count: 9}, + {sha: "9e5a2eb22c0e8f4b3c1962fb63877e7a210db178", date: "2026-05-15 14:27:03 UTC", description: "add deprecations and planned_deprecations to release CUE schema", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 9, deletions_count: 0}, + {sha: "1196d69e0aaad8e4ffbe7d226aedbe2a715e22b7", date: "2026-05-15 14:29:43 UTC", description: "fix deprecation fragments to use deprecation_version not announcement_version", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 6, insertions_count: 5, deletions_count: 11}, + {sha: "d7b55a21986031413aec814390d47b39de944c0e", date: "2026-05-15 14:32:59 UTC", description: "restore announcement_version to deprecation fragments", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 6, insertions_count: 6, deletions_count: 0}, + {sha: "a0b1f0ff2ae17bd79063e6476d60472f15c93147", date: "2026-05-15 15:11:22 UTC", description: "make announcement_version required, add next version keyword, rewrite next on release", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 12, insertions_count: 171, deletions_count: 45}, + {sha: "37eba350d6ba591419c1e30a90099db0afbf0e73", date: "2026-05-15 15:15:48 UTC", description: "update deprecation docs and release template for new fragment fields", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 10, deletions_count: 7}, + {sha: "9659a52582a8cc94e110f9dc2dce45c82dc3d100", date: "2026-05-15 15:16:57 UTC", description: "sort deprecation show output by version", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 22, deletions_count: 1}, + {sha: "5ae8acdb5b2bd93d3d0504d6fbe01d9d99303bea", date: "2026-05-15 15:36:31 UTC", description: "fix announcement versions for azure_monitor_logs and datadog_metrics series v1", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 2, deletions_count: 2}, + {sha: "0b535c6ec1ae2881bed5d9c9ce8cf69eedc18a9e", date: "2026-05-15 15:41:49 UTC", description: "refine deprecation show output with grouped sections and next-release detection", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 86, deletions_count: 33}, + {sha: "d1eff3ad6d4854ffb53f968204277bc00e5c6d98", date: "2026-05-15 15:43:14 UTC", description: "add color and styling to deprecation show output", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 46, deletions_count: 14}, + {sha: "a2928a79209be19854cfb1d9e63fb8137536768d", date: "2026-05-15 15:44:08 UTC", description: "fix label alignment in deprecation show output", pr_number: null, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 1, deletions_count: 1}, + {sha: "b575eb9dbd10001627f27914154cf96802ac924d", date: "2026-05-15 15:45:00 UTC", description: "colour concrete next-minor version red same as next keyword", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 25, deletions_count: 31}, + {sha: "0c6d24703d0e7e8602520ba9e9ed15ef85aab6f9", date: "2026-05-15 15:46:49 UTC", description: "correct deprecation versions in fragments", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 6, deletions_count: 6}, + {sha: "986bc3222b4ba0337b66084e34a587976e9bed70", date: "2026-05-15 15:48:40 UTC", description: "expose generate-cue as standalone release subcommand", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 62, deletions_count: 0}, + {sha: "4ccc8cf603448f0e2590499a2169a4492aba8abc", date: "2026-05-15 16:30:34 UTC", description: "render deprecations and planned_deprecations on release pages", pr_number: null, scopes: ["external docs"], type: "feat", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 52, deletions_count: 0}, + {sha: "0723a0dac1cc9bd5d9992dea29f54cc6616c8ca6", date: "2026-05-15 16:45:59 UTC", description: "split deprecations into three buckets: enacted, announcing, planned", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 5, insertions_count: 79, deletions_count: 26}, + {sha: "8643b9ee251132c22e3668cd23e8eb3d0a0911b3", date: "2026-05-15 16:47:59 UTC", description: "fix clippy warnings in deprecation utils", pr_number: null, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Thomas", files_count: 3, insertions_count: 53, deletions_count: 35}, + {sha: "55fc56dce9625822817d6981bf16ad876537cf79", date: "2026-05-15 17:07:32 UTC", description: "in dry-run mode, create branches from current branch instead of master", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 7, deletions_count: 3}, + {sha: "99f0cf1face6d6d88d21539f623d043b8d464154", date: "2026-05-15 17:13:41 UTC", description: "resolve next to concrete version before rendering CUE and partitioning", pr_number: null, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 14, deletions_count: 0}, + {sha: "53367982cf50bc5deb233713210bf106d8757432", date: "2026-05-15 17:14:07 UTC", description: "rename VersionOrTbd->DeprecationVersion", pr_number: null, scopes: ["vdev"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 39, deletions_count: 37}, + {sha: "923269d197176275cc518a1be5f27fa4540758d1", date: "2026-05-15 17:19:52 UTC", description: "hide TBD removal date on release deprecation sections", pr_number: null, scopes: ["external docs"], type: "feat", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 3, deletions_count: 3}, + {sha: "9bc543d11370b551176c78481a014dcc3fc07a67", date: "2026-05-15 17:23:23 UTC", description: "remove leading 'The' from deprecation what fields", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 4, deletions_count: 4}, + ] +} From 12c78d37bdc8d7fcb5314dadd05d79b243b21749 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 13:36:46 -0400 Subject: [PATCH 28/85] chore(internal docs): fix nested code fences in deprecation.d README --- deprecation.d/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deprecation.d/README.md b/deprecation.d/README.md index e622ab2f46e79..2d1af2a0fb433 100644 --- a/deprecation.d/README.md +++ b/deprecation.d/README.md @@ -13,11 +13,11 @@ release notes: Each file must be named `.md` and begin with YAML frontmatter: -```markdown +````markdown --- announcement_version: next deprecation_version: 0.57.0 -what: "The `legacy_auth` configuration option" +what: "`legacy_auth` configuration option" --- The `legacy_auth` option has been replaced by the new `auth` block. @@ -34,7 +34,7 @@ with: auth: token: "my_token" ``` -``` +```` ### Frontmatter fields From fd52722532d1c715f49bb04e00796137498088e6 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 13:39:25 -0400 Subject: [PATCH 29/85] chore(website): delete generated files --- website/content/en/releases/0.56.0.md | 4 - website/cue/reference/releases/0.56.0.cue | 476 ---------------------- 2 files changed, 480 deletions(-) delete mode 100644 website/content/en/releases/0.56.0.md delete mode 100644 website/cue/reference/releases/0.56.0.cue diff --git a/website/content/en/releases/0.56.0.md b/website/content/en/releases/0.56.0.md deleted file mode 100644 index 83e693e3434d9..0000000000000 --- a/website/content/en/releases/0.56.0.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Vector v0.56.0 release notes -weight: 35 ---- diff --git a/website/cue/reference/releases/0.56.0.cue b/website/cue/reference/releases/0.56.0.cue deleted file mode 100644 index 936b9c939ff94..0000000000000 --- a/website/cue/reference/releases/0.56.0.cue +++ /dev/null @@ -1,476 +0,0 @@ -package metadata - -releases: "0.56.0": { - date: "2026-05-15" - codename: "" - - whats_next: [] - - deprecations: [ - { - what: "Boolean syntax for the `compression` field in the `vector` sink" - deprecation_version: "0.56.0" - announcement_version: "0.56.0" - description: #""" - The boolean syntax (`compression: true` / `compression: false`) is deprecated. - Use the string syntax instead: `compression: "gzip"`, `compression: "zstd"`, or `compression: "none"`. - - The `bool_or_vector_compression` deserializer will be removed once the boolean syntax is no longer supported. - """# - }, - { - what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" - deprecation_version: "0.56.0" - announcement_version: "0.55.0" - description: #""" - The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. - Users must upgrade their GreptimeDB instance to v1.x before upgrading Vector. - """# - }, - ] - - deprecation_announcements: [ - { - what: "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]" - deprecation_version: "0.58.0" - announcement_version: "0.56.0" - description: #""" - This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging. - """# - }, - ] - - planned_deprecations: [ - { - what: "`azure_monitor_logs` sink" - deprecation_version: "0.58.0" - announcement_version: "0.54.0" - description: #""" - The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink, - which uses the Azure Monitor Logs Ingestion API. - - Users should migrate before Microsoft ends support for the old Data Collector API (scheduled - for September 2026). - """# - }, - { - what: "`buffer_byte_size` and `buffer_events` gauge metrics" - deprecation_version: "TBD" - announcement_version: "0.53.0" - description: #""" - The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the - `buffer_size_bytes` and `buffer_size_events` metrics described in `docs/specs/buffer.md`. - """# - }, - { - what: "`series_api_version: v1` option on the `datadog_metrics` sink" - deprecation_version: "0.58.0" - announcement_version: "0.55.0" - description: #""" - The `series_api_version: v1` option is deprecated in favor of `v2` (the default). - The v1 series endpoint (`/api/v1/series`) is a legacy endpoint. - - Users should remove `series_api_version: v1` from their configuration or set it to `v2`. - """# - }, - { - what: "`encoding` field on HTTP server sources" - deprecation_version: "TBD" - announcement_version: "0.50.0" - description: #""" - The `encoding` field will be removed. Use `decoding` and `framing` instead. - """# - }, - ] - - changelog: [ - { - type: "feat" - description: #""" - HTTP-based sinks that use the shared retry helpers now support a `retry_strategy` configuration - option to control which HTTP response codes are retried. The `http` sink also includes a new - example showing how to retry only specific transient status codes. - - Issue: https://github.com/vectordotdev/vector/issues/10870 - """# - contributors: ["ndrsg"] - }, - { - type: "enhancement" - description: #""" - HTTP-based sinks using the shared retry logic now classify transport-layer failures with - `HttpError::is_retriable`: connection and TLS connector issues may be retried, while failures - such as invalid HTTP request construction or an invalid proxy URI are not. Setting - `retry_strategy` to `none` disables retries for these transport errors and for request - timeouts, in addition to status-code-based retries. - - Issue: https://github.com/vectordotdev/vector/issues/10870 - """# - contributors: ["ndrsg"] - }, - { - type: "fix" - description: #""" - The default `/etc/vector/vector.yaml` config file is no longer installed by the Debian, RPM, Alpine, and distroless-static Docker packages. The previous default ran a `demo_logs` source and printed synthesized syslog lines to stdout, which then surfaced in journald or `/var/log/` on hosts running Vector as a service and was a common source of confusion. - - New installs will now have no active config on disk. Provide your own configuration at `/etc/vector/vector.yaml` (or pass `--config `) before starting Vector. A reference example is shipped at `/usr/share/vector/examples/vector.yaml`, and more sample configs remain at `/etc/vector/examples/`. - - Existing installs are unaffected on upgrade: package managers preserve the on-disk `/etc/vector/vector.yaml` if you already had one. - """# - contributors: ["pront"] - }, - { - type: "feat" - description: #""" - Unit tests now support an optional `expected_event_count` field on test outputs, allowing assertions on the number of events emitted by a transform. - """# - contributors: ["pront"] - }, - { - type: "enhancement" - description: #""" - The `vector` sink now supports `zstd` compression in addition to `gzip`. This provides better - compression ratios and performance for Vector-to-Vector communication. - - The compression configuration has been enhanced to support multiple algorithms while maintaining - full backward compatibility: - - ## Legacy boolean syntax (still supported) - - ```yaml - sinks: - my_vector: - type: vector - address: "localhost:6000" - compression: true # Uses gzip (default) - # or - compression: false # No compression - ``` - - ## New string syntax - - ```yaml - sinks: - my_vector: - type: vector - address: "localhost:6000" - compression: "zstd" # Use zstd compression - # Supported values: "none", "gzip", "zstd" - ``` - - The Vector source automatically accepts both gzip and zstd compressed data, enabling seamless - communication between Vector instances using different compression algorithms. - """# - contributors: ["jpds"] - }, - { - type: "feat" - description: #""" - Add a new `databricks_zerobus` sink that streams log data to Databricks Unity Catalog tables via the Zerobus ingestion service. Supports OAuth 2.0 authentication, automatic schema fetching from Unity Catalog, and protobuf batch encoding. - """# - contributors: ["flaviocruz"] - }, - { - type: "fix" - description: #""" - The shared gRPC decompression layer now rejects request frames that set the - compressed flag without a negotiated `grpc-encoding` (e.g. `identity` or a - missing header). Previously such malformed frames were silently decoded as - gzip, which could mask client/server compression-negotiation bugs. - """# - contributors: ["jpds"] - }, - { - type: "enhancement" - description: #""" - The `opentelemetry` source's gRPC OTLP receiver now accepts `zstd`-compressed - requests in addition to `gzip`, matching the compression schemes advertised via - the `grpc-accept-encoding` response header. No configuration change is required; - clients can send OTLP payloads with `grpc-encoding: zstd` and they will be - transparently decompressed. - """# - contributors: ["jpds"] - }, - { - type: "fix" - description: #""" - Fixed issue during in place reload of a sink with a disk buffer configured, where - the component would stall for batch.timeout_sec before gracefully reloading. - This fix also resolves issues Vector had where it would ignore SIGINT during - cases where the pipeline stall had occurred. - """# - contributors: ["graphcareful"] - }, - { - type: "fix" - description: #""" - The `windows_event_log` source no longer freezes after periods of inactivity. - """# - contributors: ["tot19"] - }, - { - type: "fix" - description: #""" - Sinks using batch encoding (Parquet, Arrow IPC) now consistently emit `ComponentEventsDropped` for every encode failure path. Previously some `build_record_batch` failures (notably type mismatches) dropped events silently. A new `EncoderRecordBatchError` internal event also reports `component_errors_total` with `error_code="arrow_json_decode"` or `"arrow_record_batch_creation"` at `stage="sending"` for granular alerting. - """# - contributors: ["pront"] - }, - { - type: "fix" - description: #""" - The error log + metric that `splunk_hec` source emit on missing/invalid auth header now specifies "authentication_failed" as error_type. - """# - contributors: ["20agbekodo"] - }, - { - type: "fix" - description: #""" - Restored support for installing Vector on RHEL 8, Rocky Linux 8, AlmaLinux 8, and CentOS Stream 8, which had been broken since v0.55.0 due to an inadvertent glibc requirement bump. - """# - contributors: ["pront"] - }, - { - type: "fix" - description: #""" - Restored the full VRL stdlib, including `get_env_var`, in the standalone VRL CLI and web playground by default. - """# - contributors: ["pront"] - }, - { - type: "fix" - description: #""" - Parquet encoding in the `aws_s3` sink (`batch_encoding`) now works out of the box in the official release binaries. Previously it required compiling Vector from source with the `codecs-parquet` feature. - """# - contributors: ["pront"] - }, - { - type: "fix" - description: #""" - The `windows_event_log` source now adds standard source metadata, including `source_type`, to emitted log events. - """# - contributors: ["tot19"] - }, - { - type: "fix" - description: #""" - The `aws_s3` and `clickhouse` sinks now correctly advertise only the `batch_encoding.codec` values they actually support: `parquet` for `aws_s3` and `arrow_stream` for `clickhouse`. Previously the documentation and configuration schema listed both codecs for both sinks, even though picking the wrong one produced a startup error. - """# - contributors: ["flaviofcruz"] - }, - { - type: "fix" - description: #""" - The text content generated by the `demo_logs` source has changed: the - pool of fake usernames and the pool of fake domain TLDs are now both - defined inside Vector rather than pulled from an external crate. The - line formats (`apache_common`, `apache_error`, `json`, `syslog`, - `bsd_syslog`) are unchanged. If any of your tests or downstream - pipelines assert on specific generated usernames or TLDs, please - update those expectations. - """# - contributors: ["pront"] - }, - { - type: "chore" - description: #""" - The `greptimedb_metrics` and `greptimedb_logs` sinks now require GreptimeDB v1.x. Users running GreptimeDB v0.x must upgrade their GreptimeDB instance before upgrading Vector. - """# - contributors: ["thomasqueirozb"] - }, - { - type: "fix" - description: #""" - Fixed a bug in the `mqtt` source where user-provided TLS client certificates (`crt_file` / `key_file`) were being silently ignored, breaking mTLS connections to strict brokers like AWS IoT Core. - """# - contributors: ["mr-"] - }, - { - type: "feat" - description: #""" - Added `ratio_field` and `rate_field` options to the `sample` transform to support dynamic per-event sampling, while requiring static `rate` or `ratio` fallback configuration and disallowing `ratio_field` and `rate_field` together. - """# - contributors: ["jhammer"] - }, - { - type: "enhancement" - description: #""" - Bumped `serde_json` to `1.0.149` and `serde_with` to `3.18.0`. `serde_json` switched its float-to-string formatter from Ryū to Żmij in `1.0.147`, so floats serialized via the `native_json` codec may render with slightly different textual form (for example `1e+16` instead of `1e16`). The change is purely cosmetic: parsed `f32`/`f64` values round-trip identically, and Vector-to-Vector communication between old and new versions is unaffected. - """# - contributors: ["pront"] - }, - { - type: "enhancement" - description: #""" - The `splunk_hec` source now accepts optional per-endpoint codec configuration via `event: { framing, decoding }` and `raw: { framing, decoding }`. When `decoding` is set on an endpoint, Vector applies a second decoding pass after the HEC envelope is parsed: on `/services/collector/event` the envelope's `event` field is fed through the codec, and on `/services/collector/raw` the request body is fed through the codec directly. A single payload can fan out to multiple events. - - For example, to decode JSON payloads in `/event` requests while splitting `/raw` bodies on newlines: - - ```yaml - sources: - hec: - type: splunk_hec - address: 0.0.0.0:8088 - event: - decoding: - codec: json - raw: - framing: - method: newline_delimited - decoding: - codec: bytes - ``` - """# - contributors: ["thomasqueirozb"] - }, - { - type: "enhancement" - description: #""" - The `tag_cardinality_limit` transform gained two new configuration capabilities: - - - **Per-tag overrides** (`per_tag_limits`): configure cardinality limits per tag key within a metric, or exclude individual tags from tracking. - - **Metric exclusion**: opt entire metrics out of cardinality tracking via `mode: excluded` in `per_metric_limits`. - """# - contributors: ["ArunPiduguDD"] - }, - { - type: "enhancement" - description: #""" - The `tag_cardinality_limit` transform gained two new settings: - - - **`tracking_scope`**: isolate tag tracking per metric (`per_metric`) instead of sharing a single bucket across all metrics (`global`, the default). - - **`max_tracked_keys`**: cap the total number of tag keys tracked to bound memory usage. - """# - contributors: ["ArunPiduguDD"] - }, - ] - - commits: [ - {sha: "1c70988b54156abf8d031538f0f81f28e7c0a0e4", date: "2026-04-21 17:00:33 UTC", description: "restore HTTP GET /health endpoint", pr_number: 25234, scopes: ["api"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 6, insertions_count: 162, deletions_count: 11}, - {sha: "aafd4cb44f5649e692722b97d82973fea5509a41", date: "2026-04-21 18:21:39 UTC", description: "drop fakedata_generator, fix broken fake domains", pr_number: 25236, scopes: ["demo_logs source"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 6, insertions_count: 61, deletions_count: 26}, - {sha: "8cf773df0e3b219e40537119aa2b95b916342df2", date: "2026-04-22 18:31:21 UTC", description: "start 0.56.0 development cycle", pr_number: 25242, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 59, insertions_count: 786, deletions_count: 233}, - {sha: "f36ed0e2cebf36efdc7392aed0ed52ae28a29101", date: "2026-04-22 19:54:48 UTC", description: "render release date on per-version release page", pr_number: 25244, scopes: ["website"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 9, deletions_count: 0}, - {sha: "29b17aadc63fdd9a9bdc3b64bbd8f9c647844cdb", date: "2026-04-22 20:30:30 UTC", description: "skip re-adding WIP label on synchronize if already approved", pr_number: 25246, scopes: ["ci"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 29, deletions_count: 1}, - {sha: "d99899e2f9cb94c8d421270ada8688243402b5a1", date: "2026-04-22 20:41:08 UTC", description: "fix docs sidebar expand/collapse navigation", pr_number: 25238, scopes: ["website"], type: "fix", breaking_change: false, author: "shalk(xiao kun)", files_count: 1, insertions_count: 5, deletions_count: 2}, - {sha: "ecdaa50ac15e6a26e811bf21e3a6e33729bebb33", date: "2026-04-22 23:23:12 UTC", description: "verify choco package install after 5xx from feed", pr_number: 25116, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 4, deletions_count: 1}, - {sha: "f1557d68c8e7f36feb8e2d0c7a04286817c6bf9f", date: "2026-04-23 14:16:39 UTC", description: "add `expected_event_count` field to test outputs", pr_number: 25186, scopes: ["unit tests"], type: "feat", breaking_change: false, author: "Pavlos Rontidis", files_count: 5, insertions_count: 323, deletions_count: 11}, - {sha: "cfb942bf7d1983b9eeaeb93ba2f843a816d1db5d", date: "2026-04-23 17:39:22 UTC", description: "bump openssl from 0.10.75 to 0.10.78", pr_number: 25250, scopes: ["deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 2, insertions_count: 5, deletions_count: 5}, - {sha: "c0cdf2068f79176fd8af4dca9b27cabae5be3091", date: "2026-04-23 17:52:07 UTC", description: "extract unit tests into reusable workflow", pr_number: 25247, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 3, insertions_count: 125, deletions_count: 24}, - {sha: "f56f4fa7234440345d790a2b81c7aa880be831d8", date: "2026-04-23 20:29:50 UTC", description: "remove Chocolatey from Windows bootstrap", pr_number: 25254, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 2, insertions_count: 39, deletions_count: 40}, - {sha: "7428dc3f4b23c56f1f2eecf44b3f6b2532c28dac", date: "2026-04-24 18:40:53 UTC", description: "use dd-sts instead of DD_API_KEY", pr_number: 25235, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 11, insertions_count: 82, deletions_count: 12}, - {sha: "7815f26ef4f357c7e3e90048e4287728c9506423", date: "2026-04-24 18:43:56 UTC", description: "add Docker support for local development", pr_number: 25237, scopes: ["website"], type: "chore", breaking_change: false, author: "shalk(xiao kun)", files_count: 3, insertions_count: 83, deletions_count: 0}, - {sha: "74574a360112a4bb212915b896471320fb157b96", date: "2026-04-24 18:50:53 UTC", description: "add linux arm64 to publish matrix and bump to 0.3.2", pr_number: 25260, scopes: ["vdev"], type: "chore", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 5, deletions_count: 3}, - {sha: "3b043d33b95670ef1cbd2f5af274fa25ebb1db84", date: "2026-04-24 18:55:51 UTC", description: "add support for GreptimeDB v1.0.0", pr_number: 25178, scopes: ["greptimedb sink"], type: "feat", breaking_change: true, author: "Thomas", files_count: 12, insertions_count: 623, deletions_count: 273}, - {sha: "61cc4d84d2966e7552a308d5df5a0f03305d7eed", date: "2026-04-27 13:40:18 UTC", description: "make publish-s3 wait for generate-sha256sum", pr_number: 25265, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 1, deletions_count: 0}, - {sha: "454b096abcfd609b4e317b83fa4ec1ec79af5da8", date: "2026-04-27 14:14:28 UTC", description: "add datadog_metrics series v1 deprecation entry", pr_number: 25271, scopes: ["deprecations"], type: "docs", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 1, deletions_count: 0}, - {sha: "aa9265d6026f7d5998cada6a50e9c66790fbf054", date: "2026-04-27 14:47:04 UTC", description: "add dependabot config for scripts/environment/npm-tools", pr_number: 25175, scopes: ["deps"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 16, deletions_count: 0}, - {sha: "69fd3b6f7e544a3f4bbba1d6d7e882a67387b081", date: "2026-04-27 14:56:51 UTC", description: "bump github/codeql-action from 4.32.4 to 4.35.2", pr_number: 25280, scopes: ["ci"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 1, insertions_count: 1, deletions_count: 1}, - {sha: "413caac10f64475b509687000317e06e55de55e0", date: "2026-04-27 15:18:47 UTC", description: "allow dd-token federation to fail on fork PRs", pr_number: 25284, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 6, deletions_count: 1}, - {sha: "ba84da5d8965aef1d5eb5455dc9f4d723177e914", date: "2026-04-27 15:01:24 UTC", description: "bump actions/github-script from 7 to 9", pr_number: 25278, scopes: ["ci"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 6, insertions_count: 10, deletions_count: 10}, - {sha: "a4ea6de53b829e6ec66fadaddd78317f099207b9", date: "2026-04-27 15:34:31 UTC", description: "bump actions/upload-artifact from 7.0.0 to 7.0.1 in the artifact group across 1 directory", pr_number: 25276, scopes: ["ci"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 8, insertions_count: 15, deletions_count: 15}, - {sha: "1d4b6c2122b82997b808bba0527ec60dbb37a3ba", date: "2026-04-27 15:36:38 UTC", description: "Emit warn on unauthenticated request", pr_number: 25230, scopes: ["splunk_hec source"], type: "fix", breaking_change: false, author: "Josué AGBEKODO", files_count: 3, insertions_count: 35, deletions_count: 12}, - {sha: "156b832637c2f18b4d32fbb347e0e5f0919407d3", date: "2026-04-27 18:33:20 UTC", description: "include page title in docs search query fields", pr_number: 25255, scopes: ["website"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 1, deletions_count: 1}, - {sha: "a843435f9677fe45f482ff4604bfe92b8a3d57c7", date: "2026-04-27 20:16:32 UTC", description: "Fix for issue causing stalling on shutdown for sinks configured w/ disk buffers", pr_number: 24949, scopes: ["topology"], type: "fix", breaking_change: false, author: "Rob Blafford", files_count: 7, insertions_count: 396, deletions_count: 111}, - {sha: "ff4754ab10da5838f68cc143e507087090518f91", date: "2026-04-28 14:04:28 UTC", description: "make nightly S3 verify resilient to CDN staleness", pr_number: 25259, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 17, deletions_count: 10}, - {sha: "6f3857906d3a54d9c05aa5d3aaa8b132ac8f5e6e", date: "2026-04-28 15:12:07 UTC", description: "restore stdlib functions in CLI and playground", pr_number: 25310, scopes: ["vrl"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 3, insertions_count: 10, deletions_count: 0}, - {sha: "23016adf7d87f41a3d887d587b21d3409e71e3fe", date: "2026-04-28 15:52:16 UTC", description: "fix release issue templates", pr_number: 25318, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 2, insertions_count: 4, deletions_count: 3}, - {sha: "96ad9edc5bd894029af95961ea205e0d89b17bf0", date: "2026-04-28 18:17:38 UTC", description: "improve docs search ranking for component pages", pr_number: 25319, scopes: ["website"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 5, deletions_count: 2}, - {sha: "ce6ca439caf80bd2af10864a84e949ef244e2163", date: "2026-04-28 19:40:29 UTC", description: "centralize `events_dropped` emission for batch encoding errors", pr_number: 25199, scopes: ["codecs"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 5, insertions_count: 153, deletions_count: 61}, - {sha: "d6cdf031d16a382a38046127fbc7ff30c2457709", date: "2026-04-28 21:40:45 UTC", description: "enable codecs-parquet in all release feature sets", pr_number: 25321, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 8, insertions_count: 186, deletions_count: 23}, - {sha: "233a35c47eab1a0691b39e4af06991dfe4b0f571", date: "2026-04-28 23:33:23 UTC", description: "correct cross-build artifact name and path", pr_number: 25282, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 2, deletions_count: 2}, - {sha: "8b465f6406fd088302d42f7e879297937bb8783f", date: "2026-04-29 17:44:41 UTC", description: "bump the patches group across 1 directory with 13 updates", pr_number: 25283, scopes: ["deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 6, insertions_count: 293, deletions_count: 155}, - {sha: "75b9d07a8231e7c321652e4ff031d8ce0757d9ab", date: "2026-04-29 19:57:15 UTC", description: "improve search ranking for component reference pages", pr_number: 25327, scopes: ["website"], type: "feat", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 44, deletions_count: 6}, - {sha: "625c1d3a57a59784da7b1e42b2318d4c372649d8", date: "2026-04-29 20:06:31 UTC", description: "bump the serde group across 1 directory with 2 updates", pr_number: 25227, scopes: ["deps"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 16, insertions_count: 71, deletions_count: 26}, - {sha: "b5fb618eb24bade72d5277be6d23836810d24fa8", date: "2026-04-30 21:53:00 UTC", description: "remove unused update_counter macro", pr_number: 25333, scopes: ["dev"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 0, deletions_count: 44}, - {sha: "bd8ab1a245a439134b2bd9f2cb540ca550db860c", date: "2026-05-01 13:30:24 UTC", description: "introduce RetryStrategy / Config for http based sinks", pr_number: 25057, scopes: ["sinks"], type: "feat", breaking_change: false, author: "Andy", files_count: 32, insertions_count: 957, deletions_count: 59}, - {sha: "9c617a7b766dc95ea919384ff16da2654595f6a4", date: "2026-05-01 14:04:29 UTC", description: "grant issues:write to remove_wip_label workflow", pr_number: 25339, scopes: ["ci"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 1, deletions_count: 0}, - {sha: "308d2469b2e70153d3eafd20a647bf33a9d69d73", date: "2026-05-01 14:43:39 UTC", description: "prevent windows_event_log permanent freeze from signal-event lost wakeup", pr_number: 25195, scopes: ["sources"], type: "fix", breaking_change: false, author: "tot19", files_count: 3, insertions_count: 546, deletions_count: 112}, - {sha: "59a53b138d127fdca68d260628d1dc0035b3f711", date: "2026-05-01 17:43:39 UTC", description: "remove type-level default on StatusCode", pr_number: 25345, scopes: ["internal docs"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 13, insertions_count: 12, deletions_count: 13}, - {sha: "f1b2c3a3f14f59ab9615829852da6e65a7d2c512", date: "2026-05-01 17:06:42 UTC", description: "add windows_event_log source metadata", pr_number: 25337, scopes: ["sources"], type: "fix", breaking_change: false, author: "tot19", files_count: 2, insertions_count: 18, deletions_count: 2}, - {sha: "9f15e23943d4347a6f2171eaa97a921a5e58d457", date: "2026-05-01 17:56:58 UTC", description: "bump cue and add cue-build step to Check Cue docs", pr_number: 25346, scopes: ["ci"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 4, insertions_count: 9, deletions_count: 7}, - {sha: "7923556313d66be69e638022e10fe3fd13f468ac", date: "2026-05-01 18:57:31 UTC", description: "use dedicated batch_encoding types", pr_number: 25340, scopes: ["clickhouse sink", "aws_s3 sink"], type: "fix", breaking_change: false, author: "Flavio Cruz", files_count: 8, insertions_count: 147, deletions_count: 212}, - {sha: "e1c6139b9717f36027b0ac9fe4d20276da4da128", date: "2026-05-02 20:51:00 UTC", description: "introduce enums for metric names", pr_number: 25342, scopes: ["metrics"], type: "chore", breaking_change: false, author: "Thomas", files_count: 106, insertions_count: 1254, deletions_count: 711}, - {sha: "48be543ff3b84dfbd56a49cc6a0a0aac450bbceb", date: "2026-05-04 14:01:46 UTC", description: "scope HistogramName import to s3 module", pr_number: 25353, scopes: ["aws_sqs source"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 2, deletions_count: 1}, - {sha: "96db40ef65b0d1246f06581987e5b6428468edf0", date: "2026-05-04 17:47:01 UTC", description: "Make transform-related functions in aggregate & tag cardinality transforms public", pr_number: 25358, scopes: ["metrics"], type: "enhancement", breaking_change: false, author: "ArunPiduguDD", files_count: 2, insertions_count: 3, deletions_count: 3}, - {sha: "8073e93b48352f781aace209f816ac55280a8935", date: "2026-05-04 19:13:10 UTC", description: "rename WIP label workflows to docs review label", pr_number: 25355, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 3, insertions_count: 23, deletions_count: 10}, - {sha: "4524b52c921447dfca228338add190f0363b582e", date: "2026-05-04 23:08:38 UTC", description: "upgrade hickory-proto to 0.26.1, ignore RUSTSEC-2026-0119", pr_number: 25354, scopes: ["deps"], type: "chore", breaking_change: false, author: "Thomas", files_count: 5, insertions_count: 226, deletions_count: 240}, - {sha: "6c3116a6e0a1d44113e5e2ce0b7e5aeeef3db785", date: "2026-05-05 13:33:38 UTC", description: "retry apt fetches in deb-verify to reduce flakes", pr_number: 25367, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 2, deletions_count: 2}, - {sha: "95756d72356406d1a71625dbcc8f83e49f43947d", date: "2026-05-05 15:34:08 UTC", description: "dynamic rate for sample", pr_number: 25035, scopes: ["transforms"], type: "enhancement", breaking_change: false, author: "jh7459-gh", files_count: 5, insertions_count: 749, deletions_count: 61}, - {sha: "f7cc83e980e5af429ee040c07aab7f96dd70cb15", date: "2026-05-05 17:37:26 UTC", description: "adjust tocbot content tracking", pr_number: 25359, scopes: ["external docs"], type: "fix", breaking_change: false, author: "Aaron Zheng", files_count: 2, insertions_count: 6, deletions_count: 3}, - {sha: "bec3290d7806fbefc1923fd676bb865c95e7f115", date: "2026-05-05 17:39:34 UTC", description: "bump axios from 1.15.0 to 1.16.0 in /website", pr_number: 25369, scopes: ["website deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 1, insertions_count: 5, deletions_count: 5}, - {sha: "202c974c18a8bfdb8102f6f0a8c3580bd3e9e96a", date: "2026-05-05 18:00:29 UTC", description: "bump postcss from 8.5.6 to 8.5.14 in /website", pr_number: 25368, scopes: ["website deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 1, insertions_count: 3, deletions_count: 3}, - {sha: "92ee2b26923ea0eaf8c0b4c1bc0398c679a4b44d", date: "2026-05-06 03:49:05 UTC", description: "Add remove tag function for metrics which returns entire tag set", pr_number: 25361, scopes: ["metrics"], type: "enhancement", breaking_change: false, author: "ArunPiduguDD", files_count: 1, insertions_count: 33, deletions_count: 0}, - {sha: "249d064d75e5337efd1cd4fd2949de20e16d801e", date: "2026-05-06 12:36:13 UTC", description: "rewrite scripts/generate-component-docs.rb in Rust (#22350)", pr_number: 24781, scopes: ["dev"], type: "feat", breaking_change: false, author: "Swaraj Patil", files_count: 11, insertions_count: 1990, deletions_count: 1930}, - {sha: "e109afcff7b4d0d58bf710c797b5028c2d067250", date: "2026-05-06 15:19:22 UTC", description: "add docker run example in distribution README", pr_number: 25268, scopes: ["external"], type: "docs", breaking_change: false, author: "st-omarkhalid", files_count: 1, insertions_count: 12, deletions_count: 3}, - {sha: "66e25a90bec1e3b3def56f0c00ae49d8e71260e5", date: "2026-05-06 15:23:25 UTC", description: "use single agent to fix e2e datadog-metrics histogram flakiness", pr_number: 25363, scopes: ["tests"], type: "fix", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 26, deletions_count: 64}, - {sha: "e6c0e3f6c46dd38b3c601c473149e07f5b71eb9e", date: "2026-05-06 15:38:07 UTC", description: "add new databricks_zerobus for Databricks ingestion", pr_number: 24840, scopes: ["sinks"], type: "feat", breaking_change: false, author: "Flavio Cruz", files_count: 26, insertions_count: 3187, deletions_count: 32}, - {sha: "5112e0ae334120465b333c1777da38593a4b8c60", date: "2026-05-06 18:00:21 UTC", description: "bump openssl from 0.10.78 to 0.10.79", pr_number: 25380, scopes: ["deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 2, insertions_count: 9, deletions_count: 10}, - {sha: "27e74de2d2daa8368e4b073fa90d443eb7974ba2", date: "2026-05-06 20:34:22 UTC", description: "bump docker/login-action from 4.0.0 to 4.1.0", pr_number: 25349, scopes: ["ci"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 4, insertions_count: 6, deletions_count: 6}, - {sha: "8105f31eef65e4e3d823f382d05d63e433394777", date: "2026-05-06 21:26:46 UTC", description: "add code coverage collection for integration and e2e test suites", pr_number: 25088, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 15, insertions_count: 353, deletions_count: 46}, - {sha: "bfeb76986acc74ad7c28acd2c60053d3cbdeb2bd", date: "2026-05-07 15:26:32 UTC", description: "support second-stage framing and decoding", pr_number: 25312, scopes: ["splunk_hec source"], type: "feat", breaking_change: false, author: "Thomas", files_count: 7, insertions_count: 2683, deletions_count: 219}, - {sha: "17a720cc90ebbbab9051eb5a2479a51eddf2760d", date: "2026-05-07 16:23:08 UTC", description: "remove release-flags.sh", pr_number: 24828, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 7, insertions_count: 4, deletions_count: 24}, - {sha: "256b8fa98627f37f26d6e11a84bfeda44981fc21", date: "2026-05-07 17:52:19 UTC", description: "skip Windows UDP-excluded ports in next_addr_for_ip", pr_number: 25386, scopes: ["tests"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 10, deletions_count: 0}, - {sha: "8d83e1790cf3337f8db56c0920e629866e7a1362", date: "2026-05-07 18:03:02 UTC", description: "bump hickory-net from 0.26.0 to 0.26.1", pr_number: 25389, scopes: ["deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 1, insertions_count: 12, deletions_count: 12}, - {sha: "bbde98b342fff4d69ccc49d537feda9572c9df79", date: "2026-05-08 14:20:34 UTC", description: "fix LTO settings after release-flags.sh removal", pr_number: 25393, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 3, deletions_count: 2}, - {sha: "cdb27e859b95fda129cfbed5e2b078af0f3c42c9", date: "2026-05-08 14:36:09 UTC", description: "kill Ruby and port release scripts to native vdev", pr_number: 25379, scopes: ["dev"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 36, insertions_count: 2616, deletions_count: 1806}, - {sha: "5cedf015de0c07d9f7e6f0023264279fcf986a40", date: "2026-05-08 15:06:43 UTC", description: "fix wording in decoder and framing doc strings", pr_number: 25382, scopes: ["codecs"], type: "docs", breaking_change: false, author: "Thomas", files_count: 32, insertions_count: 639, deletions_count: 712}, - {sha: "d9b06937242d4e5f484362fab6c0506b3676347f", date: "2026-05-08 15:09:03 UTC", description: "Add zstd compression support", pr_number: 24917, scopes: ["vector sink"], type: "feat", breaking_change: false, author: "Jonathan Davies", files_count: 14, insertions_count: 528, deletions_count: 72}, - {sha: "e59ac5715d4c8cc63b2e9076d19c4ef0429a2b4e", date: "2026-05-08 15:12:02 UTC", description: "Clarify acknowledgement guarantees with disk buffers", pr_number: 25388, scopes: ["external docs"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 7, deletions_count: 2}, - {sha: "39138e0e7b73a3b1d4f9dd7f0617343c3afd42ca", date: "2026-05-08 15:27:00 UTC", description: "add /ci-run-regression trigger + accept refs in inputs", pr_number: 25245, scopes: ["ci"], type: "feat", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 85, deletions_count: 43}, - {sha: "4ff1874b38008c15afeb61902298b36593a727bb", date: "2026-05-08 16:43:29 UTC", description: "emit channel-suffixed version from publish-metadata", pr_number: 25395, scopes: ["vdev"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 4, deletions_count: 3}, - {sha: "41bc804eab5590ccb44084512eb05b4a5612e2b7", date: "2026-05-08 16:49:29 UTC", description: "replace bootstrap scripts with setup action in publish workflows", pr_number: 25311, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 56, deletions_count: 21}, - {sha: "0d9111807bc7abb24ff53ef8590b8ca3ba4d8834", date: "2026-05-08 17:41:34 UTC", description: "bump vrl to latest main", pr_number: 25398, scopes: ["deps"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 5, insertions_count: 19, deletions_count: 15}, - {sha: "63b29fb2d8d80b5be57a897e14c8d29ed23d5663", date: "2026-05-08 18:38:00 UTC", description: "skip dd-sts federation on fork PRs via ACTIONS_ID_TOKEN_REQUEST_URL guard", pr_number: 25399, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 14, deletions_count: 2}, - {sha: "81f013820839be8ab0cc28069ab943c44f0f28cb", date: "2026-05-08 19:03:05 UTC", description: "use debug profile for k8s e2e build", pr_number: 25397, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 3, insertions_count: 12, deletions_count: 10}, - {sha: "f3346607ba25645a682b4b5bbc56d95a7f4bb4dd", date: "2026-05-08 19:11:30 UTC", description: "make -D warnings the default via .cargo/config.toml", pr_number: 25400, scopes: ["dev"], type: "chore", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 2, deletions_count: 20}, - {sha: "f2f19212bb5cee15615c8d86658447a4ac096729", date: "2026-05-08 19:18:40 UTC", description: "pass client certificates to rumqttc for mTLS", pr_number: 24929, scopes: ["mqtt source"], type: "fix", breaking_change: false, author: "Martin Ruderer", files_count: 2, insertions_count: 4, deletions_count: 1}, - {sha: "eda5b866e83cf5e0e926cae8ecf89c00a3109dc8", date: "2026-05-08 22:39:20 UTC", description: "fix flaky `initial_size_correct_with_multievents` test", pr_number: 25239, scopes: ["tests"], type: "fix", breaking_change: false, author: "Vitalii Parfonov", files_count: 1, insertions_count: 32, deletions_count: 7}, - {sha: "c3676b9fa8aef8088bd341775416e4ecd91095b2", date: "2026-05-08 23:11:57 UTC", description: "centralize CARGO_INCREMENTAL=0 in setup action", pr_number: 25401, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 6, insertions_count: 2, deletions_count: 7}, - {sha: "4ddc412437c69cfa6d3b5184ff3abab7e3d75008", date: "2026-05-11 14:52:29 UTC", description: "Add setting for per-metric vs global tag cardinality tracking", pr_number: 25372, scopes: ["tag_cardinality_limit transform"], type: "enhancement", breaking_change: false, author: "ArunPiduguDD", files_count: 7, insertions_count: 385, deletions_count: 45}, - {sha: "11f1dff407534822b90d4690e446d718867d6baf", date: "2026-05-11 18:55:00 UTC", description: "include lib/ workspace crates in coverage reports", pr_number: 25402, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 1, deletions_count: 0}, - {sha: "7efd6d7b53185a2997b81b2ef8fff4162d6c6506", date: "2026-05-11 20:19:41 UTC", description: "remove cargo vdev test --container runner", pr_number: 25410, scopes: ["dev"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 2, insertions_count: 6, deletions_count: 43}, - {sha: "e38ef0cab69d8dbd02deaadbd63870aafd77081b", date: "2026-05-12 13:53:04 UTC", description: "warn about log namespace with disk buffers", pr_number: 25413, scopes: ["external docs"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 3, insertions_count: 39, deletions_count: 1}, - {sha: "fc6a2b567f08a9c229e8a4b7584d6f30e1da1c9f", date: "2026-05-12 13:58:10 UTC", description: "make regression/Dockerfile self-contained", pr_number: 25411, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 29, deletions_count: 1}, - {sha: "d06def7be6c4ac1e29e46c73f94ea3d9f99b9997", date: "2026-05-12 20:06:08 UTC", description: "bump @babel/plugin-transform-modules-systemjs from 7.28.5 to 7.29.4 in /website", pr_number: 25403, scopes: ["website deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 1, insertions_count: 85, deletions_count: 6}, - {sha: "10de0ea6c6871d14d06b741d457d3cfab3676d67", date: "2026-05-12 20:32:17 UTC", description: "publish to crates.io on tag push", pr_number: 25420, scopes: ["vdev"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 21, deletions_count: 0}, - {sha: "dce3678640998bdbaedd67a4f5c4ddea588dd3af", date: "2026-05-12 20:43:00 UTC", description: "bump version to 0.3.3", pr_number: 25419, scopes: ["vdev"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 2, insertions_count: 2, deletions_count: 2}, - {sha: "fe3871fd15e8cc07a132aba2413f4c8efa69f983", date: "2026-05-13 01:42:02 UTC", description: "bump markdownlint-cli2 to 0.22.1 and remove smol-toml override", pr_number: 25416, scopes: ["deps"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 10, deletions_count: 15}, - {sha: "c60bc0a68c30eecdf8698eddec3ee7e3c7393fbb", date: "2026-05-13 16:46:40 UTC", description: "install vdev via binstall", pr_number: 25418, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 5, insertions_count: 42, deletions_count: 90}, - {sha: "c3720d863abc606cef5c117486b6ced03f8cf134", date: "2026-05-13 17:18:52 UTC", description: "remove default OS package config", pr_number: 25425, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 7, insertions_count: 28, deletions_count: 15}, - {sha: "904f69f81c68826a982d351cc08335cea9afab5b", date: "2026-05-13 20:35:46 UTC", description: "warn on invalid json batching", pr_number: 25423, scopes: ["opentelemetry sink"], type: "enhancement", breaking_change: false, author: "Pavlos Rontidis", files_count: 2, insertions_count: 29, deletions_count: 2}, - {sha: "338fc3805f131ca9281baadccb05e4ff8ac26111", date: "2026-05-13 21:06:03 UTC", description: "restore Vector RPM/DEB install on EL8 family", pr_number: 25387, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 5, insertions_count: 116, deletions_count: 18}, - {sha: "989f2ae0af0aa3da2691cfc78f675601178edadf", date: "2026-05-13 21:38:33 UTC", description: "pass GITHUB_TOKEN to prepare.sh for authenticated binstall requests", pr_number: 25428, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 2, deletions_count: 0}, - {sha: "e1772733754c4d069928169675791b2a484375a2", date: "2026-05-14 14:28:23 UTC", description: "retire the unused Docker dev environment", pr_number: 25429, scopes: ["dev"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 10, insertions_count: 102, deletions_count: 623}, - {sha: "45b6d2b8faa9d89005abefd5d6311db9d730cd0a", date: "2026-05-14 16:08:30 UTC", description: "Add more fine grained controls tag cardinality", pr_number: 25360, scopes: ["tag_cardinality_limit transform"], type: "enhancement", breaking_change: false, author: "ArunPiduguDD", files_count: 6, insertions_count: 747, deletions_count: 122}, - {sha: "11ad4e7df2f16203357c875557230905a94cfe0d", date: "2026-05-14 17:33:09 UTC", description: "clarify JEMALLOC_SYS_WITH_LG_PAGE comment", pr_number: 25435, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 4, deletions_count: 2}, - {sha: "45c4010e78a8470177061b8257648499ba1f61fe", date: "2026-05-14 19:33:52 UTC", description: "add \"View open issues\" link to component pages", pr_number: 25437, scopes: ["external docs"], type: "feat", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 14, deletions_count: 0}, - {sha: "a1a56fe123829ab224361648165973d6ba9a5292", date: "2026-05-14 20:04:48 UTC", description: "drop gssapi from default cargo feature", pr_number: 25256, scopes: ["deps"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 4, insertions_count: 35, deletions_count: 15}, - {sha: "ec27f907e50dacdc7d1124720f1b29dfe967aac7", date: "2026-05-14 20:20:46 UTC", description: "unify Dockerfile apt deps into one script", pr_number: 25436, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 3, insertions_count: 27, deletions_count: 33}, - {sha: "f06f820a9f66a6518e01f0d7a3d43b5a2826bd9b", date: "2026-05-14 20:32:54 UTC", description: "make libz.so.1 a consistent dynamic runtime dependency in distroless-libc", pr_number: 25434, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Thomas", files_count: 3, insertions_count: 10, deletions_count: 3}, - {sha: "f5643b687151a31c5494b46646068f1dece4df7b", date: "2026-05-15 13:36:52 UTC", description: "add deprecation.d fragment system with vdev check/show commands and release integration", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 18, insertions_count: 670, deletions_count: 27}, - {sha: "6d0e0c07a40a234ecb37b21a4b8d65b3f578621c", date: "2026-05-15 14:02:32 UTC", description: "wire deprecation check into changelog.yaml via bash script", pr_number: null, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 3, insertions_count: 116, deletions_count: 40}, - {sha: "411a95799077734160b680181a7ac919bc9823a7", date: "2026-05-15 14:14:57 UTC", description: "chore(ci): wire deprecation check into changelog.yaml via bash script", pr_number: null, scopes: [], type: "revert", breaking_change: false, author: "Thomas", files_count: 3, insertions_count: 40, deletions_count: 116}, - {sha: "f2b55c226e1b67dd502a3c0cb092f52d2bc95773", date: "2026-05-15 14:15:43 UTC", description: "use changes.yml and setup action for deprecation fragment check", pr_number: null, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 55, deletions_count: 26}, - {sha: "a42c0a4fc73a7bd881fa17d1f69a9d1af7333f88", date: "2026-05-15 14:16:47 UTC", description: "remove stale comment from deprecation workflow", pr_number: null, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 0, deletions_count: 9}, - {sha: "9e5a2eb22c0e8f4b3c1962fb63877e7a210db178", date: "2026-05-15 14:27:03 UTC", description: "add deprecations and planned_deprecations to release CUE schema", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 9, deletions_count: 0}, - {sha: "1196d69e0aaad8e4ffbe7d226aedbe2a715e22b7", date: "2026-05-15 14:29:43 UTC", description: "fix deprecation fragments to use deprecation_version not announcement_version", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 6, insertions_count: 5, deletions_count: 11}, - {sha: "d7b55a21986031413aec814390d47b39de944c0e", date: "2026-05-15 14:32:59 UTC", description: "restore announcement_version to deprecation fragments", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 6, insertions_count: 6, deletions_count: 0}, - {sha: "a0b1f0ff2ae17bd79063e6476d60472f15c93147", date: "2026-05-15 15:11:22 UTC", description: "make announcement_version required, add next version keyword, rewrite next on release", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 12, insertions_count: 171, deletions_count: 45}, - {sha: "37eba350d6ba591419c1e30a90099db0afbf0e73", date: "2026-05-15 15:15:48 UTC", description: "update deprecation docs and release template for new fragment fields", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 10, deletions_count: 7}, - {sha: "9659a52582a8cc94e110f9dc2dce45c82dc3d100", date: "2026-05-15 15:16:57 UTC", description: "sort deprecation show output by version", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 22, deletions_count: 1}, - {sha: "5ae8acdb5b2bd93d3d0504d6fbe01d9d99303bea", date: "2026-05-15 15:36:31 UTC", description: "fix announcement versions for azure_monitor_logs and datadog_metrics series v1", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 2, deletions_count: 2}, - {sha: "0b535c6ec1ae2881bed5d9c9ce8cf69eedc18a9e", date: "2026-05-15 15:41:49 UTC", description: "refine deprecation show output with grouped sections and next-release detection", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 86, deletions_count: 33}, - {sha: "d1eff3ad6d4854ffb53f968204277bc00e5c6d98", date: "2026-05-15 15:43:14 UTC", description: "add color and styling to deprecation show output", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 46, deletions_count: 14}, - {sha: "a2928a79209be19854cfb1d9e63fb8137536768d", date: "2026-05-15 15:44:08 UTC", description: "fix label alignment in deprecation show output", pr_number: null, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 1, deletions_count: 1}, - {sha: "b575eb9dbd10001627f27914154cf96802ac924d", date: "2026-05-15 15:45:00 UTC", description: "colour concrete next-minor version red same as next keyword", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 25, deletions_count: 31}, - {sha: "0c6d24703d0e7e8602520ba9e9ed15ef85aab6f9", date: "2026-05-15 15:46:49 UTC", description: "correct deprecation versions in fragments", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 6, deletions_count: 6}, - {sha: "986bc3222b4ba0337b66084e34a587976e9bed70", date: "2026-05-15 15:48:40 UTC", description: "expose generate-cue as standalone release subcommand", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 62, deletions_count: 0}, - {sha: "4ccc8cf603448f0e2590499a2169a4492aba8abc", date: "2026-05-15 16:30:34 UTC", description: "render deprecations and planned_deprecations on release pages", pr_number: null, scopes: ["external docs"], type: "feat", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 52, deletions_count: 0}, - {sha: "0723a0dac1cc9bd5d9992dea29f54cc6616c8ca6", date: "2026-05-15 16:45:59 UTC", description: "split deprecations into three buckets: enacted, announcing, planned", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 5, insertions_count: 79, deletions_count: 26}, - {sha: "8643b9ee251132c22e3668cd23e8eb3d0a0911b3", date: "2026-05-15 16:47:59 UTC", description: "fix clippy warnings in deprecation utils", pr_number: null, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Thomas", files_count: 3, insertions_count: 53, deletions_count: 35}, - {sha: "55fc56dce9625822817d6981bf16ad876537cf79", date: "2026-05-15 17:07:32 UTC", description: "in dry-run mode, create branches from current branch instead of master", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 7, deletions_count: 3}, - {sha: "99f0cf1face6d6d88d21539f623d043b8d464154", date: "2026-05-15 17:13:41 UTC", description: "resolve next to concrete version before rendering CUE and partitioning", pr_number: null, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 14, deletions_count: 0}, - {sha: "53367982cf50bc5deb233713210bf106d8757432", date: "2026-05-15 17:14:07 UTC", description: "rename VersionOrTbd->DeprecationVersion", pr_number: null, scopes: ["vdev"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 39, deletions_count: 37}, - {sha: "923269d197176275cc518a1be5f27fa4540758d1", date: "2026-05-15 17:19:52 UTC", description: "hide TBD removal date on release deprecation sections", pr_number: null, scopes: ["external docs"], type: "feat", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 3, deletions_count: 3}, - {sha: "9bc543d11370b551176c78481a014dcc3fc07a67", date: "2026-05-15 17:23:23 UTC", description: "remove leading 'The' from deprecation what fields", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 4, deletions_count: 4}, - ] -} From 8eb5b4279e4b630548137f6edbcc502a2d1ce282 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 13:46:27 -0400 Subject: [PATCH 30/85] fix(releasing): fix insert_block_after_changelog to target the changelog array not the first ] --- vdev/src/commands/release/prepare.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/vdev/src/commands/release/prepare.rs b/vdev/src/commands/release/prepare.rs index 6bd5b0b8a275d..c1429759c0d7b 100644 --- a/vdev/src/commands/release/prepare.rs +++ b/vdev/src/commands/release/prepare.rs @@ -448,12 +448,17 @@ fn format_vrl_changelog_block(changelog: &str) -> String { fn insert_block_after_changelog(original: &str, block: &str) -> String { let mut result = Vec::new(); let mut inserted = false; + let mut in_changelog = false; for line in original.lines() { result.push(line.to_string()); - // Insert *after* the line containing only the closing `]` (end of changelog array) - if !inserted && line.trim() == "]" { + if line.trim_start().starts_with("changelog:") { + in_changelog = true; + } + + // Insert after the closing `]` of the changelog array specifically. + if !inserted && in_changelog && line.trim() == "]" { result.push(String::new()); // empty line before result.push(block.to_string()); inserted = true; From 9dabc01cea2e3eee0eb4720c23338b58360bf2f9 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 13:54:08 -0400 Subject: [PATCH 31/85] chore(internal docs): fix markdown table separator spacing in deprecation.d README --- deprecation.d/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deprecation.d/README.md b/deprecation.d/README.md index 2d1af2a0fb433..711be6a58e103 100644 --- a/deprecation.d/README.md +++ b/deprecation.d/README.md @@ -39,7 +39,7 @@ auth: ### Frontmatter fields | Field | Required | Description | -|-------|----------|-------------| +| ----- | -------- | ----------- | | `what` | Yes | Short one-line description of what is deprecated. | | `deprecation_version` | Yes | Version when the item will be removed. Accepts a semver string (`0.56`, `0.56.0`), `TBD` (unknown), or `next` (the very next release). | | `announcement_version` | Yes | Version when the deprecation was first announced. Accepts the same values as `deprecation_version`. Use `next` (recommended) when opening the PR — the release tooling will replace it with the concrete version automatically. | From 3b2a6f05b071dafb216fb8738e01412f0ba87560 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 13:59:10 -0400 Subject: [PATCH 32/85] chore(releasing): use gh CLI to fetch VRL release notes instead of unauthenticated GitHub API --- vdev/src/commands/release/prepare.rs | 80 ++++++++++++++-------------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/vdev/src/commands/release/prepare.rs b/vdev/src/commands/release/prepare.rs index c1429759c0d7b..15c24257138da 100644 --- a/vdev/src/commands/release/prepare.rs +++ b/vdev/src/commands/release/prepare.rs @@ -3,8 +3,7 @@ use crate::commands::release::generate_cue; use crate::utils::{command::run_command, git, paths}; -use anyhow::{Context, Result, anyhow}; -use reqwest::blocking::Client; +use anyhow::{Context, Result, anyhow, bail}; use semver::Version; use std::{ env, fs, @@ -13,7 +12,6 @@ use std::{ path::{Path, PathBuf}, process::Command, }; -use toml::Value; use toml_edit::DocumentMut; const ALPINE_PREFIX: &str = "FROM docker.io/alpine:"; @@ -469,53 +467,57 @@ fn insert_block_after_changelog(original: &str, block: &str) -> String { } fn get_latest_vrl_tag_and_changelog() -> Result { - let client = Client::new(); - - // Step 1: Get latest tag from GitHub API - let tags_url = "https://api.github.com/repos/vectordotdev/vrl/tags"; - let tags_response = client - .get(tags_url) - .header("User-Agent", "rust-reqwest") // GitHub API requires User-Agent - .send()? - .text()?; - - let tags: Vec = serde_json::from_str(&tags_response)?; - let latest_tag = tags - .first() - .and_then(|tag| tag.get("name")) - .and_then(|name| name.as_str()) - .ok_or_else(|| anyhow!("Failed to extract latest tag"))? - .to_string(); - - // Step 2: Download CHANGELOG.md for the specific tag - let changelog_url = - format!("https://raw.githubusercontent.com/vectordotdev/vrl/{latest_tag}/CHANGELOG.md",); - let changelog = client - .get(&changelog_url) - .header("User-Agent", "rust-reqwest") - .send()? - .text()?; - - // Step 3: Extract text from first ## to next ## - let lines: Vec<&str> = changelog.lines().collect(); + // Step 1: get the latest tag + let tag_output = Command::new("gh") + .args(["api", "repos/vectordotdev/vrl/tags", "--jq", ".[0].name"]) + .output() + .context("Failed to run `gh api` for VRL tags")?; + + if !tag_output.status.success() { + let stderr = String::from_utf8_lossy(&tag_output.stderr); + bail!("gh api tags failed: {stderr}"); + } + + let tag = String::from_utf8(tag_output.stdout) + .context("gh api output is not valid UTF-8")?; + let tag = tag.trim().to_string(); + + // Step 2: fetch CHANGELOG.md for that tag + let changelog_output = Command::new("gh") + .args([ + "api", + &format!("repos/vectordotdev/vrl/contents/CHANGELOG.md?ref={tag}"), + "-H", + "Accept: application/vnd.github.raw+json", + ]) + .output() + .context("Failed to run `gh api` for VRL CHANGELOG.md")?; + + if !changelog_output.status.success() { + let stderr = String::from_utf8_lossy(&changelog_output.stderr); + bail!("gh api CHANGELOG.md failed: {stderr}"); + } + + let changelog = String::from_utf8(changelog_output.stdout) + .context("CHANGELOG.md is not valid UTF-8")?; + + // Extract the first release section (from the first ## to the next ##) let mut section = Vec::new(); let mut found_first = false; - - for line in lines { + for line in changelog.lines() { if line.starts_with("## ") { if found_first { - section.push(line.to_string()); break; } found_first = true; - section.push(line.to_string()); - } else if found_first { - section.push(line.to_string()); + } + if found_first { + section.push(line); } } if !found_first { - return Err(anyhow!("No ## headers found in CHANGELOG.md")); + bail!("No ## headers found in VRL CHANGELOG.md"); } Ok(section.join("\n")) From 62479c0fe77ab9b1c1ff0a98cfb8bb61380a9b9c Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 14:03:36 -0400 Subject: [PATCH 33/85] chore(website): add generated files --- website/content/en/releases/0.56.0.md | 4 + website/cue/reference/releases/0.56.0.cue | 509 ++++++++++++++++++++++ 2 files changed, 513 insertions(+) create mode 100644 website/content/en/releases/0.56.0.md create mode 100644 website/cue/reference/releases/0.56.0.cue diff --git a/website/content/en/releases/0.56.0.md b/website/content/en/releases/0.56.0.md new file mode 100644 index 0000000000000..83e693e3434d9 --- /dev/null +++ b/website/content/en/releases/0.56.0.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.56.0 release notes +weight: 35 +--- diff --git a/website/cue/reference/releases/0.56.0.cue b/website/cue/reference/releases/0.56.0.cue new file mode 100644 index 0000000000000..5231b9ec73589 --- /dev/null +++ b/website/cue/reference/releases/0.56.0.cue @@ -0,0 +1,509 @@ +package metadata + +releases: "0.56.0": { + date: "2026-05-15" + codename: "" + + whats_next: [] + + deprecations: [ + { + what: "Boolean syntax for the `compression` field in the `vector` sink" + deprecation_version: "0.56.0" + announcement_version: "0.56.0" + description: #""" + The boolean syntax (`compression: true` / `compression: false`) is deprecated. + Use the string syntax instead: `compression: "gzip"`, `compression: "zstd"`, or `compression: "none"`. + + The `bool_or_vector_compression` deserializer will be removed once the boolean syntax is no longer supported. + """# + }, + { + what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" + deprecation_version: "0.56.0" + announcement_version: "0.55.0" + description: #""" + The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. + Users must upgrade their GreptimeDB instance to v1.x before upgrading Vector. + """# + }, + ] + + deprecation_announcements: [ + { + what: "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]" + deprecation_version: "0.58.0" + announcement_version: "0.56.0" + description: #""" + This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging. + """# + }, + ] + + planned_deprecations: [ + { + what: "`azure_monitor_logs` sink" + deprecation_version: "0.58.0" + announcement_version: "0.54.0" + description: #""" + The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink, + which uses the Azure Monitor Logs Ingestion API. + + Users should migrate before Microsoft ends support for the old Data Collector API (scheduled + for September 2026). + """# + }, + { + what: "`buffer_byte_size` and `buffer_events` gauge metrics" + deprecation_version: "TBD" + announcement_version: "0.53.0" + description: #""" + The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the + `buffer_size_bytes` and `buffer_size_events` metrics described in `docs/specs/buffer.md`. + """# + }, + { + what: "`series_api_version: v1` option on the `datadog_metrics` sink" + deprecation_version: "0.58.0" + announcement_version: "0.55.0" + description: #""" + The `series_api_version: v1` option is deprecated in favor of `v2` (the default). + The v1 series endpoint (`/api/v1/series`) is a legacy endpoint. + + Users should remove `series_api_version: v1` from their configuration or set it to `v2`. + """# + }, + { + what: "`encoding` field on HTTP server sources" + deprecation_version: "TBD" + announcement_version: "0.50.0" + description: #""" + The `encoding` field will be removed. Use `decoding` and `framing` instead. + """# + }, + ] + + changelog: [ + { + type: "feat" + description: #""" + HTTP-based sinks that use the shared retry helpers now support a `retry_strategy` configuration + option to control which HTTP response codes are retried. The `http` sink also includes a new + example showing how to retry only specific transient status codes. + + Issue: https://github.com/vectordotdev/vector/issues/10870 + """# + contributors: ["ndrsg"] + }, + { + type: "enhancement" + description: #""" + HTTP-based sinks using the shared retry logic now classify transport-layer failures with + `HttpError::is_retriable`: connection and TLS connector issues may be retried, while failures + such as invalid HTTP request construction or an invalid proxy URI are not. Setting + `retry_strategy` to `none` disables retries for these transport errors and for request + timeouts, in addition to status-code-based retries. + + Issue: https://github.com/vectordotdev/vector/issues/10870 + """# + contributors: ["ndrsg"] + }, + { + type: "fix" + description: #""" + The default `/etc/vector/vector.yaml` config file is no longer installed by the Debian, RPM, Alpine, and distroless-static Docker packages. The previous default ran a `demo_logs` source and printed synthesized syslog lines to stdout, which then surfaced in journald or `/var/log/` on hosts running Vector as a service and was a common source of confusion. + + New installs will now have no active config on disk. Provide your own configuration at `/etc/vector/vector.yaml` (or pass `--config `) before starting Vector. A reference example is shipped at `/usr/share/vector/examples/vector.yaml`, and more sample configs remain at `/etc/vector/examples/`. + + Existing installs are unaffected on upgrade: package managers preserve the on-disk `/etc/vector/vector.yaml` if you already had one. + """# + contributors: ["pront"] + }, + { + type: "feat" + description: #""" + Unit tests now support an optional `expected_event_count` field on test outputs, allowing assertions on the number of events emitted by a transform. + """# + contributors: ["pront"] + }, + { + type: "enhancement" + description: #""" + The `vector` sink now supports `zstd` compression in addition to `gzip`. This provides better + compression ratios and performance for Vector-to-Vector communication. + + The compression configuration has been enhanced to support multiple algorithms while maintaining + full backward compatibility: + + ## Legacy boolean syntax (still supported) + + ```yaml + sinks: + my_vector: + type: vector + address: "localhost:6000" + compression: true # Uses gzip (default) + # or + compression: false # No compression + ``` + + ## New string syntax + + ```yaml + sinks: + my_vector: + type: vector + address: "localhost:6000" + compression: "zstd" # Use zstd compression + # Supported values: "none", "gzip", "zstd" + ``` + + The Vector source automatically accepts both gzip and zstd compressed data, enabling seamless + communication between Vector instances using different compression algorithms. + """# + contributors: ["jpds"] + }, + { + type: "feat" + description: #""" + Add a new `databricks_zerobus` sink that streams log data to Databricks Unity Catalog tables via the Zerobus ingestion service. Supports OAuth 2.0 authentication, automatic schema fetching from Unity Catalog, and protobuf batch encoding. + """# + contributors: ["flaviocruz"] + }, + { + type: "fix" + description: #""" + The shared gRPC decompression layer now rejects request frames that set the + compressed flag without a negotiated `grpc-encoding` (e.g. `identity` or a + missing header). Previously such malformed frames were silently decoded as + gzip, which could mask client/server compression-negotiation bugs. + """# + contributors: ["jpds"] + }, + { + type: "enhancement" + description: #""" + The `opentelemetry` source's gRPC OTLP receiver now accepts `zstd`-compressed + requests in addition to `gzip`, matching the compression schemes advertised via + the `grpc-accept-encoding` response header. No configuration change is required; + clients can send OTLP payloads with `grpc-encoding: zstd` and they will be + transparently decompressed. + """# + contributors: ["jpds"] + }, + { + type: "fix" + description: #""" + Fixed issue during in place reload of a sink with a disk buffer configured, where + the component would stall for batch.timeout_sec before gracefully reloading. + This fix also resolves issues Vector had where it would ignore SIGINT during + cases where the pipeline stall had occurred. + """# + contributors: ["graphcareful"] + }, + { + type: "fix" + description: #""" + The `windows_event_log` source no longer freezes after periods of inactivity. + """# + contributors: ["tot19"] + }, + { + type: "fix" + description: #""" + Sinks using batch encoding (Parquet, Arrow IPC) now consistently emit `ComponentEventsDropped` for every encode failure path. Previously some `build_record_batch` failures (notably type mismatches) dropped events silently. A new `EncoderRecordBatchError` internal event also reports `component_errors_total` with `error_code="arrow_json_decode"` or `"arrow_record_batch_creation"` at `stage="sending"` for granular alerting. + """# + contributors: ["pront"] + }, + { + type: "fix" + description: #""" + The error log + metric that `splunk_hec` source emit on missing/invalid auth header now specifies "authentication_failed" as error_type. + """# + contributors: ["20agbekodo"] + }, + { + type: "fix" + description: #""" + Restored support for installing Vector on RHEL 8, Rocky Linux 8, AlmaLinux 8, and CentOS Stream 8, which had been broken since v0.55.0 due to an inadvertent glibc requirement bump. + """# + contributors: ["pront"] + }, + { + type: "fix" + description: #""" + Restored the full VRL stdlib, including `get_env_var`, in the standalone VRL CLI and web playground by default. + """# + contributors: ["pront"] + }, + { + type: "fix" + description: #""" + Parquet encoding in the `aws_s3` sink (`batch_encoding`) now works out of the box in the official release binaries. Previously it required compiling Vector from source with the `codecs-parquet` feature. + """# + contributors: ["pront"] + }, + { + type: "fix" + description: #""" + The `windows_event_log` source now adds standard source metadata, including `source_type`, to emitted log events. + """# + contributors: ["tot19"] + }, + { + type: "fix" + description: #""" + The `aws_s3` and `clickhouse` sinks now correctly advertise only the `batch_encoding.codec` values they actually support: `parquet` for `aws_s3` and `arrow_stream` for `clickhouse`. Previously the documentation and configuration schema listed both codecs for both sinks, even though picking the wrong one produced a startup error. + """# + contributors: ["flaviofcruz"] + }, + { + type: "fix" + description: #""" + The text content generated by the `demo_logs` source has changed: the + pool of fake usernames and the pool of fake domain TLDs are now both + defined inside Vector rather than pulled from an external crate. The + line formats (`apache_common`, `apache_error`, `json`, `syslog`, + `bsd_syslog`) are unchanged. If any of your tests or downstream + pipelines assert on specific generated usernames or TLDs, please + update those expectations. + """# + contributors: ["pront"] + }, + { + type: "chore" + description: #""" + The `greptimedb_metrics` and `greptimedb_logs` sinks now require GreptimeDB v1.x. Users running GreptimeDB v0.x must upgrade their GreptimeDB instance before upgrading Vector. + """# + contributors: ["thomasqueirozb"] + }, + { + type: "fix" + description: #""" + Fixed a bug in the `mqtt` source where user-provided TLS client certificates (`crt_file` / `key_file`) were being silently ignored, breaking mTLS connections to strict brokers like AWS IoT Core. + """# + contributors: ["mr-"] + }, + { + type: "feat" + description: #""" + Added `ratio_field` and `rate_field` options to the `sample` transform to support dynamic per-event sampling, while requiring static `rate` or `ratio` fallback configuration and disallowing `ratio_field` and `rate_field` together. + """# + contributors: ["jhammer"] + }, + { + type: "enhancement" + description: #""" + Bumped `serde_json` to `1.0.149` and `serde_with` to `3.18.0`. `serde_json` switched its float-to-string formatter from Ryū to Żmij in `1.0.147`, so floats serialized via the `native_json` codec may render with slightly different textual form (for example `1e+16` instead of `1e16`). The change is purely cosmetic: parsed `f32`/`f64` values round-trip identically, and Vector-to-Vector communication between old and new versions is unaffected. + """# + contributors: ["pront"] + }, + { + type: "enhancement" + description: #""" + The `splunk_hec` source now accepts optional per-endpoint codec configuration via `event: { framing, decoding }` and `raw: { framing, decoding }`. When `decoding` is set on an endpoint, Vector applies a second decoding pass after the HEC envelope is parsed: on `/services/collector/event` the envelope's `event` field is fed through the codec, and on `/services/collector/raw` the request body is fed through the codec directly. A single payload can fan out to multiple events. + + For example, to decode JSON payloads in `/event` requests while splitting `/raw` bodies on newlines: + + ```yaml + sources: + hec: + type: splunk_hec + address: 0.0.0.0:8088 + event: + decoding: + codec: json + raw: + framing: + method: newline_delimited + decoding: + codec: bytes + ``` + """# + contributors: ["thomasqueirozb"] + }, + { + type: "enhancement" + description: #""" + The `tag_cardinality_limit` transform gained two new configuration capabilities: + + - **Per-tag overrides** (`per_tag_limits`): configure cardinality limits per tag key within a metric, or exclude individual tags from tracking. + - **Metric exclusion**: opt entire metrics out of cardinality tracking via `mode: excluded` in `per_metric_limits`. + """# + contributors: ["ArunPiduguDD"] + }, + { + type: "enhancement" + description: #""" + The `tag_cardinality_limit` transform gained two new settings: + + - **`tracking_scope`**: isolate tag tracking per metric (`per_metric`) instead of sharing a single bucket across all metrics (`global`, the default). + - **`max_tracked_keys`**: cap the total number of tag keys tracked to bound memory usage. + """# + contributors: ["ArunPiduguDD"] + }, + ] + + vrl_changelog: """ + ### [0.32.0 (2026-04-16)] + + #### New Features + + - Added a new `encode_csv` function that encodes an array of values into a CSV-formatted string. This is the inverse of the existing `parse_csv` function and supports an optional single-byte delimiter (defaults to `,`). + + authors: armleth (https://github.com/vectordotdev/vrl/pull/1649) + - Added `to_entries` and `from_entries` with jq-compatible behavior: `to_entries` supports both objects and arrays, and `from_entries` accepts `key`/`Key`/`name`/`Name` and `value`/`Value` aliases. + + authors: close2code-palm (https://github.com/vectordotdev/vrl/pull/1653) + + #### Enhancements + + - Added `except` parameter to `flatten` function to exclude specific keys from being flattened. + + authors: benjamin-awd (https://github.com/vectordotdev/vrl/pull/1682) + + #### Fixes + + - Fixed a bug where the REPL input validator was executing programs instead of only compiling them, causing functions with side effects (e.g. `http_request`) to run twice per submission. + + authors: prontidis (https://github.com/vectordotdev/vrl/pull/1701) + + """ + + commits: [ + {sha: "1c70988b54156abf8d031538f0f81f28e7c0a0e4", date: "2026-04-21 17:00:33 UTC", description: "restore HTTP GET /health endpoint", pr_number: 25234, scopes: ["api"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 6, insertions_count: 162, deletions_count: 11}, + {sha: "aafd4cb44f5649e692722b97d82973fea5509a41", date: "2026-04-21 18:21:39 UTC", description: "drop fakedata_generator, fix broken fake domains", pr_number: 25236, scopes: ["demo_logs source"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 6, insertions_count: 61, deletions_count: 26}, + {sha: "8cf773df0e3b219e40537119aa2b95b916342df2", date: "2026-04-22 18:31:21 UTC", description: "start 0.56.0 development cycle", pr_number: 25242, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 59, insertions_count: 786, deletions_count: 233}, + {sha: "f36ed0e2cebf36efdc7392aed0ed52ae28a29101", date: "2026-04-22 19:54:48 UTC", description: "render release date on per-version release page", pr_number: 25244, scopes: ["website"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 9, deletions_count: 0}, + {sha: "29b17aadc63fdd9a9bdc3b64bbd8f9c647844cdb", date: "2026-04-22 20:30:30 UTC", description: "skip re-adding WIP label on synchronize if already approved", pr_number: 25246, scopes: ["ci"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 29, deletions_count: 1}, + {sha: "d99899e2f9cb94c8d421270ada8688243402b5a1", date: "2026-04-22 20:41:08 UTC", description: "fix docs sidebar expand/collapse navigation", pr_number: 25238, scopes: ["website"], type: "fix", breaking_change: false, author: "shalk(xiao kun)", files_count: 1, insertions_count: 5, deletions_count: 2}, + {sha: "ecdaa50ac15e6a26e811bf21e3a6e33729bebb33", date: "2026-04-22 23:23:12 UTC", description: "verify choco package install after 5xx from feed", pr_number: 25116, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 4, deletions_count: 1}, + {sha: "f1557d68c8e7f36feb8e2d0c7a04286817c6bf9f", date: "2026-04-23 14:16:39 UTC", description: "add `expected_event_count` field to test outputs", pr_number: 25186, scopes: ["unit tests"], type: "feat", breaking_change: false, author: "Pavlos Rontidis", files_count: 5, insertions_count: 323, deletions_count: 11}, + {sha: "cfb942bf7d1983b9eeaeb93ba2f843a816d1db5d", date: "2026-04-23 17:39:22 UTC", description: "bump openssl from 0.10.75 to 0.10.78", pr_number: 25250, scopes: ["deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 2, insertions_count: 5, deletions_count: 5}, + {sha: "c0cdf2068f79176fd8af4dca9b27cabae5be3091", date: "2026-04-23 17:52:07 UTC", description: "extract unit tests into reusable workflow", pr_number: 25247, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 3, insertions_count: 125, deletions_count: 24}, + {sha: "f56f4fa7234440345d790a2b81c7aa880be831d8", date: "2026-04-23 20:29:50 UTC", description: "remove Chocolatey from Windows bootstrap", pr_number: 25254, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 2, insertions_count: 39, deletions_count: 40}, + {sha: "7428dc3f4b23c56f1f2eecf44b3f6b2532c28dac", date: "2026-04-24 18:40:53 UTC", description: "use dd-sts instead of DD_API_KEY", pr_number: 25235, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 11, insertions_count: 82, deletions_count: 12}, + {sha: "7815f26ef4f357c7e3e90048e4287728c9506423", date: "2026-04-24 18:43:56 UTC", description: "add Docker support for local development", pr_number: 25237, scopes: ["website"], type: "chore", breaking_change: false, author: "shalk(xiao kun)", files_count: 3, insertions_count: 83, deletions_count: 0}, + {sha: "74574a360112a4bb212915b896471320fb157b96", date: "2026-04-24 18:50:53 UTC", description: "add linux arm64 to publish matrix and bump to 0.3.2", pr_number: 25260, scopes: ["vdev"], type: "chore", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 5, deletions_count: 3}, + {sha: "3b043d33b95670ef1cbd2f5af274fa25ebb1db84", date: "2026-04-24 18:55:51 UTC", description: "add support for GreptimeDB v1.0.0", pr_number: 25178, scopes: ["greptimedb sink"], type: "feat", breaking_change: true, author: "Thomas", files_count: 12, insertions_count: 623, deletions_count: 273}, + {sha: "61cc4d84d2966e7552a308d5df5a0f03305d7eed", date: "2026-04-27 13:40:18 UTC", description: "make publish-s3 wait for generate-sha256sum", pr_number: 25265, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 1, deletions_count: 0}, + {sha: "454b096abcfd609b4e317b83fa4ec1ec79af5da8", date: "2026-04-27 14:14:28 UTC", description: "add datadog_metrics series v1 deprecation entry", pr_number: 25271, scopes: ["deprecations"], type: "docs", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 1, deletions_count: 0}, + {sha: "aa9265d6026f7d5998cada6a50e9c66790fbf054", date: "2026-04-27 14:47:04 UTC", description: "add dependabot config for scripts/environment/npm-tools", pr_number: 25175, scopes: ["deps"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 16, deletions_count: 0}, + {sha: "69fd3b6f7e544a3f4bbba1d6d7e882a67387b081", date: "2026-04-27 14:56:51 UTC", description: "bump github/codeql-action from 4.32.4 to 4.35.2", pr_number: 25280, scopes: ["ci"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 1, insertions_count: 1, deletions_count: 1}, + {sha: "413caac10f64475b509687000317e06e55de55e0", date: "2026-04-27 15:18:47 UTC", description: "allow dd-token federation to fail on fork PRs", pr_number: 25284, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 6, deletions_count: 1}, + {sha: "ba84da5d8965aef1d5eb5455dc9f4d723177e914", date: "2026-04-27 15:01:24 UTC", description: "bump actions/github-script from 7 to 9", pr_number: 25278, scopes: ["ci"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 6, insertions_count: 10, deletions_count: 10}, + {sha: "a4ea6de53b829e6ec66fadaddd78317f099207b9", date: "2026-04-27 15:34:31 UTC", description: "bump actions/upload-artifact from 7.0.0 to 7.0.1 in the artifact group across 1 directory", pr_number: 25276, scopes: ["ci"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 8, insertions_count: 15, deletions_count: 15}, + {sha: "1d4b6c2122b82997b808bba0527ec60dbb37a3ba", date: "2026-04-27 15:36:38 UTC", description: "Emit warn on unauthenticated request", pr_number: 25230, scopes: ["splunk_hec source"], type: "fix", breaking_change: false, author: "Josué AGBEKODO", files_count: 3, insertions_count: 35, deletions_count: 12}, + {sha: "156b832637c2f18b4d32fbb347e0e5f0919407d3", date: "2026-04-27 18:33:20 UTC", description: "include page title in docs search query fields", pr_number: 25255, scopes: ["website"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 1, deletions_count: 1}, + {sha: "a843435f9677fe45f482ff4604bfe92b8a3d57c7", date: "2026-04-27 20:16:32 UTC", description: "Fix for issue causing stalling on shutdown for sinks configured w/ disk buffers", pr_number: 24949, scopes: ["topology"], type: "fix", breaking_change: false, author: "Rob Blafford", files_count: 7, insertions_count: 396, deletions_count: 111}, + {sha: "ff4754ab10da5838f68cc143e507087090518f91", date: "2026-04-28 14:04:28 UTC", description: "make nightly S3 verify resilient to CDN staleness", pr_number: 25259, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 17, deletions_count: 10}, + {sha: "6f3857906d3a54d9c05aa5d3aaa8b132ac8f5e6e", date: "2026-04-28 15:12:07 UTC", description: "restore stdlib functions in CLI and playground", pr_number: 25310, scopes: ["vrl"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 3, insertions_count: 10, deletions_count: 0}, + {sha: "23016adf7d87f41a3d887d587b21d3409e71e3fe", date: "2026-04-28 15:52:16 UTC", description: "fix release issue templates", pr_number: 25318, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 2, insertions_count: 4, deletions_count: 3}, + {sha: "96ad9edc5bd894029af95961ea205e0d89b17bf0", date: "2026-04-28 18:17:38 UTC", description: "improve docs search ranking for component pages", pr_number: 25319, scopes: ["website"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 5, deletions_count: 2}, + {sha: "ce6ca439caf80bd2af10864a84e949ef244e2163", date: "2026-04-28 19:40:29 UTC", description: "centralize `events_dropped` emission for batch encoding errors", pr_number: 25199, scopes: ["codecs"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 5, insertions_count: 153, deletions_count: 61}, + {sha: "d6cdf031d16a382a38046127fbc7ff30c2457709", date: "2026-04-28 21:40:45 UTC", description: "enable codecs-parquet in all release feature sets", pr_number: 25321, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 8, insertions_count: 186, deletions_count: 23}, + {sha: "233a35c47eab1a0691b39e4af06991dfe4b0f571", date: "2026-04-28 23:33:23 UTC", description: "correct cross-build artifact name and path", pr_number: 25282, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 2, deletions_count: 2}, + {sha: "8b465f6406fd088302d42f7e879297937bb8783f", date: "2026-04-29 17:44:41 UTC", description: "bump the patches group across 1 directory with 13 updates", pr_number: 25283, scopes: ["deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 6, insertions_count: 293, deletions_count: 155}, + {sha: "75b9d07a8231e7c321652e4ff031d8ce0757d9ab", date: "2026-04-29 19:57:15 UTC", description: "improve search ranking for component reference pages", pr_number: 25327, scopes: ["website"], type: "feat", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 44, deletions_count: 6}, + {sha: "625c1d3a57a59784da7b1e42b2318d4c372649d8", date: "2026-04-29 20:06:31 UTC", description: "bump the serde group across 1 directory with 2 updates", pr_number: 25227, scopes: ["deps"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 16, insertions_count: 71, deletions_count: 26}, + {sha: "b5fb618eb24bade72d5277be6d23836810d24fa8", date: "2026-04-30 21:53:00 UTC", description: "remove unused update_counter macro", pr_number: 25333, scopes: ["dev"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 0, deletions_count: 44}, + {sha: "bd8ab1a245a439134b2bd9f2cb540ca550db860c", date: "2026-05-01 13:30:24 UTC", description: "introduce RetryStrategy / Config for http based sinks", pr_number: 25057, scopes: ["sinks"], type: "feat", breaking_change: false, author: "Andy", files_count: 32, insertions_count: 957, deletions_count: 59}, + {sha: "9c617a7b766dc95ea919384ff16da2654595f6a4", date: "2026-05-01 14:04:29 UTC", description: "grant issues:write to remove_wip_label workflow", pr_number: 25339, scopes: ["ci"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 1, deletions_count: 0}, + {sha: "308d2469b2e70153d3eafd20a647bf33a9d69d73", date: "2026-05-01 14:43:39 UTC", description: "prevent windows_event_log permanent freeze from signal-event lost wakeup", pr_number: 25195, scopes: ["sources"], type: "fix", breaking_change: false, author: "tot19", files_count: 3, insertions_count: 546, deletions_count: 112}, + {sha: "59a53b138d127fdca68d260628d1dc0035b3f711", date: "2026-05-01 17:43:39 UTC", description: "remove type-level default on StatusCode", pr_number: 25345, scopes: ["internal docs"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 13, insertions_count: 12, deletions_count: 13}, + {sha: "f1b2c3a3f14f59ab9615829852da6e65a7d2c512", date: "2026-05-01 17:06:42 UTC", description: "add windows_event_log source metadata", pr_number: 25337, scopes: ["sources"], type: "fix", breaking_change: false, author: "tot19", files_count: 2, insertions_count: 18, deletions_count: 2}, + {sha: "9f15e23943d4347a6f2171eaa97a921a5e58d457", date: "2026-05-01 17:56:58 UTC", description: "bump cue and add cue-build step to Check Cue docs", pr_number: 25346, scopes: ["ci"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 4, insertions_count: 9, deletions_count: 7}, + {sha: "7923556313d66be69e638022e10fe3fd13f468ac", date: "2026-05-01 18:57:31 UTC", description: "use dedicated batch_encoding types", pr_number: 25340, scopes: ["clickhouse sink", "aws_s3 sink"], type: "fix", breaking_change: false, author: "Flavio Cruz", files_count: 8, insertions_count: 147, deletions_count: 212}, + {sha: "e1c6139b9717f36027b0ac9fe4d20276da4da128", date: "2026-05-02 20:51:00 UTC", description: "introduce enums for metric names", pr_number: 25342, scopes: ["metrics"], type: "chore", breaking_change: false, author: "Thomas", files_count: 106, insertions_count: 1254, deletions_count: 711}, + {sha: "48be543ff3b84dfbd56a49cc6a0a0aac450bbceb", date: "2026-05-04 14:01:46 UTC", description: "scope HistogramName import to s3 module", pr_number: 25353, scopes: ["aws_sqs source"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 2, deletions_count: 1}, + {sha: "96db40ef65b0d1246f06581987e5b6428468edf0", date: "2026-05-04 17:47:01 UTC", description: "Make transform-related functions in aggregate & tag cardinality transforms public", pr_number: 25358, scopes: ["metrics"], type: "enhancement", breaking_change: false, author: "ArunPiduguDD", files_count: 2, insertions_count: 3, deletions_count: 3}, + {sha: "8073e93b48352f781aace209f816ac55280a8935", date: "2026-05-04 19:13:10 UTC", description: "rename WIP label workflows to docs review label", pr_number: 25355, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 3, insertions_count: 23, deletions_count: 10}, + {sha: "4524b52c921447dfca228338add190f0363b582e", date: "2026-05-04 23:08:38 UTC", description: "upgrade hickory-proto to 0.26.1, ignore RUSTSEC-2026-0119", pr_number: 25354, scopes: ["deps"], type: "chore", breaking_change: false, author: "Thomas", files_count: 5, insertions_count: 226, deletions_count: 240}, + {sha: "6c3116a6e0a1d44113e5e2ce0b7e5aeeef3db785", date: "2026-05-05 13:33:38 UTC", description: "retry apt fetches in deb-verify to reduce flakes", pr_number: 25367, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 2, deletions_count: 2}, + {sha: "95756d72356406d1a71625dbcc8f83e49f43947d", date: "2026-05-05 15:34:08 UTC", description: "dynamic rate for sample", pr_number: 25035, scopes: ["transforms"], type: "enhancement", breaking_change: false, author: "jh7459-gh", files_count: 5, insertions_count: 749, deletions_count: 61}, + {sha: "f7cc83e980e5af429ee040c07aab7f96dd70cb15", date: "2026-05-05 17:37:26 UTC", description: "adjust tocbot content tracking", pr_number: 25359, scopes: ["external docs"], type: "fix", breaking_change: false, author: "Aaron Zheng", files_count: 2, insertions_count: 6, deletions_count: 3}, + {sha: "bec3290d7806fbefc1923fd676bb865c95e7f115", date: "2026-05-05 17:39:34 UTC", description: "bump axios from 1.15.0 to 1.16.0 in /website", pr_number: 25369, scopes: ["website deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 1, insertions_count: 5, deletions_count: 5}, + {sha: "202c974c18a8bfdb8102f6f0a8c3580bd3e9e96a", date: "2026-05-05 18:00:29 UTC", description: "bump postcss from 8.5.6 to 8.5.14 in /website", pr_number: 25368, scopes: ["website deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 1, insertions_count: 3, deletions_count: 3}, + {sha: "92ee2b26923ea0eaf8c0b4c1bc0398c679a4b44d", date: "2026-05-06 03:49:05 UTC", description: "Add remove tag function for metrics which returns entire tag set", pr_number: 25361, scopes: ["metrics"], type: "enhancement", breaking_change: false, author: "ArunPiduguDD", files_count: 1, insertions_count: 33, deletions_count: 0}, + {sha: "249d064d75e5337efd1cd4fd2949de20e16d801e", date: "2026-05-06 12:36:13 UTC", description: "rewrite scripts/generate-component-docs.rb in Rust (#22350)", pr_number: 24781, scopes: ["dev"], type: "feat", breaking_change: false, author: "Swaraj Patil", files_count: 11, insertions_count: 1990, deletions_count: 1930}, + {sha: "e109afcff7b4d0d58bf710c797b5028c2d067250", date: "2026-05-06 15:19:22 UTC", description: "add docker run example in distribution README", pr_number: 25268, scopes: ["external"], type: "docs", breaking_change: false, author: "st-omarkhalid", files_count: 1, insertions_count: 12, deletions_count: 3}, + {sha: "66e25a90bec1e3b3def56f0c00ae49d8e71260e5", date: "2026-05-06 15:23:25 UTC", description: "use single agent to fix e2e datadog-metrics histogram flakiness", pr_number: 25363, scopes: ["tests"], type: "fix", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 26, deletions_count: 64}, + {sha: "e6c0e3f6c46dd38b3c601c473149e07f5b71eb9e", date: "2026-05-06 15:38:07 UTC", description: "add new databricks_zerobus for Databricks ingestion", pr_number: 24840, scopes: ["sinks"], type: "feat", breaking_change: false, author: "Flavio Cruz", files_count: 26, insertions_count: 3187, deletions_count: 32}, + {sha: "5112e0ae334120465b333c1777da38593a4b8c60", date: "2026-05-06 18:00:21 UTC", description: "bump openssl from 0.10.78 to 0.10.79", pr_number: 25380, scopes: ["deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 2, insertions_count: 9, deletions_count: 10}, + {sha: "27e74de2d2daa8368e4b073fa90d443eb7974ba2", date: "2026-05-06 20:34:22 UTC", description: "bump docker/login-action from 4.0.0 to 4.1.0", pr_number: 25349, scopes: ["ci"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 4, insertions_count: 6, deletions_count: 6}, + {sha: "8105f31eef65e4e3d823f382d05d63e433394777", date: "2026-05-06 21:26:46 UTC", description: "add code coverage collection for integration and e2e test suites", pr_number: 25088, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 15, insertions_count: 353, deletions_count: 46}, + {sha: "bfeb76986acc74ad7c28acd2c60053d3cbdeb2bd", date: "2026-05-07 15:26:32 UTC", description: "support second-stage framing and decoding", pr_number: 25312, scopes: ["splunk_hec source"], type: "feat", breaking_change: false, author: "Thomas", files_count: 7, insertions_count: 2683, deletions_count: 219}, + {sha: "17a720cc90ebbbab9051eb5a2479a51eddf2760d", date: "2026-05-07 16:23:08 UTC", description: "remove release-flags.sh", pr_number: 24828, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 7, insertions_count: 4, deletions_count: 24}, + {sha: "256b8fa98627f37f26d6e11a84bfeda44981fc21", date: "2026-05-07 17:52:19 UTC", description: "skip Windows UDP-excluded ports in next_addr_for_ip", pr_number: 25386, scopes: ["tests"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 10, deletions_count: 0}, + {sha: "8d83e1790cf3337f8db56c0920e629866e7a1362", date: "2026-05-07 18:03:02 UTC", description: "bump hickory-net from 0.26.0 to 0.26.1", pr_number: 25389, scopes: ["deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 1, insertions_count: 12, deletions_count: 12}, + {sha: "bbde98b342fff4d69ccc49d537feda9572c9df79", date: "2026-05-08 14:20:34 UTC", description: "fix LTO settings after release-flags.sh removal", pr_number: 25393, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 3, deletions_count: 2}, + {sha: "cdb27e859b95fda129cfbed5e2b078af0f3c42c9", date: "2026-05-08 14:36:09 UTC", description: "kill Ruby and port release scripts to native vdev", pr_number: 25379, scopes: ["dev"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 36, insertions_count: 2616, deletions_count: 1806}, + {sha: "5cedf015de0c07d9f7e6f0023264279fcf986a40", date: "2026-05-08 15:06:43 UTC", description: "fix wording in decoder and framing doc strings", pr_number: 25382, scopes: ["codecs"], type: "docs", breaking_change: false, author: "Thomas", files_count: 32, insertions_count: 639, deletions_count: 712}, + {sha: "d9b06937242d4e5f484362fab6c0506b3676347f", date: "2026-05-08 15:09:03 UTC", description: "Add zstd compression support", pr_number: 24917, scopes: ["vector sink"], type: "feat", breaking_change: false, author: "Jonathan Davies", files_count: 14, insertions_count: 528, deletions_count: 72}, + {sha: "e59ac5715d4c8cc63b2e9076d19c4ef0429a2b4e", date: "2026-05-08 15:12:02 UTC", description: "Clarify acknowledgement guarantees with disk buffers", pr_number: 25388, scopes: ["external docs"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 7, deletions_count: 2}, + {sha: "39138e0e7b73a3b1d4f9dd7f0617343c3afd42ca", date: "2026-05-08 15:27:00 UTC", description: "add /ci-run-regression trigger + accept refs in inputs", pr_number: 25245, scopes: ["ci"], type: "feat", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 85, deletions_count: 43}, + {sha: "4ff1874b38008c15afeb61902298b36593a727bb", date: "2026-05-08 16:43:29 UTC", description: "emit channel-suffixed version from publish-metadata", pr_number: 25395, scopes: ["vdev"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 4, deletions_count: 3}, + {sha: "41bc804eab5590ccb44084512eb05b4a5612e2b7", date: "2026-05-08 16:49:29 UTC", description: "replace bootstrap scripts with setup action in publish workflows", pr_number: 25311, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 56, deletions_count: 21}, + {sha: "0d9111807bc7abb24ff53ef8590b8ca3ba4d8834", date: "2026-05-08 17:41:34 UTC", description: "bump vrl to latest main", pr_number: 25398, scopes: ["deps"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 5, insertions_count: 19, deletions_count: 15}, + {sha: "63b29fb2d8d80b5be57a897e14c8d29ed23d5663", date: "2026-05-08 18:38:00 UTC", description: "skip dd-sts federation on fork PRs via ACTIONS_ID_TOKEN_REQUEST_URL guard", pr_number: 25399, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 14, deletions_count: 2}, + {sha: "81f013820839be8ab0cc28069ab943c44f0f28cb", date: "2026-05-08 19:03:05 UTC", description: "use debug profile for k8s e2e build", pr_number: 25397, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 3, insertions_count: 12, deletions_count: 10}, + {sha: "f3346607ba25645a682b4b5bbc56d95a7f4bb4dd", date: "2026-05-08 19:11:30 UTC", description: "make -D warnings the default via .cargo/config.toml", pr_number: 25400, scopes: ["dev"], type: "chore", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 2, deletions_count: 20}, + {sha: "f2f19212bb5cee15615c8d86658447a4ac096729", date: "2026-05-08 19:18:40 UTC", description: "pass client certificates to rumqttc for mTLS", pr_number: 24929, scopes: ["mqtt source"], type: "fix", breaking_change: false, author: "Martin Ruderer", files_count: 2, insertions_count: 4, deletions_count: 1}, + {sha: "eda5b866e83cf5e0e926cae8ecf89c00a3109dc8", date: "2026-05-08 22:39:20 UTC", description: "fix flaky `initial_size_correct_with_multievents` test", pr_number: 25239, scopes: ["tests"], type: "fix", breaking_change: false, author: "Vitalii Parfonov", files_count: 1, insertions_count: 32, deletions_count: 7}, + {sha: "c3676b9fa8aef8088bd341775416e4ecd91095b2", date: "2026-05-08 23:11:57 UTC", description: "centralize CARGO_INCREMENTAL=0 in setup action", pr_number: 25401, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 6, insertions_count: 2, deletions_count: 7}, + {sha: "4ddc412437c69cfa6d3b5184ff3abab7e3d75008", date: "2026-05-11 14:52:29 UTC", description: "Add setting for per-metric vs global tag cardinality tracking", pr_number: 25372, scopes: ["tag_cardinality_limit transform"], type: "enhancement", breaking_change: false, author: "ArunPiduguDD", files_count: 7, insertions_count: 385, deletions_count: 45}, + {sha: "11f1dff407534822b90d4690e446d718867d6baf", date: "2026-05-11 18:55:00 UTC", description: "include lib/ workspace crates in coverage reports", pr_number: 25402, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 1, deletions_count: 0}, + {sha: "7efd6d7b53185a2997b81b2ef8fff4162d6c6506", date: "2026-05-11 20:19:41 UTC", description: "remove cargo vdev test --container runner", pr_number: 25410, scopes: ["dev"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 2, insertions_count: 6, deletions_count: 43}, + {sha: "e38ef0cab69d8dbd02deaadbd63870aafd77081b", date: "2026-05-12 13:53:04 UTC", description: "warn about log namespace with disk buffers", pr_number: 25413, scopes: ["external docs"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 3, insertions_count: 39, deletions_count: 1}, + {sha: "fc6a2b567f08a9c229e8a4b7584d6f30e1da1c9f", date: "2026-05-12 13:58:10 UTC", description: "make regression/Dockerfile self-contained", pr_number: 25411, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 29, deletions_count: 1}, + {sha: "d06def7be6c4ac1e29e46c73f94ea3d9f99b9997", date: "2026-05-12 20:06:08 UTC", description: "bump @babel/plugin-transform-modules-systemjs from 7.28.5 to 7.29.4 in /website", pr_number: 25403, scopes: ["website deps"], type: "chore", breaking_change: false, author: "dependabot[bot]", files_count: 1, insertions_count: 85, deletions_count: 6}, + {sha: "10de0ea6c6871d14d06b741d457d3cfab3676d67", date: "2026-05-12 20:32:17 UTC", description: "publish to crates.io on tag push", pr_number: 25420, scopes: ["vdev"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 21, deletions_count: 0}, + {sha: "dce3678640998bdbaedd67a4f5c4ddea588dd3af", date: "2026-05-12 20:43:00 UTC", description: "bump version to 0.3.3", pr_number: 25419, scopes: ["vdev"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 2, insertions_count: 2, deletions_count: 2}, + {sha: "fe3871fd15e8cc07a132aba2413f4c8efa69f983", date: "2026-05-13 01:42:02 UTC", description: "bump markdownlint-cli2 to 0.22.1 and remove smol-toml override", pr_number: 25416, scopes: ["deps"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 10, deletions_count: 15}, + {sha: "c60bc0a68c30eecdf8698eddec3ee7e3c7393fbb", date: "2026-05-13 16:46:40 UTC", description: "install vdev via binstall", pr_number: 25418, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 5, insertions_count: 42, deletions_count: 90}, + {sha: "c3720d863abc606cef5c117486b6ced03f8cf134", date: "2026-05-13 17:18:52 UTC", description: "remove default OS package config", pr_number: 25425, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 7, insertions_count: 28, deletions_count: 15}, + {sha: "904f69f81c68826a982d351cc08335cea9afab5b", date: "2026-05-13 20:35:46 UTC", description: "warn on invalid json batching", pr_number: 25423, scopes: ["opentelemetry sink"], type: "enhancement", breaking_change: false, author: "Pavlos Rontidis", files_count: 2, insertions_count: 29, deletions_count: 2}, + {sha: "338fc3805f131ca9281baadccb05e4ff8ac26111", date: "2026-05-13 21:06:03 UTC", description: "restore Vector RPM/DEB install on EL8 family", pr_number: 25387, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 5, insertions_count: 116, deletions_count: 18}, + {sha: "989f2ae0af0aa3da2691cfc78f675601178edadf", date: "2026-05-13 21:38:33 UTC", description: "pass GITHUB_TOKEN to prepare.sh for authenticated binstall requests", pr_number: 25428, scopes: ["ci"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 2, deletions_count: 0}, + {sha: "e1772733754c4d069928169675791b2a484375a2", date: "2026-05-14 14:28:23 UTC", description: "retire the unused Docker dev environment", pr_number: 25429, scopes: ["dev"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 10, insertions_count: 102, deletions_count: 623}, + {sha: "45b6d2b8faa9d89005abefd5d6311db9d730cd0a", date: "2026-05-14 16:08:30 UTC", description: "Add more fine grained controls tag cardinality", pr_number: 25360, scopes: ["tag_cardinality_limit transform"], type: "enhancement", breaking_change: false, author: "ArunPiduguDD", files_count: 6, insertions_count: 747, deletions_count: 122}, + {sha: "11ad4e7df2f16203357c875557230905a94cfe0d", date: "2026-05-14 17:33:09 UTC", description: "clarify JEMALLOC_SYS_WITH_LG_PAGE comment", pr_number: 25435, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 4, deletions_count: 2}, + {sha: "45c4010e78a8470177061b8257648499ba1f61fe", date: "2026-05-14 19:33:52 UTC", description: "add \"View open issues\" link to component pages", pr_number: 25437, scopes: ["external docs"], type: "feat", breaking_change: false, author: "Pavlos Rontidis", files_count: 1, insertions_count: 14, deletions_count: 0}, + {sha: "a1a56fe123829ab224361648165973d6ba9a5292", date: "2026-05-14 20:04:48 UTC", description: "drop gssapi from default cargo feature", pr_number: 25256, scopes: ["deps"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 4, insertions_count: 35, deletions_count: 15}, + {sha: "ec27f907e50dacdc7d1124720f1b29dfe967aac7", date: "2026-05-14 20:20:46 UTC", description: "unify Dockerfile apt deps into one script", pr_number: 25436, scopes: ["ci"], type: "chore", breaking_change: false, author: "Pavlos Rontidis", files_count: 3, insertions_count: 27, deletions_count: 33}, + {sha: "f06f820a9f66a6518e01f0d7a3d43b5a2826bd9b", date: "2026-05-14 20:32:54 UTC", description: "make libz.so.1 a consistent dynamic runtime dependency in distroless-libc", pr_number: 25434, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Thomas", files_count: 3, insertions_count: 10, deletions_count: 3}, + {sha: "f5643b687151a31c5494b46646068f1dece4df7b", date: "2026-05-15 13:36:52 UTC", description: "add deprecation.d fragment system with vdev check/show commands and release integration", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 18, insertions_count: 670, deletions_count: 27}, + {sha: "6d0e0c07a40a234ecb37b21a4b8d65b3f578621c", date: "2026-05-15 14:02:32 UTC", description: "wire deprecation check into changelog.yaml via bash script", pr_number: null, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 3, insertions_count: 116, deletions_count: 40}, + {sha: "411a95799077734160b680181a7ac919bc9823a7", date: "2026-05-15 14:14:57 UTC", description: "chore(ci): wire deprecation check into changelog.yaml via bash script", pr_number: null, scopes: [], type: "revert", breaking_change: false, author: "Thomas", files_count: 3, insertions_count: 40, deletions_count: 116}, + {sha: "f2b55c226e1b67dd502a3c0cb092f52d2bc95773", date: "2026-05-15 14:15:43 UTC", description: "use changes.yml and setup action for deprecation fragment check", pr_number: null, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 55, deletions_count: 26}, + {sha: "a42c0a4fc73a7bd881fa17d1f69a9d1af7333f88", date: "2026-05-15 14:16:47 UTC", description: "remove stale comment from deprecation workflow", pr_number: null, scopes: ["ci"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 0, deletions_count: 9}, + {sha: "9e5a2eb22c0e8f4b3c1962fb63877e7a210db178", date: "2026-05-15 14:27:03 UTC", description: "add deprecations and planned_deprecations to release CUE schema", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 9, deletions_count: 0}, + {sha: "1196d69e0aaad8e4ffbe7d226aedbe2a715e22b7", date: "2026-05-15 14:29:43 UTC", description: "fix deprecation fragments to use deprecation_version not announcement_version", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 6, insertions_count: 5, deletions_count: 11}, + {sha: "d7b55a21986031413aec814390d47b39de944c0e", date: "2026-05-15 14:32:59 UTC", description: "restore announcement_version to deprecation fragments", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 6, insertions_count: 6, deletions_count: 0}, + {sha: "a0b1f0ff2ae17bd79063e6476d60472f15c93147", date: "2026-05-15 15:11:22 UTC", description: "make announcement_version required, add next version keyword, rewrite next on release", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 12, insertions_count: 171, deletions_count: 45}, + {sha: "37eba350d6ba591419c1e30a90099db0afbf0e73", date: "2026-05-15 15:15:48 UTC", description: "update deprecation docs and release template for new fragment fields", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 10, deletions_count: 7}, + {sha: "9659a52582a8cc94e110f9dc2dce45c82dc3d100", date: "2026-05-15 15:16:57 UTC", description: "sort deprecation show output by version", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 22, deletions_count: 1}, + {sha: "5ae8acdb5b2bd93d3d0504d6fbe01d9d99303bea", date: "2026-05-15 15:36:31 UTC", description: "fix announcement versions for azure_monitor_logs and datadog_metrics series v1", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 2, deletions_count: 2}, + {sha: "0b535c6ec1ae2881bed5d9c9ce8cf69eedc18a9e", date: "2026-05-15 15:41:49 UTC", description: "refine deprecation show output with grouped sections and next-release detection", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 86, deletions_count: 33}, + {sha: "d1eff3ad6d4854ffb53f968204277bc00e5c6d98", date: "2026-05-15 15:43:14 UTC", description: "add color and styling to deprecation show output", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 46, deletions_count: 14}, + {sha: "a2928a79209be19854cfb1d9e63fb8137536768d", date: "2026-05-15 15:44:08 UTC", description: "fix label alignment in deprecation show output", pr_number: null, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 1, deletions_count: 1}, + {sha: "b575eb9dbd10001627f27914154cf96802ac924d", date: "2026-05-15 15:45:00 UTC", description: "colour concrete next-minor version red same as next keyword", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 25, deletions_count: 31}, + {sha: "0c6d24703d0e7e8602520ba9e9ed15ef85aab6f9", date: "2026-05-15 15:46:49 UTC", description: "correct deprecation versions in fragments", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 6, deletions_count: 6}, + {sha: "986bc3222b4ba0337b66084e34a587976e9bed70", date: "2026-05-15 15:48:40 UTC", description: "expose generate-cue as standalone release subcommand", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 62, deletions_count: 0}, + {sha: "4ccc8cf603448f0e2590499a2169a4492aba8abc", date: "2026-05-15 16:30:34 UTC", description: "render deprecations and planned_deprecations on release pages", pr_number: null, scopes: ["external docs"], type: "feat", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 52, deletions_count: 0}, + {sha: "0723a0dac1cc9bd5d9992dea29f54cc6616c8ca6", date: "2026-05-15 16:45:59 UTC", description: "split deprecations into three buckets: enacted, announcing, planned", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 5, insertions_count: 79, deletions_count: 26}, + {sha: "8643b9ee251132c22e3668cd23e8eb3d0a0911b3", date: "2026-05-15 16:47:59 UTC", description: "fix clippy warnings in deprecation utils", pr_number: null, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Thomas", files_count: 3, insertions_count: 53, deletions_count: 35}, + {sha: "55fc56dce9625822817d6981bf16ad876537cf79", date: "2026-05-15 17:07:32 UTC", description: "in dry-run mode, create branches from current branch instead of master", pr_number: null, scopes: ["releasing"], type: "feat", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 7, deletions_count: 3}, + {sha: "99f0cf1face6d6d88d21539f623d043b8d464154", date: "2026-05-15 17:13:41 UTC", description: "resolve next to concrete version before rendering CUE and partitioning", pr_number: null, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 14, deletions_count: 0}, + {sha: "53367982cf50bc5deb233713210bf106d8757432", date: "2026-05-15 17:14:07 UTC", description: "rename VersionOrTbd->DeprecationVersion", pr_number: null, scopes: ["vdev"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 39, deletions_count: 37}, + {sha: "923269d197176275cc518a1be5f27fa4540758d1", date: "2026-05-15 17:19:52 UTC", description: "hide TBD removal date on release deprecation sections", pr_number: null, scopes: ["external docs"], type: "feat", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 3, deletions_count: 3}, + {sha: "9bc543d11370b551176c78481a014dcc3fc07a67", date: "2026-05-15 17:23:23 UTC", description: "remove leading 'The' from deprecation what fields", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 4, deletions_count: 4}, + {sha: "a0d26067e61f4456909ebe1b2a9b330d3118029c", date: "2026-05-15 17:28:47 UTC", description: "Add fake deprecation + generated cue file", pr_number: null, scopes: ["external docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 3, insertions_count: 487, deletions_count: 0}, + {sha: "12c78d37bdc8d7fcb5314dadd05d79b243b21749", date: "2026-05-15 17:36:46 UTC", description: "fix nested code fences in deprecation.d README", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 3, deletions_count: 3}, + {sha: "fd52722532d1c715f49bb04e00796137498088e6", date: "2026-05-15 17:39:25 UTC", description: "delete generated files", pr_number: null, scopes: ["website"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 0, deletions_count: 480}, + {sha: "8eb5b4279e4b630548137f6edbcc502a2d1ce282", date: "2026-05-15 17:46:27 UTC", description: "fix insert_block_after_changelog to target the changelog array not the first ]", pr_number: null, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 7, deletions_count: 2}, + {sha: "9dabc01cea2e3eee0eb4720c23338b58360bf2f9", date: "2026-05-15 17:54:08 UTC", description: "fix markdown table separator spacing in deprecation.d README", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 1, deletions_count: 1}, + {sha: "3b2a6f05b071dafb216fb8738e01412f0ba87560", date: "2026-05-15 17:59:10 UTC", description: "use gh CLI to fetch VRL release notes instead of unauthenticated GitHub API", pr_number: null, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 41, deletions_count: 39}, + {sha: "35fbe89db6dbb2a4d4318496acdc7f45231871d0", date: "2026-05-15 18:01:44 UTC", description: "Pinned VRL version to 0.32.0", pr_number: null, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 7, deletions_count: 6}, + ] +} From 0bc71ccdd463f6ad90e33e5161e07ed54b5c8a2f Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 May 2026 14:04:48 -0400 Subject: [PATCH 34/85] Revert "chore(releasing): use gh CLI to fetch VRL release notes instead of unauthenticated GitHub API" This reverts commit 3b2a6f05b071dafb216fb8738e01412f0ba87560. --- vdev/src/commands/release/prepare.rs | 80 ++++++++++++++-------------- 1 file changed, 39 insertions(+), 41 deletions(-) diff --git a/vdev/src/commands/release/prepare.rs b/vdev/src/commands/release/prepare.rs index 15c24257138da..c1429759c0d7b 100644 --- a/vdev/src/commands/release/prepare.rs +++ b/vdev/src/commands/release/prepare.rs @@ -3,7 +3,8 @@ use crate::commands::release::generate_cue; use crate::utils::{command::run_command, git, paths}; -use anyhow::{Context, Result, anyhow, bail}; +use anyhow::{Context, Result, anyhow}; +use reqwest::blocking::Client; use semver::Version; use std::{ env, fs, @@ -12,6 +13,7 @@ use std::{ path::{Path, PathBuf}, process::Command, }; +use toml::Value; use toml_edit::DocumentMut; const ALPINE_PREFIX: &str = "FROM docker.io/alpine:"; @@ -467,57 +469,53 @@ fn insert_block_after_changelog(original: &str, block: &str) -> String { } fn get_latest_vrl_tag_and_changelog() -> Result { - // Step 1: get the latest tag - let tag_output = Command::new("gh") - .args(["api", "repos/vectordotdev/vrl/tags", "--jq", ".[0].name"]) - .output() - .context("Failed to run `gh api` for VRL tags")?; - - if !tag_output.status.success() { - let stderr = String::from_utf8_lossy(&tag_output.stderr); - bail!("gh api tags failed: {stderr}"); - } - - let tag = String::from_utf8(tag_output.stdout) - .context("gh api output is not valid UTF-8")?; - let tag = tag.trim().to_string(); - - // Step 2: fetch CHANGELOG.md for that tag - let changelog_output = Command::new("gh") - .args([ - "api", - &format!("repos/vectordotdev/vrl/contents/CHANGELOG.md?ref={tag}"), - "-H", - "Accept: application/vnd.github.raw+json", - ]) - .output() - .context("Failed to run `gh api` for VRL CHANGELOG.md")?; - - if !changelog_output.status.success() { - let stderr = String::from_utf8_lossy(&changelog_output.stderr); - bail!("gh api CHANGELOG.md failed: {stderr}"); - } - - let changelog = String::from_utf8(changelog_output.stdout) - .context("CHANGELOG.md is not valid UTF-8")?; - - // Extract the first release section (from the first ## to the next ##) + let client = Client::new(); + + // Step 1: Get latest tag from GitHub API + let tags_url = "https://api.github.com/repos/vectordotdev/vrl/tags"; + let tags_response = client + .get(tags_url) + .header("User-Agent", "rust-reqwest") // GitHub API requires User-Agent + .send()? + .text()?; + + let tags: Vec = serde_json::from_str(&tags_response)?; + let latest_tag = tags + .first() + .and_then(|tag| tag.get("name")) + .and_then(|name| name.as_str()) + .ok_or_else(|| anyhow!("Failed to extract latest tag"))? + .to_string(); + + // Step 2: Download CHANGELOG.md for the specific tag + let changelog_url = + format!("https://raw.githubusercontent.com/vectordotdev/vrl/{latest_tag}/CHANGELOG.md",); + let changelog = client + .get(&changelog_url) + .header("User-Agent", "rust-reqwest") + .send()? + .text()?; + + // Step 3: Extract text from first ## to next ## + let lines: Vec<&str> = changelog.lines().collect(); let mut section = Vec::new(); let mut found_first = false; - for line in changelog.lines() { + + for line in lines { if line.starts_with("## ") { if found_first { + section.push(line.to_string()); break; } found_first = true; - } - if found_first { - section.push(line); + section.push(line.to_string()); + } else if found_first { + section.push(line.to_string()); } } if !found_first { - bail!("No ## headers found in VRL CHANGELOG.md"); + return Err(anyhow!("No ## headers found in CHANGELOG.md")); } Ok(section.join("\n")) From 50644e7d82f1c36e1f9adb97bba3b49b7d81f89d Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 19 May 2026 11:41:30 -0400 Subject: [PATCH 35/85] docs(internal docs): rename DEPRECATION.md to DEPRECATION_POLICY.md and merge DEPRECATIONS.md --- CONTRIBUTING.md | 4 ++-- docs/DEPRECATIONS.md | 17 ----------------- docs/{DEPRECATION.md => DEPRECATION_POLICY.md} | 4 ++-- docs/REVIEWING.md | 2 +- 4 files changed, 5 insertions(+), 22 deletions(-) delete mode 100644 docs/DEPRECATIONS.md rename docs/{DEPRECATION.md => DEPRECATION_POLICY.md} (97%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 556958083ac69..6e02a566ae907 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -309,7 +309,7 @@ git push ### Deprecations -When deprecating functionality in Vector, see [DEPRECATION.md](docs/DEPRECATION.md). +When deprecating functionality in Vector, see [DEPRECATION_POLICY.md](docs/DEPRECATION_POLICY.md). ### Dependencies @@ -325,7 +325,7 @@ documents: 1. **[DEVELOPING.md](docs/DEVELOPING.md)** - Everything necessary to develop 2. **[DOCUMENTING.md](docs/DOCUMENTING.md)** - Preparing your change for Vector users -3. **[DEPRECATION.md](docs/DEPRECATION.md)** - Deprecating functionality in Vector +3. **[DEPRECATION_POLICY.md](docs/DEPRECATION_POLICY.md)** - Deprecating functionality in Vector ## Legal diff --git a/docs/DEPRECATIONS.md b/docs/DEPRECATIONS.md deleted file mode 100644 index 7382e1f5fa4db..0000000000000 --- a/docs/DEPRECATIONS.md +++ /dev/null @@ -1,17 +0,0 @@ -Deprecation notices are now tracked in [`deprecation.d/`](../deprecation.d/) at the root of -the repository. - -Each file in that directory is a self-contained deprecation notice with YAML frontmatter. -See [`deprecation.d/README.md`](../deprecation.d/README.md) for the file format and lifecycle. - -To view all current notices, run: - -```shell -cargo vdev deprecation show -``` - -To validate the directory, run: - -```shell -cargo vdev check deprecations -``` diff --git a/docs/DEPRECATION.md b/docs/DEPRECATION_POLICY.md similarity index 97% rename from docs/DEPRECATION.md rename to docs/DEPRECATION_POLICY.md index 1a5952540acf4..3ad061c796ba2 100644 --- a/docs/DEPRECATION.md +++ b/docs/DEPRECATION_POLICY.md @@ -85,8 +85,8 @@ When introducing a deprecation into Vector, the pull request introducing the dep are required. Set `announcement_version` to `next` (recommended) or the current release version if known. Set `deprecation_version` to the planned removal version, `TBD` if not yet decided, or `next` if removal is intended for the very next release. The release tooling will replace any `next` values with the concrete version when the - release is cut. Run - `cargo vdev check deprecations` to validate the file. + release is cut. Run `cargo vdev deprecation show` to view all current notices and `cargo vdev check deprecations` + to validate the file. When removing a deprecation in a subsequent release, the pull request should: diff --git a/docs/REVIEWING.md b/docs/REVIEWING.md index d40d311c63a91..e3ca2655c594b 100644 --- a/docs/REVIEWING.md +++ b/docs/REVIEWING.md @@ -90,7 +90,7 @@ backward compatibility, it is much less likely to be approved. It is highly recommended you discuss this change with a Vector team member before investing development time. -Any deprecations should follow our [deprecation policy](DEPRECATION.md). +Any deprecations should follow our [deprecation policy](DEPRECATION_POLICY.md). ## Code Of Conduct From a5145677b01ef853a1dc67425ba91c390914eab7 Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 19 May 2026 16:18:12 -0400 Subject: [PATCH 36/85] chore(releasing): remove TBD as accepted deprecation_version; set concrete versions for existing entries --- deprecation.d/README.md | 2 +- deprecation.d/buffer-bytes-events-metrics.md | 2 +- deprecation.d/http-server-encoding.md | 2 +- docs/DEPRECATION_POLICY.md | 2 +- vdev/src/commands/deprecation/show.rs | 12 ++----- vdev/src/utils/deprecation.rs | 36 ++++---------------- website/layouts/releases/single.html | 6 ++-- 7 files changed, 16 insertions(+), 46 deletions(-) diff --git a/deprecation.d/README.md b/deprecation.d/README.md index 711be6a58e103..fa1d5b1d9b7fb 100644 --- a/deprecation.d/README.md +++ b/deprecation.d/README.md @@ -41,7 +41,7 @@ auth: | Field | Required | Description | | ----- | -------- | ----------- | | `what` | Yes | Short one-line description of what is deprecated. | -| `deprecation_version` | Yes | Version when the item will be removed. Accepts a semver string (`0.56`, `0.56.0`), `TBD` (unknown), or `next` (the very next release). | +| `deprecation_version` | Yes | Version when the item will be removed. Accepts a semver string (`0.56`, `0.56.0`) or `next` (the very next release). | | `announcement_version` | Yes | Version when the deprecation was first announced. Accepts the same values as `deprecation_version`. Use `next` (recommended) when opening the PR — the release tooling will replace it with the concrete version automatically. | ### Body diff --git a/deprecation.d/buffer-bytes-events-metrics.md b/deprecation.d/buffer-bytes-events-metrics.md index 0103dd649854f..ddcf1e51da7a4 100644 --- a/deprecation.d/buffer-bytes-events-metrics.md +++ b/deprecation.d/buffer-bytes-events-metrics.md @@ -1,7 +1,7 @@ --- what: "`buffer_byte_size` and `buffer_events` gauge metrics" announcement_version: 0.53.0 -deprecation_version: TBD +deprecation_version: 0.60.0 --- The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the diff --git a/deprecation.d/http-server-encoding.md b/deprecation.d/http-server-encoding.md index c56e3eb982a00..1c9b4babf6bd9 100644 --- a/deprecation.d/http-server-encoding.md +++ b/deprecation.d/http-server-encoding.md @@ -1,7 +1,7 @@ --- what: "`encoding` field on HTTP server sources" announcement_version: 0.50.0 -deprecation_version: TBD +deprecation_version: 0.60.0 --- The `encoding` field will be removed. Use `decoding` and `framing` instead. diff --git a/docs/DEPRECATION_POLICY.md b/docs/DEPRECATION_POLICY.md index 3ad061c796ba2..ed5a02b6bdaa4 100644 --- a/docs/DEPRECATION_POLICY.md +++ b/docs/DEPRECATION_POLICY.md @@ -83,7 +83,7 @@ When introducing a deprecation into Vector, the pull request introducing the dep - Add a deprecation notice file to [`deprecation.d/`](../deprecation.d/) following the format described in [`deprecation.d/README.md`](../deprecation.d/README.md). Both `announcement_version` and `deprecation_version` are required. Set `announcement_version` to `next` (recommended) or the current release version if known. Set - `deprecation_version` to the planned removal version, `TBD` if not yet decided, or `next` if removal is intended + `deprecation_version` to the planned removal version or `next` if removal is intended for the very next release. The release tooling will replace any `next` values with the concrete version when the release is cut. Run `cargo vdev deprecation show` to view all current notices and `cargo vdev check deprecations` to validate the file. diff --git a/vdev/src/commands/deprecation/show.rs b/vdev/src/commands/deprecation/show.rs index 69cc266eb7fa1..3219329f83f52 100644 --- a/vdev/src/commands/deprecation/show.rs +++ b/vdev/src/commands/deprecation/show.rs @@ -138,13 +138,7 @@ fn format_version(v: &DeprecationVersion, next_minor: Option<&Version>) -> Strin .to_string(); } - match v { - DeprecationVersion::Tbd => "TBD" - .if_supports_color(Stdout, |t| t.bright_yellow()) - .to_string(), - _ => v - .to_string() - .if_supports_color(Stdout, |t| t.bright_cyan()) - .to_string(), - } + v.to_string() + .if_supports_color(Stdout, |t| t.bright_cyan()) + .to_string() } diff --git a/vdev/src/utils/deprecation.rs b/vdev/src/utils/deprecation.rs index 6e4ff1726f0fd..bf18319b0f996 100644 --- a/vdev/src/utils/deprecation.rs +++ b/vdev/src/utils/deprecation.rs @@ -8,12 +8,11 @@ use semver::Version; pub const DEPRECATION_DIR: &str = "deprecation.d"; -/// A version field value: a concrete semver version, `TBD` (unknown), or `next` +/// A version field value: a concrete semver version or `next` /// (the very next release, whatever its number turns out to be). #[derive(Debug, Clone, PartialEq, Eq)] pub enum DeprecationVersion { Version(Version), - Tbd, Next, } @@ -28,8 +27,8 @@ impl Ord for DeprecationVersion { use std::cmp::Ordering::{Equal, Greater, Less}; match (self, other) { (Self::Version(a), Self::Version(b)) => a.cmp(b), - (Self::Version(_), _) | (Self::Next, Self::Tbd) => Less, - (Self::Next, Self::Version(_)) | (Self::Tbd, Self::Version(_) | Self::Next) => Greater, + (Self::Version(_), Self::Next) => Less, + (Self::Next, Self::Version(_)) => Greater, _ => Equal, } } @@ -39,7 +38,6 @@ impl fmt::Display for DeprecationVersion { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { DeprecationVersion::Version(v) => write!(f, "{v}"), - DeprecationVersion::Tbd => write!(f, "TBD"), DeprecationVersion::Next => write!(f, "next"), } } @@ -51,12 +49,10 @@ impl DeprecationVersion { /// `next` always matches — it means "the very next release cut". /// Concrete versions match when major.minor equals the release's major.minor; /// patch is ignored so that `0.56` is enacted on any `0.56.x` release. - /// `TBD` never matches. pub fn matches_release(&self, release: &Version) -> bool { match self { DeprecationVersion::Version(v) => v.major == release.major && v.minor == release.minor, DeprecationVersion::Next => true, - DeprecationVersion::Tbd => false, } } } @@ -65,10 +61,8 @@ impl<'de> serde::Deserialize<'de> for DeprecationVersion { fn deserialize>(d: D) -> std::result::Result { let s = String::deserialize(d)?; let s = s.trim(); - match s { - "TBD" => return Ok(DeprecationVersion::Tbd), - "next" => return Ok(DeprecationVersion::Next), - _ => {} + if s == "next" { + return Ok(DeprecationVersion::Next); } // Accept both "0.56" (major.minor) and "0.56.0" (major.minor.patch). // Normalize the two-part form by appending ".0". @@ -144,7 +138,7 @@ fn resolve_next(e: DeprecationEntry, release: &Version) -> DeprecationEntry { DeprecationVersion::Next => { DeprecationVersion::Version(Version::new(release.major, release.minor, 0)) } - other => other, + DeprecationVersion::Version(_) => v, }; DeprecationEntry { deprecation_version: resolve(e.deprecation_version), @@ -314,19 +308,6 @@ mod tests { assert_eq!(e.description, "Detailed explanation."); } - #[test] - fn parse_tbd_versions() { - let tmp = tempdir().unwrap(); - fs::write( - tmp.path().join("bar.md"), - "---\nwhat: Bar thing\ndeprecation_version: \"TBD\"\nannouncement_version: \"TBD\"\n---\n", - ) - .unwrap(); - let entries = read_deprecation_fragments(tmp.path()).unwrap(); - assert_eq!(entries[0].deprecation_version, DeprecationVersion::Tbd); - assert_eq!(entries[0].announcement_version, DeprecationVersion::Tbd); - } - #[test] fn rejects_missing_announcement_version() { let tmp = tempdir().unwrap(); @@ -392,11 +373,6 @@ mod tests { assert!(!v.matches_release(&Version::new(1, 56, 0))); } - #[test] - fn tbd_never_matches_release() { - assert!(!DeprecationVersion::Tbd.matches_release(&Version::new(0, 56, 0))); - } - #[test] fn next_always_matches_release() { assert!(DeprecationVersion::Next.matches_release(&Version::new(0, 56, 0))); diff --git a/website/layouts/releases/single.html b/website/layouts/releases/single.html index f7f362d76dcb2..6a04bc4bb5f06 100644 --- a/website/layouts/releases/single.html +++ b/website/layouts/releases/single.html @@ -67,7 +67,7 @@ {{ .what | markdownify }}
- Announced in {{ .announcement_version }}{{ if ne .deprecation_version "TBD" }} · Removed in {{ .deprecation_version }}{{ end }} + Announced in {{ .announcement_version }} · Removed in {{ .deprecation_version }}
{{ with .description }}
@@ -93,7 +93,7 @@ {{ .what | markdownify }}
- Announced in {{ .announcement_version }}{{ if ne .deprecation_version "TBD" }} · Planned removal in {{ .deprecation_version }}{{ end }} + Announced in {{ .announcement_version }} · Planned removal in {{ .deprecation_version }}
{{ with .description }}
@@ -279,7 +279,7 @@ {{ .what | markdownify }}
- Announced in {{ .announcement_version }}{{ if ne .deprecation_version "TBD" }} · Planned removal in {{ .deprecation_version }}{{ end }} + Announced in {{ .announcement_version }} · Planned removal in {{ .deprecation_version }}
{{ with .description }}
From 8a89226ed362670e04202d812d193cfd6d78c959 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 22 May 2026 12:35:14 -0400 Subject: [PATCH 37/85] chore(releasing): drop announcement_version; track via .announced.md filename convention - Remove `announcement_version` field from deprecation fragments and vdev schema - Replace `next` keyword with concrete versions; add vdev validation that `deprecation_version` > latest release tag to catch stale fragments - Introduce `*.announced.md` filename convention: new fragments use `*.md` (shown as `deprecation_announcements` in release notes), fragments surviving a release are renamed to `*.announced.md` by `release generate-cue` (shown as `planned_deprecations` in subsequent releases) - Restore three-bucket partition and `deprecation_announcements` CUE field - Update release page template and CUE schema accordingly --- deprecation.d/README.md | 10 +- deprecation.d/azure-monitor-logs-sink.md | 3 +- deprecation.d/bool-or-vector-compression.md | 3 +- deprecation.d/buffer-bytes-events-metrics.md | 3 +- deprecation.d/datadog-metrics-series-v1.md | 3 +- deprecation.d/example-fake-deprecation.md | 1 - deprecation.d/greptimedb-v0-support.md | 3 +- deprecation.d/http-server-encoding.md | 3 +- vdev/src/commands/check/deprecations.rs | 33 ++- vdev/src/commands/deprecation/show.rs | 14 +- vdev/src/commands/release/generate_cue.rs | 32 +-- vdev/src/utils/deprecation.rs | 265 +++++++------------ vdev/src/utils/git.rs | 6 +- website/cue/reference/releases.cue | 7 +- website/cue/reference/releases/0.56.0.cue | 34 +-- website/layouts/releases/single.html | 6 +- 16 files changed, 171 insertions(+), 255 deletions(-) diff --git a/deprecation.d/README.md b/deprecation.d/README.md index fa1d5b1d9b7fb..278779a52c781 100644 --- a/deprecation.d/README.md +++ b/deprecation.d/README.md @@ -15,9 +15,8 @@ Each file must be named `.md` and begin with YAML frontmatter: ````markdown --- -announcement_version: next -deprecation_version: 0.57.0 what: "`legacy_auth` configuration option" +deprecation_version: 0.57.0 --- The `legacy_auth` option has been replaced by the new `auth` block. @@ -41,8 +40,7 @@ auth: | Field | Required | Description | | ----- | -------- | ----------- | | `what` | Yes | Short one-line description of what is deprecated. | -| `deprecation_version` | Yes | Version when the item will be removed. Accepts a semver string (`0.56`, `0.56.0`) or `next` (the very next release). | -| `announcement_version` | Yes | Version when the deprecation was first announced. Accepts the same values as `deprecation_version`. Use `next` (recommended) when opening the PR — the release tooling will replace it with the concrete version automatically. | +| `deprecation_version` | Yes | Version when the item will be removed. Accepts a semver string (`0.56`, `0.56.0`). Must be greater than the latest released version. | ### Body @@ -58,6 +56,8 @@ or links to further documentation. It is rendered verbatim in the release notes. ## Validation -Run `cargo vdev check deprecations` to validate all files in this directory. +Run `cargo vdev check deprecations` to validate all files in this directory. The check also +verifies that each `deprecation_version` is greater than the latest released version — entries +that should have been enacted and removed will cause the check to fail. To preview the current deprecation state, run `cargo vdev deprecation show`. diff --git a/deprecation.d/azure-monitor-logs-sink.md b/deprecation.d/azure-monitor-logs-sink.md index 0e777fed1d156..81064a9c7d996 100644 --- a/deprecation.d/azure-monitor-logs-sink.md +++ b/deprecation.d/azure-monitor-logs-sink.md @@ -1,7 +1,6 @@ --- what: "`azure_monitor_logs` sink" -announcement_version: 0.54.0 -deprecation_version: 0.58.0 +deprecation_version: 0.58 --- The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink, diff --git a/deprecation.d/bool-or-vector-compression.md b/deprecation.d/bool-or-vector-compression.md index 17e2acf345881..0cb61b37f13e7 100644 --- a/deprecation.d/bool-or-vector-compression.md +++ b/deprecation.d/bool-or-vector-compression.md @@ -1,7 +1,6 @@ --- what: "Boolean syntax for the `compression` field in the `vector` sink" -announcement_version: next -deprecation_version: next +deprecation_version: 0.56 --- The boolean syntax (`compression: true` / `compression: false`) is deprecated. diff --git a/deprecation.d/buffer-bytes-events-metrics.md b/deprecation.d/buffer-bytes-events-metrics.md index ddcf1e51da7a4..ce1c9cb94d98c 100644 --- a/deprecation.d/buffer-bytes-events-metrics.md +++ b/deprecation.d/buffer-bytes-events-metrics.md @@ -1,7 +1,6 @@ --- what: "`buffer_byte_size` and `buffer_events` gauge metrics" -announcement_version: 0.53.0 -deprecation_version: 0.60.0 +deprecation_version: 0.60 --- The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the diff --git a/deprecation.d/datadog-metrics-series-v1.md b/deprecation.d/datadog-metrics-series-v1.md index ffac24643511c..3522a58e067c5 100644 --- a/deprecation.d/datadog-metrics-series-v1.md +++ b/deprecation.d/datadog-metrics-series-v1.md @@ -1,7 +1,6 @@ --- what: "`series_api_version: v1` option on the `datadog_metrics` sink" -announcement_version: 0.55.0 -deprecation_version: 0.58.0 +deprecation_version: 0.58 --- The `series_api_version: v1` option is deprecated in favor of `v2` (the default). diff --git a/deprecation.d/example-fake-deprecation.md b/deprecation.d/example-fake-deprecation.md index 6ae39549e5371..4c8d49ce6e6e7 100644 --- a/deprecation.d/example-fake-deprecation.md +++ b/deprecation.d/example-fake-deprecation.md @@ -1,6 +1,5 @@ --- what: "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]" -announcement_version: next deprecation_version: 0.58 --- diff --git a/deprecation.d/greptimedb-v0-support.md b/deprecation.d/greptimedb-v0-support.md index 2d9a4bfde1136..423f659c8c343 100644 --- a/deprecation.d/greptimedb-v0-support.md +++ b/deprecation.d/greptimedb-v0-support.md @@ -1,7 +1,6 @@ --- what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" -announcement_version: 0.55.0 -deprecation_version: 0.56.0 +deprecation_version: 0.56 --- The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. diff --git a/deprecation.d/http-server-encoding.md b/deprecation.d/http-server-encoding.md index 1c9b4babf6bd9..176da099de855 100644 --- a/deprecation.d/http-server-encoding.md +++ b/deprecation.d/http-server-encoding.md @@ -1,7 +1,6 @@ --- what: "`encoding` field on HTTP server sources" -announcement_version: 0.50.0 -deprecation_version: 0.60.0 +deprecation_version: 0.60 --- The `encoding` field will be removed. Use `decoding` and `framing` instead. diff --git a/vdev/src/commands/check/deprecations.rs b/vdev/src/commands/check/deprecations.rs index 19ac24a6f0581..33a4cbce1ddce 100644 --- a/vdev/src/commands/check/deprecations.rs +++ b/vdev/src/commands/check/deprecations.rs @@ -1,8 +1,8 @@ #![allow(clippy::print_stdout)] -use anyhow::Result; +use anyhow::{Result, bail}; -use crate::utils::{deprecation, paths}; +use crate::utils::{deprecation, git, paths}; /// Check that all deprecation.d fragments are valid #[derive(clap::Args, Debug)] @@ -34,6 +34,35 @@ impl Cli { } println!("{} deprecation fragment(s) are valid.", entries.len()); + // Validate that no fragment's deprecation_version has already been released. + match git::latest_release_version() { + Ok(latest) => { + let mut stale = false; + for entry in &entries { + if !entry.deprecation_version.is_future_relative_to(&latest) { + eprintln!( + " STALE {} (deprecation_version {} is not greater than latest release {})", + entry.filename, entry.deprecation_version, latest + ); + stale = true; + } + } + if stale { + bail!( + "One or more deprecation fragments have a deprecation_version \ + that is not greater than the latest release v{latest}. \ + These should have been enacted and removed during the {latest} release." + ); + } + println!( + "All deprecation_versions are greater than latest release v{latest}." + ); + } + Err(e) => { + eprintln!("Warning: could not determine latest release version ({e}); skipping version freshness check."); + } + } + Ok(()) } } diff --git a/vdev/src/commands/deprecation/show.rs b/vdev/src/commands/deprecation/show.rs index 3219329f83f52..69450a444ad79 100644 --- a/vdev/src/commands/deprecation/show.rs +++ b/vdev/src/commands/deprecation/show.rs @@ -57,13 +57,11 @@ impl Cli { .map(|v| Version::new(v.major, v.minor + 1, 0)); // Use the computed next minor as the "release" for partitioning. - // If the next minor can't be determined, fall back to a sentinel version - // that only `next` keywords will match (major=0, minor=0 never matches real versions). let partition_version = next_minor.clone().unwrap_or_else(|| Version::new(0, 0, 0)); let p = deprecation::partition_by_release(entries, &partition_version); let enacted: Vec<&DeprecationEntry> = p.enacted.iter().collect(); let announcing: Vec<&DeprecationEntry> = p.announcing.iter().collect(); - let preexisting: Vec<&DeprecationEntry> = p.planned.iter().collect(); + let planned: Vec<&DeprecationEntry> = p.planned.iter().collect(); let next_label = match &next_minor { Some(v) => format!("{}.{}", v.major, v.minor), @@ -81,7 +79,7 @@ impl Cli { &announcing, nm, ); - print_section("Pre-existing deprecations", &preexisting, nm); + print_section("Previously announced", &planned, nm); Ok(()) } @@ -107,11 +105,6 @@ fn print_section(title: &str, entries: &[&DeprecationEntry], next_minor: Option< fn print_entry(e: &DeprecationEntry, next_minor: Option<&Version>) { println!("{}", e.what.if_supports_color(Stdout, |t| t.bold())); - println!( - " {} {}", - "announced: ".if_supports_color(Stdout, |t| t.dimmed()), - format_version(&e.announcement_version, next_minor), - ); println!( " {} {}", "deprecated:".if_supports_color(Stdout, |t| t.dimmed()), @@ -127,8 +120,7 @@ fn print_entry(e: &DeprecationEntry, next_minor: Option<&Version>) { } fn format_version(v: &DeprecationVersion, next_minor: Option<&Version>) -> String { - let is_next = matches!(v, DeprecationVersion::Next) - || matches!((v, next_minor), (DeprecationVersion::Version(_), Some(nv)) if v.matches_release(nv)); + let is_next = next_minor.is_some_and(|nv| v.matches_release(nv)); if is_next { let style = Style::new().bright_red().bold(); diff --git a/vdev/src/commands/release/generate_cue.rs b/vdev/src/commands/release/generate_cue.rs index f8182ebf463a0..9b9b6531da266 100644 --- a/vdev/src/commands/release/generate_cue.rs +++ b/vdev/src/commands/release/generate_cue.rs @@ -119,9 +119,8 @@ pub(super) fn run(new_version: &Version) -> Result { fs::write(&cue_path, cue_text) .with_context(|| format!("Failed to write {}", cue_path.display()))?; - // In surviving fragments, replace any `next` version values with the concrete release version. - rewrite_next_in_planned(&deprecation_dir, &announcing_deprecations, &new_version)?; - rewrite_next_in_planned(&deprecation_dir, &planned_deprecations, &new_version)?; + // Promote new-announcement fragments from *.md to *.announced.md. + rename_announcing_fragments(&deprecation_dir, &announcing_deprecations)?; // Retire enacted deprecation fragments via `git rm`. retire_deprecation_fragments(&deprecation_dir, &enacted_deprecations)?; @@ -563,18 +562,17 @@ fn retire_changelog_fragments(dir: &Path) -> Result<()> { Ok(()) } -fn rewrite_next_in_planned( - dir: &Path, - planned: &[DeprecationEntry], - release: &Version, -) -> Result<()> { +fn rename_announcing_fragments(dir: &Path, announcing: &[DeprecationEntry]) -> Result<()> { + if announcing.is_empty() { + return Ok(()); + } let cwd = env::current_dir()?; - for entry in planned { - let path = dir.join(&entry.filename); - if deprecation::rewrite_next_versions(&path, release)? { - let rel = path.strip_prefix(&cwd).unwrap_or(&path); - git::add(&rel.to_string_lossy())?; - } + for entry in announcing { + let src = dir.join(&entry.filename); + let dst = deprecation::announced_path(&src); + let src_rel = src.strip_prefix(&cwd).unwrap_or(&src); + let dst_rel = dst.strip_prefix(&cwd).unwrap_or(&dst); + git::mv(&src_rel.to_string_lossy(), &dst_rel.to_string_lossy())?; } Ok(()) } @@ -657,12 +655,6 @@ fn render_deprecation_section(entries: &[DeprecationEntry]) -> String { json!(e.deprecation_version.to_string()) ) .unwrap(); - writeln!( - s, - "\t\t\tannouncement_version: {}", - json!(e.announcement_version.to_string()) - ) - .unwrap(); if !e.description.is_empty() { s.push_str("\t\t\tdescription: #\"\"\"\n"); for line in e.description.lines() { diff --git a/vdev/src/utils/deprecation.rs b/vdev/src/utils/deprecation.rs index bf18319b0f996..fcf90593ba163 100644 --- a/vdev/src/utils/deprecation.rs +++ b/vdev/src/utils/deprecation.rs @@ -8,52 +8,28 @@ use semver::Version; pub const DEPRECATION_DIR: &str = "deprecation.d"; -/// A version field value: a concrete semver version or `next` -/// (the very next release, whatever its number turns out to be). -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum DeprecationVersion { - Version(Version), - Next, -} - -impl PartialOrd for DeprecationVersion { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for DeprecationVersion { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - use std::cmp::Ordering::{Equal, Greater, Less}; - match (self, other) { - (Self::Version(a), Self::Version(b)) => a.cmp(b), - (Self::Version(_), Self::Next) => Less, - (Self::Next, Self::Version(_)) => Greater, - _ => Equal, - } - } -} +/// A concrete semver version identifying when a deprecation takes effect. +/// Accepted forms: `"0.56"` (major.minor) or `"0.56.0"` (major.minor.patch). +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] +pub struct DeprecationVersion(pub Version); impl fmt::Display for DeprecationVersion { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - DeprecationVersion::Version(v) => write!(f, "{v}"), - DeprecationVersion::Next => write!(f, "next"), - } + write!(f, "{}", self.0) } } impl DeprecationVersion { /// Returns true when this version should be enacted for the given release. - /// - /// `next` always matches — it means "the very next release cut". - /// Concrete versions match when major.minor equals the release's major.minor; - /// patch is ignored so that `0.56` is enacted on any `0.56.x` release. + /// Patch is ignored so `0.56` (stored as 0.56.0) matches any 0.56.x release. pub fn matches_release(&self, release: &Version) -> bool { - match self { - DeprecationVersion::Version(v) => v.major == release.major && v.minor == release.minor, - DeprecationVersion::Next => true, - } + self.0.major == release.major && self.0.minor == release.minor + } + + /// Returns true when this version is strictly in the future relative to `latest`. + /// A fragment is outdated if its deprecation_version ≤ the latest release. + pub fn is_future_relative_to(&self, latest: &Version) -> bool { + (self.0.major, self.0.minor) > (latest.major, latest.minor) } } @@ -61,9 +37,6 @@ impl<'de> serde::Deserialize<'de> for DeprecationVersion { fn deserialize>(d: D) -> std::result::Result { let s = String::deserialize(d)?; let s = s.trim(); - if s == "next" { - return Ok(DeprecationVersion::Next); - } // Accept both "0.56" (major.minor) and "0.56.0" (major.minor.patch). // Normalize the two-part form by appending ".0". let normalized = if s.chars().filter(|&c| c == '.').count() == 1 { @@ -72,7 +45,7 @@ impl<'de> serde::Deserialize<'de> for DeprecationVersion { std::borrow::Cow::Borrowed(s) }; Version::parse(&normalized) - .map(DeprecationVersion::Version) + .map(DeprecationVersion) .map_err(|e| serde::de::Error::custom(format!("invalid version '{s}': {e}"))) } } @@ -83,7 +56,6 @@ use serde::Deserialize; struct Frontmatter { what: String, deprecation_version: DeprecationVersion, - announcement_version: DeprecationVersion, } /// A parsed and validated deprecation entry from `deprecation.d/`. @@ -92,23 +64,24 @@ pub struct DeprecationEntry { pub filename: String, pub what: String, pub deprecation_version: DeprecationVersion, - pub announcement_version: DeprecationVersion, /// Optional body text (everything after the closing `---` of the frontmatter). pub description: String, + /// True for `*.announced.md` files (announced in a prior release). + /// False for `*.md` files (being announced for the first time). + pub previously_announced: bool, } /// The result of partitioning deprecation entries relative to a specific release. pub struct DeprecationPartition { /// Entries whose `deprecation_version` matches the release (being removed now). pub enacted: Vec, - /// Entries whose `announcement_version` matches the release but are not enacted. + /// Not-enacted entries with `previously_announced = false` (new this release). pub announcing: Vec, - /// Everything else — previously announced, future removal. + /// Not-enacted entries with `previously_announced = true` (announced earlier). pub planned: Vec, } /// Partition a list of deprecation entries into three buckets relative to `release`. -/// Any `next` version values are resolved to the concrete `major.minor` of `release`. pub fn partition_by_release( entries: Vec, release: &Version, @@ -117,13 +90,12 @@ pub fn partition_by_release( let mut announcing = Vec::new(); let mut planned = Vec::new(); for e in entries { - let e = resolve_next(e, release); if e.deprecation_version.matches_release(release) { enacted.push(e); - } else if e.announcement_version.matches_release(release) { - announcing.push(e); - } else { + } else if e.previously_announced { planned.push(e); + } else { + announcing.push(e); } } DeprecationPartition { @@ -133,21 +105,8 @@ pub fn partition_by_release( } } -fn resolve_next(e: DeprecationEntry, release: &Version) -> DeprecationEntry { - let resolve = |v: DeprecationVersion| match v { - DeprecationVersion::Next => { - DeprecationVersion::Version(Version::new(release.major, release.minor, 0)) - } - DeprecationVersion::Version(_) => v, - }; - DeprecationEntry { - deprecation_version: resolve(e.deprecation_version), - announcement_version: resolve(e.announcement_version), - ..e - } -} - /// Read and parse all deprecation fragments from the given directory. +/// Includes both `*.md` (new) and `*.announced.md` (previously announced) files. /// Returns entries sorted by filename. pub fn read_deprecation_fragments(dir: &Path) -> Result> { if !dir.is_dir() { @@ -155,8 +114,7 @@ pub fn read_deprecation_fragments(dir: &Path) -> Result> { } let mut paths: Vec = fs::read_dir(dir)? .filter_map(|e| e.ok().map(|e| e.path())) - .filter(|p| p.extension().is_some_and(|x| x == "md")) - .filter(|p| p.file_name().and_then(|n| n.to_str()) != Some("README.md")) + .filter(|p| is_deprecation_fragment(p)) .collect(); paths.sort(); paths @@ -165,6 +123,29 @@ pub fn read_deprecation_fragments(dir: &Path) -> Result> { .collect() } +/// Returns the path with `.md` replaced by `.announced.md`. +/// Used by the release tooling to mark a new-announcement fragment as having been announced. +pub fn announced_path(path: &Path) -> PathBuf { + let stem = path + .file_stem() + .and_then(|s| s.to_str()) + .unwrap_or(""); + let announced_name = format!("{stem}.announced.md"); + path.with_file_name(announced_name) +} + +fn is_deprecation_fragment(path: &Path) -> bool { + let name = match path.file_name().and_then(|n| n.to_str()) { + Some(n) => n, + None => return false, + }; + if name == "README.md" { + return false; + } + // Accept *.announced.md and *.md (but not *.announced.md double-counted via extension) + name.ends_with(".announced.md") || (name.ends_with(".md") && !name.ends_with(".announced.md")) +} + fn parse_deprecation_fragment(path: &Path) -> Result { let filename = path .file_name() @@ -172,12 +153,7 @@ fn parse_deprecation_fragment(path: &Path) -> Result { .unwrap_or("") .to_string(); - if !filename.to_ascii_lowercase().ends_with(".md") { - bail!( - "Deprecation fragment {} must have a .md extension", - path.display() - ); - } + let previously_announced = filename.ends_with(".announced.md"); let raw = fs::read_to_string(path).with_context(|| format!("Failed to read {}", path.display()))?; @@ -198,58 +174,11 @@ fn parse_deprecation_fragment(path: &Path) -> Result { filename, what: fm.what.trim().to_string(), deprecation_version: fm.deprecation_version, - announcement_version: fm.announcement_version, description: body.trim().to_string(), + previously_announced, }) } -/// In a planned (surviving) deprecation fragment file, replace every `next` version value -/// in the frontmatter with the concrete release version (`major.minor`). -/// Returns true if the file was modified. -pub fn rewrite_next_versions(path: &Path, release: &Version) -> Result { - let content = - fs::read_to_string(path).with_context(|| format!("Failed to read {}", path.display()))?; - - let version_str = format!("{}.{}", release.major, release.minor); - - // Only rewrite within the frontmatter block (between the two `---` delimiters). - let fm_close = content[3..] // skip opening `---` - .find("\n---") - .map_or(content.len(), |p| p + 3); - - let (front, rest) = content.split_at(fm_close); - - let new_front: String = front - .lines() - .map(|line| { - if (line.starts_with("announcement_version:") - || line.starts_with("deprecation_version:")) - && line.trim_end().ends_with("next") - { - let colon_pos = line.find(':').unwrap(); - format!("{}: {version_str}", &line[..colon_pos]) - } else { - line.to_string() - } - }) - .collect::>() - .join("\n"); - - if new_front == front { - return Ok(false); - } - - // Preserve the trailing newline that was on `front` before the split. - let rejoined = if front.ends_with('\n') { - format!("{new_front}\n{rest}") - } else { - format!("{new_front}{rest}") - }; - - fs::write(path, rejoined).with_context(|| format!("Failed to write {}", path.display()))?; - Ok(true) -} - /// Split the raw file contents into the frontmatter string and the body. /// The file must begin with `---`, and have a closing `---` on its own line. fn split_frontmatter<'a>(content: &'a str, path: &Path) -> Result<(&'a str, &'a str)> { @@ -286,11 +215,11 @@ mod tests { use tempfile::tempdir; #[test] - fn parse_full_entry() { + fn parse_new_entry() { let tmp = tempdir().unwrap(); fs::write( tmp.path().join("foo_opt.md"), - "---\nwhat: The foo option\ndeprecation_version: \"0.57.0\"\nannouncement_version: \"0.55.0\"\n---\n\nDetailed explanation.\n", + "---\nwhat: The foo option\ndeprecation_version: \"0.57.0\"\n---\n\nDetailed explanation.\n", ) .unwrap(); let entries = read_deprecation_fragments(tmp.path()).unwrap(); @@ -299,24 +228,23 @@ mod tests { assert_eq!(e.what, "The foo option"); assert_eq!( e.deprecation_version, - DeprecationVersion::Version(Version::new(0, 57, 0)) - ); - assert_eq!( - e.announcement_version, - DeprecationVersion::Version(Version::new(0, 55, 0)) + DeprecationVersion(Version::new(0, 57, 0)) ); assert_eq!(e.description, "Detailed explanation."); + assert!(!e.previously_announced); } #[test] - fn rejects_missing_announcement_version() { + fn parse_announced_entry() { let tmp = tempdir().unwrap(); fs::write( - tmp.path().join("baz.md"), - "---\nwhat: Baz option\ndeprecation_version: \"0.60.0\"\n---\n", + tmp.path().join("foo_opt.announced.md"), + "---\nwhat: The foo option\ndeprecation_version: \"0.57.0\"\n---\n\nDetailed explanation.\n", ) .unwrap(); - assert!(read_deprecation_fragments(tmp.path()).is_err()); + let entries = read_deprecation_fragments(tmp.path()).unwrap(); + assert_eq!(entries.len(), 1); + assert!(entries[0].previously_announced); } #[test] @@ -331,7 +259,7 @@ mod tests { let tmp = tempdir().unwrap(); fs::write( tmp.path().join("empty.md"), - "---\nwhat: \" \"\ndeprecation_version: \"0.60.0\"\nannouncement_version: \"0.60.0\"\n---\n", + "---\nwhat: \" \"\ndeprecation_version: \"0.60.0\"\n---\n", ) .unwrap(); assert!(read_deprecation_fragments(tmp.path()).is_err()); @@ -350,75 +278,66 @@ mod tests { let tmp = tempdir().unwrap(); fs::write( tmp.path().join("short.md"), - "---\nwhat: Short version\ndeprecation_version: \"0.56\"\nannouncement_version: \"0.56\"\n---\n", + "---\nwhat: Short version\ndeprecation_version: \"0.56\"\n---\n", ) .unwrap(); let entries = read_deprecation_fragments(tmp.path()).unwrap(); - // "0.56" normalises to 0.56.0 assert_eq!( entries[0].deprecation_version, - DeprecationVersion::Version(Version::new(0, 56, 0)) + DeprecationVersion(Version::new(0, 56, 0)) ); } #[test] fn matches_release_ignores_patch() { - let v = DeprecationVersion::Version(Version::new(0, 56, 0)); - // "0.56" (stored as 0.56.0) should match any 0.56.x release + let v = DeprecationVersion(Version::new(0, 56, 0)); assert!(v.matches_release(&Version::new(0, 56, 0))); assert!(v.matches_release(&Version::new(0, 56, 1))); - assert!(v.matches_release(&Version::new(0, 56, 99))); - // Different minor/major must not match assert!(!v.matches_release(&Version::new(0, 57, 0))); - assert!(!v.matches_release(&Version::new(1, 56, 0))); } #[test] - fn next_always_matches_release() { - assert!(DeprecationVersion::Next.matches_release(&Version::new(0, 56, 0))); - assert!(DeprecationVersion::Next.matches_release(&Version::new(1, 0, 0))); + fn is_future_relative_to() { + let v = DeprecationVersion(Version::new(0, 57, 0)); + assert!(v.is_future_relative_to(&Version::new(0, 56, 0))); + assert!(!v.is_future_relative_to(&Version::new(0, 57, 0))); + assert!(!v.is_future_relative_to(&Version::new(0, 58, 0))); } #[test] - fn parse_next() { + fn partition_three_buckets() { let tmp = tempdir().unwrap(); fs::write( - tmp.path().join("next.md"), - "---\nwhat: Thing\ndeprecation_version: next\nannouncement_version: next\n---\n", + tmp.path().join("enacted.md"), + "---\nwhat: Enacted\ndeprecation_version: \"0.56\"\n---\n", ) .unwrap(); - let entries = read_deprecation_fragments(tmp.path()).unwrap(); - assert_eq!(entries[0].deprecation_version, DeprecationVersion::Next); - assert_eq!(entries[0].announcement_version, DeprecationVersion::Next); - } - - #[test] - fn rewrite_next_versions_replaces_next_in_frontmatter() { - let tmp = tempdir().unwrap(); - let path = tmp.path().join("planned.md"); fs::write( - &path, - "---\nwhat: Thing\ndeprecation_version: next\nannouncement_version: next\n---\n\nSome body with next word.\n", + tmp.path().join("new.md"), + "---\nwhat: New announcement\ndeprecation_version: \"0.58\"\n---\n", ) .unwrap(); - let modified = rewrite_next_versions(&path, &Version::new(0, 57, 0)).unwrap(); - assert!(modified); - let updated = fs::read_to_string(&path).unwrap(); - assert!(updated.contains("deprecation_version: 0.57\n")); - assert!(updated.contains("announcement_version: 0.57\n")); - // Body must be left untouched - assert!(updated.contains("Some body with next word.")); + fs::write( + tmp.path().join("old.announced.md"), + "---\nwhat: Previously announced\ndeprecation_version: \"0.60\"\n---\n", + ) + .unwrap(); + let entries = read_deprecation_fragments(tmp.path()).unwrap(); + let p = partition_by_release(entries, &Version::new(0, 56, 0)); + assert_eq!(p.enacted.len(), 1); + assert_eq!(p.enacted[0].what, "Enacted"); + assert_eq!(p.announcing.len(), 1); + assert_eq!(p.announcing[0].what, "New announcement"); + assert_eq!(p.planned.len(), 1); + assert_eq!(p.planned[0].what, "Previously announced"); } #[test] - fn rewrite_next_versions_no_op_when_no_next() { - let tmp = tempdir().unwrap(); - let path = tmp.path().join("concrete.md"); - let original = - "---\nwhat: Thing\ndeprecation_version: 0.57\nannouncement_version: 0.57\n---\n"; - fs::write(&path, original).unwrap(); - let modified = rewrite_next_versions(&path, &Version::new(0, 57, 0)).unwrap(); - assert!(!modified); - assert_eq!(fs::read_to_string(&path).unwrap(), original); + fn announced_path_replaces_extension() { + let p = Path::new("deprecation.d/foo-bar.md"); + assert_eq!( + announced_path(p), + Path::new("deprecation.d/foo-bar.announced.md") + ); } } diff --git a/vdev/src/utils/git.rs b/vdev/src/utils/git.rs index 8c56e9c77fb4d..d142e9efa0fb0 100644 --- a/vdev/src/utils/git.rs +++ b/vdev/src/utils/git.rs @@ -141,9 +141,9 @@ pub fn latest_release_version() -> Result { anyhow::bail!("No valid semantic version tag found") } -/// Stages a specific file using `git add`. -pub fn add(path: &str) -> Result { - Command::new("git").args(["add", path]).check_output() +/// Renames/moves a file using `git mv`. +pub fn mv(src: &str, dst: &str) -> Result { + Command::new("git").args(["mv", src, dst]).check_output() } /// Removes a file from the index (and working tree) using `git rm`. diff --git a/website/cue/reference/releases.cue b/website/cue/reference/releases.cue index 7f31a3b852b7b..66c35f553d832 100644 --- a/website/cue/reference/releases.cue +++ b/website/cue/reference/releases.cue @@ -29,10 +29,9 @@ releases: { } #DeprecationEntry: { - what: string - deprecation_version: string - announcement_version: string - description?: string + what: string + deprecation_version: string + description?: string } #Release: { diff --git a/website/cue/reference/releases/0.56.0.cue b/website/cue/reference/releases/0.56.0.cue index 5231b9ec73589..a93044ab37a9c 100644 --- a/website/cue/reference/releases/0.56.0.cue +++ b/website/cue/reference/releases/0.56.0.cue @@ -10,7 +10,6 @@ releases: "0.56.0": { { what: "Boolean syntax for the `compression` field in the `vector` sink" deprecation_version: "0.56.0" - announcement_version: "0.56.0" description: #""" The boolean syntax (`compression: true` / `compression: false`) is deprecated. Use the string syntax instead: `compression: "gzip"`, `compression: "zstd"`, or `compression: "none"`. @@ -21,7 +20,6 @@ releases: "0.56.0": { { what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" deprecation_version: "0.56.0" - announcement_version: "0.55.0" description: #""" The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. Users must upgrade their GreptimeDB instance to v1.x before upgrading Vector. @@ -30,33 +28,20 @@ releases: "0.56.0": { ] deprecation_announcements: [ - { - what: "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]" - deprecation_version: "0.58.0" - announcement_version: "0.56.0" - description: #""" - This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging. - """# - }, - ] - - planned_deprecations: [ { what: "`azure_monitor_logs` sink" deprecation_version: "0.58.0" - announcement_version: "0.54.0" description: #""" The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink, which uses the Azure Monitor Logs Ingestion API. - + Users should migrate before Microsoft ends support for the old Data Collector API (scheduled for September 2026). """# }, { what: "`buffer_byte_size` and `buffer_events` gauge metrics" - deprecation_version: "TBD" - announcement_version: "0.53.0" + deprecation_version: "0.60.0" description: #""" The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the `buffer_size_bytes` and `buffer_size_events` metrics described in `docs/specs/buffer.md`. @@ -65,24 +50,31 @@ releases: "0.56.0": { { what: "`series_api_version: v1` option on the `datadog_metrics` sink" deprecation_version: "0.58.0" - announcement_version: "0.55.0" description: #""" The `series_api_version: v1` option is deprecated in favor of `v2` (the default). The v1 series endpoint (`/api/v1/series`) is a legacy endpoint. - + Users should remove `series_api_version: v1` from their configuration or set it to `v2`. """# }, { what: "`encoding` field on HTTP server sources" - deprecation_version: "TBD" - announcement_version: "0.50.0" + deprecation_version: "0.60.0" description: #""" The `encoding` field will be removed. Use `decoding` and `framing` instead. """# }, + { + what: "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]" + deprecation_version: "0.58.0" + description: #""" + This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging. + """# + }, ] + planned_deprecations: [] + changelog: [ { type: "feat" diff --git a/website/layouts/releases/single.html b/website/layouts/releases/single.html index 6a04bc4bb5f06..6b9566916c5b3 100644 --- a/website/layouts/releases/single.html +++ b/website/layouts/releases/single.html @@ -67,7 +67,7 @@ {{ .what | markdownify }}
- Announced in {{ .announcement_version }} · Removed in {{ .deprecation_version }} + Removed in {{ .deprecation_version }}
{{ with .description }}
@@ -93,7 +93,7 @@ {{ .what | markdownify }}
- Announced in {{ .announcement_version }} · Planned removal in {{ .deprecation_version }} + Planned removal in {{ .deprecation_version }}
{{ with .description }}
@@ -279,7 +279,7 @@ {{ .what | markdownify }}
- Announced in {{ .announcement_version }} · Planned removal in {{ .deprecation_version }} + Planned removal in {{ .deprecation_version }}
{{ with .description }}
From f5c7fe6218f8e20ca58e88aba308d9c797402f94 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 11:45:49 -0400 Subject: [PATCH 38/85] chore(releasing): replace announcement_version/deprecation_version with deprecated_since --- deprecation.d/README.md | 15 +-- deprecation.d/azure-monitor-logs-sink.md | 2 +- deprecation.d/bool-or-vector-compression.md | 2 +- deprecation.d/buffer-bytes-events-metrics.md | 2 +- deprecation.d/datadog-metrics-series-v1.md | 2 +- deprecation.d/example-fake-deprecation.md | 2 +- deprecation.d/greptimedb-v0-support.md | 2 +- deprecation.d/http-server-encoding.md | 2 +- docs/DEPRECATION_POLICY.md | 11 +- vdev/src/commands/check/deprecations.rs | 33 +---- vdev/src/commands/deprecation/show.rs | 65 ++-------- vdev/src/commands/release/generate_cue.rs | 48 +------- vdev/src/utils/deprecation.rs | 122 ++++--------------- vdev/src/utils/git.rs | 5 - website/cue/reference/releases.cue | 7 +- website/cue/reference/releases/0.56.0.cue | 35 +++--- website/layouts/releases/single.html | 30 +---- 17 files changed, 78 insertions(+), 307 deletions(-) diff --git a/deprecation.d/README.md b/deprecation.d/README.md index 278779a52c781..f2b53f33072cd 100644 --- a/deprecation.d/README.md +++ b/deprecation.d/README.md @@ -6,8 +6,8 @@ Each file describes a feature, configuration option, or behavior that is being d These notices are collected during the release process and rendered into two sections of the release notes: -- **`deprecations`** – items whose removal version matches the current release (enacted now). -- **`planned_deprecations`** – items scheduled for removal in a future release. +- **`deprecation_announcements`** – items deprecated in this release (announced for the first time). +- **`planned_deprecations`** – items deprecated in an earlier release. ## File format @@ -16,7 +16,7 @@ Each file must be named `.md` and begin with YAML frontmatter: ````markdown --- what: "`legacy_auth` configuration option" -deprecation_version: 0.57.0 +deprecated_since: "0.57.0" --- The `legacy_auth` option has been replaced by the new `auth` block. @@ -40,7 +40,7 @@ auth: | Field | Required | Description | | ----- | -------- | ----------- | | `what` | Yes | Short one-line description of what is deprecated. | -| `deprecation_version` | Yes | Version when the item will be removed. Accepts a semver string (`0.56`, `0.56.0`). Must be greater than the latest released version. | +| `deprecated_since` | Yes | The release version in which this deprecation was first announced. Accepts a semver string (`0.56`, `0.56.0`). | ### Body @@ -51,13 +51,10 @@ or links to further documentation. It is rendered verbatim in the release notes. 1. **Announce** – a PR adds a file to this directory when the deprecation is first introduced. 2. **Planned** – every subsequent release lists the entry under `planned_deprecations`. -3. **Enacted** – when the release version equals `deprecation_version`, the entry moves to - `deprecations` in the release notes and the file is removed from this directory. +3. **Removed** – when a deprecated feature is finally removed, the PR deletes the file from this directory. ## Validation -Run `cargo vdev check deprecations` to validate all files in this directory. The check also -verifies that each `deprecation_version` is greater than the latest released version — entries -that should have been enacted and removed will cause the check to fail. +Run `cargo vdev check deprecations` to validate all files in this directory. To preview the current deprecation state, run `cargo vdev deprecation show`. diff --git a/deprecation.d/azure-monitor-logs-sink.md b/deprecation.d/azure-monitor-logs-sink.md index 81064a9c7d996..f35b45a3a923a 100644 --- a/deprecation.d/azure-monitor-logs-sink.md +++ b/deprecation.d/azure-monitor-logs-sink.md @@ -1,6 +1,6 @@ --- what: "`azure_monitor_logs` sink" -deprecation_version: 0.58 +deprecated_since: "0.58.0" --- The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink, diff --git a/deprecation.d/bool-or-vector-compression.md b/deprecation.d/bool-or-vector-compression.md index 0cb61b37f13e7..cae934f8197c6 100644 --- a/deprecation.d/bool-or-vector-compression.md +++ b/deprecation.d/bool-or-vector-compression.md @@ -1,6 +1,6 @@ --- what: "Boolean syntax for the `compression` field in the `vector` sink" -deprecation_version: 0.56 +deprecated_since: "0.56.0" --- The boolean syntax (`compression: true` / `compression: false`) is deprecated. diff --git a/deprecation.d/buffer-bytes-events-metrics.md b/deprecation.d/buffer-bytes-events-metrics.md index ce1c9cb94d98c..5f26239560545 100644 --- a/deprecation.d/buffer-bytes-events-metrics.md +++ b/deprecation.d/buffer-bytes-events-metrics.md @@ -1,6 +1,6 @@ --- what: "`buffer_byte_size` and `buffer_events` gauge metrics" -deprecation_version: 0.60 +deprecated_since: "0.53.0" --- The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the diff --git a/deprecation.d/datadog-metrics-series-v1.md b/deprecation.d/datadog-metrics-series-v1.md index 3522a58e067c5..bdc6d87a1ebee 100644 --- a/deprecation.d/datadog-metrics-series-v1.md +++ b/deprecation.d/datadog-metrics-series-v1.md @@ -1,6 +1,6 @@ --- what: "`series_api_version: v1` option on the `datadog_metrics` sink" -deprecation_version: 0.58 +deprecated_since: "0.58.0" --- The `series_api_version: v1` option is deprecated in favor of `v2` (the default). diff --git a/deprecation.d/example-fake-deprecation.md b/deprecation.d/example-fake-deprecation.md index 4c8d49ce6e6e7..7dc0f8d775ff2 100644 --- a/deprecation.d/example-fake-deprecation.md +++ b/deprecation.d/example-fake-deprecation.md @@ -1,6 +1,6 @@ --- what: "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]" -deprecation_version: 0.58 +deprecated_since: "0.56.0" --- This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging. diff --git a/deprecation.d/greptimedb-v0-support.md b/deprecation.d/greptimedb-v0-support.md index 423f659c8c343..f0275351408b1 100644 --- a/deprecation.d/greptimedb-v0-support.md +++ b/deprecation.d/greptimedb-v0-support.md @@ -1,6 +1,6 @@ --- what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" -deprecation_version: 0.56 +deprecated_since: "0.55.0" --- The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. diff --git a/deprecation.d/http-server-encoding.md b/deprecation.d/http-server-encoding.md index 176da099de855..9753bac0ab5f8 100644 --- a/deprecation.d/http-server-encoding.md +++ b/deprecation.d/http-server-encoding.md @@ -1,6 +1,6 @@ --- what: "`encoding` field on HTTP server sources" -deprecation_version: 0.60 +deprecated_since: "0.50.0" --- The `encoding` field will be removed. Use `decoding` and `framing` instead. diff --git a/docs/DEPRECATION_POLICY.md b/docs/DEPRECATION_POLICY.md index ed5a02b6bdaa4..194938e74906c 100644 --- a/docs/DEPRECATION_POLICY.md +++ b/docs/DEPRECATION_POLICY.md @@ -81,12 +81,8 @@ When introducing a deprecation into Vector, the pull request introducing the dep - Add a log message to Vector that is logged at the `WARN` level starting with the word `DEPRECATION` if Vector detects the deprecated configuration or feature being used (when possible). - Add a deprecation notice file to [`deprecation.d/`](../deprecation.d/) following the format described in - [`deprecation.d/README.md`](../deprecation.d/README.md). Both `announcement_version` and `deprecation_version` - are required. Set `announcement_version` to `next` (recommended) or the current release version if known. Set - `deprecation_version` to the planned removal version or `next` if removal is intended - for the very next release. The release tooling will replace any `next` values with the concrete version when the - release is cut. Run `cargo vdev deprecation show` to view all current notices and `cargo vdev check deprecations` - to validate the file. + [`deprecation.d/README.md`](../deprecation.d/README.md). Set `deprecated_since` to the current release version. + Run `cargo vdev deprecation show` to view all current notices and `cargo vdev check deprecations` to validate the file. When removing a deprecation in a subsequent release, the pull request should: @@ -96,5 +92,4 @@ When removing a deprecation in a subsequent release, the pull request should: for transitioning if applicable. - Copy the same note from the previous step, to a changelog fragment, with type="breaking". See the changelog fragment [README.md](../changelog.d/README.md) for details. -- Remove the file from [`deprecation.d/`](../deprecation.d/) (the release tooling does this automatically when - `deprecation_version` matches the release being cut) +- Delete the file from [`deprecation.d/`](../deprecation.d/) diff --git a/vdev/src/commands/check/deprecations.rs b/vdev/src/commands/check/deprecations.rs index 33a4cbce1ddce..19ac24a6f0581 100644 --- a/vdev/src/commands/check/deprecations.rs +++ b/vdev/src/commands/check/deprecations.rs @@ -1,8 +1,8 @@ #![allow(clippy::print_stdout)] -use anyhow::{Result, bail}; +use anyhow::Result; -use crate::utils::{deprecation, git, paths}; +use crate::utils::{deprecation, paths}; /// Check that all deprecation.d fragments are valid #[derive(clap::Args, Debug)] @@ -34,35 +34,6 @@ impl Cli { } println!("{} deprecation fragment(s) are valid.", entries.len()); - // Validate that no fragment's deprecation_version has already been released. - match git::latest_release_version() { - Ok(latest) => { - let mut stale = false; - for entry in &entries { - if !entry.deprecation_version.is_future_relative_to(&latest) { - eprintln!( - " STALE {} (deprecation_version {} is not greater than latest release {})", - entry.filename, entry.deprecation_version, latest - ); - stale = true; - } - } - if stale { - bail!( - "One or more deprecation fragments have a deprecation_version \ - that is not greater than the latest release v{latest}. \ - These should have been enacted and removed during the {latest} release." - ); - } - println!( - "All deprecation_versions are greater than latest release v{latest}." - ); - } - Err(e) => { - eprintln!("Warning: could not determine latest release version ({e}); skipping version freshness check."); - } - } - Ok(()) } } diff --git a/vdev/src/commands/deprecation/show.rs b/vdev/src/commands/deprecation/show.rs index 69450a444ad79..447f6468ae728 100644 --- a/vdev/src/commands/deprecation/show.rs +++ b/vdev/src/commands/deprecation/show.rs @@ -5,18 +5,14 @@ use owo_colors::{OwoColorize, Stream::Stdout, Style}; use semver::Version; use crate::utils::{ - deprecation::{self, DeprecationEntry, DeprecationVersion}, + deprecation::{self, DeprecationEntry}, git, paths, }; -/// Show upcoming and in-progress deprecation notices +/// Show current and upcoming deprecation notices #[derive(clap::Args, Debug)] #[command()] -pub struct Cli { - /// Filter to only show entries whose `deprecation_version` matches this release version. - #[arg(long)] - version: Option, -} +pub struct Cli {} impl Cli { pub fn exec(self) -> Result<()> { @@ -35,31 +31,15 @@ impl Cli { return Ok(()); } - entries.sort_by(|a, b| a.deprecation_version.cmp(&b.deprecation_version)); - - // When --version is given, show only entries enacted in that release. - if let Some(ref version) = self.version { - entries.retain(|e| e.deprecation_version.matches_release(version)); - if entries.is_empty() { - println!("No deprecations enacted in v{version}."); - return Ok(()); - } - print_section_header(&format!("Deprecations enacted in {version}")); - for e in &entries { - print_entry(e, None); - } - return Ok(()); - } + entries.sort_by(|a, b| a.deprecated_since.cmp(&b.deprecated_since)); // Determine the next minor release version (best-effort). let next_minor: Option = git::latest_release_version() .ok() .map(|v| Version::new(v.major, v.minor + 1, 0)); - // Use the computed next minor as the "release" for partitioning. let partition_version = next_minor.clone().unwrap_or_else(|| Version::new(0, 0, 0)); let p = deprecation::partition_by_release(entries, &partition_version); - let enacted: Vec<&DeprecationEntry> = p.enacted.iter().collect(); let announcing: Vec<&DeprecationEntry> = p.announcing.iter().collect(); let planned: Vec<&DeprecationEntry> = p.planned.iter().collect(); @@ -68,18 +48,11 @@ impl Cli { None => "next".to_string(), }; - let nm = next_minor.as_ref(); - print_section( - &format!("Enacted in next release ({next_label})"), - &enacted, - nm, - ); print_section( &format!("Announced in next release ({next_label})"), &announcing, - nm, ); - print_section("Previously announced", &planned, nm); + print_section("Previously announced", &planned); Ok(()) } @@ -91,24 +64,26 @@ fn print_section_header(title: &str) { println!(); } -fn print_section(title: &str, entries: &[&DeprecationEntry], next_minor: Option<&Version>) { +fn print_section(title: &str, entries: &[&DeprecationEntry]) { print_section_header(title); if entries.is_empty() { println!("{}", "(none)".if_supports_color(Stdout, |t| t.dimmed())); } else { for e in entries { - print_entry(e, next_minor); + print_entry(e); } } println!(); } -fn print_entry(e: &DeprecationEntry, next_minor: Option<&Version>) { +fn print_entry(e: &DeprecationEntry) { println!("{}", e.what.if_supports_color(Stdout, |t| t.bold())); println!( " {} {}", - "deprecated:".if_supports_color(Stdout, |t| t.dimmed()), - format_version(&e.deprecation_version, next_minor), + "deprecated_since:".if_supports_color(Stdout, |t| t.dimmed()), + e.deprecated_since + .to_string() + .if_supports_color(Stdout, |t| t.bright_cyan()), ); if !e.description.is_empty() { println!(); @@ -118,19 +93,3 @@ fn print_entry(e: &DeprecationEntry, next_minor: Option<&Version>) { } println!(); } - -fn format_version(v: &DeprecationVersion, next_minor: Option<&Version>) -> String { - let is_next = next_minor.is_some_and(|nv| v.matches_release(nv)); - - if is_next { - let style = Style::new().bright_red().bold(); - return v - .to_string() - .if_supports_color(Stdout, |t| t.style(style)) - .to_string(); - } - - v.to_string() - .if_supports_color(Stdout, |t| t.bright_cyan()) - .to_string() -} diff --git a/vdev/src/commands/release/generate_cue.rs b/vdev/src/commands/release/generate_cue.rs index 9b9b6531da266..99cbcbf56d46b 100644 --- a/vdev/src/commands/release/generate_cue.rs +++ b/vdev/src/commands/release/generate_cue.rs @@ -103,7 +103,6 @@ pub(super) fn run(new_version: &Version) -> Result { let all_deprecations = deprecation::read_deprecation_fragments(&deprecation_dir)?; let deprecation::DeprecationPartition { - enacted: enacted_deprecations, announcing: announcing_deprecations, planned: planned_deprecations, } = deprecation::partition_by_release(all_deprecations, &new_version); @@ -112,19 +111,12 @@ pub(super) fn run(new_version: &Version) -> Result { &new_version, &changelog_entries, &commits, - &enacted_deprecations, &announcing_deprecations, &planned_deprecations, ); fs::write(&cue_path, cue_text) .with_context(|| format!("Failed to write {}", cue_path.display()))?; - // Promote new-announcement fragments from *.md to *.announced.md. - rename_announcing_fragments(&deprecation_dir, &announcing_deprecations)?; - - // Retire enacted deprecation fragments via `git rm`. - retire_deprecation_fragments(&deprecation_dir, &enacted_deprecations)?; - // Retire the changelog fragments via `git rm` (preserves README.md). retire_changelog_fragments(&changelog_dir)?; @@ -562,41 +554,12 @@ fn retire_changelog_fragments(dir: &Path) -> Result<()> { Ok(()) } -fn rename_announcing_fragments(dir: &Path, announcing: &[DeprecationEntry]) -> Result<()> { - if announcing.is_empty() { - return Ok(()); - } - let cwd = env::current_dir()?; - for entry in announcing { - let src = dir.join(&entry.filename); - let dst = deprecation::announced_path(&src); - let src_rel = src.strip_prefix(&cwd).unwrap_or(&src); - let dst_rel = dst.strip_prefix(&cwd).unwrap_or(&dst); - git::mv(&src_rel.to_string_lossy(), &dst_rel.to_string_lossy())?; - } - Ok(()) -} - -fn retire_deprecation_fragments(dir: &Path, enacted: &[DeprecationEntry]) -> Result<()> { - if !dir.is_dir() || enacted.is_empty() { - return Ok(()); - } - let cwd = env::current_dir()?; - for entry in enacted { - let path = dir.join(&entry.filename); - let rel = path.strip_prefix(&cwd).unwrap_or(&path); - git::rm(&rel.to_string_lossy())?; - } - Ok(()) -} - // ---------- CUE rendering ---------- fn render_release_cue( version: &Version, changelog: &[ChangelogEntry], commits: &[Commit], - enacted_deprecations: &[DeprecationEntry], announcing_deprecations: &[DeprecationEntry], planned_deprecations: &[DeprecationEntry], ) -> String { @@ -608,7 +571,6 @@ fn render_release_cue( .collect::>() .join(",\n "); - let deprecations_block = render_deprecation_section(enacted_deprecations); let deprecation_announcements_block = render_deprecation_section(announcing_deprecations); let planned_deprecations_block = render_deprecation_section(planned_deprecations); @@ -621,10 +583,6 @@ fn render_release_cue( \n\ \twhats_next: []\n\ \n\ - \tdeprecations: [\n\ - {deprecations_block}\n\ - \t]\n\ - \n\ \tdeprecation_announcements: [\n\ {deprecation_announcements_block}\n\ \t]\n\ @@ -651,8 +609,8 @@ fn render_deprecation_section(entries: &[DeprecationEntry]) -> String { writeln!(s, "\t\t\twhat: {}", json!(e.what)).unwrap(); writeln!( s, - "\t\t\tdeprecation_version: {}", - json!(e.deprecation_version.to_string()) + "\t\t\tdeprecated_since: {}", + json!(e.deprecated_since.to_string()) ) .unwrap(); if !e.description.is_empty() { @@ -863,7 +821,7 @@ mod tests { deletions_count: 3, }]; - let out = render_release_cue(&Version::new(0, 99, 0), &entries, &commits, &[], &[], &[]); + let out = render_release_cue(&Version::new(0, 99, 0), &entries, &commits, &[], &[]); assert!(out.starts_with("package metadata\n")); assert!(out.contains("releases: \"0.99.0\":")); diff --git a/vdev/src/utils/deprecation.rs b/vdev/src/utils/deprecation.rs index fcf90593ba163..8866eb1774ab9 100644 --- a/vdev/src/utils/deprecation.rs +++ b/vdev/src/utils/deprecation.rs @@ -8,7 +8,7 @@ use semver::Version; pub const DEPRECATION_DIR: &str = "deprecation.d"; -/// A concrete semver version identifying when a deprecation takes effect. +/// A concrete semver version identifying when a deprecation was announced. /// Accepted forms: `"0.56"` (major.minor) or `"0.56.0"` (major.minor.patch). #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] pub struct DeprecationVersion(pub Version); @@ -20,17 +20,11 @@ impl fmt::Display for DeprecationVersion { } impl DeprecationVersion { - /// Returns true when this version should be enacted for the given release. + /// Returns true when this version's major.minor matches the release. /// Patch is ignored so `0.56` (stored as 0.56.0) matches any 0.56.x release. pub fn matches_release(&self, release: &Version) -> bool { self.0.major == release.major && self.0.minor == release.minor } - - /// Returns true when this version is strictly in the future relative to `latest`. - /// A fragment is outdated if its deprecation_version ≤ the latest release. - pub fn is_future_relative_to(&self, latest: &Version) -> bool { - (self.0.major, self.0.minor) > (latest.major, latest.minor) - } } impl<'de> serde::Deserialize<'de> for DeprecationVersion { @@ -55,7 +49,7 @@ use serde::Deserialize; #[derive(Debug, Deserialize)] struct Frontmatter { what: String, - deprecation_version: DeprecationVersion, + deprecated_since: DeprecationVersion, } /// A parsed and validated deprecation entry from `deprecation.d/`. @@ -63,50 +57,38 @@ struct Frontmatter { pub struct DeprecationEntry { pub filename: String, pub what: String, - pub deprecation_version: DeprecationVersion, + /// The release in which this deprecation was first announced. + pub deprecated_since: DeprecationVersion, /// Optional body text (everything after the closing `---` of the frontmatter). pub description: String, - /// True for `*.announced.md` files (announced in a prior release). - /// False for `*.md` files (being announced for the first time). - pub previously_announced: bool, } /// The result of partitioning deprecation entries relative to a specific release. pub struct DeprecationPartition { - /// Entries whose `deprecation_version` matches the release (being removed now). - pub enacted: Vec, - /// Not-enacted entries with `previously_announced = false` (new this release). + /// Entries whose `deprecated_since` matches the release (announced for the first time now). pub announcing: Vec, - /// Not-enacted entries with `previously_announced = true` (announced earlier). + /// Entries whose `deprecated_since` predates the release (announced in an earlier release). pub planned: Vec, } -/// Partition a list of deprecation entries into three buckets relative to `release`. +/// Partition a list of deprecation entries into two buckets relative to `release`. pub fn partition_by_release( entries: Vec, release: &Version, ) -> DeprecationPartition { - let mut enacted = Vec::new(); let mut announcing = Vec::new(); let mut planned = Vec::new(); for e in entries { - if e.deprecation_version.matches_release(release) { - enacted.push(e); - } else if e.previously_announced { - planned.push(e); - } else { + if e.deprecated_since.matches_release(release) { announcing.push(e); + } else { + planned.push(e); } } - DeprecationPartition { - enacted, - announcing, - planned, - } + DeprecationPartition { announcing, planned } } /// Read and parse all deprecation fragments from the given directory. -/// Includes both `*.md` (new) and `*.announced.md` (previously announced) files. /// Returns entries sorted by filename. pub fn read_deprecation_fragments(dir: &Path) -> Result> { if !dir.is_dir() { @@ -123,27 +105,12 @@ pub fn read_deprecation_fragments(dir: &Path) -> Result> { .collect() } -/// Returns the path with `.md` replaced by `.announced.md`. -/// Used by the release tooling to mark a new-announcement fragment as having been announced. -pub fn announced_path(path: &Path) -> PathBuf { - let stem = path - .file_stem() - .and_then(|s| s.to_str()) - .unwrap_or(""); - let announced_name = format!("{stem}.announced.md"); - path.with_file_name(announced_name) -} - fn is_deprecation_fragment(path: &Path) -> bool { let name = match path.file_name().and_then(|n| n.to_str()) { Some(n) => n, None => return false, }; - if name == "README.md" { - return false; - } - // Accept *.announced.md and *.md (but not *.announced.md double-counted via extension) - name.ends_with(".announced.md") || (name.ends_with(".md") && !name.ends_with(".announced.md")) + name != "README.md" && name.ends_with(".md") } fn parse_deprecation_fragment(path: &Path) -> Result { @@ -153,8 +120,6 @@ fn parse_deprecation_fragment(path: &Path) -> Result { .unwrap_or("") .to_string(); - let previously_announced = filename.ends_with(".announced.md"); - let raw = fs::read_to_string(path).with_context(|| format!("Failed to read {}", path.display()))?; @@ -173,9 +138,8 @@ fn parse_deprecation_fragment(path: &Path) -> Result { Ok(DeprecationEntry { filename, what: fm.what.trim().to_string(), - deprecation_version: fm.deprecation_version, + deprecated_since: fm.deprecated_since, description: body.trim().to_string(), - previously_announced, }) } @@ -215,11 +179,11 @@ mod tests { use tempfile::tempdir; #[test] - fn parse_new_entry() { + fn parse_full_entry() { let tmp = tempdir().unwrap(); fs::write( tmp.path().join("foo_opt.md"), - "---\nwhat: The foo option\ndeprecation_version: \"0.57.0\"\n---\n\nDetailed explanation.\n", + "---\nwhat: The foo option\ndeprecated_since: \"0.57.0\"\n---\n\nDetailed explanation.\n", ) .unwrap(); let entries = read_deprecation_fragments(tmp.path()).unwrap(); @@ -227,24 +191,10 @@ mod tests { let e = &entries[0]; assert_eq!(e.what, "The foo option"); assert_eq!( - e.deprecation_version, + e.deprecated_since, DeprecationVersion(Version::new(0, 57, 0)) ); assert_eq!(e.description, "Detailed explanation."); - assert!(!e.previously_announced); - } - - #[test] - fn parse_announced_entry() { - let tmp = tempdir().unwrap(); - fs::write( - tmp.path().join("foo_opt.announced.md"), - "---\nwhat: The foo option\ndeprecation_version: \"0.57.0\"\n---\n\nDetailed explanation.\n", - ) - .unwrap(); - let entries = read_deprecation_fragments(tmp.path()).unwrap(); - assert_eq!(entries.len(), 1); - assert!(entries[0].previously_announced); } #[test] @@ -259,7 +209,7 @@ mod tests { let tmp = tempdir().unwrap(); fs::write( tmp.path().join("empty.md"), - "---\nwhat: \" \"\ndeprecation_version: \"0.60.0\"\n---\n", + "---\nwhat: \" \"\ndeprecated_since: \"0.60.0\"\n---\n", ) .unwrap(); assert!(read_deprecation_fragments(tmp.path()).is_err()); @@ -278,12 +228,12 @@ mod tests { let tmp = tempdir().unwrap(); fs::write( tmp.path().join("short.md"), - "---\nwhat: Short version\ndeprecation_version: \"0.56\"\n---\n", + "---\nwhat: Short version\ndeprecated_since: \"0.56\"\n---\n", ) .unwrap(); let entries = read_deprecation_fragments(tmp.path()).unwrap(); assert_eq!( - entries[0].deprecation_version, + entries[0].deprecated_since, DeprecationVersion(Version::new(0, 56, 0)) ); } @@ -297,47 +247,23 @@ mod tests { } #[test] - fn is_future_relative_to() { - let v = DeprecationVersion(Version::new(0, 57, 0)); - assert!(v.is_future_relative_to(&Version::new(0, 56, 0))); - assert!(!v.is_future_relative_to(&Version::new(0, 57, 0))); - assert!(!v.is_future_relative_to(&Version::new(0, 58, 0))); - } - - #[test] - fn partition_three_buckets() { + fn partition_two_buckets() { let tmp = tempdir().unwrap(); - fs::write( - tmp.path().join("enacted.md"), - "---\nwhat: Enacted\ndeprecation_version: \"0.56\"\n---\n", - ) - .unwrap(); fs::write( tmp.path().join("new.md"), - "---\nwhat: New announcement\ndeprecation_version: \"0.58\"\n---\n", + "---\nwhat: New announcement\ndeprecated_since: \"0.56\"\n---\n", ) .unwrap(); fs::write( - tmp.path().join("old.announced.md"), - "---\nwhat: Previously announced\ndeprecation_version: \"0.60\"\n---\n", + tmp.path().join("old.md"), + "---\nwhat: Previously announced\ndeprecated_since: \"0.53\"\n---\n", ) .unwrap(); let entries = read_deprecation_fragments(tmp.path()).unwrap(); let p = partition_by_release(entries, &Version::new(0, 56, 0)); - assert_eq!(p.enacted.len(), 1); - assert_eq!(p.enacted[0].what, "Enacted"); assert_eq!(p.announcing.len(), 1); assert_eq!(p.announcing[0].what, "New announcement"); assert_eq!(p.planned.len(), 1); assert_eq!(p.planned[0].what, "Previously announced"); } - - #[test] - fn announced_path_replaces_extension() { - let p = Path::new("deprecation.d/foo-bar.md"); - assert_eq!( - announced_path(p), - Path::new("deprecation.d/foo-bar.announced.md") - ); - } } diff --git a/vdev/src/utils/git.rs b/vdev/src/utils/git.rs index d142e9efa0fb0..6141d4443d1e1 100644 --- a/vdev/src/utils/git.rs +++ b/vdev/src/utils/git.rs @@ -141,11 +141,6 @@ pub fn latest_release_version() -> Result { anyhow::bail!("No valid semantic version tag found") } -/// Renames/moves a file using `git mv`. -pub fn mv(src: &str, dst: &str) -> Result { - Command::new("git").args(["mv", src, dst]).check_output() -} - /// Removes a file from the index (and working tree) using `git rm`. pub fn rm(path: &str) -> Result { Command::new("git").args(["rm", path]).check_output() diff --git a/website/cue/reference/releases.cue b/website/cue/reference/releases.cue index 66c35f553d832..62c3115c26b96 100644 --- a/website/cue/reference/releases.cue +++ b/website/cue/reference/releases.cue @@ -29,9 +29,9 @@ releases: { } #DeprecationEntry: { - what: string - deprecation_version: string - description?: string + what: string + deprecated_since: string + description?: string } #Release: { @@ -45,7 +45,6 @@ releases: { changelog: [#ChangeLogEntry, ...#ChangeLogEntry] | *[] vrl_changelog?: string whats_next: #Any | *[] - deprecations: [#DeprecationEntry, ...#DeprecationEntry] | *[] deprecation_announcements: [#DeprecationEntry, ...#DeprecationEntry] | *[] planned_deprecations: [#DeprecationEntry, ...#DeprecationEntry] | *[] } diff --git a/website/cue/reference/releases/0.56.0.cue b/website/cue/reference/releases/0.56.0.cue index a93044ab37a9c..46ad04a2c83df 100644 --- a/website/cue/reference/releases/0.56.0.cue +++ b/website/cue/reference/releases/0.56.0.cue @@ -6,31 +6,28 @@ releases: "0.56.0": { whats_next: [] - deprecations: [ + deprecation_announcements: [ { - what: "Boolean syntax for the `compression` field in the `vector` sink" - deprecation_version: "0.56.0" + what: "Boolean syntax for the `compression` field in the `vector` sink" + deprecated_since: "0.56.0" description: #""" The boolean syntax (`compression: true` / `compression: false`) is deprecated. Use the string syntax instead: `compression: "gzip"`, `compression: "zstd"`, or `compression: "none"`. - + The `bool_or_vector_compression` deserializer will be removed once the boolean syntax is no longer supported. """# }, { - what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" - deprecation_version: "0.56.0" + what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" + deprecated_since: "0.56.0" description: #""" The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. Users must upgrade their GreptimeDB instance to v1.x before upgrading Vector. """# }, - ] - - deprecation_announcements: [ { - what: "`azure_monitor_logs` sink" - deprecation_version: "0.58.0" + what: "`azure_monitor_logs` sink" + deprecated_since: "0.58.0" description: #""" The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink, which uses the Azure Monitor Logs Ingestion API. @@ -40,16 +37,16 @@ releases: "0.56.0": { """# }, { - what: "`buffer_byte_size` and `buffer_events` gauge metrics" - deprecation_version: "0.60.0" + what: "`buffer_byte_size` and `buffer_events` gauge metrics" + deprecated_since: "0.53.0" description: #""" The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the `buffer_size_bytes` and `buffer_size_events` metrics described in `docs/specs/buffer.md`. """# }, { - what: "`series_api_version: v1` option on the `datadog_metrics` sink" - deprecation_version: "0.58.0" + what: "`series_api_version: v1` option on the `datadog_metrics` sink" + deprecated_since: "0.58.0" description: #""" The `series_api_version: v1` option is deprecated in favor of `v2` (the default). The v1 series endpoint (`/api/v1/series`) is a legacy endpoint. @@ -58,15 +55,15 @@ releases: "0.56.0": { """# }, { - what: "`encoding` field on HTTP server sources" - deprecation_version: "0.60.0" + what: "`encoding` field on HTTP server sources" + deprecated_since: "0.50.0" description: #""" The `encoding` field will be removed. Use `decoding` and `framing` instead. """# }, { - what: "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]" - deprecation_version: "0.58.0" + what: "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]" + deprecated_since: "0.56.0" description: #""" This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging. """# diff --git a/website/layouts/releases/single.html b/website/layouts/releases/single.html index 6b9566916c5b3..a879fd0ec11f0 100644 --- a/website/layouts/releases/single.html +++ b/website/layouts/releases/single.html @@ -54,32 +54,6 @@
{{ end }} - {{ if gt (len $release.deprecations) 0 }} -
-
- {{ partial "heading.html" (dict "text" "Deprecations" "level" 2) }} -
- -
- {{ range $release.deprecations }} -
- - {{ .what | markdownify }} - -
- Removed in {{ .deprecation_version }} -
- {{ with .description }} -
- {{ . | markdownify }} -
- {{ end }} -
- {{ end }} -
-
- {{ end }} - {{ if gt (len $release.deprecation_announcements) 0 }}
@@ -93,7 +67,7 @@ {{ .what | markdownify }}
- Planned removal in {{ .deprecation_version }} + Deprecated since {{ .deprecated_since }}
{{ with .description }}
@@ -279,7 +253,7 @@ {{ .what | markdownify }}
- Planned removal in {{ .deprecation_version }} + Deprecated since {{ .deprecated_since }}
{{ with .description }}
From 00c1d7e13bab50a70953c2f41164a35f2007cee5 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 12:43:06 -0400 Subject: [PATCH 39/85] chore(releasing): regenerate 0.56.0.cue with new deprecation schema --- .../10870_http_retry_strategy.feature.md | 7 -- ...http_retry_transport_errors.enhancement.md | 9 --- ...13_remove_default_os_package_config.fix.md | 7 -- .../20278_expected_event_count.feature.md | 3 - ...ector_sink_zstd_compression.enhancement.md | 33 ---------- .../24840_databricks_zerobus_sink.feature.md | 3 - ...c_decompression_reject_unnegotiated.fix.md | 6 -- .../24917_otel_source_zstd.enhancement.md | 7 -- .../24929_fix_stall_on_disk_shutdown.fix.md | 6 -- ...25194_windows_event_log_lost_wakeup.fix.md | 3 - ...25199_batch_encoding_events_dropped.fix.md | 3 - ...plunk_hec_source_specify_wrong_auth.fix.md | 3 - changelog.d/25253_el8_glibc_floor.fix.md | 3 - .../25267_vrl_get_env_var_playground.fix.md | 2 - ...3_enable_codecs_parquet_in_releases.fix.md | 3 - ...2_windows_event_log_source_metadata.fix.md | 3 - ...use_aws_s3_dedicated_batch_encoding.fix.md | 3 - changelog.d/drop_fakedata_generator.fix.md | 9 --- .../greptimedb_ingester_crate.breaking.md | 3 - changelog.d/mqtt_source_mutual_TLS.fix.md | 3 - .../sample_dynamic_ratio_field.feature.md | 3 - changelog.d/serde_group_bump.enhancement.md | 3 - .../splunk_hec_source_codec.enhancement.md | 20 ------ ...y_limit_per_tag_and_exclude.enhancement.md | 6 -- ...nality_limit_tracking_scope.enhancement.md | 6 -- website/cue/reference/releases/0.56.0.cue | 64 +++++++------------ 26 files changed, 22 insertions(+), 199 deletions(-) delete mode 100644 changelog.d/10870_http_retry_strategy.feature.md delete mode 100644 changelog.d/10870_http_retry_transport_errors.enhancement.md delete mode 100644 changelog.d/15513_remove_default_os_package_config.fix.md delete mode 100644 changelog.d/20278_expected_event_count.feature.md delete mode 100644 changelog.d/23030_vector_sink_zstd_compression.enhancement.md delete mode 100644 changelog.d/24840_databricks_zerobus_sink.feature.md delete mode 100644 changelog.d/24917_grpc_decompression_reject_unnegotiated.fix.md delete mode 100644 changelog.d/24917_otel_source_zstd.enhancement.md delete mode 100644 changelog.d/24929_fix_stall_on_disk_shutdown.fix.md delete mode 100644 changelog.d/25194_windows_event_log_lost_wakeup.fix.md delete mode 100644 changelog.d/25199_batch_encoding_events_dropped.fix.md delete mode 100644 changelog.d/25230_splunk_hec_source_specify_wrong_auth.fix.md delete mode 100644 changelog.d/25253_el8_glibc_floor.fix.md delete mode 100644 changelog.d/25267_vrl_get_env_var_playground.fix.md delete mode 100644 changelog.d/25313_enable_codecs_parquet_in_releases.fix.md delete mode 100644 changelog.d/25332_windows_event_log_source_metadata.fix.md delete mode 100644 changelog.d/clickhouse_aws_s3_dedicated_batch_encoding.fix.md delete mode 100644 changelog.d/drop_fakedata_generator.fix.md delete mode 100644 changelog.d/greptimedb_ingester_crate.breaking.md delete mode 100644 changelog.d/mqtt_source_mutual_TLS.fix.md delete mode 100644 changelog.d/sample_dynamic_ratio_field.feature.md delete mode 100644 changelog.d/serde_group_bump.enhancement.md delete mode 100644 changelog.d/splunk_hec_source_codec.enhancement.md delete mode 100644 changelog.d/tag_cardinality_limit_per_tag_and_exclude.enhancement.md delete mode 100644 changelog.d/tag_cardinality_limit_tracking_scope.enhancement.md diff --git a/changelog.d/10870_http_retry_strategy.feature.md b/changelog.d/10870_http_retry_strategy.feature.md deleted file mode 100644 index 09afba2eddd40..0000000000000 --- a/changelog.d/10870_http_retry_strategy.feature.md +++ /dev/null @@ -1,7 +0,0 @@ -HTTP-based sinks that use the shared retry helpers now support a `retry_strategy` configuration -option to control which HTTP response codes are retried. The `http` sink also includes a new -example showing how to retry only specific transient status codes. - -Issue: https://github.com/vectordotdev/vector/issues/10870 - -authors: ndrsg diff --git a/changelog.d/10870_http_retry_transport_errors.enhancement.md b/changelog.d/10870_http_retry_transport_errors.enhancement.md deleted file mode 100644 index f06f63b2f0e07..0000000000000 --- a/changelog.d/10870_http_retry_transport_errors.enhancement.md +++ /dev/null @@ -1,9 +0,0 @@ -HTTP-based sinks using the shared retry logic now classify transport-layer failures with -`HttpError::is_retriable`: connection and TLS connector issues may be retried, while failures -such as invalid HTTP request construction or an invalid proxy URI are not. Setting -`retry_strategy` to `none` disables retries for these transport errors and for request -timeouts, in addition to status-code-based retries. - -Issue: https://github.com/vectordotdev/vector/issues/10870 - -authors: ndrsg diff --git a/changelog.d/15513_remove_default_os_package_config.fix.md b/changelog.d/15513_remove_default_os_package_config.fix.md deleted file mode 100644 index e509742ff2564..0000000000000 --- a/changelog.d/15513_remove_default_os_package_config.fix.md +++ /dev/null @@ -1,7 +0,0 @@ -The default `/etc/vector/vector.yaml` config file is no longer installed by the Debian, RPM, Alpine, and distroless-static Docker packages. The previous default ran a `demo_logs` source and printed synthesized syslog lines to stdout, which then surfaced in journald or `/var/log/` on hosts running Vector as a service and was a common source of confusion. - -New installs will now have no active config on disk. Provide your own configuration at `/etc/vector/vector.yaml` (or pass `--config `) before starting Vector. A reference example is shipped at `/usr/share/vector/examples/vector.yaml`, and more sample configs remain at `/etc/vector/examples/`. - -Existing installs are unaffected on upgrade: package managers preserve the on-disk `/etc/vector/vector.yaml` if you already had one. - -authors: pront diff --git a/changelog.d/20278_expected_event_count.feature.md b/changelog.d/20278_expected_event_count.feature.md deleted file mode 100644 index 23dac198ecdea..0000000000000 --- a/changelog.d/20278_expected_event_count.feature.md +++ /dev/null @@ -1,3 +0,0 @@ -Unit tests now support an optional `expected_event_count` field on test outputs, allowing assertions on the number of events emitted by a transform. - -authors: pront diff --git a/changelog.d/23030_vector_sink_zstd_compression.enhancement.md b/changelog.d/23030_vector_sink_zstd_compression.enhancement.md deleted file mode 100644 index 5c1b8408d3248..0000000000000 --- a/changelog.d/23030_vector_sink_zstd_compression.enhancement.md +++ /dev/null @@ -1,33 +0,0 @@ -The `vector` sink now supports `zstd` compression in addition to `gzip`. This provides better -compression ratios and performance for Vector-to-Vector communication. - -The compression configuration has been enhanced to support multiple algorithms while maintaining -full backward compatibility: - -## Legacy boolean syntax (still supported) - -```yaml -sinks: - my_vector: - type: vector - address: "localhost:6000" - compression: true # Uses gzip (default) - # or - compression: false # No compression -``` - -## New string syntax - -```yaml -sinks: - my_vector: - type: vector - address: "localhost:6000" - compression: "zstd" # Use zstd compression - # Supported values: "none", "gzip", "zstd" -``` - -The Vector source automatically accepts both gzip and zstd compressed data, enabling seamless -communication between Vector instances using different compression algorithms. - -authors: jpds diff --git a/changelog.d/24840_databricks_zerobus_sink.feature.md b/changelog.d/24840_databricks_zerobus_sink.feature.md deleted file mode 100644 index 34a8ecb1c9224..0000000000000 --- a/changelog.d/24840_databricks_zerobus_sink.feature.md +++ /dev/null @@ -1,3 +0,0 @@ -Add a new `databricks_zerobus` sink that streams log data to Databricks Unity Catalog tables via the Zerobus ingestion service. Supports OAuth 2.0 authentication, automatic schema fetching from Unity Catalog, and protobuf batch encoding. - -authors: flaviocruz diff --git a/changelog.d/24917_grpc_decompression_reject_unnegotiated.fix.md b/changelog.d/24917_grpc_decompression_reject_unnegotiated.fix.md deleted file mode 100644 index ef1e4a90cc53a..0000000000000 --- a/changelog.d/24917_grpc_decompression_reject_unnegotiated.fix.md +++ /dev/null @@ -1,6 +0,0 @@ -The shared gRPC decompression layer now rejects request frames that set the -compressed flag without a negotiated `grpc-encoding` (e.g. `identity` or a -missing header). Previously such malformed frames were silently decoded as -gzip, which could mask client/server compression-negotiation bugs. - -authors: jpds diff --git a/changelog.d/24917_otel_source_zstd.enhancement.md b/changelog.d/24917_otel_source_zstd.enhancement.md deleted file mode 100644 index 1a35e5257e968..0000000000000 --- a/changelog.d/24917_otel_source_zstd.enhancement.md +++ /dev/null @@ -1,7 +0,0 @@ -The `opentelemetry` source's gRPC OTLP receiver now accepts `zstd`-compressed -requests in addition to `gzip`, matching the compression schemes advertised via -the `grpc-accept-encoding` response header. No configuration change is required; -clients can send OTLP payloads with `grpc-encoding: zstd` and they will be -transparently decompressed. - -authors: jpds diff --git a/changelog.d/24929_fix_stall_on_disk_shutdown.fix.md b/changelog.d/24929_fix_stall_on_disk_shutdown.fix.md deleted file mode 100644 index 2c7633caef857..0000000000000 --- a/changelog.d/24929_fix_stall_on_disk_shutdown.fix.md +++ /dev/null @@ -1,6 +0,0 @@ -Fixed issue during in place reload of a sink with a disk buffer configured, where -the component would stall for batch.timeout_sec before gracefully reloading. -This fix also resolves issues Vector had where it would ignore SIGINT during -cases where the pipeline stall had occurred. - -authors: graphcareful diff --git a/changelog.d/25194_windows_event_log_lost_wakeup.fix.md b/changelog.d/25194_windows_event_log_lost_wakeup.fix.md deleted file mode 100644 index cb6f67987d67c..0000000000000 --- a/changelog.d/25194_windows_event_log_lost_wakeup.fix.md +++ /dev/null @@ -1,3 +0,0 @@ -The `windows_event_log` source no longer freezes after periods of inactivity. - -authors: tot19 diff --git a/changelog.d/25199_batch_encoding_events_dropped.fix.md b/changelog.d/25199_batch_encoding_events_dropped.fix.md deleted file mode 100644 index 214aad79a528c..0000000000000 --- a/changelog.d/25199_batch_encoding_events_dropped.fix.md +++ /dev/null @@ -1,3 +0,0 @@ -Sinks using batch encoding (Parquet, Arrow IPC) now consistently emit `ComponentEventsDropped` for every encode failure path. Previously some `build_record_batch` failures (notably type mismatches) dropped events silently. A new `EncoderRecordBatchError` internal event also reports `component_errors_total` with `error_code="arrow_json_decode"` or `"arrow_record_batch_creation"` at `stage="sending"` for granular alerting. - -authors: pront diff --git a/changelog.d/25230_splunk_hec_source_specify_wrong_auth.fix.md b/changelog.d/25230_splunk_hec_source_specify_wrong_auth.fix.md deleted file mode 100644 index 8c2af5dd212e4..0000000000000 --- a/changelog.d/25230_splunk_hec_source_specify_wrong_auth.fix.md +++ /dev/null @@ -1,3 +0,0 @@ -The error log + metric that `splunk_hec` source emit on missing/invalid auth header now specifies "authentication_failed" as error_type. - -authors: 20agbekodo diff --git a/changelog.d/25253_el8_glibc_floor.fix.md b/changelog.d/25253_el8_glibc_floor.fix.md deleted file mode 100644 index 8c638782e339a..0000000000000 --- a/changelog.d/25253_el8_glibc_floor.fix.md +++ /dev/null @@ -1,3 +0,0 @@ -Restored support for installing Vector on RHEL 8, Rocky Linux 8, AlmaLinux 8, and CentOS Stream 8, which had been broken since v0.55.0 due to an inadvertent glibc requirement bump. - -authors: pront diff --git a/changelog.d/25267_vrl_get_env_var_playground.fix.md b/changelog.d/25267_vrl_get_env_var_playground.fix.md deleted file mode 100644 index 29de5d36fe6a5..0000000000000 --- a/changelog.d/25267_vrl_get_env_var_playground.fix.md +++ /dev/null @@ -1,2 +0,0 @@ -Restored the full VRL stdlib, including `get_env_var`, in the standalone VRL CLI and web playground by default. -authors: pront diff --git a/changelog.d/25313_enable_codecs_parquet_in_releases.fix.md b/changelog.d/25313_enable_codecs_parquet_in_releases.fix.md deleted file mode 100644 index fe3baaf110d5e..0000000000000 --- a/changelog.d/25313_enable_codecs_parquet_in_releases.fix.md +++ /dev/null @@ -1,3 +0,0 @@ -Parquet encoding in the `aws_s3` sink (`batch_encoding`) now works out of the box in the official release binaries. Previously it required compiling Vector from source with the `codecs-parquet` feature. - -authors: pront diff --git a/changelog.d/25332_windows_event_log_source_metadata.fix.md b/changelog.d/25332_windows_event_log_source_metadata.fix.md deleted file mode 100644 index 936e773cc8588..0000000000000 --- a/changelog.d/25332_windows_event_log_source_metadata.fix.md +++ /dev/null @@ -1,3 +0,0 @@ -The `windows_event_log` source now adds standard source metadata, including `source_type`, to emitted log events. - -authors: tot19 diff --git a/changelog.d/clickhouse_aws_s3_dedicated_batch_encoding.fix.md b/changelog.d/clickhouse_aws_s3_dedicated_batch_encoding.fix.md deleted file mode 100644 index f39347d4c47bd..0000000000000 --- a/changelog.d/clickhouse_aws_s3_dedicated_batch_encoding.fix.md +++ /dev/null @@ -1,3 +0,0 @@ -The `aws_s3` and `clickhouse` sinks now correctly advertise only the `batch_encoding.codec` values they actually support: `parquet` for `aws_s3` and `arrow_stream` for `clickhouse`. Previously the documentation and configuration schema listed both codecs for both sinks, even though picking the wrong one produced a startup error. - -authors: flaviofcruz diff --git a/changelog.d/drop_fakedata_generator.fix.md b/changelog.d/drop_fakedata_generator.fix.md deleted file mode 100644 index 500e826bc3239..0000000000000 --- a/changelog.d/drop_fakedata_generator.fix.md +++ /dev/null @@ -1,9 +0,0 @@ -The text content generated by the `demo_logs` source has changed: the -pool of fake usernames and the pool of fake domain TLDs are now both -defined inside Vector rather than pulled from an external crate. The -line formats (`apache_common`, `apache_error`, `json`, `syslog`, -`bsd_syslog`) are unchanged. If any of your tests or downstream -pipelines assert on specific generated usernames or TLDs, please -update those expectations. - -authors: pront diff --git a/changelog.d/greptimedb_ingester_crate.breaking.md b/changelog.d/greptimedb_ingester_crate.breaking.md deleted file mode 100644 index 79984693ef8e1..0000000000000 --- a/changelog.d/greptimedb_ingester_crate.breaking.md +++ /dev/null @@ -1,3 +0,0 @@ -The `greptimedb_metrics` and `greptimedb_logs` sinks now require GreptimeDB v1.x. Users running GreptimeDB v0.x must upgrade their GreptimeDB instance before upgrading Vector. - -authors: thomasqueirozb diff --git a/changelog.d/mqtt_source_mutual_TLS.fix.md b/changelog.d/mqtt_source_mutual_TLS.fix.md deleted file mode 100644 index 9d1c52d65c370..0000000000000 --- a/changelog.d/mqtt_source_mutual_TLS.fix.md +++ /dev/null @@ -1,3 +0,0 @@ -Fixed a bug in the `mqtt` source where user-provided TLS client certificates (`crt_file` / `key_file`) were being silently ignored, breaking mTLS connections to strict brokers like AWS IoT Core. - -authors: mr- diff --git a/changelog.d/sample_dynamic_ratio_field.feature.md b/changelog.d/sample_dynamic_ratio_field.feature.md deleted file mode 100644 index d2e3c04839c19..0000000000000 --- a/changelog.d/sample_dynamic_ratio_field.feature.md +++ /dev/null @@ -1,3 +0,0 @@ -Added `ratio_field` and `rate_field` options to the `sample` transform to support dynamic per-event sampling, while requiring static `rate` or `ratio` fallback configuration and disallowing `ratio_field` and `rate_field` together. - -authors: jhammer diff --git a/changelog.d/serde_group_bump.enhancement.md b/changelog.d/serde_group_bump.enhancement.md deleted file mode 100644 index 3c9ea910c6601..0000000000000 --- a/changelog.d/serde_group_bump.enhancement.md +++ /dev/null @@ -1,3 +0,0 @@ -Bumped `serde_json` to `1.0.149` and `serde_with` to `3.18.0`. `serde_json` switched its float-to-string formatter from Ryū to Żmij in `1.0.147`, so floats serialized via the `native_json` codec may render with slightly different textual form (for example `1e+16` instead of `1e16`). The change is purely cosmetic: parsed `f32`/`f64` values round-trip identically, and Vector-to-Vector communication between old and new versions is unaffected. - -authors: pront diff --git a/changelog.d/splunk_hec_source_codec.enhancement.md b/changelog.d/splunk_hec_source_codec.enhancement.md deleted file mode 100644 index 93c3bfe86f522..0000000000000 --- a/changelog.d/splunk_hec_source_codec.enhancement.md +++ /dev/null @@ -1,20 +0,0 @@ -The `splunk_hec` source now accepts optional per-endpoint codec configuration via `event: { framing, decoding }` and `raw: { framing, decoding }`. When `decoding` is set on an endpoint, Vector applies a second decoding pass after the HEC envelope is parsed: on `/services/collector/event` the envelope's `event` field is fed through the codec, and on `/services/collector/raw` the request body is fed through the codec directly. A single payload can fan out to multiple events. - -For example, to decode JSON payloads in `/event` requests while splitting `/raw` bodies on newlines: - -```yaml -sources: - hec: - type: splunk_hec - address: 0.0.0.0:8088 - event: - decoding: - codec: json - raw: - framing: - method: newline_delimited - decoding: - codec: bytes -``` - -authors: thomasqueirozb diff --git a/changelog.d/tag_cardinality_limit_per_tag_and_exclude.enhancement.md b/changelog.d/tag_cardinality_limit_per_tag_and_exclude.enhancement.md deleted file mode 100644 index 9d05f3170b305..0000000000000 --- a/changelog.d/tag_cardinality_limit_per_tag_and_exclude.enhancement.md +++ /dev/null @@ -1,6 +0,0 @@ -The `tag_cardinality_limit` transform gained two new configuration capabilities: - -- **Per-tag overrides** (`per_tag_limits`): configure cardinality limits per tag key within a metric, or exclude individual tags from tracking. -- **Metric exclusion**: opt entire metrics out of cardinality tracking via `mode: excluded` in `per_metric_limits`. - -authors: ArunPiduguDD diff --git a/changelog.d/tag_cardinality_limit_tracking_scope.enhancement.md b/changelog.d/tag_cardinality_limit_tracking_scope.enhancement.md deleted file mode 100644 index 693a5c6005f5a..0000000000000 --- a/changelog.d/tag_cardinality_limit_tracking_scope.enhancement.md +++ /dev/null @@ -1,6 +0,0 @@ -The `tag_cardinality_limit` transform gained two new settings: - -- **`tracking_scope`**: isolate tag tracking per metric (`per_metric`) instead of sharing a single bucket across all metrics (`global`, the default). -- **`max_tracked_keys`**: cap the total number of tag keys tracked to bound memory usage. - -authors: ArunPiduguDD diff --git a/website/cue/reference/releases/0.56.0.cue b/website/cue/reference/releases/0.56.0.cue index 46ad04a2c83df..ba61768ac0831 100644 --- a/website/cue/reference/releases/0.56.0.cue +++ b/website/cue/reference/releases/0.56.0.cue @@ -1,7 +1,7 @@ package metadata releases: "0.56.0": { - date: "2026-05-15" + date: "2026-05-29" codename: "" whats_next: [] @@ -13,25 +13,27 @@ releases: "0.56.0": { description: #""" The boolean syntax (`compression: true` / `compression: false`) is deprecated. Use the string syntax instead: `compression: "gzip"`, `compression: "zstd"`, or `compression: "none"`. - + The `bool_or_vector_compression` deserializer will be removed once the boolean syntax is no longer supported. """# }, { - what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" + what: "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]" deprecated_since: "0.56.0" description: #""" - The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. - Users must upgrade their GreptimeDB instance to v1.x before upgrading Vector. + This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging. """# }, + ] + + planned_deprecations: [ { what: "`azure_monitor_logs` sink" deprecated_since: "0.58.0" description: #""" The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink, which uses the Azure Monitor Logs Ingestion API. - + Users should migrate before Microsoft ends support for the old Data Collector API (scheduled for September 2026). """# @@ -50,28 +52,27 @@ releases: "0.56.0": { description: #""" The `series_api_version: v1` option is deprecated in favor of `v2` (the default). The v1 series endpoint (`/api/v1/series`) is a legacy endpoint. - + Users should remove `series_api_version: v1` from their configuration or set it to `v2`. """# }, { - what: "`encoding` field on HTTP server sources" - deprecated_since: "0.50.0" + what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" + deprecated_since: "0.55.0" description: #""" - The `encoding` field will be removed. Use `decoding` and `framing` instead. + The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. + Users must upgrade their GreptimeDB instance to v1.x before upgrading Vector. """# }, { - what: "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]" - deprecated_since: "0.56.0" + what: "`encoding` field on HTTP server sources" + deprecated_since: "0.50.0" description: #""" - This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging. + The `encoding` field will be removed. Use `decoding` and `framing` instead. """# }, ] - planned_deprecations: [] - changelog: [ { type: "feat" @@ -333,32 +334,6 @@ releases: "0.56.0": { }, ] - vrl_changelog: """ - ### [0.32.0 (2026-04-16)] - - #### New Features - - - Added a new `encode_csv` function that encodes an array of values into a CSV-formatted string. This is the inverse of the existing `parse_csv` function and supports an optional single-byte delimiter (defaults to `,`). - - authors: armleth (https://github.com/vectordotdev/vrl/pull/1649) - - Added `to_entries` and `from_entries` with jq-compatible behavior: `to_entries` supports both objects and arrays, and `from_entries` accepts `key`/`Key`/`name`/`Name` and `value`/`Value` aliases. - - authors: close2code-palm (https://github.com/vectordotdev/vrl/pull/1653) - - #### Enhancements - - - Added `except` parameter to `flatten` function to exclude specific keys from being flattened. - - authors: benjamin-awd (https://github.com/vectordotdev/vrl/pull/1682) - - #### Fixes - - - Fixed a bug where the REPL input validator was executing programs instead of only compiling them, causing functions with side effects (e.g. `http_request`) to run twice per submission. - - authors: prontidis (https://github.com/vectordotdev/vrl/pull/1701) - - """ - commits: [ {sha: "1c70988b54156abf8d031538f0f81f28e7c0a0e4", date: "2026-04-21 17:00:33 UTC", description: "restore HTTP GET /health endpoint", pr_number: 25234, scopes: ["api"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 6, insertions_count: 162, deletions_count: 11}, {sha: "aafd4cb44f5649e692722b97d82973fea5509a41", date: "2026-04-21 18:21:39 UTC", description: "drop fakedata_generator, fix broken fake domains", pr_number: 25236, scopes: ["demo_logs source"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 6, insertions_count: 61, deletions_count: 26}, @@ -493,6 +468,11 @@ releases: "0.56.0": { {sha: "8eb5b4279e4b630548137f6edbcc502a2d1ce282", date: "2026-05-15 17:46:27 UTC", description: "fix insert_block_after_changelog to target the changelog array not the first ]", pr_number: null, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 7, deletions_count: 2}, {sha: "9dabc01cea2e3eee0eb4720c23338b58360bf2f9", date: "2026-05-15 17:54:08 UTC", description: "fix markdown table separator spacing in deprecation.d README", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 1, deletions_count: 1}, {sha: "3b2a6f05b071dafb216fb8738e01412f0ba87560", date: "2026-05-15 17:59:10 UTC", description: "use gh CLI to fetch VRL release notes instead of unauthenticated GitHub API", pr_number: null, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 41, deletions_count: 39}, - {sha: "35fbe89db6dbb2a4d4318496acdc7f45231871d0", date: "2026-05-15 18:01:44 UTC", description: "Pinned VRL version to 0.32.0", pr_number: null, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 7, deletions_count: 6}, + {sha: "62479c0fe77ab9b1c1ff0a98cfb8bb61380a9b9c", date: "2026-05-15 18:03:36 UTC", description: "add generated files", pr_number: null, scopes: ["website"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 513, deletions_count: 0}, + {sha: "0bc71ccdd463f6ad90e33e5161e07ed54b5c8a2f", date: "2026-05-15 18:04:48 UTC", description: "chore(releasing): use gh CLI to fetch VRL release notes instead of unauthenticated GitHub API", pr_number: null, scopes: [], type: "revert", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 39, deletions_count: 41}, + {sha: "50644e7d82f1c36e1f9adb97bba3b49b7d81f89d", date: "2026-05-19 15:41:30 UTC", description: "rename DEPRECATION.md to DEPRECATION_POLICY.md and merge DEPRECATIONS.md", pr_number: null, scopes: ["internal docs"], type: "docs", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 5, deletions_count: 22}, + {sha: "a5145677b01ef853a1dc67425ba91c390914eab7", date: "2026-05-19 20:18:12 UTC", description: "remove TBD as accepted deprecation_version; set concrete versions for existing entries", pr_number: null, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Thomas", files_count: 7, insertions_count: 16, deletions_count: 46}, + {sha: "8a89226ed362670e04202d812d193cfd6d78c959", date: "2026-05-22 16:35:14 UTC", description: "drop announcement_version; track via .announced.md filename convention", pr_number: null, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Thomas", files_count: 16, insertions_count: 171, deletions_count: 255}, + {sha: "f5c7fe6218f8e20ca58e88aba308d9c797402f94", date: "2026-05-29 15:45:49 UTC", description: "replace announcement_version/deprecation_version with deprecated_since", pr_number: null, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Thomas", files_count: 17, insertions_count: 78, deletions_count: 307}, ] } From 17ae38f83e12e6c89d2ef120f8a15a1dcdb49ccd Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 12:44:01 -0400 Subject: [PATCH 40/85] Revert "chore(releasing): regenerate 0.56.0.cue with new deprecation schema" This reverts commit 00c1d7e13bab50a70953c2f41164a35f2007cee5. --- .../10870_http_retry_strategy.feature.md | 7 ++ ...http_retry_transport_errors.enhancement.md | 9 +++ ...13_remove_default_os_package_config.fix.md | 7 ++ .../20278_expected_event_count.feature.md | 3 + ...ector_sink_zstd_compression.enhancement.md | 33 ++++++++++ .../24840_databricks_zerobus_sink.feature.md | 3 + ...c_decompression_reject_unnegotiated.fix.md | 6 ++ .../24917_otel_source_zstd.enhancement.md | 7 ++ .../24929_fix_stall_on_disk_shutdown.fix.md | 6 ++ ...25194_windows_event_log_lost_wakeup.fix.md | 3 + ...25199_batch_encoding_events_dropped.fix.md | 3 + ...plunk_hec_source_specify_wrong_auth.fix.md | 3 + changelog.d/25253_el8_glibc_floor.fix.md | 3 + .../25267_vrl_get_env_var_playground.fix.md | 2 + ...3_enable_codecs_parquet_in_releases.fix.md | 3 + ...2_windows_event_log_source_metadata.fix.md | 3 + ...use_aws_s3_dedicated_batch_encoding.fix.md | 3 + changelog.d/drop_fakedata_generator.fix.md | 9 +++ .../greptimedb_ingester_crate.breaking.md | 3 + changelog.d/mqtt_source_mutual_TLS.fix.md | 3 + .../sample_dynamic_ratio_field.feature.md | 3 + changelog.d/serde_group_bump.enhancement.md | 3 + .../splunk_hec_source_codec.enhancement.md | 20 ++++++ ...y_limit_per_tag_and_exclude.enhancement.md | 6 ++ ...nality_limit_tracking_scope.enhancement.md | 6 ++ website/cue/reference/releases/0.56.0.cue | 64 ++++++++++++------- 26 files changed, 199 insertions(+), 22 deletions(-) create mode 100644 changelog.d/10870_http_retry_strategy.feature.md create mode 100644 changelog.d/10870_http_retry_transport_errors.enhancement.md create mode 100644 changelog.d/15513_remove_default_os_package_config.fix.md create mode 100644 changelog.d/20278_expected_event_count.feature.md create mode 100644 changelog.d/23030_vector_sink_zstd_compression.enhancement.md create mode 100644 changelog.d/24840_databricks_zerobus_sink.feature.md create mode 100644 changelog.d/24917_grpc_decompression_reject_unnegotiated.fix.md create mode 100644 changelog.d/24917_otel_source_zstd.enhancement.md create mode 100644 changelog.d/24929_fix_stall_on_disk_shutdown.fix.md create mode 100644 changelog.d/25194_windows_event_log_lost_wakeup.fix.md create mode 100644 changelog.d/25199_batch_encoding_events_dropped.fix.md create mode 100644 changelog.d/25230_splunk_hec_source_specify_wrong_auth.fix.md create mode 100644 changelog.d/25253_el8_glibc_floor.fix.md create mode 100644 changelog.d/25267_vrl_get_env_var_playground.fix.md create mode 100644 changelog.d/25313_enable_codecs_parquet_in_releases.fix.md create mode 100644 changelog.d/25332_windows_event_log_source_metadata.fix.md create mode 100644 changelog.d/clickhouse_aws_s3_dedicated_batch_encoding.fix.md create mode 100644 changelog.d/drop_fakedata_generator.fix.md create mode 100644 changelog.d/greptimedb_ingester_crate.breaking.md create mode 100644 changelog.d/mqtt_source_mutual_TLS.fix.md create mode 100644 changelog.d/sample_dynamic_ratio_field.feature.md create mode 100644 changelog.d/serde_group_bump.enhancement.md create mode 100644 changelog.d/splunk_hec_source_codec.enhancement.md create mode 100644 changelog.d/tag_cardinality_limit_per_tag_and_exclude.enhancement.md create mode 100644 changelog.d/tag_cardinality_limit_tracking_scope.enhancement.md diff --git a/changelog.d/10870_http_retry_strategy.feature.md b/changelog.d/10870_http_retry_strategy.feature.md new file mode 100644 index 0000000000000..09afba2eddd40 --- /dev/null +++ b/changelog.d/10870_http_retry_strategy.feature.md @@ -0,0 +1,7 @@ +HTTP-based sinks that use the shared retry helpers now support a `retry_strategy` configuration +option to control which HTTP response codes are retried. The `http` sink also includes a new +example showing how to retry only specific transient status codes. + +Issue: https://github.com/vectordotdev/vector/issues/10870 + +authors: ndrsg diff --git a/changelog.d/10870_http_retry_transport_errors.enhancement.md b/changelog.d/10870_http_retry_transport_errors.enhancement.md new file mode 100644 index 0000000000000..f06f63b2f0e07 --- /dev/null +++ b/changelog.d/10870_http_retry_transport_errors.enhancement.md @@ -0,0 +1,9 @@ +HTTP-based sinks using the shared retry logic now classify transport-layer failures with +`HttpError::is_retriable`: connection and TLS connector issues may be retried, while failures +such as invalid HTTP request construction or an invalid proxy URI are not. Setting +`retry_strategy` to `none` disables retries for these transport errors and for request +timeouts, in addition to status-code-based retries. + +Issue: https://github.com/vectordotdev/vector/issues/10870 + +authors: ndrsg diff --git a/changelog.d/15513_remove_default_os_package_config.fix.md b/changelog.d/15513_remove_default_os_package_config.fix.md new file mode 100644 index 0000000000000..e509742ff2564 --- /dev/null +++ b/changelog.d/15513_remove_default_os_package_config.fix.md @@ -0,0 +1,7 @@ +The default `/etc/vector/vector.yaml` config file is no longer installed by the Debian, RPM, Alpine, and distroless-static Docker packages. The previous default ran a `demo_logs` source and printed synthesized syslog lines to stdout, which then surfaced in journald or `/var/log/` on hosts running Vector as a service and was a common source of confusion. + +New installs will now have no active config on disk. Provide your own configuration at `/etc/vector/vector.yaml` (or pass `--config `) before starting Vector. A reference example is shipped at `/usr/share/vector/examples/vector.yaml`, and more sample configs remain at `/etc/vector/examples/`. + +Existing installs are unaffected on upgrade: package managers preserve the on-disk `/etc/vector/vector.yaml` if you already had one. + +authors: pront diff --git a/changelog.d/20278_expected_event_count.feature.md b/changelog.d/20278_expected_event_count.feature.md new file mode 100644 index 0000000000000..23dac198ecdea --- /dev/null +++ b/changelog.d/20278_expected_event_count.feature.md @@ -0,0 +1,3 @@ +Unit tests now support an optional `expected_event_count` field on test outputs, allowing assertions on the number of events emitted by a transform. + +authors: pront diff --git a/changelog.d/23030_vector_sink_zstd_compression.enhancement.md b/changelog.d/23030_vector_sink_zstd_compression.enhancement.md new file mode 100644 index 0000000000000..5c1b8408d3248 --- /dev/null +++ b/changelog.d/23030_vector_sink_zstd_compression.enhancement.md @@ -0,0 +1,33 @@ +The `vector` sink now supports `zstd` compression in addition to `gzip`. This provides better +compression ratios and performance for Vector-to-Vector communication. + +The compression configuration has been enhanced to support multiple algorithms while maintaining +full backward compatibility: + +## Legacy boolean syntax (still supported) + +```yaml +sinks: + my_vector: + type: vector + address: "localhost:6000" + compression: true # Uses gzip (default) + # or + compression: false # No compression +``` + +## New string syntax + +```yaml +sinks: + my_vector: + type: vector + address: "localhost:6000" + compression: "zstd" # Use zstd compression + # Supported values: "none", "gzip", "zstd" +``` + +The Vector source automatically accepts both gzip and zstd compressed data, enabling seamless +communication between Vector instances using different compression algorithms. + +authors: jpds diff --git a/changelog.d/24840_databricks_zerobus_sink.feature.md b/changelog.d/24840_databricks_zerobus_sink.feature.md new file mode 100644 index 0000000000000..34a8ecb1c9224 --- /dev/null +++ b/changelog.d/24840_databricks_zerobus_sink.feature.md @@ -0,0 +1,3 @@ +Add a new `databricks_zerobus` sink that streams log data to Databricks Unity Catalog tables via the Zerobus ingestion service. Supports OAuth 2.0 authentication, automatic schema fetching from Unity Catalog, and protobuf batch encoding. + +authors: flaviocruz diff --git a/changelog.d/24917_grpc_decompression_reject_unnegotiated.fix.md b/changelog.d/24917_grpc_decompression_reject_unnegotiated.fix.md new file mode 100644 index 0000000000000..ef1e4a90cc53a --- /dev/null +++ b/changelog.d/24917_grpc_decompression_reject_unnegotiated.fix.md @@ -0,0 +1,6 @@ +The shared gRPC decompression layer now rejects request frames that set the +compressed flag without a negotiated `grpc-encoding` (e.g. `identity` or a +missing header). Previously such malformed frames were silently decoded as +gzip, which could mask client/server compression-negotiation bugs. + +authors: jpds diff --git a/changelog.d/24917_otel_source_zstd.enhancement.md b/changelog.d/24917_otel_source_zstd.enhancement.md new file mode 100644 index 0000000000000..1a35e5257e968 --- /dev/null +++ b/changelog.d/24917_otel_source_zstd.enhancement.md @@ -0,0 +1,7 @@ +The `opentelemetry` source's gRPC OTLP receiver now accepts `zstd`-compressed +requests in addition to `gzip`, matching the compression schemes advertised via +the `grpc-accept-encoding` response header. No configuration change is required; +clients can send OTLP payloads with `grpc-encoding: zstd` and they will be +transparently decompressed. + +authors: jpds diff --git a/changelog.d/24929_fix_stall_on_disk_shutdown.fix.md b/changelog.d/24929_fix_stall_on_disk_shutdown.fix.md new file mode 100644 index 0000000000000..2c7633caef857 --- /dev/null +++ b/changelog.d/24929_fix_stall_on_disk_shutdown.fix.md @@ -0,0 +1,6 @@ +Fixed issue during in place reload of a sink with a disk buffer configured, where +the component would stall for batch.timeout_sec before gracefully reloading. +This fix also resolves issues Vector had where it would ignore SIGINT during +cases where the pipeline stall had occurred. + +authors: graphcareful diff --git a/changelog.d/25194_windows_event_log_lost_wakeup.fix.md b/changelog.d/25194_windows_event_log_lost_wakeup.fix.md new file mode 100644 index 0000000000000..cb6f67987d67c --- /dev/null +++ b/changelog.d/25194_windows_event_log_lost_wakeup.fix.md @@ -0,0 +1,3 @@ +The `windows_event_log` source no longer freezes after periods of inactivity. + +authors: tot19 diff --git a/changelog.d/25199_batch_encoding_events_dropped.fix.md b/changelog.d/25199_batch_encoding_events_dropped.fix.md new file mode 100644 index 0000000000000..214aad79a528c --- /dev/null +++ b/changelog.d/25199_batch_encoding_events_dropped.fix.md @@ -0,0 +1,3 @@ +Sinks using batch encoding (Parquet, Arrow IPC) now consistently emit `ComponentEventsDropped` for every encode failure path. Previously some `build_record_batch` failures (notably type mismatches) dropped events silently. A new `EncoderRecordBatchError` internal event also reports `component_errors_total` with `error_code="arrow_json_decode"` or `"arrow_record_batch_creation"` at `stage="sending"` for granular alerting. + +authors: pront diff --git a/changelog.d/25230_splunk_hec_source_specify_wrong_auth.fix.md b/changelog.d/25230_splunk_hec_source_specify_wrong_auth.fix.md new file mode 100644 index 0000000000000..8c2af5dd212e4 --- /dev/null +++ b/changelog.d/25230_splunk_hec_source_specify_wrong_auth.fix.md @@ -0,0 +1,3 @@ +The error log + metric that `splunk_hec` source emit on missing/invalid auth header now specifies "authentication_failed" as error_type. + +authors: 20agbekodo diff --git a/changelog.d/25253_el8_glibc_floor.fix.md b/changelog.d/25253_el8_glibc_floor.fix.md new file mode 100644 index 0000000000000..8c638782e339a --- /dev/null +++ b/changelog.d/25253_el8_glibc_floor.fix.md @@ -0,0 +1,3 @@ +Restored support for installing Vector on RHEL 8, Rocky Linux 8, AlmaLinux 8, and CentOS Stream 8, which had been broken since v0.55.0 due to an inadvertent glibc requirement bump. + +authors: pront diff --git a/changelog.d/25267_vrl_get_env_var_playground.fix.md b/changelog.d/25267_vrl_get_env_var_playground.fix.md new file mode 100644 index 0000000000000..29de5d36fe6a5 --- /dev/null +++ b/changelog.d/25267_vrl_get_env_var_playground.fix.md @@ -0,0 +1,2 @@ +Restored the full VRL stdlib, including `get_env_var`, in the standalone VRL CLI and web playground by default. +authors: pront diff --git a/changelog.d/25313_enable_codecs_parquet_in_releases.fix.md b/changelog.d/25313_enable_codecs_parquet_in_releases.fix.md new file mode 100644 index 0000000000000..fe3baaf110d5e --- /dev/null +++ b/changelog.d/25313_enable_codecs_parquet_in_releases.fix.md @@ -0,0 +1,3 @@ +Parquet encoding in the `aws_s3` sink (`batch_encoding`) now works out of the box in the official release binaries. Previously it required compiling Vector from source with the `codecs-parquet` feature. + +authors: pront diff --git a/changelog.d/25332_windows_event_log_source_metadata.fix.md b/changelog.d/25332_windows_event_log_source_metadata.fix.md new file mode 100644 index 0000000000000..936e773cc8588 --- /dev/null +++ b/changelog.d/25332_windows_event_log_source_metadata.fix.md @@ -0,0 +1,3 @@ +The `windows_event_log` source now adds standard source metadata, including `source_type`, to emitted log events. + +authors: tot19 diff --git a/changelog.d/clickhouse_aws_s3_dedicated_batch_encoding.fix.md b/changelog.d/clickhouse_aws_s3_dedicated_batch_encoding.fix.md new file mode 100644 index 0000000000000..f39347d4c47bd --- /dev/null +++ b/changelog.d/clickhouse_aws_s3_dedicated_batch_encoding.fix.md @@ -0,0 +1,3 @@ +The `aws_s3` and `clickhouse` sinks now correctly advertise only the `batch_encoding.codec` values they actually support: `parquet` for `aws_s3` and `arrow_stream` for `clickhouse`. Previously the documentation and configuration schema listed both codecs for both sinks, even though picking the wrong one produced a startup error. + +authors: flaviofcruz diff --git a/changelog.d/drop_fakedata_generator.fix.md b/changelog.d/drop_fakedata_generator.fix.md new file mode 100644 index 0000000000000..500e826bc3239 --- /dev/null +++ b/changelog.d/drop_fakedata_generator.fix.md @@ -0,0 +1,9 @@ +The text content generated by the `demo_logs` source has changed: the +pool of fake usernames and the pool of fake domain TLDs are now both +defined inside Vector rather than pulled from an external crate. The +line formats (`apache_common`, `apache_error`, `json`, `syslog`, +`bsd_syslog`) are unchanged. If any of your tests or downstream +pipelines assert on specific generated usernames or TLDs, please +update those expectations. + +authors: pront diff --git a/changelog.d/greptimedb_ingester_crate.breaking.md b/changelog.d/greptimedb_ingester_crate.breaking.md new file mode 100644 index 0000000000000..79984693ef8e1 --- /dev/null +++ b/changelog.d/greptimedb_ingester_crate.breaking.md @@ -0,0 +1,3 @@ +The `greptimedb_metrics` and `greptimedb_logs` sinks now require GreptimeDB v1.x. Users running GreptimeDB v0.x must upgrade their GreptimeDB instance before upgrading Vector. + +authors: thomasqueirozb diff --git a/changelog.d/mqtt_source_mutual_TLS.fix.md b/changelog.d/mqtt_source_mutual_TLS.fix.md new file mode 100644 index 0000000000000..9d1c52d65c370 --- /dev/null +++ b/changelog.d/mqtt_source_mutual_TLS.fix.md @@ -0,0 +1,3 @@ +Fixed a bug in the `mqtt` source where user-provided TLS client certificates (`crt_file` / `key_file`) were being silently ignored, breaking mTLS connections to strict brokers like AWS IoT Core. + +authors: mr- diff --git a/changelog.d/sample_dynamic_ratio_field.feature.md b/changelog.d/sample_dynamic_ratio_field.feature.md new file mode 100644 index 0000000000000..d2e3c04839c19 --- /dev/null +++ b/changelog.d/sample_dynamic_ratio_field.feature.md @@ -0,0 +1,3 @@ +Added `ratio_field` and `rate_field` options to the `sample` transform to support dynamic per-event sampling, while requiring static `rate` or `ratio` fallback configuration and disallowing `ratio_field` and `rate_field` together. + +authors: jhammer diff --git a/changelog.d/serde_group_bump.enhancement.md b/changelog.d/serde_group_bump.enhancement.md new file mode 100644 index 0000000000000..3c9ea910c6601 --- /dev/null +++ b/changelog.d/serde_group_bump.enhancement.md @@ -0,0 +1,3 @@ +Bumped `serde_json` to `1.0.149` and `serde_with` to `3.18.0`. `serde_json` switched its float-to-string formatter from Ryū to Żmij in `1.0.147`, so floats serialized via the `native_json` codec may render with slightly different textual form (for example `1e+16` instead of `1e16`). The change is purely cosmetic: parsed `f32`/`f64` values round-trip identically, and Vector-to-Vector communication between old and new versions is unaffected. + +authors: pront diff --git a/changelog.d/splunk_hec_source_codec.enhancement.md b/changelog.d/splunk_hec_source_codec.enhancement.md new file mode 100644 index 0000000000000..93c3bfe86f522 --- /dev/null +++ b/changelog.d/splunk_hec_source_codec.enhancement.md @@ -0,0 +1,20 @@ +The `splunk_hec` source now accepts optional per-endpoint codec configuration via `event: { framing, decoding }` and `raw: { framing, decoding }`. When `decoding` is set on an endpoint, Vector applies a second decoding pass after the HEC envelope is parsed: on `/services/collector/event` the envelope's `event` field is fed through the codec, and on `/services/collector/raw` the request body is fed through the codec directly. A single payload can fan out to multiple events. + +For example, to decode JSON payloads in `/event` requests while splitting `/raw` bodies on newlines: + +```yaml +sources: + hec: + type: splunk_hec + address: 0.0.0.0:8088 + event: + decoding: + codec: json + raw: + framing: + method: newline_delimited + decoding: + codec: bytes +``` + +authors: thomasqueirozb diff --git a/changelog.d/tag_cardinality_limit_per_tag_and_exclude.enhancement.md b/changelog.d/tag_cardinality_limit_per_tag_and_exclude.enhancement.md new file mode 100644 index 0000000000000..9d05f3170b305 --- /dev/null +++ b/changelog.d/tag_cardinality_limit_per_tag_and_exclude.enhancement.md @@ -0,0 +1,6 @@ +The `tag_cardinality_limit` transform gained two new configuration capabilities: + +- **Per-tag overrides** (`per_tag_limits`): configure cardinality limits per tag key within a metric, or exclude individual tags from tracking. +- **Metric exclusion**: opt entire metrics out of cardinality tracking via `mode: excluded` in `per_metric_limits`. + +authors: ArunPiduguDD diff --git a/changelog.d/tag_cardinality_limit_tracking_scope.enhancement.md b/changelog.d/tag_cardinality_limit_tracking_scope.enhancement.md new file mode 100644 index 0000000000000..693a5c6005f5a --- /dev/null +++ b/changelog.d/tag_cardinality_limit_tracking_scope.enhancement.md @@ -0,0 +1,6 @@ +The `tag_cardinality_limit` transform gained two new settings: + +- **`tracking_scope`**: isolate tag tracking per metric (`per_metric`) instead of sharing a single bucket across all metrics (`global`, the default). +- **`max_tracked_keys`**: cap the total number of tag keys tracked to bound memory usage. + +authors: ArunPiduguDD diff --git a/website/cue/reference/releases/0.56.0.cue b/website/cue/reference/releases/0.56.0.cue index ba61768ac0831..46ad04a2c83df 100644 --- a/website/cue/reference/releases/0.56.0.cue +++ b/website/cue/reference/releases/0.56.0.cue @@ -1,7 +1,7 @@ package metadata releases: "0.56.0": { - date: "2026-05-29" + date: "2026-05-15" codename: "" whats_next: [] @@ -13,27 +13,25 @@ releases: "0.56.0": { description: #""" The boolean syntax (`compression: true` / `compression: false`) is deprecated. Use the string syntax instead: `compression: "gzip"`, `compression: "zstd"`, or `compression: "none"`. - + The `bool_or_vector_compression` deserializer will be removed once the boolean syntax is no longer supported. """# }, { - what: "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]" + what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" deprecated_since: "0.56.0" description: #""" - This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging. + The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. + Users must upgrade their GreptimeDB instance to v1.x before upgrading Vector. """# }, - ] - - planned_deprecations: [ { what: "`azure_monitor_logs` sink" deprecated_since: "0.58.0" description: #""" The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink, which uses the Azure Monitor Logs Ingestion API. - + Users should migrate before Microsoft ends support for the old Data Collector API (scheduled for September 2026). """# @@ -52,27 +50,28 @@ releases: "0.56.0": { description: #""" The `series_api_version: v1` option is deprecated in favor of `v2` (the default). The v1 series endpoint (`/api/v1/series`) is a legacy endpoint. - + Users should remove `series_api_version: v1` from their configuration or set it to `v2`. """# }, { - what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" - deprecated_since: "0.55.0" + what: "`encoding` field on HTTP server sources" + deprecated_since: "0.50.0" description: #""" - The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. - Users must upgrade their GreptimeDB instance to v1.x before upgrading Vector. + The `encoding` field will be removed. Use `decoding` and `framing` instead. """# }, { - what: "`encoding` field on HTTP server sources" - deprecated_since: "0.50.0" + what: "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]" + deprecated_since: "0.56.0" description: #""" - The `encoding` field will be removed. Use `decoding` and `framing` instead. + This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging. """# }, ] + planned_deprecations: [] + changelog: [ { type: "feat" @@ -334,6 +333,32 @@ releases: "0.56.0": { }, ] + vrl_changelog: """ + ### [0.32.0 (2026-04-16)] + + #### New Features + + - Added a new `encode_csv` function that encodes an array of values into a CSV-formatted string. This is the inverse of the existing `parse_csv` function and supports an optional single-byte delimiter (defaults to `,`). + + authors: armleth (https://github.com/vectordotdev/vrl/pull/1649) + - Added `to_entries` and `from_entries` with jq-compatible behavior: `to_entries` supports both objects and arrays, and `from_entries` accepts `key`/`Key`/`name`/`Name` and `value`/`Value` aliases. + + authors: close2code-palm (https://github.com/vectordotdev/vrl/pull/1653) + + #### Enhancements + + - Added `except` parameter to `flatten` function to exclude specific keys from being flattened. + + authors: benjamin-awd (https://github.com/vectordotdev/vrl/pull/1682) + + #### Fixes + + - Fixed a bug where the REPL input validator was executing programs instead of only compiling them, causing functions with side effects (e.g. `http_request`) to run twice per submission. + + authors: prontidis (https://github.com/vectordotdev/vrl/pull/1701) + + """ + commits: [ {sha: "1c70988b54156abf8d031538f0f81f28e7c0a0e4", date: "2026-04-21 17:00:33 UTC", description: "restore HTTP GET /health endpoint", pr_number: 25234, scopes: ["api"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 6, insertions_count: 162, deletions_count: 11}, {sha: "aafd4cb44f5649e692722b97d82973fea5509a41", date: "2026-04-21 18:21:39 UTC", description: "drop fakedata_generator, fix broken fake domains", pr_number: 25236, scopes: ["demo_logs source"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 6, insertions_count: 61, deletions_count: 26}, @@ -468,11 +493,6 @@ releases: "0.56.0": { {sha: "8eb5b4279e4b630548137f6edbcc502a2d1ce282", date: "2026-05-15 17:46:27 UTC", description: "fix insert_block_after_changelog to target the changelog array not the first ]", pr_number: null, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 7, deletions_count: 2}, {sha: "9dabc01cea2e3eee0eb4720c23338b58360bf2f9", date: "2026-05-15 17:54:08 UTC", description: "fix markdown table separator spacing in deprecation.d README", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 1, deletions_count: 1}, {sha: "3b2a6f05b071dafb216fb8738e01412f0ba87560", date: "2026-05-15 17:59:10 UTC", description: "use gh CLI to fetch VRL release notes instead of unauthenticated GitHub API", pr_number: null, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 41, deletions_count: 39}, - {sha: "62479c0fe77ab9b1c1ff0a98cfb8bb61380a9b9c", date: "2026-05-15 18:03:36 UTC", description: "add generated files", pr_number: null, scopes: ["website"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 513, deletions_count: 0}, - {sha: "0bc71ccdd463f6ad90e33e5161e07ed54b5c8a2f", date: "2026-05-15 18:04:48 UTC", description: "chore(releasing): use gh CLI to fetch VRL release notes instead of unauthenticated GitHub API", pr_number: null, scopes: [], type: "revert", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 39, deletions_count: 41}, - {sha: "50644e7d82f1c36e1f9adb97bba3b49b7d81f89d", date: "2026-05-19 15:41:30 UTC", description: "rename DEPRECATION.md to DEPRECATION_POLICY.md and merge DEPRECATIONS.md", pr_number: null, scopes: ["internal docs"], type: "docs", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 5, deletions_count: 22}, - {sha: "a5145677b01ef853a1dc67425ba91c390914eab7", date: "2026-05-19 20:18:12 UTC", description: "remove TBD as accepted deprecation_version; set concrete versions for existing entries", pr_number: null, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Thomas", files_count: 7, insertions_count: 16, deletions_count: 46}, - {sha: "8a89226ed362670e04202d812d193cfd6d78c959", date: "2026-05-22 16:35:14 UTC", description: "drop announcement_version; track via .announced.md filename convention", pr_number: null, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Thomas", files_count: 16, insertions_count: 171, deletions_count: 255}, - {sha: "f5c7fe6218f8e20ca58e88aba308d9c797402f94", date: "2026-05-29 15:45:49 UTC", description: "replace announcement_version/deprecation_version with deprecated_since", pr_number: null, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Thomas", files_count: 17, insertions_count: 78, deletions_count: 307}, + {sha: "35fbe89db6dbb2a4d4318496acdc7f45231871d0", date: "2026-05-15 18:01:44 UTC", description: "Pinned VRL version to 0.32.0", pr_number: null, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 7, deletions_count: 6}, ] } From cf094078e2c59332aadf4246bfdab2644cebdb98 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 12:51:56 -0400 Subject: [PATCH 41/85] chore(releasing): regenerate 0.56.0.cue with new deprecation schema --- website/cue/reference/releases/0.56.0.cue | 66 +++++++++-------------- 1 file changed, 24 insertions(+), 42 deletions(-) diff --git a/website/cue/reference/releases/0.56.0.cue b/website/cue/reference/releases/0.56.0.cue index 46ad04a2c83df..cb0390c6a42e2 100644 --- a/website/cue/reference/releases/0.56.0.cue +++ b/website/cue/reference/releases/0.56.0.cue @@ -1,7 +1,7 @@ package metadata releases: "0.56.0": { - date: "2026-05-15" + date: "2026-05-29" codename: "" whats_next: [] @@ -13,25 +13,27 @@ releases: "0.56.0": { description: #""" The boolean syntax (`compression: true` / `compression: false`) is deprecated. Use the string syntax instead: `compression: "gzip"`, `compression: "zstd"`, or `compression: "none"`. - + The `bool_or_vector_compression` deserializer will be removed once the boolean syntax is no longer supported. """# }, { - what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" + what: "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]" deprecated_since: "0.56.0" description: #""" - The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. - Users must upgrade their GreptimeDB instance to v1.x before upgrading Vector. + This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging. """# }, + ] + + planned_deprecations: [ { what: "`azure_monitor_logs` sink" deprecated_since: "0.58.0" description: #""" The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink, which uses the Azure Monitor Logs Ingestion API. - + Users should migrate before Microsoft ends support for the old Data Collector API (scheduled for September 2026). """# @@ -50,28 +52,27 @@ releases: "0.56.0": { description: #""" The `series_api_version: v1` option is deprecated in favor of `v2` (the default). The v1 series endpoint (`/api/v1/series`) is a legacy endpoint. - + Users should remove `series_api_version: v1` from their configuration or set it to `v2`. """# }, { - what: "`encoding` field on HTTP server sources" - deprecated_since: "0.50.0" + what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" + deprecated_since: "0.55.0" description: #""" - The `encoding` field will be removed. Use `decoding` and `framing` instead. + The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. + Users must upgrade their GreptimeDB instance to v1.x before upgrading Vector. """# }, { - what: "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]" - deprecated_since: "0.56.0" + what: "`encoding` field on HTTP server sources" + deprecated_since: "0.50.0" description: #""" - This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging. + The `encoding` field will be removed. Use `decoding` and `framing` instead. """# }, ] - planned_deprecations: [] - changelog: [ { type: "feat" @@ -333,32 +334,6 @@ releases: "0.56.0": { }, ] - vrl_changelog: """ - ### [0.32.0 (2026-04-16)] - - #### New Features - - - Added a new `encode_csv` function that encodes an array of values into a CSV-formatted string. This is the inverse of the existing `parse_csv` function and supports an optional single-byte delimiter (defaults to `,`). - - authors: armleth (https://github.com/vectordotdev/vrl/pull/1649) - - Added `to_entries` and `from_entries` with jq-compatible behavior: `to_entries` supports both objects and arrays, and `from_entries` accepts `key`/`Key`/`name`/`Name` and `value`/`Value` aliases. - - authors: close2code-palm (https://github.com/vectordotdev/vrl/pull/1653) - - #### Enhancements - - - Added `except` parameter to `flatten` function to exclude specific keys from being flattened. - - authors: benjamin-awd (https://github.com/vectordotdev/vrl/pull/1682) - - #### Fixes - - - Fixed a bug where the REPL input validator was executing programs instead of only compiling them, causing functions with side effects (e.g. `http_request`) to run twice per submission. - - authors: prontidis (https://github.com/vectordotdev/vrl/pull/1701) - - """ - commits: [ {sha: "1c70988b54156abf8d031538f0f81f28e7c0a0e4", date: "2026-04-21 17:00:33 UTC", description: "restore HTTP GET /health endpoint", pr_number: 25234, scopes: ["api"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 6, insertions_count: 162, deletions_count: 11}, {sha: "aafd4cb44f5649e692722b97d82973fea5509a41", date: "2026-04-21 18:21:39 UTC", description: "drop fakedata_generator, fix broken fake domains", pr_number: 25236, scopes: ["demo_logs source"], type: "fix", breaking_change: false, author: "Pavlos Rontidis", files_count: 6, insertions_count: 61, deletions_count: 26}, @@ -493,6 +468,13 @@ releases: "0.56.0": { {sha: "8eb5b4279e4b630548137f6edbcc502a2d1ce282", date: "2026-05-15 17:46:27 UTC", description: "fix insert_block_after_changelog to target the changelog array not the first ]", pr_number: null, scopes: ["releasing"], type: "fix", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 7, deletions_count: 2}, {sha: "9dabc01cea2e3eee0eb4720c23338b58360bf2f9", date: "2026-05-15 17:54:08 UTC", description: "fix markdown table separator spacing in deprecation.d README", pr_number: null, scopes: ["internal docs"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 1, deletions_count: 1}, {sha: "3b2a6f05b071dafb216fb8738e01412f0ba87560", date: "2026-05-15 17:59:10 UTC", description: "use gh CLI to fetch VRL release notes instead of unauthenticated GitHub API", pr_number: null, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 41, deletions_count: 39}, - {sha: "35fbe89db6dbb2a4d4318496acdc7f45231871d0", date: "2026-05-15 18:01:44 UTC", description: "Pinned VRL version to 0.32.0", pr_number: null, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 7, deletions_count: 6}, + {sha: "62479c0fe77ab9b1c1ff0a98cfb8bb61380a9b9c", date: "2026-05-15 18:03:36 UTC", description: "add generated files", pr_number: null, scopes: ["website"], type: "chore", breaking_change: false, author: "Thomas", files_count: 2, insertions_count: 513, deletions_count: 0}, + {sha: "0bc71ccdd463f6ad90e33e5161e07ed54b5c8a2f", date: "2026-05-15 18:04:48 UTC", description: "chore(releasing): use gh CLI to fetch VRL release notes instead of unauthenticated GitHub API", pr_number: null, scopes: [], type: "revert", breaking_change: false, author: "Thomas", files_count: 1, insertions_count: 39, deletions_count: 41}, + {sha: "50644e7d82f1c36e1f9adb97bba3b49b7d81f89d", date: "2026-05-19 15:41:30 UTC", description: "rename DEPRECATION.md to DEPRECATION_POLICY.md and merge DEPRECATIONS.md", pr_number: null, scopes: ["internal docs"], type: "docs", breaking_change: false, author: "Thomas", files_count: 4, insertions_count: 5, deletions_count: 22}, + {sha: "a5145677b01ef853a1dc67425ba91c390914eab7", date: "2026-05-19 20:18:12 UTC", description: "remove TBD as accepted deprecation_version; set concrete versions for existing entries", pr_number: null, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Thomas", files_count: 7, insertions_count: 16, deletions_count: 46}, + {sha: "8a89226ed362670e04202d812d193cfd6d78c959", date: "2026-05-22 16:35:14 UTC", description: "drop announcement_version; track via .announced.md filename convention", pr_number: null, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Thomas", files_count: 16, insertions_count: 171, deletions_count: 255}, + {sha: "f5c7fe6218f8e20ca58e88aba308d9c797402f94", date: "2026-05-29 15:45:49 UTC", description: "replace announcement_version/deprecation_version with deprecated_since", pr_number: null, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Thomas", files_count: 17, insertions_count: 78, deletions_count: 307}, + {sha: "00c1d7e13bab50a70953c2f41164a35f2007cee5", date: "2026-05-29 16:43:06 UTC", description: "regenerate 0.56.0.cue with new deprecation schema", pr_number: null, scopes: ["releasing"], type: "chore", breaking_change: false, author: "Thomas", files_count: 26, insertions_count: 22, deletions_count: 199}, + {sha: "17ae38f83e12e6c89d2ef120f8a15a1dcdb49ccd", date: "2026-05-29 16:44:01 UTC", description: "chore(releasing): regenerate 0.56.0.cue with new deprecation schema", pr_number: null, scopes: [], type: "revert", breaking_change: false, author: "Thomas", files_count: 26, insertions_count: 199, deletions_count: 22}, ] } From 2362a6fecc409e7b2820c7c614c5741f9da26e02 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 13:13:55 -0400 Subject: [PATCH 42/85] feat(releasing): add deprecations page and vdev deprecation enact/sync-cue commands --- vdev/src/commands/check/deprecations.rs | 26 +++- vdev/src/commands/deprecation/enact.rs | 71 +++++++++++ vdev/src/commands/deprecation/mod.rs | 4 + vdev/src/commands/deprecation/sync_cue.rs | 22 ++++ vdev/src/utils/deprecation.rs | 116 ++++++++++++++++++ website/Makefile | 5 +- .../content/en/docs/reference/deprecations.md | 5 + website/cue/reference/deprecations.cue | 69 +++++++++++ .../cue/reference/deprecations_enacted.json | 1 + website/cue/reference/deprecations_schema.cue | 4 + website/cue/reference/releases.cue | 7 ++ website/layouts/docs/deprecations.html | 101 +++++++++++++++ website/layouts/releases/single.html | 3 + 13 files changed, 427 insertions(+), 7 deletions(-) create mode 100644 vdev/src/commands/deprecation/enact.rs create mode 100644 vdev/src/commands/deprecation/sync_cue.rs create mode 100644 website/content/en/docs/reference/deprecations.md create mode 100644 website/cue/reference/deprecations.cue create mode 100644 website/cue/reference/deprecations_enacted.json create mode 100644 website/cue/reference/deprecations_schema.cue create mode 100644 website/layouts/docs/deprecations.html diff --git a/vdev/src/commands/check/deprecations.rs b/vdev/src/commands/check/deprecations.rs index 19ac24a6f0581..511f3d37ecb87 100644 --- a/vdev/src/commands/check/deprecations.rs +++ b/vdev/src/commands/check/deprecations.rs @@ -1,10 +1,10 @@ #![allow(clippy::print_stdout)] -use anyhow::Result; +use anyhow::{Result, bail}; use crate::utils::{deprecation, paths}; -/// Check that all deprecation.d fragments are valid +/// Check that all deprecation.d fragments are valid and deprecations.cue is in sync #[derive(clap::Args, Debug)] #[command()] pub struct Cli {} @@ -26,13 +26,27 @@ impl Cli { if entries.is_empty() { println!("No deprecation fragments found in {}.", dir.display()); - return Ok(()); + } else { + for entry in &entries { + println!(" ok {}", entry.filename); + } + println!("{} deprecation fragment(s) are valid.", entries.len()); } - for entry in &entries { - println!(" ok {}", entry.filename); + // Verify deprecations.cue is in sync with deprecation.d/. + let cue_path = repo_root.join(deprecation::DEPRECATIONS_CUE); + if cue_path.exists() { + let enacted = deprecation::read_enacted(&repo_root)?; + let expected = deprecation::render_deprecations_cue_for_check(&entries, &enacted); + let actual = std::fs::read_to_string(&cue_path)?; + if actual != expected { + bail!( + "{} is out of sync with deprecation.d/. Run `cargo vdev deprecation sync-cue` to regenerate it.", + cue_path.display() + ); + } + println!("{} is up to date.", cue_path.display()); } - println!("{} deprecation fragment(s) are valid.", entries.len()); Ok(()) } diff --git a/vdev/src/commands/deprecation/enact.rs b/vdev/src/commands/deprecation/enact.rs new file mode 100644 index 0000000000000..223436f52e566 --- /dev/null +++ b/vdev/src/commands/deprecation/enact.rs @@ -0,0 +1,71 @@ +#![allow(clippy::print_stdout)] + +use anyhow::{Result, bail}; +use semver::Version; + +use crate::utils::{deprecation, paths}; + +/// Enact a deprecation: record it as removed and delete the deprecation.d fragment +#[derive(clap::Args, Debug)] +#[command()] +pub struct Cli { + /// Filename (slug) in deprecation.d/ to enact, e.g. "azure-monitor-logs-sink" + slug: String, + + /// The Vector version in which this feature was removed, e.g. "0.58.0" + #[arg(long)] + version: Version, +} + +impl Cli { + pub fn exec(self) -> Result<()> { + let repo_root = paths::find_repo_root()?; + let dir = repo_root.join(deprecation::DEPRECATION_DIR); + + // Accept "slug", "slug.md" + let filename = if self.slug.ends_with(".md") { + self.slug.clone() + } else { + format!("{}.md", self.slug) + }; + + let path = dir.join(&filename); + if !path.exists() { + bail!( + "No deprecation fragment found at {}", + path.display() + ); + } + + // Parse the fragment to get entry data. + let entries = deprecation::read_deprecation_fragments(&dir)?; + let entry = entries + .into_iter() + .find(|e| e.filename == filename) + .ok_or_else(|| anyhow::anyhow!("Could not parse {filename}"))?; + + let enacted = deprecation::EnactedEntry { + what: entry.what.clone(), + deprecated_since: entry.deprecated_since.to_string(), + removed_in: format!("{}.{}.0", self.version.major, self.version.minor), + description: entry.description.clone(), + }; + + // Append to enacted JSON. + deprecation::append_enacted(&repo_root, enacted)?; + println!("Recorded enacted entry for: {}", entry.what); + + // Delete the deprecation.d fragment. + std::fs::remove_file(&path)?; + println!("Deleted {}", path.display()); + + // Regenerate deprecations.cue. + deprecation::sync_deprecations_cue(&repo_root)?; + println!( + "Updated {}", + repo_root.join(deprecation::DEPRECATIONS_CUE).display() + ); + + Ok(()) + } +} diff --git a/vdev/src/commands/deprecation/mod.rs b/vdev/src/commands/deprecation/mod.rs index 6caf199625cc6..1c11e5198dea0 100644 --- a/vdev/src/commands/deprecation/mod.rs +++ b/vdev/src/commands/deprecation/mod.rs @@ -1,6 +1,10 @@ +mod enact; mod show; +mod sync_cue; crate::cli_subcommands! { "Manage and inspect deprecation notices..." + enact, show, + sync_cue, } diff --git a/vdev/src/commands/deprecation/sync_cue.rs b/vdev/src/commands/deprecation/sync_cue.rs new file mode 100644 index 0000000000000..45d47cd7701fc --- /dev/null +++ b/vdev/src/commands/deprecation/sync_cue.rs @@ -0,0 +1,22 @@ +#![allow(clippy::print_stdout)] + +use anyhow::Result; + +use crate::utils::{deprecation, paths}; + +/// Regenerate website/cue/reference/deprecations.cue from deprecation.d/ +#[derive(clap::Args, Debug)] +#[command()] +pub struct Cli {} + +impl Cli { + pub fn exec(self) -> Result<()> { + let repo_root = paths::find_repo_root()?; + deprecation::sync_deprecations_cue(&repo_root)?; + println!( + "Wrote {}", + repo_root.join(deprecation::DEPRECATIONS_CUE).display() + ); + Ok(()) + } +} diff --git a/vdev/src/utils/deprecation.rs b/vdev/src/utils/deprecation.rs index 8866eb1774ab9..122966e04801a 100644 --- a/vdev/src/utils/deprecation.rs +++ b/vdev/src/utils/deprecation.rs @@ -5,8 +5,11 @@ use std::{ use anyhow::{Context, Result, anyhow, bail}; use semver::Version; +use serde_json::json; pub const DEPRECATION_DIR: &str = "deprecation.d"; +pub const ENACTED_JSON: &str = "website/cue/reference/deprecations_enacted.json"; +pub const DEPRECATIONS_CUE: &str = "website/cue/reference/deprecations.cue"; /// A concrete semver version identifying when a deprecation was announced. /// Accepted forms: `"0.56"` (major.minor) or `"0.56.0"` (major.minor.patch). @@ -172,6 +175,119 @@ fn split_frontmatter<'a>(content: &'a str, path: &Path) -> Result<(&'a str, &'a Ok((frontmatter, body)) } +/// A deprecation that has been enacted (feature removed). +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct EnactedEntry { + pub what: String, + pub deprecated_since: String, + pub removed_in: String, + #[serde(default, skip_serializing_if = "String::is_empty")] + pub description: String, +} + +/// Read the list of enacted deprecations from the JSON sidecar file. +pub fn read_enacted(repo_root: &Path) -> Result> { + let path = repo_root.join(ENACTED_JSON); + if !path.exists() { + return Ok(Vec::new()); + } + let raw = fs::read_to_string(&path) + .with_context(|| format!("Failed to read {}", path.display()))?; + serde_json::from_str(&raw) + .with_context(|| format!("Failed to parse {}", path.display())) +} + +/// Append an enacted entry to the JSON sidecar file. +pub fn append_enacted(repo_root: &Path, entry: EnactedEntry) -> Result<()> { + let mut entries = read_enacted(repo_root)?; + entries.push(entry); + let path = repo_root.join(ENACTED_JSON); + let json = serde_json::to_string_pretty(&entries)? + "\n"; + fs::write(&path, json) + .with_context(|| format!("Failed to write {}", path.display())) +} + +/// Regenerate `website/cue/reference/deprecations.cue` from the current +/// `deprecation.d/` fragments (pending) and the enacted JSON sidecar. +pub fn sync_deprecations_cue(repo_root: &Path) -> Result<()> { + let dir = repo_root.join(DEPRECATION_DIR); + let pending = read_deprecation_fragments(&dir)?; + let enacted = read_enacted(repo_root)?; + let cue = render_deprecations_cue(&pending, &enacted); + let path = repo_root.join(DEPRECATIONS_CUE); + fs::write(&path, cue) + .with_context(|| format!("Failed to write {}", path.display())) +} + +/// Public alias used by the check command to verify the CUE file is in sync. +pub fn render_deprecations_cue_for_check( + pending: &[DeprecationEntry], + enacted: &[EnactedEntry], +) -> String { + render_deprecations_cue(pending, enacted) +} + +fn render_deprecations_cue(pending: &[DeprecationEntry], enacted: &[EnactedEntry]) -> String { + let pending_block = render_pending_block(pending); + let enacted_block = render_enacted_block(enacted); + format!( + "// Code generated by `cargo vdev deprecation sync-cue`. DO NOT EDIT.\n\ + package metadata\n\ + \n\ + deprecations_pending: [\n\ + {pending_block}\ + ]\n\ + \n\ + deprecations_enacted: [\n\ + {enacted_block}\ + ]\n" + ) +} + +fn render_pending_block(entries: &[DeprecationEntry]) -> String { + entries + .iter() + .map(|e| { + let mut s = String::from("\t{\n"); + s.push_str(&format!("\t\twhat: {}\n", json!(e.what))); + s.push_str(&format!( + "\t\tdeprecated_since: {}\n", + json!(e.deprecated_since.to_string()) + )); + if !e.description.is_empty() { + s.push_str("\t\tdescription: #\"\"\"\n"); + for line in e.description.lines() { + s.push_str(&format!("\t\t\t{line}\n")); + } + s.push_str("\t\t\t\"\"\"#\n"); + } + s.push_str("\t},\n"); + s + }) + .collect() +} + +fn render_enacted_block(entries: &[EnactedEntry]) -> String { + entries + .iter() + .map(|e| { + let mut s = String::from("\t{\n"); + s.push_str(&format!("\t\twhat: {}\n", json!(e.what))); + s.push_str(&format!("\t\tdeprecated_since: {}\n", json!(e.deprecated_since))); + s.push_str(&format!("\t\tremoved_in: {}\n", json!(e.removed_in))); + if !e.description.is_empty() { + s.push_str("\t\tdescription: #\"\"\"\n"); + for line in e.description.lines() { + s.push_str(&format!("\t\t\t{line}\n")); + } + s.push_str("\t\t\t\"\"\"#\n"); + } + s.push_str("\t},\n"); + s + }) + .collect() +} + #[cfg(test)] mod tests { use super::*; diff --git a/website/Makefile b/website/Makefile index bb6f296de6ae1..1547343c5e3af 100644 --- a/website/Makefile +++ b/website/Makefile @@ -30,7 +30,10 @@ generate-vrl-docs: $(VDEV) build vrl-docs --output-dir cue/reference/remap/functions \ $(if $(findstring true,$(CI)),--vector-sha $(GITHUB_SHA),) -structured-data: generate-vrl-docs cue-build config-examples +generate-deprecations-cue: + $(VDEV) deprecation sync-cue + +structured-data: generate-vrl-docs generate-deprecations-cue cue-build config-examples serve: clean setup cargo-data structured-data hugo server \ diff --git a/website/content/en/docs/reference/deprecations.md b/website/content/en/docs/reference/deprecations.md new file mode 100644 index 0000000000000..739b3a7f8b43e --- /dev/null +++ b/website/content/en/docs/reference/deprecations.md @@ -0,0 +1,5 @@ +--- +title: Deprecations +weight: 100 +layout: deprecations +--- diff --git a/website/cue/reference/deprecations.cue b/website/cue/reference/deprecations.cue new file mode 100644 index 0000000000000..b4e85c44716b9 --- /dev/null +++ b/website/cue/reference/deprecations.cue @@ -0,0 +1,69 @@ +// Code generated by `cargo vdev deprecation sync-cue`. DO NOT EDIT. +package metadata + +deprecations_pending: [ + { + what: "`azure_monitor_logs` sink" + deprecated_since: "0.58.0" + description: #""" + The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink, + which uses the Azure Monitor Logs Ingestion API. + + Users should migrate before Microsoft ends support for the old Data Collector API (scheduled + for September 2026). + """# + }, + { + what: "Boolean syntax for the `compression` field in the `vector` sink" + deprecated_since: "0.56.0" + description: #""" + The boolean syntax (`compression: true` / `compression: false`) is deprecated. + Use the string syntax instead: `compression: "gzip"`, `compression: "zstd"`, or `compression: "none"`. + + The `bool_or_vector_compression` deserializer will be removed once the boolean syntax is no longer supported. + """# + }, + { + what: "`buffer_byte_size` and `buffer_events` gauge metrics" + deprecated_since: "0.53.0" + description: #""" + The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the + `buffer_size_bytes` and `buffer_size_events` metrics described in `docs/specs/buffer.md`. + """# + }, + { + what: "`series_api_version: v1` option on the `datadog_metrics` sink" + deprecated_since: "0.58.0" + description: #""" + The `series_api_version: v1` option is deprecated in favor of `v2` (the default). + The v1 series endpoint (`/api/v1/series`) is a legacy endpoint. + + Users should remove `series_api_version: v1` from their configuration or set it to `v2`. + """# + }, + { + what: "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]" + deprecated_since: "0.56.0" + description: #""" + This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging. + """# + }, + { + what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" + deprecated_since: "0.55.0" + description: #""" + The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. + Users must upgrade their GreptimeDB instance to v1.x before upgrading Vector. + """# + }, + { + what: "`encoding` field on HTTP server sources" + deprecated_since: "0.50.0" + description: #""" + The `encoding` field will be removed. Use `decoding` and `framing` instead. + """# + }, +] + +deprecations_enacted: [ +] diff --git a/website/cue/reference/deprecations_enacted.json b/website/cue/reference/deprecations_enacted.json new file mode 100644 index 0000000000000..fe51488c7066f --- /dev/null +++ b/website/cue/reference/deprecations_enacted.json @@ -0,0 +1 @@ +[] diff --git a/website/cue/reference/deprecations_schema.cue b/website/cue/reference/deprecations_schema.cue new file mode 100644 index 0000000000000..3d530d8b5b348 --- /dev/null +++ b/website/cue/reference/deprecations_schema.cue @@ -0,0 +1,4 @@ +package metadata + +deprecations_pending: [...releases.#DeprecationEntry] +deprecations_enacted: [...releases.#EnactedDeprecationEntry] diff --git a/website/cue/reference/releases.cue b/website/cue/reference/releases.cue index 62c3115c26b96..060082e8019c7 100644 --- a/website/cue/reference/releases.cue +++ b/website/cue/reference/releases.cue @@ -34,6 +34,13 @@ releases: { description?: string } + #EnactedDeprecationEntry: { + what: string + deprecated_since: string + removed_in: string + description?: string + } + #Release: { version: string codename?: string diff --git a/website/layouts/docs/deprecations.html b/website/layouts/docs/deprecations.html new file mode 100644 index 0000000000000..f0f7d9b6589ba --- /dev/null +++ b/website/layouts/docs/deprecations.html @@ -0,0 +1,101 @@ +{{ define "title" }} +{{ .Title }} | Vector documentation +{{ end }} + +{{ define "main" }} +{{ $pending := site.Data.docs.deprecations_pending }} +{{ $enacted := site.Data.docs.deprecations_enacted }} + +{{ $here := .RelPermalink }} +
+
+ + +
+
+ {{ partial "heading.html" (dict "text" .Title "level" 1) }} +
+ +
+

+ This page lists all active and historical deprecations in Vector. + Active deprecations are features or configuration options that are deprecated but not yet removed. + When a feature is finally removed, it moves to the Enacted section below. +

+
+ + {{ if gt (len $pending) 0 }} +
+
+ {{ partial "heading.html" (dict "text" "Active Deprecations" "level" 2) }} +

These features are deprecated and will be removed in a future release.

+
+ +
+ {{ range $pending }} +
+ + {{ .what | markdownify }} + +
+ Deprecated since {{ .deprecated_since }} +
+ {{ with .description }} +
+ {{ . | markdownify }} +
+ {{ end }} +
+ {{ end }} +
+
+ {{ end }} + + {{ if gt (len $enacted) 0 }} +
+
+ {{ partial "heading.html" (dict "text" "Enacted Deprecations" "level" 2) }} +

These features have been removed from Vector.

+
+ +
+ {{ range $enacted }} +
+ + {{ .what | markdownify }} + +
+ Deprecated since {{ .deprecated_since }} · Removed in {{ .removed_in }} +
+ {{ with .description }} +
+ {{ . | markdownify }} +
+ {{ end }} +
+ {{ end }} +
+
+ {{ end }} + + {{ if and (eq (len $pending) 0) (eq (len $enacted) 0) }} +
+

No deprecations at this time.

+
+ {{ end }} +
+
+
+{{ end }} + +{{ define "below" }} +{{ partial "docs/pagination.html" . }} +{{ end }} + +{{ define "subfooter" }} +{{ partial "docs/mobile-nav.html" . }} +{{ end }} diff --git a/website/layouts/releases/single.html b/website/layouts/releases/single.html index a879fd0ec11f0..242aa6d509a0c 100644 --- a/website/layouts/releases/single.html +++ b/website/layouts/releases/single.html @@ -58,6 +58,9 @@
{{ partial "heading.html" (dict "text" "Deprecation Announcements" "level" 2) }} +

+ See the deprecations page for all active and historical deprecations. +

From 77567ff44389117c2c15d0c86e899644193da6e4 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 13:29:53 -0400 Subject: [PATCH 43/85] chore(website): deprecations page via shortcode, remove planned_deprecations from release pages --- .../content/en/docs/reference/deprecations.md | 10 ++- website/layouts/releases/single.html | 25 ------ website/layouts/shortcodes/deprecations.html | 83 +++++++++++++++++++ 3 files changed, 92 insertions(+), 26 deletions(-) create mode 100644 website/layouts/shortcodes/deprecations.html diff --git a/website/content/en/docs/reference/deprecations.md b/website/content/en/docs/reference/deprecations.md index 739b3a7f8b43e..a70e8803226cc 100644 --- a/website/content/en/docs/reference/deprecations.md +++ b/website/content/en/docs/reference/deprecations.md @@ -1,5 +1,13 @@ --- title: Deprecations weight: 100 -layout: deprecations --- + +This page lists all deprecations in Vector — both active ones that will be removed in a future +release, and historical ones that have already been enacted. + +To learn about Vector's deprecation policy, see the [deprecation policy][policy]. + +{{< deprecations >}} + +[policy]: /docs/DEPRECATION_POLICY/ diff --git a/website/layouts/releases/single.html b/website/layouts/releases/single.html index 242aa6d509a0c..260869dbb79d9 100644 --- a/website/layouts/releases/single.html +++ b/website/layouts/releases/single.html @@ -243,31 +243,6 @@
{{ end }} - {{ if gt (len $release.planned_deprecations) 0 }} -
-
- {{ partial "heading.html" (dict "text" "Planned Deprecations" "level" 2) }} -
- -
- {{ range $release.planned_deprecations }} -
- - {{ .what | markdownify }} - -
- Deprecated since {{ .deprecated_since }} -
- {{ with .description }} -
- {{ . | markdownify }} -
- {{ end }} -
- {{ end }} -
-
- {{ end }}
diff --git a/website/layouts/shortcodes/deprecations.html b/website/layouts/shortcodes/deprecations.html new file mode 100644 index 0000000000000..0a03fe581add9 --- /dev/null +++ b/website/layouts/shortcodes/deprecations.html @@ -0,0 +1,83 @@ +{{- $pending := site.Data.docs.deprecations_pending -}} +{{- $enacted := site.Data.docs.deprecations_enacted -}} + +{{- /* Optional version param: filter to a specific release (major.minor match). + Accepts "0.56" or "0.56.0" — both match deprecated_since values of the form "0.56.*". */ -}} +{{- $version := .Get "version" -}} +{{- if $version -}} + {{- $parts := split $version "." -}} + {{- $prefix := printf "%s.%s." (index $parts 0) (index $parts 1) -}} + {{- $exact := printf "%s.%s" (index $parts 0) (index $parts 1) -}} + {{- $fp := slice -}} + {{- range $pending -}} + {{- if or (strings.HasPrefix .deprecated_since $prefix) (eq .deprecated_since $exact) -}} + {{- $fp = $fp | append . -}} + {{- end -}} + {{- end -}} + {{- $pending = $fp -}} + {{- $fe := slice -}} + {{- range $enacted -}} + {{- if or (strings.HasPrefix .deprecated_since $prefix) (eq .deprecated_since $exact) -}} + {{- $fe = $fe | append . -}} + {{- end -}} + {{- end -}} + {{- $enacted = $fe -}} +{{- end -}} + +{{ if gt (len $pending) 0 }} +
+ {{ partial "heading.html" (dict "text" "Active Deprecations" "level" 2 "anchor" true) }} +

+ These features are deprecated and will be removed in a future release. +

+ +
+ {{ range $pending }} +
+
+ {{ .what | markdownify }} +
+
+ Deprecated since {{ .deprecated_since }} +
+ {{ with .description }} +
+ {{ . | markdownify }} +
+ {{ end }} +
+ {{ end }} +
+
+{{ end }} + +{{ if gt (len $enacted) 0 }} +
+ {{ partial "heading.html" (dict "text" "Enacted Deprecations" "level" 2 "anchor" true) }} +

+ These features have been removed from Vector. +

+ +
+ {{ range $enacted }} +
+
+ {{ .what | markdownify }} +
+
+ Deprecated since {{ .deprecated_since }} · Removed in {{ .removed_in }} +
+ {{ with .description }} +
+ {{ . | markdownify }} +
+ {{ end }} +
+ {{ end }} +
+
+{{ end }} + +{{ if and (eq (len $pending) 0) (eq (len $enacted) 0) }} +

No deprecations{{ if $version }} for v{{ $version }}{{ end }}.

+{{ end }} From 79ad5a4ea0ddc405e0a1e880a75f1894f59caff5 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 13:31:08 -0400 Subject: [PATCH 44/85] chore(website): remove unused deprecations layout --- website/layouts/docs/deprecations.html | 101 ------------------------- 1 file changed, 101 deletions(-) delete mode 100644 website/layouts/docs/deprecations.html diff --git a/website/layouts/docs/deprecations.html b/website/layouts/docs/deprecations.html deleted file mode 100644 index f0f7d9b6589ba..0000000000000 --- a/website/layouts/docs/deprecations.html +++ /dev/null @@ -1,101 +0,0 @@ -{{ define "title" }} -{{ .Title }} | Vector documentation -{{ end }} - -{{ define "main" }} -{{ $pending := site.Data.docs.deprecations_pending }} -{{ $enacted := site.Data.docs.deprecations_enacted }} - -{{ $here := .RelPermalink }} -
-
- - -
-
- {{ partial "heading.html" (dict "text" .Title "level" 1) }} -
- -
-

- This page lists all active and historical deprecations in Vector. - Active deprecations are features or configuration options that are deprecated but not yet removed. - When a feature is finally removed, it moves to the Enacted section below. -

-
- - {{ if gt (len $pending) 0 }} -
-
- {{ partial "heading.html" (dict "text" "Active Deprecations" "level" 2) }} -

These features are deprecated and will be removed in a future release.

-
- -
- {{ range $pending }} -
- - {{ .what | markdownify }} - -
- Deprecated since {{ .deprecated_since }} -
- {{ with .description }} -
- {{ . | markdownify }} -
- {{ end }} -
- {{ end }} -
-
- {{ end }} - - {{ if gt (len $enacted) 0 }} -
-
- {{ partial "heading.html" (dict "text" "Enacted Deprecations" "level" 2) }} -

These features have been removed from Vector.

-
- -
- {{ range $enacted }} -
- - {{ .what | markdownify }} - -
- Deprecated since {{ .deprecated_since }} · Removed in {{ .removed_in }} -
- {{ with .description }} -
- {{ . | markdownify }} -
- {{ end }} -
- {{ end }} -
-
- {{ end }} - - {{ if and (eq (len $pending) 0) (eq (len $enacted) 0) }} -
-

No deprecations at this time.

-
- {{ end }} -
-
-
-{{ end }} - -{{ define "below" }} -{{ partial "docs/pagination.html" . }} -{{ end }} - -{{ define "subfooter" }} -{{ partial "docs/mobile-nav.html" . }} -{{ end }} From 9c9db7c1386db3af15c1ea7934e0605dc77d61d3 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 13:52:49 -0400 Subject: [PATCH 45/85] chore(website): fix deprecations page copy and policy link --- website/content/en/docs/reference/deprecations.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/content/en/docs/reference/deprecations.md b/website/content/en/docs/reference/deprecations.md index a70e8803226cc..71f54f639b58e 100644 --- a/website/content/en/docs/reference/deprecations.md +++ b/website/content/en/docs/reference/deprecations.md @@ -3,11 +3,11 @@ title: Deprecations weight: 100 --- -This page lists all deprecations in Vector — both active ones that will be removed in a future -release, and historical ones that have already been enacted. +This page lists all deprecations in Vector, both active ones that will be removed in a future +release and historical ones that have already been enacted. To learn about Vector's deprecation policy, see the [deprecation policy][policy]. {{< deprecations >}} -[policy]: /docs/DEPRECATION_POLICY/ +[policy]: https://github.com/vectordotdev/vector/blob/master/docs/DEPRECATION_POLICY.md From f4156c0f4ffd49a878ee2e28a7366b7b1b9ec29e Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 13:57:43 -0400 Subject: [PATCH 46/85] chore(releasing): remove deprecation_announcements/planned_deprecations from release CUE; drive release deprecations from global list via partial --- vdev/src/commands/release/generate_cue.rs | 57 +-------- website/cue/reference/releases.cue | 2 - website/cue/reference/releases/0.56.0.cue | 67 ---------- .../partials/releases/deprecations.html | 67 ++++++++++ website/layouts/releases/single.html | 21 +-- website/layouts/shortcodes/deprecations.html | 120 ++++++++---------- 6 files changed, 120 insertions(+), 214 deletions(-) create mode 100644 website/layouts/partials/releases/deprecations.html diff --git a/vdev/src/commands/release/generate_cue.rs b/vdev/src/commands/release/generate_cue.rs index 99cbcbf56d46b..4f24d3b84463c 100644 --- a/vdev/src/commands/release/generate_cue.rs +++ b/vdev/src/commands/release/generate_cue.rs @@ -12,10 +12,7 @@ use regex::Regex; use semver::Version; use serde_json::json; -use crate::utils::{ - deprecation::{self, DeprecationEntry}, - git, paths, -}; +use crate::utils::{git, paths}; const RELEASES_DIR: &str = "website/cue/reference/releases"; const CHANGELOG_DIR: &str = "changelog.d"; @@ -99,20 +96,10 @@ pub(super) fn run(new_version: &Version) -> Result { let changelog_dir = repo_root.join(CHANGELOG_DIR); let changelog_entries = read_changelog_fragments(&changelog_dir)?; - let deprecation_dir = repo_root.join(deprecation::DEPRECATION_DIR); - let all_deprecations = deprecation::read_deprecation_fragments(&deprecation_dir)?; - - let deprecation::DeprecationPartition { - announcing: announcing_deprecations, - planned: planned_deprecations, - } = deprecation::partition_by_release(all_deprecations, &new_version); - let cue_text = render_release_cue( &new_version, &changelog_entries, &commits, - &announcing_deprecations, - &planned_deprecations, ); fs::write(&cue_path, cue_text) .with_context(|| format!("Failed to write {}", cue_path.display()))?; @@ -560,8 +547,6 @@ fn render_release_cue( version: &Version, changelog: &[ChangelogEntry], commits: &[Commit], - announcing_deprecations: &[DeprecationEntry], - planned_deprecations: &[DeprecationEntry], ) -> String { let date = Utc::now().format("%Y-%m-%d").to_string(); let changelog_block = render_changelog(changelog); @@ -571,9 +556,6 @@ fn render_release_cue( .collect::>() .join(",\n "); - let deprecation_announcements_block = render_deprecation_section(announcing_deprecations); - let planned_deprecations_block = render_deprecation_section(planned_deprecations); - format!( "package metadata\n\ \n\ @@ -583,14 +565,6 @@ fn render_release_cue( \n\ \twhats_next: []\n\ \n\ - \tdeprecation_announcements: [\n\ - {deprecation_announcements_block}\n\ - \t]\n\ - \n\ - \tplanned_deprecations: [\n\ - {planned_deprecations_block}\n\ - \t]\n\ - \n\ \tchangelog: [\n\ {changelog_block}\n\ \t]\n\ @@ -600,33 +574,6 @@ fn render_release_cue( ) } -fn render_deprecation_section(entries: &[DeprecationEntry]) -> String { - entries - .iter() - .map(|e| { - let mut s = String::new(); - s.push_str("\t\t{\n"); - writeln!(s, "\t\t\twhat: {}", json!(e.what)).unwrap(); - writeln!( - s, - "\t\t\tdeprecated_since: {}", - json!(e.deprecated_since.to_string()) - ) - .unwrap(); - if !e.description.is_empty() { - s.push_str("\t\t\tdescription: #\"\"\"\n"); - for line in e.description.lines() { - writeln!(s, "\t\t\t\t{line}").unwrap(); - } - s.push_str("\t\t\t\t\"\"\"#\n"); - } - s.push_str("\t\t}"); - s - }) - .collect::>() - .join(",\n") -} - fn render_changelog(entries: &[ChangelogEntry]) -> String { entries .iter() @@ -821,7 +768,7 @@ mod tests { deletions_count: 3, }]; - let out = render_release_cue(&Version::new(0, 99, 0), &entries, &commits, &[], &[]); + let out = render_release_cue(&Version::new(0, 99, 0), &entries, &commits); assert!(out.starts_with("package metadata\n")); assert!(out.contains("releases: \"0.99.0\":")); diff --git a/website/cue/reference/releases.cue b/website/cue/reference/releases.cue index 060082e8019c7..4d8f5798dad28 100644 --- a/website/cue/reference/releases.cue +++ b/website/cue/reference/releases.cue @@ -52,8 +52,6 @@ releases: { changelog: [#ChangeLogEntry, ...#ChangeLogEntry] | *[] vrl_changelog?: string whats_next: #Any | *[] - deprecation_announcements: [#DeprecationEntry, ...#DeprecationEntry] | *[] - planned_deprecations: [#DeprecationEntry, ...#DeprecationEntry] | *[] } {[Version=string]: #Release & {version: Version}} diff --git a/website/cue/reference/releases/0.56.0.cue b/website/cue/reference/releases/0.56.0.cue index cb0390c6a42e2..035f566bab639 100644 --- a/website/cue/reference/releases/0.56.0.cue +++ b/website/cue/reference/releases/0.56.0.cue @@ -6,73 +6,6 @@ releases: "0.56.0": { whats_next: [] - deprecation_announcements: [ - { - what: "Boolean syntax for the `compression` field in the `vector` sink" - deprecated_since: "0.56.0" - description: #""" - The boolean syntax (`compression: true` / `compression: false`) is deprecated. - Use the string syntax instead: `compression: "gzip"`, `compression: "zstd"`, or `compression: "none"`. - - The `bool_or_vector_compression` deserializer will be removed once the boolean syntax is no longer supported. - """# - }, - { - what: "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]" - deprecated_since: "0.56.0" - description: #""" - This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging. - """# - }, - ] - - planned_deprecations: [ - { - what: "`azure_monitor_logs` sink" - deprecated_since: "0.58.0" - description: #""" - The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink, - which uses the Azure Monitor Logs Ingestion API. - - Users should migrate before Microsoft ends support for the old Data Collector API (scheduled - for September 2026). - """# - }, - { - what: "`buffer_byte_size` and `buffer_events` gauge metrics" - deprecated_since: "0.53.0" - description: #""" - The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the - `buffer_size_bytes` and `buffer_size_events` metrics described in `docs/specs/buffer.md`. - """# - }, - { - what: "`series_api_version: v1` option on the `datadog_metrics` sink" - deprecated_since: "0.58.0" - description: #""" - The `series_api_version: v1` option is deprecated in favor of `v2` (the default). - The v1 series endpoint (`/api/v1/series`) is a legacy endpoint. - - Users should remove `series_api_version: v1` from their configuration or set it to `v2`. - """# - }, - { - what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" - deprecated_since: "0.55.0" - description: #""" - The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. - Users must upgrade their GreptimeDB instance to v1.x before upgrading Vector. - """# - }, - { - what: "`encoding` field on HTTP server sources" - deprecated_since: "0.50.0" - description: #""" - The `encoding` field will be removed. Use `decoding` and `framing` instead. - """# - }, - ] - changelog: [ { type: "feat" diff --git a/website/layouts/partials/releases/deprecations.html b/website/layouts/partials/releases/deprecations.html new file mode 100644 index 0000000000000..f6b9748fe2550 --- /dev/null +++ b/website/layouts/partials/releases/deprecations.html @@ -0,0 +1,67 @@ +{{/* Renders deprecations filtered to a specific version (major.minor match). + Params: version (string, e.g. "0.56" or "0.56.0") */}} +{{- $pending := site.Data.docs.deprecations_pending -}} +{{- $enacted := site.Data.docs.deprecations_enacted -}} +{{- $version := .version -}} + +{{- $parts := split $version "." -}} +{{- $prefix := printf "%s.%s." (index $parts 0) (index $parts 1) -}} +{{- $exact := printf "%s.%s" (index $parts 0) (index $parts 1) -}} + +{{- $fp := slice -}} +{{- range $pending -}} + {{- if or (strings.HasPrefix .deprecated_since $prefix) (eq .deprecated_since $exact) -}} + {{- $fp = $fp | append . -}} + {{- end -}} +{{- end -}} + +{{- $fe := slice -}} +{{- range $enacted -}} + {{- if or (strings.HasPrefix .deprecated_since $prefix) (eq .deprecated_since $exact) -}} + {{- $fe = $fe | append . -}} + {{- end -}} +{{- end -}} + +{{ if gt (len $fp) 0 }} +
+ {{ range $fp }} +
+ + {{ .what | markdownify }} + +
+ Deprecated since {{ .deprecated_since }} +
+ {{ with .description }} +
+ {{ . | markdownify }} +
+ {{ end }} +
+ {{ end }} +
+{{ end }} + +{{ if gt (len $fe) 0 }} +
+ {{ range $fe }} +
+ + {{ .what | markdownify }} + +
+ Deprecated since {{ .deprecated_since }} · Removed in {{ .removed_in }} +
+ {{ with .description }} +
+ {{ . | markdownify }} +
+ {{ end }} +
+ {{ end }} +
+{{ end }} + +{{ if and (eq (len $fp) 0) (eq (len $fe) 0) }} +

No deprecations in this release.

+{{ end }} diff --git a/website/layouts/releases/single.html b/website/layouts/releases/single.html index 260869dbb79d9..fdace030678b5 100644 --- a/website/layouts/releases/single.html +++ b/website/layouts/releases/single.html @@ -54,7 +54,6 @@
{{ end }} - {{ if gt (len $release.deprecation_announcements) 0 }}
{{ partial "heading.html" (dict "text" "Deprecation Announcements" "level" 2) }} @@ -62,26 +61,8 @@ See the deprecations page for all active and historical deprecations.

- -
- {{ range $release.deprecation_announcements }} -
- - {{ .what | markdownify }} - -
- Deprecated since {{ .deprecated_since }} -
- {{ with .description }} -
- {{ . | markdownify }} -
- {{ end }} -
- {{ end }} -
+ {{ partial "releases/deprecations.html" (dict "version" $version) }}
- {{ end }}
diff --git a/website/layouts/shortcodes/deprecations.html b/website/layouts/shortcodes/deprecations.html index 0a03fe581add9..8fd4c530cd73f 100644 --- a/website/layouts/shortcodes/deprecations.html +++ b/website/layouts/shortcodes/deprecations.html @@ -1,83 +1,63 @@ -{{- $pending := site.Data.docs.deprecations_pending -}} -{{- $enacted := site.Data.docs.deprecations_enacted -}} - -{{- /* Optional version param: filter to a specific release (major.minor match). - Accepts "0.56" or "0.56.0" — both match deprecated_since values of the form "0.56.*". */ -}} {{- $version := .Get "version" -}} -{{- if $version -}} - {{- $parts := split $version "." -}} - {{- $prefix := printf "%s.%s." (index $parts 0) (index $parts 1) -}} - {{- $exact := printf "%s.%s" (index $parts 0) (index $parts 1) -}} - {{- $fp := slice -}} - {{- range $pending -}} - {{- if or (strings.HasPrefix .deprecated_since $prefix) (eq .deprecated_since $exact) -}} - {{- $fp = $fp | append . -}} - {{- end -}} - {{- end -}} - {{- $pending = $fp -}} - {{- $fe := slice -}} - {{- range $enacted -}} - {{- if or (strings.HasPrefix .deprecated_since $prefix) (eq .deprecated_since $exact) -}} - {{- $fe = $fe | append . -}} - {{- end -}} - {{- end -}} - {{- $enacted = $fe -}} -{{- end -}} - -{{ if gt (len $pending) 0 }} -
- {{ partial "heading.html" (dict "text" "Active Deprecations" "level" 2 "anchor" true) }} -

- These features are deprecated and will be removed in a future release. -

+{{ if $version }} + {{ partial "releases/deprecations.html" (dict "version" $version) }} +{{ else }} + {{- $pending := site.Data.docs.deprecations_pending -}} + {{- $enacted := site.Data.docs.deprecations_enacted -}} -
- {{ range $pending }} -
-
- {{ .what | markdownify }} -
-
- Deprecated since {{ .deprecated_since }} -
- {{ with .description }} -
- {{ . | markdownify }} + {{ if gt (len $pending) 0 }} +
+ {{ partial "heading.html" (dict "text" "Active Deprecations" "level" 2 "anchor" true) }} +

+ These features are deprecated and will be removed in a future release. +

+
+ {{ range $pending }} +
+
+ {{ .what | markdownify }} +
+
+ Deprecated since {{ .deprecated_since }} +
+ {{ with .description }} +
+ {{ . | markdownify }} +
+ {{ end }}
{{ end }}
- {{ end }}
-
-{{ end }} + {{ end }} -{{ if gt (len $enacted) 0 }} -
- {{ partial "heading.html" (dict "text" "Enacted Deprecations" "level" 2 "anchor" true) }} -

- These features have been removed from Vector. -

- -
- {{ range $enacted }} -
-
- {{ .what | markdownify }} -
-
- Deprecated since {{ .deprecated_since }} · Removed in {{ .removed_in }} -
- {{ with .description }} -
- {{ . | markdownify }} + {{ if gt (len $enacted) 0 }} +
+ {{ partial "heading.html" (dict "text" "Enacted Deprecations" "level" 2 "anchor" true) }} +

+ These features have been removed from Vector. +

+
+ {{ range $enacted }} +
+
+ {{ .what | markdownify }} +
+
+ Deprecated since {{ .deprecated_since }} · Removed in {{ .removed_in }} +
+ {{ with .description }} +
+ {{ . | markdownify }} +
+ {{ end }}
{{ end }}
- {{ end }}
-
-{{ end }} + {{ end }} -{{ if and (eq (len $pending) 0) (eq (len $enacted) 0) }} -

No deprecations{{ if $version }} for v{{ $version }}{{ end }}.

+ {{ if and (eq (len $pending) 0) (eq (len $enacted) 0) }} +

No deprecations.

+ {{ end }} {{ end }} From 689256a899bff7f2020fddff597086c48385dbae Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 14:03:26 -0400 Subject: [PATCH 47/85] chore(website): move deprecations page intro to description frontmatter --- website/content/en/docs/reference/deprecations.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/website/content/en/docs/reference/deprecations.md b/website/content/en/docs/reference/deprecations.md index 71f54f639b58e..045754d201396 100644 --- a/website/content/en/docs/reference/deprecations.md +++ b/website/content/en/docs/reference/deprecations.md @@ -1,13 +1,9 @@ --- title: Deprecations +description: Active and historical deprecations in Vector. See the [deprecation policy](https://github.com/vectordotdev/vector/blob/master/docs/DEPRECATION_POLICY.md) for how deprecations are managed. weight: 100 --- -This page lists all deprecations in Vector, both active ones that will be removed in a future -release and historical ones that have already been enacted. - -To learn about Vector's deprecation policy, see the [deprecation policy][policy]. - {{< deprecations >}} [policy]: https://github.com/vectordotdev/vector/blob/master/docs/DEPRECATION_POLICY.md From c0326fc3579cbb7f709de4a135ad8934b4d14bc5 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 14:13:02 -0400 Subject: [PATCH 48/85] chore(website): match deprecations page style to release page; use full-width layout --- .../content/en/docs/reference/deprecations.md | 3 +- website/layouts/docs/deprecations.html | 84 +++++++++++++++++++ .../partials/releases/deprecations.html | 13 +-- website/layouts/shortcodes/deprecations.html | 66 ++++++--------- 4 files changed, 115 insertions(+), 51 deletions(-) create mode 100644 website/layouts/docs/deprecations.html diff --git a/website/content/en/docs/reference/deprecations.md b/website/content/en/docs/reference/deprecations.md index 045754d201396..61894e41691a9 100644 --- a/website/content/en/docs/reference/deprecations.md +++ b/website/content/en/docs/reference/deprecations.md @@ -1,9 +1,8 @@ --- title: Deprecations description: Active and historical deprecations in Vector. See the [deprecation policy](https://github.com/vectordotdev/vector/blob/master/docs/DEPRECATION_POLICY.md) for how deprecations are managed. +layout: deprecations weight: 100 --- -{{< deprecations >}} - [policy]: https://github.com/vectordotdev/vector/blob/master/docs/DEPRECATION_POLICY.md diff --git a/website/layouts/docs/deprecations.html b/website/layouts/docs/deprecations.html new file mode 100644 index 0000000000000..a7bac013289d3 --- /dev/null +++ b/website/layouts/docs/deprecations.html @@ -0,0 +1,84 @@ +{{ define "title" }} +{{ .Title }} | Vector documentation +{{ end }} + +{{ define "main" }} +{{ $pending := site.Data.docs.deprecations_pending }} +{{ $enacted := site.Data.docs.deprecations_enacted }} + +
+
+
+ {{ partial "breadcrumb.html" . }} +
+ +
+ {{ partial "hero.html" . }} +
+ +
+ {{ if gt (len $pending) 0 }} +
+
+ {{ partial "heading.html" (dict "text" "Active Deprecations" "level" 2) }} +

These features are deprecated and will be removed in a future release.

+
+ +
+ {{ range $pending }} +
+ + {{ .what | markdownify }} + +
+ Deprecated since {{ .deprecated_since }} +
+ {{ with .description }} +
+ {{ . | markdownify }} +
+ {{ end }} +
+ {{ end }} +
+
+ {{ end }} + + {{ if gt (len $enacted) 0 }} +
+
+ {{ partial "heading.html" (dict "text" "Enacted Deprecations" "level" 2) }} +

These features have been removed from Vector.

+
+ +
+ {{ range $enacted }} +
+ + {{ .what | markdownify }} + +
+ Deprecated since {{ .deprecated_since }} · Removed in {{ .removed_in }} +
+ {{ with .description }} +
+ {{ . | markdownify }} +
+ {{ end }} +
+ {{ end }} +
+
+ {{ end }} + + {{ if and (eq (len $pending) 0) (eq (len $enacted) 0) }} +

No deprecations at this time.

+ {{ end }} +
+
+
+{{ end }} + +{{ define "subfooter" }} +{{ partial "docs/mobile-nav.html" . }} +{{ end }} diff --git a/website/layouts/partials/releases/deprecations.html b/website/layouts/partials/releases/deprecations.html index f6b9748fe2550..77459693391d1 100644 --- a/website/layouts/partials/releases/deprecations.html +++ b/website/layouts/partials/releases/deprecations.html @@ -22,7 +22,7 @@ {{- end -}} {{- end -}} -{{ if gt (len $fp) 0 }} +{{ if or (gt (len $fp) 0) (gt (len $fe) 0) }}
{{ range $fp }}
@@ -39,11 +39,6 @@ {{ end }}
{{ end }} -
-{{ end }} - -{{ if gt (len $fe) 0 }} -
{{ range $fe }}
@@ -60,8 +55,6 @@
{{ end }}
-{{ end }} - -{{ if and (eq (len $fp) 0) (eq (len $fe) 0) }} -

No deprecations in this release.

+{{ else }} +

No deprecations in this release.

{{ end }} diff --git a/website/layouts/shortcodes/deprecations.html b/website/layouts/shortcodes/deprecations.html index 8fd4c530cd73f..8432746d1d5d9 100644 --- a/website/layouts/shortcodes/deprecations.html +++ b/website/layouts/shortcodes/deprecations.html @@ -6,58 +6,46 @@ {{- $enacted := site.Data.docs.deprecations_enacted -}} {{ if gt (len $pending) 0 }} -
- {{ partial "heading.html" (dict "text" "Active Deprecations" "level" 2 "anchor" true) }} -

- These features are deprecated and will be removed in a future release. -

-
- {{ range $pending }} -
-
- {{ .what | markdownify }} -
-
- Deprecated since {{ .deprecated_since }} -
- {{ with .description }} -
- {{ . | markdownify }} -
- {{ end }} +
+ {{ range $pending }} +
+ + {{ .what | markdownify }} + +
+ Deprecated since {{ .deprecated_since }} +
+ {{ with .description }} +
+ {{ . | markdownify }}
{{ end }}
+ {{ end }}
{{ end }} {{ if gt (len $enacted) 0 }} -
- {{ partial "heading.html" (dict "text" "Enacted Deprecations" "level" 2 "anchor" true) }} -

- These features have been removed from Vector. -

-
- {{ range $enacted }} -
-
- {{ .what | markdownify }} -
-
- Deprecated since {{ .deprecated_since }} · Removed in {{ .removed_in }} -
- {{ with .description }} -
- {{ . | markdownify }} -
- {{ end }} +
+ {{ range $enacted }} +
+ + {{ .what | markdownify }} + +
+ Deprecated since {{ .deprecated_since }} · Removed in {{ .removed_in }} +
+ {{ with .description }} +
+ {{ . | markdownify }}
{{ end }}
+ {{ end }}
{{ end }} {{ if and (eq (len $pending) 0) (eq (len $enacted) 0) }} -

No deprecations.

+

No deprecations at this time.

{{ end }} {{ end }} From 1e1b824c34f8dde8483cdc6f9b507a91ee85df82 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 14:17:04 -0400 Subject: [PATCH 49/85] chore(website): move deprecations page into releases section; fix version-scoped entry style --- .../content/en/{docs/reference => releases}/deprecations.md | 2 -- website/layouts/partials/releases/deprecations.html | 5 +---- website/layouts/{docs => releases}/deprecations.html | 0 website/layouts/releases/single.html | 2 +- 4 files changed, 2 insertions(+), 7 deletions(-) rename website/content/en/{docs/reference => releases}/deprecations.md (74%) rename website/layouts/{docs => releases}/deprecations.html (100%) diff --git a/website/content/en/docs/reference/deprecations.md b/website/content/en/releases/deprecations.md similarity index 74% rename from website/content/en/docs/reference/deprecations.md rename to website/content/en/releases/deprecations.md index 61894e41691a9..39bd9b91bf260 100644 --- a/website/content/en/docs/reference/deprecations.md +++ b/website/content/en/releases/deprecations.md @@ -4,5 +4,3 @@ description: Active and historical deprecations in Vector. See the [deprecation layout: deprecations weight: 100 --- - -[policy]: https://github.com/vectordotdev/vector/blob/master/docs/DEPRECATION_POLICY.md diff --git a/website/layouts/partials/releases/deprecations.html b/website/layouts/partials/releases/deprecations.html index 77459693391d1..a3383c0ed76d0 100644 --- a/website/layouts/partials/releases/deprecations.html +++ b/website/layouts/partials/releases/deprecations.html @@ -29,9 +29,6 @@ {{ .what | markdownify }} -
- Deprecated since {{ .deprecated_since }} -
{{ with .description }}
{{ . | markdownify }} @@ -45,7 +42,7 @@ {{ .what | markdownify }}
- Deprecated since {{ .deprecated_since }} · Removed in {{ .removed_in }} + Removed in {{ .removed_in }}
{{ with .description }}
diff --git a/website/layouts/docs/deprecations.html b/website/layouts/releases/deprecations.html similarity index 100% rename from website/layouts/docs/deprecations.html rename to website/layouts/releases/deprecations.html diff --git a/website/layouts/releases/single.html b/website/layouts/releases/single.html index fdace030678b5..757affc28496f 100644 --- a/website/layouts/releases/single.html +++ b/website/layouts/releases/single.html @@ -58,7 +58,7 @@
{{ partial "heading.html" (dict "text" "Deprecation Announcements" "level" 2) }}

- See the deprecations page for all active and historical deprecations. + See the deprecations page for all active and historical deprecations.

{{ partial "releases/deprecations.html" (dict "version" $version) }} From 369d3d8c8de5f1e2e17f90a63115178879b875f1 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 14:18:16 -0400 Subject: [PATCH 50/85] chore(website): exclude deprecations page from releases listing --- website/content/en/releases/deprecations.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/website/content/en/releases/deprecations.md b/website/content/en/releases/deprecations.md index 39bd9b91bf260..25be03c960af7 100644 --- a/website/content/en/releases/deprecations.md +++ b/website/content/en/releases/deprecations.md @@ -3,4 +3,6 @@ title: Deprecations description: Active and historical deprecations in Vector. See the [deprecation policy](https://github.com/vectordotdev/vector/blob/master/docs/DEPRECATION_POLICY.md) for how deprecations are managed. layout: deprecations weight: 100 +_build: + list: never --- From 4043c58e015678b3a03620614bccd9e595669bb6 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 14:18:34 -0400 Subject: [PATCH 51/85] chore(website): fix build front matter key (deprecated _build) --- website/content/en/releases/deprecations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/content/en/releases/deprecations.md b/website/content/en/releases/deprecations.md index 25be03c960af7..e45bb6a3839ce 100644 --- a/website/content/en/releases/deprecations.md +++ b/website/content/en/releases/deprecations.md @@ -3,6 +3,6 @@ title: Deprecations description: Active and historical deprecations in Vector. See the [deprecation policy](https://github.com/vectordotdev/vector/blob/master/docs/DEPRECATION_POLICY.md) for how deprecations are managed. layout: deprecations weight: 100 -_build: +build: list: never --- From abbcbe573294adab0298cc186183113ed959018b Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 14:20:04 -0400 Subject: [PATCH 52/85] chore(internal docs): add documentation team as CODEOWNERS of deprecation.d/ --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 45bfb2b14f923..946e192b9450e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -13,5 +13,6 @@ website/* @vectordotdev/vector @vectordotdev/vector-website # Keep documentation team paths in sync with .github/workflows/add_docs_review_label.yml /*.md @vectordotdev/vector @vectordotdev/documentation docs/ @vectordotdev/vector @vectordotdev/documentation +deprecation.d/ @vectordotdev/vector @vectordotdev/documentation website/content @vectordotdev/vector @vectordotdev/documentation website/cue/reference @vectordotdev/vector @vectordotdev/documentation From fe7a50967f249c889e5e6c2cac3a2d27e51ca89d Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 14:20:33 -0400 Subject: [PATCH 53/85] chore(ci): add deprecation.d/ to docs review label workflow --- .github/workflows/add_docs_review_label.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/add_docs_review_label.yml b/.github/workflows/add_docs_review_label.yml index e8e7bc63c1b03..e919b876e9822 100644 --- a/.github/workflows/add_docs_review_label.yml +++ b/.github/workflows/add_docs_review_label.yml @@ -13,6 +13,7 @@ on: paths: - "*.md" - "docs/**" + - "deprecation.d/**" - "website/content/**" - "website/cue/reference/**" From 045e1cadbda5cc3d1033f51544f3e92bae43413d Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 14:39:11 -0400 Subject: [PATCH 54/85] feat(vdev): add --version flag to deprecation show, style tweaks Co-Authored-By: Claude --- vdev/src/commands/deprecation/show.rs | 67 ++++++++++++++++++++------- 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/vdev/src/commands/deprecation/show.rs b/vdev/src/commands/deprecation/show.rs index 447f6468ae728..1e99096d08cb4 100644 --- a/vdev/src/commands/deprecation/show.rs +++ b/vdev/src/commands/deprecation/show.rs @@ -12,7 +12,12 @@ use crate::utils::{ /// Show current and upcoming deprecation notices #[derive(clap::Args, Debug)] #[command()] -pub struct Cli {} +pub struct Cli { + /// The next release version to use for partitioning (e.g. "0.56.0"). + /// Defaults to the next minor after the latest git tag. + #[arg(long)] + version: Option, +} impl Cli { pub fn exec(self) -> Result<()> { @@ -34,9 +39,14 @@ impl Cli { entries.sort_by(|a, b| a.deprecated_since.cmp(&b.deprecated_since)); // Determine the next minor release version (best-effort). - let next_minor: Option = git::latest_release_version() - .ok() - .map(|v| Version::new(v.major, v.minor + 1, 0)); + let explicit_version = self.version.is_some(); + let next_minor: Option = if let Some(v) = self.version { + Some(v) + } else { + git::latest_release_version() + .ok() + .map(|v| Version::new(v.major, v.minor + 1, 0)) + }; let partition_version = next_minor.clone().unwrap_or_else(|| Version::new(0, 0, 0)); let p = deprecation::partition_by_release(entries, &partition_version); @@ -48,42 +58,63 @@ impl Cli { None => "next".to_string(), }; - print_section( - &format!("Announced in next release ({next_label})"), - &announcing, - ); - print_section("Previously announced", &planned); + print_announcing_section(&next_label, &announcing); + if !explicit_version { + print_section("Previously announced", &planned); + } Ok(()) } } -fn print_section_header(title: &str) { - let style = Style::new().bold().underline(); - println!("{}", title.if_supports_color(Stdout, |t| t.style(style))); +/// Print the "Announced in next release" section header with the version label in bold red. +fn print_announcing_section(next_label: &str, entries: &[&DeprecationEntry]) { + let header_style = Style::new().underline().white(); + let title = format!("Announced in next release ({next_label})"); + println!("{}", title.if_supports_color(Stdout, |t| t.style(header_style))); + println!(); + if entries.is_empty() { + println!("{}", "(none)".if_supports_color(Stdout, |t| t.dimmed())); + } else { + for e in entries { + print_entry(e, true); + } + } println!(); } fn print_section(title: &str, entries: &[&DeprecationEntry]) { - print_section_header(title); + let style = Style::new().bold().underline(); + println!("{}", title.if_supports_color(Stdout, |t| t.style(style))); + println!(); if entries.is_empty() { println!("{}", "(none)".if_supports_color(Stdout, |t| t.dimmed())); } else { for e in entries { - print_entry(e); + print_entry(e, false); } } println!(); } -fn print_entry(e: &DeprecationEntry) { +fn print_entry(e: &DeprecationEntry, highlight_version: bool) { println!("{}", e.what.if_supports_color(Stdout, |t| t.bold())); + let version_str = e.deprecated_since.to_string(); + let version_colored = if highlight_version { + owo_colors::OwoColorize::if_supports_color( + &version_str, + Stdout, + |t| t.style(Style::new().bold().red()), + ) + .to_string() + } else { + owo_colors::OwoColorize::if_supports_color(&version_str, Stdout, |t| t.bright_cyan()) + .to_string() + }; println!( " {} {}", "deprecated_since:".if_supports_color(Stdout, |t| t.dimmed()), - e.deprecated_since - .to_string() - .if_supports_color(Stdout, |t| t.bright_cyan()), + version_colored, ); if !e.description.is_empty() { println!(); From c03b0f43698065a6dd802be536303570fb24fd32 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 14:45:39 -0400 Subject: [PATCH 55/85] chore(deprecation): enact greptimedb v0.x support deprecation in 0.56.0 --- deprecation.d/greptimedb-v0-support.md | 7 ------- website/cue/reference/deprecations.cue | 17 +++++++++-------- website/cue/reference/deprecations_enacted.json | 9 ++++++++- 3 files changed, 17 insertions(+), 16 deletions(-) delete mode 100644 deprecation.d/greptimedb-v0-support.md diff --git a/deprecation.d/greptimedb-v0-support.md b/deprecation.d/greptimedb-v0-support.md deleted file mode 100644 index f0275351408b1..0000000000000 --- a/deprecation.d/greptimedb-v0-support.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" -deprecated_since: "0.55.0" ---- - -The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. -Users must upgrade their GreptimeDB instance to v1.x before upgrading Vector. diff --git a/website/cue/reference/deprecations.cue b/website/cue/reference/deprecations.cue index b4e85c44716b9..0586b0d3f0499 100644 --- a/website/cue/reference/deprecations.cue +++ b/website/cue/reference/deprecations.cue @@ -48,14 +48,6 @@ deprecations_pending: [ This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging. """# }, - { - what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" - deprecated_since: "0.55.0" - description: #""" - The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. - Users must upgrade their GreptimeDB instance to v1.x before upgrading Vector. - """# - }, { what: "`encoding` field on HTTP server sources" deprecated_since: "0.50.0" @@ -66,4 +58,13 @@ deprecations_pending: [ ] deprecations_enacted: [ + { + what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" + deprecated_since: "0.55.0" + removed_in: "0.56.0" + description: #""" + The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. + Users must upgrade their GreptimeDB instance to v1.x before upgrading Vector. + """# + }, ] diff --git a/website/cue/reference/deprecations_enacted.json b/website/cue/reference/deprecations_enacted.json index fe51488c7066f..9df53ec4d1444 100644 --- a/website/cue/reference/deprecations_enacted.json +++ b/website/cue/reference/deprecations_enacted.json @@ -1 +1,8 @@ -[] +[ + { + "what": "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks", + "deprecated_since": "0.55.0", + "removed_in": "0.56.0", + "description": "The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x.\nUsers must upgrade their GreptimeDB instance to v1.x before upgrading Vector." + } +] From 0e85e1a08d6f950b621470c432f98ba35ac63c77 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 14:51:45 -0400 Subject: [PATCH 56/85] chore(releasing): replace deprecations.cue + deprecations_enacted.json with single generated/deprecations.json --- scripts/cue.sh | 1 + vdev/src/commands/check/deprecations.rs | 14 +- vdev/src/commands/deprecation/enact.rs | 2 +- vdev/src/commands/deprecation/sync_cue.rs | 4 +- vdev/src/utils/deprecation.rs | 144 ++++++++---------- website/cue/reference/deprecations.cue | 70 --------- .../cue/reference/deprecations_enacted.json | 8 - website/cue/reference/deprecations_schema.cue | 4 - .../cue/reference/generated/deprecations.json | 42 +++++ 9 files changed, 115 insertions(+), 174 deletions(-) delete mode 100644 website/cue/reference/deprecations.cue delete mode 100644 website/cue/reference/deprecations_enacted.json delete mode 100644 website/cue/reference/deprecations_schema.cue create mode 100644 website/cue/reference/generated/deprecations.json diff --git a/scripts/cue.sh b/scripts/cue.sh index 5bf6ba6e67044..a958fb9bcec86 100755 --- a/scripts/cue.sh +++ b/scripts/cue.sh @@ -13,6 +13,7 @@ JSON_OUT="${ROOT}/website/data/docs.json" list-docs-files() { find "${CUE_SOURCES}" -name '*.cue' + find "${CUE_SOURCES}" -path '*/generated/*.json' 2>/dev/null || true } cmd_check() { diff --git a/vdev/src/commands/check/deprecations.rs b/vdev/src/commands/check/deprecations.rs index 511f3d37ecb87..3f6f7c747973e 100644 --- a/vdev/src/commands/check/deprecations.rs +++ b/vdev/src/commands/check/deprecations.rs @@ -4,7 +4,7 @@ use anyhow::{Result, bail}; use crate::utils::{deprecation, paths}; -/// Check that all deprecation.d fragments are valid and deprecations.cue is in sync +/// Check that all deprecation.d fragments are valid and deprecations.json is in sync #[derive(clap::Args, Debug)] #[command()] pub struct Cli {} @@ -33,19 +33,19 @@ impl Cli { println!("{} deprecation fragment(s) are valid.", entries.len()); } - // Verify deprecations.cue is in sync with deprecation.d/. - let cue_path = repo_root.join(deprecation::DEPRECATIONS_CUE); - if cue_path.exists() { + // Verify generated/deprecations.json is in sync with deprecation.d/. + let json_path = repo_root.join(deprecation::DEPRECATIONS_JSON); + if json_path.exists() { let enacted = deprecation::read_enacted(&repo_root)?; let expected = deprecation::render_deprecations_cue_for_check(&entries, &enacted); - let actual = std::fs::read_to_string(&cue_path)?; + let actual = std::fs::read_to_string(&json_path)?; if actual != expected { bail!( "{} is out of sync with deprecation.d/. Run `cargo vdev deprecation sync-cue` to regenerate it.", - cue_path.display() + json_path.display() ); } - println!("{} is up to date.", cue_path.display()); + println!("{} is up to date.", json_path.display()); } Ok(()) diff --git a/vdev/src/commands/deprecation/enact.rs b/vdev/src/commands/deprecation/enact.rs index 223436f52e566..086fe901077e4 100644 --- a/vdev/src/commands/deprecation/enact.rs +++ b/vdev/src/commands/deprecation/enact.rs @@ -63,7 +63,7 @@ impl Cli { deprecation::sync_deprecations_cue(&repo_root)?; println!( "Updated {}", - repo_root.join(deprecation::DEPRECATIONS_CUE).display() + repo_root.join(deprecation::DEPRECATIONS_JSON).display() ); Ok(()) diff --git a/vdev/src/commands/deprecation/sync_cue.rs b/vdev/src/commands/deprecation/sync_cue.rs index 45d47cd7701fc..4d5af2a9755bc 100644 --- a/vdev/src/commands/deprecation/sync_cue.rs +++ b/vdev/src/commands/deprecation/sync_cue.rs @@ -4,7 +4,7 @@ use anyhow::Result; use crate::utils::{deprecation, paths}; -/// Regenerate website/cue/reference/deprecations.cue from deprecation.d/ +/// Regenerate website/cue/reference/generated/deprecations.json from deprecation.d/ #[derive(clap::Args, Debug)] #[command()] pub struct Cli {} @@ -15,7 +15,7 @@ impl Cli { deprecation::sync_deprecations_cue(&repo_root)?; println!( "Wrote {}", - repo_root.join(deprecation::DEPRECATIONS_CUE).display() + repo_root.join(deprecation::DEPRECATIONS_JSON).display() ); Ok(()) } diff --git a/vdev/src/utils/deprecation.rs b/vdev/src/utils/deprecation.rs index 122966e04801a..2edfb1dac2f41 100644 --- a/vdev/src/utils/deprecation.rs +++ b/vdev/src/utils/deprecation.rs @@ -5,11 +5,8 @@ use std::{ use anyhow::{Context, Result, anyhow, bail}; use semver::Version; -use serde_json::json; - pub const DEPRECATION_DIR: &str = "deprecation.d"; -pub const ENACTED_JSON: &str = "website/cue/reference/deprecations_enacted.json"; -pub const DEPRECATIONS_CUE: &str = "website/cue/reference/deprecations.cue"; +pub const DEPRECATIONS_JSON: &str = "website/cue/reference/generated/deprecations.json"; /// A concrete semver version identifying when a deprecation was announced. /// Accepted forms: `"0.56"` (major.minor) or `"0.56.0"` (major.minor.patch). @@ -185,11 +182,27 @@ pub struct EnactedEntry { pub description: String, } -/// Read the list of enacted deprecations from the JSON sidecar file. -pub fn read_enacted(repo_root: &Path) -> Result> { - let path = repo_root.join(ENACTED_JSON); +#[derive(Debug, serde::Serialize, serde::Deserialize)] +struct DeprecationsJson { + deprecations_pending: Vec, + deprecations_enacted: Vec, +} + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +struct PendingJsonEntry { + what: String, + deprecated_since: String, + #[serde(default, skip_serializing_if = "String::is_empty")] + description: String, +} + +fn read_json(repo_root: &Path) -> Result { + let path = repo_root.join(DEPRECATIONS_JSON); if !path.exists() { - return Ok(Vec::new()); + return Ok(DeprecationsJson { + deprecations_pending: Vec::new(), + deprecations_enacted: Vec::new(), + }); } let raw = fs::read_to_string(&path) .with_context(|| format!("Failed to read {}", path.display()))?; @@ -197,95 +210,62 @@ pub fn read_enacted(repo_root: &Path) -> Result> { .with_context(|| format!("Failed to parse {}", path.display())) } -/// Append an enacted entry to the JSON sidecar file. -pub fn append_enacted(repo_root: &Path, entry: EnactedEntry) -> Result<()> { - let mut entries = read_enacted(repo_root)?; - entries.push(entry); - let path = repo_root.join(ENACTED_JSON); - let json = serde_json::to_string_pretty(&entries)? + "\n"; - fs::write(&path, json) +fn write_json(repo_root: &Path, data: &DeprecationsJson) -> Result<()> { + let path = repo_root.join(DEPRECATIONS_JSON); + if let Some(parent) = path.parent() { + fs::create_dir_all(parent)?; + } + let out = serde_json::to_string_pretty(data)? + "\n"; + fs::write(&path, out) .with_context(|| format!("Failed to write {}", path.display())) } -/// Regenerate `website/cue/reference/deprecations.cue` from the current -/// `deprecation.d/` fragments (pending) and the enacted JSON sidecar. -pub fn sync_deprecations_cue(repo_root: &Path) -> Result<()> { - let dir = repo_root.join(DEPRECATION_DIR); - let pending = read_deprecation_fragments(&dir)?; - let enacted = read_enacted(repo_root)?; - let cue = render_deprecations_cue(&pending, &enacted); - let path = repo_root.join(DEPRECATIONS_CUE); - fs::write(&path, cue) - .with_context(|| format!("Failed to write {}", path.display())) +/// Read the list of enacted deprecations from the generated JSON file. +pub fn read_enacted(repo_root: &Path) -> Result> { + Ok(read_json(repo_root)?.deprecations_enacted) } -/// Public alias used by the check command to verify the CUE file is in sync. -pub fn render_deprecations_cue_for_check( - pending: &[DeprecationEntry], - enacted: &[EnactedEntry], -) -> String { - render_deprecations_cue(pending, enacted) +/// Append an enacted entry and regenerate the pending section from deprecation.d/. +pub fn append_enacted(repo_root: &Path, entry: EnactedEntry) -> Result<()> { + let dir = repo_root.join(DEPRECATION_DIR); + let pending = read_deprecation_fragments(&dir)?; + let mut data = read_json(repo_root)?; + data.deprecations_enacted.push(entry); + data.deprecations_pending = pending_to_json(&pending); + write_json(repo_root, &data) } -fn render_deprecations_cue(pending: &[DeprecationEntry], enacted: &[EnactedEntry]) -> String { - let pending_block = render_pending_block(pending); - let enacted_block = render_enacted_block(enacted); - format!( - "// Code generated by `cargo vdev deprecation sync-cue`. DO NOT EDIT.\n\ - package metadata\n\ - \n\ - deprecations_pending: [\n\ - {pending_block}\ - ]\n\ - \n\ - deprecations_enacted: [\n\ - {enacted_block}\ - ]\n" - ) +/// Regenerate `DEPRECATIONS_JSON` from `deprecation.d/` (pending) plus the +/// existing enacted entries already in the file. +pub fn sync_deprecations_cue(repo_root: &Path) -> Result<()> { + let dir = repo_root.join(DEPRECATION_DIR); + let pending = read_deprecation_fragments(&dir)?; + let mut data = read_json(repo_root)?; + data.deprecations_pending = pending_to_json(&pending); + write_json(repo_root, &data) } -fn render_pending_block(entries: &[DeprecationEntry]) -> String { +fn pending_to_json(entries: &[DeprecationEntry]) -> Vec { entries .iter() - .map(|e| { - let mut s = String::from("\t{\n"); - s.push_str(&format!("\t\twhat: {}\n", json!(e.what))); - s.push_str(&format!( - "\t\tdeprecated_since: {}\n", - json!(e.deprecated_since.to_string()) - )); - if !e.description.is_empty() { - s.push_str("\t\tdescription: #\"\"\"\n"); - for line in e.description.lines() { - s.push_str(&format!("\t\t\t{line}\n")); - } - s.push_str("\t\t\t\"\"\"#\n"); - } - s.push_str("\t},\n"); - s + .map(|e| PendingJsonEntry { + what: e.what.clone(), + deprecated_since: e.deprecated_since.to_string(), + description: e.description.clone(), }) .collect() } -fn render_enacted_block(entries: &[EnactedEntry]) -> String { - entries - .iter() - .map(|e| { - let mut s = String::from("\t{\n"); - s.push_str(&format!("\t\twhat: {}\n", json!(e.what))); - s.push_str(&format!("\t\tdeprecated_since: {}\n", json!(e.deprecated_since))); - s.push_str(&format!("\t\tremoved_in: {}\n", json!(e.removed_in))); - if !e.description.is_empty() { - s.push_str("\t\tdescription: #\"\"\"\n"); - for line in e.description.lines() { - s.push_str(&format!("\t\t\t{line}\n")); - } - s.push_str("\t\t\t\"\"\"#\n"); - } - s.push_str("\t},\n"); - s - }) - .collect() +/// Returns the expected JSON content for the check command to diff against. +pub fn render_deprecations_cue_for_check( + pending: &[DeprecationEntry], + enacted: &[EnactedEntry], +) -> String { + let data = DeprecationsJson { + deprecations_pending: pending_to_json(pending), + deprecations_enacted: enacted.to_vec(), + }; + serde_json::to_string_pretty(&data).unwrap() + "\n" } #[cfg(test)] diff --git a/website/cue/reference/deprecations.cue b/website/cue/reference/deprecations.cue deleted file mode 100644 index 0586b0d3f0499..0000000000000 --- a/website/cue/reference/deprecations.cue +++ /dev/null @@ -1,70 +0,0 @@ -// Code generated by `cargo vdev deprecation sync-cue`. DO NOT EDIT. -package metadata - -deprecations_pending: [ - { - what: "`azure_monitor_logs` sink" - deprecated_since: "0.58.0" - description: #""" - The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink, - which uses the Azure Monitor Logs Ingestion API. - - Users should migrate before Microsoft ends support for the old Data Collector API (scheduled - for September 2026). - """# - }, - { - what: "Boolean syntax for the `compression` field in the `vector` sink" - deprecated_since: "0.56.0" - description: #""" - The boolean syntax (`compression: true` / `compression: false`) is deprecated. - Use the string syntax instead: `compression: "gzip"`, `compression: "zstd"`, or `compression: "none"`. - - The `bool_or_vector_compression` deserializer will be removed once the boolean syntax is no longer supported. - """# - }, - { - what: "`buffer_byte_size` and `buffer_events` gauge metrics" - deprecated_since: "0.53.0" - description: #""" - The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the - `buffer_size_bytes` and `buffer_size_events` metrics described in `docs/specs/buffer.md`. - """# - }, - { - what: "`series_api_version: v1` option on the `datadog_metrics` sink" - deprecated_since: "0.58.0" - description: #""" - The `series_api_version: v1` option is deprecated in favor of `v2` (the default). - The v1 series endpoint (`/api/v1/series`) is a legacy endpoint. - - Users should remove `series_api_version: v1` from their configuration or set it to `v2`. - """# - }, - { - what: "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]" - deprecated_since: "0.56.0" - description: #""" - This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging. - """# - }, - { - what: "`encoding` field on HTTP server sources" - deprecated_since: "0.50.0" - description: #""" - The `encoding` field will be removed. Use `decoding` and `framing` instead. - """# - }, -] - -deprecations_enacted: [ - { - what: "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks" - deprecated_since: "0.55.0" - removed_in: "0.56.0" - description: #""" - The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x. - Users must upgrade their GreptimeDB instance to v1.x before upgrading Vector. - """# - }, -] diff --git a/website/cue/reference/deprecations_enacted.json b/website/cue/reference/deprecations_enacted.json deleted file mode 100644 index 9df53ec4d1444..0000000000000 --- a/website/cue/reference/deprecations_enacted.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - { - "what": "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks", - "deprecated_since": "0.55.0", - "removed_in": "0.56.0", - "description": "The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x.\nUsers must upgrade their GreptimeDB instance to v1.x before upgrading Vector." - } -] diff --git a/website/cue/reference/deprecations_schema.cue b/website/cue/reference/deprecations_schema.cue deleted file mode 100644 index 3d530d8b5b348..0000000000000 --- a/website/cue/reference/deprecations_schema.cue +++ /dev/null @@ -1,4 +0,0 @@ -package metadata - -deprecations_pending: [...releases.#DeprecationEntry] -deprecations_enacted: [...releases.#EnactedDeprecationEntry] diff --git a/website/cue/reference/generated/deprecations.json b/website/cue/reference/generated/deprecations.json new file mode 100644 index 0000000000000..5c8c660d496fa --- /dev/null +++ b/website/cue/reference/generated/deprecations.json @@ -0,0 +1,42 @@ +{ + "deprecations_pending": [ + { + "what": "`azure_monitor_logs` sink", + "deprecated_since": "0.58.0", + "description": "The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink,\nwhich uses the Azure Monitor Logs Ingestion API.\n\nUsers should migrate before Microsoft ends support for the old Data Collector API (scheduled\nfor September 2026)." + }, + { + "what": "Boolean syntax for the `compression` field in the `vector` sink", + "deprecated_since": "0.56.0", + "description": "The boolean syntax (`compression: true` / `compression: false`) is deprecated.\nUse the string syntax instead: `compression: \"gzip\"`, `compression: \"zstd\"`, or `compression: \"none\"`.\n\nThe `bool_or_vector_compression` deserializer will be removed once the boolean syntax is no longer supported." + }, + { + "what": "`buffer_byte_size` and `buffer_events` gauge metrics", + "deprecated_since": "0.53.0", + "description": "The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the\n`buffer_size_bytes` and `buffer_size_events` metrics described in `docs/specs/buffer.md`." + }, + { + "what": "`series_api_version: v1` option on the `datadog_metrics` sink", + "deprecated_since": "0.58.0", + "description": "The `series_api_version: v1` option is deprecated in favor of `v2` (the default).\nThe v1 series endpoint (`/api/v1/series`) is a legacy endpoint.\n\nUsers should remove `series_api_version: v1` from their configuration or set it to `v2`." + }, + { + "what": "FAKE EXAMPLE \u2014 `fake_option` on the `fake_sink` sink [remove before merging]", + "deprecated_since": "0.56.0", + "description": "This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging." + }, + { + "what": "`encoding` field on HTTP server sources", + "deprecated_since": "0.50.0", + "description": "The `encoding` field will be removed. Use `decoding` and `framing` instead." + } + ], + "deprecations_enacted": [ + { + "what": "GreptimeDB v0.x support in `greptimedb_metrics` and `greptimedb_logs` sinks", + "deprecated_since": "0.55.0", + "removed_in": "0.56.0", + "description": "The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x.\nUsers must upgrade their GreptimeDB instance to v1.x before upgrading Vector." + } + ] +} From e24da9c7fa8b0f90c3632cf6ee7e0e8d224a36c1 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 15:36:15 -0400 Subject: [PATCH 57/85] chore(releasing): remove sync-cue subcommand; fold sync into check deprecations --- vdev/src/commands/check/deprecations.rs | 23 +++++++---------------- vdev/src/commands/deprecation/mod.rs | 2 -- vdev/src/commands/deprecation/sync_cue.rs | 22 ---------------------- vdev/src/utils/deprecation.rs | 16 ---------------- website/Makefile | 6 +++--- 5 files changed, 10 insertions(+), 59 deletions(-) delete mode 100644 vdev/src/commands/deprecation/sync_cue.rs diff --git a/vdev/src/commands/check/deprecations.rs b/vdev/src/commands/check/deprecations.rs index 3f6f7c747973e..d8baaa82c6f23 100644 --- a/vdev/src/commands/check/deprecations.rs +++ b/vdev/src/commands/check/deprecations.rs @@ -1,10 +1,10 @@ #![allow(clippy::print_stdout)] -use anyhow::{Result, bail}; +use anyhow::Result; use crate::utils::{deprecation, paths}; -/// Check that all deprecation.d fragments are valid and deprecations.json is in sync +/// Check deprecation.d fragments are valid and regenerate generated/deprecations.json #[derive(clap::Args, Debug)] #[command()] pub struct Cli {} @@ -33,20 +33,11 @@ impl Cli { println!("{} deprecation fragment(s) are valid.", entries.len()); } - // Verify generated/deprecations.json is in sync with deprecation.d/. - let json_path = repo_root.join(deprecation::DEPRECATIONS_JSON); - if json_path.exists() { - let enacted = deprecation::read_enacted(&repo_root)?; - let expected = deprecation::render_deprecations_cue_for_check(&entries, &enacted); - let actual = std::fs::read_to_string(&json_path)?; - if actual != expected { - bail!( - "{} is out of sync with deprecation.d/. Run `cargo vdev deprecation sync-cue` to regenerate it.", - json_path.display() - ); - } - println!("{} is up to date.", json_path.display()); - } + deprecation::sync_deprecations_cue(&repo_root)?; + println!( + "Wrote {}", + repo_root.join(deprecation::DEPRECATIONS_JSON).display() + ); Ok(()) } diff --git a/vdev/src/commands/deprecation/mod.rs b/vdev/src/commands/deprecation/mod.rs index 1c11e5198dea0..b07121ddca358 100644 --- a/vdev/src/commands/deprecation/mod.rs +++ b/vdev/src/commands/deprecation/mod.rs @@ -1,10 +1,8 @@ mod enact; mod show; -mod sync_cue; crate::cli_subcommands! { "Manage and inspect deprecation notices..." enact, show, - sync_cue, } diff --git a/vdev/src/commands/deprecation/sync_cue.rs b/vdev/src/commands/deprecation/sync_cue.rs deleted file mode 100644 index 4d5af2a9755bc..0000000000000 --- a/vdev/src/commands/deprecation/sync_cue.rs +++ /dev/null @@ -1,22 +0,0 @@ -#![allow(clippy::print_stdout)] - -use anyhow::Result; - -use crate::utils::{deprecation, paths}; - -/// Regenerate website/cue/reference/generated/deprecations.json from deprecation.d/ -#[derive(clap::Args, Debug)] -#[command()] -pub struct Cli {} - -impl Cli { - pub fn exec(self) -> Result<()> { - let repo_root = paths::find_repo_root()?; - deprecation::sync_deprecations_cue(&repo_root)?; - println!( - "Wrote {}", - repo_root.join(deprecation::DEPRECATIONS_JSON).display() - ); - Ok(()) - } -} diff --git a/vdev/src/utils/deprecation.rs b/vdev/src/utils/deprecation.rs index 2edfb1dac2f41..33961335b6b8c 100644 --- a/vdev/src/utils/deprecation.rs +++ b/vdev/src/utils/deprecation.rs @@ -220,11 +220,6 @@ fn write_json(repo_root: &Path, data: &DeprecationsJson) -> Result<()> { .with_context(|| format!("Failed to write {}", path.display())) } -/// Read the list of enacted deprecations from the generated JSON file. -pub fn read_enacted(repo_root: &Path) -> Result> { - Ok(read_json(repo_root)?.deprecations_enacted) -} - /// Append an enacted entry and regenerate the pending section from deprecation.d/. pub fn append_enacted(repo_root: &Path, entry: EnactedEntry) -> Result<()> { let dir = repo_root.join(DEPRECATION_DIR); @@ -256,17 +251,6 @@ fn pending_to_json(entries: &[DeprecationEntry]) -> Vec { .collect() } -/// Returns the expected JSON content for the check command to diff against. -pub fn render_deprecations_cue_for_check( - pending: &[DeprecationEntry], - enacted: &[EnactedEntry], -) -> String { - let data = DeprecationsJson { - deprecations_pending: pending_to_json(pending), - deprecations_enacted: enacted.to_vec(), - }; - serde_json::to_string_pretty(&data).unwrap() + "\n" -} #[cfg(test)] mod tests { diff --git a/website/Makefile b/website/Makefile index 1547343c5e3af..462ac9766cab6 100644 --- a/website/Makefile +++ b/website/Makefile @@ -30,10 +30,10 @@ generate-vrl-docs: $(VDEV) build vrl-docs --output-dir cue/reference/remap/functions \ $(if $(findstring true,$(CI)),--vector-sha $(GITHUB_SHA),) -generate-deprecations-cue: - $(VDEV) deprecation sync-cue +generate-deprecations-json: + $(VDEV) check deprecations -structured-data: generate-vrl-docs generate-deprecations-cue cue-build config-examples +structured-data: generate-vrl-docs generate-deprecations-json cue-build config-examples serve: clean setup cargo-data structured-data hugo server \ From dbc77bd68125758256d272e95c381d1fe8cc8edd Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 15:45:41 -0400 Subject: [PATCH 58/85] chore(releasing): check deprecations verifies generated JSON is up to date --- vdev/src/commands/check/deprecations.rs | 21 ++++++++++++------ vdev/src/commands/deprecation/enact.rs | 10 ++++----- vdev/src/commands/deprecation/show.rs | 13 ++++++------ vdev/src/commands/release/generate_cue.rs | 6 +----- vdev/src/utils/deprecation.rs | 26 ++++++++++++----------- 5 files changed, 42 insertions(+), 34 deletions(-) diff --git a/vdev/src/commands/check/deprecations.rs b/vdev/src/commands/check/deprecations.rs index d8baaa82c6f23..b0f445dff2976 100644 --- a/vdev/src/commands/check/deprecations.rs +++ b/vdev/src/commands/check/deprecations.rs @@ -1,10 +1,10 @@ #![allow(clippy::print_stdout)] -use anyhow::Result; +use anyhow::{Result, bail}; use crate::utils::{deprecation, paths}; -/// Check deprecation.d fragments are valid and regenerate generated/deprecations.json +/// Check deprecation.d fragments are valid and that generated/deprecations.json is up to date #[derive(clap::Args, Debug)] #[command()] pub struct Cli {} @@ -33,11 +33,20 @@ impl Cli { println!("{} deprecation fragment(s) are valid.", entries.len()); } + let json_path = repo_root.join(deprecation::DEPRECATIONS_JSON); + let before = std::fs::read_to_string(&json_path).unwrap_or_default(); + deprecation::sync_deprecations_cue(&repo_root)?; - println!( - "Wrote {}", - repo_root.join(deprecation::DEPRECATIONS_JSON).display() - ); + + let after = std::fs::read_to_string(&json_path)?; + if before != after { + bail!( + "{} was modified. Please commit the updated file.", + json_path.display() + ); + } + + println!("{} is up to date.", json_path.display()); Ok(()) } diff --git a/vdev/src/commands/deprecation/enact.rs b/vdev/src/commands/deprecation/enact.rs index 086fe901077e4..ed6a1ed61b8f5 100644 --- a/vdev/src/commands/deprecation/enact.rs +++ b/vdev/src/commands/deprecation/enact.rs @@ -23,7 +23,10 @@ impl Cli { let dir = repo_root.join(deprecation::DEPRECATION_DIR); // Accept "slug", "slug.md" - let filename = if self.slug.ends_with(".md") { + let filename = if std::path::Path::new(&self.slug) + .extension() + .is_some_and(|ext| ext.eq_ignore_ascii_case("md")) + { self.slug.clone() } else { format!("{}.md", self.slug) @@ -31,10 +34,7 @@ impl Cli { let path = dir.join(&filename); if !path.exists() { - bail!( - "No deprecation fragment found at {}", - path.display() - ); + bail!("No deprecation fragment found at {}", path.display()); } // Parse the fragment to get entry data. diff --git a/vdev/src/commands/deprecation/show.rs b/vdev/src/commands/deprecation/show.rs index 1e99096d08cb4..147d2d150438f 100644 --- a/vdev/src/commands/deprecation/show.rs +++ b/vdev/src/commands/deprecation/show.rs @@ -71,7 +71,10 @@ impl Cli { fn print_announcing_section(next_label: &str, entries: &[&DeprecationEntry]) { let header_style = Style::new().underline().white(); let title = format!("Announced in next release ({next_label})"); - println!("{}", title.if_supports_color(Stdout, |t| t.style(header_style))); + println!( + "{}", + title.if_supports_color(Stdout, |t| t.style(header_style)) + ); println!(); if entries.is_empty() { println!("{}", "(none)".if_supports_color(Stdout, |t| t.dimmed())); @@ -101,11 +104,9 @@ fn print_entry(e: &DeprecationEntry, highlight_version: bool) { println!("{}", e.what.if_supports_color(Stdout, |t| t.bold())); let version_str = e.deprecated_since.to_string(); let version_colored = if highlight_version { - owo_colors::OwoColorize::if_supports_color( - &version_str, - Stdout, - |t| t.style(Style::new().bold().red()), - ) + owo_colors::OwoColorize::if_supports_color(&version_str, Stdout, |t| { + t.style(Style::new().bold().red()) + }) .to_string() } else { owo_colors::OwoColorize::if_supports_color(&version_str, Stdout, |t| t.bright_cyan()) diff --git a/vdev/src/commands/release/generate_cue.rs b/vdev/src/commands/release/generate_cue.rs index 4f24d3b84463c..3e2074dddb6bf 100644 --- a/vdev/src/commands/release/generate_cue.rs +++ b/vdev/src/commands/release/generate_cue.rs @@ -96,11 +96,7 @@ pub(super) fn run(new_version: &Version) -> Result { let changelog_dir = repo_root.join(CHANGELOG_DIR); let changelog_entries = read_changelog_fragments(&changelog_dir)?; - let cue_text = render_release_cue( - &new_version, - &changelog_entries, - &commits, - ); + let cue_text = render_release_cue(&new_version, &changelog_entries, &commits); fs::write(&cue_path, cue_text) .with_context(|| format!("Failed to write {}", cue_path.display()))?; diff --git a/vdev/src/utils/deprecation.rs b/vdev/src/utils/deprecation.rs index 33961335b6b8c..5fbc4a9ab920b 100644 --- a/vdev/src/utils/deprecation.rs +++ b/vdev/src/utils/deprecation.rs @@ -85,7 +85,10 @@ pub fn partition_by_release( planned.push(e); } } - DeprecationPartition { announcing, planned } + DeprecationPartition { + announcing, + planned, + } } /// Read and parse all deprecation fragments from the given directory. @@ -106,11 +109,13 @@ pub fn read_deprecation_fragments(dir: &Path) -> Result> { } fn is_deprecation_fragment(path: &Path) -> bool { - let name = match path.file_name().and_then(|n| n.to_str()) { - Some(n) => n, - None => return false, + let Some(name) = path.file_name().and_then(|n| n.to_str()) else { + return false; }; - name != "README.md" && name.ends_with(".md") + name != "README.md" + && std::path::Path::new(name) + .extension() + .is_some_and(|ext| ext.eq_ignore_ascii_case("md")) } fn parse_deprecation_fragment(path: &Path) -> Result { @@ -204,10 +209,9 @@ fn read_json(repo_root: &Path) -> Result { deprecations_enacted: Vec::new(), }); } - let raw = fs::read_to_string(&path) - .with_context(|| format!("Failed to read {}", path.display()))?; - serde_json::from_str(&raw) - .with_context(|| format!("Failed to parse {}", path.display())) + let raw = + fs::read_to_string(&path).with_context(|| format!("Failed to read {}", path.display()))?; + serde_json::from_str(&raw).with_context(|| format!("Failed to parse {}", path.display())) } fn write_json(repo_root: &Path, data: &DeprecationsJson) -> Result<()> { @@ -216,8 +220,7 @@ fn write_json(repo_root: &Path, data: &DeprecationsJson) -> Result<()> { fs::create_dir_all(parent)?; } let out = serde_json::to_string_pretty(data)? + "\n"; - fs::write(&path, out) - .with_context(|| format!("Failed to write {}", path.display())) + fs::write(&path, out).with_context(|| format!("Failed to write {}", path.display())) } /// Append an enacted entry and regenerate the pending section from deprecation.d/. @@ -251,7 +254,6 @@ fn pending_to_json(entries: &[DeprecationEntry]) -> Vec { .collect() } - #[cfg(test)] mod tests { use super::*; From ccb01e834b52bbb8175dca87abeddf1257cbc559 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 16:51:55 -0400 Subject: [PATCH 59/85] Fix deprecations.json --- website/cue/reference/generated/deprecations.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/cue/reference/generated/deprecations.json b/website/cue/reference/generated/deprecations.json index 5c8c660d496fa..6e66228fdd8c2 100644 --- a/website/cue/reference/generated/deprecations.json +++ b/website/cue/reference/generated/deprecations.json @@ -21,7 +21,7 @@ "description": "The `series_api_version: v1` option is deprecated in favor of `v2` (the default).\nThe v1 series endpoint (`/api/v1/series`) is a legacy endpoint.\n\nUsers should remove `series_api_version: v1` from their configuration or set it to `v2`." }, { - "what": "FAKE EXAMPLE \u2014 `fake_option` on the `fake_sink` sink [remove before merging]", + "what": "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]", "deprecated_since": "0.56.0", "description": "This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging." }, From e299ef7d4f751128162f6953c8d597738307b4aa Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 16:57:37 -0400 Subject: [PATCH 60/85] chore(releasing): update minor release checklist for new deprecation workflow --- .github/ISSUE_TEMPLATE/minor-release.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/minor-release.md b/.github/ISSUE_TEMPLATE/minor-release.md index ae02d1ab4a8fb..55fbb7dc785db 100644 --- a/.github/ISSUE_TEMPLATE/minor-release.md +++ b/.github/ISSUE_TEMPLATE/minor-release.md @@ -65,7 +65,8 @@ Automated steps include: - [ ] Ensure any deprecations are highlighted in the release upgrade guide. - [ ] Review generated changelog entries to ensure they are understandable to end-users. - [ ] Ensure the date matches the scheduled release date. - - [ ] Run `cargo vdev deprecation show --version "${NEW_VECTOR_VERSION}"` to review enacted deprecations and verify the release notes reflect them correctly. + - [ ] Run `cargo vdev deprecation show --version "${NEW_VECTOR_VERSION}"` to review new deprecation announcements in this release. + - [ ] Run `cargo vdev deprecation enact --version "${NEW_VECTOR_VERSION}"` for any deprecations being removed in this release, then commit `website/cue/reference/generated/deprecations.json`. - [ ] PR review & approval. # On the day of release From 0eeab5fea16d554fdeaff3be2ad1af4209c01180 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 16:58:50 -0400 Subject: [PATCH 61/85] fix(website): filter enacted deprecations by removed_in not deprecated_since on release pages --- website/layouts/partials/releases/deprecations.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/layouts/partials/releases/deprecations.html b/website/layouts/partials/releases/deprecations.html index a3383c0ed76d0..51d9c4e85f683 100644 --- a/website/layouts/partials/releases/deprecations.html +++ b/website/layouts/partials/releases/deprecations.html @@ -17,7 +17,7 @@ {{- $fe := slice -}} {{- range $enacted -}} - {{- if or (strings.HasPrefix .deprecated_since $prefix) (eq .deprecated_since $exact) -}} + {{- if or (strings.HasPrefix .removed_in $prefix) (eq .removed_in $exact) -}} {{- $fe = $fe | append . -}} {{- end -}} {{- end -}} From 45241661e2d6b5eff0b3eef0435ec56c172166c8 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 17:02:12 -0400 Subject: [PATCH 62/85] chore(website): show enacted deprecations above announcements in separate sections on release pages --- .../partials/releases/deprecations.html | 74 +++++++++++-------- website/layouts/releases/single.html | 10 +-- 2 files changed, 45 insertions(+), 39 deletions(-) diff --git a/website/layouts/partials/releases/deprecations.html b/website/layouts/partials/releases/deprecations.html index 51d9c4e85f683..76b146c3f6a90 100644 --- a/website/layouts/partials/releases/deprecations.html +++ b/website/layouts/partials/releases/deprecations.html @@ -1,4 +1,5 @@ -{{/* Renders deprecations filtered to a specific version (major.minor match). +{{/* Renders deprecations for a specific release version (major.minor match). + Enacted (removed_in == version) appears first, then newly announced (deprecated_since == version). Params: version (string, e.g. "0.56" or "0.56.0") */}} {{- $pending := site.Data.docs.deprecations_pending -}} {{- $enacted := site.Data.docs.deprecations_enacted -}} @@ -8,50 +9,63 @@ {{- $prefix := printf "%s.%s." (index $parts 0) (index $parts 1) -}} {{- $exact := printf "%s.%s" (index $parts 0) (index $parts 1) -}} -{{- $fp := slice -}} +{{- $announced := slice -}} {{- range $pending -}} {{- if or (strings.HasPrefix .deprecated_since $prefix) (eq .deprecated_since $exact) -}} - {{- $fp = $fp | append . -}} + {{- $announced = $announced | append . -}} {{- end -}} {{- end -}} -{{- $fe := slice -}} +{{- $removed := slice -}} {{- range $enacted -}} {{- if or (strings.HasPrefix .removed_in $prefix) (eq .removed_in $exact) -}} - {{- $fe = $fe | append . -}} + {{- $removed = $removed | append . -}} {{- end -}} {{- end -}} -{{ if or (gt (len $fp) 0) (gt (len $fe) 0) }} -
- {{ range $fp }} -
- - {{ .what | markdownify }} - - {{ with .description }} -
- {{ . | markdownify }} +{{ if gt (len $removed) 0 }} +
+
+ {{ partial "heading.html" (dict "text" "Enacted Deprecations" "level" 2) }} +
+
+ {{ range $removed }} +
+ + {{ .what | markdownify }} + + {{ with .description }} +
+ {{ . | markdownify }} +
+ {{ end }}
{{ end }}
- {{ end }} - {{ range $fe }} -
- - {{ .what | markdownify }} - -
- Removed in {{ .removed_in }} -
- {{ with .description }} -
- {{ . | markdownify }} +
+{{ end }} + +{{ if gt (len $announced) 0 }} +
+
+ {{ partial "heading.html" (dict "text" "Deprecation Announcements" "level" 2) }} +

+ See the deprecations page for all active and historical deprecations. +

+
+
+ {{ range $announced }} +
+ + {{ .what | markdownify }} + + {{ with .description }} +
+ {{ . | markdownify }} +
+ {{ end }}
{{ end }}
- {{ end }}
-{{ else }} -

No deprecations in this release.

{{ end }} diff --git a/website/layouts/releases/single.html b/website/layouts/releases/single.html index 757affc28496f..554e6bf60b869 100644 --- a/website/layouts/releases/single.html +++ b/website/layouts/releases/single.html @@ -54,15 +54,7 @@
{{ end }} -
-
- {{ partial "heading.html" (dict "text" "Deprecation Announcements" "level" 2) }} -

- See the deprecations page for all active and historical deprecations. -

-
- {{ partial "releases/deprecations.html" (dict "version" $version) }} -
+ {{ partial "releases/deprecations.html" (dict "version" $version) }}
From af910ac398eb8ae08b4b16f4e043ee5a5de3d7ff Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 17:04:40 -0400 Subject: [PATCH 63/85] chore(website): include enacted entries in release announcement section when deprecated_since matches --- website/layouts/partials/releases/deprecations.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/website/layouts/partials/releases/deprecations.html b/website/layouts/partials/releases/deprecations.html index 76b146c3f6a90..c26525b0f128d 100644 --- a/website/layouts/partials/releases/deprecations.html +++ b/website/layouts/partials/releases/deprecations.html @@ -15,6 +15,12 @@ {{- $announced = $announced | append . -}} {{- end -}} {{- end -}} +{{- /* Also include enacted entries first announced in this release. */ -}} +{{- range $enacted -}} + {{- if or (strings.HasPrefix .deprecated_since $prefix) (eq .deprecated_since $exact) -}} + {{- $announced = $announced | append . -}} + {{- end -}} +{{- end -}} {{- $removed := slice -}} {{- range $enacted -}} From 87a61d542ba631ed8c925a213e825f96b618718b Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 17:05:44 -0400 Subject: [PATCH 64/85] chore(website): simplify deprecations page description --- website/content/en/releases/deprecations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/content/en/releases/deprecations.md b/website/content/en/releases/deprecations.md index e45bb6a3839ce..529831595ae15 100644 --- a/website/content/en/releases/deprecations.md +++ b/website/content/en/releases/deprecations.md @@ -1,6 +1,6 @@ --- title: Deprecations -description: Active and historical deprecations in Vector. See the [deprecation policy](https://github.com/vectordotdev/vector/blob/master/docs/DEPRECATION_POLICY.md) for how deprecations are managed. +description: Active and historical deprecations in Vector. See the [deprecation policy](https://github.com/vectordotdev/vector/blob/master/docs/DEPRECATION_POLICY.md) for details. layout: deprecations weight: 100 build: From 9f81b5af5d1c20e00c88dec7c9b2813c3fbbf0bf Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 17:08:46 -0400 Subject: [PATCH 65/85] chore(website): show removed_in on enacted entries in deprecation announcements section --- website/layouts/partials/releases/deprecations.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/website/layouts/partials/releases/deprecations.html b/website/layouts/partials/releases/deprecations.html index c26525b0f128d..729b7bf7e1fbe 100644 --- a/website/layouts/partials/releases/deprecations.html +++ b/website/layouts/partials/releases/deprecations.html @@ -65,6 +65,11 @@ {{ .what | markdownify }} + {{ with .removed_in }} +
+ Removed in {{ . }} +
+ {{ end }} {{ with .description }}
{{ . | markdownify }} From cb913bde649842a5353b2feab272b463f41a1c01 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 17:16:57 -0400 Subject: [PATCH 66/85] chore(website): sort deprecations by announced version, newest first --- website/layouts/partials/releases/deprecations.html | 3 +++ website/layouts/releases/deprecations.html | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/website/layouts/partials/releases/deprecations.html b/website/layouts/partials/releases/deprecations.html index 729b7bf7e1fbe..0c7a9a1b4b39c 100644 --- a/website/layouts/partials/releases/deprecations.html +++ b/website/layouts/partials/releases/deprecations.html @@ -22,12 +22,15 @@ {{- end -}} {{- end -}} +{{- $announced = sort $announced "deprecated_since" "desc" -}} + {{- $removed := slice -}} {{- range $enacted -}} {{- if or (strings.HasPrefix .removed_in $prefix) (eq .removed_in $exact) -}} {{- $removed = $removed | append . -}} {{- end -}} {{- end -}} +{{- $removed = sort $removed "deprecated_since" "desc" -}} {{ if gt (len $removed) 0 }}
diff --git a/website/layouts/releases/deprecations.html b/website/layouts/releases/deprecations.html index a7bac013289d3..8cfb8a4a87d50 100644 --- a/website/layouts/releases/deprecations.html +++ b/website/layouts/releases/deprecations.html @@ -3,8 +3,8 @@ {{ end }} {{ define "main" }} -{{ $pending := site.Data.docs.deprecations_pending }} -{{ $enacted := site.Data.docs.deprecations_enacted }} +{{ $pending := sort site.Data.docs.deprecations_pending "deprecated_since" "desc" }} +{{ $enacted := sort site.Data.docs.deprecations_enacted "deprecated_since" "desc" }}
From d9dd5c82ab4e6edd37c362cbcaca0781e3c814e3 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 17:26:23 -0400 Subject: [PATCH 67/85] chore(internal docs): fix deprecated_since versions in deprecation.d Co-Authored-By: Claude Sonnet 4.6 --- deprecation.d/azure-monitor-logs-sink.md | 2 +- deprecation.d/datadog-metrics-series-v1.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deprecation.d/azure-monitor-logs-sink.md b/deprecation.d/azure-monitor-logs-sink.md index f35b45a3a923a..c84ad8c1132b1 100644 --- a/deprecation.d/azure-monitor-logs-sink.md +++ b/deprecation.d/azure-monitor-logs-sink.md @@ -1,6 +1,6 @@ --- what: "`azure_monitor_logs` sink" -deprecated_since: "0.58.0" +deprecated_since: "0.54.0" --- The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink, diff --git a/deprecation.d/datadog-metrics-series-v1.md b/deprecation.d/datadog-metrics-series-v1.md index bdc6d87a1ebee..f1b79f5019900 100644 --- a/deprecation.d/datadog-metrics-series-v1.md +++ b/deprecation.d/datadog-metrics-series-v1.md @@ -1,6 +1,6 @@ --- what: "`series_api_version: v1` option on the `datadog_metrics` sink" -deprecated_since: "0.58.0" +deprecated_since: "0.56.0" --- The `series_api_version: v1` option is deprecated in favor of `v2` (the default). From 7d295ee6927c4d3302d529dd20de9da3b683d23e Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 17:29:27 -0400 Subject: [PATCH 68/85] Regenerate deprecations.json --- website/cue/reference/generated/deprecations.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/cue/reference/generated/deprecations.json b/website/cue/reference/generated/deprecations.json index 6e66228fdd8c2..fdbef38589f4a 100644 --- a/website/cue/reference/generated/deprecations.json +++ b/website/cue/reference/generated/deprecations.json @@ -2,7 +2,7 @@ "deprecations_pending": [ { "what": "`azure_monitor_logs` sink", - "deprecated_since": "0.58.0", + "deprecated_since": "0.54.0", "description": "The `azure_monitor_logs` sink is deprecated in favor of the new `azure_logs_ingestion` sink,\nwhich uses the Azure Monitor Logs Ingestion API.\n\nUsers should migrate before Microsoft ends support for the old Data Collector API (scheduled\nfor September 2026)." }, { @@ -17,7 +17,7 @@ }, { "what": "`series_api_version: v1` option on the `datadog_metrics` sink", - "deprecated_since": "0.58.0", + "deprecated_since": "0.56.0", "description": "The `series_api_version: v1` option is deprecated in favor of `v2` (the default).\nThe v1 series endpoint (`/api/v1/series`) is a legacy endpoint.\n\nUsers should remove `series_api_version: v1` from their configuration or set it to `v2`." }, { From 1aa56ab7f438802c4547699383ae85bde2c0fdaa Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 17:35:30 -0400 Subject: [PATCH 69/85] chore(vdev): add `cargo vdev deprecation generate` command Co-Authored-By: Claude Sonnet 4.6 --- docs/DEPRECATION_POLICY.md | 6 ++++-- vdev/src/commands/check/deprecations.rs | 2 +- vdev/src/commands/deprecation/generate.rs | 22 ++++++++++++++++++++++ vdev/src/commands/deprecation/mod.rs | 2 ++ 4 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 vdev/src/commands/deprecation/generate.rs diff --git a/docs/DEPRECATION_POLICY.md b/docs/DEPRECATION_POLICY.md index 194938e74906c..ed1b395171b02 100644 --- a/docs/DEPRECATION_POLICY.md +++ b/docs/DEPRECATION_POLICY.md @@ -82,7 +82,9 @@ When introducing a deprecation into Vector, the pull request introducing the dep the deprecated configuration or feature being used (when possible). - Add a deprecation notice file to [`deprecation.d/`](../deprecation.d/) following the format described in [`deprecation.d/README.md`](../deprecation.d/README.md). Set `deprecated_since` to the current release version. - Run `cargo vdev deprecation show` to view all current notices and `cargo vdev check deprecations` to validate the file. + Then run `cargo vdev deprecation generate` to regenerate `website/cue/reference/generated/deprecations.json` and + commit both files. Run `cargo vdev deprecation show` to preview all current notices and + `cargo vdev check deprecations` to validate. When removing a deprecation in a subsequent release, the pull request should: @@ -92,4 +94,4 @@ When removing a deprecation in a subsequent release, the pull request should: for transitioning if applicable. - Copy the same note from the previous step, to a changelog fragment, with type="breaking". See the changelog fragment [README.md](../changelog.d/README.md) for details. -- Delete the file from [`deprecation.d/`](../deprecation.d/) +- Run `cargo vdev deprecation enact --version ` and commit the result. diff --git a/vdev/src/commands/check/deprecations.rs b/vdev/src/commands/check/deprecations.rs index b0f445dff2976..ecff08a22e57d 100644 --- a/vdev/src/commands/check/deprecations.rs +++ b/vdev/src/commands/check/deprecations.rs @@ -41,7 +41,7 @@ impl Cli { let after = std::fs::read_to_string(&json_path)?; if before != after { bail!( - "{} was modified. Please commit the updated file.", + "{} is out of date. Run `cargo vdev deprecation generate` and commit the result.", json_path.display() ); } diff --git a/vdev/src/commands/deprecation/generate.rs b/vdev/src/commands/deprecation/generate.rs new file mode 100644 index 0000000000000..b50e5805bba10 --- /dev/null +++ b/vdev/src/commands/deprecation/generate.rs @@ -0,0 +1,22 @@ +#![allow(clippy::print_stdout)] + +use anyhow::Result; + +use crate::utils::{deprecation, paths}; + +/// Regenerate generated/deprecations.json from deprecation.d/ fragments +#[derive(clap::Args, Debug)] +#[command()] +pub struct Cli {} + +impl Cli { + pub fn exec(self) -> Result<()> { + let repo_root = paths::find_repo_root()?; + deprecation::sync_deprecations_cue(&repo_root)?; + println!( + "Updated {}", + repo_root.join(deprecation::DEPRECATIONS_JSON).display() + ); + Ok(()) + } +} diff --git a/vdev/src/commands/deprecation/mod.rs b/vdev/src/commands/deprecation/mod.rs index b07121ddca358..d121296482d58 100644 --- a/vdev/src/commands/deprecation/mod.rs +++ b/vdev/src/commands/deprecation/mod.rs @@ -1,8 +1,10 @@ mod enact; +mod generate; mod show; crate::cli_subcommands! { "Manage and inspect deprecation notices..." enact, + generate, show, } From acaf2b1d23f41c99a8c0c44bbd057a2b67019229 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 17:40:24 -0400 Subject: [PATCH 70/85] chore(vdev): allow `deprecation enact` to accept relative paths Co-Authored-By: Claude Sonnet 4.6 --- vdev/src/commands/deprecation/enact.rs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/vdev/src/commands/deprecation/enact.rs b/vdev/src/commands/deprecation/enact.rs index ed6a1ed61b8f5..22ed67def9c65 100644 --- a/vdev/src/commands/deprecation/enact.rs +++ b/vdev/src/commands/deprecation/enact.rs @@ -22,15 +22,13 @@ impl Cli { let repo_root = paths::find_repo_root()?; let dir = repo_root.join(deprecation::DEPRECATION_DIR); - // Accept "slug", "slug.md" - let filename = if std::path::Path::new(&self.slug) - .extension() - .is_some_and(|ext| ext.eq_ignore_ascii_case("md")) - { - self.slug.clone() - } else { - format!("{}.md", self.slug) - }; + // Accept "slug", "slug.md", or a path like "deprecation.d/slug.md" + let slug_path = std::path::Path::new(&self.slug); + let stem = slug_path + .file_stem() + .and_then(|s| s.to_str()) + .unwrap_or(&self.slug); + let filename = format!("{stem}.md"); let path = dir.join(&filename); if !path.exists() { From 84df3e45b044111321bf2bd631ba1b1212cd55b2 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 17:42:12 -0400 Subject: [PATCH 71/85] chore(vdev): make `deprecation enact --version` optional, defaulting to next minor Co-Authored-By: Claude Sonnet 4.6 --- vdev/src/commands/deprecation/enact.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/vdev/src/commands/deprecation/enact.rs b/vdev/src/commands/deprecation/enact.rs index 22ed67def9c65..4cac061f80a4d 100644 --- a/vdev/src/commands/deprecation/enact.rs +++ b/vdev/src/commands/deprecation/enact.rs @@ -3,7 +3,7 @@ use anyhow::{Result, bail}; use semver::Version; -use crate::utils::{deprecation, paths}; +use crate::utils::{deprecation, git, paths}; /// Enact a deprecation: record it as removed and delete the deprecation.d fragment #[derive(clap::Args, Debug)] @@ -12,9 +12,10 @@ pub struct Cli { /// Filename (slug) in deprecation.d/ to enact, e.g. "azure-monitor-logs-sink" slug: String, - /// The Vector version in which this feature was removed, e.g. "0.58.0" + /// The Vector version in which this feature was removed, e.g. "0.58.0". + /// Defaults to the next minor after the latest git tag. #[arg(long)] - version: Version, + version: Option, } impl Cli { @@ -42,10 +43,18 @@ impl Cli { .find(|e| e.filename == filename) .ok_or_else(|| anyhow::anyhow!("Could not parse {filename}"))?; + let version = match self.version { + Some(v) => v, + None => { + let latest = git::latest_release_version()?; + Version::new(latest.major, latest.minor + 1, 0) + } + }; + let enacted = deprecation::EnactedEntry { what: entry.what.clone(), deprecated_since: entry.deprecated_since.to_string(), - removed_in: format!("{}.{}.0", self.version.major, self.version.minor), + removed_in: format!("{}.{}.0", version.major, version.minor), description: entry.description.clone(), }; From 6e46b64d9b1155eb269c13afd69d27d712e7fec4 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 17:50:08 -0400 Subject: [PATCH 72/85] chore(internal docs): remove docs/specs/buffer.md ref from deprecation fragment --- deprecation.d/buffer-bytes-events-metrics.md | 2 +- website/cue/reference/generated/deprecations.json | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/deprecation.d/buffer-bytes-events-metrics.md b/deprecation.d/buffer-bytes-events-metrics.md index 5f26239560545..8a794aace12ff 100644 --- a/deprecation.d/buffer-bytes-events-metrics.md +++ b/deprecation.d/buffer-bytes-events-metrics.md @@ -4,4 +4,4 @@ deprecated_since: "0.53.0" --- The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the -`buffer_size_bytes` and `buffer_size_events` metrics described in `docs/specs/buffer.md`. +`buffer_size_bytes` and `buffer_size_events` metrics. diff --git a/website/cue/reference/generated/deprecations.json b/website/cue/reference/generated/deprecations.json index fdbef38589f4a..f7f39cfc8fd1f 100644 --- a/website/cue/reference/generated/deprecations.json +++ b/website/cue/reference/generated/deprecations.json @@ -13,18 +13,13 @@ { "what": "`buffer_byte_size` and `buffer_events` gauge metrics", "deprecated_since": "0.53.0", - "description": "The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the\n`buffer_size_bytes` and `buffer_size_events` metrics described in `docs/specs/buffer.md`." + "description": "The `buffer_byte_size` and `buffer_events` gauges are deprecated in favor of the\n`buffer_size_bytes` and `buffer_size_events` metrics." }, { "what": "`series_api_version: v1` option on the `datadog_metrics` sink", "deprecated_since": "0.56.0", "description": "The `series_api_version: v1` option is deprecated in favor of `v2` (the default).\nThe v1 series endpoint (`/api/v1/series`) is a legacy endpoint.\n\nUsers should remove `series_api_version: v1` from their configuration or set it to `v2`." }, - { - "what": "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]", - "deprecated_since": "0.56.0", - "description": "This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging." - }, { "what": "`encoding` field on HTTP server sources", "deprecated_since": "0.50.0", @@ -37,6 +32,12 @@ "deprecated_since": "0.55.0", "removed_in": "0.56.0", "description": "The `greptimedb_metrics` and `greptimedb_logs` sinks drop support for GreptimeDB v0.x.\nUsers must upgrade their GreptimeDB instance to v1.x before upgrading Vector." + }, + { + "what": "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]", + "deprecated_since": "0.56.0", + "removed_in": "0.56.0", + "description": "This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging." } ] } From 58187ad18d3237a26836d34dd61f87505d57df61 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 17:54:07 -0400 Subject: [PATCH 73/85] fix(vdev): preserve full version in enacted removed_in field --- vdev/src/commands/deprecation/enact.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vdev/src/commands/deprecation/enact.rs b/vdev/src/commands/deprecation/enact.rs index 4cac061f80a4d..3db03d3db51bb 100644 --- a/vdev/src/commands/deprecation/enact.rs +++ b/vdev/src/commands/deprecation/enact.rs @@ -54,7 +54,7 @@ impl Cli { let enacted = deprecation::EnactedEntry { what: entry.what.clone(), deprecated_since: entry.deprecated_since.to_string(), - removed_in: format!("{}.{}.0", version.major, version.minor), + removed_in: version.to_string(), description: entry.description.clone(), }; From 7e92dc6b80755652901c6828a62b0f36af4f111d Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 17:59:17 -0400 Subject: [PATCH 74/85] Add back FAKE EXAMPLE --- website/cue/reference/generated/deprecations.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/website/cue/reference/generated/deprecations.json b/website/cue/reference/generated/deprecations.json index f7f39cfc8fd1f..97946678e1ab7 100644 --- a/website/cue/reference/generated/deprecations.json +++ b/website/cue/reference/generated/deprecations.json @@ -20,6 +20,11 @@ "deprecated_since": "0.56.0", "description": "The `series_api_version: v1` option is deprecated in favor of `v2` (the default).\nThe v1 series endpoint (`/api/v1/series`) is a legacy endpoint.\n\nUsers should remove `series_api_version: v1` from their configuration or set it to `v2`." }, + { + "what": "FAKE EXAMPLE — `fake_option` on the `fake_sink` sink [remove before merging]", + "deprecated_since": "0.56.0", + "description": "This is a fake deprecation entry used to test the Deprecation Announcements section on the release page. Remove this file before merging." + }, { "what": "`encoding` field on HTTP server sources", "deprecated_since": "0.50.0", From 362864ad3cb110a57aecef502d72e5b3b506d319 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 17:59:28 -0400 Subject: [PATCH 75/85] chore(ci): trigger deprecation check when deprecations.json is edited directly --- .github/workflows/changes.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/changes.yml b/.github/workflows/changes.yml index 5de11bf259e15..6641ff403fd28 100644 --- a/.github/workflows/changes.yml +++ b/.github/workflows/changes.yml @@ -228,6 +228,7 @@ jobs: - ".github/workflows/deny.yml" deprecations: - 'deprecation.d/**' + - 'website/cue/reference/generated/deprecations.json' - "vdev/**" - ".github/workflows/deprecation.yaml" - ".github/workflows/changes.yml" From 707b97ea4b7fc2fd4b5ae69c4603ea13016c54b6 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 18:00:44 -0400 Subject: [PATCH 76/85] chore(internal docs): clarify deprecation enact commit scope in release checklist --- .github/ISSUE_TEMPLATE/minor-release.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/minor-release.md b/.github/ISSUE_TEMPLATE/minor-release.md index 55fbb7dc785db..b4a086dfff6bf 100644 --- a/.github/ISSUE_TEMPLATE/minor-release.md +++ b/.github/ISSUE_TEMPLATE/minor-release.md @@ -66,7 +66,7 @@ Automated steps include: - [ ] Review generated changelog entries to ensure they are understandable to end-users. - [ ] Ensure the date matches the scheduled release date. - [ ] Run `cargo vdev deprecation show --version "${NEW_VECTOR_VERSION}"` to review new deprecation announcements in this release. - - [ ] Run `cargo vdev deprecation enact --version "${NEW_VECTOR_VERSION}"` for any deprecations being removed in this release, then commit `website/cue/reference/generated/deprecations.json`. + - [ ] Run `cargo vdev deprecation enact --version "${NEW_VECTOR_VERSION}"` for any deprecations being removed in this release, then commit all resulting changes (deleted fragment and updated `website/cue/reference/generated/deprecations.json`). - [ ] PR review & approval. # On the day of release From 832b390ed10cb05ae54c2ae3a500f754a0136718 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 18:07:13 -0400 Subject: [PATCH 77/85] feat(vdev): show enacted removals in `deprecation show` --- vdev/src/commands/deprecation/show.rs | 69 +++++++++++++++++++-------- vdev/src/utils/deprecation.rs | 5 ++ 2 files changed, 54 insertions(+), 20 deletions(-) diff --git a/vdev/src/commands/deprecation/show.rs b/vdev/src/commands/deprecation/show.rs index 147d2d150438f..c103eedaedfb2 100644 --- a/vdev/src/commands/deprecation/show.rs +++ b/vdev/src/commands/deprecation/show.rs @@ -58,6 +58,19 @@ impl Cli { None => "next".to_string(), }; + if let Some(ref v) = next_minor { + let enacted = deprecation::read_enacted(&repo_root)?; + let removing: Vec<&deprecation::EnactedEntry> = enacted + .iter() + .filter(|e| { + Version::parse(&e.removed_in) + .ok() + .is_some_and(|rv| rv.major == v.major && rv.minor == v.minor) + }) + .collect(); + print_enacted_section(&next_label, &removing); + } + print_announcing_section(&next_label, &announcing); if !explicit_version { print_section("Previously announced", &planned); @@ -67,20 +80,16 @@ impl Cli { } } -/// Print the "Announced in next release" section header with the version label in bold red. fn print_announcing_section(next_label: &str, entries: &[&DeprecationEntry]) { - let header_style = Style::new().underline().white(); + let style = Style::new().bold().underline(); let title = format!("Announced in next release ({next_label})"); - println!( - "{}", - title.if_supports_color(Stdout, |t| t.style(header_style)) - ); + println!("{}", title.if_supports_color(Stdout, |t| t.style(style))); println!(); if entries.is_empty() { println!("{}", "(none)".if_supports_color(Stdout, |t| t.dimmed())); } else { for e in entries { - print_entry(e, true); + print_entry(e); } } println!(); @@ -94,28 +103,48 @@ fn print_section(title: &str, entries: &[&DeprecationEntry]) { println!("{}", "(none)".if_supports_color(Stdout, |t| t.dimmed())); } else { for e in entries { - print_entry(e, false); + print_entry(e); } } println!(); } -fn print_entry(e: &DeprecationEntry, highlight_version: bool) { - println!("{}", e.what.if_supports_color(Stdout, |t| t.bold())); - let version_str = e.deprecated_since.to_string(); - let version_colored = if highlight_version { - owo_colors::OwoColorize::if_supports_color(&version_str, Stdout, |t| { - t.style(Style::new().bold().red()) - }) - .to_string() +fn print_enacted_section(next_label: &str, entries: &[&deprecation::EnactedEntry]) { + let style = Style::new().bold().underline(); + let title = format!("Removed in {next_label}"); + println!("{}", title.if_supports_color(Stdout, |t| t.style(style))); + println!(); + if entries.is_empty() { + println!("{}", "(none)".if_supports_color(Stdout, |t| t.dimmed())); } else { - owo_colors::OwoColorize::if_supports_color(&version_str, Stdout, |t| t.bright_cyan()) - .to_string() - }; + for e in entries { + println!("{}", e.what.if_supports_color(Stdout, |t| t.bold())); + println!( + " {} {}", + "deprecated_since:".if_supports_color(Stdout, |t| t.dimmed()), + e.deprecated_since + .if_supports_color(Stdout, |t| t.bright_cyan()), + ); + if !e.description.is_empty() { + println!(); + for line in e.description.lines() { + println!(" {}", line.if_supports_color(Stdout, |t| t.italic())); + } + } + println!(); + } + } + println!(); +} + +fn print_entry(e: &DeprecationEntry) { + println!("{}", e.what.if_supports_color(Stdout, |t| t.bold())); println!( " {} {}", "deprecated_since:".if_supports_color(Stdout, |t| t.dimmed()), - version_colored, + e.deprecated_since + .to_string() + .if_supports_color(Stdout, |t| t.bright_cyan()), ); if !e.description.is_empty() { println!(); diff --git a/vdev/src/utils/deprecation.rs b/vdev/src/utils/deprecation.rs index 5fbc4a9ab920b..9c5c3adbdb1a6 100644 --- a/vdev/src/utils/deprecation.rs +++ b/vdev/src/utils/deprecation.rs @@ -201,6 +201,11 @@ struct PendingJsonEntry { description: String, } +/// Read only the enacted entries from `DEPRECATIONS_JSON`. +pub fn read_enacted(repo_root: &Path) -> Result> { + Ok(read_json(repo_root)?.deprecations_enacted) +} + fn read_json(repo_root: &Path) -> Result { let path = repo_root.join(DEPRECATIONS_JSON); if !path.exists() { From 03f01669d7219a3c1adf630d001d8fd5e1901d5c Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 18:11:05 -0400 Subject: [PATCH 78/85] fix(website): filter enacted entries from deprecation announcements on release pages --- website/layouts/partials/releases/deprecations.html | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/website/layouts/partials/releases/deprecations.html b/website/layouts/partials/releases/deprecations.html index 0c7a9a1b4b39c..372af87845d77 100644 --- a/website/layouts/partials/releases/deprecations.html +++ b/website/layouts/partials/releases/deprecations.html @@ -1,5 +1,5 @@ {{/* Renders deprecations for a specific release version (major.minor match). - Enacted (removed_in == version) appears first, then newly announced (deprecated_since == version). + Enacted removals (removed_in == version) appear first, then newly announced pending entries (deprecated_since == version). Params: version (string, e.g. "0.56" or "0.56.0") */}} {{- $pending := site.Data.docs.deprecations_pending -}} {{- $enacted := site.Data.docs.deprecations_enacted -}} @@ -15,12 +15,6 @@ {{- $announced = $announced | append . -}} {{- end -}} {{- end -}} -{{- /* Also include enacted entries first announced in this release. */ -}} -{{- range $enacted -}} - {{- if or (strings.HasPrefix .deprecated_since $prefix) (eq .deprecated_since $exact) -}} - {{- $announced = $announced | append . -}} - {{- end -}} -{{- end -}} {{- $announced = sort $announced "deprecated_since" "desc" -}} From 64005c353d3d4b9c070356702b28558c06b3e8ca Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 18:13:12 -0400 Subject: [PATCH 79/85] feat(vdev): reject future-dated deprecated_since in `check deprecation` --- vdev/src/commands/check/deprecations.rs | 28 ++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/vdev/src/commands/check/deprecations.rs b/vdev/src/commands/check/deprecations.rs index ecff08a22e57d..87cddd07ab323 100644 --- a/vdev/src/commands/check/deprecations.rs +++ b/vdev/src/commands/check/deprecations.rs @@ -1,8 +1,9 @@ #![allow(clippy::print_stdout)] use anyhow::{Result, bail}; +use semver::Version; -use crate::utils::{deprecation, paths}; +use crate::utils::{deprecation, git, paths}; /// Check deprecation.d fragments are valid and that generated/deprecations.json is up to date #[derive(clap::Args, Debug)] @@ -33,6 +34,31 @@ impl Cli { println!("{} deprecation fragment(s) are valid.", entries.len()); } + // Reject any fragment with a deprecated_since newer than the next minor release. + if let Ok(latest) = git::latest_release_version() { + let next_minor = Version::new(latest.major, latest.minor + 1, 0); + let future: Vec<_> = entries + .iter() + .filter(|e| e.deprecated_since.0 > next_minor) + .collect(); + if !future.is_empty() { + for e in &future { + eprintln!( + " future {} (deprecated_since: {}, next release: {}.{})", + e.filename, e.deprecated_since, next_minor.major, next_minor.minor + ); + } + bail!( + "{} fragment(s) have a deprecated_since version newer than the next release ({}.{}). \ + Update deprecated_since to {} or earlier.", + future.len(), + next_minor.major, + next_minor.minor, + next_minor + ); + } + } + let json_path = repo_root.join(deprecation::DEPRECATIONS_JSON); let before = std::fs::read_to_string(&json_path).unwrap_or_default(); From 9493481282cd1657b3ad1234b42e82eb3b3dfdac Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 29 May 2026 18:14:44 -0400 Subject: [PATCH 80/85] fix(website): include generated JSON in Docker cue export --- website/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/Dockerfile b/website/Dockerfile index d98c0f2103ab1..acb8e6be36dd4 100644 --- a/website/Dockerfile +++ b/website/Dockerfile @@ -39,6 +39,6 @@ ENTRYPOINT ["/bin/sh", "-c", \ fi && \ yarn && \ cp -f /app/Cargo.lock data/cargo-lock.toml && \ - rm -f data/docs.json && find cue -name '*.cue' | xargs cue export --all-errors --outfile data/docs.json && \ + rm -f data/docs.json && { find cue -name '*.cue'; find cue -path '*/generated/*.json' 2>/dev/null || true; } | xargs cue export --all-errors --outfile data/docs.json && \ yarn config-examples && \ hugo server --bind 0.0.0.0 --port 1313 --buildDrafts --buildFuture --environment development"] From 818cbe12fbae323525a0b56d5dbc64d7fdb9db1a Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 1 Jun 2026 10:38:52 -0400 Subject: [PATCH 81/85] chore(ci): build vdev from source in deprecation workflow --- .github/workflows/deprecation.yaml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deprecation.yaml b/.github/workflows/deprecation.yaml index a11ffca020a67..05b593ae3e6cb 100644 --- a/.github/workflows/deprecation.yaml +++ b/.github/workflows/deprecation.yaml @@ -45,8 +45,18 @@ jobs: - uses: ./.github/actions/setup with: - vdev: true + vdev: false + rust: true mold: false + - name: Cache vdev build + uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 + with: + path: target/debug/vdev + key: ${{ runner.os }}-vdev-${{ hashFiles('vdev/src/**', 'vdev/Cargo.toml', 'Cargo.lock') }} + + - name: Build vdev from source + run: cargo build -p vdev + - name: Check deprecation fragments - run: vdev check deprecations + run: ./target/debug/vdev check deprecations From 155793df74e4b3ec085ba2e49d6351c8e56144f8 Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 1 Jun 2026 10:41:41 -0400 Subject: [PATCH 82/85] Revert "chore(ci): build vdev from source in deprecation workflow" This reverts commit 818cbe12fbae323525a0b56d5dbc64d7fdb9db1a. --- .github/workflows/deprecation.yaml | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/.github/workflows/deprecation.yaml b/.github/workflows/deprecation.yaml index 05b593ae3e6cb..a11ffca020a67 100644 --- a/.github/workflows/deprecation.yaml +++ b/.github/workflows/deprecation.yaml @@ -45,18 +45,8 @@ jobs: - uses: ./.github/actions/setup with: - vdev: false - rust: true + vdev: true mold: false - - name: Cache vdev build - uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 - with: - path: target/debug/vdev - key: ${{ runner.os }}-vdev-${{ hashFiles('vdev/src/**', 'vdev/Cargo.toml', 'Cargo.lock') }} - - - name: Build vdev from source - run: cargo build -p vdev - - name: Check deprecation fragments - run: ./target/debug/vdev check deprecations + run: vdev check deprecations From 442e0dbb48c67a3ae5fa2a3d91b5db1cda0d7f8e Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 1 Jun 2026 10:45:31 -0400 Subject: [PATCH 83/85] fix(website): restore historical deprecation announcements; fix patch release matching; bail on missing git tags in check --- vdev/src/commands/check/deprecations.rs | 43 +++++++++++-------- .../partials/releases/deprecations.html | 13 +++++- 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/vdev/src/commands/check/deprecations.rs b/vdev/src/commands/check/deprecations.rs index 87cddd07ab323..dccea7469c4b8 100644 --- a/vdev/src/commands/check/deprecations.rs +++ b/vdev/src/commands/check/deprecations.rs @@ -35,27 +35,32 @@ impl Cli { } // Reject any fragment with a deprecated_since newer than the next minor release. - if let Ok(latest) = git::latest_release_version() { - let next_minor = Version::new(latest.major, latest.minor + 1, 0); - let future: Vec<_> = entries - .iter() - .filter(|e| e.deprecated_since.0 > next_minor) - .collect(); - if !future.is_empty() { - for e in &future { - eprintln!( - " future {} (deprecated_since: {}, next release: {}.{})", - e.filename, e.deprecated_since, next_minor.major, next_minor.minor + match git::latest_release_version() { + Ok(latest) => { + let next_minor = Version::new(latest.major, latest.minor + 1, 0); + let future: Vec<_> = entries + .iter() + .filter(|e| e.deprecated_since.0 > next_minor) + .collect(); + if !future.is_empty() { + for e in &future { + eprintln!( + " future {} (deprecated_since: {}, next release: {}.{})", + e.filename, e.deprecated_since, next_minor.major, next_minor.minor + ); + } + bail!( + "{} fragment(s) have a deprecated_since version newer than the next release ({}.{}). \ + Update deprecated_since to {} or earlier.", + future.len(), + next_minor.major, + next_minor.minor, + next_minor ); } - bail!( - "{} fragment(s) have a deprecated_since version newer than the next release ({}.{}). \ - Update deprecated_since to {} or earlier.", - future.len(), - next_minor.major, - next_minor.minor, - next_minor - ); + } + Err(e) => { + bail!("could not determine latest release version: {e}"); } } diff --git a/website/layouts/partials/releases/deprecations.html b/website/layouts/partials/releases/deprecations.html index 372af87845d77..5711fb594cbfd 100644 --- a/website/layouts/partials/releases/deprecations.html +++ b/website/layouts/partials/releases/deprecations.html @@ -1,5 +1,6 @@ {{/* Renders deprecations for a specific release version (major.minor match). - Enacted removals (removed_in == version) appear first, then newly announced pending entries (deprecated_since == version). + Enacted removals (removed_in == version) appear first, then newly announced entries (deprecated_since == version). + Enacted entries whose deprecated_since matches are included in announcements for historical context. Params: version (string, e.g. "0.56" or "0.56.0") */}} {{- $pending := site.Data.docs.deprecations_pending -}} {{- $enacted := site.Data.docs.deprecations_enacted -}} @@ -15,12 +16,20 @@ {{- $announced = $announced | append . -}} {{- end -}} {{- end -}} +{{- /* Also include enacted entries first announced in this release for historical context. */ -}} +{{- range $enacted -}} + {{- if or (strings.HasPrefix .deprecated_since $prefix) (eq .deprecated_since $exact) -}} + {{- $announced = $announced | append . -}} + {{- end -}} +{{- end -}} {{- $announced = sort $announced "deprecated_since" "desc" -}} {{- $removed := slice -}} {{- range $enacted -}} - {{- if or (strings.HasPrefix .removed_in $prefix) (eq .removed_in $exact) -}} + {{- /* Exact match, or prefix match only when page version is two-part (no patch). */ -}} + {{- if or (eq .removed_in $version) + (and (eq $version $exact) (strings.HasPrefix .removed_in $prefix)) -}} {{- $removed = $removed | append . -}} {{- end -}} {{- end -}} From a46581ac10487b7bd76efb91c25a68bc08ca2058 Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 1 Jun 2026 10:52:19 -0400 Subject: [PATCH 84/85] chore(ci): fetch tags in deprecation workflow for version check --- .github/workflows/deprecation.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deprecation.yaml b/.github/workflows/deprecation.yaml index a11ffca020a67..542b366481b86 100644 --- a/.github/workflows/deprecation.yaml +++ b/.github/workflows/deprecation.yaml @@ -42,6 +42,7 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: ${{ inputs.ref }} + fetch-tags: true - uses: ./.github/actions/setup with: From 170c96939c4772a73f418498cf7fd2cf2cf2de80 Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 1 Jun 2026 11:00:28 -0400 Subject: [PATCH 85/85] fix(website): use `deprecation generate` in Makefile instead of `check deprecations` --- website/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/Makefile b/website/Makefile index 462ac9766cab6..e85dd624662b6 100644 --- a/website/Makefile +++ b/website/Makefile @@ -31,7 +31,7 @@ generate-vrl-docs: $(if $(findstring true,$(CI)),--vector-sha $(GITHUB_SHA),) generate-deprecations-json: - $(VDEV) check deprecations + $(VDEV) deprecation generate structured-data: generate-vrl-docs generate-deprecations-json cue-build config-examples