def post_metrics_to_collector(ams_metrics_post_url, metric_collector_host, metric_collector_port, metric_collector_https_enabled, metric_json, headers, ca_certs, tries=1, connect_timeout=10): for i in xrange(0, tries): try: Logger.info("Generated metrics for host %s :\n%s" % (metric_collector_host, metric_json)) Logger.info("Connecting (POST) to %s:%s%s" % (metric_collector_host, metric_collector_port, ams_metrics_post_url)) conn = network.get_http_connection( metric_collector_host, int(metric_collector_port), metric_collector_https_enabled, ca_certs, ssl_version=Script.get_force_https_protocol_value()) conn.request("POST", ams_metrics_post_url, metric_json, headers) response = conn.getresponse() Logger.info( "Http response for host %s: %s %s" % (metric_collector_host, response.status, response.reason)) except (httplib.HTTPException, socket.error) as ex: if i < tries - 1: #range/xrange returns items from start to end-1 time.sleep(connect_timeout) Logger.info( "Connection failed for host %s. Next retry in %s seconds." % (metric_collector_host, connect_timeout)) continue else: raise Fail("Metrics were not saved. Connection failed.") data = response.read() Logger.info("Http data: %s" % data) conn.close() if response.status == 200: Logger.info("Metrics were saved.") break else: Logger.info("Metrics were not saved.") if i < tries - 1: #range/xrange returns items from start to end-1 time.sleep(tries) Logger.info("Next retry in %s seconds." % (tries)) else: raise Fail( "Metrics were not saved. POST request status: %s %s \n%s" % (response.status, response.reason, data))
def service_check_for_single_host(self, metric_collector_host, params): random_value1 = random.random() headers = {"Content-type": "application/json"} ca_certs = os.path.join(params.ams_monitor_conf_dir, params.metric_truststore_ca_certs) current_time = int(time.time()) * 1000 metric_json = Template('smoketest_metrics.json.j2', hostname=params.hostname, random1=random_value1, current_time=current_time).get_content() try: post_metrics_to_collector( self.AMS_METRICS_POST_URL, metric_collector_host, params.metric_collector_port, params.metric_collector_https_enabled, metric_json, headers, ca_certs, self.AMS_CONNECT_TRIES, self.AMS_CONNECT_TIMEOUT) get_metrics_parameters = { "metricNames": "AMBARI_METRICS.SmokeTest.FakeMetric", "appId": "amssmoketestfake", "hostname": params.hostname, "startTime": current_time - 60000, "endTime": current_time + 61000, "precision": "seconds", "grouped": "false", } encoded_get_metrics_parameters = urllib.urlencode( get_metrics_parameters) Logger.info( "Connecting (GET) to %s:%s%s" % (metric_collector_host, params.metric_collector_port, self.AMS_METRICS_GET_URL % encoded_get_metrics_parameters)) for i in xrange(0, self.AMS_READ_TRIES): conn = network.get_http_connection( metric_collector_host, int(params.metric_collector_port), params.metric_collector_https_enabled, ca_certs, ssl_version=Script.get_force_https_protocol_value()) conn.request( "GET", self.AMS_METRICS_GET_URL % encoded_get_metrics_parameters) response = conn.getresponse() Logger.info( "Http response for host %s : %s %s" % (metric_collector_host, response.status, response.reason)) data = response.read() Logger.info("Http data: %s" % data) conn.close() if response.status == 200: Logger.info("Metrics were retrieved from host %s" % metric_collector_host) else: raise Fail( "Metrics were not retrieved from host %s. GET request status: %s %s \n%s" % (metric_collector_host, response.status, response.reason, data)) data_json = json.loads(data) def floats_eq(f1, f2, delta): return abs(f1 - f2) < delta values_are_present = False for metrics_data in data_json["metrics"]: if (str(current_time) in metrics_data["metrics"] and str(current_time + 1000) in metrics_data["metrics"] and floats_eq( metrics_data["metrics"][str(current_time)], random_value1, 0.0000001) and floats_eq( metrics_data["metrics"][str(current_time + 1000)], current_time, 1)): Logger.info( "Values %s and %s were found in the response from host %s." % (metric_collector_host, random_value1, current_time)) values_are_present = True break pass if not values_are_present: if i < self.AMS_READ_TRIES - 1: #range/xrange returns items from start to end-1 Logger.info( "Values weren't stored yet. Retrying in %s seconds." % (self.AMS_READ_TIMEOUT)) time.sleep(self.AMS_READ_TIMEOUT) else: raise Fail( "Values %s and %s were not found in the response." % (random_value1, current_time)) else: break pass except Fail as ex: Logger.warning( "Ambari Metrics service check failed on collector host %s. Reason : %s" % (metric_collector_host, str(ex))) raise Fail( "Ambari Metrics service check failed on collector host %s. Reason : %s" % (metric_collector_host, str(ex)))