Files
telecom-platform/apps/carrier-connector/internal/services/tenant_analytics_usage.go
T
nutcas3 271b43e4ac refactor: Implement tenant analytics dashboard and usage analytics with helper methods
- Implement GetTenantDashboard with usage stats, metrics, recent events, and quota status
- Implement GetUsageAnalytics with usage by type, trends, and peaks
- Implement GetPerformanceAnalytics with API performance, resource performance, errors, and slow queries
- Extract helper methods to tenant_analytics_mock.go: parseTimeRange, parseAPIRequestEvent, parseErrorEvent, parseSlowQueryEvent, calculateAPIPerformance, build
2026-05-02 04:26:35 +03:00

148 lines
4.3 KiB
Go

package services
import (
"time"
"github.com/nutcas3/telecom-platform/apps/carrier-connector/internal/tenant"
)
// buildUsageByType builds usage analytics by resource type
func (s *TenantServiceImpl) buildUsageByType(usageStats *tenant.TenantUsageStats) map[string]*tenant.ResourceUsageAnalytics {
usageByType := make(map[string]*tenant.ResourceUsageAnalytics)
// Build analytics for each resource type
resourceTypes := []string{"users", "profiles", "carriers", "api_calls", "storage"}
for _, resourceType := range resourceTypes {
analytics := &tenant.ResourceUsageAnalytics{
ResourceType: resourceType,
TotalUsage: s.getMockResourceCount(resourceType),
AverageUsage: s.getMockResourceCount(resourceType) / 30,
PeakUsage: s.getMockResourceCount(resourceType),
PeakTime: time.Now().Add(-2 * time.Hour),
}
usageByType[resourceType] = analytics
}
return usageByType
}
// buildUsageTrends builds usage trends over time
func (s *TenantServiceImpl) buildUsageTrends(tenantID, timeRange string) map[string][]*tenant.UsageTrend {
trends := make(map[string][]*tenant.UsageTrend)
// Build trends for each resource type
resourceTypes := []string{"users", "profiles", "carriers", "api_calls", "storage"}
for _, resourceType := range resourceTypes {
trendData := make([]*tenant.UsageTrend, 0)
// Generate mock trend data points
now := time.Now()
for i := 6; i >= 0; i-- {
timestamp := now.AddDate(0, 0, -i)
usage := int(float64(s.getMockResourceCount(resourceType)) * (1.0 + float64(6-i)*0.1))
trend := &tenant.UsageTrend{
Timestamp: timestamp,
Usage: usage,
}
trendData = append(trendData, trend)
}
trends[resourceType] = trendData
}
return trends
}
// buildUsagePeaks builds usage peak information
func (s *TenantServiceImpl) buildUsagePeaks(tenantID, timeRange string) map[string]*tenant.UsagePeak {
peaks := make(map[string]*tenant.UsagePeak)
// Build peaks for each resource type
resourceTypes := []string{"users", "profiles", "carriers", "api_calls", "storage"}
for _, resourceType := range resourceTypes {
peak := &tenant.UsagePeak{
Timestamp: time.Now().Add(-2 * time.Hour),
Usage: s.getMockResourceCount(resourceType),
Context: map[string]any{
"peak_hour": 14, // 2 PM
"day_of_week": "Wednesday",
"season": "Q2",
"driver": "business_activity",
},
}
peaks[resourceType] = peak
}
return peaks
}
// parseAPIRequestEvents parses API request events from tenant events
func (s *TenantServiceImpl) parseAPIRequestEvents(events []*tenant.TenantEvent) []*tenant.APIRequestEvent {
apiRequests := make([]*tenant.APIRequestEvent, 0)
for _, event := range events {
if event.EventType == "api_request" {
request := s.parseAPIRequestEvent(event)
apiRequests = append(apiRequests, request)
}
}
return apiRequests
}
// buildResourcePerformance builds resource performance metrics
func (s *TenantServiceImpl) buildResourcePerformance(tenantID, timeRange string) map[string]*tenant.ResourcePerformance {
resourcePerformance := make(map[string]*tenant.ResourcePerformance)
// Build performance for each resource type
resourceTypes := []string{"users", "profiles", "carriers", "api_calls", "storage"}
for _, resourceType := range resourceTypes {
performance := &tenant.ResourcePerformance{
ResourceType: resourceType,
ResponseTime: 150.5, // Mock response time in ms
Throughput: 1000.0, // Mock requests per second
ErrorRate: 2.1, // Mock error rate percentage
}
resourcePerformance[resourceType] = performance
}
return resourcePerformance
}
// parseErrorEvents parses error events from tenant events
func (s *TenantServiceImpl) parseErrorEvents(events []*tenant.TenantEvent) []*tenant.ErrorEvent {
errorEvents := make([]*tenant.ErrorEvent, 0)
for _, event := range events {
if event.EventType == "error" {
errorEvent := s.parseErrorEvent(event)
errorEvents = append(errorEvents, errorEvent)
}
}
return errorEvents
}
// parseSlowQueryEvents parses slow query events from tenant events
func (s *TenantServiceImpl) parseSlowQueryEvents(events []*tenant.TenantEvent) []*tenant.SlowQuery {
slowQueries := make([]*tenant.SlowQuery, 0)
for _, event := range events {
if event.EventType == "slow_query" {
slowQuery := s.parseSlowQueryEvent(event)
slowQueries = append(slowQueries, slowQuery)
}
}
return slowQueries
}