Files
OmniSocket/include/logger.h
nnbcccscdscdsc 4b95d26f13 feat:扩展了结构化日志输出
- 补充了传输层观测指标
  - 增加了 UDP 丢包相关统计
  - README 也同步更新了字段口径
2026-03-17 20:53:43 +08:00

169 lines
7.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 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;
#define OMNI_LOGGER_UDP_RANGES_SIZE 512u
#define OMNI_LOGGER_UDP_SEQ_SAMPLE_SIZE 512u
#define OMNI_LOGGER_UDP_WINDOW_DIST_SIZE 512u
/* 通过该结构体收集全局统计信息 */
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 累计重传的数据字节 */
uint64_t udp_expected_chunks; /* UDP 文件接收侧预期分片数 */
uint64_t udp_received_chunks; /* UDP 文件接收侧实际收到的分片数 */
uint64_t udp_lost_chunks; /* UDP 文件接收侧推断丢失的分片数 */
uint64_t udp_loss_burst_count; /* UDP 丢包区间数量 */
uint64_t udp_loss_burst_max_len; /* UDP 最大连续丢包长度 */
double udp_loss_rate_pct; /* UDP 丢包率(百分比) */
char udp_loss_ranges[OMNI_LOGGER_UDP_RANGES_SIZE]; /* UDP 丢包区间摘要 */
char udp_loss_seq_sample[OMNI_LOGGER_UDP_SEQ_SAMPLE_SIZE]; /* UDP 丢包序号样本 */
char udp_recv_window_dist[OMNI_LOGGER_UDP_WINDOW_DIST_SIZE]; /* UDP 接收窗口分布 */
/* 延迟/耗时统计(单位:毫秒) */
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);
void logger_reset_transfer_observability(void);
void logger_on_udp_loss_summary(uint64_t expected_chunks,
uint64_t received_chunks,
uint64_t lost_chunks,
uint64_t burst_count,
uint64_t burst_max_len,
const char *ranges,
const char *seq_sample,
const char *recv_window_dist);
/* 计算当前吞吐量(返回:字节/秒) */
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 */