#include "tx_timestamp_debug.h" tx_timestamp_debug_logger_t *tx_timestamp_debug_open_jsonl(const char *path) { tx_timestamp_debug_logger_t *logger; FILE *file; if (path == NULL || path[0] == '\0') { return NULL; } if (omni_ensure_parent_dir(path) != 0) { return NULL; } file = fopen(path, "ab"); if (file == NULL) { return NULL; } logger = (tx_timestamp_debug_logger_t *) calloc(1, sizeof(*logger)); if (logger == NULL) { fclose(file); return NULL; } omni_file_logger_init(&logger->file_logger, file); logger->enabled = 1; return logger; } void tx_timestamp_debug_close(tx_timestamp_debug_logger_t *logger) { if (logger == NULL) { return; } if (logger->file_logger.file != NULL) { fclose(logger->file_logger.file); } omni_file_logger_destroy(&logger->file_logger); free(logger); } int tx_timestamp_debug_log(tx_timestamp_debug_logger_t *logger, const tx_timestamp_debug_record_t *record) { char *line; char *node_role; char *node_id; char *from; char *to; char *file_name; char *phase; char *event_name; if (logger == NULL || record == NULL || !logger->enabled) { return 0; } node_role = omni_json_escape(record->node_role); node_id = omni_json_escape(record->node_id); from = omni_json_escape(record->from); to = omni_json_escape(record->to); file_name = omni_json_escape(record->file_name); phase = omni_json_escape(record->phase); event_name = omni_json_escape(record->event_name); if (node_role == NULL || node_id == NULL || from == NULL || to == NULL || file_name == NULL || phase == NULL || event_name == NULL) { free(node_role); free(node_id); free(from); free(to); free(file_name); free(phase); free(event_name); return -1; } line = omni_strdup_printf( "{\"record_type\":\"%s\",\"node_role\":\"%s\",\"node_id\":\"%s\",\"message_type\":\"%s\",\"message_id\":%" PRIu64 ",\"from\":\"%s\",\"to\":\"%s\",\"file_name\":\"%s\",\"body_size\":%d,\"phase\":\"%s\",\"send_call_index\":%d,\"frame_offset_start\":%d,\"frame_offset_end\":%d,\"bytes_written\":%d,\"expected_tx_id\":%u,\"read_index\":%d,\"event_name\":\"%s\",\"ts_unix_nano\":%" PRId64 ",\"ee_info\":%u,\"ee_data\":%u,\"matched_send_call_index\":%d,\"selected_for_latency\":%d}", record->record_type, node_role, node_id, protocol_message_type_name(record->message_type), record->message_id, from, to, file_name, record->body_size, phase, record->send_call_index, record->frame_offset_start, record->frame_offset_end, record->bytes_written, record->expected_tx_id, record->read_index, event_name, record->ts_unix_nano, record->ee_info, record->ee_data, record->matched_send_call_index, record->selected_for_latency ); free(node_role); free(node_id); free(from); free(to); free(file_name); free(phase); free(event_name); if (line == NULL) { return -1; } if (omni_file_logger_write_line(&logger->file_logger, line) != 0) { free(line); return -1; } free(line); return 0; }