vectordotdev/vector · error
transform must exist
Error message
transform must exist
What it means
Vector builds the input definitions for a topology node and looks up each transform's output schema for the port a downstream input consumes. `.transform_output_for_port(...)` returns an Option<Result<..>>; the code asserts the transform key must be present in `transform_definitions` and panics with "transform must exist" if not. This is an internal consistency invariant: every input edge should reference a transform that was already resolved during config building.
Solutions
- Fix the Vector config so every consumer references an existing transform id (check `transforms:` keys vs `inputs:` lists)
- Run `vector validate --no-environment <config>` before starting to catch dangling references
- Rebuild from a clean state to rule out stale generated definitions
- If the config is correct, file a bug with the config file — this is a topology-builder invariant violation
Example fix
// before (config)
transforms:
parse_logs: {}
routers:
main:
inputs: ["missing_transform"]
// after
transforms:
parse_logs: {}
routers:
main:
inputs: ["parse_logs"] Defensive patterns
Strategy: validation
Validate before calling
// pre-flight: ensure every input references an existing transform
for (id, c) in &config.transforms {
for input in &c.inputs {
assert!(config.transforms.contains_key(input), "dangling transform ref: {input}");
}
} Prevention
- Run `vector validate` on every config before deploy
- Keep transform ids and inputs lists in sync during refactors
- Use schema checks/linting in CI for Vector configs
- Avoid hand-editing generated configs
When it happens
Trigger: A topology input references a transform component key that is absent from `transform_definitions` — i.e. config graph resolution produced an edge to a transform that was never collected, or a custom/patched build path dropped a transform node while keeping its edges.
Common situations: Hand-edited or generated config where a `transforms:` entry was deleted but a downstream component still references it; routing/multiple-output transforms whose port wiring got out of sync after a config refactor; bugs in custom forks modifying the topology builder.
Understand the failure class
Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.
Related errors
- node exists
- transform output misconfigured
- unknown output
- can't run runner twice
- completing more than 2^16 data files at a time is obviously…
AI-assisted analysis of vectordotdev/vector@bdb87aeaa4 (2026-09-16).
Data as JSON: /api/errors/b5a60e2294020e6c.
Report an issue: GitHub.
Appendix: source
Thrown at src/topology/schema.rs:267
// If the input is a transform we recurse to the upstream components to retrieve
// their definitions and pass it through the transform to get the new definitions.
if let Some(inputs) = config.transform_inputs(key) {
let transform_definitions =
input_definitions(inputs, config, enrichment_tables.clone(), cache)?;
if contains_never(&transform_definitions) {
return Err(Error::ContainsNever);
}
let mut transform_definitions = input.with_definitions(
config
.transform_output_for_port(
key,
&input.port,
enrichment_tables.clone(),
&transform_definitions,
)
.expect("transform must exist")
.unwrap_or_else(|| {
unreachable!(
"transform output misconfigured - output for port {:?} missing",
&input.port
)
})
.schema_definitions(config.schema_enabled())
.values()
.cloned(),
);
if contains_never(&transform_definitions) {
return Err(Error::ContainsNever);
}
definitions.append(&mut transform_definitions);
}
}View on GitHub (pinned to bdb87aeaa4)