diff --git a/app_config.py b/app_config.py index 583551c..25a92e2 100755 --- a/app_config.py +++ b/app_config.py @@ -1,6 +1,6 @@ import os -APP_VERSION="2.2" +APP_VERSION="2.3" SCRIPT_PATH = os.path.dirname(__file__) CONFIGS_DIR = SCRIPT_PATH + "/configs" CONFIG_FILE_NAME = CONFIGS_DIR + "/config.json" diff --git a/metrics/DataStructures.py b/metrics/DataStructures.py index cefff8f..30eeaab 100755 --- a/metrics/DataStructures.py +++ b/metrics/DataStructures.py @@ -122,13 +122,16 @@ class HealthData(AbstractData): self.e_state.labels(name=name, url=url, method=method, server=self.instance_prefix) self.set_data(is_up) - def set_data(self, is_up): + def set_data(self, is_up, working_time = None): time_ms = get_time_millis() self.is_up = is_up self.e_state.labels(name=self.name, url=self.url, method=self.method, server=self.instance_prefix).state(ENUM_UP_DN_STATES[0] if is_up else ENUM_UP_DN_STATES[1]) - self.set_collect_time(get_time_millis() - time_ms) self.set_update_time() self.print_trigger_info() + if working_time: + self.set_collect_time(working_time) + else: + self.set_collect_time(get_time_millis() - time_ms) class RestValueData(AbstractData): @@ -153,7 +156,7 @@ class RestValueData(AbstractData): self.g_value.labels(name=name, url=url, method=method, server=self.instance_prefix) self.set_data(value) - def set_data(self, value): + def set_data(self, value, working_time = None): time_ms = get_time_millis() self.value = value try: @@ -161,9 +164,12 @@ class RestValueData(AbstractData): except: self.g_value.labels(name=self.name, url=self.url, method=self.method, server=self.instance_prefix).set(0) - self.set_collect_time(get_time_millis() - time_ms) self.set_update_time() self.print_trigger_info() + if working_time: + self.set_collect_time(working_time) + else: + self.set_collect_time(get_time_millis() - time_ms) class ShellValueData(AbstractData): @@ -181,7 +187,7 @@ class ShellValueData(AbstractData): self.g_value.labels(name=name, command=command, server=self.instance_prefix) self.set_data(value) - def set_data(self, value): + def set_data(self, value, working_time = None): time_ms = get_time_millis() self.value = value try: @@ -189,9 +195,12 @@ class ShellValueData(AbstractData): except: self.g_value.labels(name=self.name, command=self.command, server=self.instance_prefix).set(0) - self.set_collect_time(get_time_millis() - time_ms) self.set_update_time() self.print_trigger_info() + if working_time: + self.set_collect_time(working_time) + else: + self.set_collect_time(get_time_millis() - time_ms) class IcmpData(AbstractData): @@ -207,13 +216,16 @@ class IcmpData(AbstractData): self.e_state.labels(name=name, ip=ip, server=self.instance_prefix) self.set_data(is_up) - def set_data(self, is_up): + def set_data(self, is_up, working_time = None): time_ms = get_time_millis() self.is_up = is_up self.e_state.labels(name=self.name, ip=self.ip, server=self.instance_prefix).state(ENUM_UP_DN_STATES[0] if is_up else ENUM_UP_DN_STATES[1]) - self.set_collect_time(get_time_millis() - time_ms) self.set_update_time() self.print_trigger_info() + if working_time: + self.set_collect_time(working_time) + else: + self.set_collect_time(get_time_millis() - time_ms) class InterfaceData(AbstractData): diff --git a/metrics/MetricClasses.py b/metrics/MetricClasses.py index f18e3c0..85ad87c 100755 --- a/metrics/MetricClasses.py +++ b/metrics/MetricClasses.py @@ -36,6 +36,7 @@ class AbstractMetric: def is_health_check(url, timeout, method, user, pwd, headers, callback=None): + time_ms = get_time_millis() session = requests.Session() if user and pwd: session.auth = (user, pwd) @@ -48,13 +49,15 @@ def is_health_check(url, timeout, method, user, pwd, headers, callback=None): ) result = response.status_code == 200 if callback is not None: - callback(result) + working_time = get_time_millis() - time_ms + callback(result, working_time) else: return result except (requests.ConnectTimeout, requests.exceptions.ConnectionError) as e: return False def get_rest_value(url, timeout, method, user, pwd, headers, callback=None, result_type='single', path=''): + time_ms = get_time_millis() session = requests.Session() if user and pwd: session.auth = (user, pwd) @@ -70,7 +73,8 @@ def get_rest_value(url, timeout, method, user, pwd, headers, callback=None, resu if not result.isalnum(): result = 0 if callback is not None: - callback(result) + working_time = get_time_millis() - time_ms + callback(result, working_time) else: return result except (requests.ConnectTimeout, requests.exceptions.ConnectionError) as e: @@ -98,6 +102,7 @@ def parse_response(resp, path): return '' def get_shell_value(command, args, callback=None): + time_ms = get_time_millis() cmd = [command, ' '.join(str(s) for s in args)] try: output = subprocess.check_output(cmd) @@ -109,11 +114,13 @@ def get_shell_value(command, args, callback=None): result = 0 if callback is not None: - callback(result) + working_time = get_time_millis() - time_ms + callback(result, working_time) else: return result def is_ping(ip, count, callback=None): + time_ms = get_time_millis() param = '-n' if platform.system().lower() == 'windows' else '-c' command = ['ping', param, str(count), ip] try: @@ -123,8 +130,10 @@ def is_ping(ip, count, callback=None): 'time out'.upper() not in str(output).upper()) except: result = False + if callback is not None: - callback(result) + working_time = get_time_millis() - time_ms + callback(result, working_time) else: return result @@ -134,6 +143,8 @@ def get_net_iface_stat(name): def get_next_update_time(d): return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(d.updated_at + d.interval)) +def get_time_millis(): + return round(time.time() * 1000) class DiskMetric(AbstractMetric): def __init__(self, config):