Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions docs/reference/alpha-web-ui.md
Original file line number Diff line number Diff line change
Expand Up @@ -153,3 +153,12 @@ const tabsRegistry = {
```

Examples of custom tabs can be found in the `ui/custom-tabs` folder.

## Refreshing the registry

The Feast UI caches registry data (projects, feature views, entities, etc.) using the registry cache. After running `feast apply` to make changes, it may take up to `cache_ttl_seconds` before the updates appear in the UI.

To see changes faster:

- **Lower the TTL**: Set `cache_ttl_seconds: 10` (or similar) in your `feature_store.yaml` registry config. This makes all registry consumers — including the UI — pick up changes within 10 seconds.
- **Refresh on demand**: The UI has a **Refresh** button that explicitly invalidates the server-side registry cache (`POST /api/v1/registry/refresh`) and reloads the UI without a full page refresh.
5 changes: 4 additions & 1 deletion sdk/python/feast/api/registry/rest/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from feast.api.registry.rest.metrics import get_metrics_router
from feast.api.registry.rest.monitoring import get_monitoring_router
from feast.api.registry.rest.permissions import get_permission_router
from feast.api.registry.rest.projects import get_project_router
from feast.api.registry.rest.projects import get_project_router, get_registry_router
from feast.api.registry.rest.saved_datasets import get_saved_dataset_router
from feast.api.registry.rest.search import get_search_router

Expand Down Expand Up @@ -44,6 +44,9 @@ def register_all_routes(app: FastAPI, grpc_handler, server=None, store=None):
app.include_router(get_monitoring_router(grpc_handler, store=resolved_store))
app.include_router(get_compute_engine_router(grpc_handler, store=resolved_store))

if resolved_store:
app.include_router(get_registry_router(resolved_store))

_register_openlineage_consumer(app, resolved_store)


Expand Down
18 changes: 17 additions & 1 deletion sdk/python/feast/api/registry/rest/projects.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from fastapi import APIRouter, Depends, Query
from fastapi import APIRouter, Depends, Query, Response, status

from feast.api.registry.rest.rest_utils import (
get_pagination_params,
Expand Down Expand Up @@ -50,3 +50,19 @@ def list_projects(
}

return router


def get_registry_router(store) -> APIRouter:
router = APIRouter()

@router.post("/registry/refresh")
def refresh_registry():
from feast.permissions.action import AuthzedAction
from feast.permissions.security_manager import assert_permissions

project = store.registry.get_project(name=store.project, allow_cache=True)
assert_permissions(resource=project, actions=[AuthzedAction.UPDATE])
store.refresh_registry()
return Response(status_code=status.HTTP_200_OK)

return router
Loading
Loading