modules/python/terraform/extract_terraform_operation_metadata.py (77 lines of code) (raw):

import re import json import sys import os import datetime # Regex to extract: full module path and time PATTERN = re.compile(r"(module\.[^:]+): (?:Creation|Destruction) complete after (\d+h\d+m\d+s|\d+h\d+s|\d+m\d+s|\d+s)") def time_to_seconds(time_str): try: time_parts = re.findall(r'(\d+)([hms])', time_str) time_in_seconds = 0 for value, unit in time_parts: if unit == 'h': time_in_seconds += int(value) * 3600 elif unit == 'm': time_in_seconds += int(value) * 60 elif unit == 's': time_in_seconds += int(value) return time_in_seconds except (ValueError, AttributeError) as e: print(f"Failed to convert time '{time_str}' to seconds: {e}") return 0 def parse_module_path(full_path): path = full_path.replace("module.", "") parts = path.split(".") module_name = parts[0] if parts else "" resource_name = parts[-1] if len(parts) > 1 else "" submodule_path = ".".join(parts[1:-1]) if len(parts) > 2 else "" return module_name, submodule_path, resource_name def process_terraform_logs(log_path, _command_type, _scenario_type, _scenario_name): log_file = os.path.join(log_path, f"terraform_{_command_type}.log") run_id = os.getenv("RUN_ID", "") results = [] if not os.path.isfile(log_file): print(f"[WARNING] Log file not found: {log_file}") return results try: with open(log_file, "r", encoding='utf-8') as f: for line in f: match = PATTERN.search(line) if match: full_path, time_str = match.groups() seconds = time_to_seconds(time_str) module, submodule, resource = parse_module_path(full_path) results.append({ "timestamp": datetime.datetime.now().isoformat(), "run_id": run_id, "scenario_type": _scenario_type, "scenario_name": _scenario_name, "module_name": module, "submodule_name": submodule, "resource_name": resource, "action": _command_type, "time_taken_seconds": seconds }) except Exception as e: print(f"[ERROR] Failed to process log file '{log_file}': {e}") return results if __name__ == "__main__": if len(sys.argv) != 5: print("Usage: python3 extract_terraform_operation_time.py <log_directory> <result_output_file>") sys.exit(1) log_dir = sys.argv[1] result_file = sys.argv[2] scenario_type = sys.argv[3] scenario_name = sys.argv[4] try: apply_result = process_terraform_logs(log_dir, "apply", scenario_type, scenario_name) destroy_result = process_terraform_logs(log_dir, "destroy", scenario_type, scenario_name) merged_result = apply_result + destroy_result os.makedirs(os.path.dirname(result_file), exist_ok=True) with open(result_file, 'w', encoding='utf-8') as file: for result in merged_result: print(json.dumps(result) + "\n") file.write(json.dumps(result) + "\n") except Exception as e: print(f"[ERROR] Unexpected error: {e}") sys.exit(1)