feat: use a in memory map to count requests for ips and log the n most active each hour

This commit is contained in:
crapStone 2025-06-13 23:18:01 +02:00
parent 023ea17492
commit b22d3665a9
No known key found for this signature in database
GPG key ID: 22D4BF0CF7CC29C8
7 changed files with 74 additions and 20 deletions

View file

@ -7,7 +7,9 @@ import (
"net"
"net/http"
"os"
"sort"
"strings"
"sync"
"time"
"github.com/pires/go-proxyproto"
@ -135,8 +137,41 @@ func Serve(ctx *cli.Context) error {
StartProfilingServer(ctx.String("profiling-address"))
}
mostActiveIpMap := &sync.Map{}
if cfg.Server.LogMostActiveIps {
go func() {
ticker := time.NewTicker(1 * time.Hour)
for range ticker.C {
type kv struct {
Key string
Value uint
}
var kvArray []kv
mostActiveIpMap.Range(func(k, v any) bool {
kvArray = append(kvArray, kv{k.(string), v.(uint)})
return true
})
mostActiveIpMap.Clear()
sort.Slice(kvArray, func(i, j int) bool {
return kvArray[i].Value > kvArray[j].Value
})
builder := strings.Builder{}
var item kv
for i := uint(0); i < cfg.Server.MostActiveIpCount; i++ {
item = kvArray[i]
builder.WriteString(fmt.Sprintf("\n%s, %d", item.Key, item.Value))
}
log.Log().Msg(fmt.Sprintf("%d most active IPs:%s", cfg.Server.MostActiveIpCount, builder.String()))
}
}()
}
// Create ssl handler based on settings
sslHandler := handler.Handler(cfg.Server, giteaClient, canonicalDomainCache, redirectsCache)
sslHandler := handler.Handler(cfg.Server, giteaClient, canonicalDomainCache, redirectsCache, mostActiveIpMap)
// Start the ssl listener
log.Info().Msgf("Start SSL server using TCP listener on %s", listener.Addr())