mirror of
https://github.com/shy3130/tick-stock-panel.git
synced 2026-11-02 10:26:13 +00:00
feat(data): 数据源偏好回退 tickflow 时告警留痕
7 个 provider getter (daily/adj_factor/minute/full_minute/depth5/ realtime/financial) 白名单不命中时一律静默回退 tickflow — 配置的源 失效后行为悄悄变免费档, 用户与排查者均无感知 (fuyao 事件定位难点)。 统一走 _validated_provider: 回退即 logger.warning 带偏好键/原值/可用列表。 Signed-off-by: shy3130 <shy3130@qq.com>
This commit is contained in:
@@ -311,40 +311,54 @@ def _allowed_data_providers() -> set[str]:
|
||||
return set(_ALLOWED_DATA_PROVIDERS)
|
||||
|
||||
|
||||
def _validated_provider(raw: str, pref_key: str) -> str:
|
||||
"""数据源偏好白名单校验。非法/已卸载的源回退 tickflow 并告警。
|
||||
|
||||
静默回退曾让「配了 fuyao 却全程走免费档」无从排查 (fuyao 事件的
|
||||
定位难点之一): 回退必须留痕。
|
||||
"""
|
||||
if raw in _allowed_data_providers():
|
||||
return raw
|
||||
logger.warning(
|
||||
"数据源偏好 %s=%r 不在可用列表 %s, 回退 tickflow",
|
||||
pref_key, raw, sorted(_allowed_data_providers()))
|
||||
return "tickflow"
|
||||
|
||||
|
||||
def get_daily_data_provider() -> str:
|
||||
provider = str(load().get("daily_data_provider", "tickflow") or "tickflow").lower()
|
||||
return provider if provider in _allowed_data_providers() else "tickflow"
|
||||
return _validated_provider(provider, "daily_data_provider")
|
||||
|
||||
|
||||
def get_adj_factor_provider() -> str:
|
||||
# 「跟随日K」(same_as_daily) 特殊值已下线: 存量配置里的旧值按非法值回退 tickflow
|
||||
provider = str(load().get("adj_factor_provider", "tickflow") or "tickflow").lower()
|
||||
return provider if provider in _allowed_data_providers() else "tickflow"
|
||||
return _validated_provider(provider, "adj_factor_provider")
|
||||
|
||||
|
||||
def get_minute_data_provider() -> str:
|
||||
provider = str(load().get("minute_data_provider", "tickflow") or "tickflow").lower()
|
||||
return provider if provider in _allowed_data_providers() else "tickflow"
|
||||
return _validated_provider(provider, "minute_data_provider")
|
||||
|
||||
|
||||
def get_full_minute_data_provider() -> str:
|
||||
provider = str(load().get("full_minute_data_provider", "tickflow") or "tickflow").lower()
|
||||
return provider if provider in _allowed_data_providers() else "tickflow"
|
||||
return _validated_provider(provider, "full_minute_data_provider")
|
||||
|
||||
|
||||
def get_depth5_data_provider() -> str:
|
||||
provider = str(load().get("depth5_data_provider", "tickflow") or "tickflow").lower()
|
||||
return provider if provider in _allowed_data_providers() else "tickflow"
|
||||
return _validated_provider(provider, "depth5_data_provider")
|
||||
|
||||
|
||||
def get_realtime_data_provider() -> str:
|
||||
provider = str(load().get("realtime_data_provider", "tickflow") or "tickflow").lower()
|
||||
return provider if provider in _allowed_data_providers() else "tickflow"
|
||||
return _validated_provider(provider, "realtime_data_provider")
|
||||
|
||||
|
||||
def get_financial_provider() -> str:
|
||||
provider = str(load().get("financial_data_provider", "tickflow") or "tickflow").lower()
|
||||
return provider if provider in _allowed_data_providers() else "tickflow"
|
||||
return _validated_provider(provider, "financial_data_provider")
|
||||
|
||||
|
||||
# ===== 盘后管道拉取内容开关 (A股 / ETF / 指数 独立控制) =====
|
||||
|
||||
Reference in New Issue
Block a user