grpc/grpc-go · error
extproc: ParseGRPCServiceConfig not implemented
Error message
extproc: ParseGRPCServiceConfig not implemented
What it means
internal.ParseGRPCServiceConfig is a package-level function variable whose default implementation returns 'not implemented' (internal.go:42). It is an internal override point meant to be assigned by the production wiring of the extproc filter. If you reach this code path without that override being installed, the extproc gRPC-service-config parsing is unavailable.
Source
Thrown at internal/xds/httpfilter/extproc/internal/internal.go:43
v3corepb "github.com/envoyproxy/go-control-plane/envoy/config/core/v3"
"google.golang.org/grpc"
"google.golang.org/grpc/internal/xds/xdsclient/xdsresource"
)
var (
// RegisterForTesting registers the external processor HTTP Filter for testing
// purposes.
RegisterForTesting func()
// UnregisterForTesting unregisters the external processor HTTP Filter for
// testing purposes.
UnregisterForTesting func()
// ParseGRPCServiceConfig parses the gRPC service configuration from the given
// protobuf message.
ParseGRPCServiceConfig = func(*v3corepb.GrpcService) (xdsresource.GRPCServiceConfig, error) {
return xdsresource.GRPCServiceConfig{}, fmt.Errorf("extproc: ParseGRPCServiceConfig not implemented")
}
// CreateExtProcChannel creates a gRPC client channel to the external
// processing server.
CreateExtProcChannel = func(xdsresource.GRPCServiceConfig) (grpc.ClientConnInterface, func() error, error) {
return nil, nil, fmt.Errorf("extproc: dialing external processor server not implemented")
}
// TimeNowFunc returns the current time.Time, and can be overridden for
// testing purposes.
TimeNowFunc func() time.Time
// TimeSinceFunc returns the time elapsed, and can be overridden for testing
// purposes.
TimeSinceFunc func(t time.Time) time.Duration
)
View on GitHub (pinned to 03255a9237)
Solutions
- Ensure the production extproc wiring package (the one that assigns internal.ParseGRPCServiceConfig) is imported/blank-imported by your binary.
- Do not construct extproc filters from a context that skips the standard xDS bootstrap that registers the real implementation.
- If this is a test, inject a test override that returns a valid GRPCServiceConfig.
Example fix
// before: extproc used without the wiring package imported -> ParseGRPCServiceConfig returns not implemented // after: blank-import the package that installs the real override import _ "google.golang.org/grpc/xds/httpfilter/extproc" // or the wiring entry point in your build
Defensive patterns
Strategy: validation
Validate before calling
// Verify the override is wired before using extproc
if internal.ParseGRPCServiceConfig == nil || fmt.Sprint(internal.ParseGRPCServiceConfig) == "" {
// ensure the wiring package is imported
} Prevention
- Blank-import the extproc wiring package in every binary that uses extproc via xDS.
- In tests, override internal.ParseGRPCServiceConfig with a fake rather than relying on the stub.
- Fail fast at startup if extproc is configured but the override is the default stub.
When it happens
Trigger: The extproc filter attempts to parse a GrpcService config from xDS while internal.ParseGRPCServiceConfig still points at the default stub (no production assignment has run).
Common situations: Using extproc in a build/test context that does not import the package that wires the real implementation; calling extproc internals directly in a unit test; extproc feature not yet linked into the binary.
Related errors
- extproc: dialing external processor server not implemented
- external processor unexpectedly sent duplicate response trai
- external processor returned unexpected status %v for body re
- external processor returned invalid body mutation in body re
- external processor returned compressed grpc message which is
AI-assisted analysis of grpc/grpc-go@03255a9237 (2026-08-07).
Data as JSON: /api/errors/c605d80ac10dd641.
Report an issue: GitHub.