diff --git a/app/middleware/traces_middleware.py b/app/middleware/traces_middleware.py index 32615c8bb2bce5ff9ddea15cab425783107964f1..4d5d353bfb1c258346df4506bf61de1f703129db 100644 --- a/app/middleware/traces_middleware.py +++ b/app/middleware/traces_middleware.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Any, Callable +from typing import Any, List from starlette.middleware.base import BaseHTTPMiddleware from starlette.requests import Request @@ -30,9 +30,10 @@ from app.helper.logger import get_logger class TracingMiddleware(BaseHTTPMiddleware): - def __init__(self, **kwargs): + def __init__(self, *, skip_for_path_suffix: List[str], **kwargs): super().__init__(**kwargs) self._trace_propagator = traces.get_trace_propagator() + self._skip_for_path_suffix = skip_for_path_suffix @staticmethod def _before_request(request: Request, tracer: open_tracer.Tracer): @@ -107,6 +108,9 @@ class TracingMiddleware(BaseHTTPMiddleware): attribute_value=response_content_length) async def dispatch(self, request: Request, call_next: Any) -> Response: + if request.url.path.endswith(tuple(self._skip_for_path_suffix)): + # early call_next and return if we want to skip the middleware behaviour + return await call_next(request) # Create tracing context, from headers if exists, else create a new one span_context = self._trace_propagator.from_headers(request.headers) @@ -133,6 +137,5 @@ class TracingMiddleware(BaseHTTPMiddleware): raise finally: status = response.status_code if response else HTTP_500_INTERNAL_SERVER_ERROR - if not request.url.path.endswith('healthz'): - get_logger().info(utils.process_message(request, status)) + get_logger().info(utils.process_message(request, status)) self._after_request(request, response, tracer) diff --git a/app/wdms_app.py b/app/wdms_app.py index 714668bef1d4f0751dde90126f7759c9839241c3..20fb17fb4dd206bafcb72d6aae76bc2fe429d53d 100644 --- a/app/wdms_app.py +++ b/app/wdms_app.py @@ -312,7 +312,7 @@ update_operation_ids(wdms_app) # order is last executed first -wdms_app.add_middleware(TracingMiddleware) +wdms_app.add_middleware(TracingMiddleware, skip_for_path_suffix=[r.path for r in probes.router.routes]) # must be added last to be executed first, it's responsible to clean and create WDMS Context wdms_app.add_middleware(CreateBasicContextMiddleware, config=Config, injector=app_injector) diff --git a/tests/unit/middleware/traces_middleware_test.py b/tests/unit/middleware/traces_middleware_test.py index 73847e5a1e71b0e1f244448fb121186323cadee4..4dc1c766f7791ef5c974ce398607be0003fa3a1c 100644 --- a/tests/unit/middleware/traces_middleware_test.py +++ b/tests/unit/middleware/traces_middleware_test.py @@ -16,6 +16,7 @@ import re from opencensus.trace import base_exporter import pytest from app.wdms_app import DDMS_V2_PATH +from app.routers import probes from ..test_utils import gen_all_routes_request @@ -146,7 +147,7 @@ def test_call_trace_url(app_configurable_with_testclient, mock_storage_client_ho "/docs", "/docs/oauth2-redirect", "/redoc", - ]: + ] + [r.path for r in probes.router.routes]: # we also need to exclude probes routes as they are not traced continue path_with_id = path_sub(path) diff --git a/tests/unit/probe_test.py b/tests/unit/probe_test.py deleted file mode 100644 index bc1d49b8727fb73f6278ea373393b587750769bc..0000000000000000000000000000000000000000 --- a/tests/unit/probe_test.py +++ /dev/null @@ -1,21 +0,0 @@ -import pytest -from fastapi.testclient import TestClient -from app.wdms_app import wdms_app -from tests.unit.test_utils import ctx_fixture -from app.helper import traces -wdms_app.trace_exporter = traces.CombinedExporter(service_name='tested-ddms') - -@pytest.fixture -def client(ctx_fixture, nope_logger_fixture): - yield TestClient(wdms_app) - wdms_app.dependency_overrides = {} - -@pytest.mark.parametrize("probe_url", [('/readiness'),('/healthz'),]) -def test_readiness_probe(client, probe_url): - response = client.get(probe_url) - response_json = response.json() - assert response.status_code == 200 - assert response_json == {'status': 'healthy'} - - - diff --git a/tests/unit/routers/probes_test.py b/tests/unit/routers/probes_test.py new file mode 100644 index 0000000000000000000000000000000000000000..22ce5127f1ecba4671efd80c9162d7b75f032e82 --- /dev/null +++ b/tests/unit/routers/probes_test.py @@ -0,0 +1,13 @@ +import pytest + + +@pytest.mark.parametrize("probe_path", ['/readiness', '/healthz', '/']) +def test_probe_request(app_configurable_with_testclient, probe_path, nope_logger_fixture): + app, client_after_startup = app_configurable_with_testclient() + + response = client_after_startup.get(probe_path) + response_json = response.json() + assert response.status_code == 200 + assert response_json == {'status': 'healthy'} + + nope_logger_fixture.info.assert_not_called()