class_docstr: Base class for all app integrations to be implemented for various services
docstr: Public method for actual gathering of logs
docstr_tok: ["Public","method","for","actual","gathering","of","logs"]
code: def gather(self):
      """Public method for actual gathering of logs"""
      # Initialize the app, saving state to 'running'
      if not self._initialize():
          return
  
      try:
          # Add a 50% buffer to the time it took to account for some unforeseen delay and to give
          # this function enough time to spawn a new invocation if there are more logs to poll
          while (
              (self._gather() * self._POLL_BUFFER_MULTIPLIER)
              + self._sleep_seconds()
          ) < self._remaining_seconds:
              LOGGER.debug(
                  "[%s] More logs to poll: %s", self, self._more_to_poll
              )
              self._config.report_remaining_seconds()
              if not self._more_to_poll:
                  break
  
              # Reset the boolean indicating that there is more data to poll. Subclasses should
              # set this to 'True' within their implementation of the '_gather_logs' function
              self._more_to_poll = not self._more_to_poll
  
          LOGGER.debug(
              "[%s] Gathered all logs possible for this execution. More logs to poll: "
              "%s",
              self,
              self._more_to_poll,
          )
  
          self._config.report_remaining_seconds()
  
          # Finalize, saving state to 'succeeded'
          self._finalize()
      finally:
          # Make sure the config is not left marked as running, which could be problematic
          if self._config and self._config.is_running:
              self._config.mark_failure()
  
imports: from abc import ABCMeta, abstractmethod, abstractproperty
  from json import JSONDecodeError
  import time
  import boto3
  from botocore.exceptions import ClientError
  import requests
  from streamalert.apps.config import AppConfig
  from streamalert.apps.batcher import Batcher
  from streamalert.shared.logger import get_logger
label_desc: Use image node_id 19 for calling the AppIntegration obj's underlying member method code with example usage: obj.gather() without return types