def environment_settings():
    """Returns an array of arrays of environment settings

    """

    env = []

    # Agent information.

    import newrelic

    env.append(('Agent Version', '.'.join(map(str, newrelic.version_info))))

    if 'NEW_RELIC_ADMIN_COMMAND' in os.environ:
        env.append(('Admin Command', os.environ['NEW_RELIC_ADMIN_COMMAND']))
        del os.environ['NEW_RELIC_ADMIN_COMMAND']

    # System information.

    env.append(('Arch', platform.machine()))
    env.append(('OS', platform.system()))
    env.append(('OS version', platform.release()))
    env.append(('CPU Count', cpu_count()))

    # Python information.

    env.append(('Python Program Name', sys.argv[0]))

    env.append(('Python Executable', sys.executable))

    env.append(('Python Home', os.environ.get('PYTHONHOME', '')))
    env.append(('Python Path', os.environ.get('PYTHONPATH', '')))

    env.append(('Python Prefix', sys.prefix))
    env.append(('Python Exec Prefix', sys.exec_prefix))

    # TODO May be too sensitive and UI truncates information.

    #env.append(('Python Module Path', str(sys.path)))

    env.append(('Python Version', sys.version))
    env.append(('Python Platform', sys.platform))

    env.append(('Python Max Unicode', sys.maxunicode))

    try:
	# This may fail if using package Python and the
	# developer package for Python isn't also installed.

        import distutils.sysconfig

        # TODO The UI truncates information.

        args = distutils.sysconfig.get_config_var('CONFIG_ARGS')
        #env.append(('Python Config Args', args))

    except:
        pass

    # Extensions information.

    extensions = []

    try:
        import newrelic.core._thread_utilization
        extensions.append('newrelic.core._thread_utilization')
    except:
        pass

    try:
        import newrelic.lib.simplejson._speedups
        extensions.append('newrelic.lib.simplejson._speedups')
    except:
        pass

    env.append(('Compiled Extensions', ', '.join(extensions)))

    # Dispatcher information.

    dispatcher = []

    if not dispatcher and 'mod_wsgi' in sys.modules:
        mod_wsgi = sys.modules['mod_wsgi']
        if hasattr(mod_wsgi, 'process_group'):
            if mod_wsgi.process_group == '':
                dispatcher.append(('Dispatcher', 'Apache/mod_wsgi (embedded)'))
            else:
                dispatcher.append(('Dispatcher', 'Apache/mod_wsgi (daemon)'))
        else:
            dispatcher.append(('Dispatcher', 'Apache/mod_wsgi'))
        if hasattr(mod_wsgi, 'version'):
            dispatcher.append(('Dispatcher Version', str(mod_wsgi.version)))

    if not dispatcher and 'uwsgi' in sys.modules:
        dispatcher.append(('Dispatcher', 'uWSGI'))
        uwsgi = sys.modules['uwsgi']
        if hasattr(uwsgi, 'version'):
            dispatcher.append(('Dispatcher Version', uwsgi.version))

    if not dispatcher and 'flup.server.fcgi' in sys.modules:
        dispatcher.append(('Dispatcher', 'flup/fastcgi (threaded)'))

    if not dispatcher and 'flup.server.fcgi_fork' in sys.modules:
        dispatcher.append(('Dispatcher', 'flup/fastcgi (prefork)'))

    if not dispatcher and 'flup.server.scgi' in sys.modules:
        dispatcher.append(('Dispatcher', 'flup/scgi (threaded)'))

    if not dispatcher and 'flup.server.scgi_fork' in sys.modules:
        dispatcher.append(('Dispatcher', 'flup/scgi (prefork)'))

    if not dispatcher and 'flup.server.ajp' in sys.modules:
        dispatcher.append(('Dispatcher', 'flup/ajp (threaded)'))

    if not dispatcher and 'flup.server.ajp_fork' in sys.modules:
        dispatcher.append(('Dispatcher', 'flup/ajp (forking)'))

    if not dispatcher and 'flup.server.cgi' in sys.modules:
        dispatcher.append(('Dispatcher', 'flup/cgi'))

    if not dispatcher and 'tornado' in sys.modules:
        dispatcher.append(('Dispatcher', 'tornado'))
        tornado = sys.modules['tornado']
        if hasattr(tornado, 'version_info'):
            dispatcher.append(('Dispatcher Version',
                               str(tornado.version_info)))

    if not dispatcher and 'gunicorn' in sys.modules:
        if 'gunicorn.workers.ggevent' in sys.modules:
            dispatcher.append(('Dispatcher', 'gunicorn (gevent)'))
        elif 'gunicorn.workers.geventlet' in sys.modules:
            dispatcher.append(('Dispatcher', 'gunicorn (eventlet)'))
        else:
            dispatcher.append(('Dispatcher', 'gunicorn'))
        gunicorn = sys.modules['gunicorn']
        if hasattr(gunicorn, '__version__'):
            dispatcher.append(('Dispatcher Version', gunicorn.__version__))

    env.extend(dispatcher)

    # Module information.

    # TODO This produces too much. Can be over 1000 modules for a Django
    # application. Try restricting it to just top level modules and no
    # sub modules in packages, plus drop any builtin modules. Bit hard
    # to restrict it further because hard under virtual environments to
    # try and identify what modules may be part of the actual Python
    # installation and perhaps dropped.

    #env.append(('Plugin List', list(sys.modules.keys())))

    #env.append(('Plugin List', filter(
    #        lambda x: x.find('.') == -1, sys.modules.keys())))

    plugins = []

    for name, module in sys.modules.items():
        if name.find('.') == -1 and hasattr(module, '__file__'):
            try:
                import pkg_resources
                version = pkg_resources.get_distribution(name).version
                if version:
                    name = '%s (%s)' % (name, version)
            except:
                pass
            plugins.append(name)

    env.append(('Plugin List', plugins))

    return env
示例#2
0
def environment_settings():
    """Returns an array of arrays of environment settings

    """

    env = []

    # Agent information.

    env.append(("Agent Version", ".".join(map(str, newrelic.version_info))))

    if "NEW_RELIC_ADMIN_COMMAND" in os.environ:
        env.append(("Admin Command", os.environ["NEW_RELIC_ADMIN_COMMAND"]))
        del os.environ["NEW_RELIC_ADMIN_COMMAND"]

    # System information.

    env.append(("Arch", platform.machine()))
    env.append(("OS", platform.system()))
    env.append(("OS version", platform.release()))
    env.append(("CPU Count", cpu_count()))
    env.append(("System Memory", _get_available_memory()))

    # Python information.

    env.append(("Python Program Name", sys.argv[0]))

    env.append(("Python Executable", sys.executable))

    env.append(("Python Home", os.environ.get("PYTHONHOME", "")))
    env.append(("Python Path", os.environ.get("PYTHONPATH", "")))

    env.append(("Python Prefix", sys.prefix))
    env.append(("Python Exec Prefix", sys.exec_prefix))

    env.append(("Python Version", sys.version))
    env.append(("Python Platform", sys.platform))

    env.append(("Python Max Unicode", sys.maxunicode))

    # Extensions information.

    extensions = []

    if "newrelic.core._thread_utilization" in sys.modules:
        extensions.append("newrelic.core._thread_utilization")

    if "newrelic.lib.simplejson._speedups" in sys.modules:
        extensions.append("newrelic.lib.simplejson._speedups")

    env.append(("Compiled Extensions", ", ".join(extensions)))

    # Dispatcher information.

    dispatcher = []

    if not dispatcher and "mod_wsgi" in sys.modules:
        mod_wsgi = sys.modules["mod_wsgi"]
        if hasattr(mod_wsgi, "process_group"):
            if mod_wsgi.process_group == "":
                dispatcher.append(("Dispatcher", "Apache/mod_wsgi (embedded)"))
            else:
                dispatcher.append(("Dispatcher", "Apache/mod_wsgi (daemon)"))
        else:
            dispatcher.append(("Dispatcher", "Apache/mod_wsgi"))
        if hasattr(mod_wsgi, "version"):
            dispatcher.append(("Dispatcher Version", str(mod_wsgi.version)))

    if not dispatcher and "uwsgi" in sys.modules:
        dispatcher.append(("Dispatcher", "uWSGI"))
        uwsgi = sys.modules["uwsgi"]
        if hasattr(uwsgi, "version"):
            dispatcher.append(("Dispatcher Version", uwsgi.version))

    if not dispatcher and "flup.server.fcgi" in sys.modules:
        dispatcher.append(("Dispatcher", "flup/fastcgi (threaded)"))

    if not dispatcher and "flup.server.fcgi_fork" in sys.modules:
        dispatcher.append(("Dispatcher", "flup/fastcgi (prefork)"))

    if not dispatcher and "flup.server.scgi" in sys.modules:
        dispatcher.append(("Dispatcher", "flup/scgi (threaded)"))

    if not dispatcher and "flup.server.scgi_fork" in sys.modules:
        dispatcher.append(("Dispatcher", "flup/scgi (prefork)"))

    if not dispatcher and "flup.server.ajp" in sys.modules:
        dispatcher.append(("Dispatcher", "flup/ajp (threaded)"))

    if not dispatcher and "flup.server.ajp_fork" in sys.modules:
        dispatcher.append(("Dispatcher", "flup/ajp (forking)"))

    if not dispatcher and "flup.server.cgi" in sys.modules:
        dispatcher.append(("Dispatcher", "flup/cgi"))

    if not dispatcher and "tornado" in sys.modules:
        dispatcher.append(("Dispatcher", "tornado"))
        tornado = sys.modules["tornado"]
        if hasattr(tornado, "version_info"):
            dispatcher.append(("Dispatcher Version", str(tornado.version_info)))

    if not dispatcher and "gunicorn" in sys.modules:
        if "gunicorn.workers.ggevent" in sys.modules:
            dispatcher.append(("Dispatcher", "gunicorn (gevent)"))
        elif "gunicorn.workers.geventlet" in sys.modules:
            dispatcher.append(("Dispatcher", "gunicorn (eventlet)"))
        else:
            dispatcher.append(("Dispatcher", "gunicorn"))
        gunicorn = sys.modules["gunicorn"]
        if hasattr(gunicorn, "__version__"):
            dispatcher.append(("Dispatcher Version", gunicorn.__version__))

    env.extend(dispatcher)

    # Module information.

    plugins = []

    for name, module in sys.modules.items():
        if name.find(".") == -1 and hasattr(module, "__file__"):
            try:
                if "pkg_resources" in sys.modules:
                    version = pkg_resources.get_distribution(name).version
                    if version:
                        name = "%s (%s)" % (name, version)
            except:
                pass
            plugins.append(name)

    env.append(("Plugin List", plugins))

    return env