#pragma once #include #include #include #include #include /// Call this function on crash. void collectCrashLog(Int32 signal, UInt64 thread_id, const String & query_id, const StackTrace & stack_trace); namespace DB { /** Information about fatal errors that lead to crash. * Before crash we are writing info into system table for further analysis. */ struct CrashLogElement { time_t event_time{}; UInt64 timestamp_ns{}; Int32 signal{}; UInt64 thread_id{}; String query_id; Array trace; Array trace_full; static std::string name() { return "CrashLog"; } static ColumnsDescription getColumnsDescription(); static NamesAndAliases getNamesAndAliases() { return {}; } void appendToBlock(MutableColumns & columns) const; }; class CrashLog : public SystemLog { using SystemLog::SystemLog; friend void ::collectCrashLog(Int32, UInt64, const String &, const StackTrace &); static std::weak_ptr crash_log; public: static void initialize(std::shared_ptr crash_log_) { crash_log = crash_log_; } static consteval size_t getDefaultMaxSize() { return 1024; } static consteval size_t getDefaultReservedSize() { return 1024; } static consteval size_t getDefaultFlushIntervalMilliseconds() { return 1000; } static consteval size_t shouldNotifyFlushOnCrash() { return true; } }; }