blob: 5785e32df1e34bdd0fe1dcc932a4501a4586681e [file] [log] [blame]
Mike Frysingerf1ba7ad2022-09-12 05:42:57 -04001# Copyright 2017 The ChromiumOS Authors
Allen Lica61e062017-07-13 13:15:21 -07002# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""Unit tests for proc_metrics."""
6
7# pylint: disable=protected-access
8
9from __future__ import absolute_import
Allen Lica61e062017-07-13 13:15:21 -070010
Mike Frysinger166fea02021-02-12 05:30:33 -050011from unittest import mock
12
Mike Frysingercb56b642019-08-25 15:33:08 -040013import psutil # pylint: disable=import-error
Allen Lica61e062017-07-13 13:15:21 -070014
15from chromite.lib import cros_test_lib
16from chromite.scripts.sysmon import proc_metrics
17
18
Congbin Guo16b64d52023-02-10 17:50:30 -080019def _mock_process(name, cmdline, parent=None, num_threads=10):
Alex Klein1699fab2022-09-08 08:46:06 -060020 proc = mock.Mock(dir(psutil.Process))
21 proc.name.return_value = name
22 proc.cmdline.return_value = cmdline
Congbin Guo16b64d52023-02-10 17:50:30 -080023 proc.num_threads.return_value = num_threads
Alex Klein1699fab2022-09-08 08:46:06 -060024 proc.cpu_percent.return_value = 2
Congbin Guo18b4ed72023-02-11 19:16:16 -080025
26 proc.cpu_times.return_value.system = 10
27 proc.cpu_times.return_value.user = 11
28 proc.cpu_times.return_value.iowait = 12
29 proc.cpu_times.return_value.children_system = 13
30 proc.cpu_times.return_value.children_user = 14
Congbin Guocf2750c2023-02-11 21:25:16 -080031
32 proc.io_counters.return_value.read_count = 20
33 proc.io_counters.return_value.read_bytes = 21
34 proc.io_counters.return_value.read_chars = 22
35 proc.io_counters.return_value.write_count = 23
36 proc.io_counters.return_value.write_bytes = 24
37 proc.io_counters.return_value.write_chars = 25
38
Alex Klein1699fab2022-09-08 08:46:06 -060039 if parent is not None:
40 proc.parent.return_value = parent
41 return proc
Allen Lica61e062017-07-13 13:15:21 -070042
43
44def _mock_forked_process(name, cmdline):
Alex Klein1699fab2022-09-08 08:46:06 -060045 parent_proc = _mock_process(name, cmdline)
46 return _mock_process(name, cmdline, parent=parent_proc)
Allen Lica61e062017-07-13 13:15:21 -070047
48
Allen Li3992c662018-01-05 15:26:36 -080049def _expected_calls_for(name):
Alex Klein1699fab2022-09-08 08:46:06 -060050 """Return expected calls for a process metric."""
51 return [
52 mock.call("proc/count", (name,), None, 1, enforce_ge=mock.ANY),
Congbin Guo16b64d52023-02-10 17:50:30 -080053 mock.call("proc/thread_count", (name,), None, 10, enforce_ge=mock.ANY),
Alex Klein1699fab2022-09-08 08:46:06 -060054 mock.call("proc/cpu_percent", (name,), None, 2, enforce_ge=mock.ANY),
55 ]
Allen Li3992c662018-01-05 15:26:36 -080056
57
Allen Lica61e062017-07-13 13:15:21 -070058class TestProcMetrics(cros_test_lib.TestCase):
Alex Klein1699fab2022-09-08 08:46:06 -060059 """Tests for proc_metrics."""
Allen Lica61e062017-07-13 13:15:21 -070060
Alex Klein1699fab2022-09-08 08:46:06 -060061 def setUp(self):
62 patcher = mock.patch(
Trent Aptedc4f366a2023-05-16 15:32:48 +100063 "chromite.third_party.infra_libs.ts_mon.common.interface.state."
64 "store",
Alex Klein1699fab2022-09-08 08:46:06 -060065 autospec=True,
66 )
67 self.store = patcher.start()
68 self.addCleanup(patcher.stop)
Allen Lica61e062017-07-13 13:15:21 -070069
Alex Klein1699fab2022-09-08 08:46:06 -060070 def test_collect(self):
71 with mock.patch("psutil.process_iter", autospec=True) as process_iter:
72 process_iter.return_value = [
73 _mock_process(
74 name="autoserv",
75 cmdline=[
76 "/usr/bin/python",
77 "-u",
78 "/usr/local/autotest/server/autoserv",
79 "-p",
80 "-r",
81 (
82 "/usr/local/autotest/results/hosts/"
83 "chromeos4-row3-rack13-host9/646252-provision"
84 "/20171307125911"
85 ),
86 "-m",
87 "chromeos4-row3-rack13-host9",
88 "--verbose",
89 "--lab",
90 "True",
91 "--provision",
92 "--job-labels",
93 "cros-version:winky-release/R61-9741.0.0",
94 ],
95 ),
96 _mock_forked_process(
97 name="autoserv",
98 cmdline=[
99 "/usr/bin/python",
100 "-u",
101 "/usr/local/autotest/server/autoserv",
102 "-p",
103 "-r",
104 (
105 "/usr/local/autotest/results/hosts/"
106 "chromeos4-row3-rack13-host9/646252-provision"
107 "/20171307125911"
108 ),
109 "-m",
110 "chromeos4-row3-rack13-host9",
111 "--verbose",
112 "--lab",
113 "True",
114 "--provision",
115 "--job-labels",
116 "cros-version:winky-release/R61-9741.0.0",
117 ],
118 ),
119 _mock_process(
120 name="gs_offloader.py",
121 cmdline=[
122 "/usr/bin/python",
123 "/usr/local/autotest/site_utils/gs_offloader.py",
124 "-s",
125 "--parallelism=30",
126 ],
127 ),
128 _mock_process(
129 name="python",
130 cmdline=[
131 (
Trent Aptedc4f366a2023-05-16 15:32:48 +1000132 "/usr/local/google/home/chromeos-test/.cache/"
133 "cros_venv/venv-2.7.6-"
134 "5addca6cf590166d7b70e22a95bea4a0/bin/python"
Alex Klein1699fab2022-09-08 08:46:06 -0600135 ),
136 "-m",
137 "chromite.scripts.sysmon",
138 "--interval",
139 "60",
140 ],
141 ),
142 _mock_process(
143 name="lxc-start",
144 cmdline=[
145 "[lxc monitor] /usr/local/autotest/containers"
146 " test_196499100_1525673902_240543]"
147 ],
148 ),
149 _mock_process(
150 name="lxc-attach",
151 cmdline=[
152 "lxc-attach",
153 "-P",
154 "/usr/local/autotest/containers",
155 "-n",
156 "test_196499100_1525673902_240543",
157 "--",
158 "bash",
159 "-c",
160 (
161 "/usr/local/autotest/server/autoserv"
162 " -s -P 196499100-chromeos-test/group0 ..."
163 ),
164 ],
165 ),
166 _mock_process(
167 name="getty",
168 cmdline=[
169 "/sbin/getty",
170 "-8",
171 "38400",
172 "console",
173 ],
174 ),
175 _mock_process(
176 name="sshd", cmdline=["sshd:", "chromeos-test", "[priv]"]
177 ),
178 _mock_process(
179 name="python3.8",
180 cmdline=[
181 "/usr/bin/python3.8",
Trent Aptedc4f366a2023-05-16 15:32:48 +1000182 (
183 "/home/chromeos-test/skylab_bots/"
184 "c6-r16-r17-h13.2757785382/swarming_bot.1.zip"
185 ),
Alex Klein1699fab2022-09-08 08:46:06 -0600186 "start_bot",
187 ],
188 ),
189 _mock_process(
190 name="curl", cmdline=["curl", "server:port/path"]
191 ),
Alex Klein1699fab2022-09-08 08:46:06 -0600192 _mock_process(name="java", cmdline=["java", "-Xmx4g", "..."]),
193 _mock_process(
194 name="python",
195 cmdline=[
196 "python",
Trent Aptedc4f366a2023-05-16 15:32:48 +1000197 (
198 "/tmp/chromeos-cache/common/gsutil_4.57.tar.gz/"
199 "gsutil/gsutil"
200 ),
Alex Klein1699fab2022-09-08 08:46:06 -0600201 "-o",
202 "Boto:num_retries=10",
203 "cat",
204 "gs://eve-release/R100-14488.0.0/file",
205 ],
206 ),
Congbin Guo522cd982022-10-06 11:47:28 -0700207 _mock_process(
208 name="common-tls",
Congbin Guofcb436b2023-01-23 20:36:01 -0800209 cmdline=["/opt/infra-tools/common-tls", "-port", "..."],
Congbin Guo522cd982022-10-06 11:47:28 -0700210 ),
211 _mock_process(
212 name="fleet-tlw",
Congbin Guofcb436b2023-01-23 20:36:01 -0800213 cmdline=["/opt/infra-tools/fleet-tlw", "-port", "..."],
Congbin Guo522cd982022-10-06 11:47:28 -0700214 ),
215 _mock_process(
Congbin Guofcb436b2023-01-23 20:36:01 -0800216 name="drone-agent", cmdline=["/opt/infra-tools/drone-agent"]
Congbin Guo522cd982022-10-06 11:47:28 -0700217 ),
Congbin Guofcb436b2023-01-23 20:36:01 -0800218 _mock_process(name="dnsmasq", cmdline=["dnsmasq", "..."]),
Congbin Guo522cd982022-10-06 11:47:28 -0700219 _mock_process(
220 name="labservice",
Congbin Guofcb436b2023-01-23 20:36:01 -0800221 cmdline=["/opt/infra-tools/labservice", "-addr", "..."],
Congbin Guo522cd982022-10-06 11:47:28 -0700222 ),
223 _mock_process(
224 name="cloud_sql_proxy",
225 cmdline=[
Congbin Guofcb436b2023-01-23 20:36:01 -0800226 "/opt/cloud_sql_proxy",
227 "-dir=/var/run/tko_proxy",
Congbin Guo522cd982022-10-06 11:47:28 -0700228 "-instances=google.com:chromeos-lab:us-central1:tko",
Congbin Guofcb436b2023-01-23 20:36:01 -0800229 "-credential_file=...",
Congbin Guo522cd982022-10-06 11:47:28 -0700230 ],
231 ),
Congbin Guo3cdc11e2022-10-11 16:02:32 -0700232 _mock_process(
233 name="downloader",
Congbin Guofcb436b2023-01-23 20:36:01 -0800234 cmdline=["./downloader", "-credential-file", "..."],
Congbin Guo3cdc11e2022-10-11 16:02:32 -0700235 ),
Congbin Guoa8432502023-01-23 20:31:01 -0800236 _mock_process(
237 name="cipd", cmdline=["cipd", "ensure", "-root", "..."]
238 ),
239 _mock_process(
240 name="podman", cmdline=["podman", "run", "image:tag"]
241 ),
242 _mock_process(
243 name="podman", cmdline=["podman", "pull", "image:tag"]
244 ),
Congbin Guo4ccf0632023-02-12 00:01:14 -0800245 _mock_process(name="adb", cmdline=["adb", "..."]),
246 _mock_process(name="bbagent", cmdline=["bbagent", "..."]),
247 _mock_process(name="cloudtail", cmdline=["cloudtail", "..."]),
248 _mock_process(name="kubelet", cmdline=["kubelet", "..."]),
249 _mock_process(
250 name="phosphorus", cmdline=["phosphorus", "upload-to-tko"]
251 ),
252 _mock_process(
Congbin Guo91355e12023-02-14 13:51:20 -0800253 name="phosphorus", cmdline=["phosphorus", "upload-to-gs"]
254 ),
255 _mock_process(
256 name="phosphorus", cmdline=["phosphorus", "run-test"]
257 ),
258 _mock_process(
259 name="phosphorus", cmdline=["phosphorus", "prejob"]
260 ),
261 _mock_process(
262 name="phosphorus", cmdline=["phosphorus", "fetch-crashes"]
263 ),
264 _mock_process(
265 name="phosphorus", cmdline=["phosphorus", "new-subcmd"]
266 ),
267 _mock_process(
Congbin Guo4ccf0632023-02-12 00:01:14 -0800268 name="python",
269 cmdline=[
270 "bin/python",
271 "-u",
272 "-s",
273 ".../recipe_engine/main.py",
274 ],
275 ),
276 _mock_process(
277 name="python3.8",
278 cmdline=[
279 "bin/python3.8",
280 "-u",
281 ".../swarming_bot.3.zip",
282 "run_isolated",
283 "...",
284 ],
285 ),
Alex Klein1699fab2022-09-08 08:46:06 -0600286 ]
287 proc_metrics.collect_proc_info()
Allen Lica61e062017-07-13 13:15:21 -0700288
Alex Klein1699fab2022-09-08 08:46:06 -0600289 setter = self.store.set
290 calls = []
Congbin Guo4ccf0632023-02-12 00:01:14 -0800291 calls.extend(_expected_calls_for("adb"))
Alex Klein1699fab2022-09-08 08:46:06 -0600292 calls.extend(_expected_calls_for("autoserv"))
Congbin Guo4ccf0632023-02-12 00:01:14 -0800293 calls.extend(_expected_calls_for("bbagent"))
Congbin Guo3cdc11e2022-10-11 16:02:32 -0700294 calls.extend(_expected_calls_for("cache-downloader"))
Congbin Guoa8432502023-01-23 20:31:01 -0800295 calls.extend(_expected_calls_for("cipd"))
Congbin Guo4ccf0632023-02-12 00:01:14 -0800296 calls.extend(_expected_calls_for("cloudtail"))
Congbin Guo522cd982022-10-06 11:47:28 -0700297 calls.extend(_expected_calls_for("common-tls"))
Alex Klein1699fab2022-09-08 08:46:06 -0600298 calls.extend(_expected_calls_for("curl"))
Congbin Guo522cd982022-10-06 11:47:28 -0700299 calls.extend(_expected_calls_for("dnsmasq"))
300 calls.extend(_expected_calls_for("drone-agent"))
301 calls.extend(_expected_calls_for("fleet-tlw"))
Alex Klein1699fab2022-09-08 08:46:06 -0600302 calls.extend(_expected_calls_for("getty"))
Alex Klein1699fab2022-09-08 08:46:06 -0600303 calls.extend(_expected_calls_for("gs_offloader"))
304 calls.extend(_expected_calls_for("gsutil"))
305 calls.extend(_expected_calls_for("java"))
Congbin Guo4ccf0632023-02-12 00:01:14 -0800306 calls.extend(_expected_calls_for("k8s_system"))
Congbin Guo522cd982022-10-06 11:47:28 -0700307 calls.extend(_expected_calls_for("labservice"))
Alex Klein1699fab2022-09-08 08:46:06 -0600308 calls.extend(_expected_calls_for("lxc-attach"))
309 calls.extend(_expected_calls_for("lxc-start"))
Congbin Guoa8432502023-01-23 20:31:01 -0800310 calls.extend(_expected_calls_for("podman-pull"))
311 calls.extend(_expected_calls_for("podman-run"))
Congbin Guo91355e12023-02-14 13:51:20 -0800312 calls.extend(_expected_calls_for("phosphorus-fetch-crashes"))
313 calls.extend(_expected_calls_for("phosphorus-prejob"))
314 calls.extend(_expected_calls_for("phosphorus-run-test"))
315 calls.extend(_expected_calls_for("phosphorus-upload-to-gs"))
316 calls.extend(_expected_calls_for("phosphorus-upload-to-tko"))
317 calls.extend(_expected_calls_for("phosphorus-other"))
Congbin Guo4ccf0632023-02-12 00:01:14 -0800318 calls.extend(_expected_calls_for("recipe"))
Alex Klein1699fab2022-09-08 08:46:06 -0600319 calls.extend(_expected_calls_for("sshd"))
320 calls.extend(_expected_calls_for("swarming_bot"))
Congbin Guo4ccf0632023-02-12 00:01:14 -0800321 calls.extend(_expected_calls_for("swarming_sub_task"))
Alex Klein1699fab2022-09-08 08:46:06 -0600322 calls.extend(_expected_calls_for("sysmon"))
Congbin Guo522cd982022-10-06 11:47:28 -0700323 calls.extend(_expected_calls_for("tko_proxy"))
Alex Klein1699fab2022-09-08 08:46:06 -0600324 calls.extend(_expected_calls_for("other"))
325 setter.assert_has_calls(calls)
326 self.assertEqual(len(setter.mock_calls), len(calls))