grpc/grpc-go · error

extproc: dialing external processor server not implemented

Error message

extproc: dialing external processor server not implemented

What it means

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.

Source

Thrown at internal/xds/httpfilter/extproc/internal/internal.go:49

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. Import/link the package that assigns internal.CreateExtProcChannel so a real gRPC channel is dialed.
  2. Disable the extproc filter in the xDS config until the wiring is present in the binary.
  3. In tests, override internal.CreateExtProcChannel with a stub returning an in-memory connection.

Example fix

// before: extproc configured in xDS but no dialer wired -> not implemented

// after: link the extproc production wiring (blank import / init that assigns internal.CreateExtProcChannel)
import _ "google.golang.org/grpc/xds/httpfilter/extproc" // ensures the dialer override is installed
Defensive patterns

Strategy: validation

Validate before calling

// Verify the dialer override is installed before building extproc filters
// (presence check: the default stub returns an error, so call it in a guarded init)

Prevention

When it happens

Trigger: The extproc filter tries to build a client channel to the external processor while internal.CreateExtProcChannel is still the default stub.

Common situations: 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.

Related errors


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