فهرست منبع

Fix & refactor adguard stats

Svilen Markov 10 ماه پیش
والد
کامیت
db1ed9e257
1فایلهای تغییر یافته به همراه39 افزوده شده و 18 حذف شده
  1. 39 18
      internal/feed/adguard.go

+ 39 - 18
internal/feed/adguard.go

@@ -31,10 +31,13 @@ func FetchAdguardStats(instanceURL, username, password string) (*DNSStats, error
 		return nil, err
 	}
 
+	var topBlockedDomainsCount = min(len(responseJson.TopBlockedDomains), 5)
+
 	stats := &DNSStats{
-		TotalQueries:   responseJson.TotalQueries,
-		BlockedQueries: responseJson.BlockedQueries,
-		ResponseTime:   int(responseJson.ResponseTime * 1000),
+		TotalQueries:      responseJson.TotalQueries,
+		BlockedQueries:    responseJson.BlockedQueries,
+		ResponseTime:      int(responseJson.ResponseTime * 1000),
+		TopBlockedDomains: make([]DNSStatsBlockedDomain, 0, topBlockedDomainsCount),
 	}
 
 	if stats.TotalQueries <= 0 {
@@ -43,8 +46,6 @@ func FetchAdguardStats(instanceURL, username, password string) (*DNSStats, error
 
 	stats.BlockedPercent = int(float64(responseJson.BlockedQueries) / float64(responseJson.TotalQueries) * 100)
 
-	var topBlockedDomainsCount = min(len(responseJson.TopBlockedDomains), 5)
-
 	for i := 0; i < topBlockedDomainsCount; i++ {
 		domain := responseJson.TopBlockedDomains[i]
 		var firstDomain string
@@ -59,31 +60,51 @@ func FetchAdguardStats(instanceURL, username, password string) (*DNSStats, error
 		}
 
 		stats.TopBlockedDomains = append(stats.TopBlockedDomains, DNSStatsBlockedDomain{
-			Domain:         firstDomain,
-			PercentBlocked: int(float64(domain[firstDomain]) / float64(responseJson.BlockedQueries) * 100),
+			Domain: firstDomain,
 		})
+
+		if stats.BlockedQueries > 0 {
+			stats.TopBlockedDomains[i].PercentBlocked = int(float64(domain[firstDomain]) / float64(responseJson.BlockedQueries) * 100)
+		}
 	}
 
-	// Adguard _should_ return data for the last 24 hours in a 1 hour interval
-	if len(responseJson.QueriesSeries) != 24 || len(responseJson.BlockedSeries) != 24 {
-		return stats, nil
+	queriesSeries := responseJson.QueriesSeries
+	blockedSeries := responseJson.BlockedSeries
+
+	const bars = 8
+	const hoursSpan = 24
+	const hoursPerBar int = hoursSpan / bars
+
+	if len(queriesSeries) > hoursSpan {
+		queriesSeries = queriesSeries[len(queriesSeries)-hoursSpan:]
+	} else if len(queriesSeries) < hoursSpan {
+		queriesSeries = append(make([]int, hoursSpan-len(queriesSeries)), queriesSeries...)
+	}
+
+	if len(blockedSeries) > hoursSpan {
+		blockedSeries = blockedSeries[len(blockedSeries)-hoursSpan:]
+	} else if len(blockedSeries) < hoursSpan {
+		blockedSeries = append(make([]int, hoursSpan-len(blockedSeries)), blockedSeries...)
 	}
 
 	maxQueriesInSeries := 0
 
-	for i := 0; i < 8; i++ {
+	for i := 0; i < bars; i++ {
 		queries := 0
 		blocked := 0
 
-		for j := 0; j < 3; j++ {
-			queries += responseJson.QueriesSeries[i*3+j]
-			blocked += responseJson.BlockedSeries[i*3+j]
+		for j := 0; j < hoursPerBar; j++ {
+			queries += queriesSeries[i*hoursPerBar+j]
+			blocked += blockedSeries[i*hoursPerBar+j]
 		}
 
 		stats.Series[i] = DNSStatsSeries{
-			Queries:        queries,
-			Blocked:        blocked,
-			PercentBlocked: int(float64(blocked) / float64(queries) * 100),
+			Queries: queries,
+			Blocked: blocked,
+		}
+
+		if queries > 0 {
+			stats.Series[i].PercentBlocked = int(float64(blocked) / float64(queries) * 100)
 		}
 
 		if queries > maxQueriesInSeries {
@@ -91,7 +112,7 @@ func FetchAdguardStats(instanceURL, username, password string) (*DNSStats, error
 		}
 	}
 
-	for i := 0; i < 8; i++ {
+	for i := 0; i < bars; i++ {
 		stats.Series[i].PercentTotal = int(float64(stats.Series[i].Queries) / float64(maxQueriesInSeries) * 100)
 	}