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()
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', )
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]
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()
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
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()
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)
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()