diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..807840a3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +__pypackages__/ +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +htmlcov/ +cover/ +target/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST +*.manifest +*.spec +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +.pybuilder/ +.env +.venv + diff --git a/inotify-instances b/inotify-instances deleted file mode 100755 index 86c1132b..00000000 --- a/inotify-instances +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/env python3 - -""" -Expose Linux inotify(7) instance resource consumption. - -Operational properties: - - - This script may be invoked as an unprivileged user; in this case, metrics - will only be exposed for processes owned by that unprivileged user. - - - No metrics will be exposed for processes that do not hold any inotify fds. - -Requires Python 3.5 or later. -""" - -import collections -import os -import sys -from prometheus_client import CollectorRegistry, Gauge, generate_latest - - -class Error(Exception): - pass - - -class _PIDGoneError(Error): - pass - - -_Process = collections.namedtuple( - "Process", ["pid", "uid", "command", "inotify_instances"]) - - -def _read_bytes(name): - with open(name, mode='rb') as f: - return f.read() - - -def _pids(): - for n in os.listdir("/proc"): - if not n.isdigit(): - continue - yield int(n) - - -def _pid_uid(pid): - try: - s = os.stat("/proc/{}".format(pid)) - except FileNotFoundError: - raise _PIDGoneError() - return s.st_uid - - -def _pid_command(pid): - # Avoid GNU ps(1) for it truncates comm. - # https://bugs.launchpad.net/ubuntu/+source/procps/+bug/295876/comments/3 - try: - cmdline = _read_bytes("/proc/{}/cmdline".format(pid)) - except FileNotFoundError: - raise _PIDGoneError() - - if not len(cmdline): - return "" - - try: - prog = cmdline[0:cmdline.index(0x00)] - except ValueError: - prog = cmdline - return os.path.basename(prog).decode(encoding="ascii", - errors="surrogateescape") - - -def _pid_inotify_instances(pid): - instances = 0 - try: - for fd in os.listdir("/proc/{}/fd".format(pid)): - try: - target = os.readlink("/proc/{}/fd/{}".format(pid, fd)) - except FileNotFoundError: - continue - if target == "anon_inode:inotify": - instances += 1 - except FileNotFoundError: - raise _PIDGoneError() - return instances - - -def _get_processes(): - for p in _pids(): - try: - yield _Process(p, _pid_uid(p), _pid_command(p), - _pid_inotify_instances(p)) - except (PermissionError, _PIDGoneError): - continue - - -def _get_processes_nontrivial(): - return (p for p in _get_processes() if p.inotify_instances > 0) - - -def main(args_unused=None): - registry = CollectorRegistry() - - g = Gauge('inotify_instances', 'Total number of inotify instances held open by a process.', - ['pid', 'uid', 'command'], registry=registry) - - for proc in _get_processes_nontrivial(): - g.labels(proc.pid, proc.uid, proc.command).set(proc.inotify_instances) - print(generate_latest(registry).decode(), end='') - - -if __name__ == "__main__": - sys.exit(main(sys.argv)) diff --git a/inotify_instances.py b/inotify_instances.py new file mode 100755 index 00000000..5eb8e599 --- /dev/null +++ b/inotify_instances.py @@ -0,0 +1,209 @@ +#!/usr/bin/env python3 + +""" +Expose Linux inotify(7) instance resource consumption. + +Operational properties: + + - This script may be invoked as an unprivileged user; in this case, metrics + will only be exposed for processes owned by that unprivileged user. + + - No metrics will be exposed for processes that do not hold any inotify fds. + +Requires Python 3.5 or later. +""" + +import argparse +import collections +import os +import re +import sys + +from prometheus_client import CollectorRegistry, Gauge, generate_latest + +__doc__ = "Exponse Linux Kernel inode information as Prometheus metrics." +_NotifyTarget = "anon_inode:inotify" +_Proc = "/proc" +_CommFile = "cmdline" +_StatsFile = "status" +_DescriptorDir = "fd" + + +class Error(Exception): + pass + + +class _PIDGoneError(Error): + pass + + +_Process = collections.namedtuple( + "Process", ["pid", "uid", "command", "inotify_instances"] +) + + +def _read_bytes(name): + with open(name, mode="rb") as f: + return f.read() + + +def _pids(proc=_Proc): + for n in os.listdir(proc): + if not n.isdigit(): + continue + yield int(n) + + +def _pid_uid(status): + try: + s = os.stat(status) + except FileNotFoundError: + raise _PIDGoneError() + return s.st_uid + + +def _pid_command(cmdline): + # Avoid GNU ps(1) for it truncates comm. + # https://bugs.launchpad.net/ubuntu/+source/procps/+bug/295876/comments/3 + try: + cmdline = _read_bytes(cmdline) + except FileNotFoundError: + raise _PIDGoneError() + + if not len(cmdline): + return "" + + try: + prog = cmdline[0:cmdline.index(0x00)] + except ValueError: + prog = cmdline + return os.path.basename(prog).decode(encoding="ascii", errors="surrogateescape") + + +def _pid_inotify_instances(descriptors): + instances = 0 + try: + for fd in os.listdir(descriptors): + try: + target = os.readlink(os.path.join(descriptors, fd)) + except FileNotFoundError: + continue + if target == _NotifyTarget: + instances += 1 + except FileNotFoundError: + raise _PIDGoneError() + return instances + + +def _get_processes(proc=_Proc): + for p in _pids(proc): + try: + pid = str(p) + status = os.path.join(proc, pid, _StatsFile) + cmdline = os.path.join(proc, pid, _CommFile) + descriptors = os.path.join(proc, pid, _DescriptorDir) + yield _Process( + p, + _pid_uid(status), + _pid_command(cmdline), + _pid_inotify_instances(descriptors), + ) + except (PermissionError, _PIDGoneError): + continue + + +def _generate_process_metrics(command=None, users=[], proc=_Proc): + registry = CollectorRegistry() + namespace = "inotify" + + g = Gauge( + "instances", + "Total number of inotify instances held open by a process.", + ["pid", "uid", "command"], + namespace=namespace, + registry=registry, + ) + + for proc in _get_processes(proc): + if proc.inotify_instances <= 0: + continue + elif users and proc.uid not in users: + continue + elif command and not command.match(proc.command): + continue + + g.labels(proc.pid, proc.uid, proc.command).set(proc.inotify_instances) + + return generate_latest(registry).decode() + + +def _generate_user_metrics(users=[], proc=_Proc): + registry = CollectorRegistry() + namespace = "inotify" + + g = Gauge( + "user_instances", + "Total number of inotify instances held open by a user.", + ["uid"], + namespace=namespace, + registry=registry, + ) + + for proc in _get_processes(proc): + if proc.inotify_instances <= 0: + continue + elif users and proc.uid not in users: + continue + + g.labels(proc.uid).inc() + + return generate_latest(registry).decode() + + +def main(argv=[__name__]): + parser = argparse.ArgumentParser( + prog=os.path.basename(argv[0]), + exit_on_error=False, + description=__doc__, + ) + parser.add_argument( + "-c", + "--command", + default=".+", + type=re.compile, + dest="command", + metavar="REGEX", + help="Filter metrics based on the process command", + ) + parser.add_argument( + "-u", + "--user", + action="append", + type=int, + dest="users", + metavar="UID", + help="Filter metrics based on the process user", + ) + parser.add_argument( + "-U", + "--user-summary", + action="store_true", + dest="user_summary", + help="Generate per-user metric summaries instead of per process", + ) + + try: + args = parser.parse_args(argv[1:]) + except argparse.ArgumentError as err: + print(err, file=sys.stderr) + return 1 + + if args.user_summary: + print(_generate_user_metrics(args.users), end="") + else: + print(_generate_process_metrics(args.command, args.users), end="") + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) diff --git a/mock/fixtures/inotify_instances/1/cmdline b/mock/fixtures/inotify_instances/1/cmdline new file mode 100755 index 00000000..7ef00dc3 Binary files /dev/null and b/mock/fixtures/inotify_instances/1/cmdline differ diff --git a/mock/fixtures/inotify_instances/1/fd/0 b/mock/fixtures/inotify_instances/1/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/1/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1/fd/1 b/mock/fixtures/inotify_instances/1/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/1/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1/fd/12 b/mock/fixtures/inotify_instances/1/fd/12 new file mode 120000 index 00000000..0a39b5fd --- /dev/null +++ b/mock/fixtures/inotify_instances/1/fd/12 @@ -0,0 +1 @@ +anon_inode:inotify \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1/fd/123 b/mock/fixtures/inotify_instances/1/fd/123 new file mode 120000 index 00000000..0a39b5fd --- /dev/null +++ b/mock/fixtures/inotify_instances/1/fd/123 @@ -0,0 +1 @@ +anon_inode:inotify \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1/fd/324 b/mock/fixtures/inotify_instances/1/fd/324 new file mode 120000 index 00000000..0a39b5fd --- /dev/null +++ b/mock/fixtures/inotify_instances/1/fd/324 @@ -0,0 +1 @@ +anon_inode:inotify \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1/fd/5 b/mock/fixtures/inotify_instances/1/fd/5 new file mode 120000 index 00000000..0a39b5fd --- /dev/null +++ b/mock/fixtures/inotify_instances/1/fd/5 @@ -0,0 +1 @@ +anon_inode:inotify \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1/fd/82 b/mock/fixtures/inotify_instances/1/fd/82 new file mode 120000 index 00000000..0a39b5fd --- /dev/null +++ b/mock/fixtures/inotify_instances/1/fd/82 @@ -0,0 +1 @@ +anon_inode:inotify \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1/fd/90 b/mock/fixtures/inotify_instances/1/fd/90 new file mode 120000 index 00000000..0a39b5fd --- /dev/null +++ b/mock/fixtures/inotify_instances/1/fd/90 @@ -0,0 +1 @@ +anon_inode:inotify \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1/status b/mock/fixtures/inotify_instances/1/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/1/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/1016/cmdline b/mock/fixtures/inotify_instances/1016/cmdline new file mode 100755 index 00000000..8d131f4d Binary files /dev/null and b/mock/fixtures/inotify_instances/1016/cmdline differ diff --git a/mock/fixtures/inotify_instances/1016/fd/0 b/mock/fixtures/inotify_instances/1016/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/1016/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1016/fd/1 b/mock/fixtures/inotify_instances/1016/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/1016/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1016/status b/mock/fixtures/inotify_instances/1016/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/1016/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/1017/cmdline b/mock/fixtures/inotify_instances/1017/cmdline new file mode 100755 index 00000000..a4b45c0d Binary files /dev/null and b/mock/fixtures/inotify_instances/1017/cmdline differ diff --git a/mock/fixtures/inotify_instances/1017/fd/0 b/mock/fixtures/inotify_instances/1017/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/1017/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1017/fd/1 b/mock/fixtures/inotify_instances/1017/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/1017/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1017/status b/mock/fixtures/inotify_instances/1017/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/1017/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/1024/cmdline b/mock/fixtures/inotify_instances/1024/cmdline new file mode 100644 index 00000000..a93cff7b --- /dev/null +++ b/mock/fixtures/inotify_instances/1024/cmdline @@ -0,0 +1 @@ +/usr/local/bin/rsyslogd \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1024/fd/0 b/mock/fixtures/inotify_instances/1024/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/1024/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1024/fd/1 b/mock/fixtures/inotify_instances/1024/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/1024/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1024/status b/mock/fixtures/inotify_instances/1024/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/1024/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/1025/cmdline b/mock/fixtures/inotify_instances/1025/cmdline new file mode 100755 index 00000000..03d855be Binary files /dev/null and b/mock/fixtures/inotify_instances/1025/cmdline differ diff --git a/mock/fixtures/inotify_instances/1025/fd/0 b/mock/fixtures/inotify_instances/1025/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/1025/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1025/fd/1 b/mock/fixtures/inotify_instances/1025/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/1025/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1025/status b/mock/fixtures/inotify_instances/1025/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/1025/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/1051/cmdline b/mock/fixtures/inotify_instances/1051/cmdline new file mode 100755 index 00000000..d811d4ec Binary files /dev/null and b/mock/fixtures/inotify_instances/1051/cmdline differ diff --git a/mock/fixtures/inotify_instances/1051/fd/0 b/mock/fixtures/inotify_instances/1051/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/1051/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1051/fd/1 b/mock/fixtures/inotify_instances/1051/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/1051/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1051/status b/mock/fixtures/inotify_instances/1051/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/1051/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/1189/cmdline b/mock/fixtures/inotify_instances/1189/cmdline new file mode 100755 index 00000000..b3918bbc Binary files /dev/null and b/mock/fixtures/inotify_instances/1189/cmdline differ diff --git a/mock/fixtures/inotify_instances/1189/fd/0 b/mock/fixtures/inotify_instances/1189/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/1189/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1189/fd/1 b/mock/fixtures/inotify_instances/1189/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/1189/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/1189/status b/mock/fixtures/inotify_instances/1189/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/1189/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/2787/cmdline b/mock/fixtures/inotify_instances/2787/cmdline new file mode 100755 index 00000000..a0aca6d1 Binary files /dev/null and b/mock/fixtures/inotify_instances/2787/cmdline differ diff --git a/mock/fixtures/inotify_instances/2787/fd/0 b/mock/fixtures/inotify_instances/2787/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/2787/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/2787/fd/1 b/mock/fixtures/inotify_instances/2787/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/2787/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/2787/status b/mock/fixtures/inotify_instances/2787/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/2787/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/3376/cmdline b/mock/fixtures/inotify_instances/3376/cmdline new file mode 100755 index 00000000..6be6295f Binary files /dev/null and b/mock/fixtures/inotify_instances/3376/cmdline differ diff --git a/mock/fixtures/inotify_instances/3376/fd/0 b/mock/fixtures/inotify_instances/3376/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/3376/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/3376/fd/1 b/mock/fixtures/inotify_instances/3376/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/3376/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/3376/status b/mock/fixtures/inotify_instances/3376/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/3376/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/512/cmdline b/mock/fixtures/inotify_instances/512/cmdline new file mode 100755 index 00000000..4a4cae8c Binary files /dev/null and b/mock/fixtures/inotify_instances/512/cmdline differ diff --git a/mock/fixtures/inotify_instances/512/fd/0 b/mock/fixtures/inotify_instances/512/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/512/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/512/fd/1 b/mock/fixtures/inotify_instances/512/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/512/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/512/fd/23 b/mock/fixtures/inotify_instances/512/fd/23 new file mode 120000 index 00000000..0a39b5fd --- /dev/null +++ b/mock/fixtures/inotify_instances/512/fd/23 @@ -0,0 +1 @@ +anon_inode:inotify \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/512/fd/30 b/mock/fixtures/inotify_instances/512/fd/30 new file mode 120000 index 00000000..0a39b5fd --- /dev/null +++ b/mock/fixtures/inotify_instances/512/fd/30 @@ -0,0 +1 @@ +anon_inode:inotify \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/512/fd/34 b/mock/fixtures/inotify_instances/512/fd/34 new file mode 120000 index 00000000..0a39b5fd --- /dev/null +++ b/mock/fixtures/inotify_instances/512/fd/34 @@ -0,0 +1 @@ +anon_inode:inotify \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/512/fd/35 b/mock/fixtures/inotify_instances/512/fd/35 new file mode 120000 index 00000000..0a39b5fd --- /dev/null +++ b/mock/fixtures/inotify_instances/512/fd/35 @@ -0,0 +1 @@ +anon_inode:inotify \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/512/fd/41 b/mock/fixtures/inotify_instances/512/fd/41 new file mode 120000 index 00000000..0a39b5fd --- /dev/null +++ b/mock/fixtures/inotify_instances/512/fd/41 @@ -0,0 +1 @@ +anon_inode:inotify \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/512/fd/890 b/mock/fixtures/inotify_instances/512/fd/890 new file mode 120000 index 00000000..0a39b5fd --- /dev/null +++ b/mock/fixtures/inotify_instances/512/fd/890 @@ -0,0 +1 @@ +anon_inode:inotify \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/512/status b/mock/fixtures/inotify_instances/512/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/512/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/547/cmdline b/mock/fixtures/inotify_instances/547/cmdline new file mode 100755 index 00000000..20ef68d3 Binary files /dev/null and b/mock/fixtures/inotify_instances/547/cmdline differ diff --git a/mock/fixtures/inotify_instances/547/fd/0 b/mock/fixtures/inotify_instances/547/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/547/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/547/fd/1 b/mock/fixtures/inotify_instances/547/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/547/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/547/status b/mock/fixtures/inotify_instances/547/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/547/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/548/cmdline b/mock/fixtures/inotify_instances/548/cmdline new file mode 100755 index 00000000..7178672d Binary files /dev/null and b/mock/fixtures/inotify_instances/548/cmdline differ diff --git a/mock/fixtures/inotify_instances/548/fd/0 b/mock/fixtures/inotify_instances/548/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/548/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/548/fd/1 b/mock/fixtures/inotify_instances/548/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/548/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/548/status b/mock/fixtures/inotify_instances/548/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/548/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/557/cmdline b/mock/fixtures/inotify_instances/557/cmdline new file mode 100755 index 00000000..2730100a Binary files /dev/null and b/mock/fixtures/inotify_instances/557/cmdline differ diff --git a/mock/fixtures/inotify_instances/557/fd/0 b/mock/fixtures/inotify_instances/557/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/557/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/557/fd/1 b/mock/fixtures/inotify_instances/557/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/557/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/557/status b/mock/fixtures/inotify_instances/557/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/557/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/569/cmdline b/mock/fixtures/inotify_instances/569/cmdline new file mode 100755 index 00000000..ffb9d461 Binary files /dev/null and b/mock/fixtures/inotify_instances/569/cmdline differ diff --git a/mock/fixtures/inotify_instances/569/fd/0 b/mock/fixtures/inotify_instances/569/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/569/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/569/fd/1 b/mock/fixtures/inotify_instances/569/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/569/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/569/status b/mock/fixtures/inotify_instances/569/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/569/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/7038/cmdline b/mock/fixtures/inotify_instances/7038/cmdline new file mode 100644 index 00000000..6bd011c5 --- /dev/null +++ b/mock/fixtures/inotify_instances/7038/cmdline @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/7038/fd/0 b/mock/fixtures/inotify_instances/7038/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/7038/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/7038/fd/1 b/mock/fixtures/inotify_instances/7038/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/7038/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/7038/status b/mock/fixtures/inotify_instances/7038/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/7038/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/727/cmdline b/mock/fixtures/inotify_instances/727/cmdline new file mode 100755 index 00000000..da63c749 Binary files /dev/null and b/mock/fixtures/inotify_instances/727/cmdline differ diff --git a/mock/fixtures/inotify_instances/727/fd/0 b/mock/fixtures/inotify_instances/727/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/727/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/727/fd/1 b/mock/fixtures/inotify_instances/727/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/727/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/727/fd/14 b/mock/fixtures/inotify_instances/727/fd/14 new file mode 120000 index 00000000..0a39b5fd --- /dev/null +++ b/mock/fixtures/inotify_instances/727/fd/14 @@ -0,0 +1 @@ +anon_inode:inotify \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/727/status b/mock/fixtures/inotify_instances/727/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/727/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/728/cmdline b/mock/fixtures/inotify_instances/728/cmdline new file mode 100755 index 00000000..a76e61c2 Binary files /dev/null and b/mock/fixtures/inotify_instances/728/cmdline differ diff --git a/mock/fixtures/inotify_instances/728/fd/0 b/mock/fixtures/inotify_instances/728/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/728/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/728/fd/1 b/mock/fixtures/inotify_instances/728/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/728/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/728/status b/mock/fixtures/inotify_instances/728/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/728/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/731/cmdline b/mock/fixtures/inotify_instances/731/cmdline new file mode 100755 index 00000000..6dd7905c Binary files /dev/null and b/mock/fixtures/inotify_instances/731/cmdline differ diff --git a/mock/fixtures/inotify_instances/731/fd/0 b/mock/fixtures/inotify_instances/731/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/731/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/731/fd/1 b/mock/fixtures/inotify_instances/731/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/731/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/731/fd/56 b/mock/fixtures/inotify_instances/731/fd/56 new file mode 120000 index 00000000..0a39b5fd --- /dev/null +++ b/mock/fixtures/inotify_instances/731/fd/56 @@ -0,0 +1 @@ +anon_inode:inotify \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/731/status b/mock/fixtures/inotify_instances/731/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/731/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/944/cmdline b/mock/fixtures/inotify_instances/944/cmdline new file mode 100755 index 00000000..9b0723e5 Binary files /dev/null and b/mock/fixtures/inotify_instances/944/cmdline differ diff --git a/mock/fixtures/inotify_instances/944/fd/0 b/mock/fixtures/inotify_instances/944/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/944/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/944/fd/1 b/mock/fixtures/inotify_instances/944/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/944/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/944/status b/mock/fixtures/inotify_instances/944/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/944/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/946/cmdline b/mock/fixtures/inotify_instances/946/cmdline new file mode 100755 index 00000000..2f11ae8d Binary files /dev/null and b/mock/fixtures/inotify_instances/946/cmdline differ diff --git a/mock/fixtures/inotify_instances/946/fd/0 b/mock/fixtures/inotify_instances/946/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/946/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/946/fd/1 b/mock/fixtures/inotify_instances/946/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/946/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/946/status b/mock/fixtures/inotify_instances/946/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/946/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/self/cmdline b/mock/fixtures/inotify_instances/self/cmdline new file mode 100755 index 00000000..b424652e --- /dev/null +++ b/mock/fixtures/inotify_instances/self/cmdline @@ -0,0 +1 @@ +/usr/local/bin/procmock \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/self/fd/0 b/mock/fixtures/inotify_instances/self/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/self/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/self/fd/1 b/mock/fixtures/inotify_instances/self/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/self/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/self/status b/mock/fixtures/inotify_instances/self/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/self/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/mock/fixtures/inotify_instances/thread-self/cmdline b/mock/fixtures/inotify_instances/thread-self/cmdline new file mode 100755 index 00000000..b424652e --- /dev/null +++ b/mock/fixtures/inotify_instances/thread-self/cmdline @@ -0,0 +1 @@ +/usr/local/bin/procmock \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/thread-self/fd/0 b/mock/fixtures/inotify_instances/thread-self/fd/0 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/thread-self/fd/0 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/thread-self/fd/1 b/mock/fixtures/inotify_instances/thread-self/fd/1 new file mode 120000 index 00000000..dc1dc0cd --- /dev/null +++ b/mock/fixtures/inotify_instances/thread-self/fd/1 @@ -0,0 +1 @@ +/dev/null \ No newline at end of file diff --git a/mock/fixtures/inotify_instances/thread-self/status b/mock/fixtures/inotify_instances/thread-self/status new file mode 100644 index 00000000..2c38b7eb --- /dev/null +++ b/mock/fixtures/inotify_instances/thread-self/status @@ -0,0 +1,2 @@ +Uid: 0 0 0 0 +Gid: 0 0 0 0 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..177706f3 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,29 @@ +[project] +name = "node-exporter-textfile-collector-scripts" +version = "0.0.0" +description = "Metric generators for use with the Prometheus Node Exporter textfile collector." +readme = "README.md" +license = {file = "LICENSE"} + +requires-python = ">=3.5,<4.0" +dependencies = [ + "prometheus_client", +] + +[project.optional-dependencies] +test = [ + "pytest", + "pytest-golden", +] + +[tool.pytest.ini_options] +pythonpath = "." +testpaths = "tests" +norecursedirs = [ + ".vscode", + ".github", + ".circleci", + ".pytest_cache", + "__pycache__", +] +enable_assertion_pass_hook = true diff --git a/tests/inotify_instances/test__get_processes.yml b/tests/inotify_instances/test__get_processes.yml new file mode 100644 index 00000000..ec3deb00 --- /dev/null +++ b/tests/inotify_instances/test__get_processes.yml @@ -0,0 +1,21 @@ +output: + - Process(pid=1, uid=0, command='init', inotify_instances=6) + - Process(pid=1016, uid=33, command='dbus-broker-launch', inotify_instances=0) + - Process(pid=1017, uid=33, command='dbus-broker', inotify_instances=0) + - Process(pid=1024, uid=33, command='rsyslogd', inotify_instances=0) + - Process(pid=1025, uid=33, command='polkitd', inotify_instances=0) + - Process(pid=1051, uid=33, command='rtkit-daemon', inotify_instances=0) + - Process(pid=1189, uid=33, command='at-spi-bus-launcher', inotify_instances=0) + - Process(pid=2787, uid=33, command='upowerd', inotify_instances=0) + - Process(pid=3376, uid=33, command='keyboxd', inotify_instances=0) + - Process(pid=512, uid=33, command='systemd-journald', inotify_instances=6) + - Process(pid=547, uid=33, command='systemd-resolved', inotify_instances=0) + - Process(pid=548, uid=33, command='systemd-timesyncd', inotify_instances=0) + - Process(pid=557, uid=33, command='systemd-udevd', inotify_instances=0) + - Process(pid=569, uid=33, command='systemd-networkd', inotify_instances=0) + - Process(pid=7038, uid=33, command='', inotify_instances=0) + - Process(pid=727, uid=33, command='dbus-broker-launch', inotify_instances=1) + - Process(pid=728, uid=33, command='dbus-broker', inotify_instances=0) + - Process(pid=731, uid=33, command='systemd-logind', inotify_instances=1) + - Process(pid=944, uid=33, command='systemd', inotify_instances=0) + - Process(pid=946, uid=33, command='(sd-pam)', inotify_instances=0) diff --git a/tests/inotify_instances/test__pids.yml b/tests/inotify_instances/test__pids.yml new file mode 100644 index 00000000..3de68698 --- /dev/null +++ b/tests/inotify_instances/test__pids.yml @@ -0,0 +1,21 @@ +output: +- 1 +- 512 +- 547 +- 548 +- 557 +- 569 +- 727 +- 728 +- 731 +- 944 +- 946 +- 1016 +- 1017 +- 1024 +- 1025 +- 1051 +- 1189 +- 2787 +- 3376 +- 7038 diff --git a/tests/inotify_instances/test_generate_process_metrics.yml b/tests/inotify_instances/test_generate_process_metrics.yml new file mode 100644 index 00000000..e9ef0d0e --- /dev/null +++ b/tests/inotify_instances/test_generate_process_metrics.yml @@ -0,0 +1,7 @@ +output: | + # HELP inotify_instances Total number of inotify instances held open by a process. + # TYPE inotify_instances gauge + inotify_instances{command="init",pid="1",uid="0"} 6.0 + inotify_instances{command="dbus-broker-launch",pid="727",uid="33"} 1.0 + inotify_instances{command="systemd-journald",pid="512",uid="33"} 6.0 + inotify_instances{command="systemd-logind",pid="731",uid="33"} 1.0 diff --git a/tests/inotify_instances/test_generate_process_metrics_command.yml b/tests/inotify_instances/test_generate_process_metrics_command.yml new file mode 100644 index 00000000..d504812f --- /dev/null +++ b/tests/inotify_instances/test_generate_process_metrics_command.yml @@ -0,0 +1,5 @@ +output: | + # HELP inotify_instances Total number of inotify instances held open by a process. + # TYPE inotify_instances gauge + inotify_instances{command="systemd-journald",pid="512",uid="33"} 6.0 + inotify_instances{command="systemd-logind",pid="731",uid="33"} 1.0 diff --git a/tests/inotify_instances/test_generate_process_metrics_no_command.yml b/tests/inotify_instances/test_generate_process_metrics_no_command.yml new file mode 100644 index 00000000..262f65c6 --- /dev/null +++ b/tests/inotify_instances/test_generate_process_metrics_no_command.yml @@ -0,0 +1,3 @@ +output: | + # HELP inotify_instances Total number of inotify instances held open by a process. + # TYPE inotify_instances gauge diff --git a/tests/inotify_instances/test_generate_process_metrics_no_user.yml b/tests/inotify_instances/test_generate_process_metrics_no_user.yml new file mode 100644 index 00000000..262f65c6 --- /dev/null +++ b/tests/inotify_instances/test_generate_process_metrics_no_user.yml @@ -0,0 +1,3 @@ +output: | + # HELP inotify_instances Total number of inotify instances held open by a process. + # TYPE inotify_instances gauge diff --git a/tests/inotify_instances/test_generate_process_metrics_user.yml b/tests/inotify_instances/test_generate_process_metrics_user.yml new file mode 100644 index 00000000..2926c16b --- /dev/null +++ b/tests/inotify_instances/test_generate_process_metrics_user.yml @@ -0,0 +1,4 @@ +output: | + # HELP inotify_instances Total number of inotify instances held open by a process. + # TYPE inotify_instances gauge + inotify_instances{command="init",pid="1",uid="0"} 6.0 diff --git a/tests/inotify_instances/test_generate_user_metrics.yml b/tests/inotify_instances/test_generate_user_metrics.yml new file mode 100644 index 00000000..a8c957f7 --- /dev/null +++ b/tests/inotify_instances/test_generate_user_metrics.yml @@ -0,0 +1,5 @@ +output: | + # HELP inotify_user_instances Total number of inotify instances held open by a user. + # TYPE inotify_user_instances gauge + inotify_user_instances{uid="0"} 1.0 + inotify_user_instances{uid="33"} 3.0 diff --git a/tests/inotify_instances/test_generate_user_metrics_no_user.yml b/tests/inotify_instances/test_generate_user_metrics_no_user.yml new file mode 100644 index 00000000..058acb5b --- /dev/null +++ b/tests/inotify_instances/test_generate_user_metrics_no_user.yml @@ -0,0 +1,3 @@ +output: | + # HELP inotify_user_instances Total number of inotify instances held open by a user. + # TYPE inotify_user_instances gauge diff --git a/tests/inotify_instances/test_generate_user_metrics_user.yml b/tests/inotify_instances/test_generate_user_metrics_user.yml new file mode 100644 index 00000000..459b5376 --- /dev/null +++ b/tests/inotify_instances/test_generate_user_metrics_user.yml @@ -0,0 +1,4 @@ +output: | + # HELP inotify_user_instances Total number of inotify instances held open by a user. + # TYPE inotify_user_instances gauge + inotify_user_instances{uid="33"} 3.0 diff --git a/tests/test_inotify_instances.py b/tests/test_inotify_instances.py new file mode 100644 index 00000000..3b69532a --- /dev/null +++ b/tests/test_inotify_instances.py @@ -0,0 +1,115 @@ +import os +import re + +import pytest + +import inotify_instances + + +class StatMock: + def __init__(self, uid): + self.uid = uid + + def __repr__(self): + return f"StatMock(uid={self.uid})" + + def __call__(self, f): + pid = os.path.basename(os.path.dirname(f)) + if pid == "1": + # ensure at least one file is not affected by the mock + # to generate some diversity + return 0 + return self.uid + + +@pytest.fixture +def golden(request, golden): + return golden.open(f"inotify_instances/{request.node.name}.yml") + + +@pytest.fixture +def proc(): + return os.path.abspath( + os.path.join(__file__, "..", "..", "mock", "fixtures", "inotify_instances") + ) + + +@pytest.fixture +def stat(): + return StatMock(33) + + +def test__pids(proc, golden): + pids = inotify_instances._pids(proc) + + assert sorted(list(pids)) == golden["output"] + + +def test__get_processes(proc, stat, golden): + inotify_instances._pid_uid = stat + procs = inotify_instances._get_processes(proc) + + assert sorted(map(str, procs)) == golden["output"] + + +def test_generate_process_metrics(proc, stat, golden): + inotify_instances._pid_uid = stat + command = re.compile(".+") + output = inotify_instances._generate_process_metrics(command=command, proc=proc) + + assert output == golden["output"] + + +def test_generate_process_metrics_command(proc, stat, golden): + inotify_instances._pid_uid = stat + command = re.compile("systemd-.+") + output = inotify_instances._generate_process_metrics(command=command, proc=proc) + + assert output == golden["output"] + + +def test_generate_process_metrics_no_command(proc, stat, golden): + inotify_instances._pid_uid = stat + command = re.compile("prom.+") + output = inotify_instances._generate_process_metrics(command=command, proc=proc) + + assert output == golden["output"] + + +def test_generate_process_metrics_user(proc, stat, golden): + inotify_instances._pid_uid = stat + users = [0] + output = inotify_instances._generate_process_metrics(users=users, proc=proc) + + assert output == golden["output"] + + +def test_generate_process_metrics_no_user(proc, stat, golden): + inotify_instances._pid_uid = stat + users = [42] + output = inotify_instances._generate_process_metrics(users=users, proc=proc) + + assert output == golden["output"] + + +def test_generate_user_metrics(proc, stat, golden): + inotify_instances._pid_uid = stat + output = inotify_instances._generate_user_metrics(proc=proc) + + assert output == golden["output"] + + +def test_generate_user_metrics_user(proc, stat, golden): + inotify_instances._pid_uid = stat + users = [33] + output = inotify_instances._generate_user_metrics(users=users, proc=proc) + + assert output == golden["output"] + + +def test_generate_user_metrics_no_user(proc, stat, golden): + inotify_instances._pid_uid = stat + users = [42] + output = inotify_instances._generate_user_metrics(users=users, proc=proc) + + assert output == golden["output"]