/* * logger.h * 日志与性能统计接口 */ #ifndef OMNISOCKET_LOGGER_H #define OMNISOCKET_LOGGER_H #include #include typedef struct OmniMetricSummary { uint64_t count; double last; double min; double max; double sum; } OmniMetricSummary; /* 通过该结构体收集全局统计信息 */ typedef struct OmniStats { uint64_t start_ms; /* 起始时间(毫秒) */ uint64_t last_report_ms; /* 上一次打印日志时间 */ uint64_t window_start_ms; /* 当前吞吐统计窗口起点 */ uint64_t bytes_sent; /* 发送总字节数 */ uint64_t bytes_recv; /* 接收总字节数 */ uint64_t window_bytes_sent; /* 当前 1 秒窗口发送字节数 */ uint64_t window_bytes_recv; /* 当前 1 秒窗口接收字节数 */ uint64_t send_count; /* 调用 omni_send 次数 */ uint64_t recv_count; /* 调用 omni_recv 次数 */ uint64_t last_rtt_ms; /* 最近一次 RTT */ uint64_t min_rtt_ms; /* 最小 RTT(更接近链路基线) */ uint64_t max_rtt_ms; /* 最大 RTT */ uint64_t tcp_retrans; /* 预留:TCP 重传统计(如可从内核获取) */ uint64_t udp_retrans; /* UDP 上层重传次数 */ uint64_t kcp_retrans; /* KCP 内部重传次数(可从 ikcp 统计) */ uint64_t tcp_data_segs_out; /* TCP 累计发送的数据段数(含重传) */ uint64_t tcp_data_bytes_sent; /* TCP 累计发送的数据字节(含重传) */ uint64_t tcp_retrans_bytes; /* TCP 累计重传的数据字节 */ uint64_t kcp_data_segs_out; /* KCP 累计发送的数据分片数(含重传) */ uint64_t kcp_data_bytes_sent; /* KCP 累计发送的数据字节(含重传) */ uint64_t kcp_retrans_bytes; /* KCP 累计重传的数据字节 */ /* 延迟/耗时统计(单位:毫秒) */ double send_call_avg_ms; /* omni_send 平均耗时(EWMA) */ double recv_call_avg_ms; /* omni_recv 平均耗时(EWMA) */ double proto_send_avg_ms; /* 协议 send() 平均耗时(EWMA) */ double proto_recv_avg_ms; /* 协议 recv() 平均耗时(EWMA) */ uint64_t send_call_min_ms; uint64_t send_call_max_ms; uint64_t recv_call_min_ms; uint64_t recv_call_max_ms; uint64_t last_send_call_ms; uint64_t last_recv_call_ms; uint64_t total_work_bytes; /* 本次任务总大小(文件总大小等) */ uint64_t progress_bytes; /* 当前进度字节数 */ double tx_current_mbps; /* 最近 1 秒发送速率(Mbps) */ double rx_current_mbps; /* 最近 1 秒接收速率(Mbps) */ double tx_avg_mbps; /* 从开始到当前的平均发送速率(Mbps) */ double rx_avg_mbps; /* 从开始到当前的平均接收速率(Mbps) */ OmniMetricSummary processing_delay_ms; // 上层处理耗时(如文件读写、加解密等) OmniMetricSummary queue_delay_ms; // 排队延迟 OmniMetricSummary transmission_delay_ms; // 传输延迟 OmniMetricSummary propagation_delay_ms; // 传播延迟 OmniMetricSummary end_to_end_delay_ms; // 端到端延迟 OmniMetricSummary send_buffer_pct; // 发送缓冲区占用率 OmniMetricSummary recv_buffer_pct; // 接收缓冲区占用率 OmniMetricSummary cwnd; // 拥塞窗口大小 } OmniStats; /* 初始化统计模块,在程序启动时调用一次 */ void logger_init(void); /* 设置当前进程的日志上下文,便于 perf/jsonl 日志携带协议与节点信息。 */ void logger_set_context(const char *app, const char *proto, const char *mode, const char *role, const char *self_id); /* 记录一次发送/接收 */ void logger_on_send(size_t bytes); void logger_on_recv(size_t bytes); /* 记录一次 RTT(由上层在合适时机调用) */ void logger_on_rtt(uint64_t rtt_ms); /* 记录 TCP 传输层累计快照(通常来自 TCP_INFO)。 */ void logger_on_tcp_transport(uint64_t total_retrans, uint64_t data_segs_out, uint64_t data_bytes_sent, uint64_t retrans_bytes); /* 记录 KCP 数据分片首次发送。 */ void logger_on_kcp_tx(uint64_t segs, uint64_t bytes); /* 记录 KCP 数据分片重传。 */ void logger_on_kcp_retrans(uint64_t segs, uint64_t bytes); /* 记录一次耗时(ms) */ void logger_on_send_call_latency(uint64_t ms); void logger_on_recv_call_latency(uint64_t ms); void logger_on_proto_send_latency(uint64_t ms); void logger_on_proto_recv_latency(uint64_t ms); void logger_on_processing_latency(double ms); void logger_on_queue_delay_est(double ms); void logger_on_transmission_delay_est(double ms); void logger_on_propagation_delay_est(double ms); void logger_on_end_to_end_latency(double ms); void logger_on_send_queue_bytes(size_t bytes); void logger_on_recv_queue_bytes(size_t bytes); void logger_on_send_transmission_bytes(size_t bytes); void logger_on_recv_transmission_bytes(size_t bytes); void logger_on_buffer_status(double send_pct, double recv_pct); void logger_on_cwnd(double cwnd); /* 记录任务总量与当前进度。 */ void logger_set_transfer_total(uint64_t total_bytes); void logger_set_progress(uint64_t progress_bytes); /* 计算当前吞吐量(返回:字节/秒) */ double logger_calculate_throughput(void); /* 在 1 秒窗口到期时打印周期性性能日志。 */ void logger_maybe_print_performance_log(const char *tag); /* 强制打印一条结构化性能日志(例如最终汇总前调用) */ void logger_print_performance_log(const char *tag); /* 结构化通用日志(key=value 形式) */ void logger_log(const char *level, const char *component, const char *fmt, ...); /* 获取内部统计快照(线程不安全,仅调试用) */ OmniStats logger_get_snapshot(void); #endif /* OMNISOCKET_LOGGER_H */