def test_get_initial_sleep_delay_jitter_disabled(self): logger = mock.Mock() # 1. Default value is used monitor_config = MonitorConfig( {"module": "test_module"}, monitor_module="test_monitor" ) global_config = mock.Mock() global_config.global_monitor_sample_interval_enable_jitter = False monitor = ScalyrMonitor( monitor_config=monitor_config, logger=logger, sample_interval_secs=None, global_config=global_config, ) sleep_delay = monitor._get_initial_sleep_delay() self.assertEqual(sleep_delay, 0) # 2. Value is overridden on per monitor basis monitor_config = MonitorConfig( {"module": "test_module", "sample_interval": 10}, monitor_module="test_monitor", ) global_config = mock.Mock() global_config.global_monitor_sample_interval_enable_jitter = False monitor = ScalyrMonitor( monitor_config=monitor_config, logger=logger, sample_interval_secs=None, global_config=global_config, ) sleep_delay = monitor._get_initial_sleep_delay() self.assertEqual(sleep_delay, 0)
def test_monitor_run_random_initial_sleep_delay_enabled(self): def make_mock_thread_is_stopped(monitor): def mock_is_thread_stopped(*args, **kwargs): if monitor.counter >= 3: return True monitor.counter += 1 return False return mock_is_thread_stopped mock_sleep_but_awaken_if_stopped = mock.Mock() mock_logger = mock.Mock() mock_gather_sample = mock.Mock() monitor_config = MonitorConfig( { "module": "test_module", "sample_interval": 10 }, monitor_module="test_monitor", ) global_config = mock.Mock() global_config.global_monitor_sample_interval_enable_jitter = True monitor = ScalyrMonitor( monitor_config=monitor_config, logger=mock_logger, sample_interval_secs=None, global_config=global_config, ) monitor.counter = 0 monitor._sleep_but_awaken_if_stopped = mock_sleep_but_awaken_if_stopped monitor._is_thread_stopped = make_mock_thread_is_stopped(monitor) monitor.gather_sample = mock_gather_sample monitor.run() self.assertEqual(monitor.counter, 3) # + 1 is for initial sleep delay before first sample gather interval self.assertEqual(mock_sleep_but_awaken_if_stopped.call_count, 1 + 3) # 1 call is to debug function when we are initially sleeping before the gather self.assertEqual(mock_logger.debug.call_count, 1) # 1 call is for monitor has finished message self.assertEqual(mock_logger.info.call_count, 1) self.assertEqual(mock_logger.exception.call_count, 0)
def test_metric_logging_metric_name_blacklist_actual_monitor_class(self): from scalyr_agent.scalyr_monitor import ScalyrMonitor monitor_1_config = { "module": "foo1", "metric_name_blacklist": ["a", "b"] } monitor_1_logger = scalyr_logging.getLogger( "scalyr_agent.builtin_monitors.foo1(1)") monitor_1 = ScalyrMonitor(monitor_config=monitor_1_config, logger=monitor_1_logger) metric_file_fd, monitor_1_metric_file_path = tempfile.mkstemp(".log") # NOTE: We close the fd here because we open it again below. This way file deletion at # the end works correctly on Windows. os.close(metric_file_fd) monitor_2_config = { "module": "foo2", "metric_name_blacklist": ["c", "d"] } monitor_2_logger = scalyr_logging.getLogger( "scalyr_agent.builtin_monitors.foo2(1)") monitor_2 = ScalyrMonitor(monitor_config=monitor_2_config, logger=monitor_1_logger) metric_file_fd, monitor_2_metric_file_path = tempfile.mkstemp(".log") # NOTE: We close the fd here because we open it again below. This way file deletion at # the end works correctly on Windows. os.close(metric_file_fd) monitor_1_logger.openMetricLogForMonitor(monitor_1_metric_file_path, monitor_1) monitor_1_logger.emit_value("a", 1) monitor_1_logger.emit_value("b", 2) monitor_1_logger.emit_value("c", 3) monitor_1_logger.emit_value("d", 4) self.assertLogFileContainsLineRegex( file_path=monitor_1_metric_file_path, expression="d") self.assertLogFileContainsLineRegex( file_path=monitor_1_metric_file_path, expression="d") self.assertLogFileDoesntContainsLineRegex( file_path=monitor_1_metric_file_path, expression="a") self.assertLogFileDoesntContainsLineRegex( file_path=monitor_1_metric_file_path, expression="b") monitor_1_logger.closeMetricLog() monitor_2_logger.openMetricLogForMonitor(monitor_2_metric_file_path, monitor_2) monitor_2_logger.emit_value("a", 1) monitor_2_logger.emit_value("b", 2) monitor_2_logger.emit_value("c", 3) monitor_2_logger.emit_value("d", 4) self.assertLogFileContainsLineRegex( file_path=monitor_2_metric_file_path, expression="a") self.assertLogFileContainsLineRegex( file_path=monitor_2_metric_file_path, expression="a") self.assertLogFileDoesntContainsLineRegex( file_path=monitor_2_metric_file_path, expression="c") self.assertLogFileDoesntContainsLineRegex( file_path=monitor_2_metric_file_path, expression="d") monitor_2_logger.closeMetricLog()
def test_get_initial_sleep_delay_with_random_jitter_enabled(self): logger = mock.Mock() # 1. Default value is used monitor_sample_interval = ScalyrMonitor.DEFAULT_SAMPLE_INTERVAL_SECS monitor_config = MonitorConfig( {"module": "test_module"}, monitor_module="test_monitor" ) global_config = mock.Mock() global_config.global_monitor_sample_interval_enable_jitter = True monitor = ScalyrMonitor( monitor_config=monitor_config, logger=logger, sample_interval_secs=None, global_config=global_config, ) for i in range(0, 100): sleep_delay = monitor._get_initial_sleep_delay() min_jitter = round(monitor_sample_interval / 10) * 2 max_jitter = round(monitor_sample_interval / 10) * 8 self.assertFalse(sleep_delay == monitor_sample_interval) self.assertTrue(sleep_delay >= min_jitter and sleep_delay <= max_jitter) # 2. Value is overridden on per monitor basis monitor_sample_interval = 10 monitor_config = MonitorConfig( {"module": "test_module", "sample_interval": 10}, monitor_module="test_monitor", ) global_config = mock.Mock() global_config.global_monitor_sample_interval_enable_jitter = True monitor = ScalyrMonitor( monitor_config=monitor_config, logger=logger, sample_interval_secs=None, global_config=global_config, ) for i in range(0, 100): sleep_delay = monitor._get_initial_sleep_delay() min_jitter = round(monitor_sample_interval / 10) * 2 max_jitter = round(monitor_sample_interval / 10) * 8 self.assertFalse(sleep_delay == monitor_sample_interval) self.assertTrue(sleep_delay >= min_jitter and sleep_delay <= max_jitter) # 3. Verify there is an upper bound of 40 seconds monitor_sample_interval = 1000 monitor_config = MonitorConfig( {"module": "test_module", "sample_interval": 1000}, monitor_module="test_monitor", ) global_config = mock.Mock() global_config.global_monitor_sample_interval_enable_jitter = True monitor = ScalyrMonitor( monitor_config=monitor_config, logger=logger, sample_interval_secs=None, global_config=global_config, ) for i in range(0, 100): sleep_delay = monitor._get_initial_sleep_delay() min_jitter = MIN_INITIAL_GATHER_SAMPLE_SLEEP_SECS max_jitter = MAX_INITIAL_GATHER_SAMPLE_SLEEP_SECS self.assertTrue(sleep_delay >= min_jitter and sleep_delay <= max_jitter)