Files
Primora/apps/backend/internal/observability/metrics.go
T
2026-04-10 12:03:31 +02:00

59 lines
1.1 KiB
Go

package observability
import (
"sync"
"time"
)
// Metrics provides basic in-memory metrics collection
type Metrics struct {
mu sync.RWMutex
requestCount int64
errorCount int64
totalResponseTime time.Duration
activeRequests int64
}
func NewMetrics() *Metrics {
return &Metrics{}
}
func (m *Metrics) RecordRequest(duration time.Duration, isError bool) {
m.mu.Lock()
defer m.mu.Unlock()
m.requestCount++
m.totalResponseTime += duration
if isError {
m.errorCount++
}
}
func (m *Metrics) IncrementActive() {
m.mu.Lock()
defer m.mu.Unlock()
m.activeRequests++
}
func (m *Metrics) DecrementActive() {
m.mu.Lock()
defer m.mu.Unlock()
m.activeRequests--
}
func (m *Metrics) GetStats() map[string]any {
m.mu.RLock()
defer m.mu.RUnlock()
avgResponseTime := int64(0)
if m.requestCount > 0 {
avgResponseTime = m.totalResponseTime.Milliseconds() / m.requestCount
}
return map[string]any{
"total_requests": m.requestCount,
"total_errors": m.errorCount,
"active_requests": m.activeRequests,
"avg_response_time_ms": avgResponseTime,
}
}