From d823f8090b8fa31ee17f9193e8215ebf2c712ada Mon Sep 17 00:00:00 2001 From: Gordon Bleux <33967640+UiP9AV6Y@users.noreply.github.com> Date: Sat, 18 Jan 2025 11:18:17 +0100 Subject: [PATCH] inotify_instance: add commandline arguments for command and user filtering on systems with many short lived processes, the cardinality of the rendered metrics can become quite bad. this change adds commandline arguments to the script to support filtering of processes based on the process command or user. the script logic remains backwards compatible as it continues to emit metrics for all accessible process information if not filters are provided. alternatively the rendered metrics can be summed up by user to reduce the cardinality even further. Signed-off-by: Gordon Bleux <33967640+UiP9AV6Y@users.noreply.github.com> --- .gitignore | 43 ++++ inotify-instances | 113 ---------- inotify_instances.py | 209 ++++++++++++++++++ mock/fixtures/inotify_instances/1/cmdline | Bin 0 -> 11 bytes mock/fixtures/inotify_instances/1/fd/0 | 1 + mock/fixtures/inotify_instances/1/fd/1 | 1 + mock/fixtures/inotify_instances/1/fd/12 | 1 + mock/fixtures/inotify_instances/1/fd/123 | 1 + mock/fixtures/inotify_instances/1/fd/324 | 1 + mock/fixtures/inotify_instances/1/fd/5 | 1 + mock/fixtures/inotify_instances/1/fd/82 | 1 + mock/fixtures/inotify_instances/1/fd/90 | 1 + mock/fixtures/inotify_instances/1/status | 2 + mock/fixtures/inotify_instances/1016/cmdline | Bin 0 -> 41 bytes mock/fixtures/inotify_instances/1016/fd/0 | 1 + mock/fixtures/inotify_instances/1016/fd/1 | 1 + mock/fixtures/inotify_instances/1016/status | 2 + mock/fixtures/inotify_instances/1017/cmdline | Bin 0 -> 140 bytes mock/fixtures/inotify_instances/1017/fd/0 | 1 + mock/fixtures/inotify_instances/1017/fd/1 | 1 + mock/fixtures/inotify_instances/1017/status | 2 + mock/fixtures/inotify_instances/1024/cmdline | 1 + mock/fixtures/inotify_instances/1024/fd/0 | 1 + mock/fixtures/inotify_instances/1024/fd/1 | 1 + mock/fixtures/inotify_instances/1024/status | 2 + mock/fixtures/inotify_instances/1025/cmdline | Bin 0 -> 53 bytes mock/fixtures/inotify_instances/1025/fd/0 | 1 + mock/fixtures/inotify_instances/1025/fd/1 | 1 + mock/fixtures/inotify_instances/1025/status | 2 + mock/fixtures/inotify_instances/1051/cmdline | Bin 0 -> 22 bytes mock/fixtures/inotify_instances/1051/fd/0 | 1 + mock/fixtures/inotify_instances/1051/fd/1 | 1 + mock/fixtures/inotify_instances/1051/status | 2 + mock/fixtures/inotify_instances/1189/cmdline | Bin 0 -> 29 bytes mock/fixtures/inotify_instances/1189/fd/0 | 1 + mock/fixtures/inotify_instances/1189/fd/1 | 1 + mock/fixtures/inotify_instances/1189/status | 2 + mock/fixtures/inotify_instances/2787/cmdline | Bin 0 -> 17 bytes mock/fixtures/inotify_instances/2787/fd/0 | 1 + mock/fixtures/inotify_instances/2787/fd/1 | 1 + mock/fixtures/inotify_instances/2787/status | 2 + mock/fixtures/inotify_instances/3376/cmdline | Bin 0 -> 36 bytes mock/fixtures/inotify_instances/3376/fd/0 | 1 + mock/fixtures/inotify_instances/3376/fd/1 | 1 + mock/fixtures/inotify_instances/3376/status | 2 + mock/fixtures/inotify_instances/512/cmdline | Bin 0 -> 34 bytes mock/fixtures/inotify_instances/512/fd/0 | 1 + mock/fixtures/inotify_instances/512/fd/1 | 1 + mock/fixtures/inotify_instances/512/fd/23 | 1 + mock/fixtures/inotify_instances/512/fd/30 | 1 + mock/fixtures/inotify_instances/512/fd/34 | 1 + mock/fixtures/inotify_instances/512/fd/35 | 1 + mock/fixtures/inotify_instances/512/fd/41 | 1 + mock/fixtures/inotify_instances/512/fd/890 | 1 + mock/fixtures/inotify_instances/512/status | 2 + mock/fixtures/inotify_instances/547/cmdline | Bin 0 -> 34 bytes mock/fixtures/inotify_instances/547/fd/0 | 1 + mock/fixtures/inotify_instances/547/fd/1 | 1 + mock/fixtures/inotify_instances/547/status | 2 + mock/fixtures/inotify_instances/548/cmdline | Bin 0 -> 35 bytes mock/fixtures/inotify_instances/548/fd/0 | 1 + mock/fixtures/inotify_instances/548/fd/1 | 1 + mock/fixtures/inotify_instances/548/status | 2 + mock/fixtures/inotify_instances/557/cmdline | Bin 0 -> 31 bytes mock/fixtures/inotify_instances/557/fd/0 | 1 + mock/fixtures/inotify_instances/557/fd/1 | 1 + mock/fixtures/inotify_instances/557/status | 2 + mock/fixtures/inotify_instances/569/cmdline | Bin 0 -> 34 bytes mock/fixtures/inotify_instances/569/fd/0 | 1 + mock/fixtures/inotify_instances/569/fd/1 | 1 + mock/fixtures/inotify_instances/569/status | 2 + mock/fixtures/inotify_instances/7038/cmdline | 1 + mock/fixtures/inotify_instances/7038/fd/0 | 1 + mock/fixtures/inotify_instances/7038/fd/1 | 1 + mock/fixtures/inotify_instances/7038/status | 2 + mock/fixtures/inotify_instances/727/cmdline | Bin 0 -> 51 bytes mock/fixtures/inotify_instances/727/fd/0 | 1 + mock/fixtures/inotify_instances/727/fd/1 | 1 + mock/fixtures/inotify_instances/727/fd/14 | 1 + mock/fixtures/inotify_instances/727/status | 2 + mock/fixtures/inotify_instances/728/cmdline | Bin 0 -> 126 bytes mock/fixtures/inotify_instances/728/fd/0 | 1 + mock/fixtures/inotify_instances/728/fd/1 | 1 + mock/fixtures/inotify_instances/728/status | 2 + mock/fixtures/inotify_instances/731/cmdline | Bin 0 -> 32 bytes mock/fixtures/inotify_instances/731/fd/0 | 1 + mock/fixtures/inotify_instances/731/fd/1 | 1 + mock/fixtures/inotify_instances/731/fd/56 | 1 + mock/fixtures/inotify_instances/731/status | 2 + mock/fixtures/inotify_instances/944/cmdline | Bin 0 -> 32 bytes mock/fixtures/inotify_instances/944/fd/0 | 1 + mock/fixtures/inotify_instances/944/fd/1 | 1 + mock/fixtures/inotify_instances/944/status | 2 + mock/fixtures/inotify_instances/946/cmdline | Bin 0 -> 9 bytes mock/fixtures/inotify_instances/946/fd/0 | 1 + mock/fixtures/inotify_instances/946/fd/1 | 1 + mock/fixtures/inotify_instances/946/status | 2 + mock/fixtures/inotify_instances/self/cmdline | 1 + mock/fixtures/inotify_instances/self/fd/0 | 1 + mock/fixtures/inotify_instances/self/fd/1 | 1 + mock/fixtures/inotify_instances/self/status | 2 + .../inotify_instances/thread-self/cmdline | 1 + .../inotify_instances/thread-self/fd/0 | 1 + .../inotify_instances/thread-self/fd/1 | 1 + .../inotify_instances/thread-self/status | 2 + pyproject.toml | 29 +++ .../inotify_instances/test__get_processes.yml | 21 ++ tests/inotify_instances/test__pids.yml | 21 ++ .../test_generate_process_metrics.yml | 7 + .../test_generate_process_metrics_command.yml | 5 + ...st_generate_process_metrics_no_command.yml | 3 + .../test_generate_process_metrics_no_user.yml | 3 + .../test_generate_process_metrics_user.yml | 4 + .../test_generate_user_metrics.yml | 5 + .../test_generate_user_metrics_no_user.yml | 3 + .../test_generate_user_metrics_user.yml | 4 + tests/test_inotify_instances.py | 115 ++++++++++ 117 files changed, 578 insertions(+), 113 deletions(-) create mode 100644 .gitignore delete mode 100755 inotify-instances create mode 100755 inotify_instances.py create mode 100755 mock/fixtures/inotify_instances/1/cmdline create mode 120000 mock/fixtures/inotify_instances/1/fd/0 create mode 120000 mock/fixtures/inotify_instances/1/fd/1 create mode 120000 mock/fixtures/inotify_instances/1/fd/12 create mode 120000 mock/fixtures/inotify_instances/1/fd/123 create mode 120000 mock/fixtures/inotify_instances/1/fd/324 create mode 120000 mock/fixtures/inotify_instances/1/fd/5 create mode 120000 mock/fixtures/inotify_instances/1/fd/82 create mode 120000 mock/fixtures/inotify_instances/1/fd/90 create mode 100644 mock/fixtures/inotify_instances/1/status create mode 100755 mock/fixtures/inotify_instances/1016/cmdline create mode 120000 mock/fixtures/inotify_instances/1016/fd/0 create mode 120000 mock/fixtures/inotify_instances/1016/fd/1 create mode 100644 mock/fixtures/inotify_instances/1016/status create mode 100755 mock/fixtures/inotify_instances/1017/cmdline create mode 120000 mock/fixtures/inotify_instances/1017/fd/0 create mode 120000 mock/fixtures/inotify_instances/1017/fd/1 create mode 100644 mock/fixtures/inotify_instances/1017/status create mode 100644 mock/fixtures/inotify_instances/1024/cmdline create mode 120000 mock/fixtures/inotify_instances/1024/fd/0 create mode 120000 mock/fixtures/inotify_instances/1024/fd/1 create mode 100644 mock/fixtures/inotify_instances/1024/status create mode 100755 mock/fixtures/inotify_instances/1025/cmdline create mode 120000 mock/fixtures/inotify_instances/1025/fd/0 create mode 120000 mock/fixtures/inotify_instances/1025/fd/1 create mode 100644 mock/fixtures/inotify_instances/1025/status create mode 100755 mock/fixtures/inotify_instances/1051/cmdline create mode 120000 mock/fixtures/inotify_instances/1051/fd/0 create mode 120000 mock/fixtures/inotify_instances/1051/fd/1 create mode 100644 mock/fixtures/inotify_instances/1051/status create mode 100755 mock/fixtures/inotify_instances/1189/cmdline create mode 120000 mock/fixtures/inotify_instances/1189/fd/0 create mode 120000 mock/fixtures/inotify_instances/1189/fd/1 create mode 100644 mock/fixtures/inotify_instances/1189/status create mode 100755 mock/fixtures/inotify_instances/2787/cmdline create mode 120000 mock/fixtures/inotify_instances/2787/fd/0 create mode 120000 mock/fixtures/inotify_instances/2787/fd/1 create mode 100644 mock/fixtures/inotify_instances/2787/status create mode 100755 mock/fixtures/inotify_instances/3376/cmdline create mode 120000 mock/fixtures/inotify_instances/3376/fd/0 create mode 120000 mock/fixtures/inotify_instances/3376/fd/1 create mode 100644 mock/fixtures/inotify_instances/3376/status create mode 100755 mock/fixtures/inotify_instances/512/cmdline create mode 120000 mock/fixtures/inotify_instances/512/fd/0 create mode 120000 mock/fixtures/inotify_instances/512/fd/1 create mode 120000 mock/fixtures/inotify_instances/512/fd/23 create mode 120000 mock/fixtures/inotify_instances/512/fd/30 create mode 120000 mock/fixtures/inotify_instances/512/fd/34 create mode 120000 mock/fixtures/inotify_instances/512/fd/35 create mode 120000 mock/fixtures/inotify_instances/512/fd/41 create mode 120000 mock/fixtures/inotify_instances/512/fd/890 create mode 100644 mock/fixtures/inotify_instances/512/status create mode 100755 mock/fixtures/inotify_instances/547/cmdline create mode 120000 mock/fixtures/inotify_instances/547/fd/0 create mode 120000 mock/fixtures/inotify_instances/547/fd/1 create mode 100644 mock/fixtures/inotify_instances/547/status create mode 100755 mock/fixtures/inotify_instances/548/cmdline create mode 120000 mock/fixtures/inotify_instances/548/fd/0 create mode 120000 mock/fixtures/inotify_instances/548/fd/1 create mode 100644 mock/fixtures/inotify_instances/548/status create mode 100755 mock/fixtures/inotify_instances/557/cmdline create mode 120000 mock/fixtures/inotify_instances/557/fd/0 create mode 120000 mock/fixtures/inotify_instances/557/fd/1 create mode 100644 mock/fixtures/inotify_instances/557/status create mode 100755 mock/fixtures/inotify_instances/569/cmdline create mode 120000 mock/fixtures/inotify_instances/569/fd/0 create mode 120000 mock/fixtures/inotify_instances/569/fd/1 create mode 100644 mock/fixtures/inotify_instances/569/status create mode 100644 mock/fixtures/inotify_instances/7038/cmdline create mode 120000 mock/fixtures/inotify_instances/7038/fd/0 create mode 120000 mock/fixtures/inotify_instances/7038/fd/1 create mode 100644 mock/fixtures/inotify_instances/7038/status create mode 100755 mock/fixtures/inotify_instances/727/cmdline create mode 120000 mock/fixtures/inotify_instances/727/fd/0 create mode 120000 mock/fixtures/inotify_instances/727/fd/1 create mode 120000 mock/fixtures/inotify_instances/727/fd/14 create mode 100644 mock/fixtures/inotify_instances/727/status create mode 100755 mock/fixtures/inotify_instances/728/cmdline create mode 120000 mock/fixtures/inotify_instances/728/fd/0 create mode 120000 mock/fixtures/inotify_instances/728/fd/1 create mode 100644 mock/fixtures/inotify_instances/728/status create mode 100755 mock/fixtures/inotify_instances/731/cmdline create mode 120000 mock/fixtures/inotify_instances/731/fd/0 create mode 120000 mock/fixtures/inotify_instances/731/fd/1 create mode 120000 mock/fixtures/inotify_instances/731/fd/56 create mode 100644 mock/fixtures/inotify_instances/731/status create mode 100755 mock/fixtures/inotify_instances/944/cmdline create mode 120000 mock/fixtures/inotify_instances/944/fd/0 create mode 120000 mock/fixtures/inotify_instances/944/fd/1 create mode 100644 mock/fixtures/inotify_instances/944/status create mode 100755 mock/fixtures/inotify_instances/946/cmdline create mode 120000 mock/fixtures/inotify_instances/946/fd/0 create mode 120000 mock/fixtures/inotify_instances/946/fd/1 create mode 100644 mock/fixtures/inotify_instances/946/status create mode 100755 mock/fixtures/inotify_instances/self/cmdline create mode 120000 mock/fixtures/inotify_instances/self/fd/0 create mode 120000 mock/fixtures/inotify_instances/self/fd/1 create mode 100644 mock/fixtures/inotify_instances/self/status create mode 100755 mock/fixtures/inotify_instances/thread-self/cmdline create mode 120000 mock/fixtures/inotify_instances/thread-self/fd/0 create mode 120000 mock/fixtures/inotify_instances/thread-self/fd/1 create mode 100644 mock/fixtures/inotify_instances/thread-self/status create mode 100644 pyproject.toml create mode 100644 tests/inotify_instances/test__get_processes.yml create mode 100644 tests/inotify_instances/test__pids.yml create mode 100644 tests/inotify_instances/test_generate_process_metrics.yml create mode 100644 tests/inotify_instances/test_generate_process_metrics_command.yml create mode 100644 tests/inotify_instances/test_generate_process_metrics_no_command.yml create mode 100644 tests/inotify_instances/test_generate_process_metrics_no_user.yml create mode 100644 tests/inotify_instances/test_generate_process_metrics_user.yml create mode 100644 tests/inotify_instances/test_generate_user_metrics.yml create mode 100644 tests/inotify_instances/test_generate_user_metrics_no_user.yml create mode 100644 tests/inotify_instances/test_generate_user_metrics_user.yml create mode 100644 tests/test_inotify_instances.py 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 0000000000000000000000000000000000000000..7ef00dc33f8d0fb6d4c92f783f3de4be05bb291b GIT binary patch literal 11 ScmdNdPRh*F&&a?{mlKd>#Rw@+eFc_YW~$mXbMO5UXaV#q7Zx@}Ia literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b3918bbc86b8f685ca0f26e74ddf7d97f0d8dd62 GIT binary patch literal 29 kcmdNdEiTf}$xPBuEYU44$ka_LE!NFREX_;KNG)Oj0GwV5V*mgE literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a0aca6d16e4374fa1218c297468e666365ccff8d GIT binary patch literal 17 YcmdNdEiTf}$xPBOEyyoVElObk060MgB>(^b literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6be6295fbcf7229d8cbf4d2d0a51b4da992a4542 GIT binary patch literal 36 rcmdNdEiTf}$xPBu&nqoR*UwI^Ov@<9MR|!iDGUJPx(w_9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..20ef68d367db799add6d0c58f6d4aaf500e3b47b GIT binary patch literal 34 icmdNdEiTf}$xPBOt}HG|%}s&Px<#qQ`8j2&DGUJP#|-fR literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7178672d3c6cf54f86db26c7a3d77a846d79a7ce GIT binary patch literal 35 jcmdNdEiTf}$xPBOt}HG|%}s&Px+R&psl}Cf$ter~@th4^ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2730100aca8ba88733e4aaecd0913c90f5a125ad GIT binary patch literal 31 fcmdNdEiTf}$xPBOt}HG|%}s&Px}_kRt< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..da63c749aacdf95411dac62db99f776952a5e066 GIT binary patch literal 51 zcmdNdEiTee%FNSGNh&SYO)ARIPA$^SNi5Av&S22hEl$oaNM$IlEG|jS1#%NhQ!+~! E0NR8Rvj6}9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a76e61c25d7ae149c0992bdcdfad795879ad8c1c GIT binary patch literal 126 zcmXYqZ3=)O5JdMv3w>H1XLZ+-EI|$G_F436cy9)V&6&}pxJd%U5EmF~+IW-{L#R?$ z+{v!~5cCWz#74wfa`H77n!8Abu~+ld=(hW<;|xQi)sH(ByVhB&`uTmJlYM~)!$&2v literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6dd7905ce0a526a571a7ed341533133cbef4ca9b GIT binary patch literal 32 gcmdNdEiTf}$xPBOt}HG|%}s&Px;gpjnRzJ;0LdT>3IG5A literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9b0723e56070bb36a3c31ccb08d7670e941ae079 GIT binary patch literal 32 gcmdNdEiTf}$xPBOt}HG|%}s&P47$3d#i>OM0L0=8c>n+a literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2f11ae8d68f38834b1371507d4b297a32a7f7da5 GIT binary patch literal 9 QcmdNWPSGt$%++K701hAmlmGw# literal 0 HcmV?d00001 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"]