From 2f3d2dc4805710afdc132ecb609fa2f28fdfe88a Mon Sep 17 00:00:00 2001 From: Viktor Barzin Date: Sun, 22 Feb 2026 13:27:11 +0000 Subject: [PATCH] Add Server-Timing header to streaming endpoint Reports cache_check latency in the response header, visible in browser DevTools Network tab for ongoing performance monitoring. --- api/app.py | 7 +++++++ tests/test_listing_geojson.py | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/api/app.py b/api/app.py index 5c1ead4..b91b73a 100644 --- a/api/app.py +++ b/api/app.py @@ -3,6 +3,7 @@ from datetime import datetime, timedelta import json import logging import logging.config +import time from typing import Annotated, AsyncGenerator, Optional from api.auth import get_current_user from api.config import DEV_TIER_ORIGINS, PROD_TIER_ORIGINS, APP_ENV @@ -456,10 +457,15 @@ async def stream_listing_geojson( else: limit = _rate_limit_config.geojson_stream_limit_cap + timings: list[str] = [] + # Build POI distances lookup if requested poi_distances_lookup = _build_poi_distances_lookup(user.email, query_parameters.listing_type) if include_poi_distances else None + t0 = time.monotonic() cached_count = get_cached_count(query_parameters) + timings.append(f"cache_check;dur={(time.monotonic() - t0) * 1000:.1f}") + if cached_count is not None and cached_count > 0 and not include_poi_distances: app_metrics.geojson_cache_operations.add(1, {"result": "hit"}) generator = _stream_from_cache( @@ -482,6 +488,7 @@ async def stream_listing_geojson( headers={ "Cache-Control": "no-cache", "X-Accel-Buffering": "no", # Disable nginx buffering + "Server-Timing": ", ".join(timings), } ) diff --git a/tests/test_listing_geojson.py b/tests/test_listing_geojson.py index 4b2cb20..7ad17db 100644 --- a/tests/test_listing_geojson.py +++ b/tests/test_listing_geojson.py @@ -355,4 +355,12 @@ class TestStreamingEndpoint: assert 2 not in feature_ids assert 1 in feature_ids + def test_streaming_includes_server_timing_header(self, client, mock_repository): + """Test that streaming response includes Server-Timing header.""" + response = client.get("/api/listing_geojson/stream?listing_type=RENT&limit=10") + assert response.status_code == 200 + assert "server-timing" in response.headers + assert "cache_check" in response.headers["server-timing"] + +