Exemple #1
0
    def run(self):
        signal.signal(signal.SIGINT, signal_handler)
        started_at = time.time()

        logger.debug("Executing query:\n%s", self.query)
        self._log_progress('executing_query')

        query_runner = self.data_source.query_runner
        annotated_query = self._annotate_query(query_runner)

        try:
            data, error = query_runner.run_query(annotated_query, self.user)
        except Exception as e:
            if isinstance(e, SoftTimeLimitExceeded):
                error = TIMEOUT_MESSAGE
            else:
                error = text_type(e)

            data = None
            logging.warning('Unexpected error while running query:',
                            exc_info=1)

        run_time = time.time() - started_at

        logger.info(
            u"task=execute_query query_hash=%s data_length=%s error=[%s]",
            self.query_hash, data and len(data), error)

        _unlock(self.query_hash, self.data_source.id)

        if error is not None and data is None:
            result = QueryExecutionError(error)
            if self.scheduled_query is not None:
                self.scheduled_query = models.db.session.merge(
                    self.scheduled_query, load=False)
                self.scheduled_query.schedule_failures += 1
                models.db.session.add(self.scheduled_query)
                notify_of_failure(error, self.scheduled_query)
            models.db.session.commit()
            raise result
        else:
            if (self.scheduled_query
                    and self.scheduled_query.schedule_failures > 0):
                self.scheduled_query = models.db.session.merge(
                    self.scheduled_query, load=False)
                self.scheduled_query.schedule_failures = 0
                models.db.session.add(self.scheduled_query)
            query_result, updated_query_ids = models.QueryResult.store_result(
                self.data_source.org_id, self.data_source, self.query_hash,
                self.query, data, run_time, utcnow())
            models.db.session.commit(
            )  # make sure that alert sees the latest query result
            self._log_progress('checking_alerts')
            for query_id in updated_query_ids:
                check_alerts_for_query.delay(query_id)
            self._log_progress('finished')

            result = query_result.id
            models.db.session.commit()
            return result
Exemple #2
0
def track_failure(query, error):
    logging.debug(error)

    query.schedule_failures += 1
    models.db.session.add(query)
    models.db.session.commit()

    notify_of_failure(error, query)
Exemple #3
0
    def notify(self, message="Oh no, I failed!", query=None, **kwargs):
        if query is None:
            query = self.factory.create_query(**kwargs)

        notify_of_failure(message, query)
        return key(query.user.id)