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
- Add the required 'name' field to the filter entry shown in the error dump
- Remove placeholder/empty filter entries from the chain
- 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
- Require 'name' on every filter entry in CEC YAML schema/lint
- Check YAML indentation so fields don't fall out of the filter entry
- Run `cilium-dbg bpf` / dry-run parse of CECs before rollout
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
- filter has no type: %s
- unspecified Cluster name
- unspecified ClusterLoadAssignment cluster_name
- unspecified Secret name
- failed to validate Cluster %q after injecting Cilium upstrea
AI-assisted analysis of cilium/cilium@ac7b90affa (2026-08-31).
Data as JSON: /api/errors/988fafb1b67caa1a.
Report an issue: GitHub.