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

  1. Ensure the production extproc wiring package (the one that assigns internal.ParseGRPCServiceConfig) is imported/blank-imported by your binary.
  2. Do not construct extproc filters from a context that skips the standard xDS bootstrap that registers the real implementation.
  3. 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

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


AI-assisted analysis of grpc/grpc-go@03255a9237 (2026-08-07). Data as JSON: /api/errors/c605d80ac10dd641. Report an issue: GitHub.