61 lines
1.3 KiB
Go
61 lines
1.3 KiB
Go
package errors
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
// Metrics holds error metrics
|
|
type Metrics struct {
|
|
TotalErrors int
|
|
ErrorsByCode map[string]int
|
|
ErrorsByCategory map[string]int
|
|
}
|
|
|
|
// ErrorMetrics represents error metrics for external use
|
|
type ErrorMetrics struct {
|
|
TotalErrors int `json:"total_errors"`
|
|
ErrorsByCode map[string]int `json:"errors_by_code"`
|
|
ErrorsByCategory map[string]int `json:"errors_by_category"`
|
|
}
|
|
|
|
var (
|
|
globalMetrics = &Metrics{
|
|
ErrorsByCode: make(map[string]int),
|
|
ErrorsByCategory: make(map[string]int),
|
|
}
|
|
metricsMutex sync.RWMutex
|
|
)
|
|
|
|
// RecordError records an error in metrics
|
|
func RecordError(err Error) {
|
|
metricsMutex.Lock()
|
|
defer metricsMutex.Unlock()
|
|
|
|
globalMetrics.TotalErrors++
|
|
globalMetrics.ErrorsByCode[err.Code()]++
|
|
globalMetrics.ErrorsByCategory[err.Category()]++
|
|
}
|
|
|
|
// GetMetrics returns a copy of current metrics
|
|
func GetMetrics() *Metrics {
|
|
metricsMutex.RLock()
|
|
defer metricsMutex.RUnlock()
|
|
|
|
// Create a deep copy
|
|
copy := &Metrics{
|
|
TotalErrors: globalMetrics.TotalErrors,
|
|
ErrorsByCode: make(map[string]int),
|
|
ErrorsByCategory: make(map[string]int),
|
|
}
|
|
|
|
for k, v := range globalMetrics.ErrorsByCode {
|
|
copy.ErrorsByCode[k] = v
|
|
}
|
|
|
|
for k, v := range globalMetrics.ErrorsByCategory {
|
|
copy.ErrorsByCategory[k] = v
|
|
}
|
|
|
|
return copy
|
|
}
|