~carstengrohmann/OOMAnalyser

e283ff2019e5df4c7ce352caba7df9224875cfa2 — Carsten Grohmann 2 months ago 1f087b7
Fix to allow process names with spaces
3 files changed, 53 insertions(+), 15 deletions(-)

M OOMAnalyser.html
M OOMAnalyser.py
M test.py
M OOMAnalyser.html => OOMAnalyser.html +1 -0
@@ 817,6 817,7 @@ function read_and_display_file(file) {
    <ol>
        <li>Improve SVG chart colour palette</li>
        <li>Add Selenium based unit tests</li>
        <li>Fix to allow process names with spaces</li>
        <li>...</li>
    </ol>


M OOMAnalyser.py => OOMAnalyser.py +16 -11
@@ 220,13 220,24 @@ class OOMEntity(object):
        strip later.
        """
        to_strip = 0

        columns = first_line.split(" ")

        # Examples:
        # [11686.888109] sed invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0
        # Apr 01 14:13:32 mysrv kernel: sed invoked OOM-killer: gfp_mask=0x201da, order=0
        # Apr 01 14:13:32 mysrv kernel: [11686.888109] sed invoked oom-killer: gfp_mask=0x84d0, order=0, oom_adj=0, oom_score_adj=0
        try:
            # strip all before "<program name> invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0
            to_strip = columns.index("invoked")
            # decrease to include <program name>
            to_strip -= 1
            # strip all incl. "kernel:"
            if 'kernel:' in first_line:
                to_strip = columns.index("kernel:")
                # increase to include "kernel:"
                to_strip += 1

            # check if next column is a timestamp like "[11686.888109]" and remove it too
            rec = re.compile('\[\d+\.\d+\]')
            if rec.match(columns[to_strip]):
                # increase to include timestamp
                to_strip += 1
        except ValueError:
            pass



@@ 290,12 301,6 @@ class OOMEntity(object):
            if cols_to_strip:
                # [-1] slicing needs Transcrypt operator overloading
                line = line.split(" ", cols_to_strip)[-1]  # __:opov

            # OOMs logged to /var/log/messages / journalctl may contain
            # "kernel:" at the begin of the content
            if line.startswith('kernel:'):
                line = line[7:]

            stripped_lines.append(line)

        return stripped_lines

M test.py => test.py +36 -4
@@ 100,6 100,12 @@ class TestInBrowser(TestBase):
        with self.assertRaises(NoSuchElementException):
            notify_box.find_element_by_class_name('js-notify_box__msg--error')

        for event in self.driver.get_log('browser'):
            # ignore favicon.ico errors
            if 'favicon.ico' in event['message']:
                continue
            self.fail('Error on browser console reported: %s' % event)

    def click_analyse(self):
        analyse = self.driver.find_element_by_xpath('//button[text()="Analyse"]')
        analyse.click()


@@ 193,11 199,27 @@ Killed process 6576 (java) total-vm:33914892kB, anon-rss:20629004kB, file-rss:0k

    def test_006_trigger_proc_space(self):
        """Test trigger process name contains a space"""
        pass
        example = OOMAnalyser.OOMDisplay.example
        example = example.replace('sed', 'VM Monitoring Task')

        self.analyse_oom(example)

        self.assert_on_warn_error()

        h3_summary = self.driver.find_element_by_xpath('//h3[text()="Summary"]')
        self.assertTrue(h3_summary.is_displayed(), "Analysis details incl. <h3>Summary</h3> should be displayed")

    def test_007_kill_proc_space(self):
        """Test killed process name contains a space"""
        pass
        example = OOMAnalyser.OOMDisplay.example
        example = example.replace('mysqld', 'VM Monitoring Task')

        self.analyse_oom(example)

        self.assert_on_warn_error()

        h3_summary = self.driver.find_element_by_xpath('//h3[text()="Summary"]')
        self.assertTrue(h3_summary.is_displayed(), "Analysis details incl. <h3>Summary</h3> should be displayed")


class TestPython(TestBase):


@@ 228,8 250,18 @@ class TestPython(TestBase):
        self.assertTrue(match, 'Error: re.search(REC_OOM_KILL_PROCESS) failed for process name '
                               'with space')

    def test_003_OOMEntity_number_of_columns_to_strip(self):
        """Test stripping useless / leading columns"""
        oom_entity = OOMAnalyser.OOMEntity(OOMAnalyser.OOMDisplay.example)
        for pos, line in [
            (1, '[11686.888109] sed invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0'),
            (5, 'Apr 01 14:13:32 mysrv kernel: sed invoked OOM-killer: gfp_mask=0x201da, order=0'),
            (6, 'Apr 01 14:13:32 mysrv kernel: [11686.888109] sed invoked oom-killer: gfp_mask=0x84d0, order=0, oom_adj=0, oom_score_adj=0'),
        ]:
            to_strip = oom_entity._number_of_columns_to_strip(line)
            self.assertEqual(to_strip, pos, 'Calc wrong number of colums to strip for "%s": got: %d, expect: %d' % (
                line, to_strip, pos))


if __name__ == "__main__":
    # import logging, sys
    # logging.basicConfig(stream=sys.stderr, level=logging.WARNING)
    unittest.main(verbosity=2)