Files
2025-08-03 00:11:15 +08:00

205 lines
5.1 KiB
Go

package performance
import (
"context"
"runtime"
"time"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gtime"
)
// Monitor 性能监控器
type Monitor struct {
startTime time.Time
ctx context.Context
}
// NewMonitor 创建性能监控器
func NewMonitor(ctx context.Context) *Monitor {
return &Monitor{
startTime: time.Now(),
ctx: ctx,
}
}
// GetExecutionTime 获取执行时间
func (m *Monitor) GetExecutionTime() time.Duration {
return time.Since(m.startTime)
}
// LogPerformance 记录性能信息
func (m *Monitor) LogPerformance(operation string) {
duration := m.GetExecutionTime()
// 记录性能日志
g.Log().Info(m.ctx, "Performance Monitor", g.Map{
"operation": operation,
"duration": duration.String(),
"timestamp": gtime.Now().String(),
})
// 如果执行时间超过阈值,记录警告
if duration > time.Second*2 {
g.Log().Warning(m.ctx, "Slow Operation Detected", g.Map{
"operation": operation,
"duration": duration.String(),
"threshold": "2s",
})
}
}
// GetMemoryUsage 获取内存使用情况
func GetMemoryUsage() map[string]interface{} {
var m runtime.MemStats
runtime.ReadMemStats(&m)
return map[string]interface{}{
"alloc": bToMb(m.Alloc), // 当前分配的内存
"total_alloc": bToMb(m.TotalAlloc), // 总分配的内存
"sys": bToMb(m.Sys), // 系统内存
"num_gc": m.NumGC, // GC次数
"goroutines": runtime.NumGoroutine(), // 协程数量
}
}
// GetSystemInfo 获取系统信息
func GetSystemInfo() map[string]interface{} {
return map[string]interface{}{
"go_version": runtime.Version(),
"go_os": runtime.GOOS,
"go_arch": runtime.GOARCH,
"cpu_count": runtime.NumCPU(),
"goroutines": runtime.NumGoroutine(),
"memory_usage": GetMemoryUsage(),
}
}
// bToMb 字节转MB
func bToMb(b uint64) uint64 {
return b / 1024 / 1024
}
// DatabasePerformanceMonitor 数据库性能监控
type DatabasePerformanceMonitor struct {
slowQueryThreshold time.Duration
}
// NewDatabasePerformanceMonitor 创建数据库性能监控器
func NewDatabasePerformanceMonitor() *DatabasePerformanceMonitor {
return &DatabasePerformanceMonitor{
slowQueryThreshold: time.Millisecond * 500, // 500ms慢查询阈值
}
}
// LogSlowQuery 记录慢查询
func (d *DatabasePerformanceMonitor) LogSlowQuery(ctx context.Context, sql string, duration time.Duration, args ...interface{}) {
if duration > d.slowQueryThreshold {
g.Log().Warning(ctx, "Slow Query Detected", g.Map{
"sql": sql,
"duration": duration.String(),
"args": args,
"threshold": d.slowQueryThreshold.String(),
})
}
}
// APIPerformanceMonitor API性能监控
type APIPerformanceMonitor struct {
requestCount map[string]int64
responseTime map[string][]time.Duration
}
// NewAPIPerformanceMonitor 创建API性能监控器
func NewAPIPerformanceMonitor() *APIPerformanceMonitor {
return &APIPerformanceMonitor{
requestCount: make(map[string]int64),
responseTime: make(map[string][]time.Duration),
}
}
// RecordRequest 记录请求
func (a *APIPerformanceMonitor) RecordRequest(endpoint string, duration time.Duration) {
a.requestCount[endpoint]++
a.responseTime[endpoint] = append(a.responseTime[endpoint], duration)
// 保持最近100次请求的记录
if len(a.responseTime[endpoint]) > 100 {
a.responseTime[endpoint] = a.responseTime[endpoint][1:]
}
}
// GetStats 获取统计信息
func (a *APIPerformanceMonitor) GetStats(endpoint string) map[string]interface{} {
times := a.responseTime[endpoint]
if len(times) == 0 {
return map[string]interface{}{
"request_count": a.requestCount[endpoint],
"avg_time": 0,
"min_time": 0,
"max_time": 0,
}
}
var total, min, max time.Duration
min = times[0]
max = times[0]
for _, t := range times {
total += t
if t < min {
min = t
}
if t > max {
max = t
}
}
return map[string]interface{}{
"request_count": a.requestCount[endpoint],
"avg_time": (total / time.Duration(len(times))).String(),
"min_time": min.String(),
"max_time": max.String(),
"sample_count": len(times),
}
}
// CachePerformanceMonitor 缓存性能监控
type CachePerformanceMonitor struct {
hitCount int64
missCount int64
}
// NewCachePerformanceMonitor 创建缓存性能监控器
func NewCachePerformanceMonitor() *CachePerformanceMonitor {
return &CachePerformanceMonitor{}
}
// RecordHit 记录缓存命中
func (c *CachePerformanceMonitor) RecordHit() {
c.hitCount++
}
// RecordMiss 记录缓存未命中
func (c *CachePerformanceMonitor) RecordMiss() {
c.missCount++
}
// GetHitRate 获取缓存命中率
func (c *CachePerformanceMonitor) GetHitRate() float64 {
total := c.hitCount + c.missCount
if total == 0 {
return 0
}
return float64(c.hitCount) / float64(total) * 100
}
// GetStats 获取缓存统计
func (c *CachePerformanceMonitor) GetStats() map[string]interface{} {
return map[string]interface{}{
"hit_count": c.hitCount,
"miss_count": c.missCount,
"total_count": c.hitCount + c.missCount,
"hit_rate": c.GetHitRate(),
}
}