feat: add per-client trace mode flag with dynamic parser logger
This commit is contained in:
@@ -15,6 +15,7 @@ public enum ClientFlags
|
|||||||
WriteLoopStarted = 1 << 4,
|
WriteLoopStarted = 1 << 4,
|
||||||
IsSlowConsumer = 1 << 5,
|
IsSlowConsumer = 1 << 5,
|
||||||
ConnectProcessFinished = 1 << 6,
|
ConnectProcessFinished = 1 << 6,
|
||||||
|
TraceMode = 1 << 7,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -54,6 +54,20 @@ public sealed class NatsClient : IDisposable
|
|||||||
public bool ConnectReceived => _flags.HasFlag(ClientFlags.ConnectReceived);
|
public bool ConnectReceived => _flags.HasFlag(ClientFlags.ConnectReceived);
|
||||||
public ClientClosedReason CloseReason { get; private set; }
|
public ClientClosedReason CloseReason { get; private set; }
|
||||||
|
|
||||||
|
public void SetTraceMode(bool enabled)
|
||||||
|
{
|
||||||
|
if (enabled)
|
||||||
|
{
|
||||||
|
_flags.SetFlag(ClientFlags.TraceMode);
|
||||||
|
_parser.Logger = _logger;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_flags.ClearFlag(ClientFlags.TraceMode);
|
||||||
|
_parser.Logger = _options.Trace ? _logger : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public DateTime StartTime { get; }
|
public DateTime StartTime { get; }
|
||||||
private long _lastActivityTicks;
|
private long _lastActivityTicks;
|
||||||
public DateTime LastActivity => new(Interlocked.Read(ref _lastActivityTicks), DateTimeKind.Utc);
|
public DateTime LastActivity => new(Interlocked.Read(ref _lastActivityTicks), DateTimeKind.Utc);
|
||||||
|
|||||||
@@ -36,7 +36,8 @@ public sealed class NatsParser
|
|||||||
{
|
{
|
||||||
private static readonly byte[] CrLfBytes = "\r\n"u8.ToArray();
|
private static readonly byte[] CrLfBytes = "\r\n"u8.ToArray();
|
||||||
private readonly int _maxPayload;
|
private readonly int _maxPayload;
|
||||||
private readonly ILogger? _logger;
|
private ILogger? _logger;
|
||||||
|
public ILogger? Logger { set => _logger = value; }
|
||||||
|
|
||||||
// State for split-packet payload reading
|
// State for split-packet payload reading
|
||||||
private bool _awaitingPayload;
|
private bool _awaitingPayload;
|
||||||
|
|||||||
15
tests/NATS.Server.Tests/ClientTraceModeTests.cs
Normal file
15
tests/NATS.Server.Tests/ClientTraceModeTests.cs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
namespace NATS.Server.Tests;
|
||||||
|
|
||||||
|
public class ClientTraceModeTests
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void TraceMode_flag_can_be_set_and_cleared()
|
||||||
|
{
|
||||||
|
var holder = new ClientFlagHolder();
|
||||||
|
holder.HasFlag(ClientFlags.TraceMode).ShouldBeFalse();
|
||||||
|
holder.SetFlag(ClientFlags.TraceMode);
|
||||||
|
holder.HasFlag(ClientFlags.TraceMode).ShouldBeTrue();
|
||||||
|
holder.ClearFlag(ClientFlags.TraceMode);
|
||||||
|
holder.HasFlag(ClientFlags.TraceMode).ShouldBeFalse();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user