{"record":{"id":"8f839512368883e4","repo":"vectordotdev/vector","slug":"output-didn-t-exist","errorCode":null,"errorMessage":"output didn't exist","messagePattern":"output didn't exist","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/config/graph.rs","lineNumber":234,"sourceCode":"            Node::Source { .. } => panic!(\"no inputs on sources\"),\n            Node::Transform { in_ty, .. } => in_ty,\n            Node::Sink { ty } => ty,\n        }\n    }\n\n    /// Return the output type associated with a given `OutputId`.\n    ///\n    /// # Panics\n    ///\n    /// Will panic if the given id is not present in the graph or identifies a sink, which can't\n    /// have inputs.\n    fn get_output_type(&self, id: &OutputId) -> DataType {\n        match &self.nodes[&id.component] {\n            Node::Source { outputs } => outputs\n                .iter()\n                .find(|output| output.port == id.port)\n                .map(|output| output.ty)\n                .expect(\"output didn't exist\"),\n            Node::Transform { outputs, .. } => outputs\n                .iter()\n                .find(|output| output.port == id.port)\n                .map(|output| output.ty)\n                .expect(\"output didn't exist\"),\n            Node::Sink { .. } => panic!(\"no outputs on sinks\"),\n        }\n    }\n\n    pub fn typecheck(&self) -> Result<(), Vec<String>> {\n        let mut errors = Vec::new();\n\n        // check that all edges connect components with compatible data types\n        for edge in &self.edges {\n            let from_ty = self.get_output_type(&edge.from);\n            let to_ty = self.get_input_type(&edge.to);\n\n            if !from_ty.intersects(to_ty) {","sourceCodeStart":216,"sourceCodeEnd":252,"githubUrl":"https://github.com/vectordotdev/vector/blob/bdb87aeaa4c4ff27c0ba643c1c77b21bf2ef4013/src/config/graph.rs#L216-L252","documentation":"`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.","triggerScenarios":"`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.","commonSituations":"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.","solutions":["Check the wiring in your config: every `inputs` reference must match an existing named output of the component.","Run `vector validate` on the config before loading to catch dangling port references.","Ensure graph edges are rebuilt after any change to a node's output set."],"exampleFix":"// before\n[transforms.foo.outputs]  # removed 'processed' output but edges still reference it\ninputs = [\"foo.processed\"]\n// after\ninputs = [\"foo\"]  # reference an output port that exists","handlingStrategy":"validation","validationCode":"// Before loading, check every wire target port exists:\nvector validate --no-environment /etc/vector/vector.yaml","typeGuard":null,"tryCatchPattern":"// Callers via typecheck already get Vec<String> errors; keep using:\nif let Err(errors) = graph.typecheck() { eprintln!(\"typecheck failed: {errors:?}\"); }","preventionTips":["Run `vector validate` in CI for every config change.","When renaming transform outputs, grep configs for the old port name in all `inputs` lists.","Avoid hand-editing output port names of built-in transforms."],"tags":["config","graph","typecheck"],"backgroundTag":"entity-not-found","analyzedSha":"bdb87aeaa4c4ff27c0ba643c1c77b21bf2ef4013","analyzedAt":"2026-09-16T02:53:35.741Z","contentChangedAt":"2026-09-16T02:53:35.741Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}