Esempio n. 1
0
def run_gunicorn():
    config = get_config()

    # configure prometheus_client early as possible
    if pkg_is_installed('prometheus-client'):
        # Early throw-away parsing of gunicorn config, as we need to decide
        # whether to enable prometheus multiprocess before we start importing
        from gunicorn.app.wsgiapp import WSGIApplication
        g_cfg = WSGIApplication().cfg
        if g_cfg.workers > 1 or 'prometheus_multiproc_dir' in os.environ:
            from talisker.prometheus import setup_prometheus_multiproc
            async_workers = ('gevent', 'eventlet')
            # must be done before prometheus_client is imported *anywhere*
            setup_prometheus_multiproc(
                any(n in g_cfg.worker_class_str for n in async_workers)
            )

    initialise()

    import talisker.gunicorn

    if pkg_is_installed('celery'):
        import talisker.celery
        talisker.celery.enable_signals()

    app = talisker.gunicorn.TaliskerApplication(
        "%(prog)s [OPTIONS] [APP_MODULE]", config.devel, config.debuglog)
    clear_contexts()
    return app.run()
Esempio n. 2
0
def test_setup_prometheus_multiproc_error(clean_globals, monkeypatch, context):
    """EACCES creating the multiprocess.Lock() should log a warning."""
    def fail(*args, **kwargs):
        raise OSError(13, "Permission denied")

    monkeypatch.setattr("talisker.prometheus.Lock", fail)

    prometheus.setup_prometheus_multiproc(async_mode=False)

    context.assert_log(
        level='warning',
        msg='Unable to create lock for prometheus, cleanup disabled',
    )
Esempio n. 3
0
    def test_app():
        from talisker import prometheus
        prometheus.setup_prometheus_multiproc(async_mode=False)
        prometheus._lock.acquire()

        def app(environ, start_response):
            try:
                with prometheus.try_prometheus_lock(0.5):
                    result = b'no timeout'
            except prometheus.PrometheusLockTimeout:
                result = b'timeout'

            start_response('200 OK', [('content-type', 'text/plain')])
            return [result]
Esempio n. 4
0
    def test_app():
        from talisker import prometheus
        prometheus.setup_prometheus_multiproc(async_mode=False)
        prometheus._lock.acquire()

        def app(environ, start_response):
            try:
                with prometheus.try_prometheus_lock(0.5):
                    result = b'no timeout'
            except prometheus.PrometheusLockTimeout:
                result = b'timeout'

            start_response('200 OK', [('content-type', 'text/plain')])
            return [result]
Esempio n. 5
0
def run_gunicorn():
    config = get_config()

    # Early throw-away parsing of gunicorn config, as we need to decide
    # whether to enable prometheus multiprocess before we start importing
    from gunicorn.app.wsgiapp import WSGIApplication
    g_cfg = WSGIApplication().cfg

    # configure prometheus_client early as possible
    if pkg_is_installed('prometheus-client'):
        if g_cfg.workers > 1 or 'prometheus_multiproc_dir' in os.environ:
            from talisker.prometheus import setup_prometheus_multiproc
            async_workers = ('gevent', 'eventlet')
            # must be done before prometheus_client is imported *anywhere*
            setup_prometheus_multiproc(
                any(n in g_cfg.worker_class_str for n in async_workers))
    try:
        from gunicorn.workers.ggevent import GeventWorker
        from talisker.context import enable_gevent_context
    except Exception:
        pass
    else:
        if g_cfg.worker_class == GeventWorker:
            enable_gevent_context()

    try:
        from gunicorn.workers.geventlet import EventletWorker
        from talisker.context import enable_eventlet_context
    except Exception:
        pass
    else:
        if g_cfg.worker_class == EventletWorker:
            enable_eventlet_context()

    initialise()

    import talisker.gunicorn

    if pkg_is_installed('celery'):
        import talisker.celery
        talisker.celery.enable_signals()

    app = talisker.gunicorn.TaliskerApplication(
        "%(prog)s [OPTIONS] [APP_MODULE]", config.devel, config.debuglog)
    clear_context()
    return app.run()
Esempio n. 6
0
def test_setup_prometheus_multiproc(clean_globals, context):
    assert talisker.prometheus_multiproc_cleanup is False
    assert (prometheus.try_prometheus_lock is
            prometheus.try_prometheus_lock_noop)

    prometheus.setup_prometheus_multiproc(async_mode=False)

    assert talisker.prometheus_multiproc_cleanup
    assert (prometheus.try_prometheus_lock is
            prometheus.try_prometheus_lock_normal)
    log = context.logs.find(
        level='info',
        msg='prometheus_client is in multiprocess mode',
        extra={'cleanup_enabled': True},
    )
    assert log is not None
    assert 'multiproc_dir' in log.extra
Esempio n. 7
0
import pytest

# do this as early as possible, to set up logging in pytest
import talisker.logs
import talisker.util

# set up default talisker tests with actual formatting
talisker.logs.configure_test_logging(logging.FileHandler('/dev/null'))
talisker.util.flush_early_logs()
talisker.logs.supress_noisy_logs()

# make sure prometheus is setup in multiprocess mode. We don't actually use
# this dir in tests, as each test gets it's own directory, but this ensures
# prometheus_client is imported in multiprocess mode
from talisker.prometheus import setup_prometheus_multiproc
setup_prometheus_multiproc(async_mode=False)

import talisker.context
import talisker.config
import talisker.logs
import talisker.util
import talisker.celery
import talisker.sentry
import talisker.testing

# set up test test sentry client
talisker.sentry.configure_testing(talisker.testing.TEST_SENTRY_DSN)

# create the sentry client up front
if talisker.sentry.enabled:
    talisker.sentry.get_client()
Esempio n. 8
0
def test_setup_prometheus_multiproc_async(clean_globals, context):
    prometheus.setup_prometheus_multiproc(async_mode=True)

    assert (prometheus.try_prometheus_lock is
            prometheus.try_prometheus_lock_patched_async)
Esempio n. 9
0
from wsgiref.util import setup_testing_defaults

import pytest

# do this as early as possible, to set up logging in pytest
import talisker.logs
# set up default talisker tests with actual formatting
talisker.logs.configure_test_logging(logging.FileHandler('/dev/null'))
talisker._flush_early_logs()
talisker.logs.supress_noisy_logs()

# make sure prometheus is setup in multiprocess mode. We don't actually use
# this dir in tests, as each test gets it's own directory, but this ensures
# prometheus_client is imported in multiprocess mode
from talisker.prometheus import setup_prometheus_multiproc
setup_prometheus_multiproc(async_mode=False)

import talisker.config
import talisker.context
import talisker.logs
import talisker.util
import talisker.celery
import talisker.sentry
import talisker.testing

# set up test test sentry client
talisker.sentry.configure_testing(talisker.testing.TEST_SENTRY_DSN)

# create the sentry client up front
if talisker.sentry.enabled:
    talisker.sentry.get_client()