{"record":{"id":"fdea082d890c48d1","repo":"grpc/grpc-go","slug":"rls-grpckeybuilder-in-routelookupconfig-does-not","errorCode":null,"errorMessage":"rls: GrpcKeyBuilder in RouteLookupConfig does not contain any Name {%+v}","messagePattern":"rls: GrpcKeyBuilder in RouteLookupConfig does not contain any Name (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"balancer/rls/internal/keys/builder.go","lineNumber":87,"sourceCode":"\t\t\treturn nil, fmt.Errorf(\"rls: GrpcKeyBuilder in RouteLookupConfig contains repeated key %q in extra_keys from constant_keys or headers {%+v}\", kb.GetExtraKeys().GetService(), kbs)\n\t\t}\n\t\tif seenKeys[kb.GetExtraKeys().GetMethod()] {\n\t\t\treturn nil, fmt.Errorf(\"rls: GrpcKeyBuilder in RouteLookupConfig contains repeated key %q in extra_keys from constant_keys or headers {%+v}\", kb.GetExtraKeys().GetMethod(), kbs)\n\t\t}\n\t\tb := builder{\n\t\t\theaderKeys:   matchers,\n\t\t\tconstantKeys: constantKeys,\n\t\t\thostKey:      kb.GetExtraKeys().GetHost(),\n\t\t\tserviceKey:   kb.GetExtraKeys().GetService(),\n\t\t\tmethodKey:    kb.GetExtraKeys().GetMethod(),\n\t\t}\n\n\t\t// Store the builder created above in the BuilderMap based on the value\n\t\t// of the `Names` field, which wraps incoming request's service and\n\t\t// method. Also, ensure that there are no repeated `Names` field.\n\t\tnames := kb.GetNames()\n\t\tif len(names) == 0 {\n\t\t\treturn nil, fmt.Errorf(\"rls: GrpcKeyBuilder in RouteLookupConfig does not contain any Name {%+v}\", kbs)\n\t\t}\n\t\tfor _, name := range names {\n\t\t\tif name.GetService() == \"\" {\n\t\t\t\treturn nil, fmt.Errorf(\"rls: GrpcKeyBuilder in RouteLookupConfig contains a Name field with no Service {%+v}\", kbs)\n\t\t\t}\n\t\t\tif strings.Contains(name.GetMethod(), `/`) {\n\t\t\t\treturn nil, fmt.Errorf(\"rls: GrpcKeyBuilder in RouteLookupConfig contains a method with a slash {%+v}\", kbs)\n\t\t\t}\n\t\t\tpath := \"/\" + name.GetService() + \"/\" + name.GetMethod()\n\t\t\tif _, ok := bm[path]; ok {\n\t\t\t\treturn nil, fmt.Errorf(\"rls: GrpcKeyBuilder in RouteLookupConfig contains repeated Name field {%+v}\", kbs)\n\t\t\t}\n\t\t\tbm[path] = b\n\t\t}\n\t}\n\treturn bm, nil\n}\n","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/grpc/grpc-go/blob/03255a9237b6eb32710f6bc4f2de9a675b99fe36/balancer/rls/internal/keys/builder.go#L69-L105","documentation":"A GrpcKeyBuilder maps a set of service/method Names to a key-building rule; without any Name it can never match an incoming RPC. MakeBuilderMap requires len(kb.GetNames()) > 0 and rejects a builder with an empty Names list.","triggerScenarios":"A grpc_keybuilders entry with no \"names\" field, or names: []. The key builder has headers/constant_keys defined but nothing it applies to.","commonSituations":"Building key builders from a loop and forgetting to set Names; a default/template builder left without a Name; malformed xDS conversion dropping the Names field.","solutions":["Add at least one Name {service, method} to the builder; for whole-service matching use method \"\" (empty).","If the builder is not needed, remove it from grpc_keybuilders.","Validate that every builder has len(names) >= 1 before deploying."],"exampleFix":"// before\n{\"headers\":[{\"key\":\"k\",\"names\":[\"x-k\"]}]}\n// after\n{\"names\":[{\"service\":\"pkg.Svc\",\"method\":\"\"}],\n \"headers\":[{\"key\":\"k\",\"names\":[\"x-k\"]}]}","handlingStrategy":"validation","validationCode":"func validateNamesPresent(cfg *rlspb.RouteLookupConfig) error {\n    for i, kb := range cfg.GetGrpcKeybuilders() {\n        if len(kb.GetNames()) == 0 {\n            return fmt.Errorf(\"keybuilder[%d] has no Name\", i)\n        }\n    }\n    return nil\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Require at least one Name per builder in your config schema.","When merging builders, never drop the Names field.","Default new builders to {service:\"<svc>\", method:\"\"} so they always match something."],"tags":["rls","service-config","config-validation","go","grpc","key-builder"],"analyzedSha":"03255a9237b6eb32710f6bc4f2de9a675b99fe36","analyzedAt":"2026-08-07T00:29:34.215Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}