diff --git a/cmd/aggregator/aggregator_test.go b/cmd/aggregator/aggregator_test.go index 4c2c58a..29c84fb 100644 --- a/cmd/aggregator/aggregator_test.go +++ b/cmd/aggregator/aggregator_test.go @@ -163,7 +163,7 @@ func TestCacheCoarseRing(t *testing.T) { func TestCacheQueryTopN(t *testing.T) { m := NewMerger() m.Apply(makeSnap("c1", map[string]int64{ - st.EncodeTuple(st.Tuple6{Website: "busy.com", Prefix: "1.0.0.0/24", URI: "/", Status: "200"}): 300, + st.EncodeTuple(st.Tuple6{Website: "busy.com", Prefix: "1.0.0.0/24", URI: "/", Status: "200"}): 300, st.EncodeTuple(st.Tuple6{Website: "quiet.com", Prefix: "2.0.0.0/24", URI: "/", Status: "200"}): 50, })) diff --git a/cmd/aggregator/main.go b/cmd/aggregator/main.go index c581e59..51d87d4 100644 --- a/cmd/aggregator/main.go +++ b/cmd/aggregator/main.go @@ -15,9 +15,9 @@ import ( ) func main() { - listen := flag.String("listen", ":9091", "gRPC listen address") + listen := flag.String("listen", ":9091", "gRPC listen address") collectors := flag.String("collectors", "", "comma-separated collector host:port addresses") - source := flag.String("source", hostname(), "name for this aggregator in responses") + source := flag.String("source", hostname(), "name for this aggregator in responses") flag.Parse() if *collectors == "" { diff --git a/cmd/cli/cli_test.go b/cmd/cli/cli_test.go index 6bdadd0..93dc72e 100644 --- a/cmd/cli/cli_test.go +++ b/cmd/cli/cli_test.go @@ -89,7 +89,10 @@ func TestBuildFilterNil(t *testing.T) { } func TestFmtCount(t *testing.T) { - cases := []struct{ n int64; want string }{ + cases := []struct { + n int64 + want string + }{ {0, "0"}, {999, "999"}, {1000, "1 000"}, diff --git a/cmd/collector/main.go b/cmd/collector/main.go index e6c3229..530ff19 100644 --- a/cmd/collector/main.go +++ b/cmd/collector/main.go @@ -18,12 +18,12 @@ import ( ) func main() { - listen := flag.String("listen", ":9090", "gRPC listen address") - logPaths := flag.String("logs", "", "comma-separated log file paths/globs to tail") - logsFile := flag.String("logs-file", "", "file containing one log path/glob per line") - source := flag.String("source", hostname(), "name for this collector (default: hostname)") - v4prefix := flag.Int("v4prefix", 24, "IPv4 prefix length for client bucketing") - v6prefix := flag.Int("v6prefix", 48, "IPv6 prefix length for client bucketing") + listen := flag.String("listen", ":9090", "gRPC listen address") + logPaths := flag.String("logs", "", "comma-separated log file paths/globs to tail") + logsFile := flag.String("logs-file", "", "file containing one log path/glob per line") + source := flag.String("source", hostname(), "name for this collector (default: hostname)") + v4prefix := flag.Int("v4prefix", 24, "IPv4 prefix length for client bucketing") + v6prefix := flag.Int("v6prefix", 48, "IPv6 prefix length for client bucketing") scanInterval := flag.Duration("scan-interval", 10*time.Second, "how often to rescan glob patterns for new/removed files") flag.Parse() diff --git a/cmd/collector/parser_test.go b/cmd/collector/parser_test.go index 928c556..7d84946 100644 --- a/cmd/collector/parser_test.go +++ b/cmd/collector/parser_test.go @@ -8,10 +8,10 @@ func TestParseLine(t *testing.T) { good := "www.example.com\t1.2.3.4\t1741954800.123\tGET\t/api/v1/search?q=foo&x=1\t200\t1452\t0.043" tests := []struct { - name string - line string - wantOK bool - want LogRecord + name string + line string + wantOK bool + want LogRecord }{ { name: "normal IPv4 line strips query string", @@ -186,7 +186,7 @@ func TestTruncateIP(t *testing.T) { {"1.2.3.4", "1.2.3.0/24"}, {"192.168.100.200", "192.168.100.0/24"}, {"2001:db8:cafe:babe::1", "2001:db8:cafe::/48"}, // /48 = 3 full groups intact - {"::1", "::/48"}, // loopback — first 48 bits are all zero + {"::1", "::/48"}, // loopback — first 48 bits are all zero } for _, tc := range tests { diff --git a/cmd/collector/store.go b/cmd/collector/store.go index 4ee8e8e..81b72ab 100644 --- a/cmd/collector/store.go +++ b/cmd/collector/store.go @@ -4,8 +4,8 @@ import ( "sync" "time" - pb "git.ipng.ch/ipng/nginx-logtail/proto/logtailpb" st "git.ipng.ch/ipng/nginx-logtail/internal/store" + pb "git.ipng.ch/ipng/nginx-logtail/proto/logtailpb" ) const liveMapCap = 100_000 // hard cap on live map entries diff --git a/cmd/collector/store_test.go b/cmd/collector/store_test.go index 8cc8f88..dcccffc 100644 --- a/cmd/collector/store_test.go +++ b/cmd/collector/store_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - pb "git.ipng.ch/ipng/nginx-logtail/proto/logtailpb" st "git.ipng.ch/ipng/nginx-logtail/internal/store" + pb "git.ipng.ch/ipng/nginx-logtail/proto/logtailpb" ) func makeStore() *Store { diff --git a/cmd/collector/tailer.go b/cmd/collector/tailer.go index 1277916..d35d428 100644 --- a/cmd/collector/tailer.go +++ b/cmd/collector/tailer.go @@ -54,7 +54,7 @@ func (mt *MultiTailer) Run(ctx context.Context) { } defer watcher.Close() - files := make(map[string]*fileState) + files := make(map[string]*fileState) retrying := make(map[string]struct{}) // paths currently in a retryOpen goroutine reopenCh := make(chan reopenMsg, 32) diff --git a/cmd/frontend/main.go b/cmd/frontend/main.go index 54ac240..bb32522 100644 --- a/cmd/frontend/main.go +++ b/cmd/frontend/main.go @@ -16,9 +16,9 @@ import ( var templatesFS embed.FS func main() { - listen := flag.String("listen", ":8080", "HTTP listen address") - target := flag.String("target", "localhost:9091", "default gRPC endpoint (aggregator or collector)") - n := flag.Int("n", 25, "default number of table rows") + listen := flag.String("listen", ":8080", "HTTP listen address") + target := flag.String("target", "localhost:9091", "default gRPC endpoint (aggregator or collector)") + n := flag.Int("n", 25, "default number of table rows") refresh := flag.Int("refresh", 30, "meta-refresh interval in seconds (0 = disabled)") flag.Parse() diff --git a/internal/store/store.go b/internal/store/store.go index d28599e..74b222f 100644 --- a/internal/store/store.go +++ b/internal/store/store.go @@ -14,11 +14,11 @@ import ( // Ring-buffer dimensions — shared between collector and aggregator. const ( - FineRingSize = 60 // 60 × 1-min buckets → 1 hour - CoarseRingSize = 288 // 288 × 5-min buckets → 24 hours - FineTopK = 50_000 // entries kept per fine snapshot - CoarseTopK = 5_000 // entries kept per coarse snapshot - CoarseEvery = 5 // fine ticks between coarse writes + FineRingSize = 60 // 60 × 1-min buckets → 1 hour + CoarseRingSize = 288 // 288 × 5-min buckets → 24 hours + FineTopK = 50_000 // entries kept per fine snapshot + CoarseTopK = 5_000 // entries kept per coarse snapshot + CoarseEvery = 5 // fine ticks between coarse writes ) // Tuple6 is the aggregation key (website, prefix, URI, status, is_tor, asn).