grpc/grpc-go · error
filter missing name field
Error message
filter missing name field
What it means
Thrown by processHTTPFilters while walking the http_filters list in an LDS RouteConfiguration / HTTP connection manager. gRPC requires every HTTP filter to carry a non-empty name so it can be referenced by per-filter overrides and de-duplicated. An empty name on any filter entry aborts unmarshaling of the whole filter list.
Solutions
- Open the LDS resource and add a unique, non-empty name to every entry in http_filters.
- If using Istio EnvoyFilter, ensure each add/patch operation specifies a name for the appended HTTP filter.
- Validate the LDS payload with protoc/buf before sending, requiring name != "".
- After fixing, NACK/response should re-apply cleanly; confirm no duplicate-name error follows.
Example fix
// before
// http_filters: [ { typed_config: { ... } } ]
// after
// http_filters: [ { name: "envoy.filters.http.router", typed_config: { ... } } ] Defensive patterns
Strategy: validation
Validate before calling
// Validate an LDS HttpFilter list before sending/consuming it.
func validateHTTPFilterNames(filters []*envoy_http_pb.HttpFilter) error {
seen := map[string]struct{}{}
for _, f := range filters {
if f.GetName() == "" { return fmt.Errorf("filter at index missing name") }
if _, dup := seen[f.GetName()]; dup { return fmt.Errorf("duplicate filter name %q", f.GetName()) }
seen[f.GetName()] = struct{}{}
}
return nil
} Try / catch
Catch the error from the LDS watcher callback (WatchListener). Log the listener URL/version; do not retry the same resource. Surface to the control-plane team since the fix is in their config.
Prevention
- Always name HTTP filters in control-plane templates.
- Add a CEL/rego policy in your xDS server that rejects http_filters entries without names.
- Diff against the last-known-good LDS resource when a new filter is added.
When it happens
Trigger: An LDS response includes an HttpFilter message whose name field is unset (""), e.g. a typed_config block was attached but the operator forgot the name. Common when hand-editing Envoy filter configs or when a control-plane translation omits auto-generated names.
Common situations: Custom HTTP filter (e.g. ext_authz, ext_proc, rbac) added via control plane without a name. Istio EnvoyFilter patch that appends a filter without setting name. Version mismatch where an older control plane emits a filter shape that lacked names.
Related errors
- DownstreamTlsContext in LDS response does not contain a…
- multiple filter chains with overlapping matching rules are…
- security configuration on the server-side does not contain…
- unsupported field 'use_original_dst' is present and set to…
- lrsclient: transport builder is nil
AI-assisted analysis of grpc/grpc-go@0c51461d27 (2026-08-11).
Data as JSON: /api/errors/6dadf6a586a396e8.
Report an issue: GitHub.
Appendix: source
Thrown at internal/xds/xdsclient/xdsresource/unmarshal_lds.go:219
if err != nil {
return nil, fmt.Errorf("filter override %q: %v", name, err)
}
if httpFilter == nil {
// Optional configs are ignored.
continue
}
m[name] = config
}
return m, nil
}
func processHTTPFilters(filters []*v3httppb.HttpFilter, server bool) ([]HTTPFilter, error) {
ret := make([]HTTPFilter, 0, len(filters))
seenNames := make(map[string]bool, len(filters))
for _, filter := range filters {
name := filter.GetName()
if name == "" {
return nil, errors.New("filter missing name field")
}
if seenNames[name] {
return nil, fmt.Errorf("duplicate filter name %q", name)
}
seenNames[name] = true
httpFilter, config, err := validateHTTPFilterConfig(filter.GetTypedConfig(), true, filter.GetIsOptional())
if err != nil {
return nil, err
}
if httpFilter == nil {
// Optional configs are ignored.
continue
}
if server {
if _, ok := httpFilter.(httpfilter.ServerFilterBuilder); !ok {
if filter.GetIsOptional() {
continueView on GitHub (pinned to 0c51461d27)