Files
Ayay/SHH.CameraSdk/Core/Telemetry/GlobalTelemetry.cs

66 lines
2.6 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.
namespace SHH.CameraSdk;
/// <summary>
/// 全局遥测仓储(静态类)
/// 功能:存储并提供帧生命周期的追踪日志查询,采用环形缓冲区机制限制日志数量
/// 用途:用于问题排查、性能分析,记录每帧的处理流程、耗时、丢弃原因等信息
/// </summary>
public static class GlobalTelemetry
{
#region --- (Static Storage Resources) ---
/// <summary>
/// 环形日志缓冲区:存储帧追踪上下文(线程安全)
/// Key帧序列号FrameSequenceValue帧全链路追踪上下文
/// </summary>
private static readonly ConcurrentDictionary<long, FrameContext> _logs = new();
/// <summary>
/// 日志序列号队列:用于维护环形缓冲区的淘汰顺序(线程安全)
/// 作用:记录帧日志的插入顺序,超过最大数量时淘汰最早的记录
/// </summary>
private static readonly ConcurrentQueue<long> _keys = new();
/// <summary>
/// 最大日志保留数量:限制环形缓冲区仅保留最近 200 条帧追踪记录
/// 目的:防止日志过多导致内存占用飙升
/// </summary>
private const int MaxLogCount = 200;
#endregion
#region --- (Core Operation Methods) ---
/// <summary>
/// 记录帧追踪日志
/// 功能:将帧上下文存入缓冲区,超过最大数量时自动淘汰最早的记录
/// </summary>
/// <param name="frameSeq">帧序列号(唯一标识某一帧)</param>
/// <param name="context">帧全链路追踪上下文(含处理日志、耗时、丢弃原因等)</param>
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 _);
}
}
/// <summary>
/// 获取最近的帧追踪日志
/// 功能:按时间戳降序返回缓冲区中的所有记录(最新记录在前)
/// </summary>
/// <returns>帧追踪上下文集合(最多 MaxLogCount 条)</returns>
public static IEnumerable<FrameContext> GetRecentLogs()
{
// 按帧上下文的时间戳降序排序,确保最新记录优先返回
return _logs.Values.OrderByDescending(x => x.Timestamp);
}
#endregion
}