64 lines
2.0 KiB
Python
64 lines
2.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""分析第四次执行结果。"""
|
|
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_root = get_output_path("SYSTEM_LOG_ROOT")
|
|
raw = json.loads((log_root / "2026-02-21__etl_run_raw_v4.json").read_text(encoding="utf-8"))
|
|
|
|
error_log = raw.get("error_log", "")
|
|
lines = error_log.split("\n")
|
|
|
|
# 提取任务列表
|
|
task_list_match = re.search(r"开始运行任务: \[([^\]]+)\]", error_log)
|
|
if task_list_match:
|
|
tasks = [t.strip().strip("'") for t in task_list_match.group(1).split(",")]
|
|
print(f"总任务数: {len(tasks)}")
|
|
|
|
# 分析每个任务的结果
|
|
success_tasks = []
|
|
failed_tasks = []
|
|
|
|
for task in tasks:
|
|
# 检查是否有"完成"标记
|
|
completed = re.search(rf"{task}: 完成,统计=", error_log) or \
|
|
re.search(rf"{task}: 完成, 统计=", error_log) or \
|
|
re.search(rf"{task} ODS 任务完成:", error_log) or \
|
|
re.search(rf"{task}: 工具类任务执行成功", error_log)
|
|
failed = re.search(rf"任务 {task} 失败: (.+?)(?:\\n|$)", error_log)
|
|
|
|
if completed and not failed:
|
|
success_tasks.append(task)
|
|
elif failed:
|
|
err_msg = failed.group(1)[:120]
|
|
failed_tasks.append((task, err_msg))
|
|
else:
|
|
failed_tasks.append((task, "未知状态"))
|
|
|
|
print(f"\n✅ 成功: {len(success_tasks)} 个")
|
|
for t in success_tasks:
|
|
print(f" {t}")
|
|
|
|
print(f"\n❌ 失败: {len(failed_tasks)} 个")
|
|
# 找出根因(第一个非 InFailedSqlTransaction 的失败)
|
|
root_causes = []
|
|
cascade_count = 0
|
|
for t, err in failed_tasks:
|
|
if "InFailedSqlTransaction" in err:
|
|
cascade_count += 1
|
|
else:
|
|
root_causes.append((t, err))
|
|
print(f" 🔴 {t}: {err}")
|
|
|
|
print(f"\n 级联失败 (InFailedSqlTransaction): {cascade_count} 个")
|
|
|
|
if root_causes:
|
|
print(f"\n根因分析:")
|
|
for t, err in root_causes:
|
|
print(f" {t}: {err}")
|