def test_get_or_create(self): message = 'abcd' id = '12335' error = create_error({'id': id}, message=message, attempts=2) error.save() get = PillowError.get_or_create({'id': id}, FakePillow()) self.assertEqual(get.total_attempts, 2) self.assertEqual(get.current_attempt, 2) self.assertTrue(message in error.error_traceback) new = PillowError.get_or_create({'id': id}, FakePillow1()) self.assertIsNone(new.id) self.assertEqual(new.current_attempt, 0)
def test_get_or_create(self): message = 'abcd' id = '12335' error = create_error(_change(id=id), message=message, attempts=2) error.save() get = PillowError.get_or_create(_change(id=id), FakePillow()) self.assertEqual(get.total_attempts, 2) self.assertEqual(get.current_attempt, 2) self.assertTrue(message in error.error_traceback) another_pillow = make_fake_constructed_pillow('FakePillow1', '') new = PillowError.get_or_create(_change(id=id), another_pillow) self.assertIsNone(new.id) self.assertEqual(new.current_attempt, 0)
def create_error(change, message='message', attempts=0, pillow=None, ex_class=None): change = force_to_change(change) change.metadata = ChangeMeta(data_source_type='couch', data_source_name='test_commcarehq', document_id=change.id) error = PillowError.get_or_create(change, pillow or FakePillow()) for n in range(0, attempts): error.add_attempt(*get_ex_tb(message, ex_class=ex_class)) return error
def handle_pillow_error(pillow, change, exception): from pillow_retry.models import PillowError error_id = None e = None # always retry document missing errors, because the error is likely with couch if pillow.retry_errors or isinstance(exception, DocumentMissingError): try: error = PillowError.get_or_create(change, pillow) except (DatabaseError, InterfaceError) as e: error_id = 'PillowError.get_or_create failed' else: error.add_attempt(exception, sys.exc_info()[2]) error.save() error_id = error.id pillow_logging.exception( u"[%s] Error on change: %s, %s. Logged as: %s" % ( pillow.get_name(), change['id'], exception, error_id ) ) if e: raise e
def create_error(change, message='message', attempts=0, pillow=None, ex_class=None): change.metadata = ChangeMeta( data_source_type='couch', data_source_name='test_commcarehq', document_id=change.id ) error = PillowError.get_or_create(change, pillow or FakePillow()) for n in range(0, attempts): error.add_attempt(*get_ex_tb(message, ex_class=ex_class)) return error
def create_error(change, message='message', attempts=0, pillow=None, ex_class=None): error = PillowError.get_or_create(change, pillow or FakePillow()) for n in range(0, attempts): error.add_attempt(*get_ex_tb(message, ex_class=ex_class)) return error
def test_null_meta_date(self): id = '12335' meta = { 'domains': ['a' * 247, '123456789'], 'doc_type': 'something', 'date': None, } get = PillowError.get_or_create({'id': id}, FakePillow(), meta) self.assertEqual(None, get.doc_date)
def test_empty_metadata(self): change = _change(id='123') error = PillowError.get_or_create(change, GetDocPillow()) error.save() process_pillow_retry(error) error = PillowError.objects.get(pk=error.id) self.assertEquals(error.total_attempts, 1)
def test_null_meta_date(self): id = '12335' meta = { 'domains': ['a' * 247, '123456789'], 'doc_type': 'something', 'date': None, } get = PillowError.get_or_create({'id': id}, FakePillow(), meta) self.assertEqual(None, get.doc_date)
def handle_pillow_error(pillow, change, exception): from pillow_retry.models import PillowError error_id = None if pillow.retry_errors: error = PillowError.get_or_create(change, pillow) error.add_attempt(exception, sys.exc_info()[2]) error.save() error_id = error.id pillow_logging.exception( "[%s] Error on change: %s, %s. Logged as: %s" % (pillow.get_name(), change['id'], exception, error_id))
def test_get_or_create_meta(self): id = '12335' date = '2013-12-05T08:52:19Z' meta = { 'domains': ['a' * 247, '123456789'], 'doc_type': 'something', 'date': date, } get = PillowError.get_or_create({'id': id}, FakePillow(), meta) self.assertEqual(get.domains, 'a' * 247 + ',1234...') self.assertEqual(get.doc_type, 'something') self.assertEqual(get.doc_date, parse(date)) get.save()
def test_get_or_create_meta(self): id = '12335' date = '2013-12-05T08:52:19Z' meta = { 'domains': ['a' * 247, '123456789'], 'doc_type': 'something', 'date': date, } get = PillowError.get_or_create({'id': id}, FakePillow(), meta) self.assertEqual(get.domains, 'a' * 247 + ',1234...') self.assertEqual(get.doc_type, 'something') self.assertEqual(get.doc_date, parse(date)) get.save()
def handle_pillow_error(pillow, change, exception): from couchdbkit import ResourceNotFound from pillow_retry.models import PillowError meta = None if hasattr(pillow, 'get_couch_db'): try: meta = pillow.get_couch_db().show('domain_shows/domain_date', change['id']) except ResourceNotFound: pass error = PillowError.get_or_create(change, pillow, change_meta=meta) error.add_attempt(exception, sys.exc_info()[2]) error.save() pillow_logging.exception( "[%s] Error on change: %s, %s. Logged as: %s" % (pillow.get_name(), change['id'], exception, error.id))
def handle_pillow_error(pillow, change, exception): from pillow_retry.models import PillowError error_id = None if pillow.retry_errors: error = PillowError.get_or_create(change, pillow) error.add_attempt(exception, sys.exc_info()[2]) error.save() error_id = error.id pillow_logging.exception( "[%s] Error on change: %s, %s. Logged as: %s" % ( pillow.get_name(), change['id'], exception, error_id ) )
def _handle_pillow_error(self, change, exception): try: # This breaks the module boundary by using a show function defined in commcare-hq # but it was decided that it wasn't worth the effort to maintain the separation. meta = self.get_couch_db().show('domain/domain_date', change['id']) except ResourceNotFound: # Show function does not exist meta = None error = PillowError.get_or_create(change, self, change_meta=meta) error.add_attempt(exception, sys.exc_info()[2]) error.save() pillow_logging.exception( "[%s] Error on change: %s, %s. Logged as: %s" % ( self.get_name(), change['id'], exception, error.id ) )
def handle_pillow_error(pillow, change, exception): from pillow_retry.models import PillowError pillow_logging.exception("[%s] Error on change: %s, %s" % ( pillow.get_name(), change['id'], exception, )) datadog_counter('commcare.change_feed.changes.exceptions', tags=[ 'pillow_name:{}'.format(pillow.get_name()), ]) # keep track of error attempt count change.increment_attempt_count() # always retry document missing errors, because the error is likely with couch if pillow.retry_errors or isinstance(exception, DocumentMissingError): error = PillowError.get_or_create(change, pillow) error.add_attempt(exception, sys.exc_info()[2], change.metadata) error.save()
def handle_pillow_error(pillow, change, exception): from couchdbkit import ResourceNotFound from pillow_retry.models import PillowError meta = None if hasattr(pillow, 'get_couch_db'): try: meta = pillow.get_couch_db().show('domain_shows/domain_date', change['id']) except ResourceNotFound: pass error = PillowError.get_or_create(change, pillow, change_meta=meta) error.add_attempt(exception, sys.exc_info()[2]) error.save() pillow_logging.exception( "[%s] Error on change: %s, %s. Logged as: %s" % ( pillow.get_name(), change['id'], exception, error.id ) )
def handle_pillow_error(pillow, change, exception): from pillow_retry.models import PillowError pillow_logging.exception("[%s] Error on change: %s, %s" % ( pillow.get_name(), change['id'], exception, )) datadog_counter('commcare.change_feed.changes.exceptions', tags=[ 'pillow_name:{}'.format(pillow.get_name()), ]) # keep track of error attempt count change.increment_attempt_count() # always retry document missing errors, because the error is likely with couch if pillow.retry_errors or isinstance(exception, DocumentMissingError): error = PillowError.get_or_create(change, pillow) error.add_attempt(exception, sys.exc_info()[2], change.metadata) error.save()
def process_change(self, pillow_instance, change): self.bootstrap_if_needed() if change.deleted: # we don't currently support hard-deletions at all. # we may want to change this at some later date but seem ok for now. # see https://github.com/dimagi/commcare-hq/pull/6944 for rationale return domain = change.metadata.domain if not domain: # if no domain we won't save to any UCR table return async_tables = [] doc = change.get_document() ensure_document_exists(change) ensure_matched_revisions(change) if doc is None: return for table in self.table_adapters_by_domain[domain]: if table.config.filter(doc): if table.run_asynchronous: async_tables.append(table.config._id) else: self._save_doc_to_table(table, doc) elif table.config.deleted_filter(doc): table.delete(doc) if async_tables: future_time = datetime.utcnow() + timedelta(days=1) error = PillowError.get_or_create(change, pillow_instance) error.date_next_attempt = future_time error.save() save_document.delay(async_tables, doc, pillow_instance.pillow_id)
def create_error(change, message='message', attempts=0, pillow=None, ex_class=None): error = PillowError.get_or_create(change, pillow or FakePillow()) for n in range(0, attempts): error.add_attempt(*get_ex_tb(message, ex_class=ex_class)) return error