@@ -26,6 +26,7 @@ import (
2626	extProcPb "github.com/envoyproxy/go-control-plane/envoy/service/ext_proc/v3" 
2727	envoyTypePb "github.com/envoyproxy/go-control-plane/envoy/type/v3" 
2828	"github.com/go-logr/logr" 
29+ 	"github.com/google/uuid" 
2930	"google.golang.org/grpc/codes" 
3031	"google.golang.org/grpc/status" 
3132	"sigs.k8s.io/controller-runtime/pkg/log" 
@@ -186,11 +187,18 @@ func (s *StreamingServer) Process(srv extProcPb.ExternalProcessor_ProcessServer)
186187
187188		switch  v  :=  req .Request .(type ) {
188189		case  * extProcPb.ProcessingRequest_RequestHeaders :
189- 			if  requestID  :=  requtil .ExtractHeaderValue (v , requtil .RequestIdHeaderKey ); len (requestID ) >  0  {
190- 				logger  =  logger .WithValues (requtil .RequestIdHeaderKey , requestID )
191- 				loggerTrace  =  logger .V (logutil .TRACE )
192- 				ctx  =  log .IntoContext (ctx , logger )
190+ 			requestID  :=  requtil .ExtractHeaderValue (v , requtil .RequestIdHeaderKey )
191+ 			// request ID is a must for maintaining a state per request in plugins that hold internal state and use PluginState. 
192+ 			// if request id was not supplied as a header, we generate it oursleves. 
193+ 			if  len (requestID ) ==  0  {
194+ 				requestID  =  uuid .NewString ()
195+ 				loggerTrace .Info ("RequestID header is not found in the request, generated a request id" )
196+ 				reqCtx .Request .Headers [requtil .RequestIdHeaderKey ] =  requestID  // update in headers so director can consume it 
193197			}
198+ 			logger  =  logger .WithValues (requtil .RequestIdHeaderKey , requestID )
199+ 			loggerTrace  =  logger .V (logutil .TRACE )
200+ 			ctx  =  log .IntoContext (ctx , logger )
201+ 
194202			err  =  s .HandleRequestHeaders (reqCtx , v )
195203		case  * extProcPb.ProcessingRequest_RequestBody :
196204			loggerTrace .Info ("Incoming body chunk" , "EoS" , v .RequestBody .EndOfStream )
0 commit comments