def test_environment_aware_module_params(self, mock_docker):

        # Define test values here for all k8s and k8s_event monitor config params that are environment aware.
        # Be sure to use non-default test values
        TEST_INT = 123456789
        TEST_STRING = "dummy string"
        TEST_ARRAY_OF_STRINGS = ["s1", "s2", "s3"]
        STANDARD_PREFIX = "_STANDARD_PREFIX_"  # env var is SCALYR_<param_name>

        # The following map contains config params to be tested
        # config_param_name: (custom_env_name, test_value)
        docker_testmap = {
            "container_check_interval": (STANDARD_PREFIX, TEST_INT, int),
            "docker_api_version": (STANDARD_PREFIX, TEST_STRING, str),
            "docker_log_prefix": (STANDARD_PREFIX, TEST_STRING, str),
            "log_mode": ("SCALYR_DOCKER_LOG_MODE", TEST_STRING, str),
            "docker_raw_logs": (
                STANDARD_PREFIX,
                False,
                bool,
            ),  # test config file is set to True
            "docker_percpu_metrics": (
                STANDARD_PREFIX,
                True,
                bool,
            ),  # test config file is set to False
            "metrics_only": ("SCALYR_DOCKER_METRICS_ONLY", True, bool),
            "container_globs":
            (STANDARD_PREFIX, TEST_ARRAY_OF_STRINGS, ArrayOfStrings),
            "container_globs_exclude": (
                STANDARD_PREFIX,
                TEST_ARRAY_OF_STRINGS,
                ArrayOfStrings,
            ),
            "report_container_metrics": (STANDARD_PREFIX, False, bool),
            "label_include_globs": (
                STANDARD_PREFIX,
                TEST_ARRAY_OF_STRINGS,
                ArrayOfStrings,
            ),
            "label_exclude_globs": (
                STANDARD_PREFIX,
                TEST_ARRAY_OF_STRINGS,
                ArrayOfStrings,
            ),
            "labels_as_attributes": (STANDARD_PREFIX, True, bool),
            "label_prefix": (STANDARD_PREFIX, TEST_STRING, str),
            "use_labels_for_log_config": (STANDARD_PREFIX, False, bool),
        }

        # Fake the environment varaibles
        for key, value in docker_testmap.items():
            custom_name = value[0]
            env_name = (("SCALYR_%s" % key).upper() if custom_name
                        == STANDARD_PREFIX else custom_name.upper())
            envar_value = str(value[1])
            if value[2] == ArrayOfStrings:
                # Array of strings should be entered into environment in the user-preferred format
                # which is without square brackets and quotes around each element
                envar_value = envar_value[1:-1]  # strip square brackets
                envar_value = envar_value.replace("'", "")
            else:
                envar_value = (envar_value.lower()
                               )  # lower() needed for proper bool encoding
            os.environ[env_name] = envar_value

        self._write_file_with_separator_conversion(""" {
            logs: [ { path:"/var/log/tomcat6/$DIR_VAR.log" }],
            api_key: "abcd1234",
        }
        """)
        self._write_config_fragment_file_with_separator_conversion(
            "docker.json",
            """ {
            "monitors": [
                {
                    module: "scalyr_agent.builtin_monitors.docker_monitor",
                    docker_raw_logs: true
                }
            ]
        }
        """,
        )

        config = self._create_test_configuration_instance()
        config.parse()

        monitors_manager, mock_logger = self._make_monitors_manager(config)
        docker_monitor = monitors_manager.monitors[0]

        # All environment-aware params defined in the docker monitor must be gested
        self.assertEquals(
            set(docker_testmap.keys()),
            set(docker_monitor._config._environment_aware_map.keys()),
        )

        # Verify module-level conflicts between env var and config file are logged at module-creation time
        mock_logger.warn.assert_called_with(
            "Conflicting values detected between scalyr_agent.builtin_monitors.docker_monitor config file "
            "parameter `docker_raw_logs` and the environment variable `SCALYR_DOCKER_RAW_LOGS`. "
            "Ignoring environment variable.",
            limit_once_per_x_secs=300,
            limit_key=
            "config_conflict_scalyr_agent.builtin_monitors.docker_monitor_docker_raw_logs_SCALYR_DOCKER_RAW_LOGS",
        )

        CopyingManager(config, monitors_manager.monitors)
        # Override Agent Logger to prevent writing to disk
        for monitor in monitors_manager.monitors:
            monitor._logger = FakeAgentLogger("fake_agent_logger")

        # Verify environment variable values propagate into DockerMonitor monitor MonitorConfig
        monitor_2_testmap = {
            docker_monitor: docker_testmap,
        }
        for monitor, testmap in monitor_2_testmap.items():
            for key, value in testmap.items():
                test_val, convert_to = value[1:]
                if key in ["docker_raw_logs"]:
                    # Keys were defined in config files so should not have changed
                    self.assertNotEquals(
                        test_val,
                        monitor._config.get(key, convert_to=convert_to))
                else:
                    # Keys were empty in config files so they take on environment values
                    materialized_value = monitor._config.get(
                        key, convert_to=convert_to)
                    if hasattr(test_val, "__iter__"):
                        self.assertEquals([x1 for x1 in test_val],
                                          [x2 for x2 in materialized_value])
                    else:
                        self.assertEquals(test_val, materialized_value)
Beispiel #2
0
    def test_environment_aware_module_params(self, mock_docker):

        # Define test values here for all k8s and k8s_event monitor config params that are environment aware.
        # Be sure to use non-default test values
        TEST_INT = 123456789
        TEST_FLOAT = 1234567.89
        TEST_STRING = "dummy string"
        TEST_PARSE_FORMAT = "cri"
        TEST_ARRAY_OF_STRINGS = ["s1", "s2", "s3"]
        STANDARD_PREFIX = "_STANDARD_PREFIX_"  # env var is SCALYR_<param_name>

        # The following map contains config params to be tested
        # config_param_name: (custom_env_name, test_value)
        k8s_testmap = {
            "container_check_interval": (STANDARD_PREFIX, TEST_INT, int),
            "initial_stopped_container_collection_window": (
                STANDARD_PREFIX,
                TEST_INT,
                int,
            ),
            "docker_max_parallel_stats": (STANDARD_PREFIX, TEST_INT, int),
            "docker_percpu_metrics": (STANDARD_PREFIX, True, bool),
            "container_globs":
            (STANDARD_PREFIX, TEST_ARRAY_OF_STRINGS, ArrayOfStrings),
            "report_container_metrics": (STANDARD_PREFIX, False, bool),
            "report_k8s_metrics": (STANDARD_PREFIX, True, bool),
            "k8s_ignore_pod_sandboxes": (STANDARD_PREFIX, False, bool),
            "k8s_include_all_containers": (STANDARD_PREFIX, False, bool),
            "k8s_sidecar_mode": (STANDARD_PREFIX, True, bool),
            "k8s_parse_format":
            (STANDARD_PREFIX, TEST_PARSE_FORMAT, six.text_type),
            "k8s_always_use_cri": (STANDARD_PREFIX, True, bool),
            "k8s_cri_query_filesystem": (STANDARD_PREFIX, True, bool),
            "k8s_always_use_docker": (STANDARD_PREFIX, True, bool),
            "k8s_kubelet_host_ip": (STANDARD_PREFIX, False, bool),
            "k8s_kubelet_api_url_template": (STANDARD_PREFIX, False, bool),
            "gather_k8s_pod_info": (STANDARD_PREFIX, True, bool),
        }

        k8s_events_testmap = {
            "max_log_size": ("SCALYR_K8S_MAX_LOG_SIZE", TEST_INT, int),
            "max_log_rotations":
            ("SCALYR_K8S_MAX_LOG_ROTATIONS", TEST_INT, int),
            "log_flush_delay":
            ("SCALYR_K8S_LOG_FLUSH_DELAY", TEST_FLOAT, float),
            "message_log":
            ("SCALYR_K8S_MESSAGE_LOG", TEST_STRING, six.text_type),
            "event_object_filter": (
                "SCALYR_K8S_EVENT_OBJECT_FILTER",
                TEST_ARRAY_OF_STRINGS,
                ArrayOfStrings,
            ),
            "leader_check_interval": (
                "SCALYR_K8S_LEADER_CHECK_INTERVAL",
                TEST_INT,
                int,
            ),
            "leader_node":
            ("SCALYR_K8S_LEADER_NODE", TEST_STRING, six.text_type),
            "check_labels": ("SCALYR_K8S_CHECK_LABELS", True, bool),
            "ignore_master": ("SCALYR_K8S_IGNORE_MASTER", False, bool),
        }

        # Fake the environment variables
        for map in [k8s_testmap, k8s_events_testmap]:
            for key, value in map.items():
                custom_name = value[0]
                env_name = (("SCALYR_%s" % key).upper() if custom_name
                            == STANDARD_PREFIX else custom_name.upper())
                param_value = value[1]
                if value[2] == ArrayOfStrings:
                    # Array of strings should be entered into environment in the user-preferred format
                    # which is without square brackets and quotes around each element
                    envar_value = "[{0}]".format(", ".join(param_value))
                else:
                    envar_value = six.text_type(param_value)
                    envar_value = (envar_value.lower()
                                   )  # lower() needed for proper bool encoding
                os.environ[env_name] = envar_value

        self._write_file_with_separator_conversion(""" {
            logs: [ { path:"/var/log/tomcat6/$DIR_VAR.log" }],
            api_key: "abcd1234",
        }
        """)
        self._write_config_fragment_file_with_separator_conversion(
            "k8s.json",
            """ {
            "monitors": [
                {
                    "module": "scalyr_agent.builtin_monitors.kubernetes_monitor",
                    "report_k8s_metrics": false,
                },
                {
                    "module": "scalyr_agent.builtin_monitors.kubernetes_events_monitor"
                }
            ]
        }
        """,
        )

        monitors_manager, config, mock_logger = self._create_test_objects()
        k8s_monitor = monitors_manager.monitors[0]
        k8s_events_monitor = monitors_manager.monitors[1]

        # All environment-aware params defined in the k8s and k8s_events monitors must be tested
        self.assertEquals(
            set(k8s_testmap.keys()),
            set(k8s_monitor._config._environment_aware_map.keys()),
        )

        self.assertEquals(
            set(k8s_events_testmap.keys()),
            set(k8s_events_monitor._config._environment_aware_map.keys()),
        )

        # Verify module-level conflicts between env var and config file are logged at module-creation time
        mock_logger.warn.assert_called_with(
            "Conflicting values detected between scalyr_agent.builtin_monitors.kubernetes_monitor config file "
            "parameter `report_k8s_metrics` and the environment variable `SCALYR_REPORT_K8S_METRICS`. "
            "Ignoring environment variable.",
            limit_once_per_x_secs=300,
            limit_key=
            "config_conflict_scalyr_agent.builtin_monitors.kubernetes_monitor_report_k8s_metrics_SCALYR_REPORT_K8S_METRICS",
        )

        CopyingManager(config, monitors_manager.monitors)
        # Override Agent Logger to prevent writing to disk
        for monitor in monitors_manager.monitors:
            monitor._logger = FakeAgentLogger("fake_agent_logger")

        # Verify environment variable values propagate into kubernetes monitor MonitorConfig
        monitor_2_testmap = {
            k8s_monitor: k8s_testmap,
            k8s_events_monitor: k8s_events_testmap,
        }
        for monitor, testmap in monitor_2_testmap.items():
            for key, value in testmap.items():
                test_val, convert_to = value[1:]
                if key in ["report_k8s_metrics", "api_key"]:
                    # Keys were defined in config files so should not have changed
                    self.assertNotEquals(
                        test_val,
                        monitor._config.get(key, convert_to=convert_to))
                else:
                    # Keys were empty in config files so they take on environment values
                    materialized_value = monitor._config.get(
                        key, convert_to=convert_to)
                    if hasattr(test_val, "__iter__"):
                        self.assertEquals([x1 for x1 in test_val],
                                          [x2 for x2 in materialized_value])
                    else:
                        self.assertEquals(test_val, materialized_value)