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
 | ||
| }
 |