def local_config(args): import os import sys import logging if len(args) == 0: usage('local-config') sys.exit(1) from newrelic.config import initialize from newrelic.core.config import global_settings if len(args) >= 2: log_file = args[1] else: log_file = '/tmp/python-agent-test.log' log_level = logging.DEBUG try: os.unlink(log_file) except Exception: pass config_file = args[0] environment = os.environ.get('NEW_RELIC_ENVIRONMENT') if config_file == '-': config_file = os.environ.get('NEW_RELIC_CONFIG_FILE') initialize(config_file, environment, ignore_errors=False, log_file=log_file, log_level=log_level) for key, value in sorted(global_settings()): print('%s = %r' % (key, value))
def initialize_usage(usage_name, args): import os import sys import logging if len(args) == 0: usage(usage_name) sys.exit(1) from newrelic.config import initialize from newrelic.core.config import global_settings log_level = logging.DEBUG log_file = get_log_file_path(args) try: os.unlink(log_file) except Exception: pass config_file = args[0] environment = os.environ.get('NEW_RELIC_ENVIRONMENT') if config_file == '-': config_file = os.environ.get('NEW_RELIC_CONFIG_FILE') initialize(config_file, environment, ignore_errors=False, log_file=log_file, log_level=log_level) return global_settings()
def server_config(args): import os import sys import logging import time if len(args) == 0: usage('server-config') sys.exit(1) from newrelic.api.application import register_application from newrelic.config import initialize if len(args) >= 2: log_file = args[1] else: log_file = '/tmp/python-agent-test.log' log_level = logging.DEBUG try: os.unlink(log_file) except Exception: pass config_file = args[0] environment = os.environ.get('NEW_RELIC_ENVIRONMENT') if config_file == '-': config_file = os.environ.get('NEW_RELIC_CONFIG_FILE') initialize(config_file, environment, ignore_errors=False, log_file=log_file, log_level=log_level) _timeout = 30.0 _start = time.time() _application = register_application(timeout=_timeout) _end = time.time() _duration = _end - _start _logger = logging.getLogger(__name__) if not _application.active: _logger.error('Unable to register application for test, ' 'connection could not be established within %s seconds.', _timeout) return _logger.debug('Registration took %s seconds.', _duration) for key, value in sorted(_application.settings): print('%s = %r' % (key, value))
def record_deploy_cmd(args): import sys if len(args) < 2: usage("record-deploy") sys.exit(1) def _args(config_file, description, revision="Unknown", changelog=None, user=None, *args): return config_file, description, revision, changelog, user config_file, description, revision, changelog, user = _args(*args) settings = global_settings() settings.monitor_mode = False initialize(config_file) host = settings.host if host == "collector.newrelic.com": host = "api.newrelic.com" elif host.startswith("collector.eu"): host = "api.eu.newrelic.com" elif host == "staging-collector.newrelic.com": host = "staging-api.newrelic.com" port = settings.port or 443 record_deploy( host=host, api_key=settings.api_key, app_name=settings.app_name, description=description, revision=revision, changelog=changelog, user=user, port=port, proxy_scheme=settings.proxy_scheme, proxy_host=settings.proxy_host, proxy_user=settings.proxy_user, proxy_pass=settings.proxy_pass, timeout=settings.agent_limits.data_collector_timeout, ca_bundle_path=settings.ca_bundle_path, disable_certificate_validation=settings.debug. disable_certificate_validation, )
def network_config(args): import os import sys import logging if len(args) == 0: usage('network-config') sys.exit(1) from newrelic.config import initialize from newrelic.core.config import global_settings if len(args) >= 2: log_file = args[1] else: log_file = '/tmp/python-agent-test.log' log_level = logging.DEBUG try: os.unlink(log_file) except Exception: pass config_file = args[0] environment = os.environ.get('NEW_RELIC_ENVIRONMENT') if config_file == '-': config_file = os.environ.get('NEW_RELIC_CONFIG_FILE') initialize(config_file, environment, ignore_errors=False, log_file=log_file, log_level=log_level) _settings = global_settings() print('host = %r' % _settings.host) print('port = %r' % _settings.port) print('proxy_scheme = %r' % _settings.proxy_scheme) print('proxy_host = %r' % _settings.proxy_host) print('proxy_port = %r' % _settings.proxy_port) print('proxy_user = %r' % _settings.proxy_user) print('proxy_pass = %r' % _settings.proxy_pass) print('ssl = %r' % _settings.ssl)
def _test_collector_hostname(config_file_key=None, config_override_host=None, env_key=None, env_override_host=None, hostname=None, queue=None): try: ini_contents = '[newrelic]' if 'NEW_RELIC_HOST' in os.environ: del os.environ['NEW_RELIC_HOST'] if 'NEW_RELIC_LICENSE_KEY' in os.environ: del os.environ['NEW_RELIC_LICENSE_KEY'] if env_override_host: os.environ['NEW_RELIC_HOST'] = env_override_host if env_key: os.environ['NEW_RELIC_LICENSE_KEY'] = env_key if config_file_key: ini_contents += '\nlicense_key = %s' % config_file_key if config_override_host: ini_contents += '\nhost = %s' % config_override_host import newrelic.config as config import newrelic.core.config as core_config reload(core_config) reload(config) ini_file = tempfile.NamedTemporaryFile() ini_file.write(ini_contents.encode('utf-8')) ini_file.seek(0) config.initialize(ini_file.name) settings = core_config.global_settings() assert settings.host == hostname except: if queue: queue.put(sys.exc_info()[1]) raise if queue: queue.put('PASS')
def reset(wrapped, instance, args, kwargs): with Environ(env_dict): ini_file = tempfile.NamedTemporaryFile() ini_file.write(ini_contents) ini_file.seek(0) # clean settings cache and reload env vars # Note that reload can at times work in unexpected ways. All that # is required here is that the globals (such as # newrelic.core.config._settings) be reset. # # From python docs (2.x and 3.x) # "When a module is reloaded, its dictionary (containing the # module's global variables) is retained. Redefinitions of names # will override the old definitions, so this is generally not a # problem." reload(newrelic.core.config) reload(newrelic.config) initialize(ini_file.name) returned = wrapped(*args, **kwargs) return returned
def global_settings(request, monkeypatch): ini_contents = request.getfixturevalue("ini") monkeypatch.delenv("NEW_RELIC_HOST", raising=False) monkeypatch.delenv("NEW_RELIC_LICENSE_KEY", raising=False) if "env" in request.fixturenames: env = request.getfixturevalue("env") for k, v in env.items(): monkeypatch.setenv(k, v) import newrelic.config as config # pylint: disable=R0402 import newrelic.core.config as core_config # pylint: disable=R0402 original = {} for attr in dir(core_config): original[attr] = getattr(core_config, attr) agent = agent_instance() original_agent_config = agent._config reload(core_config) reload(config) with tempfile.NamedTemporaryFile() as ini_file: ini_file.write(ini_contents) ini_file.seek(0) config.initialize(ini_file.name) agent._config = core_config.global_settings() yield core_config.global_settings monkeypatch.undo() for attr_name, attr_value in original.items(): setattr(core_config, attr_name, attr_value) agent._config = original_agent_config reload(config)
def global_settings(request, monkeypatch): ini_contents = request.getfixturevalue('ini') monkeypatch.delenv('NEW_RELIC_HOST', raising=False) monkeypatch.delenv('NEW_RELIC_LICENSE_KEY', raising=False) if 'env' in request.funcargnames: env = request.getfixturevalue('env') for k, v in env.items(): monkeypatch.setenv(k, v) import newrelic.config as config import newrelic.core.config as core_config original = {} for attr in dir(core_config): original[attr] = getattr(core_config, attr) agent = agent_instance() original_agent_config = agent._config reload(core_config) reload(config) ini_file = tempfile.NamedTemporaryFile() ini_file.write(ini_contents) ini_file.seek(0) config.initialize(ini_file.name) agent._config = core_config.global_settings() yield core_config.global_settings monkeypatch.undo() for attr_name, attr_value in original.items(): setattr(core_config, attr_name, attr_value) agent._config = original_agent_config reload(config)
def validate_config(args): import os import sys import logging import time if len(args) == 0: usage('validate-config') sys.exit(1) from newrelic.api.application import register_application from newrelic.config import initialize from newrelic.core.config import global_settings if len(args) >= 2: log_file = args[1] else: log_file = '/tmp/python-agent-test.log' log_level = logging.DEBUG try: os.unlink(log_file) except Exception: pass config_file = args[0] environment = os.environ.get('NEW_RELIC_ENVIRONMENT') if config_file == '-': config_file = os.environ.get('NEW_RELIC_CONFIG_FILE') initialize(config_file, environment, ignore_errors=False, log_file=log_file, log_level=log_level) _logger = logging.getLogger(__name__) _logger.debug('Starting agent validation.') _settings = global_settings() app_name = os.environ.get('NEW_RELIC_TEST_APP_NAME', 'Python Agent Test') _settings.app_name = app_name _settings.transaction_tracer.transaction_threshold = 0 _settings.shutdown_timeout = 30.0 _settings.debug.log_malformed_json_data = True _settings.debug.log_data_collector_payloads = True _settings.debug.log_transaction_trace_payload = True print(_user_message % dict(app_name=app_name, log_file=log_file)) _logger.debug('Register test application.') _logger.debug('Collector host is %r.', _settings.host) _logger.debug('Collector port is %r.', _settings.port) _logger.debug('Proxy scheme is %r.', _settings.proxy_scheme) _logger.debug('Proxy host is %r.', _settings.proxy_host) _logger.debug('Proxy port is %r.', _settings.proxy_port) _logger.debug('Proxy user is %r.', _settings.proxy_user) _logger.debug('License key is %r.', _settings.license_key) _timeout = 30.0 _start = time.time() _application = register_application(timeout=_timeout) _end = time.time() _duration = _end - _start if not _application.active: _logger.error( 'Unable to register application for test, ' 'connection could not be established within %s seconds.', _timeout) return if hasattr(_application.settings, 'messages'): for message in _application.settings.messages: if message['message'].startswith('Reporting to:'): parts = message['message'].split('Reporting to:') url = parts[1].strip() print('Registration successful. Reporting to:') print() print(' %s' % url) print() break _logger.debug('Registration took %s seconds.', _duration) _logger.debug('Run the validation test.') _run_validation_test()
def record_deploy(args): import sys if len(args) < 2: usage("record-deploy") sys.exit(1) def _args(config_file, description, revision="Unknown", changelog=None, user=None, *args): return config_file, description, revision, changelog, user config_file, description, revision, changelog, user = _args(*args) settings = global_settings() settings.monitor_mode = False initialize(config_file) host = settings.host if host == "collector.newrelic.com": host = "api.newrelic.com" elif host.startswith("collector.eu"): host = "api.eu.newrelic.com" elif host == "staging-collector.newrelic.com": host = "staging-api.newrelic.com" port = settings.port server = port and "%s:%d" % (host, port) or host app_id = fetch_app_id(settings.app_name, server=server) if app_id is None: raise RuntimeError( "The application named %r was not found in your account. Please " "try running the newrelic-admin server-config command to force " "the application to register with New Relic." % settings.app_name) url = "https://{}/v2/applications/{}/deployments.json".format( server, app_id) if user is None: user = pwd.getpwuid(os.getuid()).pw_gecos deployment = {} deployment["revision"] = revision if description: deployment["description"] = description if changelog: deployment["changelog"] = changelog if user: deployment["user"] = user data = {"deployment": deployment} r = requests.post(url, json=data, **api_request_kwargs()) if r.status_code != 201: raise RuntimeError( "An unexpected HTTP response of %r was received " "for request made to %r. The payload for the request was %r. " "The response payload for the request was %r. If this issue " "persists then please report this problem to New Relic " "support for further investigation." % (r.status_code, url, data, r.json()))
def local_config(args): import sys if len(args) < 2: usage('record-deploy') sys.exit(1) def _args(config_file, description, revision=None, changelog=None, user=None, *args): return config_file, description, revision, changelog, user config_file, description, revision, changelog, user = _args(*args) settings = global_settings() settings.monitor_mode = False initialize(config_file) app_name = settings.app_name api_key = settings.api_key or 'NO API KEY WAS SET IN AGENT CONFIGURATION' host = settings.host if host == 'collector.newrelic.com': host = 'api.newrelic.com' elif host == 'staging-collector.newrelic.com': host = 'staging-api.newrelic.com' port = settings.port url = '%s://%s/deployments.xml' scheme = 'https' server = port and '%s:%d' % (host, port) or host url = url % (scheme, server) proxy_scheme = settings.proxy_scheme proxy_host = settings.proxy_host proxy_port = settings.proxy_port proxy_user = settings.proxy_user proxy_pass = settings.proxy_pass if proxy_scheme is None: proxy_scheme = 'https' timeout = settings.agent_limits.data_collector_timeout proxies = proxy_details(proxy_scheme, proxy_host, proxy_port, proxy_user, proxy_pass) if user is None: user = pwd.getpwuid(os.getuid()).pw_gecos data = {} data['deployment[app_name]'] = app_name if description is not None: data['deployment[description]'] = description if revision is not None: data['deployment[revision]'] = revision if changelog is not None: data['deployment[changelog]'] = changelog if user is not None: data['deployment[user]'] = user headers = {} headers['X-API-Key'] = api_key headers['Host'] = host cert_loc = settings.ca_bundle_path if cert_loc is None: cert_loc = certs.where() if settings.debug.disable_certificate_validation: cert_loc = False r = requests.post(url, proxies=proxies, headers=headers, timeout=timeout, data=data, verify=cert_loc) if r.status_code != 201: raise RuntimeError( 'An unexpected HTTP response of %r was received ' 'for request made to %r. The API key for the request was ' '%r. The payload for the request was %r. If this issue ' 'persists then please report this problem to New Relic ' 'support for further investigation.' % (r.status_code, url, api_key, data))
def local_config(args): import sys if len(args) < 2: usage("record-deploy") sys.exit(1) def _args(app_id, config_file, revision, description=None, changelog=None, user=None, timestamp=None, *args): return ( app_id, config_file, revision, description, changelog, user, timestamp, ) app_id, config_file, revision, description, changelog, user, timestamp = _args( *args) settings = global_settings() settings.monitor_mode = False initialize(config_file) api_key = settings.api_key or "NO API KEY WAS SET IN AGENT CONFIGURATION" host = settings.host if host == "collector.newrelic.com": host = "api.newrelic.com" elif host.startswith("collector.eu"): host = "api.eu.newrelic.com" elif host == "staging-collector.newrelic.com": host = "staging-api.newrelic.com" port = settings.port url = "%s://%s/v2/applications/%s/deployments.json" scheme = "https" server = port and "%s:%d" % (host, port) or host url = url % (scheme, server, app_id) proxy_scheme = settings.proxy_scheme proxy_host = settings.proxy_host proxy_port = settings.proxy_port proxy_user = settings.proxy_user proxy_pass = settings.proxy_pass if proxy_scheme is None: proxy_scheme = "https" timeout = settings.agent_limits.data_collector_timeout proxies = proxy_details(proxy_scheme, proxy_host, proxy_port, proxy_user, proxy_pass) if user is None: user = pwd.getpwuid(os.getuid()).pw_gecos data = {} data["deployment"] = {} data["deployment"]["revision"] = revision if description is not None: data["deployment"]["description"] = description if changelog is not None: data["deployment"]["changelog"] = changelog if user is not None: data["deployment"]["user"] = user if timestamp is not None: data["deployment"]["timestamp"] = timestamp headers = {} headers["X-Api-Key"] = api_key headers["Content-Type"] = "application/json" cert_loc = settings.ca_bundle_path if cert_loc is None: cert_loc = certs.where() if settings.debug.disable_certificate_validation: cert_loc = False data = json.dumps(data) r = requests.post( url, proxies=proxies, headers=headers, timeout=timeout, data=data, verify=cert_loc, ) if r.status_code != 201: raise RuntimeError( "An unexpected HTTP response of %r was received " "for request made to %r. The API key for the request was " "%r. The payload for the request was %r. The response " "payload for the request was %r. If this issue " "persists then please report this problem to New Relic " "support for further investigation." % (r.status_code, url, api_key, data, r.json()))