From ee576eadf75244860fdb232c91b5940eda53fa99 Mon Sep 17 00:00:00 2001 From: Vlada Dusek Date: Fri, 30 Jan 2026 14:52:38 +0100 Subject: [PATCH 1/2] fix: Use max() instead of min() for request_max_duration statistic The statistics tracking for maximum request duration was incorrectly using min() instead of max(), causing the statistic to always show the minimum duration instead of the maximum. Co-Authored-By: Claude Opus 4.5 --- src/crawlee/statistics/_statistics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/crawlee/statistics/_statistics.py b/src/crawlee/statistics/_statistics.py index 51735b0056..3d568fdda2 100644 --- a/src/crawlee/statistics/_statistics.py +++ b/src/crawlee/statistics/_statistics.py @@ -234,7 +234,7 @@ def record_request_processing_finish(self, request_id_or_key: str) -> None: state.request_min_duration = min( state.request_min_duration if state.request_min_duration is not None else timedelta.max, duration ) - state.request_max_duration = min( + state.request_max_duration = max( state.request_max_duration if state.request_max_duration is not None else timedelta(), duration ) From e137730251413a30e6d947a4460c59623dc6f963 Mon Sep 17 00:00:00 2001 From: Vlada Dusek Date: Fri, 30 Jan 2026 15:16:34 +0100 Subject: [PATCH 2/2] test: Add unit test for request_max_duration tracking Verify that request_max_duration correctly tracks the maximum duration across multiple requests, ensuring it increases for longer requests but doesn't decrease when shorter requests are recorded. Co-Authored-By: Claude Opus 4.5 --- .../_statistics/test_request_max_duration.py | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 tests/unit/_statistics/test_request_max_duration.py diff --git a/tests/unit/_statistics/test_request_max_duration.py b/tests/unit/_statistics/test_request_max_duration.py new file mode 100644 index 0000000000..be449897d4 --- /dev/null +++ b/tests/unit/_statistics/test_request_max_duration.py @@ -0,0 +1,34 @@ +from __future__ import annotations + +import asyncio + +from crawlee.statistics import Statistics + + +async def test_request_max_duration_tracks_maximum() -> None: + """Test that request_max_duration correctly tracks the maximum duration, not the minimum.""" + async with Statistics.with_default_state() as statistics: + # Record a short request + statistics.record_request_processing_start('request_1') + statistics.record_request_processing_finish('request_1') + first_duration = statistics.state.request_max_duration + + # Record a longer request + statistics.record_request_processing_start('request_2') + await asyncio.sleep(0.05) # 50ms delay + statistics.record_request_processing_finish('request_2') + second_duration = statistics.state.request_max_duration + + # The max duration should be updated to the longer request's duration + assert second_duration is not None + assert first_duration is not None + assert second_duration >= first_duration + assert second_duration.total_seconds() >= 0.05 + + # Record another short request - max should NOT decrease + statistics.record_request_processing_start('request_3') + statistics.record_request_processing_finish('request_3') + third_duration = statistics.state.request_max_duration + + # The max duration should remain unchanged (still the longest request) + assert third_duration == second_duration