140 lines
5.6 KiB
C
140 lines
5.6 KiB
C
/*
|
||
* logger.h
|
||
* 日志与性能统计接口
|
||
*/
|
||
|
||
#ifndef OMNISOCKET_LOGGER_H
|
||
#define OMNISOCKET_LOGGER_H
|
||
|
||
#include <stddef.h>
|
||
#include <stdint.h>
|
||
|
||
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);
|
||
|
||
/* 记录一次发送/接收 */
|
||
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 */
|