def load_check(name, config, agent_config): checksd_path = load_check_directory() if checksd_path not in sys.path: sys.path.append(checksd_path) check_module = __import__(name) check_class = None classes = inspect.getmembers(check_module, inspect.isclass) for name, clsmember in classes: if clsmember == AgentCheck: continue if issubclass(clsmember, AgentCheck): check_class = clsmember if AgentCheck in clsmember.__bases__: continue else: break if check_class is None: raise Exception( "Unable to import check %s. Missing a class that inherits AgentCheck" % name) init_config = config.get('init_config', None) instances = config.get('instances') # init the check class try: return check_class( name, init_config=init_config, agent_config=agent_config, instances=instances) except: # Backwards compatitiblity for old checks that don't support the # instances argument. c = check_class(name, init_config=init_config, agent_config=agent_config) c.instances = instances return c
def get_check(name, config_str): checksd_path = load_check_directory() if checksd_path not in sys.path: sys.path.append(checksd_path) check_module = __import__(name) check_class = None classes = inspect.getmembers(check_module, inspect.isclass) for name, clsmember in classes: if AgentCheck in clsmember.__bases__: check_class = clsmember break if check_class is None: raise Exception( "Unable to import check %s. Missing a class that inherits AgentCheck" % name) return check_class.from_yaml(yaml_text=config_str, check_name=name)
def load_check(name, config, agent_config): checksd_path = load_check_directory() if checksd_path not in sys.path: sys.path.append(checksd_path) check_module = __import__(name) check_class = None classes = inspect.getmembers(check_module, inspect.isclass) for name, clsmember in classes: if clsmember == AgentCheck: continue if issubclass(clsmember, AgentCheck): check_class = clsmember if AgentCheck in clsmember.__bases__: continue else: break if check_class is None: raise Exception( "Unable to import check %s. Missing a class that inherits AgentCheck" % name) init_config = config.get('init_config', None) instances = config.get('instances') # init the check class try: return check_class(name, init_config=init_config, agent_config=agent_config, instances=instances) except: # Backwards compatitiblity for old checks that don't support the # instances argument. c = check_class(name, init_config=init_config, agent_config=agent_config) c.instances = instances return c
def run(self, config): """Main loop of the collector. """ # Gracefully exit on sigterm. signal.signal(signal.SIGTERM, self._handle_sigterm) # A SIGUSR1 signals an exit with an autorestart signal.signal(signal.SIGUSR1, self._handle_sigusr1) # Handle Keyboard Interrupt signal.signal(signal.SIGINT, self._handle_sigterm) # Save the agent start-up stats. monasca_agent.common.check_status.CollectorStatus().persist() # Load the checks_d checks checksd = util.load_check_directory() self.collector = checks.collector.Collector(config, monasca_agent.common.emitter.http_emitter, checksd) # Configure the watchdog. check_frequency = int(config['check_freq']) watchdog = self._get_watchdog(check_frequency, config) # Initialize the auto-restarter self.restart_interval = int(config.get('restart_interval', RESTART_INTERVAL)) self.agent_start = time.time() # Run the main loop. while self.run_forever: # enable profiler if needed profiled = False if config.get('profile', False) and config.get('profile').lower() == 'yes': try: import cProfile profiler = cProfile.Profile() profiled = True profiler.enable() log.debug("Agent profiling is enabled") except Exception: log.warn("Cannot enable profiler") # Do the work. self.collector.run() # disable profiler and printout stats to stdout if config.get('profile', False) and config.get('profile').lower() == 'yes' and profiled: try: profiler.disable() import cStringIO import pstats s = cStringIO.StringIO() ps = pstats.Stats(profiler, stream=s).sort_stats("cumulative") ps.print_stats() log.debug(s.getvalue()) except Exception: log.warn("Cannot disable profiler") # Check if we should restart. if self.autorestart and self._should_restart(): self._do_restart() # Only plan for the next loop if we will continue, # otherwise just exit quickly. if self.run_forever: if watchdog: watchdog.reset() time.sleep(check_frequency) # Now clean-up. try: monasca_agent.common.check_status.CollectorStatus.remove_latest_status() except Exception: pass # Explicitly kill the process, because it might be running # as a daemon. log.info("Exiting. Bye bye.") sys.exit(0)
def main(): options, args = util.get_parsed_args() config = cfg.Config() collector_config = config.get_config(['Main', 'Api', 'Logging']) # todo autorestart isn't used remove autorestart = collector_config.get('autorestart', False) COMMANDS = [ 'start', 'stop', 'restart', 'foreground', 'status', 'info', 'check', 'check_all', 'configcheck', 'jmx', ] if len(args) < 1: sys.stderr.write("Usage: %s %s\n" % (sys.argv[0], "|".join(COMMANDS))) return 2 command = args[0] if command not in COMMANDS: sys.stderr.write("Unknown command: %s\n" % command) return 3 pid_file = util.PidFile('monasca-agent') if options.clean: pid_file.clean() agent = CollectorDaemon(pid_file.get_path(), autorestart) if command in START_COMMANDS: log.info('Agent version %s' % config.get_version()) if 'start' == command: log.info('Start daemon') agent.start() elif 'stop' == command: log.info('Stop daemon') agent.stop() elif 'restart' == command: log.info('Restart daemon') agent.restart() elif 'status' == command: agent.status() elif 'info' == command: return agent.info(verbose=options.verbose) elif 'foreground' == command: logging.info('Running in foreground') if autorestart: # Set-up the supervisor callbacks and fork it. logging.info('Running Agent with auto-restart ON') def child_func(): agent.run() def parent_func(): agent.start_event = False monasca_agent.common.daemon.AgentSupervisor.start(parent_func, child_func) else: # Run in the standard foreground. agent.run(collector_config) elif 'check' == command: check_name = args[1] checks = util.load_check_directory() for check in checks['initialized_checks']: if check.name == check_name: run_check(check) elif 'check_all' == command: print("Loading check directory...") checks = util.load_check_directory() print("...directory loaded.\n") for check in checks['initialized_checks']: run_check(check) elif 'configcheck' == command or 'configtest' == command: osname = util.get_os() all_valid = True paths = util.Paths() for conf_path in glob.glob(os.path.join(paths.get_confd_path(), "*.yaml")): basename = os.path.basename(conf_path) try: config.check_yaml(conf_path) except Exception as e: all_valid = False print("%s contains errors:\n %s" % (basename, e)) else: print("%s is valid" % basename) if all_valid: print("All yaml files passed. You can now run the Monitoring agent.") return 0 else: print("Fix the invalid yaml files above in order to start the Monitoring agent. " "A useful external tool for yaml parsing can be found at " "http://yaml-online-parser.appspot.com/") return 1 elif 'jmx' == command: if len(args) < 2 or args[1] not in jmxfetch.JMX_LIST_COMMANDS.keys(): print("#" * 80) print("JMX tool to be used to help configure your JMX checks.") print("See http://docs.datadoghq.com/integrations/java/ for more information") print("#" * 80) print("\n") print("You have to specify one of the following commands:") for command, desc in jmxfetch.JMX_LIST_COMMANDS.iteritems(): print(" - %s [OPTIONAL: LIST OF CHECKS]: %s" % (command, desc)) print("Example: sudo /etc/init.d/monasca-agent jmx list_matching_attributes tomcat jmx solr") print("\n") else: jmx_command = args[1] checks_list = args[2:] paths = util.Paths() confd_path = paths.get_confd_path() # Start JMXFetch if needed should_run = jmxfetch.JMXFetch.init(confd_path, config, 15, jmx_command, checks_list, reporter="console") if not should_run: print("Couldn't find any valid JMX configuration in your conf.d directory: %s" % confd_path) print("Have you enabled any JMX checks ?") return 0
def run(self, config): """Main loop of the collector. """ # Gracefully exit on sigterm. signal.signal(signal.SIGTERM, self._handle_sigterm) # A SIGUSR1 signals an exit with an autorestart if hasattr(signal, 'SIGUSR1'): # Windows does not have this signal. signal.signal(signal.SIGUSR1, self._handle_sigusr1) # Handle Keyboard Interrupt signal.signal(signal.SIGINT, self._handle_sigterm) # Load the checks_d checks checksd = util.load_check_directory() self.collector = checks.collector.Collector( config, monasca_agent.common.emitter.http_emitter, checksd) check_frequency = int(config['check_freq']) # Initialize the auto-restarter self.restart_interval = int(util.get_collector_restart_interval()) self.agent_start = time.time() exitCode = 0 exitTimeout = 0 # Run the main loop. while self.run_forever: collection_start = time.time() # enable profiler if needed profiled = False if config.get('profile', False): try: import cProfile profiler = cProfile.Profile() profiled = True profiler.enable() log.debug("Agent profiling is enabled") except Exception: log.warn("Cannot enable profiler") # Do the work. self.collector.run(check_frequency) # disable profiler and printout stats to stdout if config.get('profile', False) and profiled: try: profiler.disable() s = six.StringIO() ps = pstats.Stats(profiler, stream=s).sort_stats("cumulative") ps.print_stats() log.debug(s.getvalue()) except Exception: log.warn("Cannot disable profiler") # Check if we should restart. if self.autorestart and self._should_restart(): self.run_forever = False exitCode = monasca_agent.common.daemon.AgentSupervisor.RESTART_EXIT_STATUS exitTimeout = 120 log.info('Startng an auto restart') # Only plan for the next loop if we will continue, # otherwise just exit quickly. if self.run_forever: collection_time = time.time() - collection_start if collection_time < check_frequency: time.sleep(check_frequency - collection_time) else: log.info( "Collection took {0} which is as long or longer then the configured " "collection frequency of {1}. Starting collection again without waiting " "in result.".format(collection_time, check_frequency)) self._stop(exitTimeout) # Explicitly kill the process, because it might be running # as a daemon. log.info("Exiting collector daemon, code %d." % exitCode) os._exit(exitCode)
def run(self, config): """Main loop of the collector. """ # Gracefully exit on sigterm. signal.signal(signal.SIGTERM, self._handle_sigterm) # A SIGUSR1 signals an exit with an autorestart signal.signal(signal.SIGUSR1, self._handle_sigusr1) # Handle Keyboard Interrupt signal.signal(signal.SIGINT, self._handle_sigterm) # Load the checks_d checks checksd = util.load_check_directory() self.collector = checks.collector.Collector(config, monasca_agent.common.emitter.http_emitter, checksd) check_frequency = int(config['check_freq']) # Initialize the auto-restarter self.restart_interval = int(util.get_collector_restart_interval()) self.agent_start = time.time() # Run the main loop. while self.run_forever: collection_start = time.time() # enable profiler if needed profiled = False if config.get('profile', False) and config.get('profile').lower() == 'yes': try: import cProfile profiler = cProfile.Profile() profiled = True profiler.enable() log.debug("Agent profiling is enabled") except Exception: log.warn("Cannot enable profiler") # Do the work. self.collector.run(check_frequency) # disable profiler and printout stats to stdout if config.get('profile', False) and config.get('profile').lower() == 'yes' and profiled: try: profiler.disable() import cStringIO import pstats s = cStringIO.StringIO() ps = pstats.Stats(profiler, stream=s).sort_stats("cumulative") ps.print_stats() log.debug(s.getvalue()) except Exception: log.warn("Cannot disable profiler") # Check if we should restart. if self.autorestart and self._should_restart(): self._do_restart() # Only plan for the next loop if we will continue, # otherwise just exit quickly. if self.run_forever: collection_time = time.time() - collection_start if collection_time < check_frequency: time.sleep(check_frequency - collection_time) else: log.info("Collection took {0} which is as long or longer then the configured collection frequency " "of {1}. Starting collection again without waiting in result.".format(collection_time, check_frequency)) # Explicitly kill the process, because it might be running # as a daemon. log.info("Exiting. Bye bye.") sys.exit(0)
def run(self, config): """Main loop of the collector. """ # Gracefully exit on sigterm. signal.signal(signal.SIGTERM, self._handle_sigterm) # A SIGUSR1 signals an exit with an autorestart if hasattr(signal, 'SIGUSR1'): # Windows does not have this signal. signal.signal(signal.SIGUSR1, self._handle_sigusr1) # Handle Keyboard Interrupt signal.signal(signal.SIGINT, self._handle_sigterm) # Load the checks_d checks checksd = util.load_check_directory() self.collector = Collector( config, monasca_agent.common.emitter.http_emitter, checksd) check_frequency = int(config['check_freq']) # Initialize the auto-restarter self.restart_interval = int(util.get_collector_restart_interval()) self.agent_start = time.time() exitCode = 0 exitTimeout = 0 # Run the main loop. while self.run_forever: collection_start = time.time() # enable profiler if needed profiled = False if config.get('profile', False): try: import cProfile profiler = cProfile.Profile() profiled = True profiler.enable() log.debug("Agent profiling is enabled") except Exception: log.warn("Cannot enable profiler") # Do the work. self.collector.run(check_frequency) # disable profiler and printout stats to stdout if config.get('profile', False) and profiled: try: profiler.disable() s = six.StringIO() ps = pstats.Stats(profiler, stream=s).sort_stats("cumulative") ps.print_stats() log.debug(s.getvalue()) except Exception: log.warn("Cannot disable profiler") # Check if we should restart. if self.autorestart and self._should_restart(): self.run_forever = False exitCode = monasca_agent.common.daemon.AgentSupervisor.RESTART_EXIT_STATUS exitTimeout = 120 log.info('Startng an auto restart') # Only plan for the next loop if we will continue, # otherwise just exit quickly. if self.run_forever: collection_time = time.time() - collection_start if collection_time < check_frequency: time.sleep(check_frequency - collection_time) else: log.info( "Collection took {0} which is as long or longer then the configured " "collection frequency of {1}. Starting collection again without waiting " "in result.".format(collection_time, check_frequency)) self._stop(exitTimeout) # Explicitly kill the process, because it might be running # as a daemon. log.info("Exiting collector daemon, code %d." % exitCode) os._exit(exitCode)
def main(): options, args = util.get_parsed_args() config = cfg.Config() collector_config = config.get_config(['Main', 'Api', 'Logging']) # todo autorestart isn't used remove autorestart = collector_config.get('autorestart', False) COMMANDS = [ 'start', 'stop', 'restart', 'foreground', 'status', 'info', 'check', 'check_all', 'configcheck', 'jmx', ] if len(args) < 1: sys.stderr.write("Usage: %s %s\n" % (sys.argv[0], "|".join(COMMANDS))) return 2 command = args[0] if command not in COMMANDS: sys.stderr.write("Unknown command: %s\n" % command) return 3 pid_file = util.PidFile('monasca-agent') if options.clean: pid_file.clean() agent = CollectorDaemon(pid_file.get_path(), autorestart) if command in START_COMMANDS: log.info('Agent version %s' % config.get_version()) if 'start' == command: log.info('Start daemon') agent.start() elif 'stop' == command: log.info('Stop daemon') agent.stop() elif 'restart' == command: log.info('Restart daemon') agent.restart() elif 'status' == command: agent.status() elif 'info' == command: return agent.info(verbose=options.verbose) elif 'foreground' == command: logging.info('Running in foreground') if autorestart: # Set-up the supervisor callbacks and fork it. logging.info('Running Agent with auto-restart ON') def child_func(): agent.run() def parent_func(): agent.start_event = False monasca_agent.common.daemon.AgentSupervisor.start(parent_func, child_func) else: # Run in the standard foreground. agent.run(collector_config) elif 'check' == command: check_name = args[1] checks = util.load_check_directory() for check in checks['initialized_checks']: if check.name == check_name: run_check(check) elif 'check_all' == command: print("Loading check directory...") checks = util.load_check_directory() print("...directory loaded.\n") for check in checks['initialized_checks']: run_check(check) elif 'configcheck' == command or 'configtest' == command: all_valid = True paths = util.Paths() for conf_path in glob.glob(os.path.join(paths.get_confd_path(), "*.yaml")): basename = os.path.basename(conf_path) try: config.check_yaml(conf_path) except Exception as e: all_valid = False print("%s contains errors:\n %s" % (basename, e)) else: print("%s is valid" % basename) if all_valid: print("All yaml files passed. You can now run the Monitoring agent.") return 0 else: print("Fix the invalid yaml files above in order to start the Monitoring agent. " "A useful external tool for yaml parsing can be found at " "http://yaml-online-parser.appspot.com/") return 1
def main(): options, args = util.get_parsed_args() config = cfg.Config() collector_config = config.get_config(["Main", "Api", "Logging"]) autorestart = collector_config.get("autorestart", False) collector_restart_interval = collector_config.get("collector_restart_interval", 24) if collector_restart_interval in range(1, 49): pass else: log.error( "Collector_restart_interval = {0} is out of legal range" " [1, 48]. Reset collector_restart_interval to 24".format(collector_restart_interval) ) collector_restart_interval = 24 COMMANDS = ["start", "stop", "restart", "foreground", "status", "info", "check", "check_all", "configcheck", "jmx"] if len(args) < 1: sys.stderr.write("Usage: %s %s\n" % (sys.argv[0], "|".join(COMMANDS))) return 2 command = args[0] if command not in COMMANDS: sys.stderr.write("Unknown command: %s\n" % command) return 3 pid_file = util.PidFile("monasca-agent") if options.clean: pid_file.clean() agent = CollectorDaemon(pid_file.get_path(), autorestart) if command in START_COMMANDS: log.info("Agent version %s" % config.get_version()) if "start" == command: log.info("Start daemon") agent.start() elif "stop" == command: log.info("Stop daemon") agent.stop() elif "restart" == command: log.info("Restart daemon") agent.restart() elif "status" == command: agent.status() elif "info" == command: return agent.info(verbose=options.verbose) elif "foreground" == command: logging.info("Running in foreground") if autorestart: # Set-up the supervisor callbacks and fork it. logging.info("Running Agent with auto-restart ON") # Run in the standard foreground. agent.run(collector_config) elif "check" == command: check_name = args[1] checks = util.load_check_directory() for check in checks["initialized_checks"]: if check.name == check_name: run_check(check) elif "check_all" == command: print("Loading check directory...") checks = util.load_check_directory() print("...directory loaded.\n") for check in checks["initialized_checks"]: run_check(check) elif "configcheck" == command or "configtest" == command: all_valid = True paths = util.Paths() for conf_path in glob.glob(os.path.join(paths.get_confd_path(), "*.yaml")): basename = os.path.basename(conf_path) try: config.check_yaml(conf_path) except Exception as e: all_valid = False print("%s contains errors:\n %s" % (basename, e)) else: print("%s is valid" % basename) if all_valid: print("All yaml files passed. You can now run the Monitoring agent.") return 0 else: print( "Fix the invalid yaml files above in order to start the Monitoring agent. " "A useful external tool for yaml parsing can be found at " "http://yaml-online-parser.appspot.com/" ) return 1 elif "jmx" == command: if len(args) < 2 or args[1] not in jmxfetch.JMX_LIST_COMMANDS.keys(): print("#" * 80) print("JMX tool to be used to help configure your JMX checks.") print("See http://docs.datadoghq.com/integrations/java/ for more information") print("#" * 80) print("\n") print("You have to specify one of the following commands:") for command, desc in jmxfetch.JMX_LIST_COMMANDS.iteritems(): print(" - %s [OPTIONAL: LIST OF CHECKS]: %s" % (command, desc)) print("Example: sudo /etc/init.d/monasca-agent jmx list_matching_attributes tomcat jmx solr") print("\n") else: jmx_command = args[1] checks_list = args[2:] paths = util.Paths() confd_path = paths.get_confd_path() # Start JMXFetch if needed should_run = jmxfetch.JMXFetch.init(confd_path, config, 15, jmx_command, checks_list, reporter="console") if not should_run: print("Couldn't find any valid JMX configuration in your conf.d directory: %s" % confd_path) print("Have you enabled any JMX checks ?") return 0