提交 c73ffd58 authored 作者: 陈泽健's avatar 陈泽健

feat(perf): AI 分析报告资源使用分析四维度增强(Java 进程 + MySQL)

- 资源使用分析扩展为四维度:执行机整体 / 目标机整体 / Java 进程 / MySQL
- 新增 _extract_java_process_stats / _extract_mysql_stats / _fmt_num 辅助方法
- Chapter 四重写为 4 小节,瓶颈表新增 Java 进程与 MySQL 条目,建议表同步
- 更新 LLM Prompt 第四章要求四维度分析,资源表头改 [资源,指标,值,状态]
- 修复 _rule_based_analysis 中 exec_cpu_avg / exec_cpu_max 未定义问题(上一轮遗留)
- 测试新增 4 个资源维度用例,共 20 passed,全量 295 passed
Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
上级 2a6ecd8a
......@@ -211,6 +211,71 @@ class TestSnapshotSummary:
assert str(summary).count("elapsed") == 4
# ==================== 资源四维度提取测试 ====================
class TestResourceDimensionExtraction:
"""资源分析四维度:执行机整体 / 目标机整体 / Java 进程 / MySQL"""
TARGET = {
"host": "192.168.5.44",
"stats": {"avgCpuPercent": 85.0, "maxCpuPercent": 95.0, "avgMemPercent": 55.0, "maxMemPercent": 65.0},
"javaProcessStats": [
{"processName": "platform-app", "avgCpuPercent": 82.0, "maxCpuPercent": 95.0,
"avgMemPercent": 40.0, "maxMemPercent": 45.0, "avgRssMb": 1500.0, "maxRssMb": 1800.0}
],
"mysql": {"available": True, "container": "umysql", "threadsConnected": 120, "threadsRunning": 8,
"maxUsedConnections": 150, "maxConnections": 300, "slowQueries": 35, "bufferPoolHitRate": 97.5,
"questions": 100000, "queries": 400000, "bytesReceivedMb": 12.0, "bytesSentMb": 88.0},
}
def test_java_process_stats_extraction(self):
svc = PerformanceAiService()
procs = svc._extract_java_process_stats(self.TARGET)
assert len(procs) == 1
assert procs[0]["processName"] == "platform-app"
assert procs[0]["avgCpuPercent"] == 82.0
assert svc._extract_java_process_stats(None) == []
assert svc._extract_java_process_stats({"stats": {}}) == []
def test_mysql_stats_extraction(self):
svc = PerformanceAiService()
mysql = svc._extract_mysql_stats(self.TARGET)
assert mysql["available"] is True
assert mysql["slowQueries"] == 35
assert mysql["bufferPoolHitRate"] == 97.5
# 未采集或 available=False 时返回空
assert svc._extract_mysql_stats(None) == {}
assert svc._extract_mysql_stats({"mysql": {"available": False, "slowQueries": 1}}) == {}
def test_rule_analysis_covers_four_dimensions(self):
"""规则分析文档含 执行机 / 目标机 / Java / MySQL 四维度"""
svc = PerformanceAiService()
data = _make_report_data(
resource_summary={"stats": {"avgCpuPercent": 45.0, "maxCpuPercent": 70.0,
"avgMemPercent": 60.0, "maxMemPercent": 75.0}},
target_resource_summary=self.TARGET,
)
result = svc.analyze_single(data)
html = result["document_html"]
assert "执行机" in html
assert "目标机" in html
assert "Java 进程" in html
assert "MySQL" in html
# 高 CPU 目标机 + Java 进程 + 慢查询/命中率 均进入瓶颈
locs = [b["location"] for b in result["bottlenecks"]]
assert any("目标机" in l for l in locs)
assert any("Java 进程" in l for l in locs)
assert any("MySQL" in l for l in locs)
def test_rule_analysis_no_resource_data(self):
"""无资源数据时不虚构,标注未采集"""
svc = PerformanceAiService()
data = _make_report_data(resource_summary={}, target_resource_summary={})
result = svc.analyze_single(data)
html = result["document_html"]
assert "未采集" in html or "无资源监控数据" in html or "无数据" in html
# ==================== 文档规范化测试 ====================
class TestNormalizeDocumentResult:
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论