Skip to content

Commit 23cd353

Browse files
kalutesV8 LUCI CQ
authored andcommitted
Add 'title' option for meminfo action
Add an optional 'title' field for a meminfo action that is included in the meminfo performance mark. This is useful for determining at what point in a loading test a meminfo dump is from. If no title is supplied, the current info stack is used. Change-Id: I1dbf37a6d9e733b64c2e308e50b94333254daf4c Reviewed-on: https://chromium-review.googlesource.com/c/crossbench/+/6666731 Commit-Queue: Kameron Lutes <[email protected]> Reviewed-by: Charles Dick <[email protected]>
1 parent f3a3a13 commit 23cd353

File tree

5 files changed

+74
-42
lines changed

5 files changed

+74
-42
lines changed

crossbench/action_runner/action/meminfo.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,18 @@ def config_parser(cls: Type[ActionT]) -> ConfigParser[ActionT]:
4242
"target", type=MeminfoTarget, default=MeminfoTarget.BROWSER)
4343
parser.add_argument(
4444
"package", type=ObjectParser.non_empty_str, default=None)
45+
parser.add_argument("title", type=ObjectParser.non_empty_str, default=None)
4546
return parser
4647

4748
def __init__(self,
4849
target: MeminfoTarget = MeminfoTarget.BROWSER,
4950
package: Optional[str] = None,
51+
title: Optional[str] = None,
5052
timeout: dt.timedelta = ACTION_TIMEOUT,
5153
index: int = 0) -> None:
5254
self._target = target
5355
self._package = package
56+
self._title = title
5457
super().__init__(timeout, index)
5558

5659
@override
@@ -68,12 +71,18 @@ def target(self) -> MeminfoTarget:
6871
def package(self) -> Optional[str]:
6972
return self._package
7073

74+
@property
75+
def title(self) -> Optional[str]:
76+
return self._title
77+
7178
@override
7279
def to_json(self) -> JsonDict:
7380
details = super().to_json()
7481
details["target"] = self.target
7582
if self.package:
7683
details["package"] = self.package
84+
if self.title:
85+
details["title"] = self.title
7786
return details
7887

7988
@override

crossbench/action_runner/default_action_runner.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,8 @@ def dump_meminfo_impl(self, run: Run, action: i_action.MeminfoAction) -> None:
374374
logging.warning("No meminfo probe for dump on %s", repr(self.info_stack))
375375
return
376376
assert isinstance(ctx, MeminfoProbeContext)
377-
ctx.dump_meminfo(action.target, action.timeout, action.package)
377+
ctx.dump_meminfo(action.target, action.timeout, action.package,
378+
action.title or "_".join(self.info_stack))
378379

379380
def wait_for_download(self, run: Run,
380381
action: i_action.WaitForDownloadAction) -> None:

crossbench/probes/meminfo.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import csv
88
import dataclasses
99
import datetime as dt
10-
from typing import TYPE_CHECKING, Optional, Self, Type
10+
from typing import TYPE_CHECKING, Any, Optional, Self, Type
1111

1212
from typing_extensions import override
1313

@@ -61,7 +61,7 @@ def stop(self) -> None:
6161
pass
6262

6363
def dump_meminfo(self, target: MeminfoTarget, timeout: dt.timedelta,
64-
package: Optional[str]) -> None:
64+
package: Optional[str], title: str) -> None:
6565
timestamp = self.browser_platform.sh_stdout("date",
6666
"+%Y-%m-%d %H:%M:%S").rstrip()
6767

@@ -74,12 +74,12 @@ def dump_meminfo(self, target: MeminfoTarget, timeout: dt.timedelta,
7474
else:
7575
raise ValueError("Cannot dump meminfo without package name.")
7676

77-
meminfo_json = []
77+
meminfo_json: dict[str, Any] = {"title": title, "meminfos": []}
7878
for proc_name, proc_meminfo in meminfo.items():
7979
proc_data = dataclasses.asdict(proc_meminfo)
8080
proc_data["timestamp"] = timestamp
8181
proc_data["name"] = proc_name
82-
meminfo_json.append(proc_data)
82+
meminfo_json["meminfos"].append(proc_data)
8383

8484
self.browser.performance_mark("meminfo", detail=meminfo_json)
8585

@@ -107,7 +107,7 @@ def dump_meminfo(self, target: MeminfoTarget, timeout: dt.timedelta,
107107
)
108108
if write_header:
109109
writer.writeheader()
110-
writer.writerows(meminfo_json)
110+
writer.writerows(meminfo_json["meminfos"])
111111

112112
@override
113113
def teardown(self) -> ProbeResult:

tests/crossbench/benchmarks/loading/test_action.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -975,6 +975,7 @@ def test_parse_meminfo_default(self):
975975
self.assertEqual(action.TYPE, ActionType.MEMINFO)
976976
self.assertEqual(action.target, MeminfoTarget.BROWSER)
977977
self.assertIsNone(action.package)
978+
self.assertIsNone(action.title)
978979

979980
action_2 = MeminfoAction.parse_dict(action.to_json())
980981
self.assertEqual(action, action_2)
@@ -992,6 +993,17 @@ def test_parse_meminfo_browser(self):
992993
self.assertEqual(action, action_2)
993994
action_2.validate()
994995

996+
def test_parse_meminfo_title(self):
997+
config_dict = {"action": "meminfo", "title": "a_title"}
998+
action = MeminfoAction.parse_dict(config_dict)
999+
action.validate()
1000+
self.assertEqual(action.TYPE, ActionType.MEMINFO)
1001+
self.assertEqual(action.title, "a_title")
1002+
1003+
action_2 = MeminfoAction.parse_dict(action.to_json())
1004+
self.assertEqual(action, action_2)
1005+
action_2.validate()
1006+
9951007
def test_parse_meminfo_invalid_target(self):
9961008
config_dict = {"action": "meminfo", "target": "notatarget"}
9971009

tests/crossbench/probes/test_meminfo.py

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -63,48 +63,58 @@ def test_meminfo_dumped(self):
6363
meminfo_detail = self.browsers[0].performance_marks_details[
6464
self.browsers[0].performance_marks.index("crossbench-meminfo")]
6565

66-
self.assertEqual(meminfo_detail, [
67-
{
68-
"timestamp": "2025-05-20 12:45:59",
69-
"pid": 1,
70-
"name": "process_1",
71-
"pss_total": 2,
72-
"rss_total": 3,
73-
"swap_total": 4
74-
},
75-
{
76-
"timestamp": "2025-05-20 12:45:59",
77-
"pid": 2,
78-
"name": "process_2",
79-
"pss_total": 3,
80-
"rss_total": 4,
81-
"swap_total": 5
82-
},
83-
])
66+
self.assertEqual(
67+
meminfo_detail, {
68+
"title":
69+
"block_0_action_2",
70+
"meminfos": [
71+
{
72+
"timestamp": "2025-05-20 12:45:59",
73+
"pid": 1,
74+
"name": "process_1",
75+
"pss_total": 2,
76+
"rss_total": 3,
77+
"swap_total": 4
78+
},
79+
{
80+
"timestamp": "2025-05-20 12:45:59",
81+
"pid": 2,
82+
"name": "process_2",
83+
"pss_total": 3,
84+
"rss_total": 4,
85+
"swap_total": 5
86+
},
87+
]
88+
})
8489

8590
self.assertTrue("crossbench-meminfo" in self.browsers[1].performance_marks)
8691

8792
meminfo_detail = self.browsers[1].performance_marks_details[
8893
self.browsers[1].performance_marks.index("crossbench-meminfo")]
8994

90-
self.assertEqual(meminfo_detail, [
91-
{
92-
"timestamp": "2025-05-20 12:45:59",
93-
"pid": 1,
94-
"name": "process_1",
95-
"pss_total": 2,
96-
"rss_total": 3,
97-
"swap_total": 4
98-
},
99-
{
100-
"timestamp": "2025-05-20 12:45:59",
101-
"pid": 2,
102-
"name": "process_2",
103-
"pss_total": 3,
104-
"rss_total": 4,
105-
"swap_total": 5
106-
},
107-
])
95+
self.assertEqual(
96+
meminfo_detail, {
97+
"title":
98+
"block_0_action_2",
99+
"meminfos": [
100+
{
101+
"timestamp": "2025-05-20 12:45:59",
102+
"pid": 1,
103+
"name": "process_1",
104+
"pss_total": 2,
105+
"rss_total": 3,
106+
"swap_total": 4
107+
},
108+
{
109+
"timestamp": "2025-05-20 12:45:59",
110+
"pid": 2,
111+
"name": "process_2",
112+
"pss_total": 3,
113+
"rss_total": 4,
114+
"swap_total": 5
115+
},
116+
]
117+
})
108118

109119

110120
if __name__ == "__main__":

0 commit comments

Comments
 (0)