在前后端开发联调前 的提交20260223
This commit is contained in:
72
scripts/ops/analyze_v8_summary.py
Normal file
72
scripts/ops/analyze_v8_summary.py
Normal file
@@ -0,0 +1,72 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""提取 v8 的 DWD_LOAD_FROM_ODS 完成统计和所有任务最终状态。"""
|
||||
import json
|
||||
import re
|
||||
from pathlib import Path
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv(Path(__file__).resolve().parents[2] / ".env")
|
||||
from _env_paths import get_output_path
|
||||
|
||||
log_dir = get_output_path("SYSTEM_LOG_ROOT")
|
||||
raw = json.loads((log_dir / "2026-02-21__etl_run_raw_v8.json").read_text("utf-8"))
|
||||
|
||||
error_log = raw.get("error_log", "")
|
||||
output_log = raw.get("output_log", "")
|
||||
full = output_log + "\n" + error_log
|
||||
|
||||
# 提取 DWD_LOAD_FROM_ODS 完成行
|
||||
for line in full.split("\n"):
|
||||
if "DWD_LOAD_FROM_ODS: 完成" in line:
|
||||
# 解析 JSON 部分
|
||||
idx = line.find("统计=")
|
||||
if idx >= 0:
|
||||
stats_str = line[idx + len("统计="):]
|
||||
# 尝试解析为 Python dict
|
||||
try:
|
||||
stats = eval(stats_str)
|
||||
print("=== DWD_LOAD_FROM_ODS 统计 ===")
|
||||
for t in stats.get("tables", []):
|
||||
icon = "✅" if t.get("inserted", 0) + t.get("updated", 0) > 0 or t.get("processed", 0) > 0 else "⚪"
|
||||
print(f" {icon} {t['table']} | mode={t.get('mode','?')} | processed={t.get('processed',0)} ins={t.get('inserted',0)} upd={t.get('updated',0)} skip={t.get('skipped',0)}")
|
||||
errors = stats.get("errors", [])
|
||||
if errors:
|
||||
print(f"\n 错误 ({len(errors)} 个):")
|
||||
for e in errors:
|
||||
print(f" ❌ {e.get('table','?')}: {str(e.get('error',''))[:100]}")
|
||||
except Exception as ex:
|
||||
print(f"解析失败: {ex}")
|
||||
print(stats_str[:500])
|
||||
break
|
||||
|
||||
# 查找所有任务的最终状态(从 output_log 中找"所有任务执行完成"之前的状态)
|
||||
print("\n=== 任务执行顺序与状态 ===")
|
||||
task_status = {}
|
||||
for line in full.split("\n"):
|
||||
m = re.search(r"任务\s+(\S+)\s+执行成功", line)
|
||||
if m:
|
||||
task_status[m.group(1)] = "✅ 成功"
|
||||
m = re.search(r"任务\s+(\S+)\s+失败", line)
|
||||
if m and m.group(1) not in task_status:
|
||||
task_status[m.group(1)] = "❌ 失败"
|
||||
|
||||
# 预期任务列表
|
||||
expected = [
|
||||
"ODS_FETCH", "DWD_LOAD_FROM_ODS",
|
||||
"DWS_ASSISTANT_DAILY", "DWS_ASSISTANT_MONTHLY",
|
||||
"DWS_ASSISTANT_CUSTOMER", "DWS_ASSISTANT_SALARY",
|
||||
"DWS_ASSISTANT_FINANCE",
|
||||
"DWS_MEMBER_CONSUMPTION", "DWS_MEMBER_VISIT",
|
||||
"DWS_GOODS_STOCK_DAILY", "DWS_GOODS_STOCK_WEEKLY", "DWS_GOODS_STOCK_MONTHLY",
|
||||
"DWS_FINANCE_DAILY", "DWS_FINANCE_RECHARGE",
|
||||
"DWS_FINANCE_INCOME_STRUCTURE", "DWS_FINANCE_DISCOUNT_DETAIL",
|
||||
"DWS_WINBACK_INDEX", "DWS_NEWCONV_INDEX", "DWS_RELATION_INDEX",
|
||||
]
|
||||
|
||||
for t in expected:
|
||||
status = task_status.get(t, "⚪ 未知")
|
||||
print(f" {status} — {t}")
|
||||
|
||||
s_count = sum(1 for v in task_status.values() if "成功" in v)
|
||||
f_count = sum(1 for v in task_status.values() if "失败" in v)
|
||||
print(f"\n合计: {s_count} 成功, {f_count} 失败, {len(expected) - s_count - f_count} 未知")
|
||||
Reference in New Issue
Block a user