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

  1. Open the LDS resource and add a unique, non-empty name to every entry in http_filters.
  2. If using Istio EnvoyFilter, ensure each add/patch operation specifies a name for the appended HTTP filter.
  3. Validate the LDS payload with protoc/buf before sending, requiring name != "".
  4. 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

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


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() {
					continue

View on GitHub (pinned to 0c51461d27)