Files
MoFin/archive/hermes-dead-tools-20260820/analyze_health.py
T
xxm c68f987653 chore(cleansweep): 代码大扫除——归档hermes 111个死工具+4个废弃scanner,收敛MoFin/scripts重复副本,删除根旧版mo_models
- archive/hermes-dead-tools-20260820/: hermes独有不在cron不被import的111个一次性排查/测试工具
- archive/hermes-dead-tools-20260820/: 4个废弃scanner(btd1_v3/market_scanner/market_thermometer已废弃/s2v2)
- archive/legacy-cleanup-20260820/: MoFin根2旧版(mo_models/technical_analysis)+/home/hmo/scripts无引用旧项目+MoFin/scripts重复prepare_report_data
- 删除MoFin根mo_models.py(根旧版,deploy/profile-scripts权威保留)
- 保留: mofin_db.py/mo_data.py硬链接(server.py多层sys.path需各目录访问同一inode,非冗余)
- fix_gateway.py保留(Gateway看门狗fix_gateway_port.py的活跃依赖,勿误删)
- 验证: cron所有脚本引用无缺失, key模块import正常
- hermes独有从116收敛到5核心(alert_logger/market_screener/prepare_report_data/self_todo_executor_v2/xmpp_zhiwei_bot)
2026-08-20 10:36:25 +08:00

45 lines
1.7 KiB
Python

import json
d = json.load(open('/tmp/mofin_health.json'))
print("generated_at:", d.get('generated_at'))
print()
# 1. Pipelines with error/warn status
print("=== PIPELINES (error/warn) ===")
for p in d.get('pipelines', []):
if p.get('status') in ('error', 'fail', 'warn'):
print(f"[{p['status']}] {p.get('name') or p.get('script')} | profile={p.get('profile')} | type={p.get('type')} | schedule={p.get('schedule')} | last_run={p.get('last_run')}")
print()
print("=== FEATURE TREE (non-ok nodes) ===")
def walk(n, path=''):
label = n.get('label', '?')
p = f"{path}/{label}"
if n.get('status') not in ('ok', None):
print(f"[{n.get('status')}] {p}")
for pipe in n.get('pipes', []):
if pipe.get('status') != 'ok':
print(f" pipe: [{pipe.get('status')}] {pipe.get('name') or pipe.get('script')} | last_run={pipe.get('last_run')}")
for c in n.get('children', []):
walk(c, p)
walk(d.get('feature_tree', {}))
print()
print("=== DATA ENTITIES (orphan/write_only) ===")
for e in d.get('entities', []):
if e.get('flow_status') in ('orphan', 'write_only'):
print(f"[{e['flow_status']}] {e['name']} | rows={e.get('rows')} | writers={e.get('writers')} | readers={e.get('readers')} | {e.get('desc','')[:60]}")
print()
print("=== ARCHITECTURE violations ===")
arch = d.get('architecture', {})
print("violation_count:", arch.get('violation_count'))
for v in (arch.get('price_api_violations') or [])[:10]:
print(f" {v.get('script')} L{v.get('line')}")
print()
print("=== JSON files with warn ===")
for j in d.get('json_files', []):
if j.get('warn'):
print(f"[warn] {j['name']} | {j.get('desc','')[:60]} | readers={j.get('readers')}")