diagnostics.mojo (2361B)
1 from std.ffi import c_int, external_call 2 from std.os import getenv, makedirs 3 from std.pathlib import Path 4 5 from hyf_runtime.paths import RuntimePaths 6 from hyf_runtime.startup import resolve_startup_context_from_process 7 8 9 comptime _HYF_DIAGNOSTICS_DIR_ENV = "HYF_DIAGNOSTICS_DIR" 10 comptime _HYF_DIAGNOSTICS_FILE_PREFIX = "hyf-internal-error-pid-" 11 comptime _HYF_DIAGNOSTICS_FILE_SUFFIX = ".log" 12 comptime _HYF_DIAGNOSTICS_DIR_MODE = 0o700 13 comptime _HYF_DIAGNOSTICS_FILE_MODE = 0o600 14 15 16 def hyf_diagnostics_dir_debug_override_env_name() -> String: 17 return _HYF_DIAGNOSTICS_DIR_ENV 18 19 20 def _current_process_id() -> Int: 21 return Int(external_call["getpid", c_int]()) 22 23 24 def _ensure_directory_mode(path: Path): 25 var path_str = path.__fspath__() 26 _ = external_call["chmod", c_int]( 27 path_str.as_c_string_slice().unsafe_ptr(), 28 c_int(_HYF_DIAGNOSTICS_DIR_MODE), 29 ) 30 31 32 def _ensure_file_mode(handle: Int): 33 _ = external_call["fchmod", c_int]( 34 c_int(handle), c_int(_HYF_DIAGNOSTICS_FILE_MODE) 35 ) 36 37 38 def diagnostics_debug_override_dir_from_env() -> String: 39 return getenv(_HYF_DIAGNOSTICS_DIR_ENV, "") 40 41 42 def diagnostics_dir_for_runtime_paths(paths: RuntimePaths) -> String: 43 return String(paths.diagnostics_dir) 44 45 46 def effective_diagnostics_dir_for_runtime_paths(paths: RuntimePaths) -> String: 47 var configured = diagnostics_debug_override_dir_from_env() 48 if configured != "": 49 return configured 50 return diagnostics_dir_for_runtime_paths(paths) 51 52 53 def effective_diagnostics_dir_from_process_startup() raises -> String: 54 var startup_context = resolve_startup_context_from_process() 55 return effective_diagnostics_dir_for_runtime_paths(startup_context.paths) 56 57 58 def _diagnostic_log_path(diagnostics_dir: String) raises -> Path: 59 var dir_path = Path(diagnostics_dir) 60 makedirs(dir_path, mode=_HYF_DIAGNOSTICS_DIR_MODE, exist_ok=True) 61 _ensure_directory_mode(dir_path) 62 return dir_path / ( 63 _HYF_DIAGNOSTICS_FILE_PREFIX 64 + String(_current_process_id()) 65 + _HYF_DIAGNOSTICS_FILE_SUFFIX 66 ) 67 68 69 def append_internal_diagnostic(line: String, diagnostics_dir: String): 70 try: 71 var log_path = _diagnostic_log_path(diagnostics_dir) 72 with open(log_path, "a") as log_file: 73 _ensure_file_mode(log_file.handle) 74 log_file.write(line) 75 except: 76 pass