コード例 #1
0
 def error(self):
     """
     Returns a FacebookRequestError (located in the exceptions module) with
     an appropriate debug message.
     """
     if self.is_failure():
         return FacebookRequestError("Call was not successful", self._call,
                                     self.status(), self.headers(),
                                     self.body())
     else:
         return None
コード例 #2
0
 def error(self):
     """
     Returns a FacebookRequestError (located in the exceptions module) with
     an appropriate debug message.
     """
     if self.is_failure():
         return FacebookRequestError(
             "Call was not successful.\n" +
             "Request:\n\t%s\n" % self._call + "Response given:\n" +
             "\tHTTP Status: %s\n\tHeaders: %s\n\tBody: %s\n" % (
                 self.status(),
                 self.headers(),
                 self.body(),
             ))
     else:
         return None
コード例 #3
0
    def async_daily_call(self, data_date):
        """
            Tries to pull data from facebook server, if there's an api related error, retries 
            until a successful read, or stop after 5 attempts.
            :param data_date: specifies the date of data that we are pulling in YYYY-MM-DD format
            :return: the same date if succeed, None otherwise
        """
        self.__init__()

        logger = logging.getLogger('test_log')
        logger.setLevel(logging.DEBUG)
        handler = logging.FileHandler(filename=self.log_local_dir)
        f = logging.Formatter(
            fmt='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
            datefmt='%Y-%m-%d %I:%M:%S %p')
        handler.setFormatter(fmt=f)
        logger.addHandler(handler)

        snapshot_date = datetime.date.today()
        local_file_dir = self.report_local_dir + 'snapshot_date={0}\\'.format(
            snapshot_date)
        filename = local_file_dir + data_date + '.json.gz'

        self.params['time_range'] = {'since': data_date, 'until': data_date}

        report_start = time.time()
        # print 'start generating report for {0}'.format(data_date)
        logger.debug('start pulling data for {0} with pid: {1}'.format(
            data_date, os.getpid()))

        initial_pause = 2
        for retry_attempt in range(1, 6):
            try:
                # print 'attempt {0} for date {1}'.format(retry_attempt, data_date)
                logger.debug('attempt {0} for date {1}'.format(
                    retry_attempt, data_date))
                self.get_report(self.fields, self.params, filename)
                # create a .done file
                donefile = local_file_dir + data_date + '.done'
                open(donefile, 'w').close()
                break
            except FacebookRequestError as er:
                if retry_attempt == 5:
                    # print 'Failed 5 times. report for {0} failed...'.format(data_date)
                    logger.debug(FacebookRequestError.body(er))
                    logger.debug(
                        'Process for {0} terminating after 5 failed runs'.
                        format(data_date))
                    return None
                else:
                    # print 'Failing due to an API error: {0}'.format(FacebookRequestError.body(er))
                    # print 'Retrying... attempt {0}, time into {1}'.format(retry_attempt + 1, time.time() - report_start)
                    logger.debug('Failing due to an API error: {0}'.format(
                        FacebookRequestError.body(er)))
                    logger.debug(
                        'Retrying... attempt {0}, time into {1}'.format(
                            retry_attempt + 1,
                            time.time() - report_start))
                    time.sleep(initial_pause**retry_attempt)

        # log finish of a report
        # print 'report date: {0} done'.format(data_date)
        logger.debug('report date: {0} done'.format(data_date))

        return data_date