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