Source code for insights.parsers.systemd_analyze

"""
SystemdAnalyzeBlame - command ``systemd-analyze blame``
=======================================================

This module parses the output of command ``systemd-analyze blame``.
"""
from insights.core import CommandParser
from insights.core.exceptions import SkipComponent
from insights.core.plugins import parser
from insights.specs import Specs


[docs] @parser(Specs.systemd_analyze_blame) class SystemdAnalyzeBlame(CommandParser, dict): """Parse the output of ``systemd-analyze blame`` as ``dict``. The time to initialize is converted into seconds. Typical output:: 33.080s cloud-init-local.service 32.423s unbound-anchor.service 2.773s kdump.service 1.699s dnf-makecache.service 1.304s cloud-init.service 1.073s initrd-switch-root.service 939ms cloud-config.service 872ms tuned.service 770ms cloud-final.service Examples: >>> 'cloud-init-local.service' in output True >>> output.get('cloud-init.service', 0) 1.304 Returns: (dict): With unit-name & time as key-value pair. Ex:: {'cloud-config.service': 0.939, 'cloud-final.service': 0.77, 'cloud-init-local.service': 33.08, 'cloud-init.service': 1.304, 'dnf-makecache.service': 1.699, 'initrd-switch-root.service': 1.073, 'kdump.service': 2.773, 'tuned.service': 0.872, 'unbound-anchor.service': 32.423} Raises: SkipComponent: If content is not provided. """
[docs] def parse_content(self, content): if not content: raise SkipComponent for c in content: cols = c.split() # Check to make sure that the first character of the first # entry is a number. This will hopefully exclude any errors # that are outputted in the file. if cols[0][0].isdigit(): # The service should be the last column, so just # remove the last column from the list before looping. service = cols.pop() time = 0 for x in cols: # Convert each column to seconds, and add them up. if x.endswith('y'): # Pulled the 31557600 from systemd src. time += int(x.strip('y')) * 31557600 elif x.endswith('month'): # Pulled the 2629800 from systemd src. time += int(x.strip('month')) * 2629800 elif x.endswith('w'): time += int(x.strip('w')) * 7 * 24 * 60 ** 2 elif x.endswith('d'): time += int(x.strip('d')) * 24 * 60 ** 2 elif x.endswith('h'): time += int(x.strip('h')) * 60 ** 2 elif x.endswith('min'): time += int(x.strip('min')) * 60 elif x.endswith('ms'): time += float(x.strip('ms')) / 1000 elif x.endswith('s'): time += float(x.strip('s')) self[service] = time