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
|
registry metrics.Registry
|
||||||
connectedSince time.Time
|
connectedSince time.Time
|
||||||
isConnected atomic.Bool
|
isConnected atomic.Bool
|
||||||
|
reconnectCount atomic.Uint64
|
||||||
|
|
||||||
// Stream metrics (decompressed data)
|
// Stream metrics (decompressed data)
|
||||||
messageCounter metrics.Counter
|
messageCounter metrics.Counter
|
||||||
@ -50,12 +51,21 @@ func New() *Tracker {
|
|||||||
|
|
||||||
// SetConnected updates the connection status
|
// SetConnected updates the connection status
|
||||||
func (t *Tracker) SetConnected(connected bool) {
|
func (t *Tracker) SetConnected(connected bool) {
|
||||||
t.isConnected.Store(connected)
|
wasConnected := t.isConnected.Swap(connected)
|
||||||
if connected {
|
if connected {
|
||||||
t.mu.Lock()
|
t.mu.Lock()
|
||||||
t.connectedSince = time.Now()
|
t.connectedSince = time.Now()
|
||||||
t.mu.Unlock()
|
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
|
// IsConnected returns the current connection status
|
||||||
@ -110,6 +120,7 @@ func (t *Tracker) GetStreamMetrics() StreamMetrics {
|
|||||||
MessagesPerSec: t.messageRate.Rate1(),
|
MessagesPerSec: t.messageRate.Rate1(),
|
||||||
BitsPerSec: t.byteRate.Rate1() * bitsPerByte,
|
BitsPerSec: t.byteRate.Rate1() * bitsPerByte,
|
||||||
WireBitsPerSec: t.wireByteRate.Rate1() * bitsPerByte,
|
WireBitsPerSec: t.wireByteRate.Rate1() * bitsPerByte,
|
||||||
|
ReconnectCount: t.reconnectCount.Load(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,6 +160,8 @@ type StreamMetrics struct {
|
|||||||
BitsPerSec float64
|
BitsPerSec float64
|
||||||
// WireBitsPerSec is the rate of bits received on the wire per second (1-minute average)
|
// WireBitsPerSec is the rate of bits received on the wire per second (1-minute average)
|
||||||
WireBitsPerSec float64
|
WireBitsPerSec float64
|
||||||
|
// ReconnectCount is the number of reconnections since startup
|
||||||
|
ReconnectCount uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
// RouteMetrics contains route update statistics
|
// RouteMetrics contains route update statistics
|
||||||
|
|||||||
@ -330,6 +330,8 @@ func (s *Server) handleStats() http.HandlerFunc {
|
|||||||
MbitsPerSec float64 `json:"mbits_per_sec"`
|
MbitsPerSec float64 `json:"mbits_per_sec"`
|
||||||
WireMbitsPerSec float64 `json:"wire_mbits_per_sec"`
|
WireMbitsPerSec float64 `json:"wire_mbits_per_sec"`
|
||||||
Connected bool `json:"connected"`
|
Connected bool `json:"connected"`
|
||||||
|
ConnectionDuration string `json:"connection_duration"`
|
||||||
|
ReconnectCount uint64 `json:"reconnect_count"`
|
||||||
GoVersion string `json:"go_version"`
|
GoVersion string `json:"go_version"`
|
||||||
Goroutines int `json:"goroutines"`
|
Goroutines int `json:"goroutines"`
|
||||||
MemoryUsage string `json:"memory_usage"`
|
MemoryUsage string `json:"memory_usage"`
|
||||||
@ -442,6 +444,12 @@ func (s *Server) handleStats() http.HandlerFunc {
|
|||||||
whoisStats = s.getWHOISStats(ctx)
|
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{
|
stats := StatsResponse{
|
||||||
Uptime: uptime,
|
Uptime: uptime,
|
||||||
TotalMessages: metrics.TotalMessages,
|
TotalMessages: metrics.TotalMessages,
|
||||||
@ -451,6 +459,8 @@ func (s *Server) handleStats() http.HandlerFunc {
|
|||||||
MbitsPerSec: metrics.BitsPerSec / bitsPerMegabit,
|
MbitsPerSec: metrics.BitsPerSec / bitsPerMegabit,
|
||||||
WireMbitsPerSec: metrics.WireBitsPerSec / bitsPerMegabit,
|
WireMbitsPerSec: metrics.WireBitsPerSec / bitsPerMegabit,
|
||||||
Connected: metrics.Connected,
|
Connected: metrics.Connected,
|
||||||
|
ConnectionDuration: connectionDuration,
|
||||||
|
ReconnectCount: metrics.ReconnectCount,
|
||||||
GoVersion: runtime.Version(),
|
GoVersion: runtime.Version(),
|
||||||
Goroutines: runtime.NumGoroutine(),
|
Goroutines: runtime.NumGoroutine(),
|
||||||
MemoryUsage: humanize.Bytes(memStats.Alloc),
|
MemoryUsage: humanize.Bytes(memStats.Alloc),
|
||||||
|
|||||||
@ -104,6 +104,14 @@
|
|||||||
|
|
||||||
<div class="status-card">
|
<div class="status-card">
|
||||||
<h2>Stream Statistics</h2>
|
<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">
|
<div class="metric">
|
||||||
<span class="metric-label">Total Messages</span>
|
<span class="metric-label">Total Messages</span>
|
||||||
<span class="metric-value" id="total_messages">-</span>
|
<span class="metric-value" id="total_messages">-</span>
|
||||||
@ -334,6 +342,8 @@
|
|||||||
document.getElementById('go_version').textContent = '-';
|
document.getElementById('go_version').textContent = '-';
|
||||||
document.getElementById('goroutines').textContent = '-';
|
document.getElementById('goroutines').textContent = '-';
|
||||||
document.getElementById('memory_usage').textContent = '-';
|
document.getElementById('memory_usage').textContent = '-';
|
||||||
|
document.getElementById('connection_duration').textContent = '-';
|
||||||
|
document.getElementById('reconnect_count').textContent = '-';
|
||||||
document.getElementById('total_messages').textContent = '-';
|
document.getElementById('total_messages').textContent = '-';
|
||||||
document.getElementById('messages_per_sec').textContent = '-';
|
document.getElementById('messages_per_sec').textContent = '-';
|
||||||
document.getElementById('total_wire_bytes').textContent = '-';
|
document.getElementById('total_wire_bytes').textContent = '-';
|
||||||
@ -392,6 +402,8 @@
|
|||||||
document.getElementById('go_version').textContent = data.go_version;
|
document.getElementById('go_version').textContent = data.go_version;
|
||||||
document.getElementById('goroutines').textContent = formatNumber(data.goroutines);
|
document.getElementById('goroutines').textContent = formatNumber(data.goroutines);
|
||||||
document.getElementById('memory_usage').textContent = data.memory_usage;
|
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('total_messages').textContent = formatNumber(data.total_messages);
|
||||||
document.getElementById('messages_per_sec').textContent = data.messages_per_sec.toFixed(1);
|
document.getElementById('messages_per_sec').textContent = data.messages_per_sec.toFixed(1);
|
||||||
document.getElementById('total_wire_bytes').textContent = formatBytes(data.total_wire_bytes);
|
document.getElementById('total_wire_bytes').textContent = formatBytes(data.total_wire_bytes);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user