API /stats_top -- show only top entries for last 3 minutes

This commit is contained in:
Eugene Bujak 2018-09-07 17:49:33 +03:00
parent 38b3fe6718
commit 8198b65f29
2 changed files with 25 additions and 0 deletions

View File

@ -409,6 +409,9 @@ func handleStatsTop(w http.ResponseWriter, r *http.Request) {
domains := map[string]int{} domains := map[string]int{}
blocked := map[string]int{} blocked := map[string]int{}
clients := map[string]int{} clients := map[string]int{}
now := time.Now()
timeWindow := time.Minute * 3
notBefore := now.Add(timeWindow * -1)
for _, value := range values { for _, value := range values {
entry, ok := value.(map[string]interface{}) entry, ok := value.(map[string]interface{})
@ -419,6 +422,11 @@ func handleStatsTop(w http.ResponseWriter, r *http.Request) {
host := getHost(entry) host := getHost(entry)
reason := getReason(entry) reason := getReason(entry)
client := getClient(entry) client := getClient(entry)
time := getTime(entry)
if time.Before(notBefore) {
// skip if the entry is before specified cutoff
continue
}
if len(host) > 0 { if len(host) > 0 {
domains[host]++ domains[host]++
} }

View File

@ -7,6 +7,7 @@ import (
"net/http" "net/http"
"sort" "sort"
"strings" "strings"
"time"
) )
func clamp(value, low, high int) int { func clamp(value, low, high int) int {
@ -167,6 +168,22 @@ func getClient(entry map[string]interface{}) string {
return client return client
} }
func getTime(entry map[string]interface{}) time.Time {
t, ok := entry["time"]
if !ok {
return time.Time{}
}
tstr, ok := t.(string)
if !ok {
return time.Time{}
}
value, err := time.Parse(time.RFC3339, tstr)
if err != nil {
return time.Time{}
}
return value
}
// ------------------------------------------------- // -------------------------------------------------
// helper functions for parsing parameters from body // helper functions for parsing parameters from body
// ------------------------------------------------- // -------------------------------------------------