Add connection duration and reconnect count to status page
- Track reconnection count in metrics tracker - Display connection duration under Stream Statistics - Display reconnect count since app startup - Update both JSON API and HTML status page
This commit is contained in:
parent
3a9ec98d5c
commit
9043cf9bc0
@ -15,6 +15,7 @@ type Tracker struct {
|
||||
registry metrics.Registry
|
||||
connectedSince time.Time
|
||||
isConnected atomic.Bool
|
||||
reconnectCount atomic.Uint64
|
||||
|
||||
// Stream metrics (decompressed data)
|
||||
messageCounter metrics.Counter
|
||||
@ -50,13 +51,22 @@ func New() *Tracker {
|
||||
|
||||
// SetConnected updates the connection status
|
||||
func (t *Tracker) SetConnected(connected bool) {
|
||||
t.isConnected.Store(connected)
|
||||
wasConnected := t.isConnected.Swap(connected)
|
||||
if connected {
|
||||
t.mu.Lock()
|
||||
t.connectedSince = time.Now()
|
||||
t.mu.Unlock()
|
||||
// Increment reconnect count (but not for the initial connection)
|
||||
if wasConnected || t.reconnectCount.Load() > 0 {
|
||||
t.reconnectCount.Add(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// GetReconnectCount returns the number of reconnections since startup
|
||||
func (t *Tracker) GetReconnectCount() uint64 {
|
||||
return t.reconnectCount.Load()
|
||||
}
|
||||
|
||||
// IsConnected returns the current connection status
|
||||
func (t *Tracker) IsConnected() bool {
|
||||
@ -110,6 +120,7 @@ func (t *Tracker) GetStreamMetrics() StreamMetrics {
|
||||
MessagesPerSec: t.messageRate.Rate1(),
|
||||
BitsPerSec: t.byteRate.Rate1() * bitsPerByte,
|
||||
WireBitsPerSec: t.wireByteRate.Rate1() * bitsPerByte,
|
||||
ReconnectCount: t.reconnectCount.Load(),
|
||||
}
|
||||
}
|
||||
|
||||
@ -149,6 +160,8 @@ type StreamMetrics struct {
|
||||
BitsPerSec float64
|
||||
// WireBitsPerSec is the rate of bits received on the wire per second (1-minute average)
|
||||
WireBitsPerSec float64
|
||||
// ReconnectCount is the number of reconnections since startup
|
||||
ReconnectCount uint64
|
||||
}
|
||||
|
||||
// RouteMetrics contains route update statistics
|
||||
|
||||
@ -330,6 +330,8 @@ func (s *Server) handleStats() http.HandlerFunc {
|
||||
MbitsPerSec float64 `json:"mbits_per_sec"`
|
||||
WireMbitsPerSec float64 `json:"wire_mbits_per_sec"`
|
||||
Connected bool `json:"connected"`
|
||||
ConnectionDuration string `json:"connection_duration"`
|
||||
ReconnectCount uint64 `json:"reconnect_count"`
|
||||
GoVersion string `json:"go_version"`
|
||||
Goroutines int `json:"goroutines"`
|
||||
MemoryUsage string `json:"memory_usage"`
|
||||
@ -442,6 +444,12 @@ func (s *Server) handleStats() http.HandlerFunc {
|
||||
whoisStats = s.getWHOISStats(ctx)
|
||||
}
|
||||
|
||||
// Calculate connection duration
|
||||
connectionDuration := "disconnected"
|
||||
if metrics.Connected && !metrics.ConnectedSince.IsZero() {
|
||||
connectionDuration = time.Since(metrics.ConnectedSince).Truncate(time.Second).String()
|
||||
}
|
||||
|
||||
stats := StatsResponse{
|
||||
Uptime: uptime,
|
||||
TotalMessages: metrics.TotalMessages,
|
||||
@ -451,6 +459,8 @@ func (s *Server) handleStats() http.HandlerFunc {
|
||||
MbitsPerSec: metrics.BitsPerSec / bitsPerMegabit,
|
||||
WireMbitsPerSec: metrics.WireBitsPerSec / bitsPerMegabit,
|
||||
Connected: metrics.Connected,
|
||||
ConnectionDuration: connectionDuration,
|
||||
ReconnectCount: metrics.ReconnectCount,
|
||||
GoVersion: runtime.Version(),
|
||||
Goroutines: runtime.NumGoroutine(),
|
||||
MemoryUsage: humanize.Bytes(memStats.Alloc),
|
||||
|
||||
@ -104,6 +104,14 @@
|
||||
|
||||
<div class="status-card">
|
||||
<h2>Stream Statistics</h2>
|
||||
<div class="metric">
|
||||
<span class="metric-label">Connection Duration</span>
|
||||
<span class="metric-value" id="connection_duration">-</span>
|
||||
</div>
|
||||
<div class="metric">
|
||||
<span class="metric-label">Reconnections</span>
|
||||
<span class="metric-value" id="reconnect_count">-</span>
|
||||
</div>
|
||||
<div class="metric">
|
||||
<span class="metric-label">Total Messages</span>
|
||||
<span class="metric-value" id="total_messages">-</span>
|
||||
@ -334,6 +342,8 @@
|
||||
document.getElementById('go_version').textContent = '-';
|
||||
document.getElementById('goroutines').textContent = '-';
|
||||
document.getElementById('memory_usage').textContent = '-';
|
||||
document.getElementById('connection_duration').textContent = '-';
|
||||
document.getElementById('reconnect_count').textContent = '-';
|
||||
document.getElementById('total_messages').textContent = '-';
|
||||
document.getElementById('messages_per_sec').textContent = '-';
|
||||
document.getElementById('total_wire_bytes').textContent = '-';
|
||||
@ -392,6 +402,8 @@
|
||||
document.getElementById('go_version').textContent = data.go_version;
|
||||
document.getElementById('goroutines').textContent = formatNumber(data.goroutines);
|
||||
document.getElementById('memory_usage').textContent = data.memory_usage;
|
||||
document.getElementById('connection_duration').textContent = data.connection_duration;
|
||||
document.getElementById('reconnect_count').textContent = formatNumber(data.reconnect_count);
|
||||
document.getElementById('total_messages').textContent = formatNumber(data.total_messages);
|
||||
document.getElementById('messages_per_sec').textContent = data.messages_per_sec.toFixed(1);
|
||||
document.getElementById('total_wire_bytes').textContent = formatBytes(data.total_wire_bytes);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user