@@ -1375,12 +1375,12 @@ def prefetch_realtime_quotes(self, stock_codes: List[str]) -> int:
13751375
13761376 # Issue #455: PREFETCH_REALTIME_QUOTES=false 可禁用预取,避免全市场拉取
13771377 if not getattr (config , "prefetch_realtime_quotes" , True ):
1378- logger .debug ("[预取] PREFETCH_REALTIME_QUOTES=false,跳过批量预取 " )
1378+ logger .debug ("[预取] component=realtime_prefetch action=skip reason=disabled " )
13791379 return 0
13801380
13811381 # 如果实时行情被禁用,跳过预取
13821382 if not config .enable_realtime_quote :
1383- logger .debug ("[预取] 实时行情功能已禁用,跳过预取 " )
1383+ logger .debug ("[预取] component=realtime_prefetch action=skip reason=realtime_quote_disabled " )
13841384 return 0
13851385
13861386 # 检查优先级中是否包含全量拉取数据源
@@ -1400,15 +1400,29 @@ def prefetch_realtime_quotes(self, stock_codes: List[str]) -> int:
14001400
14011401 # 如果没有全量数据源,或者全量数据源排在第 3 位之后,跳过预取
14021402 if first_bulk_source_index is None or first_bulk_source_index >= 2 :
1403- logger .info (f"[预取] 当前优先级使用轻量级数据源(sina/tencent),无需预取" )
1403+ logger .info (
1404+ "[预取] component=realtime_prefetch action=skip reason=no_early_bulk_source priority=%s" ,
1405+ priority ,
1406+ )
14041407 return 0
14051408
14061409 # 如果股票数量少于 5 个,不进行批量预取(逐个查询更高效)
14071410 if len (stock_codes ) < 5 :
1408- logger .info (f"[预取] 股票数量 { len (stock_codes )} < 5,跳过批量预取" )
1411+ logger .info (
1412+ "[预取] component=realtime_prefetch action=skip reason=small_batch "
1413+ "stock_count=%d threshold=5 bulk_source=%s" ,
1414+ len (stock_codes ),
1415+ priority_list [first_bulk_source_index ],
1416+ )
14091417 return 0
14101418
1411- logger .info (f"[预取] 开始批量预取实时行情,共 { len (stock_codes )} 只股票..." )
1419+ bulk_source = priority_list [first_bulk_source_index ]
1420+ logger .info (
1421+ "[预取] component=realtime_prefetch action=start stock_count=%d bulk_source=%s first_code=%s" ,
1422+ len (stock_codes ),
1423+ bulk_source ,
1424+ stock_codes [0 ],
1425+ )
14121426
14131427 # 尝试通过 efinance 或 akshare 预取
14141428 # 只需要调用一次 get_realtime_quote,缓存机制会自动拉取全市场数据
@@ -1418,14 +1432,30 @@ def prefetch_realtime_quotes(self, stock_codes: List[str]) -> int:
14181432 quote = self .get_realtime_quote (first_code )
14191433
14201434 if quote :
1421- logger .info (f"[预取] 批量预取完成,缓存已填充" )
1435+ logger .info (
1436+ "[预取] component=realtime_prefetch action=complete status=success "
1437+ "stock_count=%d bulk_source=%s" ,
1438+ len (stock_codes ),
1439+ bulk_source ,
1440+ )
14221441 return len (stock_codes )
14231442 else :
1424- logger .warning (f"[预取] 批量预取失败,将使用逐个查询模式" )
1443+ logger .warning (
1444+ "[预取] component=realtime_prefetch action=complete status=failed "
1445+ "stock_count=%d bulk_source=%s fallback=per_stock" ,
1446+ len (stock_codes ),
1447+ bulk_source ,
1448+ )
14251449 return 0
14261450
14271451 except Exception as e :
1428- logger .error (f"[预取] 批量预取异常: { e } " )
1452+ logger .error (
1453+ "[预取] component=realtime_prefetch action=complete status=error "
1454+ "stock_count=%d bulk_source=%s error=%s" ,
1455+ len (stock_codes ),
1456+ bulk_source ,
1457+ e ,
1458+ )
14291459 return 0
14301460
14311461 @staticmethod
@@ -2116,27 +2146,72 @@ def get_main_indices(self, region: str = "cn") -> List[Dict[str, Any]]:
21162146 continue
21172147 return []
21182148
2119- def get_market_stats (self ) -> Dict [str , Any ]:
2149+ def get_market_stats (self , * , purpose : str = "unspecified" ) -> Dict [str , Any ]:
21202150 """获取市场涨跌统计(自动切换数据源)"""
2151+ logger .info ("[MarketStats] component=market_stats action=start purpose=%s" , purpose )
21212152 tickflow_fetcher = self ._get_tickflow_fetcher ()
21222153 if tickflow_fetcher is not None :
2154+ started_at = time .monotonic ()
21232155 try :
21242156 data = tickflow_fetcher .get_market_stats ()
2157+ elapsed = time .monotonic () - started_at
21252158 if data :
2126- logger .info ("[TickFlowFetcher] 获取市场统计成功" )
2159+ logger .info (
2160+ "[MarketStats] component=market_stats action=provider_success "
2161+ "purpose=%s provider=TickFlowFetcher elapsed=%.2fs" ,
2162+ purpose ,
2163+ elapsed ,
2164+ )
21272165 return data
2166+ logger .info (
2167+ "[MarketStats] component=market_stats action=provider_empty "
2168+ "purpose=%s provider=TickFlowFetcher elapsed=%.2fs" ,
2169+ purpose ,
2170+ elapsed ,
2171+ )
21282172 except Exception as e :
2129- logger .warning (f"[TickFlowFetcher] 获取市场统计失败: { e } " )
2173+ elapsed = time .monotonic () - started_at
2174+ logger .warning (
2175+ "[MarketStats] component=market_stats action=provider_failed "
2176+ "purpose=%s provider=TickFlowFetcher elapsed=%.2fs error=%s" ,
2177+ purpose ,
2178+ elapsed ,
2179+ e ,
2180+ )
21302181
21312182 for fetcher in self ._fetchers :
2183+ started_at = time .monotonic ()
21322184 try :
21332185 data = fetcher .get_market_stats ()
2186+ elapsed = time .monotonic () - started_at
21342187 if data :
2135- logger .info (f"[{ fetcher .name } ] 获取市场统计成功" )
2188+ logger .info (
2189+ "[MarketStats] component=market_stats action=provider_success "
2190+ "purpose=%s provider=%s elapsed=%.2fs" ,
2191+ purpose ,
2192+ fetcher .name ,
2193+ elapsed ,
2194+ )
21362195 return data
2196+ logger .info (
2197+ "[MarketStats] component=market_stats action=provider_empty "
2198+ "purpose=%s provider=%s elapsed=%.2fs" ,
2199+ purpose ,
2200+ fetcher .name ,
2201+ elapsed ,
2202+ )
21372203 except Exception as e :
2138- logger .warning (f"[{ fetcher .name } ] 获取市场统计失败: { e } " )
2204+ elapsed = time .monotonic () - started_at
2205+ logger .warning (
2206+ "[MarketStats] component=market_stats action=provider_failed "
2207+ "purpose=%s provider=%s elapsed=%.2fs error=%s" ,
2208+ purpose ,
2209+ fetcher .name ,
2210+ elapsed ,
2211+ e ,
2212+ )
21392213 continue
2214+ logger .warning ("[MarketStats] component=market_stats action=complete status=empty purpose=%s" , purpose )
21402215 return {}
21412216
21422217 def _run_with_timeout (
0 commit comments