feat: implement jsz and live jetstream monitoring
This commit is contained in:
62
src/NATS.Server/Monitoring/JszHandler.cs
Normal file
62
src/NATS.Server/Monitoring/JszHandler.cs
Normal file
@@ -0,0 +1,62 @@
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace NATS.Server.Monitoring;
|
||||
|
||||
public sealed class JszHandler
|
||||
{
|
||||
private readonly NatsServer _server;
|
||||
private readonly NatsOptions _options;
|
||||
|
||||
public JszHandler(NatsServer server, NatsOptions options)
|
||||
{
|
||||
_server = server;
|
||||
_options = options;
|
||||
}
|
||||
|
||||
public JszResponse Build()
|
||||
{
|
||||
return new JszResponse
|
||||
{
|
||||
ServerId = _server.ServerId,
|
||||
Now = DateTime.UtcNow,
|
||||
Enabled = _server.Stats.JetStreamEnabled,
|
||||
Memory = 0,
|
||||
Storage = 0,
|
||||
Streams = _server.JetStreamStreams,
|
||||
Consumers = _server.JetStreamConsumers,
|
||||
Config = new JetStreamConfig
|
||||
{
|
||||
MaxMemory = _options.JetStream?.MaxMemoryStore ?? 0,
|
||||
MaxStorage = _options.JetStream?.MaxFileStore ?? 0,
|
||||
StoreDir = _options.JetStream?.StoreDir ?? string.Empty,
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class JszResponse
|
||||
{
|
||||
[JsonPropertyName("server_id")]
|
||||
public string ServerId { get; set; } = string.Empty;
|
||||
|
||||
[JsonPropertyName("now")]
|
||||
public DateTime Now { get; set; }
|
||||
|
||||
[JsonPropertyName("enabled")]
|
||||
public bool Enabled { get; set; }
|
||||
|
||||
[JsonPropertyName("memory")]
|
||||
public ulong Memory { get; set; }
|
||||
|
||||
[JsonPropertyName("storage")]
|
||||
public ulong Storage { get; set; }
|
||||
|
||||
[JsonPropertyName("streams")]
|
||||
public int Streams { get; set; }
|
||||
|
||||
[JsonPropertyName("consumers")]
|
||||
public int Consumers { get; set; }
|
||||
|
||||
[JsonPropertyName("config")]
|
||||
public JetStreamConfig Config { get; set; } = new();
|
||||
}
|
||||
@@ -16,6 +16,7 @@ public sealed class MonitorServer : IAsyncDisposable
|
||||
private readonly VarzHandler _varzHandler;
|
||||
private readonly ConnzHandler _connzHandler;
|
||||
private readonly SubszHandler _subszHandler;
|
||||
private readonly JszHandler _jszHandler;
|
||||
|
||||
public MonitorServer(NatsServer server, NatsOptions options, ServerStats stats, ILoggerFactory loggerFactory)
|
||||
{
|
||||
@@ -31,6 +32,7 @@ public sealed class MonitorServer : IAsyncDisposable
|
||||
_varzHandler = new VarzHandler(server, options);
|
||||
_connzHandler = new ConnzHandler(server);
|
||||
_subszHandler = new SubszHandler(server);
|
||||
_jszHandler = new JszHandler(server, options);
|
||||
|
||||
_app.MapGet(basePath + "/", () =>
|
||||
{
|
||||
@@ -100,7 +102,7 @@ public sealed class MonitorServer : IAsyncDisposable
|
||||
_app.MapGet(basePath + "/jsz", () =>
|
||||
{
|
||||
stats.HttpReqStats.AddOrUpdate("/jsz", 1, (_, v) => v + 1);
|
||||
return Results.Ok(new { });
|
||||
return Results.Ok(_jszHandler.Build());
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -422,6 +422,12 @@ public sealed class JetStreamStats
|
||||
[JsonPropertyName("ha_assets")]
|
||||
public int HaAssets { get; set; }
|
||||
|
||||
[JsonPropertyName("streams")]
|
||||
public int Streams { get; set; }
|
||||
|
||||
[JsonPropertyName("consumers")]
|
||||
public int Consumers { get; set; }
|
||||
|
||||
[JsonPropertyName("api")]
|
||||
public JetStreamApiStats Api { get; set; } = new();
|
||||
}
|
||||
|
||||
@@ -121,6 +121,22 @@ public sealed class VarzHandler : IDisposable
|
||||
Subscriptions = _server.SubList.Count,
|
||||
ConfigLoadTime = _server.StartTime,
|
||||
HttpReqStats = stats.HttpReqStats.ToDictionary(kv => kv.Key, kv => (ulong)kv.Value),
|
||||
JetStream = new JetStreamVarz
|
||||
{
|
||||
Config = new JetStreamConfig
|
||||
{
|
||||
MaxMemory = _options.JetStream?.MaxMemoryStore ?? 0,
|
||||
MaxStorage = _options.JetStream?.MaxFileStore ?? 0,
|
||||
StoreDir = _options.JetStream?.StoreDir ?? string.Empty,
|
||||
},
|
||||
Stats = new JetStreamStats
|
||||
{
|
||||
Accounts = _options.JetStream is null ? 0 : 1,
|
||||
HaAssets = _server.JetStreamStreams,
|
||||
Streams = _server.JetStreamStreams,
|
||||
Consumers = _server.JetStreamConsumers,
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
finally
|
||||
|
||||
@@ -91,6 +91,8 @@ public sealed class NatsServer : IMessageRouter, ISubListAccess, IDisposable
|
||||
public bool IsLameDuckMode => Volatile.Read(ref _lameDuck) != 0;
|
||||
public string? ClusterListen => _routeManager?.ListenEndpoint;
|
||||
public JetStreamApiRouter? JetStreamApiRouter => _jetStreamApiRouter;
|
||||
public int JetStreamStreams => _jetStreamStreamManager?.StreamNames.Count ?? 0;
|
||||
public int JetStreamConsumers => _jetStreamConsumerManager?.ConsumerCount ?? 0;
|
||||
public Action? ReOpenLogFile { get; set; }
|
||||
public IEnumerable<NatsClient> GetClients() => _clients.Values;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user