cilium/cilium · error

filter has no name: %s

Error message

filter has no name: %s

What it means

injectCiliumUpstreamL7Filter requires every filter in the upstream filter chain to have a name so it can identify and reorder them around the Cilium L7 filter. An unnamed filter makes the chain unprocessable, so parsing fails.

Source

Thrown at pkg/ciliumenvoyconfig/cec_resource_parser.go:912

	return updated
}

// injectCiliumUpstreamL7Filter injects the Cilium HTTP filter just before the Upstream Codec filter
func injectCiliumUpstreamL7Filter(accessLogPath string, opts *envoy_config_upstream.HttpProtocolOptions, supportsALPN bool) (bool, error) {
	filters := opts.GetHttpFilters()
	if filters == nil {
		filters = make([]*envoy_config_http.HttpFilter, 0, 2)
	}

	foundCiliumL7Filter := false
	codecFilterIndex := -1
	for j, filter := range filters {
		// no filters allowed after upstream codec filter
		if codecFilterIndex >= 0 {
			return false, fmt.Errorf("filter after codec filter: %s", filter.String())
		}
		if len(filter.Name) == 0 {
			return false, fmt.Errorf("filter has no name: %s", filter.String())
		}
		tc := filter.GetTypedConfig()
		if tc == nil {
			return false, fmt.Errorf("filter has no type: %s", filter.String())
		}
		switch tc.GetTypeUrl() {
		case ciliumL7FilterTypeURL:
			foundCiliumL7Filter = true
		case upstreamCodecFilterTypeURL:
			codecFilterIndex = j
		}
	}
	changed := false
	if !foundCiliumL7Filter {
		j := codecFilterIndex
		if j >= 0 {
			filters = append(filters[:j+1], filters[j:]...)
			filters[j] = envoy.GetCiliumHttpFilter(accessLogPath)

View on GitHub (pinned to ac7b90affa)

Solutions

  1. Add the required 'name' field to the filter entry shown in the error dump
  2. Remove placeholder/empty filter entries from the chain
  3. Fix the generator or template producing nameless filters

Example fix

// before
filters:
- typed_config:
    "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
// after
filters:
- name: envoy.filters.network.tcp_proxy
  typed_config:
    "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
Defensive patterns

Strategy: validation

Validate before calling

func allFiltersNamed(filters []*envoy_config_listener.Filter) error {
    for i, f := range filters {
        if f.GetName() == "" {
            return fmt.Errorf("filter[%d] missing name", i)
        }
    }
    return nil
}

Type guard

func hasName(f *envoy_config_listener.Filter) bool {
    return f != nil && f.GetName() != ""
}

Prevention

When it happens

Trigger: injectCiliumUpstreamL7Filter encounters filters[j] with len(filter.Name)==0 while iterating the cluster's filter chain (via ParseResources or TestUpstreamInject).

Common situations: CEC YAML where a filter entry omits the name field (only config present); templating/tooling dropping the name; hand-edited CEC removing a name accidentally.

Related errors


AI-assisted analysis of cilium/cilium@ac7b90affa (2026-08-31). Data as JSON: /api/errors/988fafb1b67caa1a. Report an issue: GitHub.