def setUp(self): aggregator = MetricsAggregator("test_host") self.server = Server(aggregator, "localhost", STATSD_PORT) self.reporter = DummyReporter(aggregator) self.t1 = threading.Thread(target=self.server.start) self.t1.start() confd_path = os.path.realpath(os.path.join(os.path.abspath(__file__), "..", "jmx_yamls")) JMXFetch.init(confd_path, {'dogstatsd_port': STATSD_PORT}, get_logging_config(), 15)
def tearDown(self): self.server.stop() self.reporter.finished = True JMXFetch.stop()
def load_check_directory(agent_config): ''' Return the initialized checks from checks_d, and a mapping of checks that failed to initialize. Only checks that have a configuration file in conf.d will be returned. ''' from monagent.collector.checks import AgentCheck initialized_checks = {} init_failed_checks = {} osname = get_os() checks_paths = [glob.glob(os.path.join(agent_config['additional_checksd'], '*.py'))] try: checksd_path = get_checksd_path(osname) checks_paths.append(glob.glob(os.path.join(checksd_path, '*.py'))) except PathNotFound as e: log.error(e.args[0]) sys.exit(3) try: confd_path = get_confd_path(osname) except PathNotFound as e: log.error( "No conf.d folder found at '%s' or in the directory where the Agent is currently deployed.\n" % e.args[0]) sys.exit(3) # Start JMXFetch if needed JMXFetch.init(confd_path, agent_config, get_logging_config(), DEFAULT_CHECK_FREQUENCY, JMX_COLLECT_COMMAND) # For backwards-compatability with old style checks, we have to load every # checks_d module and check for a corresponding config OR check if the old # config will "activate" the check. # # Once old-style checks aren't supported, we'll just read the configs and # import the corresponding check module for check in itertools.chain(*checks_paths): check_name = os.path.basename(check).split('.')[0] if check_name in initialized_checks or check_name in init_failed_checks: log.debug( 'Skipping check %s because it has already been loaded from another location', check) continue try: check_module = imp.load_source('checksd_%s' % check_name, check) except Exception as e: traceback_message = traceback.format_exc() # Let's see if there is a conf.d for this check conf_path = os.path.join(confd_path, '%s.yaml' % check_name) if os.path.exists(conf_path): # There is a configuration file for that check but the module can't be imported init_failed_checks[check_name] = {'error': e, 'traceback': traceback_message} log.exception('Unable to import check module %s.py from checks_d' % check_name) else: # There is no conf for that check. Let's not spam the logs for it. log.debug('Unable to import check module %s.py from checks_d' % check_name) continue check_class = None classes = inspect.getmembers(check_module, inspect.isclass) for _, clsmember in classes: if clsmember == AgentCheck: continue if issubclass(clsmember, AgentCheck): check_class = clsmember if AgentCheck in clsmember.__bases__: continue else: break if not check_class: log.error('No check class (inheriting from AgentCheck) found in %s.py' % check_name) continue # Check if the config exists OR we match the old-style config conf_path = os.path.join(confd_path, '%s.yaml' % check_name) if os.path.exists(conf_path): try: check_config = check_yaml(conf_path) except Exception as e: log.exception("Unable to parse yaml config in %s" % conf_path) traceback_message = traceback.format_exc() init_failed_checks[check_name] = {'error': e, 'traceback': traceback_message} continue elif hasattr(check_class, 'parse_agent_config'): # FIXME: Remove this check once all old-style checks are gone try: check_config = check_class.parse_agent_config(agent_config) except Exception as e: continue if not check_config: continue d = [ "Configuring %s in agent.conf is deprecated." % (check_name), "Please use conf.d. In a future release, support for the", "old style of configuration will be dropped.", ] log.warn(" ".join(d)) else: log.debug('No conf.d/%s.yaml found for checks_d/%s.py' % (check_name, check_name)) continue # Look for the per-check config, which *must* exist if not check_config.get('instances'): log.error("Config %s is missing 'instances'" % conf_path) continue # Init all of the check's classes with init_config = check_config.get('init_config', {}) # init_config: in the configuration triggers init_config to be defined # to None. if init_config is None: init_config = {} instances = check_config['instances'] try: try: c = check_class(check_name, init_config=init_config, agent_config=agent_config, instances=instances) except TypeError as e: # Backwards compatibility for checks which don't support the # instances argument in the constructor. c = check_class(check_name, init_config=init_config, agent_config=agent_config) c.instances = instances except Exception as e: log.exception('Unable to initialize check %s' % check_name) traceback_message = traceback.format_exc() init_failed_checks[check_name] = {'error': e, 'traceback': traceback_message} else: initialized_checks[check_name] = c # Add custom pythonpath(s) if available if 'pythonpath' in check_config: pythonpath = check_config['pythonpath'] if not isinstance(pythonpath, list): pythonpath = [pythonpath] sys.path.extend(pythonpath) log.debug('Loaded check.d/%s.py' % check_name) log.info('initialized checks_d checks: %s' % initialized_checks.keys()) log.info('initialization failed checks_d checks: %s' % init_failed_checks.keys()) return {'initialized_checks': initialized_checks.values(), 'init_failed_checks': init_failed_checks, }