1
0

stats_common.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package nginx_log
  2. import "sort"
  3. // CommonAccessStats represents generic access statistics
  4. type CommonAccessStats struct {
  5. Name string `json:"name"`
  6. Count int `json:"count"`
  7. Percent float64 `json:"percent"`
  8. }
  9. // calculateCommonStats is a function to calculate statistics for any field
  10. func calculateCommonStats(entries []*AccessLogEntry, extractField func(*AccessLogEntry) string) []CommonAccessStats {
  11. fieldCount := make(map[string]int)
  12. totalRequests := len(entries)
  13. // Count field occurrences
  14. for _, entry := range entries {
  15. field := extractField(entry)
  16. fieldCount[field]++
  17. }
  18. // Convert to slice and sort
  19. var stats []CommonAccessStats
  20. for name, count := range fieldCount {
  21. percent := 0.0
  22. if totalRequests > 0 {
  23. percent = float64(count) * 100.0 / float64(totalRequests)
  24. }
  25. stats = append(stats, CommonAccessStats{
  26. Name: name,
  27. Count: count,
  28. Percent: percent,
  29. })
  30. }
  31. // Sort by count (descending)
  32. sort.Slice(stats, func(i, j int) bool {
  33. return stats[i].Count > stats[j].Count
  34. })
  35. return stats
  36. }
  37. // calculateAverage calculates average from slice of values
  38. func calculateAverage(values []int) float64 {
  39. if len(values) == 0 {
  40. return 0.0
  41. }
  42. sum := 0
  43. for _, v := range values {
  44. sum += v
  45. }
  46. return float64(sum) / float64(len(values))
  47. }
  48. // findMax finds maximum value and its index
  49. func findMax(values []int) (maxValue, maxIndex int) {
  50. if len(values) == 0 {
  51. return 0, -1
  52. }
  53. maxValue = values[0]
  54. maxIndex = 0
  55. for i, v := range values[1:] {
  56. if v > maxValue {
  57. maxValue = v
  58. maxIndex = i + 1
  59. }
  60. }
  61. return maxValue, maxIndex
  62. }