You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
1.9 KiB

package metrics
import (
"sync"
"sync/atomic"
"time"
"github.com/sirupsen/logrus"
)
type Metrics struct {
ActiveConnections int64
TotalRequests int64
FailedRequests int64
BytesTransferred int64
StartTime time.Time
mu sync.RWMutex
logger *logrus.Logger
}
func NewMetrics(logger *logrus.Logger) *Metrics {
return &Metrics{
StartTime: time.Now(),
logger: logger,
}
}
func (m *Metrics) IncActiveConnections() {
atomic.AddInt64(&m.ActiveConnections, 1)
m.logger.WithField("active_connections", atomic.LoadInt64(&m.ActiveConnections)).Debug("Connection opened")
}
func (m *Metrics) DecActiveConnections() {
atomic.AddInt64(&m.ActiveConnections, -1)
m.logger.WithField("active_connections", atomic.LoadInt64(&m.ActiveConnections)).Debug("Connection closed")
}
func (m *Metrics) IncTotalRequests() {
atomic.AddInt64(&m.TotalRequests, 1)
}
func (m *Metrics) IncFailedRequests() {
atomic.AddInt64(&m.FailedRequests, 1)
}
func (m *Metrics) AddBytesTransferred(bytes int64) {
atomic.AddInt64(&m.BytesTransferred, bytes)
}
func (m *Metrics) GetStats() map[string]interface{} {
uptime := time.Since(m.StartTime)
return map[string]interface{}{
"active_connections": atomic.LoadInt64(&m.ActiveConnections),
"total_requests": atomic.LoadInt64(&m.TotalRequests),
"failed_requests": atomic.LoadInt64(&m.FailedRequests),
"bytes_transferred": atomic.LoadInt64(&m.BytesTransferred),
"uptime_seconds": uptime.Seconds(),
"start_time": m.StartTime.Format(time.RFC3339),
}
}
func (m *Metrics) LogStats() {
stats := m.GetStats()
m.logger.WithFields(logrus.Fields(stats)).Info("Server metrics")
}
// StartPeriodicLogging starts logging metrics at regular intervals
func (m *Metrics) StartPeriodicLogging(interval time.Duration) {
ticker := time.NewTicker(interval)
go func() {
for range ticker.C {
m.LogStats()
}
}()
}