def try_with_collector()

in ambari-metrics-host-monitoring/src/main/python/core/emitter.py [0:0]


  def try_with_collector(self, collector_protocol, collector_host, collector_port, data):
    headers = {"Content-Type" : "application/json", "Accept" : "*/*"}
    connection = self.get_connection(collector_protocol, collector_host, collector_port)
    logger.debug("message to send: %s" % data)

    try:
      if self.cookie_cached[connection.host]:
        headers["Cookie"] = self.cookie_cached[connection.host]
        logger.debug("Cookie: %s" % self.cookie_cached[connection.host])
    except Exception as e:
      self.cookie_cached = {}
    pass

    retry_count = 0
    while retry_count < self.MAX_RETRY_COUNT:
      response = self.get_response_from_submission(connection, data, headers)
      if response:
        if response.status == 200:
          return True
        if response.status == 401:
          self.cookie_cached = {}
          auth_header = response.getheader('www-authenticate', None)
          if auth_header == None:
              logger.warn('www-authenticate header not found')
          else:
            self.spnego_krb_auth = SPNEGOKerberosAuth()
            if self.spnego_krb_auth.get_negotiate_value(auth_header) == '':
              response = self.spnego_krb_auth.authenticate_handshake(connection, "POST", self.AMS_METRICS_POST_URL, data, headers, self.kinit_cmd, self.klist_cmd)
              if response:
                logger.debug("response from authenticate_client: retcode = {0}, reason = {1}"
                              .format(response.status, response.reason))
                logger.debug(str(response.read()))
                if response.status == 200:
                  logger.debug("response headers: {0}".format(response.getheaders()))
                  logger.debug("cookie_cached: %s" % self.cookie_cached)
                  set_cookie_header = response.getheader('set-cookie', None)
                  if set_cookie_header and self.spnego_krb_auth:
                    set_cookie_val = self.spnego_krb_auth.get_hadoop_auth_cookie(set_cookie_header)
                    logger.debug("set_cookie: %s" % set_cookie_val)
                    if set_cookie_val:
                      self.cookie_cached[connection.host] = set_cookie_val
                  return True
      #No response or failed
      logger.warn("Retrying after {0} ...".format(self.RETRY_SLEEP_INTERVAL))
      retry_count += 1
      #Wait for the service stop event instead of sleeping blindly
      if 0 == self._stop_handler.wait(self.RETRY_SLEEP_INTERVAL):
        return True
    pass

    if retry_count >= self.MAX_RETRY_COUNT:
      self.active_collector_hosts.blacklist(collector_host)
      logger.warn("Metric collector host {0} was blacklisted.".format(collector_host))
      return False