{"record":{"id":"959b79127aaf9448","repo":"cilium/cilium","slug":"node-error-s","errorCode":null,"errorMessage":"node error: %s","messagePattern":"node error: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cilium-cli/connectivity/check/action.go","lineNumber":1007,"sourceCode":"\t\t\t// Handle NodeStatus messages generated by Hubble peers, containing\n\t\t\t// individual node readiness, unavailability, invalid filters etc.\n\n\t\t\tswitch r.NodeStatus.StateChange {\n\t\t\tcase relay.NodeState_NODE_CONNECTED:\n\t\t\t\t// Received first connection event from a Hubble peer, tentatively\n\t\t\t\t// notify the caller that traffic can be generated.\n\t\t\t\ta.Debugf(\"Connected to Hubble node(s) %s\", r.NodeStatus.NodeNames)\n\t\t\t\tonce.Do(func() { ready <- true })\n\n\t\t\tcase relay.NodeState_NODE_UNAVAILABLE:\n\t\t\t\t// An unavailable node will result in the event log being incomplete,\n\t\t\t\t// so the test needs to be aborted.\n\t\t\t\treturn fmt.Errorf(\"unavailable node(s) %s, flow results will be incomplete\", r.NodeStatus.NodeNames)\n\n\t\t\tcase relay.NodeState_NODE_ERROR:\n\t\t\t\t// When an invalid filter is specified, a node error will be published\n\t\t\t\t// by at least one Hubble node.\n\t\t\t\treturn fmt.Errorf(\"node error: %s\", r.NodeStatus.Message)\n\t\t\t}\n\n\t\tcase *observer.GetFlowsResponse_Flow:\n\t\t\t// Store any flows we receive in the Action to be sent off\n\t\t\t// to the flow matcher later.\n\n\t\t\ta.flowsMu.Lock()\n\t\t\ta.flows = append(a.flows, r)\n\t\t\ta.flowsMu.Unlock()\n\n\t\tdefault:\n\t\t\t// Abort on any unknown message types.\n\t\t\treturn fmt.Errorf(\"received unknown message: %q\", r)\n\n\t\t}\n\t}\n}\n","sourceCodeStart":989,"sourceCodeEnd":1025,"githubUrl":"https://github.com/cilium/cilium/blob/ac7b90affa4baf0642e6685319d56907b3a73a6d/cilium-cli/connectivity/check/action.go#L989-L1025","documentation":"Relay publishes a NODE_ERROR NodeStatus when at least one Hubble node reports an error on the GetFlows request — classically an invalid flow filter that the node rejected. The message text (r.NodeStatus.Message) comes from the node and is surfaced verbatim.","triggerScenarios":"A GetFlowsResponse_NodeStatus with State == relay.NodeState_NODE_ERROR arrives; typically triggered by a malformed or unsupported whitelist flow filter built by the test scenario (e.g. bad trial/requirement filters).","commonSituations":"Custom flow filters supplied via test parameters that the Hubble node's filter parser rejects; version mismatch where newer filter fields are sent to older Hubble agents; typo'd flow labels in custom scenarios.","solutions":["Read the node message in the error — it names the rejected filter","If using custom filters, validate flow filter syntax (flow filters in hubble docs) before running","Upgrade cilium-cli and Cilium together so filter capabilities match","Re-run with default filters (--flow-validation default whitelist) to isolate the custom filter"],"exampleFix":"// before\nFlowFilters: []flow.Filter{{Expr: \"verdict !=\"}} // malformed\n// after\nFlowFilters: []flow.Filter{{Expr: \"verdict DROPPED\"}}","handlingStrategy":"validation","validationCode":"// validate custom flow filters against a live node before the suite\n_, err := hubbleClient.GetFlows(ctx, &observer.GetFlowsRequest{Whitelist: myFilters, Number: 1})\nif err != nil {\n    return fmt.Errorf(\"invalid flow filter: %w\", err)\n}","typeGuard":null,"tryCatchPattern":"if err := runSuite(ctx); err != nil {\n    if strings.Contains(err.Error(), \"node error: \") {\n        // read the node's message; it names the rejected filter\n    }\n    return err\n}","preventionTips":["Keep flow filter syntax matched to the cluster's Hubble version","Test custom filters with 'hubble observe --filter' before embedding them","Upgrade cilium-cli and Cilium in lockstep","Start from default filters and add custom ones incrementally"],"tags":["hubble","flow-filters","relay"],"backgroundTag":"hubble-node-error","analyzedSha":"ac7b90affa4baf0642e6685319d56907b3a73a6d","analyzedAt":"2026-08-31T18:27:15.868Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}