def init_app(self, app, **defaults):
        self.app = app
        if not self.client:
            self.client = make_client(self.client_cls, app, **defaults)

        # 0 is a valid log level (NOTSET), so we need to check explicitly for it
        if self.logging or self.logging is 0:
            if self.logging is not True:
                kwargs = {"level": self.logging}
            else:
                kwargs = {}
            setup_logging(LoggingHandler(self.client, **kwargs))

        signals.got_request_exception.connect(self.handle_exception,
                                              sender=app,
                                              weak=False)

        try:
            from elasticapm.contrib.celery import register_exception_tracking

            register_exception_tracking(self.client)
        except ImportError:
            pass

        # Instrument to get spans
        if self.client.config.instrument:
            elasticapm.instrumentation.control.instrument()

            signals.request_started.connect(self.request_started, sender=app)
            signals.request_finished.connect(self.request_finished, sender=app)
            try:
                from elasticapm.contrib.celery import register_instrumentation

                register_instrumentation(self.client)
            except ImportError:
                pass
        else:
            logger.debug(
                "Skipping instrumentation. INSTRUMENT is set to False.")

        @app.context_processor
        def rum_tracing():
            """
            Adds APM related IDs to the context used for correlating the backend transaction with the RUM transaction
            """
            transaction = get_transaction()
            if transaction and transaction.trace_parent:
                return {
                    "apm": {
                        "trace_id":
                        transaction.trace_parent.trace_id,
                        "span_id":
                        lambda: transaction.ensure_parent_id(),
                        "is_sampled":
                        transaction.is_sampled,
                        "is_sampled_js":
                        "true" if transaction.is_sampled else "false",
                    }
                }
            return {}
Exemple #2
0
    def init_app(self, app, **defaults):
        self.app = app
        if not self.client:
            self.client = make_client(self.client_cls, app, **defaults)

        if self.logging:
            setup_logging(LoggingHandler(self.client))

        signals.got_request_exception.connect(self.handle_exception,
                                              sender=app,
                                              weak=False)

        try:
            from elasticapm.contrib.celery import register_exception_tracking
            register_exception_tracking(self.client)
        except ImportError:
            pass

        # Instrument to get spans
        if self.client.config.instrument:
            elasticapm.instrumentation.control.instrument()

            signals.request_started.connect(self.request_started, sender=app)
            signals.request_finished.connect(self.request_finished, sender=app)
            try:
                from elasticapm.contrib.celery import register_instrumentation
                register_instrumentation(self.client)
            except ImportError:
                pass
        else:
            logger.debug(
                "Skipping instrumentation. INSTRUMENT is set to False.")
Exemple #3
0
def test_basic_already_configured():
    with mock.patch("logging.getLogger", spec=logging.getLogger) as getLogger:
        handler = mock.Mock()
        logger = getLogger()
        logger.handlers = [handler]
        result = setup_logging(handler)
        assert not result
Exemple #4
0
def test_basic_not_configured():
    with mock.patch("logging.getLogger", spec=logging.getLogger) as getLogger:
        logger = getLogger()
        logger.handlers = []
        handler = mock.Mock()
        result = setup_logging(handler)
        assert result
Exemple #5
0
 def test_basic_already_configured(self):
     with mock.patch('logging.getLogger',
                     spec=logging.getLogger) as getLogger:
         handler = mock.Mock()
         logger = getLogger()
         logger.handlers = [handler]
         result = setup_logging(handler)
         self.assertFalse(result)
Exemple #6
0
 def test_basic_not_configured(self):
     with mock.patch('logging.getLogger',
                     spec=logging.getLogger) as getLogger:
         logger = getLogger()
         logger.handlers = []
         handler = mock.Mock()
         result = setup_logging(handler)
         self.assertTrue(result)
Exemple #7
0
    def __init__(self,
                 media_type=DEFAULT_MEDIA_TYPE,
                 request_type=Request,
                 response_type=Response,
                 middleware=None,
                 router=None,
                 independent_middleware=False):
        self.apm_client = get_client()
        if self.apm_client:
            logging_level = getattr(settings, 'API_LOG_LEVEL', 'DEBUG')
            setup_logging(LoggingHandler(self.apm_client, level=logging_level))

            if self.apm_client.config.instrument:
                elasticapm.instrumentation.control.instrument()
                middleware.insert(0,
                                  middlewares.TraceMiddleware(self.apm_client))

        super().__init__(media_type=media_type,
                         request_type=request_type,
                         response_type=response_type,
                         middleware=middleware,
                         router=router,
                         independent_middleware=independent_middleware)
    def init_app(self, app):
        self.app = app
        if not self.client:
            self.client = make_client(
                self.client_cls,
                app,
                self.app_name,
                self.secret_token,
            )

        if self.logging:
            setup_logging(LoggingHandler(self.client))

        signals.got_request_exception.connect(self.handle_exception,
                                              sender=app,
                                              weak=False)

        try:
            from elasticapm.contrib.celery import register_exception_tracking
            register_exception_tracking(self.client)
        except ImportError:
            pass

        # Instrument to get traces
        skip_env_var = 'SKIP_INSTRUMENT'
        if skip_env_var in os.environ:
            logger.debug("Skipping instrumentation. %s is set.", skip_env_var)
        else:
            elasticapm.instrumentation.control.instrument()

            signals.request_started.connect(self.request_started, sender=app)
            signals.request_finished.connect(self.request_finished, sender=app)
            try:
                from elasticapm.contrib.celery import register_instrumentation
                register_instrumentation(self.client)
            except ImportError:
                pass