(request: GetOnlineFeaturesRequest)
| 415 | response_model=OnlineFeaturesResponse, |
| 416 | ) |
| 417 | async def get_online_features(request: GetOnlineFeaturesRequest) -> Any: |
| 418 | with feast_metrics.track_request_latency( |
| 419 | "/get-online-features", |
| 420 | ) as metrics_ctx: |
| 421 | features = await _get_features(request, store) |
| 422 | feat_count, fv_count = _resolve_feature_counts(features) |
| 423 | metrics_ctx.feature_count = feat_count |
| 424 | metrics_ctx.feature_view_count = fv_count |
| 425 | |
| 426 | entity_count = len(next(iter(request.entities.values()), [])) |
| 427 | feast_metrics.track_online_features_entities(entity_count) |
| 428 | |
| 429 | read_params = dict( |
| 430 | features=features, |
| 431 | entity_rows=request.entities, |
| 432 | full_feature_names=request.full_feature_names, |
| 433 | include_feature_view_version_metadata=request.include_feature_view_version_metadata, |
| 434 | ) |
| 435 | |
| 436 | audit_start_ms = time.monotonic() * 1000 |
| 437 | audit_status = "success" |
| 438 | try: |
| 439 | if store._get_provider().async_supported.online.read: |
| 440 | response = await store.get_online_features_async(**read_params) # type: ignore |
| 441 | else: |
| 442 | response = await run_in_threadpool( |
| 443 | lambda: store.get_online_features(**read_params) # type: ignore |
| 444 | ) |
| 445 | except Exception: |
| 446 | audit_status = "error" |
| 447 | raise |
| 448 | finally: |
| 449 | audit_latency_ms = time.monotonic() * 1000 - audit_start_ms |
| 450 | _emit_online_audit( |
| 451 | request, features, entity_count, audit_status, audit_latency_ms |
| 452 | ) |
| 453 | |
| 454 | response_dict = await run_in_threadpool( |
| 455 | convert_response_to_dict, response.proto |
| 456 | ) |
| 457 | return JSONResponse(content=response_dict) |
| 458 | |
| 459 | @app.post( |
| 460 | "/retrieve-online-documents", |
nothing calls this directly
no test coverage detected