Repository navigation
Conversation
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ecaeb9b7e1
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f77daa9344
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| ) -> Result<T, Vec<String>> { | ||
| deserialize_config_value(Value::Object(map)) | ||
| let mut value = Value::Object(map); | ||
| coerce_config(&mut value)?; |
There was a problem hiding this comment.
Preserve boolean-or-struct configuration shorthands
When a sink uses the supported shorthand healthcheck: false, this unconditional coercion rejects the boolean as ExpectedObject before serde can process it. SinkOuter::healthcheck explicitly uses deserialize_with = "bool_or_struct", whose visitor accepts either a boolean or a map, while its generated schema describes only the struct shape; the same pattern is used by many TLS and acknowledgement fields. Teach coercion about these alternate serde input shapes, or avoid schema-validating already typed non-string values, so previously valid configurations continue to load.
Useful? React with 👍 / 👎.
| "what": "Environment-variable and secret placeholders in non-string positions", | ||
| "deprecated_since": "0.57.0", | ||
| "removed_in": "0.59.0", | ||
| "description": "Placeholders (`${VAR}` and `SECRET[backend.key]`) in structural positions of\na Vector configuration file are deprecated and will be removed in a future\nrelease. Current behavior is unchanged.\n\nAffected patterns:\n\n- Unquoted placeholders in non-string fields (`count = ${MY_COUNT}`).\n- Placeholders in map keys (`${KEY} = value`).\n- Placeholders in TOML table headers (`[${SECTION}]`).\n- Placeholders as inline array elements that expand to multiple values\n (`inputs = [${VECTOR_INPUTS}]` where `VECTOR_INPUTS=a,b`).\n\nMigration guidance will accompany the removal PR. `envsubst` can be used today\nto pre-expand env-var placeholders into a fully static config as a workaround.\n\nSee [RFC: parse-first config interpolation](https://github.com/vectordotdev/vector/blob/master/rfcs/2026-06-09-parse-first-config-interpolation.md)\nfor the full rationale." |
There was a problem hiding this comment.
Describe the enacted interpolation behavior
After moving this entry into deprecations_enacted with removed_in: 0.59.0, the copied description still says the feature “will be removed in a future release,” that current behavior is unchanged, and that migration guidance will arrive later. This directly contradicts both the enacted status and this commit's parse-first behavior, so the generated deprecations page gives upgrading users obsolete guidance; update the description to explain the behavior now in effect and point to the included migration steps.
Useful? React with 👍 / 👎.
Reuse parsed input snapshots for environment interpolation, secret discovery, and configuration assembly. Preserve healthcheck, ASCII delimiter, directory merge, and metric tag compatibility, with regression tests and a released-binary comparison corpus.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4f62338e9b
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| ) -> Result<T, Vec<String>> { | ||
| deserialize_config_value(Value::Object(map)) | ||
| let mut value = Value::Object(map); | ||
| coerce_config(&mut value)?; |
There was a problem hiding this comment.
Support YAML integer spellings during schema coercion
When an interpolated YAML integer uses a valid YAML spelling such as 0x2, parse-first loading leaves the substituted value as a string and this new coercion pass rejects it because parse_integer accepts only decimal Rust integer syntax. Previously interpolation occurred before YAML parsing, so count: ${COUNT} with COUNT=0x2 produced the integer 2; the newly added environment-yaml-hex-integer compatibility case also explicitly expects this to remain accepted. Extend integer coercion to the scalar formats previously recognized by the configuration parser.
Useful? React with 👍 / 👎.
| ) -> Result<T, Vec<String>> { | ||
| deserialize_config_value(Value::Object(map)) | ||
| let mut value = Value::Object(map); | ||
| coerce_config(&mut value)?; |
There was a problem hiding this comment.
Preserve comma-separated no_proxy strings during coercion
When proxy.no_proxy is configured as a comma-separated scalar such as "localhost,127.0.0.1", this new coercion pass sees NoProxy's Vec<String> schema and wraps the scalar into ['localhost,127.0.0.1'] before deserialization. NoProxy intentionally gives these shapes different semantics: its string visitor splits on commas, while its sequence visitor treats each element as one pattern. The resulting configuration therefore contains one literal hostname with a comma and sends requests for both intended hosts through the proxy. Describe NoProxy as a string-or-array schema and preserve the matching input shape instead of wrapping it before serde.
Useful? React with 👍 / 👎.
Summary
Finish the parse-first rollout using the helpers merged in #26441 and #26450. Configuration loading now parses YAML, TOML, or JSON before interpolating environment variables and secrets, then coerces values with the generated schema before deserialization. The HTTP provider uses the same loader.
Substituted quotes and newlines remain string content instead of changing the configuration structure. Environment interpolation remains opt-in. Comments and keys are no longer interpolated; TOML and JSON placeholders must be quoted, and values cannot expand into multiple array elements.
This enacts the structural-interpolation deprecation announced in 0.57.0 for removal in 0.59.0. Includes migration guidance and updated environment-variable and secrets documentation.
References
Vector configuration
With environment interpolation enabled,
MY_COUNT=42is converted to an integer:How did you test this PR?
make check-generated-docs: 248 component examples passed (4 skipped); no CUE or generated-example changes.clippy::unused_asyncfailure in unchangedsrc/test_util/http.rs:51excluded.Does this PR include user facing changes?
no-changeloglabel to this PR.Contributor Guidelines
@vectordotdev/vectorto reach out to us regarding this PR.git merge origin masterandgit push.