Source code for insights.specs.datasources.sys_fs_cgroup_memory

"""
Custom datasources relate to `/sys/fs/cgroup/memory`
"""

import os

from insights.core.context import HostContext
from insights.core.exceptions import SkipComponent
from insights.core.plugins import datasource
from insights.core.spec_factory import DatasourceProvider, simple_command
from insights.specs import Specs


[docs] class LocalSpecs(Specs): """Local specs used only by sys_fs_cgroup_memory_tasks_number datasources""" sys_fs_cgroup_memory_tasks_raw = simple_command( "/usr/bin/find /sys/fs/cgroup/memory -name 'tasks'" ) """ Returns the output of command ``/usr/bin/find /sys/fs/cgroup/memory -name 'tasks'`` """
@datasource(LocalSpecs.sys_fs_cgroup_memory_tasks_raw, HostContext) def tasks_number(broker): """ This datasource provides the numeber of "tasks" file collected from ``/usr/bin/find /sys/fs/cgroup/memory -name 'tasks'``. Typical content of ``/usr/bin/find /sys/fs/cgroup/memory -name 'tasks'`` command is:: /sys/fs/cgroup/memory/user.slice/tasks /sys/fs/cgroup/memory/system.slice/rh-nginx120-nginx.service/tasks /sys/fs/cgroup/memory/system.slice/named.service/tasks /sys/fs/cgroup/memory/system.slice/rhel-push-plugin.service/tasks Returns: string: the number of "tasks" file under /sys/fs/cgroup/memory Raises: SkipComponent: When any exception occurs. """ exceptions = [ 'no such file or directory', ] content = broker[LocalSpecs.sys_fs_cgroup_memory_tasks_raw].content if len(content) == 0 or not any(ex in content[0].lower() for ex in exceptions): # cleaner is not required per the content return DatasourceProvider( content=str(len(content)), relative_path='insights_datasources/sys_fs_cgroup_memory_tasks_number', ) raise SkipComponent @datasource(HostContext) def uniq_memory_swappiness(broker): """ This datasource reads all the memory.swappiness files under /sys/fs/cgroup/memory directory one by one and returns the uniq memory swappiness setting of the all control groups. The output of this datasource looks like: 10 1 60 66 Returns: str: Returns a multiline string in the format as ``value count``. Raises: SkipComponent: When any exception occurs. """ file_name = "memory.swappiness" data = {} for root, _, files in os.walk("/sys/fs/cgroup/memory"): if file_name in files: file_path = os.path.join(root, file_name) with open(file_path, 'r') as setting: key = setting.read().strip() data[key] = data.get(key, 0) + 1 if not data: raise SkipComponent() data_list = [] for value, count in data.items(): data_list.append("{0} {1}".format(value, count)) # cleaner is not required per the content return DatasourceProvider( content="\n".join(data_list), relative_path='insights_datasources/sys_fs_cgroup_uniq_memory_swappiness', )