blob: 9563e813d03c6612cdc0276e0354d916e9aaeb23 [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(
63 "chromite.third_party.infra_libs.ts_mon.common.interface.state.store",
64 autospec=True,
65 )
66 self.store = patcher.start()
67 self.addCleanup(patcher.stop)
Allen Lica61e062017-07-13 13:15:21 -070068
Alex Klein1699fab2022-09-08 08:46:06 -060069 def test_collect(self):
70 with mock.patch("psutil.process_iter", autospec=True) as process_iter:
71 process_iter.return_value = [
72 _mock_process(
73 name="autoserv",
74 cmdline=[
75 "/usr/bin/python",
76 "-u",
77 "/usr/local/autotest/server/autoserv",
78 "-p",
79 "-r",
80 (
81 "/usr/local/autotest/results/hosts/"
82 "chromeos4-row3-rack13-host9/646252-provision"
83 "/20171307125911"
84 ),
85 "-m",
86 "chromeos4-row3-rack13-host9",
87 "--verbose",
88 "--lab",
89 "True",
90 "--provision",
91 "--job-labels",
92 "cros-version:winky-release/R61-9741.0.0",
93 ],
94 ),
95 _mock_forked_process(
96 name="autoserv",
97 cmdline=[
98 "/usr/bin/python",
99 "-u",
100 "/usr/local/autotest/server/autoserv",
101 "-p",
102 "-r",
103 (
104 "/usr/local/autotest/results/hosts/"
105 "chromeos4-row3-rack13-host9/646252-provision"
106 "/20171307125911"
107 ),
108 "-m",
109 "chromeos4-row3-rack13-host9",
110 "--verbose",
111 "--lab",
112 "True",
113 "--provision",
114 "--job-labels",
115 "cros-version:winky-release/R61-9741.0.0",
116 ],
117 ),
118 _mock_process(
119 name="gs_offloader.py",
120 cmdline=[
121 "/usr/bin/python",
122 "/usr/local/autotest/site_utils/gs_offloader.py",
123 "-s",
124 "--parallelism=30",
125 ],
126 ),
127 _mock_process(
128 name="python",
129 cmdline=[
130 (
131 "/usr/local/google/home/chromeos-test/.cache/cros_venv"
132 "/venv-2.7.6-5addca6cf590166d7b70e22a95bea4a0"
133 "/bin/python"
134 ),
135 "-m",
136 "chromite.scripts.sysmon",
137 "--interval",
138 "60",
139 ],
140 ),
141 _mock_process(
142 name="lxc-start",
143 cmdline=[
144 "[lxc monitor] /usr/local/autotest/containers"
145 " test_196499100_1525673902_240543]"
146 ],
147 ),
148 _mock_process(
149 name="lxc-attach",
150 cmdline=[
151 "lxc-attach",
152 "-P",
153 "/usr/local/autotest/containers",
154 "-n",
155 "test_196499100_1525673902_240543",
156 "--",
157 "bash",
158 "-c",
159 (
160 "/usr/local/autotest/server/autoserv"
161 " -s -P 196499100-chromeos-test/group0 ..."
162 ),
163 ],
164 ),
165 _mock_process(
166 name="getty",
167 cmdline=[
168 "/sbin/getty",
169 "-8",
170 "38400",
171 "console",
172 ],
173 ),
174 _mock_process(
175 name="sshd", cmdline=["sshd:", "chromeos-test", "[priv]"]
176 ),
177 _mock_process(
178 name="python3.8",
179 cmdline=[
180 "/usr/bin/python3.8",
181 "/home/chromeos-test/skylab_bots/"
182 "c6-r16-r17-h13.2757785382/swarming_bot.1.zip",
183 "start_bot",
184 ],
185 ),
186 _mock_process(
187 name="curl", cmdline=["curl", "server:port/path"]
188 ),
Alex Klein1699fab2022-09-08 08:46:06 -0600189 _mock_process(name="java", cmdline=["java", "-Xmx4g", "..."]),
190 _mock_process(
191 name="python",
192 cmdline=[
193 "python",
194 "/tmp/chromeos-cache/common/gsutil_4.57.tar.gz/"
195 "gsutil/gsutil",
196 "-o",
197 "Boto:num_retries=10",
198 "cat",
199 "gs://eve-release/R100-14488.0.0/file",
200 ],
201 ),
Congbin Guo522cd982022-10-06 11:47:28 -0700202 _mock_process(
203 name="common-tls",
Congbin Guofcb436b2023-01-23 20:36:01 -0800204 cmdline=["/opt/infra-tools/common-tls", "-port", "..."],
Congbin Guo522cd982022-10-06 11:47:28 -0700205 ),
206 _mock_process(
207 name="fleet-tlw",
Congbin Guofcb436b2023-01-23 20:36:01 -0800208 cmdline=["/opt/infra-tools/fleet-tlw", "-port", "..."],
Congbin Guo522cd982022-10-06 11:47:28 -0700209 ),
210 _mock_process(
Congbin Guofcb436b2023-01-23 20:36:01 -0800211 name="drone-agent", cmdline=["/opt/infra-tools/drone-agent"]
Congbin Guo522cd982022-10-06 11:47:28 -0700212 ),
Congbin Guofcb436b2023-01-23 20:36:01 -0800213 _mock_process(name="dnsmasq", cmdline=["dnsmasq", "..."]),
Congbin Guo522cd982022-10-06 11:47:28 -0700214 _mock_process(
215 name="labservice",
Congbin Guofcb436b2023-01-23 20:36:01 -0800216 cmdline=["/opt/infra-tools/labservice", "-addr", "..."],
Congbin Guo522cd982022-10-06 11:47:28 -0700217 ),
218 _mock_process(
219 name="cloud_sql_proxy",
220 cmdline=[
Congbin Guofcb436b2023-01-23 20:36:01 -0800221 "/opt/cloud_sql_proxy",
222 "-dir=/var/run/tko_proxy",
Congbin Guo522cd982022-10-06 11:47:28 -0700223 "-instances=google.com:chromeos-lab:us-central1:tko",
Congbin Guofcb436b2023-01-23 20:36:01 -0800224 "-credential_file=...",
Congbin Guo522cd982022-10-06 11:47:28 -0700225 ],
226 ),
Congbin Guo3cdc11e2022-10-11 16:02:32 -0700227 _mock_process(
228 name="downloader",
Congbin Guofcb436b2023-01-23 20:36:01 -0800229 cmdline=["./downloader", "-credential-file", "..."],
Congbin Guo3cdc11e2022-10-11 16:02:32 -0700230 ),
Congbin Guoa8432502023-01-23 20:31:01 -0800231 _mock_process(
232 name="cipd", cmdline=["cipd", "ensure", "-root", "..."]
233 ),
234 _mock_process(
235 name="podman", cmdline=["podman", "run", "image:tag"]
236 ),
237 _mock_process(
238 name="podman", cmdline=["podman", "pull", "image:tag"]
239 ),
Congbin Guo4ccf0632023-02-12 00:01:14 -0800240 _mock_process(name="adb", cmdline=["adb", "..."]),
241 _mock_process(name="bbagent", cmdline=["bbagent", "..."]),
242 _mock_process(name="cloudtail", cmdline=["cloudtail", "..."]),
243 _mock_process(name="kubelet", cmdline=["kubelet", "..."]),
244 _mock_process(
245 name="phosphorus", cmdline=["phosphorus", "upload-to-tko"]
246 ),
247 _mock_process(
Congbin Guo91355e12023-02-14 13:51:20 -0800248 name="phosphorus", cmdline=["phosphorus", "upload-to-gs"]
249 ),
250 _mock_process(
251 name="phosphorus", cmdline=["phosphorus", "run-test"]
252 ),
253 _mock_process(
254 name="phosphorus", cmdline=["phosphorus", "prejob"]
255 ),
256 _mock_process(
257 name="phosphorus", cmdline=["phosphorus", "fetch-crashes"]
258 ),
259 _mock_process(
260 name="phosphorus", cmdline=["phosphorus", "new-subcmd"]
261 ),
262 _mock_process(
Congbin Guo4ccf0632023-02-12 00:01:14 -0800263 name="python",
264 cmdline=[
265 "bin/python",
266 "-u",
267 "-s",
268 ".../recipe_engine/main.py",
269 ],
270 ),
271 _mock_process(
272 name="python3.8",
273 cmdline=[
274 "bin/python3.8",
275 "-u",
276 ".../swarming_bot.3.zip",
277 "run_isolated",
278 "...",
279 ],
280 ),
Alex Klein1699fab2022-09-08 08:46:06 -0600281 ]
282 proc_metrics.collect_proc_info()
Allen Lica61e062017-07-13 13:15:21 -0700283
Alex Klein1699fab2022-09-08 08:46:06 -0600284 setter = self.store.set
285 calls = []
Congbin Guo4ccf0632023-02-12 00:01:14 -0800286 calls.extend(_expected_calls_for("adb"))
Alex Klein1699fab2022-09-08 08:46:06 -0600287 calls.extend(_expected_calls_for("autoserv"))
Congbin Guo4ccf0632023-02-12 00:01:14 -0800288 calls.extend(_expected_calls_for("bbagent"))
Congbin Guo3cdc11e2022-10-11 16:02:32 -0700289 calls.extend(_expected_calls_for("cache-downloader"))
Congbin Guoa8432502023-01-23 20:31:01 -0800290 calls.extend(_expected_calls_for("cipd"))
Congbin Guo4ccf0632023-02-12 00:01:14 -0800291 calls.extend(_expected_calls_for("cloudtail"))
Congbin Guo522cd982022-10-06 11:47:28 -0700292 calls.extend(_expected_calls_for("common-tls"))
Alex Klein1699fab2022-09-08 08:46:06 -0600293 calls.extend(_expected_calls_for("curl"))
Congbin Guo522cd982022-10-06 11:47:28 -0700294 calls.extend(_expected_calls_for("dnsmasq"))
295 calls.extend(_expected_calls_for("drone-agent"))
296 calls.extend(_expected_calls_for("fleet-tlw"))
Alex Klein1699fab2022-09-08 08:46:06 -0600297 calls.extend(_expected_calls_for("getty"))
Alex Klein1699fab2022-09-08 08:46:06 -0600298 calls.extend(_expected_calls_for("gs_offloader"))
299 calls.extend(_expected_calls_for("gsutil"))
300 calls.extend(_expected_calls_for("java"))
Congbin Guo4ccf0632023-02-12 00:01:14 -0800301 calls.extend(_expected_calls_for("k8s_system"))
Congbin Guo522cd982022-10-06 11:47:28 -0700302 calls.extend(_expected_calls_for("labservice"))
Alex Klein1699fab2022-09-08 08:46:06 -0600303 calls.extend(_expected_calls_for("lxc-attach"))
304 calls.extend(_expected_calls_for("lxc-start"))
Congbin Guoa8432502023-01-23 20:31:01 -0800305 calls.extend(_expected_calls_for("podman-pull"))
306 calls.extend(_expected_calls_for("podman-run"))
Congbin Guo91355e12023-02-14 13:51:20 -0800307 calls.extend(_expected_calls_for("phosphorus-fetch-crashes"))
308 calls.extend(_expected_calls_for("phosphorus-prejob"))
309 calls.extend(_expected_calls_for("phosphorus-run-test"))
310 calls.extend(_expected_calls_for("phosphorus-upload-to-gs"))
311 calls.extend(_expected_calls_for("phosphorus-upload-to-tko"))
312 calls.extend(_expected_calls_for("phosphorus-other"))
Congbin Guo4ccf0632023-02-12 00:01:14 -0800313 calls.extend(_expected_calls_for("recipe"))
Alex Klein1699fab2022-09-08 08:46:06 -0600314 calls.extend(_expected_calls_for("sshd"))
315 calls.extend(_expected_calls_for("swarming_bot"))
Congbin Guo4ccf0632023-02-12 00:01:14 -0800316 calls.extend(_expected_calls_for("swarming_sub_task"))
Alex Klein1699fab2022-09-08 08:46:06 -0600317 calls.extend(_expected_calls_for("sysmon"))
Congbin Guo522cd982022-10-06 11:47:28 -0700318 calls.extend(_expected_calls_for("tko_proxy"))
Alex Klein1699fab2022-09-08 08:46:06 -0600319 calls.extend(_expected_calls_for("other"))
320 setter.assert_has_calls(calls)
321 self.assertEqual(len(setter.mock_calls), len(calls))