{"record":{"id":"75002af6c89c9413","repo":"grpc/grpc-go","slug":"rls-unregistered-scheme-in-lookup-service-s","errorCode":null,"errorMessage":"rls: unregistered scheme in lookup_service %s","messagePattern":"rls: unregistered scheme in lookup_service (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"balancer/rls/config.go","lineNumber":210,"sourceCode":"\n\t// `lookup_service` field must be set and must parse as a target URI.\n\tlookupService := rlsProto.GetLookupService()\n\tif lookupService == \"\" {\n\t\treturn nil, fmt.Errorf(\"rls: empty lookup_service in route lookup config %+v\", rlsProto)\n\t}\n\tparsedTarget, err := url.Parse(lookupService)\n\tif err != nil {\n\t\t// url.Parse() fails if scheme is missing. Retry with default scheme.\n\t\tparsedTarget, err = url.Parse(resolver.GetDefaultScheme() + \":///\" + lookupService)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"rls: invalid target URI in lookup_service %s\", lookupService)\n\t\t}\n\t}\n\tif parsedTarget.Scheme == \"\" {\n\t\tparsedTarget.Scheme = resolver.GetDefaultScheme()\n\t}\n\tif resolver.Get(parsedTarget.Scheme) == nil {\n\t\treturn nil, fmt.Errorf(\"rls: unregistered scheme in lookup_service %s\", lookupService)\n\t}\n\n\tlookupServiceTimeout, err := convertDuration(rlsProto.GetLookupServiceTimeout())\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"rls: failed to parse lookup_service_timeout in route lookup config %+v: %v\", rlsProto, err)\n\t}\n\tif lookupServiceTimeout == 0 {\n\t\tlookupServiceTimeout = defaultLookupServiceTimeout\n\t}\n\n\t// Validations performed here:\n\t// - if `max_age` > 5m, it should be set to 5 minutes\n\t//   only if stale age is not set\n\t// - if `stale_age` > `max_age`, ignore it\n\t// - if `stale_age` is set, then `max_age` must also be set\n\tmaxAgeSet := false\n\tmaxAge, err := convertDuration(rlsProto.GetMaxAge())\n\tif err != nil {","sourceCodeStart":192,"sourceCodeEnd":228,"githubUrl":"https://github.com/grpc/grpc-go/blob/03255a9237b6eb32710f6bc4f2de9a675b99fe36/balancer/rls/config.go#L192-L228","documentation":"Returned by parseRLSProto (config.go:206-211) when the scheme parsed from lookup_service is not a registered resolver scheme (resolver.Get(scheme) returns nil). gRPC needs a resolver for the scheme to turn the target into endpoints; an unregistered scheme means no resolver can handle it.","triggerScenarios":"lookup_service uses a scheme whose resolver is not registered in the client binary, e.g. \"xds://...\" without the xds resolver imported, or a custom/typo scheme like \"grpcs:///\".","commonSituations":"Client binary does not import the side-effect import for the needed resolver (e.g. _ \"google.golang.org/grpc/xds\" for xds, or a custom resolver package). Typos in the scheme. Control plane using a scheme the client doesn't support.","solutions":["Register the resolver for the scheme: add the blank import, e.g. _ \"google.golang.org/grpc/xds\" or _ \"google.golang.org/grpc/balancer/rls\" as appropriate, or your custom resolver package.","Use a scheme that is registered by default (e.g. \"dns:///\") if you don't need a special resolver.","If you mistyped the scheme, correct it (note: lookup_service with no scheme is auto-prefixed with the default scheme, so this error implies a non-default, unregistered scheme was present)."],"exampleFix":"// before: \"xds\" resolver not imported, lookup_service = \"xds:///rls\"\nimport (\n  _ \"google.golang.org/grpc/balancer/rls\"\n)\n\n// after: also import the resolver for the scheme you reference\nimport (\n  _ \"google.golang.org/grpc/balancer/rls\"\n  _ \"google.golang.org/grpc/xds\"  // registers the xds resolver\n)\n// or use the default scheme:\nrlc.LookupService = \"dns:///rls.example:443\"","handlingStrategy":"validation","validationCode":"import \"google.golang.org/grpc/resolver\"\n\nfunc validateLookupServiceScheme(svc string) error {\n    t, err := url.Parse(svc)\n    if err != nil { return nil } // caught by the URI check\n    scheme := t.Scheme\n    if scheme == \"\" { scheme = resolver.GetDefaultScheme() }\n    if resolver.Get(scheme) == nil {\n        return fmt.Errorf(\"unregistered scheme %s in %s\", scheme, svc)\n    }\n    return nil\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Blank-import the resolver package for any non-default scheme you reference (e.g. _ \"google.golang.org/grpc/xds\").","Prefer the default dns scheme when possible.","Double-check scheme spelling."],"tags":["go","grpc","load-balancing","rls","config","resolver"],"analyzedSha":"03255a9237b6eb32710f6bc4f2de9a675b99fe36","analyzedAt":"2026-08-07T00:29:34.215Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}