Exemplo n.º 1
0
    def test_send_extension_metrics_telemetry_for_unsupported_cgroup(
            self, patch_periodic_warn, patch_add_metric, *args):
        CGroupsTelemetry._tracked.append(
            CGroup("cgroup_name", "/test/path", "io"))

        PollResourceUsageOperation().run()
        self.assertEqual(1, patch_periodic_warn.call_count)
        self.assertEqual(
            0, patch_add_metric.call_count)  # No metrics should be sent.
Exemplo n.º 2
0
    def test_send_extension_metrics_telemetry_for_empty_cgroup(
            self, patch_poll_all_tracked, patch_add_event, patch_add_metric,
            *args):
        patch_poll_all_tracked.return_value = []

        PollResourceUsageOperation().run()
        self.assertEqual(1, patch_poll_all_tracked.call_count)
        self.assertEqual(0, patch_add_event.call_count)
        self.assertEqual(0, patch_add_metric.call_count)
Exemplo n.º 3
0
    def test_send_extension_metrics_telemetry(self, patch_poll_all_tracked,
                                              patch_add_event,
                                              patch_add_metric, *args):
        patch_poll_all_tracked.return_value = [
            MetricValue("Process", "% Processor Time", 1, 1),
            MetricValue("Memory", "Total Memory Usage", 1, 1),
            MetricValue("Memory", "Max Memory Usage", 1, 1)
        ]

        PollResourceUsageOperation().run()
        self.assertEqual(1, patch_poll_all_tracked.call_count)
        self.assertEqual(
            3, patch_add_metric.call_count)  # Three metrics being sent.
Exemplo n.º 4
0
    def test_send_extension_metrics_telemetry_handling_cpu_cgroup_exceptions_errno2(
            self, patch_periodic_warn, patch_cpu_usage, patch_add_metric,
            *args):
        ioerror = IOError()
        ioerror.errno = 2
        patch_cpu_usage.side_effect = ioerror

        CGroupsTelemetry._tracked.append(CpuCgroup("cgroup_name",
                                                   "/test/path"))

        PollResourceUsageOperation().run()
        self.assertEqual(0, patch_periodic_warn.call_count)
        self.assertEqual(
            0, patch_add_metric.call_count)  # No metrics should be sent.
Exemplo n.º 5
0
    def test_send_extension_metrics_telemetry_handling_memory_cgroup_exceptions_errno2(
            self,
            patch_periodic_warn,  # pylint: disable=unused-argument
            patch_get_memory_usage,
            patch_add_metric,
            *args):
        ioerror = IOError()
        ioerror.errno = 2
        patch_get_memory_usage.side_effect = ioerror

        CGroupsTelemetry._tracked.append(
            MemoryCgroup("cgroup_name", "/test/path"))  # pylint: disable=protected-access

        PollResourceUsageOperation().run()
        self.assertEqual(0, patch_periodic_warn.call_count)
        self.assertEqual(
            0, patch_add_metric.call_count)  # No metrics should be sent.
Exemplo n.º 6
0
    def test_it_should_report_processes_that_do_not_belong_to_the_agent_cgroup(
            self):
        with mock_cgroup_commands() as mock_commands:
            mock_commands.add_command(
                r'^systemd-cgls.+/walinuxagent.service$', '''
Directory /sys/fs/cgroup/cpu/system.slice/walinuxagent.service:
├─27519 /usr/bin/python3 -u /usr/sbin/waagent -daemon
├─27547 python3 -u bin/WALinuxAgent-2.2.48.1-py2.7.egg -run-exthandlers
├─6200 systemd-cgls /sys/fs/cgroup/cpu,cpuacct/system.slice/walinuxagent.service
├─5821 pidof systemd-networkd
├─5822 iptables --version
├─5823 iptables -w -t security -D OUTPUT -d 168.63.129.16 -p tcp -m conntrack --ctstate INVALID,NEW -j ACCEPT
├─5824 iptables -w -t security -D OUTPUT -d 168.63.129.16 -p tcp -m owner --uid-owner 0 -j ACCEPT
├─5825 ip route show
├─5826 ifdown eth0 && ifup eth0
├─5699 bash /var/lib/waagent/Microsoft.CPlat.Core.RunCommandLinux-1.0.1/bin/run-command-shim enable
├─5701 tee -ia /var/log/azure/run-command/handler.log
├─5719 /var/lib/waagent/Microsoft.CPlat.Core.RunCommandLinux-1.0.1/bin/run-command-extension enable
├─5727 /bin/sh -c /var/lib/waagent/run-command/download/1/script.sh
└─5728 /bin/sh /var/lib/waagent/run-command/download/1/script.sh
''')
            with patch("azurelinuxagent.ga.monitor.add_event"
                       ) as add_event_patcher:
                PollResourceUsageOperation().run()

                messages = [
                    kwargs["message"]
                    for (_, kwargs) in add_event_patcher.call_args_list
                    if "The agent's cgroup includes unexpected processes" in
                    kwargs["message"]
                ]

                self.assertEqual(
                    1, len(messages),
                    "Exactly 1 telemetry event should have been reported. Events: {0}"
                    .format(messages))

                unexpected_processes = [
                    'bash /var/lib/waagent/Microsoft.CPlat.Core.RunCommandLinux-1.0.1/bin/run-command-shim enable',
                    'tee -ia /var/log/azure/run-command/handler.log',
                    '/var/lib/waagent/Microsoft.CPlat.Core.RunCommandLinux-1.0.1/bin/run-command-extension enable',
                    '/bin/sh -c /var/lib/waagent/run-command/download/1/script.sh',
                    '/bin/sh /var/lib/waagent/run-command/download/1/script.sh',
                ]

                for fp in unexpected_processes:
                    self.assertIn(
                        fp, messages[0],
                        "[{0}] was not reported as an unexpected process. Events: {1}"
                        .format(fp, messages))

                # The list of processes in the message is an array of strings: "['foo', ..., 'bar']"
                search = re.search(r'\[(?P<processes>.+)\]', messages[0])
                self.assertIsNotNone(
                    search,
                    "The event message is not in the expected format: {0}".
                    format(messages[0]))
                processes = search.group('processes')
                self.assertEquals(
                    5, len(processes.split(',')),
                    'Extra processes were reported as unexpected: {0}'.format(
                        processes))