def _run_one(self, job_class, config, force=False): _debug = self.config.logger.debug seconds = convert_frequency(config.frequency) time_ = config.time if not force: if not self.time_to_run(job_class, time_): _debug("skipping %r because it's not time to run", job_class) return ok, dependency_error = self.check_dependencies(job_class) if not ok: _debug("skipping %r dependencies aren't met [%s]", job_class, dependency_error) return _debug('about to run %r', job_class) app_name = job_class.app_name info = self.job_state_database.get(app_name) last_success = None now = utc_now() log_run = True try: t0 = time.time() for last_success in self._run_job(job_class, config, info): t1 = time.time() _debug('successfully ran %r on %s', job_class, last_success) self._remember_success(job_class, last_success, t1 - t0) # _run_job() returns a generator, so we don't know how # many times this will loop. Anyway, we need to reset the # 't0' for the next loop if there is one. t0 = time.time() exc_type = exc_value = exc_tb = None except (OngoingJobError, RowLevelLockError): # It's not an actual runtime error. It just basically means # you can't start crontabber right now. log_run = False raise except Exception: t1 = time.time() exc_type, exc_value, exc_tb = sys.exc_info() if self.config.sentry and self.config.sentry.dsn: client = raven_client.get_client(self.config.sentry.dsn) identifier = client.get_ident(client.captureException()) self.config.logger.info( 'Error captured in Sentry. Reference: %s' % identifier) _debug('error when running %r on %s', job_class, last_success, exc_info=True) self._remember_failure(job_class, t1 - t0, exc_type, exc_value, exc_tb) finally: if log_run: self._log_run(job_class, seconds, time_, last_success, now, exc_type, exc_value, exc_tb)
def _run_one(self, job_class, config, force=False): _debug = self.config.logger.debug seconds = convert_frequency(config.frequency) time_ = config.time if not force: if not self.time_to_run(job_class, time_): _debug("skipping %r because it's not time to run", job_class) return ok, dependency_error = self.check_dependencies(job_class) if not ok: _debug( "skipping %r dependencies aren't met [%s]", job_class, dependency_error ) return _debug('about to run %r', job_class) app_name = job_class.app_name info = self.database.get(app_name) last_success = None now = utc_now() try: for last_success in self._run_job(job_class, config, info): _debug('successfully ran %r on %s', job_class, last_success) self._remember_success(job_class, last_success) exc_type = exc_value = exc_tb = None except: exc_type, exc_value, exc_tb = sys.exc_info() # when debugging tests that mock logging, uncomment this otherwise # the exc_info=True doesn't compute and record what the exception # was #raise if self.config.sentry and self.config.sentry.dsn: try: client = raven.Client(dsn=self.config.sentry.dsn) identifier = client.get_ident(client.captureException()) self.config.logger.info( 'Error captured in Sentry. Reference: %s' % identifier ) except Exception: # Blank exceptions like this is evil but a failure to send # the exception to Sentry is much less important than for # crontabber to carry on. This is especially true # considering that raven depends on network I/O. _debug('Failed to capture and send error to Sentry', exc_info=True) _debug('error when running %r on %s', job_class, last_success, exc_info=True) self._remember_failure(job_class, exc_type, exc_value, exc_tb) finally: self._log_run(job_class, seconds, time_, last_success, now, exc_type, exc_value, exc_tb)
def _run_one(self, job_class, config, force=False): _debug = self.config.logger.debug seconds = convert_frequency(config.frequency) time_ = config.time if not force: if not self.time_to_run(job_class, time_): _debug("skipping %r because it's not time to run", job_class) return ok, dependency_error = self.check_dependencies(job_class) if not ok: _debug("skipping %r dependencies aren't met [%s]", job_class, dependency_error) return _debug('about to run %r', job_class) app_name = job_class.app_name info = self.database.get(app_name) last_success = None now = utc_now() try: for last_success in self._run_job(job_class, config, info): _debug('successfully ran %r on %s', job_class, last_success) self._remember_success(job_class, last_success) exc_type = exc_value = exc_tb = None except: exc_type, exc_value, exc_tb = sys.exc_info() # when debugging tests that mock logging, uncomment this otherwise # the exc_info=True doesn't compute and record what the exception # was #raise if self.config.sentry and self.config.sentry.dsn: try: client = raven.Client(dsn=self.config.sentry.dsn) identifier = client.get_ident(client.captureException()) self.config.logger.info( 'Error captured in Sentry. Reference: %s' % identifier) except Exception: # Blank exceptions like this is evil but a failure to send # the exception to Sentry is much less important than for # crontabber to carry on. This is especially true # considering that raven depends on network I/O. _debug('Failed to capture and send error to Sentry', exc_info=True) _debug('error when running %r on %s', job_class, last_success, exc_info=True) self._remember_failure(job_class, exc_type, exc_value, exc_tb) finally: self._log_run(job_class, seconds, time_, last_success, now, exc_type, exc_value, exc_tb)
def _configtest_one(self, config): try: seconds = convert_frequency(config.frequency) time_ = config.time if time_: check_time(time_) # if less than 1 day, it doesn't make sense to specify hour if seconds < 60 * 60 * 24: raise FrequencyDefinitionError(config.time) return True except (JobNotFoundError, JobDescriptionError, FrequencyDefinitionError, TimeDefinitionError): config.logger.critical('Failed to config test a job', exc_info=True) return False
def _configtest_one(self, config): try: seconds = convert_frequency(config.frequency) time_ = config.time if time_: check_time(time_) # if less than 1 day, it doesn't make sense to specify hour if seconds < 60 * 60 * 24: raise FrequencyDefinitionError(config.time) return True except (JobNotFoundError, JobDescriptionError, FrequencyDefinitionError, TimeDefinitionError): exc_type, exc_value, exc_tb = sys.exc_info() print >> sys.stderr, "Error type:", exc_type print >> sys.stderr, "Error value:", exc_value print >> sys.stderr, ''.join(traceback.format_tb(exc_tb)) return False
def _configtest_one(self, config): try: seconds = convert_frequency(config.frequency) time_ = config.time if time_: check_time(time_) # if less than 1 day, it doesn't make sense to specify hour if seconds < 60 * 60 * 24: raise FrequencyDefinitionError(config.time) return True except (JobNotFoundError, JobDescriptionError, FrequencyDefinitionError, TimeDefinitionError): exc_type, exc_value, exc_tb = sys.exc_info() print >>sys.stderr, "Error type:", exc_type print >>sys.stderr, "Error value:", exc_value print >>sys.stderr, ''.join(traceback.format_tb(exc_tb)) return False
def _run_one(self, job_class, config, force=False): _debug = self.config.logger.debug seconds = convert_frequency(config.frequency) time_ = config.time if not force: if not self.time_to_run(job_class, time_): _debug("skipping %r because it's not time to run", job_class) return ok, dependency_error = self.check_dependencies(job_class) if not ok: _debug( "skipping %r dependencies aren't met [%s]", job_class, dependency_error ) return _debug('about to run %r', job_class) app_name = job_class.app_name info = self.database.get(app_name) last_success = None now = utc_now() try: for last_success in self._run_job(job_class, config, info): _debug('successfully ran %r on %s', job_class, last_success) exc_type = exc_value = exc_tb = None except: exc_type, exc_value, exc_tb = sys.exc_info() # when debugging tests that mock logging, uncomment this otherwise # the exc_info=True doesn't compute and record what the exception # was #raise _debug('error when running %r on %s', job_class, last_success, exc_info=True) finally: self._log_run(job_class, seconds, time_, last_success, now, exc_type, exc_value, exc_tb)
def _run_one(self, job_class, config, force=False): _debug = self.config.logger.debug seconds = convert_frequency(config.frequency) time_ = config.time if not force: if not self.time_to_run(job_class, time_): _debug("skipping %r because it's not time to run", job_class) return ok, dependency_error = self.check_dependencies(job_class) if not ok: _debug("skipping %r dependencies aren't met [%s]", job_class, dependency_error) return _debug('about to run %r', job_class) app_name = job_class.app_name info = self.database.get(app_name) last_success = None now = utc_now() try: for last_success in self._run_job(job_class, config, info): _debug('successfully ran %r on %s', job_class, last_success) exc_type = exc_value = exc_tb = None except: exc_type, exc_value, exc_tb = sys.exc_info() # when debugging tests that mock logging, uncomment this otherwise # the exc_info=True doesn't compute and record what the exception # was #raise _debug('error when running %r on %s', job_class, last_success, exc_info=True) finally: self._log_run(job_class, seconds, time_, last_success, now, exc_type, exc_value, exc_tb)
def _run_one(self, job_class, config, force=False): seconds = convert_frequency(config.frequency) time_ = config.time if not force: if not self.time_to_run(job_class, time_): self.logger.debug("skipping %r because it's not time to run", job_class) return self.logger.debug('about to run %r', job_class) app_name = job_class.app_name info = self.job_state_database.get(app_name) last_success = None now = utc_now() log_run = True exc_type = exc_value = exc_tb = None try: t0 = time.time() for last_success in self._run_job(job_class, config, info): t1 = time.time() self.logger.debug('successfully ran %r on %s', job_class, last_success) self._remember_success(job_class, last_success, t1 - t0) # _run_job() returns a generator, so we don't know how # many times this will loop. Anyway, we need to reset the # 't0' for the next loop if there is one. t0 = time.time() except (OngoingJobError, RowLevelLockError): # It's not an actual runtime error. It just basically means # you can't start crontabber right now. log_run = False raise except Exception: t1 = time.time() exc_type, exc_value, exc_tb = sys.exc_info() if self.config.sentry and self.config.sentry.dsn: client = raven_client.get_client(self.config.sentry.dsn) identifier = client.get_ident(client.captureException()) self.logger.info('Error captured in Sentry. Reference: %s' % identifier) self.logger.debug( 'error when running %r on %s', job_class, last_success, exc_info=True ) self._remember_failure( job_class, t1 - t0, exc_type, exc_value, exc_tb ) finally: if log_run: self._log_run( job_class, seconds, time_, last_success, now, exc_type, exc_value, exc_tb )