Visitar URL original
perf: Reduce online serving hot-path overhead from metrics and audit … · feast-dev/feast@63d9516 · GitHub
Skip to content

Commit 63d9516

Browse files
committed
perf: Reduce online serving hot-path overhead from metrics and audit logging
Signed-off-by: ntkathole <nikhilkathole2683@gmail.com>
1 parent d9ea120 commit 63d9516

3 files changed

Lines changed: 39 additions & 8 deletions

File tree

‎sdk/python/feast/feature_server.py‎

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,8 @@ def _emit_online_audit(
262262
latency_ms: float,
263263
):
264264
"""Best-effort audit log emission for online feature requests."""
265+
if not feast_metrics._config.audit_logging:
266+
return
265267
try:
266268
from feast.permissions.security_manager import get_security_manager
267269

@@ -686,9 +688,11 @@ async def get_online_features(request: GetOnlineFeaturesRequest) -> Any:
686688
include_feature_view_version_metadata=request.include_feature_view_version_metadata,
687689
)
688690

689-
audit_start_ms = time.monotonic() * 1000
691+
audit_start_ms = 0.0
690692
audit_status = "success"
691693
try:
694+
if feast_metrics._config.audit_logging:
695+
audit_start_ms = time.monotonic() * 1000
692696
if store._get_provider().async_supported.online.read:
693697
response = await store.get_online_features_async(**read_params) # type: ignore
694698
else:
@@ -699,10 +703,11 @@ async def get_online_features(request: GetOnlineFeaturesRequest) -> Any:
699703
audit_status = "error"
700704
raise
701705
finally:
702-
audit_latency_ms = time.monotonic() * 1000 - audit_start_ms
703-
_emit_online_audit(
704-
request, features, entity_count, audit_status, audit_latency_ms
705-
)
706+
if feast_metrics._config.audit_logging:
707+
audit_latency_ms = time.monotonic() * 1000 - audit_start_ms
708+
_emit_online_audit(
709+
request, features, entity_count, audit_status, audit_latency_ms
710+
)
706711

707712
response_dict = await run_in_threadpool(
708713
convert_response_to_dict, response.proto

‎sdk/python/feast/utils.py‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1829,6 +1829,7 @@ def _populate_response_from_feature_data(
18291829
feat_statuses = [[NOT_FOUND] * output_len for _ in range(n_features)]
18301830

18311831
feat_idx_map = {name: i for i, name in enumerate(requested_features)}
1832+
_present_count = 0
18321833
for row_idx, destinations in enumerate(indexes_tuple):
18331834
_, feature_data = read_rows[row_idx]
18341835
if feature_data is None:
@@ -1839,13 +1840,13 @@ def _populate_response_from_feature_data(
18391840
for out_idx in destinations:
18401841
feat_values[f_idx][out_idx] = feat_val
18411842
feat_statuses[f_idx][out_idx] = PRESENT
1843+
_present_count += 1
18421844

18431845
try:
18441846
from feast.metrics import track_feature_statuses
18451847

1846-
_present = sum(s == PRESENT for row in feat_statuses for s in row)
1847-
_not_found = (n_features * output_len) - _present
1848-
track_feature_statuses(table.name, _present, _not_found)
1848+
_not_found = (n_features * output_len) - _present_count
1849+
track_feature_statuses(table.name, _present_count, _not_found)
18491850
except Exception:
18501851
pass
18511852

‎sdk/python/tests/unit/test_metrics.py‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1847,6 +1847,31 @@ def test_strips_version_suffix(self):
18471847
class TestEmitOnlineAudit:
18481848
"""Tests for the _emit_online_audit helper in feature_server."""
18491849

1850+
def test_skips_when_audit_logging_disabled(self):
1851+
from feast.feature_server import GetOnlineFeaturesRequest, _emit_online_audit
1852+
1853+
request = GetOnlineFeaturesRequest(
1854+
entities={"driver_id": [1]},
1855+
features=["driver_fv:conv_rate"],
1856+
)
1857+
1858+
with (
1859+
patch("feast.feature_server.feast_metrics") as mock_metrics,
1860+
patch(
1861+
"feast.permissions.security_manager.get_security_manager",
1862+
) as mock_sm,
1863+
):
1864+
mock_metrics._config.audit_logging = False
1865+
_emit_online_audit(
1866+
request=request,
1867+
features=request.features,
1868+
entity_count=1,
1869+
status="success",
1870+
latency_ms=10.0,
1871+
)
1872+
mock_metrics.emit_online_audit_log.assert_not_called()
1873+
mock_sm.assert_not_called()
1874+
18501875
def test_emits_audit_log_with_anonymous_user(self):
18511876
from feast.feature_server import GetOnlineFeaturesRequest, _emit_online_audit
18521877

0 commit comments

Comments
 (0)