@@ -96,7 +96,7 @@ def __init__(
9696
9797 self ._state = RecoverableState (
9898 default_state = state_model (stats_id = self ._id ),
99- persist_state_key = persist_state_key or f'SDK_CRAWLER_STATISTICS_ { self ._id } ' ,
99+ persist_state_key = persist_state_key or f'__CRAWLER_STATISTICS_ { self ._id } ' ,
100100 persistence_enabled = persistence_enabled ,
101101 persist_state_kvs_name = persist_state_kvs_name ,
102102 persist_state_kvs_factory = persist_state_kvs_factory ,
@@ -130,6 +130,7 @@ def with_default_state(
130130 persistence_enabled : bool = False ,
131131 persist_state_kvs_name : str | None = None ,
132132 persist_state_key : str | None = None ,
133+ persist_state_kvs_factory : Callable [[], Coroutine [None , None , KeyValueStore ]] | None = None ,
133134 log_message : str = 'Statistics' ,
134135 periodic_message_logger : Logger | None = None ,
135136 log_interval : timedelta = timedelta (minutes = 1 ),
@@ -141,6 +142,7 @@ def with_default_state(
141142 persistence_enabled = persistence_enabled ,
142143 persist_state_kvs_name = persist_state_kvs_name ,
143144 persist_state_key = persist_state_key ,
145+ persist_state_kvs_factory = persist_state_kvs_factory ,
144146 log_message = log_message ,
145147 periodic_message_logger = periodic_message_logger ,
146148 log_interval = log_interval ,
@@ -187,7 +189,10 @@ async def __aexit__(
187189 if not self ._active :
188190 raise RuntimeError (f'The { self .__class__ .__name__ } is not active.' )
189191
190- self ._state .current_value .crawler_finished_at = datetime .now (timezone .utc )
192+ if not self .state .crawler_last_started_at :
193+ raise RuntimeError ('Statistics.state.crawler_last_started_at not set.' )
194+ self .state .crawler_finished_at = datetime .now (timezone .utc )
195+ self .state .crawler_runtime += self .state .crawler_finished_at - self .state .crawler_last_started_at
191196
192197 await self ._state .teardown ()
193198
@@ -255,8 +260,7 @@ def calculate(self) -> FinalStatistics:
255260 if self ._instance_start is None :
256261 raise RuntimeError ('The Statistics object is not initialized' )
257262
258- crawler_runtime = datetime .now (timezone .utc ) - self ._instance_start
259- total_minutes = crawler_runtime .total_seconds () / 60
263+ total_minutes = self .state .crawler_runtime .total_seconds () / 60
260264 state = self ._state .current_value
261265 serialized_state = state .model_dump (by_alias = False )
262266
@@ -267,7 +271,7 @@ def calculate(self) -> FinalStatistics:
267271 requests_failed_per_minute = math .floor (state .requests_failed / total_minutes ) if total_minutes else 0 ,
268272 request_total_duration = state .request_total_finished_duration + state .request_total_failed_duration ,
269273 requests_total = state .requests_failed + state .requests_finished ,
270- crawler_runtime = crawler_runtime ,
274+ crawler_runtime = state . crawler_runtime ,
271275 requests_finished = state .requests_finished ,
272276 requests_failed = state .requests_failed ,
273277 retry_histogram = serialized_state ['request_retry_histogram' ],
0 commit comments