This commit is contained in:
2026-04-23 10:36:51 +07:00
parent bdb432dc39
commit eacdc424bc
3 changed files with 90 additions and 39 deletions
+58 -7
View File
@@ -3,9 +3,11 @@ import argparse
import re import re
import sys import sys
from dataclasses import dataclass from dataclasses import dataclass
from decimal import Decimal
from typing import Dict, Iterable, List, Tuple from typing import Dict, Iterable, List, Tuple
from openpyxl import Workbook from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference
from openpyxl.styles import Font from openpyxl.styles import Font
@@ -18,8 +20,10 @@ LINE_RE = re.compile(
class ProcessLog: class ProcessLog:
pid: int pid: int
ppid: int ppid: int
start: float start: Decimal
finish: float | None = None start_text: str
finish: Decimal | None = None
finish_text: str | None = None
first_seen_order: int = 0 first_seen_order: int = 0
@@ -65,16 +69,23 @@ def parse_processes(lines: Iterable[str]) -> Dict[int, ProcessLog]:
event, pid_s, ppid_s, _depth_s, _l_s, _r_s, ts_s = m.groups() event, pid_s, ppid_s, _depth_s, _l_s, _r_s, ts_s = m.groups()
pid = int(pid_s) pid = int(pid_s)
ppid = int(ppid_s) ppid = int(ppid_s)
ts = float(ts_s) ts = Decimal(ts_s)
if event == "START": if event == "START":
processes[pid] = ProcessLog( processes[pid] = ProcessLog(
pid=pid, ppid=ppid, start=ts, finish=None, first_seen_order=order pid=pid,
ppid=ppid,
start=ts,
start_text=ts_s,
finish=None,
finish_text=None,
first_seen_order=order,
) )
order += 1 order += 1
else: else:
if pid in processes: if pid in processes:
processes[pid].finish = ts processes[pid].finish = ts
processes[pid].finish_text = ts_s
return processes return processes
@@ -113,29 +124,69 @@ def tree_rows(processes: Dict[int, ProcessLog]) -> List[Tuple[int, ProcessLog]]:
return ordered return ordered
def fmt6(value: Decimal) -> str:
return f"{value.quantize(Decimal('0.000001'))}"
def export_excel(rows: List[Tuple[int, ProcessLog]], output_path: str) -> None: def export_excel(rows: List[Tuple[int, ProcessLog]], output_path: str) -> None:
wb = Workbook() wb = Workbook()
ws = wb.active ws = wb.active
ws.title = "process_logs" ws.title = "process_logs"
ws.append(["PPID", "PID", "START", "FINISH", "DURATION"]) ws.append(["PPID", "PID", "START", "TIME_FROM_START", "FINISH", "DURATION"])
for cell in ws[1]: for cell in ws[1]:
cell.font = Font(bold=True) cell.font = Font(bold=True)
base_start = min((node.start for _, node in rows), default=Decimal("0"))
for depth, node in rows: for depth, node in rows:
if node.finish is None: if node.finish is None:
continue continue
if node.finish_text is None:
continue
time_from_start = node.start - base_start
duration = node.finish - node.start duration = node.finish - node.start
pid_display = f"{' ' * depth}{node.pid}" pid_display = f"{' ' * depth}{node.pid}"
ws.append([node.ppid, pid_display, node.start, node.finish, duration]) ws.append(
[
node.ppid,
pid_display,
node.start_text,
fmt6(time_from_start),
node.finish_text,
fmt6(duration),
]
)
ws.column_dimensions["A"].width = 12 ws.column_dimensions["A"].width = 12
ws.column_dimensions["B"].width = 20 ws.column_dimensions["B"].width = 20
ws.column_dimensions["C"].width = 18 ws.column_dimensions["C"].width = 18
ws.column_dimensions["D"].width = 18 ws.column_dimensions["D"].width = 18
ws.column_dimensions["E"].width = 14 ws.column_dimensions["E"].width = 18
ws.column_dimensions["F"].width = 14
ws.freeze_panes = "A2" ws.freeze_panes = "A2"
last_row = ws.max_row
if last_row >= 2:
chart = BarChart()
chart.type = "bar"
chart.grouping = "stacked"
chart.overlap = 100
chart.gapWidth = 150
chart.legend.position = "b"
chart.width = 15
chart.height = 7.5
chart.x_axis.scaling.orientation = "maxMin"
data = Reference(ws, min_col=4, max_col=4, min_row=2, max_row=last_row)
duration = Reference(ws, min_col=6, max_col=6, min_row=2, max_row=last_row)
chart.add_data(data, titles_from_data=False)
chart.add_data(duration, titles_from_data=False)
chart.series[0].graphicalProperties.noFill = True
ws.add_chart(chart, "D21")
wb.save(output_path) wb.save(output_path)
+32 -32
View File
@@ -1,36 +1,36 @@
Before: Before:
61348 28446 8318 49147 24393 15112 24969 66655 3374 5666 48922 778 11600 6589 6406 56105 71867 17651 21741 7869 53295 80896 89602 86224 55926 84615 87294 48381 55123 61994 34359 93902 43309 3589 29660 26380 61249 28170 39563 82507
START PID=44192 PPID=44191 depth=0 range=[0,19999] time=1776745157.209104 START PID=53571 PPID=53570 depth=0 range=[0,19999] time=1776746459.289786
START PID=44193 PPID=44192 depth=1 range=[0,9999] time=1776745157.209289 START PID=53572 PPID=53571 depth=1 range=[0,9999] time=1776746459.290028
START PID=44194 PPID=44192 depth=1 range=[10000,19999] time=1776745157.209369 START PID=53573 PPID=53571 depth=1 range=[10000,19999] time=1776746459.290119
START PID=44195 PPID=44193 depth=2 range=[0,4999] time=1776745157.209470 START PID=53574 PPID=53572 depth=2 range=[0,4999] time=1776746459.290256
START PID=44197 PPID=44193 depth=2 range=[5000,9999] time=1776745157.209540 START PID=53576 PPID=53572 depth=2 range=[5000,9999] time=1776746459.290432
START PID=44196 PPID=44194 depth=2 range=[10000,14999] time=1776745157.209546 START PID=53575 PPID=53573 depth=2 range=[10000,14999] time=1776746459.290464
START PID=44198 PPID=44194 depth=2 range=[15000,19999] time=1776745157.209581 START PID=53577 PPID=53573 depth=2 range=[15000,19999] time=1776746459.290645
START PID=44199 PPID=44195 depth=3 range=[0,2499] time=1776745157.209631 START PID=53578 PPID=53574 depth=3 range=[0,2499] time=1776746459.290676
START PID=44200 PPID=44197 depth=3 range=[5000,7499] time=1776745157.209689 START PID=53580 PPID=53576 depth=3 range=[5000,7499] time=1776746459.290855
START PID=44201 PPID=44196 depth=3 range=[10000,12499] time=1776745157.209717 END PID=53578 PPID=53574 depth=3 range=[0,2499] time=1776746459.291082
START PID=44202 PPID=44195 depth=3 range=[2500,4999] time=1776745157.209722 END PID=53580 PPID=53576 depth=3 range=[5000,7499] time=1776746459.291298
START PID=44204 PPID=44197 depth=3 range=[7500,9999] time=1776745157.209779 START PID=53579 PPID=53574 depth=3 range=[2500,4999] time=1776746459.291487
START PID=44205 PPID=44196 depth=3 range=[12500,14999] time=1776745157.209848 START PID=53584 PPID=53577 depth=3 range=[17500,19999] time=1776746459.291494
START PID=44203 PPID=44198 depth=3 range=[15000,17499] time=1776745157.209874 START PID=53582 PPID=53577 depth=3 range=[15000,17499] time=1776746459.291486
END PID=44200 PPID=44197 depth=3 range=[5000,7499] time=1776745157.209961 START PID=53583 PPID=53575 depth=3 range=[10000,12499] time=1776746459.291497
END PID=44199 PPID=44195 depth=3 range=[0,2499] time=1776745157.210015 START PID=53581 PPID=53576 depth=3 range=[7500,9999] time=1776746459.291592
END PID=44201 PPID=44196 depth=3 range=[10000,12499] time=1776745157.210100 END PID=53584 PPID=53577 depth=3 range=[17500,19999] time=1776746459.292012
END PID=44202 PPID=44195 depth=3 range=[2500,4999] time=1776745157.210110 END PID=53579 PPID=53574 depth=3 range=[2500,4999] time=1776746459.292020
END PID=44204 PPID=44197 depth=3 range=[7500,9999] time=1776745157.210143 END PID=53581 PPID=53576 depth=3 range=[7500,9999] time=1776746459.292094
END PID=44205 PPID=44196 depth=3 range=[12500,14999] time=1776745157.210214 END PID=53582 PPID=53577 depth=3 range=[15000,17499] time=1776746459.292094
END PID=44203 PPID=44198 depth=3 range=[15000,17499] time=1776745157.210242 END PID=53583 PPID=53575 depth=3 range=[10000,12499] time=1776746459.292159
END PID=44195 PPID=44193 depth=2 range=[0,4999] time=1776745157.210294 END PID=53576 PPID=53572 depth=2 range=[5000,9999] time=1776746459.292532
END PID=44197 PPID=44193 depth=2 range=[5000,9999] time=1776745157.210304 START PID=53585 PPID=53575 depth=3 range=[12500,14999] time=1776746459.292517
END PID=44196 PPID=44194 depth=2 range=[10000,14999] time=1776745157.210415 END PID=53585 PPID=53575 depth=3 range=[12500,14999] time=1776746459.293104
START PID=44206 PPID=44198 depth=3 range=[17500,19999] time=1776745157.210418 END PID=53574 PPID=53572 depth=2 range=[0,4999] time=1776746459.293576
END PID=44193 PPID=44192 depth=1 range=[0,9999] time=1776745157.210535 END PID=53572 PPID=53571 depth=1 range=[0,9999] time=1776746459.294079
END PID=44206 PPID=44198 depth=3 range=[17500,19999] time=1776745157.210718 END PID=53577 PPID=53573 depth=2 range=[15000,19999] time=1776746459.294508
END PID=44198 PPID=44194 depth=2 range=[15000,19999] time=1776745157.210864 END PID=53575 PPID=53573 depth=2 range=[10000,14999] time=1776746459.294684
END PID=44194 PPID=44192 depth=1 range=[10000,19999] time=1776745157.211079 END PID=53573 PPID=53571 depth=1 range=[10000,19999] time=1776746459.295034
END PID=44192 PPID=44191 depth=0 range=[0,19999] time=1776745157.211362 END PID=53571 PPID=53570 depth=0 range=[0,19999] time=1776746459.295429
After: After:
4 10 13 28 36 40 54 55 59 62 68 78 81 81 83 85 90 91 91 92 0 5 5 10 16 20 22 22 28 50 56 56 57 59 60 61 77 79 81 83
BIN
View File
Binary file not shown.