@@ -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__ }  )
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