vectordotdev/vector · error

output didn't exist

Error message

output didn't exist

What it means

`get_output_type` looks up a node's output list and finds the entry matching the requested port, asserting it exists. The panic means an edge references an output port that the source/transform node does not declare — the graph is internally inconsistent.

Solutions

  1. Check the wiring in your config: every `inputs` reference must match an existing named output of the component.
  2. Run `vector validate` on the config before loading to catch dangling port references.
  3. Ensure graph edges are rebuilt after any change to a node's output set.

Example fix

// before
[transforms.foo.outputs]  # removed 'processed' output but edges still reference it
inputs = ["foo.processed"]
// after
inputs = ["foo"]  # reference an output port that exists
Defensive patterns

Strategy: validation

Validate before calling

// Before loading, check every wire target port exists:
vector validate --no-environment /etc/vector/vector.yaml

Try / catch

// Callers via typecheck already get Vec<String> errors; keep using:
if let Err(errors) = graph.typecheck() { eprintln!("typecheck failed: {errors:?}"); }

Prevention

When it happens

Trigger: `typecheck` resolving an edge whose OutputId.port has no matching output on the referenced source node; edges created before outputs were computed or with stale port names.

Common situations: Config wires referencing a named output that was renamed/removed (e.g. after `remap` changes or log/metric port renames); programmatic graph mutation that removes outputs but leaves edges.

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


AI-assisted analysis of vectordotdev/vector@bdb87aeaa4 (2026-09-16). Data as JSON: /api/errors/8f839512368883e4. Report an issue: GitHub.

Appendix: source

Thrown at src/config/graph.rs:234

            Node::Source { .. } => panic!("no inputs on sources"),
            Node::Transform { in_ty, .. } => in_ty,
            Node::Sink { ty } => ty,
        }
    }

    /// Return the output type associated with a given `OutputId`.
    ///
    /// # Panics
    ///
    /// Will panic if the given id is not present in the graph or identifies a sink, which can't
    /// have inputs.
    fn get_output_type(&self, id: &OutputId) -> DataType {
        match &self.nodes[&id.component] {
            Node::Source { outputs } => outputs
                .iter()
                .find(|output| output.port == id.port)
                .map(|output| output.ty)
                .expect("output didn't exist"),
            Node::Transform { outputs, .. } => outputs
                .iter()
                .find(|output| output.port == id.port)
                .map(|output| output.ty)
                .expect("output didn't exist"),
            Node::Sink { .. } => panic!("no outputs on sinks"),
        }
    }

    pub fn typecheck(&self) -> Result<(), Vec<String>> {
        let mut errors = Vec::new();

        // check that all edges connect components with compatible data types
        for edge in &self.edges {
            let from_ty = self.get_output_type(&edge.from);
            let to_ty = self.get_input_type(&edge.to);

            if !from_ty.intersects(to_ty) {

View on GitHub (pinned to bdb87aeaa4)