77 "github.com/feast-dev/feast/go/internal/feast"
88 "github.com/feast-dev/feast/go/internal/feast/model"
99 "github.com/feast-dev/feast/go/internal/feast/server/logging"
10+ "github.com/feast-dev/feast/go/protos/feast/serving"
1011 prototypes "github.com/feast-dev/feast/go/protos/feast/types"
12+ "github.com/feast-dev/feast/go/types"
1113 "net/http"
1214)
1315
@@ -152,6 +154,7 @@ func (s *httpServer) getOnlineFeatures(w http.ResponseWriter, r *http.Request) {
152154 featureService , err = s .fs .GetFeatureService (* request .FeatureService )
153155 if err != nil {
154156 http .Error (w , fmt .Sprintf ("Error getting feature service from registry: %+v" , err ), http .StatusInternalServerError )
157+ return
155158 }
156159 }
157160 entitiesProto := make (map [string ]* prototypes.RepeatedValue )
@@ -173,6 +176,7 @@ func (s *httpServer) getOnlineFeatures(w http.ResponseWriter, r *http.Request) {
173176
174177 if err != nil {
175178 http .Error (w , fmt .Sprintf ("Error getting feature vector: %+v" , err ), http .StatusInternalServerError )
179+ return
176180 }
177181
178182 var featureNames []string
@@ -209,9 +213,42 @@ func (s *httpServer) getOnlineFeatures(w http.ResponseWriter, r *http.Request) {
209213
210214 if err != nil {
211215 http .Error (w , fmt .Sprintf ("Error encoding response: %+v" , err ), http .StatusInternalServerError )
216+ return
212217 }
213218
214219 w .Header ().Set ("Content-Type" , "application/json" )
220+
221+ if featureService != nil && featureService .LoggingConfig != nil && s .loggingService != nil {
222+ logger , err := s .loggingService .GetOrCreateLogger (featureService )
223+ if err != nil {
224+ http .Error (w , fmt .Sprintf ("Couldn't instantiate logger for feature service %s: %+v" , featureService .Name , err ), http .StatusInternalServerError )
225+ return
226+ }
227+
228+ requestId := GenerateRequestId ()
229+
230+ // Note: we're converting arrow to proto for feature logging. In the future we should
231+ // base feature logging on arrow so that we don't have to do this extra conversion.
232+ var featureVectorProtos []* serving.GetOnlineFeaturesResponse_FeatureVector
233+ for _ , vector := range featureVectors [len (request .Entities ):] {
234+ values , err := types .ArrowValuesToProtoValues (vector .Values )
235+ if err != nil {
236+ http .Error (w , fmt .Sprintf ("Couldn't convert arrow values into protobuf: %+v" , err ), http .StatusInternalServerError )
237+ return
238+ }
239+ featureVectorProtos = append (featureVectorProtos , & serving.GetOnlineFeaturesResponse_FeatureVector {
240+ Values : values ,
241+ Statuses : vector .Statuses ,
242+ EventTimestamps : vector .Timestamps ,
243+ })
244+ }
245+
246+ err = logger .Log (entitiesProto , featureVectorProtos , featureNames , requestContextProto , requestId )
247+ if err != nil {
248+ http .Error (w , fmt .Sprintf ("LoggerImpl error[%s]: %+v" , featureService .Name , err ), http .StatusInternalServerError )
249+ return
250+ }
251+ }
215252}
216253
217254func (s * httpServer ) Serve (host string , port int ) error {
0 commit comments