123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- package nginx_log
- import "sort"
- // CommonAccessStats represents generic access statistics
- type CommonAccessStats struct {
- Name string `json:"name"`
- Count int `json:"count"`
- Percent float64 `json:"percent"`
- }
- // calculateCommonStats is a function to calculate statistics for any field
- func calculateCommonStats(entries []*AccessLogEntry, extractField func(*AccessLogEntry) string) []CommonAccessStats {
- fieldCount := make(map[string]int)
- totalRequests := len(entries)
- // Count field occurrences
- for _, entry := range entries {
- field := extractField(entry)
- fieldCount[field]++
- }
- // Convert to slice and sort
- var stats []CommonAccessStats
- for name, count := range fieldCount {
- percent := 0.0
- if totalRequests > 0 {
- percent = float64(count) * 100.0 / float64(totalRequests)
- }
- stats = append(stats, CommonAccessStats{
- Name: name,
- Count: count,
- Percent: percent,
- })
- }
- // Sort by count (descending)
- sort.Slice(stats, func(i, j int) bool {
- return stats[i].Count > stats[j].Count
- })
- return stats
- }
- // calculateAverage calculates average from slice of values
- func calculateAverage(values []int) float64 {
- if len(values) == 0 {
- return 0.0
- }
-
- sum := 0
- for _, v := range values {
- sum += v
- }
- return float64(sum) / float64(len(values))
- }
- // findMax finds maximum value and its index
- func findMax(values []int) (maxValue, maxIndex int) {
- if len(values) == 0 {
- return 0, -1
- }
-
- maxValue = values[0]
- maxIndex = 0
-
- for i, v := range values[1:] {
- if v > maxValue {
- maxValue = v
- maxIndex = i + 1
- }
- }
- return maxValue, maxIndex
- }
|