def main(config_path=None): """ The main entry point for the unix version of dogstatsd. """ parser = optparse.OptionParser("%prog [start|stop|restart|status]") parser.add_option('-u', '--use-local-forwarder', action='store_true', dest="use_forwarder", default=False) opts, args = parser.parse_args() reporter, server = init(config_path, use_watchdog=True, use_forwarder=opts.use_forwarder) pid_file = PidFile('dogstatsd') daemon = Dogstatsd(pid_file.get_path(), server, reporter) # If no args were passed in, run the server in the foreground. if not args: daemon.run() return 0 # Otherwise, we're process the deamon command. else: command = args[0] if command == 'start': daemon.start() elif command == 'stop': daemon.stop() elif command == 'restart': daemon.restart() elif command == 'status': daemon.status() elif command == 'info': return daemon.info() else: sys.stderr.write("Unknown command: %s\n\n" % command) parser.print_help() return 1 return 0
def testBadPidFile(self): pid_dir = "/does-not-exist" p = PidFile('test', pid_dir) path = p.get_path() self.assertEquals(path, os.path.join(tempfile.gettempdir(), 'test.pid')) pid = "666" pid_f = open(path, 'w') pid_f.write(pid) pid_f.close() self.assertEquals(p.get_pid(), 666) self.assertEquals(p.clean(), True) self.assertEquals(os.path.exists(path), False)
def testBadPidFile(self): pid_dir = "/does-not-exist" p = PidFile('test', pid_dir) path = p.get_path() self.assertEquals(path, "/tmp/test.pid") pid = "666" pid_f = open(path, 'w') pid_f.write(pid) pid_f.close() self.assertEquals(p.get_pid(), 666) self.assertEquals(p.clean(), True) self.assertEquals(os.path.exists(path), False)
def main(config_path=None): """ The main entry point for the unix version of dogstatsd. """ parser = optparse.OptionParser("%prog [start|stop|restart|status]") parser.add_option('-u', '--use-local-forwarder', action='store_true', dest="use_forwarder", default=False) opts, args = parser.parse_args() reporter, server = init(config_path, use_watchdog=True, use_forwarder=opts.use_forwarder) # If no args were passed in, run the server in the foreground. if not args: reporter.start() server.start() # If we're here, we're done. logger.info("Shutting down ...") return 0 # Otherwise, we're process the deamon command. else: command = args[0] pid_file = PidFile('dogstatsd') daemon = Dogstatsd(pid_file.get_path(), server, reporter) if command == 'start': daemon.start() elif command == 'stop': daemon.stop() elif command == 'restart': daemon.restart() elif command == 'status': pid = pid_file.get_pid() if pid: message = 'dogstatsd is running with pid %s' % pid else: message = 'dogstatsd is not running' logger.info(message) sys.stdout.write(message + "\n") else: sys.stderr.write("Unknown command: %s\n\n" % command) parser.print_help() return 1 return 0
def main(config_path=None): """ The main entry point for the unix version of dogstatsd. """ parser = optparse.OptionParser("%prog [start|stop|restart|status]") parser.add_option('-u', '--use-local-forwarder', action='store_true', dest="use_forwarder", default=False) opts, args = parser.parse_args() # commands that don't need the daemon if args and args[0] in ['info', 'status']: command = args[0] if command == 'info': logging.getLogger().setLevel(logging.ERROR) return DogstatsdStatus.print_latest_status() elif command == 'status': pid = pid_file.get_pid() if pid: message = 'dogstatsd is running with pid %s' % pid else: message = 'dogstatsd is not running' log.info(message) sys.stdout.write(message + "\n") return 0 reporter, server = init(config_path, use_watchdog=True, use_forwarder=opts.use_forwarder) pid_file = PidFile('dogstatsd') daemon = Dogstatsd(pid_file.get_path(), server, reporter) # If no args were passed in, run the server in the foreground. if not args: daemon.run() return 0 # Otherwise, we're process the deamon command. else: command = args[0] if command == 'start': daemon.start() elif command == 'stop': daemon.stop() elif command == 'restart': daemon.restart() else: sys.stderr.write("Unknown command: %s\n\n" % command) parser.print_help() return 1 return 0
def testGoodPidFie(self): """Verify that the pid file succeeds and fails appropriately""" pid_dir = tempfile.mkdtemp() program = 'test' expected_path = os.path.join(pid_dir, '%s.pid' % program) pid = "666" pid_f = open(expected_path, 'w') pid_f.write(pid) pid_f.close() p = PidFile(program, pid_dir) self.assertEquals(p.get_pid(), 666) # clean up self.assertEquals(p.clean(), True) self.assertEquals(os.path.exists(expected_path), False)
def main(config_path=None): """ The main entry point for the unix version of dogstatsd. """ parser = optparse.OptionParser("%prog [start|stop|restart|status]") parser.add_option('-u', '--use-local-forwarder', action='store_true', dest="use_forwarder", default=False) opts, args = parser.parse_args() reporter, server, cnf = init(config_path, use_watchdog=True, use_forwarder=opts.use_forwarder, args=args) pid_file = PidFile('dogstatsd') daemon = Dogstatsd(pid_file.get_path(), server, reporter, cnf.get('autorestart', False)) # If no args were passed in, run the server in the foreground. if not args: daemon.run() return 0 # Otherwise, we're process the deamon command. else: command = args[0] if command == 'start': daemon.start() elif command == 'stop': daemon.stop() elif command == 'restart': daemon.restart() elif command == 'status': daemon.status() elif command == 'info': return daemon.info() else: sys.stderr.write("Unknown command: %s\n\n" % command) parser.print_help() return 1 return 0
def setUp(self): aggregator = MetricsAggregator("test_host") self.server = Server(aggregator, "localhost", STATSD_PORT) pid_file = PidFile('dogstatsd') 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, JMX_COLLECT_COMMAND)
def setUp(self): aggregator = MetricsAggregator("test_host") self.server = Server(aggregator, "localhost", STATSD_PORT) pid_file = PidFile('dogstatsd') self.reporter = DummyReporter(aggregator) self.t1 = threading.Thread(target=self.server.start) self.t1.start() confd_path = Fixtures.directory() self.jmx_daemon = JMXFetch(confd_path, {'dogstatsd_port': STATSD_PORT}) self.t2 = threading.Thread(target=self.jmx_daemon.run) self.t2.start()
def setUp(self): aggregator = MetricsAggregator("test_host") self.server = Server(aggregator, "localhost", STATSD_PORT) pid_file = PidFile('dogstatsd') self.reporter = DummyReporter(aggregator) self.t1 = threading.Thread(target=self.server.start) self.t1.start() confd_path = os.path.join(os.environ['VOLATILE_DIR'], 'jmx_yaml') self.jmx_daemon = JMXFetch(confd_path, {'dogstatsd_port': STATSD_PORT}) self.t2 = threading.Thread(target=self.jmx_daemon.run) self.t2.start()
class JMXFetch(object): pid_file = PidFile("jmxfetch") pid_file_path = pid_file.get_path() @classmethod def init(cls, confd_path, agentConfig, logging_config, default_check_frequency): try: should_run, java_bin_path = JMXFetch.should_run(confd_path) if should_run: if JMXFetch.is_running(): log.warning("JMXFetch is already running, restarting it.") JMXFetch.stop() JMXFetch.start(confd_path, agentConfig, logging_config, java_bin_path, default_check_frequency) except Exception, e: log.exception("Error while initiating JMXFetch")
def main(): options, args = get_parsed_args() agentConfig = get_config(options=options) autorestart = agentConfig.get('autorestart', False) hostname = get_hostname(agentConfig) COMMANDS = [ 'start', 'stop', 'restart', 'foreground', 'status', 'info', 'check', '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 = PidFile('dd-agent') if options.clean: pid_file.clean() agent = Agent(pid_file.get_path(), autorestart) if command in START_COMMANDS: log.info('Agent version %s' % 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 AgentSupervisor.start(parent_func, child_func) else: # Run in the standard foreground. agent.run(config=agentConfig) elif 'check' == command: check_name = args[1] try: import checks.collector # Try the old-style check first print getattr(checks.collector, check_name)(log).check(agentConfig) except Exception: # If not an old-style check, try checks.d checks = load_check_directory(agentConfig, hostname) for check in checks['initialized_checks']: if check.name == check_name: check.run() print check.get_metrics() print check.get_events() if len(args) == 3 and args[2] == 'check_rate': print "Running 2nd iteration to capture rate metrics" time.sleep(1) check.run() print check.get_metrics() print check.get_events() elif 'configcheck' == command or 'configtest' == command: osname = get_os() all_valid = True for conf_path in glob.glob(os.path.join(get_confd_path(osname), "*.yaml")): basename = os.path.basename(conf_path) try: check_yaml(conf_path) except Exception, 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 Datadog agent." return 0 else: print("Fix the invalid yaml files above in order to start the Datadog agent. " "A useful external tool for yaml parsing can be found at " "http://yaml-online-parser.appspot.com/") return 1
sys.stderr.write("Error while setting up syslog logging (%s). No logging available" % str(e)) logging.disable(logging.ERROR) # Control of daemon if __name__ == '__main__': options, args = get_parsed_args() agentConfig = get_config() # Logging setupLogging(agentConfig) if len(args) > 0: command = args[0] pid_file = PidFile('dd-agent') if options.clean: pid_file.clean() daemon = Agent(pid_file.get_path()) if 'start' == command: logging.info('Start daemon') daemon.start() elif 'stop' == command: logging.info('Stop daemon') daemon.stop() elif 'restart' == command:
def main(): options, args = get_parsed_args() agentConfig = get_config(options=options) autorestart = agentConfig.get('autorestart', False) COMMANDS = [ 'start', 'stop', 'restart', 'foreground', 'status', 'info', ] 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 = PidFile('dd-agent') # Only initialize the Agent if we're starting or stopping it. if command in ['start', 'stop', 'restart', 'foreground']: if options.clean: pid_file.clean() agent = Agent(pid_file.get_path(), autorestart) 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 '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 AgentSupervisor.start(parent_func, child_func) else: # Run in the standard foreground. agent.run(config=agentConfig) # Commands that don't need the agent to be initialized. else: if 'status' == command: pid = pid_file.get_pid() if pid is not None: sys.stdout.write('dd-agent is running as pid %s.\n' % pid) log.info("dd-agent is running as pid %s." % pid) else: sys.stdout.write('dd-agent is not running.\n') log.info("dd-agent is not running.") elif 'info' == command: logging.getLogger().setLevel(logging.ERROR) return CollectorStatus.print_latest_status(verbose=options.verbose) return 0
def main(): options, args = get_parsed_args() agentConfig = get_config() # Logging setup_logging(agentConfig) COMMANDS = [ 'start', 'stop', 'restart', 'foreground', 'status', 'info', ] 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 = PidFile('dd-agent') # Only initialize the Agent if we're starting or stopping it. if command in ['start', 'stop', 'restart', 'foreground']: if options.clean: pid_file.clean() agent = Agent(pid_file.get_path()) if 'start' == command: logging.info('Start daemon') agent.start() elif 'stop' == command: logging.info('Stop daemon') agent.stop() elif 'restart' == command: logging.info('Restart daemon') agent.restart() elif 'foreground' == command: logging.info('Running in foreground') agent.run() # Commands that don't need the agent to be initialized. else: if 'status' == command: pid = pid_file.get_pid() if pid is not None: sys.stdout.write('dd-agent is running as pid %s.\n' % pid) else: sys.stdout.write('dd-agent is not running.\n') elif 'info' == command: return CollectorStatus.print_latest_status() return 0
def main(): options, args = get_parsed_args() agentConfig = get_config(options=options) autorestart = agentConfig.get('autorestart', False) hostname = get_hostname(agentConfig) COMMANDS = [ 'start', 'stop', 'restart', 'foreground', 'status', 'info', 'check', 'configcheck', 'jmx', 'flare', ] 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 # Deprecation notice if command not in DD_AGENT_COMMANDS: # Will become an error message and exit after deprecation period from utils.deprecations import deprecate_old_command_line_tools deprecate_old_command_line_tools() pid_file = PidFile('dd-agent') if options.clean: pid_file.clean() agent = Agent(pid_file.get_path(), autorestart) if command in START_COMMANDS: log.info('Agent version %s' % 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.start(foreground=True) def parent_func(): agent.start_event = False AgentSupervisor.start(parent_func, child_func) else: # Run in the standard foreground. agent.start(foreground=True) elif 'check' == command: if len(args) < 2: sys.stderr.write( "Usage: %s check <check_name> [check_rate]\n" "Add check_rate as last argument to compute rates\n" % sys.argv[0]) return 1 check_name = args[1] try: import checks.collector # Try the old-style check first print getattr(checks.collector, check_name)(log).check(agentConfig) except Exception: # If not an old-style check, try checks.d checks = load_check_directory(agentConfig, hostname) for check in checks['initialized_checks']: if check.name == check_name: check.run() print check.get_metrics() print check.get_events() print check.get_service_checks() if len(args) == 3 and args[2] == 'check_rate': print "Running 2nd iteration to capture rate metrics" time.sleep(1) check.run() print check.get_metrics() print check.get_events() print check.get_service_checks() check.stop() elif 'configcheck' == command or 'configtest' == command: configcheck() elif 'jmx' == command: from jmxfetch import JMX_LIST_COMMANDS, JMXFetch if len(args) < 2 or args[1] not in JMX_LIST_COMMANDS.keys(): print "#" * 80 print "JMX tool to be used to help configuring 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 JMX_LIST_COMMANDS.iteritems(): print " - %s [OPTIONAL: LIST OF CHECKS]: %s" % (command, desc) print "Example: sudo /etc/init.d/datadog-agent jmx list_matching_attributes tomcat jmx solr" print "\n" else: jmx_command = args[1] checks_list = args[2:] confd_directory = get_confd_path(get_os()) jmx_process = JMXFetch(confd_directory, agentConfig) should_run = jmx_process.run(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_directory print "Have you enabled any JMX check ?" print "If you think it's not normal please get in touch with Datadog Support" elif 'flare' == command: Flare.check_user_rights() case_id = int(args[1]) if len(args) > 1 else None f = Flare(True, case_id) f.collect() try: f.upload() except Exception, e: print 'The upload failed:\n{0}'.format(str(e))
% str(e)) logging.disable(logging.ERROR) # Control of daemon if __name__ == '__main__': options, args = get_parsed_args() agentConfig = get_config() # Logging setupLogging(agentConfig) if len(args) > 0: command = args[0] pid_file = PidFile('dd-agent') if options.clean: pid_file.clean() daemon = Agent(pid_file.get_path()) if 'start' == command: logging.info('Start daemon') daemon.start() elif 'stop' == command: logging.info('Stop daemon') daemon.stop() elif 'restart' == command:
def main(): options, args = get_parsed_args() agentConfig = get_config(options=options) autorestart = agentConfig.get('autorestart', False) COMMANDS = [ 'start', 'stop', 'restart', 'foreground', 'status', 'info', 'check', ] 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 = PidFile('dd-agent') if options.clean: pid_file.clean() agent = Agent(pid_file.get_path(), autorestart) 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: 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 AgentSupervisor.start(parent_func, child_func) else: # Run in the standard foreground. agent.run(config=agentConfig) elif 'check' == command: check_name = args[1] try: import checks.collector # Try the old-style check first print getattr(checks.collector, check_name)(log).check(agentConfig) except Exception: # If not an old-style check, try checks.d checks = load_check_directory(agentConfig) for check in checks: if check.name == check_name: check.run() print check.get_metrics() print check.get_events() if len(args) == 3 and args[2] == 'check_rate': print "Running 2nd iteration to capture rate metrics" time.sleep(1) check.run() print check.get_metrics() print check.get_events() return 0
def main(): options, args = get_parsed_args() agentConfig = get_config(options=options) autorestart = agentConfig.get('autorestart', False) hostname = get_hostname(agentConfig) COMMANDS = [ 'start', 'stop', 'restart', 'foreground', 'status', 'info', 'check', 'configcheck', 'jmx', 'flare', ] 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 = PidFile('dd-agent') if options.clean: pid_file.clean() agent = Agent(pid_file.get_path(), autorestart) if command in START_COMMANDS: log.info('Agent version %s' % 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.start(foreground=True) def parent_func(): agent.start_event = False AgentSupervisor.start(parent_func, child_func) else: # Run in the standard foreground. agent.start(foreground=True) elif 'check' == command: if len(args) < 2: sys.stderr.write( "Usage: %s check <check_name> [check_rate]\n" "Add check_rate as last argument to compute rates\n" % sys.argv[0] ) return 1 check_name = args[1] try: import checks.collector # Try the old-style check first print getattr(checks.collector, check_name)(log).check(agentConfig) except Exception: # If not an old-style check, try checks.d checks = load_check_directory(agentConfig, hostname) for check in checks['initialized_checks']: if check.name == check_name: check.run() print check.get_metrics() print check.get_events() print check.get_service_checks() if len(args) == 3 and args[2] == 'check_rate': print "Running 2nd iteration to capture rate metrics" time.sleep(1) check.run() print check.get_metrics() print check.get_events() print check.get_service_checks() check.stop() elif 'configcheck' == command or 'configtest' == command: configcheck() elif 'jmx' == command: from jmxfetch import JMX_LIST_COMMANDS, JMXFetch if len(args) < 2 or args[1] not in JMX_LIST_COMMANDS.keys(): print "#" * 80 print "JMX tool to be used to help configuring 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 JMX_LIST_COMMANDS.iteritems(): print " - %s [OPTIONAL: LIST OF CHECKS]: %s" % (command, desc) print "Example: sudo /etc/init.d/datadog-agent jmx list_matching_attributes tomcat jmx solr" print "\n" else: jmx_command = args[1] checks_list = args[2:] confd_directory = get_confd_path(get_os()) jmx_process = JMXFetch(confd_directory, agentConfig) should_run = jmx_process.run(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_directory print "Have you enabled any JMX check ?" print "If you think it's not normal please get in touch with Datadog Support" elif 'flare' == command: Flare.check_user_rights() case_id = int(args[1]) if len(args) > 1 else None f = Flare(True, case_id) f.collect() try: f.upload() except Exception, e: print 'The upload failed:\n{0}'.format(str(e))
def main(): options, args = get_parsed_args() agentConfig = get_config(options=options) autorestart = agentConfig.get('autorestart', False) COMMANDS = [ 'start', 'stop', 'restart', 'foreground', 'status', 'info', 'check', ] 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 = PidFile('dd-agent') if options.clean: pid_file.clean() agent = Agent(pid_file.get_path(), autorestart) 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 AgentSupervisor.start(parent_func, child_func) else: # Run in the standard foreground. agent.run(config=agentConfig) elif 'check' == command: check_name = args[1] try: import checks.collector # Try the old-style check first print getattr(checks.collector, check_name)(log).check(agentConfig) except Exception: # If not an old-style check, try checks.d checks = load_check_directory(agentConfig) for check in checks['initialized_checks']: if check.name == check_name: check.run() print check.get_metrics() print check.get_events() if len(args) == 3 and args[2] == 'check_rate': print "Running 2nd iteration to capture rate metrics" time.sleep(1) check.run() print check.get_metrics() print check.get_events() return 0
class JMXFetch(object): pid_file = PidFile("jmxfetch") pid_file_path = pid_file.get_path() @classmethod def init(cls, confd_path, agentConfig, logging_config, default_check_frequency, command=None, checks_list=None, reporter=None): try: command = command or JMX_COLLECT_COMMAND jmx_checks, invalid_checks, java_bin_path, java_options, tools_jar_path = JMXFetch.should_run(confd_path, checks_list) if len(invalid_checks) > 0: try: JMXFetch.write_status_file(invalid_checks) except Exception: log.exception("Error while writing JMX status file") if len(jmx_checks) > 0: if JMXFetch.is_running() and command == JMX_COLLECT_COMMAND: log.warning("JMXFetch is already running, restarting it.") JMXFetch.stop() JMXFetch.start(confd_path, agentConfig, logging_config, java_bin_path, java_options, default_check_frequency, jmx_checks, command, reporter, tools_jar_path) return True except Exception: log.exception("Error while initiating JMXFetch") @classmethod def write_status_file(cls, invalid_checks): data = { 'timestamp': time.time(), 'invalid_checks': invalid_checks } stream = file(os.path.join(tempfile.gettempdir(), PYTHON_JMX_STATUS_FILE), 'w') yaml.dump(data, stream, Dumper=yDumper) stream.close() @classmethod def should_run(cls, confd_path, checks_list): """ Return a tuple (jmx_checks, invalid_checks, java_bin_path, java_options) jmx_checks: list of yaml files that are jmx checks (they have the is_jmx flag enabled or they are in JMX_CHECKS) and that have at least one instance configured invalid_checks: dictionary whose keys are check names that are JMX checks but they have a bad configuration. Values of the dictionary are exceptions generated when checking the configuration java_bin_path: is the path to the java executable. It was previously set in the "instance" part of the yaml file of the jmx check. So we need to parse yaml files to get it. We assume that this value is alwayws the same for every jmx check so we can return the first value returned java_options: is string contains options that will be passed to java_bin_path We assume that this value is alwayws the same for every jmx check so we can return the first value returned tools_jar_path: Path to tools.jar, which is only part of the JDK and that is required to connect to a local JMX instance using the attach api. """ jmx_checks = [] java_bin_path = None java_options = None tools_jar_path = None invalid_checks = {} for conf in glob.glob(os.path.join(confd_path, '*.yaml')): filename = os.path.basename(conf) check_name = filename.split('.')[0] if os.path.exists(conf): f = open(conf) try: check_config = yaml.load(f.read(), Loader=yLoader) assert check_config is not None f.close() except Exception: f.close() log.error("Unable to parse yaml config in %s" % conf) continue try: is_jmx, check_java_bin_path, check_java_options, check_tools_jar_path = JMXFetch.is_jmx_check(check_config, check_name, checks_list) if is_jmx: jmx_checks.append(filename) if java_bin_path is None and check_java_bin_path is not None: java_bin_path = check_java_bin_path if java_options is None and check_java_options is not None: java_options = check_java_options if tools_jar_path is None and check_tools_jar_path is not None: tools_jar_path = check_tools_jar_path except InvalidJMXConfiguration, e: log.error("%s check is not a valid jmx configuration: %s" % (check_name, e)) invalid_checks[check_name] = e return (jmx_checks, invalid_checks, java_bin_path, java_options, tools_jar_path)
def main(): options, args = get_parsed_args() agentConfig = get_config(options=options) autorestart = agentConfig.get('autorestart', False) COMMANDS = [ 'start', 'stop', 'restart', 'foreground', 'status', 'info', 'check', '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 = PidFile('dd-agent') if options.clean: pid_file.clean() agent = Agent(pid_file.get_path(), autorestart) if command in START_COMMANDS: log.info('Agent version %s' % 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 AgentSupervisor.start(parent_func, child_func) else: # Run in the standard foreground. agent.run(config=agentConfig) elif 'check' == command: check_name = args[1] try: import checks.collector # Try the old-style check first print getattr(checks.collector, check_name)(log).check(agentConfig) except Exception: # If not an old-style check, try checks.d checks = load_check_directory(agentConfig) for check in checks['initialized_checks']: if check.name == check_name: check.run() print check.get_metrics() print check.get_events() if len(args) == 3 and args[2] == 'check_rate': print "Running 2nd iteration to capture rate metrics" time.sleep(1) check.run() print check.get_metrics() print check.get_events() elif 'configcheck' == command or 'configtest' == command: osname = get_os() all_valid = True for conf_path in glob.glob( os.path.join(get_confd_path(osname), "*.yaml")): basename = os.path.basename(conf_path) try: check_yaml(conf_path) except Exception, 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 Datadog agent." return 0 else: print( "Fix the invalid yaml files above in order to start the Datadog agent. " "A useful external tool for yaml parsing can be found at " "http://yaml-online-parser.appspot.com/") return 1
def main(): options, args = get_parsed_args() agentConfig = get_config() # Logging setup_logging(agentConfig) COMMANDS = [ 'start', 'stop', 'restart', 'foreground', 'status', 'info', ] 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 = PidFile('dd-agent') # Only initialize the Agent if we're starting or stopping it. if command in ['start', 'stop', 'restart', 'foreground']: if options.clean: pid_file.clean() agent = Agent(pid_file.get_path()) if 'start' == command: logging.info('Start daemon') agent.start() elif 'stop' == command: logging.info('Stop daemon') agent.stop() elif 'restart' == command: logging.info('Restart daemon') agent.restart() elif 'foreground' == command: logging.info('Running in foreground') agent.run() # Commands that don't need the agent to be initialized. else: if 'status' == command: pid = pid_file.get_pid() if pid is not None: sys.stdout.write('dd-agent is running as pid %s.\n' % pid) else: sys.stdout.write('dd-agent is not running.\n') elif 'info' == command: CollectorStatus.print_latest_status() return 0