{"record":{"id":"5f2c0d4ef18cb890","repo":"grpc/grpc-go","slug":"extproc-dialing-external-processor-server-not-imp","errorCode":null,"errorMessage":"extproc: dialing external processor server not implemented","messagePattern":"extproc: dialing external processor server not implemented","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/xds/httpfilter/extproc/internal/internal.go","lineNumber":49,"sourceCode":"var (\n\t// RegisterForTesting registers the external processor HTTP Filter for testing\n\t// purposes.\n\tRegisterForTesting func()\n\n\t// UnregisterForTesting unregisters the external processor HTTP Filter for\n\t// testing purposes.\n\tUnregisterForTesting func()\n\n\t// ParseGRPCServiceConfig parses the gRPC service configuration from the given\n\t// protobuf message.\n\tParseGRPCServiceConfig = func(*v3corepb.GrpcService) (xdsresource.GRPCServiceConfig, error) {\n\t\treturn xdsresource.GRPCServiceConfig{}, fmt.Errorf(\"extproc: ParseGRPCServiceConfig not implemented\")\n\t}\n\n\t// CreateExtProcChannel creates a gRPC client channel to the external\n\t// processing server.\n\tCreateExtProcChannel = func(xdsresource.GRPCServiceConfig) (grpc.ClientConnInterface, func() error, error) {\n\t\treturn nil, nil, fmt.Errorf(\"extproc: dialing external processor server not implemented\")\n\t}\n\n\t// TimeNowFunc returns the current time.Time, and can be overridden for\n\t// testing purposes.\n\tTimeNowFunc func() time.Time\n\n\t// TimeSinceFunc returns the time elapsed, and can be overridden for testing\n\t// purposes.\n\tTimeSinceFunc func(t time.Time) time.Duration\n)\n","sourceCodeStart":31,"sourceCodeEnd":60,"githubUrl":"https://github.com/grpc/grpc-go/blob/03255a9237b6eb32710f6bc4f2de9a675b99fe36/internal/xds/httpfilter/extproc/internal/internal.go#L31-L60","documentation":"internal.CreateExtProcChannel is a package-level override point whose default returns 'dialing external processor server not implemented' (internal.go:48). It must be replaced with a real dialer before extproc can connect to a sidecar. Reaching the stub means no production channel-creation logic was registered.","triggerScenarios":"The extproc filter tries to build a client channel to the external processor while internal.CreateExtProcChannel is still the default stub.","commonSituations":"Binary built without the extproc production dialer linked; extproc enabled via xDS but the wiring package is missing; test exercising extproc without injecting a fake channel.","solutions":["Import/link the package that assigns internal.CreateExtProcChannel so a real gRPC channel is dialed.","Disable the extproc filter in the xDS config until the wiring is present in the binary.","In tests, override internal.CreateExtProcChannel with a stub returning an in-memory connection."],"exampleFix":"// before: extproc configured in xDS but no dialer wired -> not implemented\n\n// after: link the extproc production wiring (blank import / init that assigns internal.CreateExtProcChannel)\nimport _ \"google.golang.org/grpc/xds/httpfilter/extproc\" // ensures the dialer override is installed","handlingStrategy":"validation","validationCode":"// Verify the dialer override is installed before building extproc filters\n// (presence check: the default stub returns an error, so call it in a guarded init)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Link the extproc production dialer via blank import in binaries using extproc.","Inject a fake channel in tests by overriding internal.CreateExtProcChannel.","Disable extproc in xDS until the wiring is present."],"tags":["extproc","grpc","xds","not-implemented","go"],"analyzedSha":"03255a9237b6eb32710f6bc4f2de9a675b99fe36","analyzedAt":"2026-08-07T00:29:34.215Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}