proxy-go/internal/models/request.go
wood chen f758db3531 refactor(metrics): Simplify metrics collection and improve performance
- Restructure Collector to use more efficient atomic operations
- Remove complex caching and monitoring dependencies
- Simplify path and status code tracking with sync.Map
- Optimize request logging with a dedicated request queue
- Remove unnecessary utility functions and pools
- Streamline stats generation and reduce complexity
2025-02-15 11:51:01 +08:00

65 lines
1.4 KiB
Go

package models
import (
"sync"
"time"
)
// RequestLog 请求日志
type RequestLog struct {
Time time.Time `json:"time"`
Path string `json:"path"`
Status int `json:"status"`
Latency int64 `json:"latency"`
BytesSent int64 `json:"bytes_sent"`
ClientIP string `json:"client_ip"`
}
// PathMetrics 路径指标
type PathMetrics struct {
Path string `json:"path"`
RequestCount int64 `json:"request_count"`
ErrorCount int64 `json:"error_count"`
TotalLatency int64 `json:"-"`
AvgLatency string `json:"avg_latency"`
BytesTransferred int64 `json:"bytes_transferred"`
}
// RequestQueue 请求队列
type RequestQueue struct {
sync.RWMutex
items []RequestLog
size int
cursor int
}
// NewRequestQueue 创建新的请求队列
func NewRequestQueue(size int) *RequestQueue {
return &RequestQueue{
items: make([]RequestLog, size),
size: size,
}
}
// Push 添加请求日志
func (q *RequestQueue) Push(log RequestLog) {
q.Lock()
defer q.Unlock()
q.items[q.cursor] = log
q.cursor = (q.cursor + 1) % q.size
}
// GetAll 获取所有请求日志
func (q *RequestQueue) GetAll() []RequestLog {
q.RLock()
defer q.RUnlock()
result := make([]RequestLog, 0, q.size)
for i := 0; i < q.size; i++ {
idx := (q.cursor - i - 1 + q.size) % q.size
if !q.items[idx].Time.IsZero() {
result = append(result, q.items[idx])
}
}
return result
}