namespace SHH.CameraSdk;
///
/// 全局遥测仓储(静态类)
/// 功能:存储并提供帧生命周期的追踪日志查询,采用环形缓冲区机制限制日志数量
/// 用途:用于问题排查、性能分析,记录每帧的处理流程、耗时、丢弃原因等信息
///
public static class GlobalTelemetry
{
#region --- 静态存储资源 (Static Storage Resources) ---
///
/// 环形日志缓冲区:存储帧追踪上下文(线程安全)
/// Key:帧序列号(FrameSequence),Value:帧全链路追踪上下文
///
private static readonly ConcurrentDictionary _logs = new();
///
/// 日志序列号队列:用于维护环形缓冲区的淘汰顺序(线程安全)
/// 作用:记录帧日志的插入顺序,超过最大数量时淘汰最早的记录
///
private static readonly ConcurrentQueue _keys = new();
///
/// 最大日志保留数量:限制环形缓冲区仅保留最近 200 条帧追踪记录
/// 目的:防止日志过多导致内存占用飙升
///
private const int MaxLogCount = 200;
#endregion
#region --- 核心操作方法 (Core Operation Methods) ---
///
/// 记录帧追踪日志
/// 功能:将帧上下文存入缓冲区,超过最大数量时自动淘汰最早的记录
///
/// 帧序列号(唯一标识某一帧)
/// 帧全链路追踪上下文(含处理日志、耗时、丢弃原因等)
public static void RecordLog(long frameSeq, FrameContext context)
{
// 存入日志缓冲区(存在相同序列号时会覆盖,确保最新记录)
_logs[frameSeq] = context;
// 记录序列号到队列,用于后续淘汰逻辑
_keys.Enqueue(frameSeq);
// 环形缓冲区淘汰逻辑:超过最大数量时,移除最早插入的记录
if (_keys.Count > MaxLogCount && _keys.TryDequeue(out var oldKey))
{
_logs.TryRemove(oldKey, out _);
}
}
///
/// 获取最近的帧追踪日志
/// 功能:按时间戳降序返回缓冲区中的所有记录(最新记录在前)
///
/// 帧追踪上下文集合(最多 MaxLogCount 条)
public static IEnumerable GetRecentLogs()
{
// 按帧上下文的时间戳降序排序,确保最新记录优先返回
return _logs.Values.OrderByDescending(x => x.Timestamp);
}
#endregion
}