From 4a615806ca3bef65e3086aa74f0dc142976714c5 Mon Sep 17 00:00:00 2001 From: vvzvlad Date: Sat, 7 Sep 2024 16:24:49 +0300 Subject: [PATCH] add logs_parser --- logs_parser.py | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 logs_parser.py diff --git a/logs_parser.py b/logs_parser.py new file mode 100644 index 0000000..8843613 --- /dev/null +++ b/logs_parser.py @@ -0,0 +1,76 @@ +import subprocess +import json +import sys +import time + +def is_json(myjson): + try: + json_object = json.loads(myjson) + except ValueError as e: + return False + return True + +def parse_logs(timeout): + start_time = time.time() + while True: + unsuccessful_attempts = 0 + current_retry = 0 + max_retry = 0 + print("Requesting Docker logs...", flush=True) + process = subprocess.Popen( + ["docker", "logs", "worker"], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True + ) + + try: + stdout, stderr = process.communicate() + if stderr: + print(f"Error: {stderr.strip()}", flush=True) + + for line in stdout.splitlines(): + #print(f"Line: {line}", flush=True) + if is_json(line): + data = json.loads(line) + + if data.get("level") == "info" or data.get("level") == "error": + print(f"{data['message']}", flush=True) + + if data.get("msg") == "Send Worker Data to chain" and data.get("message") == "Success": + print(f"Success: {data}", flush=True) + return True, f"Success after {unsuccessful_attempts} unsuccessful attempts, with current retry {current_retry} out of {max_retry}" + elif data.get("msg") == "Send Worker Data to chain" and "Failed, retrying..." in data.get("message", ""): + unsuccessful_attempts += 1 + retry_info = data["message"].split("Retry ")[1].strip("()") + current_retry, max_retry = map(int, retry_info.split("/")) + if current_retry == max_retry: + print(f"Max Retry Reached: {data}", flush=True) + return False, "Max Retry Reached" + except Exception as e: + print(f"Exception occurred: {e}", flush=True) + + print("Sleeping before next log request...", flush=True) + time.sleep(30) + + if time.time() - start_time > timeout * 60: + print(f"Timeout reached: {timeout} minutes elapsed without success.", flush=True) + return False, f"Timeout reached: {timeout} minutes elapsed without success." + + return False, "No Success" + +if __name__ == "__main__": + print("Parsing logs...") + if len(sys.argv) > 1: + timeout = eval(sys.argv[1]) + else: + timeout = 30 + result = parse_logs(timeout) + print(result[1]) + if result[0] == False: + print("Exiting 1...") + sys.exit(1) + else: + print("Exiting 0...") + sys.exit(0) +