Mike Frysinger | f1ba7ad | 2022-09-12 05:42:57 -0400 | [diff] [blame] | 1 | # Copyright 2017 The ChromiumOS Authors |
Allen Li | ca61e06 | 2017-07-13 13:15:21 -0700 | [diff] [blame] | 2 | # 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 | |
| 9 | from __future__ import absolute_import |
Allen Li | ca61e06 | 2017-07-13 13:15:21 -0700 | [diff] [blame] | 10 | |
Mike Frysinger | 166fea0 | 2021-02-12 05:30:33 -0500 | [diff] [blame] | 11 | from unittest import mock |
| 12 | |
Mike Frysinger | cb56b64 | 2019-08-25 15:33:08 -0400 | [diff] [blame] | 13 | import psutil # pylint: disable=import-error |
Allen Li | ca61e06 | 2017-07-13 13:15:21 -0700 | [diff] [blame] | 14 | |
| 15 | from chromite.lib import cros_test_lib |
| 16 | from chromite.scripts.sysmon import proc_metrics |
| 17 | |
| 18 | |
Congbin Guo | 16b64d5 | 2023-02-10 17:50:30 -0800 | [diff] [blame] | 19 | def _mock_process(name, cmdline, parent=None, num_threads=10): |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 20 | proc = mock.Mock(dir(psutil.Process)) |
| 21 | proc.name.return_value = name |
| 22 | proc.cmdline.return_value = cmdline |
Congbin Guo | 16b64d5 | 2023-02-10 17:50:30 -0800 | [diff] [blame] | 23 | proc.num_threads.return_value = num_threads |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 24 | proc.cpu_percent.return_value = 2 |
Congbin Guo | 18b4ed7 | 2023-02-11 19:16:16 -0800 | [diff] [blame] | 25 | |
| 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 Guo | cf2750c | 2023-02-11 21:25:16 -0800 | [diff] [blame] | 31 | |
| 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 Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 39 | if parent is not None: |
| 40 | proc.parent.return_value = parent |
| 41 | return proc |
Allen Li | ca61e06 | 2017-07-13 13:15:21 -0700 | [diff] [blame] | 42 | |
| 43 | |
| 44 | def _mock_forked_process(name, cmdline): |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 45 | parent_proc = _mock_process(name, cmdline) |
| 46 | return _mock_process(name, cmdline, parent=parent_proc) |
Allen Li | ca61e06 | 2017-07-13 13:15:21 -0700 | [diff] [blame] | 47 | |
| 48 | |
Allen Li | 3992c66 | 2018-01-05 15:26:36 -0800 | [diff] [blame] | 49 | def _expected_calls_for(name): |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 50 | """Return expected calls for a process metric.""" |
| 51 | return [ |
| 52 | mock.call("proc/count", (name,), None, 1, enforce_ge=mock.ANY), |
Congbin Guo | 16b64d5 | 2023-02-10 17:50:30 -0800 | [diff] [blame] | 53 | mock.call("proc/thread_count", (name,), None, 10, enforce_ge=mock.ANY), |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 54 | mock.call("proc/cpu_percent", (name,), None, 2, enforce_ge=mock.ANY), |
| 55 | ] |
Allen Li | 3992c66 | 2018-01-05 15:26:36 -0800 | [diff] [blame] | 56 | |
| 57 | |
Allen Li | ca61e06 | 2017-07-13 13:15:21 -0700 | [diff] [blame] | 58 | class TestProcMetrics(cros_test_lib.TestCase): |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 59 | """Tests for proc_metrics.""" |
Allen Li | ca61e06 | 2017-07-13 13:15:21 -0700 | [diff] [blame] | 60 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 61 | 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 Li | ca61e06 | 2017-07-13 13:15:21 -0700 | [diff] [blame] | 68 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 69 | 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 Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 189 | _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 Guo | 522cd98 | 2022-10-06 11:47:28 -0700 | [diff] [blame] | 202 | _mock_process( |
| 203 | name="common-tls", |
Congbin Guo | fcb436b | 2023-01-23 20:36:01 -0800 | [diff] [blame] | 204 | cmdline=["/opt/infra-tools/common-tls", "-port", "..."], |
Congbin Guo | 522cd98 | 2022-10-06 11:47:28 -0700 | [diff] [blame] | 205 | ), |
| 206 | _mock_process( |
| 207 | name="fleet-tlw", |
Congbin Guo | fcb436b | 2023-01-23 20:36:01 -0800 | [diff] [blame] | 208 | cmdline=["/opt/infra-tools/fleet-tlw", "-port", "..."], |
Congbin Guo | 522cd98 | 2022-10-06 11:47:28 -0700 | [diff] [blame] | 209 | ), |
| 210 | _mock_process( |
Congbin Guo | fcb436b | 2023-01-23 20:36:01 -0800 | [diff] [blame] | 211 | name="drone-agent", cmdline=["/opt/infra-tools/drone-agent"] |
Congbin Guo | 522cd98 | 2022-10-06 11:47:28 -0700 | [diff] [blame] | 212 | ), |
Congbin Guo | fcb436b | 2023-01-23 20:36:01 -0800 | [diff] [blame] | 213 | _mock_process(name="dnsmasq", cmdline=["dnsmasq", "..."]), |
Congbin Guo | 522cd98 | 2022-10-06 11:47:28 -0700 | [diff] [blame] | 214 | _mock_process( |
| 215 | name="labservice", |
Congbin Guo | fcb436b | 2023-01-23 20:36:01 -0800 | [diff] [blame] | 216 | cmdline=["/opt/infra-tools/labservice", "-addr", "..."], |
Congbin Guo | 522cd98 | 2022-10-06 11:47:28 -0700 | [diff] [blame] | 217 | ), |
| 218 | _mock_process( |
| 219 | name="cloud_sql_proxy", |
| 220 | cmdline=[ |
Congbin Guo | fcb436b | 2023-01-23 20:36:01 -0800 | [diff] [blame] | 221 | "/opt/cloud_sql_proxy", |
| 222 | "-dir=/var/run/tko_proxy", |
Congbin Guo | 522cd98 | 2022-10-06 11:47:28 -0700 | [diff] [blame] | 223 | "-instances=google.com:chromeos-lab:us-central1:tko", |
Congbin Guo | fcb436b | 2023-01-23 20:36:01 -0800 | [diff] [blame] | 224 | "-credential_file=...", |
Congbin Guo | 522cd98 | 2022-10-06 11:47:28 -0700 | [diff] [blame] | 225 | ], |
| 226 | ), |
Congbin Guo | 3cdc11e | 2022-10-11 16:02:32 -0700 | [diff] [blame] | 227 | _mock_process( |
| 228 | name="downloader", |
Congbin Guo | fcb436b | 2023-01-23 20:36:01 -0800 | [diff] [blame] | 229 | cmdline=["./downloader", "-credential-file", "..."], |
Congbin Guo | 3cdc11e | 2022-10-11 16:02:32 -0700 | [diff] [blame] | 230 | ), |
Congbin Guo | a843250 | 2023-01-23 20:31:01 -0800 | [diff] [blame] | 231 | _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 Guo | 4ccf063 | 2023-02-12 00:01:14 -0800 | [diff] [blame] | 240 | _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 Guo | 91355e1 | 2023-02-14 13:51:20 -0800 | [diff] [blame^] | 248 | 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 Guo | 4ccf063 | 2023-02-12 00:01:14 -0800 | [diff] [blame] | 263 | 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 Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 281 | ] |
| 282 | proc_metrics.collect_proc_info() |
Allen Li | ca61e06 | 2017-07-13 13:15:21 -0700 | [diff] [blame] | 283 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 284 | setter = self.store.set |
| 285 | calls = [] |
Congbin Guo | 4ccf063 | 2023-02-12 00:01:14 -0800 | [diff] [blame] | 286 | calls.extend(_expected_calls_for("adb")) |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 287 | calls.extend(_expected_calls_for("autoserv")) |
Congbin Guo | 4ccf063 | 2023-02-12 00:01:14 -0800 | [diff] [blame] | 288 | calls.extend(_expected_calls_for("bbagent")) |
Congbin Guo | 3cdc11e | 2022-10-11 16:02:32 -0700 | [diff] [blame] | 289 | calls.extend(_expected_calls_for("cache-downloader")) |
Congbin Guo | a843250 | 2023-01-23 20:31:01 -0800 | [diff] [blame] | 290 | calls.extend(_expected_calls_for("cipd")) |
Congbin Guo | 4ccf063 | 2023-02-12 00:01:14 -0800 | [diff] [blame] | 291 | calls.extend(_expected_calls_for("cloudtail")) |
Congbin Guo | 522cd98 | 2022-10-06 11:47:28 -0700 | [diff] [blame] | 292 | calls.extend(_expected_calls_for("common-tls")) |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 293 | calls.extend(_expected_calls_for("curl")) |
Congbin Guo | 522cd98 | 2022-10-06 11:47:28 -0700 | [diff] [blame] | 294 | calls.extend(_expected_calls_for("dnsmasq")) |
| 295 | calls.extend(_expected_calls_for("drone-agent")) |
| 296 | calls.extend(_expected_calls_for("fleet-tlw")) |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 297 | calls.extend(_expected_calls_for("getty")) |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 298 | calls.extend(_expected_calls_for("gs_offloader")) |
| 299 | calls.extend(_expected_calls_for("gsutil")) |
| 300 | calls.extend(_expected_calls_for("java")) |
Congbin Guo | 4ccf063 | 2023-02-12 00:01:14 -0800 | [diff] [blame] | 301 | calls.extend(_expected_calls_for("k8s_system")) |
Congbin Guo | 522cd98 | 2022-10-06 11:47:28 -0700 | [diff] [blame] | 302 | calls.extend(_expected_calls_for("labservice")) |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 303 | calls.extend(_expected_calls_for("lxc-attach")) |
| 304 | calls.extend(_expected_calls_for("lxc-start")) |
Congbin Guo | a843250 | 2023-01-23 20:31:01 -0800 | [diff] [blame] | 305 | calls.extend(_expected_calls_for("podman-pull")) |
| 306 | calls.extend(_expected_calls_for("podman-run")) |
Congbin Guo | 91355e1 | 2023-02-14 13:51:20 -0800 | [diff] [blame^] | 307 | 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 Guo | 4ccf063 | 2023-02-12 00:01:14 -0800 | [diff] [blame] | 313 | calls.extend(_expected_calls_for("recipe")) |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 314 | calls.extend(_expected_calls_for("sshd")) |
| 315 | calls.extend(_expected_calls_for("swarming_bot")) |
Congbin Guo | 4ccf063 | 2023-02-12 00:01:14 -0800 | [diff] [blame] | 316 | calls.extend(_expected_calls_for("swarming_sub_task")) |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 317 | calls.extend(_expected_calls_for("sysmon")) |
Congbin Guo | 522cd98 | 2022-10-06 11:47:28 -0700 | [diff] [blame] | 318 | calls.extend(_expected_calls_for("tko_proxy")) |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 319 | calls.extend(_expected_calls_for("other")) |
| 320 | setter.assert_has_calls(calls) |
| 321 | self.assertEqual(len(setter.mock_calls), len(calls)) |