Files
OmniSocketGo/src/tx_timestamp_debug.c

109 lines
3.3 KiB
C

#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;
}