264 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			264 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package metrics | |||
|  | 
 | |||
|  | import ( | |||
|  | 	"context" | |||
|  | 	"sync" | |||
|  | 
 | |||
|  | 	"go.uber.org/zap" | |||
|  | 
 | |||
|  | 	"tyapi-server/internal/shared/interfaces" | |||
|  | ) | |||
|  | 
 | |||
|  | // BusinessMetrics 业务指标收集器 | |||
|  | type BusinessMetrics struct { | |||
|  | 	metrics interfaces.MetricsCollector | |||
|  | 	logger  *zap.Logger | |||
|  | 	mutex   sync.RWMutex | |||
|  | 
 | |||
|  | 	// 业务指标缓存 | |||
|  | 	userMetrics  map[string]int64 | |||
|  | 	orderMetrics map[string]int64 | |||
|  | } | |||
|  | 
 | |||
|  | // NewBusinessMetrics 创建业务指标收集器 | |||
|  | func NewBusinessMetrics(metrics interfaces.MetricsCollector, logger *zap.Logger) *BusinessMetrics { | |||
|  | 	bm := &BusinessMetrics{ | |||
|  | 		metrics:      metrics, | |||
|  | 		logger:       logger, | |||
|  | 		userMetrics:  make(map[string]int64), | |||
|  | 		orderMetrics: make(map[string]int64), | |||
|  | 	} | |||
|  | 
 | |||
|  | 	// 注册业务指标 | |||
|  | 	bm.registerBusinessMetrics() | |||
|  | 
 | |||
|  | 	return bm | |||
|  | } | |||
|  | 
 | |||
|  | // registerBusinessMetrics 注册业务指标 | |||
|  | func (bm *BusinessMetrics) registerBusinessMetrics() { | |||
|  | 	// 用户相关指标 | |||
|  | 	bm.metrics.RegisterCounter("users_created_total", "Total number of users created", []string{"source"}) | |||
|  | 	bm.metrics.RegisterCounter("users_login_total", "Total number of user logins", []string{"method", "status"}) | |||
|  | 	bm.metrics.RegisterGauge("users_active_sessions", "Current number of active user sessions", nil) | |||
|  | 
 | |||
|  | 	// 订单相关指标 | |||
|  | 	bm.metrics.RegisterCounter("orders_created_total", "Total number of orders created", []string{"status"}) | |||
|  | 	bm.metrics.RegisterCounter("orders_amount_total", "Total order amount in cents", []string{"currency"}) | |||
|  | 	bm.metrics.RegisterHistogram("orders_processing_duration_seconds", "Order processing duration", []string{"status"}, []float64{0.1, 0.5, 1, 2, 5, 10, 30}) | |||
|  | 
 | |||
|  | 	// API相关指标 | |||
|  | 	bm.metrics.RegisterCounter("api_errors_total", "Total number of API errors", []string{"endpoint", "error_type"}) | |||
|  | 	bm.metrics.RegisterHistogram("api_response_size_bytes", "API response size in bytes", []string{"endpoint"}, []float64{100, 1000, 10000, 100000}) | |||
|  | 
 | |||
|  | 	// 缓存相关指标 | |||
|  | 	bm.metrics.RegisterCounter("cache_operations_total", "Total number of cache operations", []string{"operation", "result"}) | |||
|  | 	bm.metrics.RegisterGauge("cache_memory_usage_bytes", "Cache memory usage in bytes", []string{"cache_type"}) | |||
|  | 
 | |||
|  | 	// 数据库相关指标 | |||
|  | 	bm.metrics.RegisterHistogram("database_query_duration_seconds", "Database query duration", []string{"operation", "table"}, []float64{0.001, 0.01, 0.1, 1, 10}) | |||
|  | 	bm.metrics.RegisterCounter("database_errors_total", "Total number of database errors", []string{"operation", "error_type"}) | |||
|  | 
 | |||
|  | 	bm.logger.Info("Business metrics registered successfully") | |||
|  | } | |||
|  | 
 | |||
|  | // User相关指标 | |||
|  | 
 | |||
|  | // RecordUserCreated 记录用户创建 | |||
|  | func (bm *BusinessMetrics) RecordUserCreated(source string) { | |||
|  | 	bm.metrics.IncrementCounter("users_created_total", map[string]string{ | |||
|  | 		"source": source, | |||
|  | 	}) | |||
|  | 
 | |||
|  | 	bm.mutex.Lock() | |||
|  | 	bm.userMetrics["created"]++ | |||
|  | 	bm.mutex.Unlock() | |||
|  | 
 | |||
|  | 	bm.logger.Debug("Recorded user created", zap.String("source", source)) | |||
|  | } | |||
|  | 
 | |||
|  | // RecordUserLogin 记录用户登录 | |||
|  | func (bm *BusinessMetrics) RecordUserLogin(method, status string) { | |||
|  | 	bm.metrics.IncrementCounter("users_login_total", map[string]string{ | |||
|  | 		"method": method, | |||
|  | 		"status": status, | |||
|  | 	}) | |||
|  | 
 | |||
|  | 	bm.logger.Debug("Recorded user login", zap.String("method", method), zap.String("status", status)) | |||
|  | } | |||
|  | 
 | |||
|  | // UpdateActiveUserSessions 更新活跃用户会话数 | |||
|  | func (bm *BusinessMetrics) UpdateActiveUserSessions(count float64) { | |||
|  | 	bm.metrics.RecordGauge("users_active_sessions", count, nil) | |||
|  | } | |||
|  | 
 | |||
|  | // Order相关指标 | |||
|  | 
 | |||
|  | // RecordOrderCreated 记录订单创建 | |||
|  | func (bm *BusinessMetrics) RecordOrderCreated(status string, amount float64, currency string) { | |||
|  | 	bm.metrics.IncrementCounter("orders_created_total", map[string]string{ | |||
|  | 		"status": status, | |||
|  | 	}) | |||
|  | 
 | |||
|  | 	// 记录订单金额(以分为单位) | |||
|  | 	amountCents := int64(amount * 100) | |||
|  | 	bm.metrics.IncrementCounter("orders_amount_total", map[string]string{ | |||
|  | 		"currency": currency, | |||
|  | 	}) | |||
|  | 
 | |||
|  | 	bm.mutex.Lock() | |||
|  | 	bm.orderMetrics["created"]++ | |||
|  | 	bm.orderMetrics["amount"] += amountCents | |||
|  | 	bm.mutex.Unlock() | |||
|  | 
 | |||
|  | 	bm.logger.Debug("Recorded order created", | |||
|  | 		zap.String("status", status), | |||
|  | 		zap.Float64("amount", amount), | |||
|  | 		zap.String("currency", currency)) | |||
|  | } | |||
|  | 
 | |||
|  | // RecordOrderProcessingDuration 记录订单处理时长 | |||
|  | func (bm *BusinessMetrics) RecordOrderProcessingDuration(status string, duration float64) { | |||
|  | 	bm.metrics.RecordHistogram("orders_processing_duration_seconds", duration, map[string]string{ | |||
|  | 		"status": status, | |||
|  | 	}) | |||
|  | } | |||
|  | 
 | |||
|  | // API相关指标 | |||
|  | 
 | |||
|  | // RecordAPIError 记录API错误 | |||
|  | func (bm *BusinessMetrics) RecordAPIError(endpoint, errorType string) { | |||
|  | 	bm.metrics.IncrementCounter("api_errors_total", map[string]string{ | |||
|  | 		"endpoint":   endpoint, | |||
|  | 		"error_type": errorType, | |||
|  | 	}) | |||
|  | 
 | |||
|  | 	bm.logger.Debug("Recorded API error", | |||
|  | 		zap.String("endpoint", endpoint), | |||
|  | 		zap.String("error_type", errorType)) | |||
|  | } | |||
|  | 
 | |||
|  | // RecordAPIResponseSize 记录API响应大小 | |||
|  | func (bm *BusinessMetrics) RecordAPIResponseSize(endpoint string, sizeBytes float64) { | |||
|  | 	bm.metrics.RecordHistogram("api_response_size_bytes", sizeBytes, map[string]string{ | |||
|  | 		"endpoint": endpoint, | |||
|  | 	}) | |||
|  | } | |||
|  | 
 | |||
|  | // Cache相关指标 | |||
|  | 
 | |||
|  | // RecordCacheOperation 记录缓存操作 | |||
|  | func (bm *BusinessMetrics) RecordCacheOperation(operation, result string) { | |||
|  | 	bm.metrics.IncrementCounter("cache_operations_total", map[string]string{ | |||
|  | 		"operation": operation, | |||
|  | 		"result":    result, | |||
|  | 	}) | |||
|  | } | |||
|  | 
 | |||
|  | // UpdateCacheMemoryUsage 更新缓存内存使用量 | |||
|  | func (bm *BusinessMetrics) UpdateCacheMemoryUsage(cacheType string, usageBytes float64) { | |||
|  | 	bm.metrics.RecordGauge("cache_memory_usage_bytes", usageBytes, map[string]string{ | |||
|  | 		"cache_type": cacheType, | |||
|  | 	}) | |||
|  | } | |||
|  | 
 | |||
|  | // Database相关指标 | |||
|  | 
 | |||
|  | // RecordDatabaseQuery 记录数据库查询 | |||
|  | func (bm *BusinessMetrics) RecordDatabaseQuery(operation, table string, duration float64) { | |||
|  | 	bm.metrics.RecordHistogram("database_query_duration_seconds", duration, map[string]string{ | |||
|  | 		"operation": operation, | |||
|  | 		"table":     table, | |||
|  | 	}) | |||
|  | } | |||
|  | 
 | |||
|  | // RecordDatabaseError 记录数据库错误 | |||
|  | func (bm *BusinessMetrics) RecordDatabaseError(operation, errorType string) { | |||
|  | 	bm.metrics.IncrementCounter("database_errors_total", map[string]string{ | |||
|  | 		"operation":  operation, | |||
|  | 		"error_type": errorType, | |||
|  | 	}) | |||
|  | 
 | |||
|  | 	bm.logger.Debug("Recorded database error", | |||
|  | 		zap.String("operation", operation), | |||
|  | 		zap.String("error_type", errorType)) | |||
|  | } | |||
|  | 
 | |||
|  | // 获取统计信息 | |||
|  | 
 | |||
|  | // GetUserStats 获取用户统计 | |||
|  | func (bm *BusinessMetrics) GetUserStats() map[string]int64 { | |||
|  | 	bm.mutex.RLock() | |||
|  | 	defer bm.mutex.RUnlock() | |||
|  | 
 | |||
|  | 	stats := make(map[string]int64) | |||
|  | 	for k, v := range bm.userMetrics { | |||
|  | 		stats[k] = v | |||
|  | 	} | |||
|  | 	return stats | |||
|  | } | |||
|  | 
 | |||
|  | // GetOrderStats 获取订单统计 | |||
|  | func (bm *BusinessMetrics) GetOrderStats() map[string]int64 { | |||
|  | 	bm.mutex.RLock() | |||
|  | 	defer bm.mutex.RUnlock() | |||
|  | 
 | |||
|  | 	stats := make(map[string]int64) | |||
|  | 	for k, v := range bm.orderMetrics { | |||
|  | 		stats[k] = v | |||
|  | 	} | |||
|  | 	return stats | |||
|  | } | |||
|  | 
 | |||
|  | // GetOverallStats 获取整体统计 | |||
|  | func (bm *BusinessMetrics) GetOverallStats() map[string]interface{} { | |||
|  | 	return map[string]interface{}{ | |||
|  | 		"user_stats":  bm.GetUserStats(), | |||
|  | 		"order_stats": bm.GetOrderStats(), | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | // Reset 重置统计数据 | |||
|  | func (bm *BusinessMetrics) Reset() { | |||
|  | 	bm.mutex.Lock() | |||
|  | 	defer bm.mutex.Unlock() | |||
|  | 
 | |||
|  | 	bm.userMetrics = make(map[string]int64) | |||
|  | 	bm.orderMetrics = make(map[string]int64) | |||
|  | 
 | |||
|  | 	bm.logger.Info("Business metrics reset") | |||
|  | } | |||
|  | 
 | |||
|  | // Context相关方法 | |||
|  | 
 | |||
|  | // WithContext 创建带上下文的业务指标收集器 | |||
|  | func (bm *BusinessMetrics) WithContext(ctx context.Context) *BusinessMetrics { | |||
|  | 	// 这里可以从context中提取追踪信息,关联指标 | |||
|  | 	return bm | |||
|  | } | |||
|  | 
 | |||
|  | // 实现Service接口(如果需要) | |||
|  | 
 | |||
|  | // Name 返回服务名称 | |||
|  | func (bm *BusinessMetrics) Name() string { | |||
|  | 	return "business-metrics" | |||
|  | } | |||
|  | 
 | |||
|  | // Initialize 初始化服务 | |||
|  | func (bm *BusinessMetrics) Initialize(ctx context.Context) error { | |||
|  | 	bm.logger.Info("Business metrics service initialized") | |||
|  | 	return nil | |||
|  | } | |||
|  | 
 | |||
|  | // HealthCheck 健康检查 | |||
|  | func (bm *BusinessMetrics) HealthCheck(ctx context.Context) error { | |||
|  | 	// 检查指标收集器是否正常 | |||
|  | 	return nil | |||
|  | } | |||
|  | 
 | |||
|  | // Shutdown 关闭服务 | |||
|  | func (bm *BusinessMetrics) Shutdown(ctx context.Context) error { | |||
|  | 	bm.logger.Info("Business metrics service shutdown") | |||
|  | 	return nil | |||
|  | } |