analytics_service_geo.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package nginx_log
  2. import (
  3. "context"
  4. "fmt"
  5. "time"
  6. "github.com/blevesearch/bleve/v2"
  7. "github.com/blevesearch/bleve/v2/search/query"
  8. "github.com/uozi-tech/cosy/logger"
  9. )
  10. // GetWorldMapData returns geographic data for world map visualization
  11. func (s *AnalyticsService) GetWorldMapData(ctx context.Context, logPath string, startTime, endTime time.Time) ([]WorldMapData, error) {
  12. if s.indexer == nil {
  13. return nil, fmt.Errorf("indexer not available")
  14. }
  15. if !IsLogPathUnderWhiteList(logPath) {
  16. return nil, fmt.Errorf("log path is not under whitelist")
  17. }
  18. // Get stats service
  19. statsService := NewBleveStatsService()
  20. statsService.SetIndexer(s.indexer)
  21. // Build base query
  22. baseQuery, err := s.buildTimeRangeQuery(logPath, startTime, endTime)
  23. if err != nil {
  24. return nil, fmt.Errorf("failed to build query: %w", err)
  25. }
  26. // Get world map data from Bleve stats service
  27. return statsService.GetWorldMapData(ctx, baseQuery)
  28. }
  29. // GetChinaMapData returns geographic data for China map visualization
  30. func (s *AnalyticsService) GetChinaMapData(ctx context.Context, logPath string, startTime, endTime time.Time) ([]ChinaMapData, error) {
  31. if s.indexer == nil {
  32. return nil, fmt.Errorf("indexer not available")
  33. }
  34. if !IsLogPathUnderWhiteList(logPath) {
  35. return nil, fmt.Errorf("log path is not under whitelist")
  36. }
  37. // Get stats service
  38. statsService := NewBleveStatsService()
  39. statsService.SetIndexer(s.indexer)
  40. // Build base query
  41. baseQuery, err := s.buildTimeRangeQuery(logPath, startTime, endTime)
  42. if err != nil {
  43. return nil, fmt.Errorf("failed to build query: %w", err)
  44. }
  45. // Get China map data from Bleve stats service
  46. return statsService.GetChinaMapData(ctx, baseQuery)
  47. }
  48. // GetGeoStats returns geographic statistics
  49. func (s *AnalyticsService) GetGeoStats(ctx context.Context, logPath string, startTime, endTime time.Time, limit int) ([]GeoStats, error) {
  50. if s.indexer == nil {
  51. return nil, fmt.Errorf("indexer not available")
  52. }
  53. if !IsLogPathUnderWhiteList(logPath) {
  54. return nil, fmt.Errorf("log path is not under whitelist")
  55. }
  56. // Get stats service
  57. statsService := NewBleveStatsService()
  58. statsService.SetIndexer(s.indexer)
  59. // Build base query
  60. baseQuery, err := s.buildTimeRangeQuery(logPath, startTime, endTime)
  61. if err != nil {
  62. return nil, fmt.Errorf("failed to build query: %w", err)
  63. }
  64. // Get geographic statistics from Bleve stats service
  65. return statsService.GetGeoStats(ctx, baseQuery, limit)
  66. }
  67. // buildTimeRangeQuery builds a query for the given time range and log path
  68. func (s *AnalyticsService) buildTimeRangeQuery(logPath string, startTime, endTime time.Time) (query.Query, error) {
  69. var queries []query.Query
  70. // Add file path filter if specified
  71. if logPath != "" {
  72. filePathQuery := bleve.NewTermQuery(logPath)
  73. filePathQuery.SetField("file_path")
  74. queries = append(queries, filePathQuery)
  75. }
  76. // Add time range filter if specified
  77. if !startTime.IsZero() || !endTime.IsZero() {
  78. dateQuery := bleve.NewDateRangeQuery(startTime, endTime)
  79. dateQuery.SetField("timestamp")
  80. queries = append(queries, dateQuery)
  81. logger.Debugf("Time range query: start=%v, end=%v", startTime, endTime)
  82. }
  83. // Combine queries
  84. switch len(queries) {
  85. case 0:
  86. return bleve.NewMatchAllQuery(), nil
  87. case 1:
  88. return queries[0], nil
  89. default:
  90. return bleve.NewConjunctionQuery(queries...), nil
  91. }
  92. }