From e96ede32ae60a1eb37141375afc413db7d1e2f3d4e6a9c3579474e778853dd23 Mon Sep 17 00:00:00 2001 From: Lixen Wraith Date: Fri, 17 Jul 2026 06:49:40 -0400 Subject: [PATCH] v0.13.1 folder restructure, test script added, format adapter async fix --- .gitignore | 1 + Makefile | 12 +- {src/cmd => cmd}/logwisp/bootstrap.go | 32 +-- {src/cmd => cmd}/logwisp/help.go | 2 +- {src/cmd => cmd}/logwisp/main.go | 6 +- {src/cmd => cmd}/logwisp/output.go | 0 {src/cmd => cmd}/logwisp/status.go | 2 +- doc/installation.md | 2 +- go.sum | 64 +---- {src/internal => internal}/chain/proto.go | 2 +- {src/internal => internal}/config/config.go | 0 {src/internal => internal}/config/loader.go | 2 +- {src/internal => internal}/config/validate.go | 0 {src/internal => internal}/core/capability.go | 0 {src/internal => internal}/core/const.go | 0 {src/internal => internal}/core/flow.go | 0 {src/internal => internal}/filter/chain.go | 4 +- {src/internal => internal}/filter/filter.go | 4 +- {src/internal => internal}/flow/flow.go | 8 +- {src/internal => internal}/flow/heartbeat.go | 6 +- .../internal => internal}/flow/ratelimiter.go | 6 +- {src/internal => internal}/format/adapter.go | 31 ++- {src/internal => internal}/format/format.go | 4 +- .../pipeline/pipeline.go | 12 +- .../pipeline/registry.go | 8 +- {src/internal => internal}/plugin/factory.go | 8 +- .../sanitize/sanitize.go | 0 {src/internal => internal}/service/service.go | 4 +- {src/internal => internal}/session/proxy.go | 0 {src/internal => internal}/session/session.go | 2 +- .../sink/console/console.go | 10 +- {src/internal => internal}/sink/file/file.go | 10 +- {src/internal => internal}/sink/http/http.go | 12 +- .../sink/httpchain/httpchain.go | 12 +- {src/internal => internal}/sink/null/null.go | 8 +- {src/internal => internal}/sink/sink.go | 2 +- {src/internal => internal}/sink/tcp/tcp.go | 10 +- .../sink/tcpchain/tcpchain.go | 12 +- .../source/console/console.go | 10 +- .../internal => internal}/source/file/file.go | 10 +- .../source/file/file_watcher.go | 4 +- .../source/httpchain/httpchain.go | 12 +- .../internal => internal}/source/null/null.go | 8 +- .../source/random/random.go | 10 +- {src/internal => internal}/source/source.go | 2 +- .../source/tcpchain/tcpchain.go | 12 +- .../tokenbucket/bucket.go | 0 {src/internal => internal}/version/version.go | 0 test/chain-test.sh | 242 ++++++++++++++++++ 49 files changed, 402 insertions(+), 206 deletions(-) rename {src/cmd => cmd}/logwisp/bootstrap.go (89%) rename {src/cmd => cmd}/logwisp/help.go (98%) rename {src/cmd => cmd}/logwisp/main.go (97%) rename {src/cmd => cmd}/logwisp/output.go (100%) rename {src/cmd => cmd}/logwisp/status.go (99%) rename {src/internal => internal}/chain/proto.go (98%) rename {src/internal => internal}/config/config.go (100%) rename {src/internal => internal}/config/loader.go (99%) rename {src/internal => internal}/config/validate.go (100%) rename {src/internal => internal}/core/capability.go (100%) rename {src/internal => internal}/core/const.go (100%) rename {src/internal => internal}/core/flow.go (100%) rename {src/internal => internal}/filter/chain.go (96%) rename {src/internal => internal}/filter/filter.go (98%) rename {src/internal => internal}/flow/flow.go (96%) rename {src/internal => internal}/flow/heartbeat.go (97%) rename {src/internal => internal}/flow/ratelimiter.go (96%) rename {src/internal => internal}/format/adapter.go (87%) rename {src/internal => internal}/format/format.go (91%) rename {src/internal => internal}/pipeline/pipeline.go (98%) rename {src/internal => internal}/pipeline/registry.go (97%) rename {src/internal => internal}/plugin/factory.go (97%) rename {src/internal => internal}/sanitize/sanitize.go (100%) rename {src/internal => internal}/service/service.go (98%) rename {src/internal => internal}/session/proxy.go (100%) rename {src/internal => internal}/session/session.go (99%) rename {src/internal => internal}/sink/console/console.go (96%) rename {src/internal => internal}/sink/file/file.go (97%) rename {src/internal => internal}/sink/http/http.go (98%) rename {src/internal => internal}/sink/httpchain/httpchain.go (98%) rename {src/internal => internal}/sink/null/null.go (96%) rename {src/internal => internal}/sink/sink.go (96%) rename {src/internal => internal}/sink/tcp/tcp.go (98%) rename {src/internal => internal}/sink/tcpchain/tcpchain.go (98%) rename {src/internal => internal}/source/console/console.go (97%) rename {src/internal => internal}/source/file/file.go (98%) rename {src/internal => internal}/source/file/file_watcher.go (99%) rename {src/internal => internal}/source/httpchain/httpchain.go (97%) rename {src/internal => internal}/source/null/null.go (95%) rename {src/internal => internal}/source/random/random.go (98%) rename {src/internal => internal}/source/source.go (98%) rename {src/internal => internal}/source/tcpchain/tcpchain.go (97%) rename {src/internal => internal}/tokenbucket/bucket.go (100%) rename {src/internal => internal}/version/version.go (100%) create mode 100755 test/chain-test.sh diff --git a/.gitignore b/.gitignore index cebbce6..602ecb9 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ build/ build.sh catalog.txt combined.txt +test/run/ diff --git a/Makefile b/Makefile index a2f0821..824fa4a 100644 --- a/Makefile +++ b/Makefile @@ -11,9 +11,9 @@ BUILD_TIME != date -u '+%Y-%m-%d_%H:%M:%S' # Go build variables GO = go GOFLAGS = -LDFLAGS = -X 'logwisp/src/internal/version.Version=$(VERSION)' \ - -X 'logwisp/src/internal/version.GitCommit=$(GIT_COMMIT)' \ - -X 'logwisp/src/internal/version.BuildTime=$(BUILD_TIME)' +LDFLAGS = -X 'logwisp/internal/version.Version=$(VERSION)' \ + -X 'logwisp/internal/version.GitCommit=$(GIT_COMMIT)' \ + -X 'logwisp/internal/version.BuildTime=$(BUILD_TIME)' # Installation directories PREFIX ?= /usr/local @@ -25,7 +25,7 @@ all: build # Build the binary build: mkdir -p $(BUILD_DIR) - $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BINARY_PATH) ./src/cmd/logwisp + $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BINARY_PATH) ./cmd/logwisp # Install the binary install: build @@ -41,7 +41,7 @@ clean: # Development build with race detector dev: - $(GO) build $(GOFLAGS) -race -ldflags "$(LDFLAGS)" -o $(BINARY_PATH) ./src/cmd/logwisp + $(GO) build $(GOFLAGS) -race -ldflags "$(LDFLAGS)" -o $(BINARY_PATH) ./cmd/logwisp # Show current version version: @@ -49,4 +49,4 @@ version: @echo "Commit: $(GIT_COMMIT)" @echo "Build Time: $(BUILD_TIME)" -.PHONY: all build install uninstall clean dev version \ No newline at end of file +.PHONY: all build install uninstall clean dev version diff --git a/src/cmd/logwisp/bootstrap.go b/cmd/logwisp/bootstrap.go similarity index 89% rename from src/cmd/logwisp/bootstrap.go rename to cmd/logwisp/bootstrap.go index c5acb30..ac861bf 100644 --- a/src/cmd/logwisp/bootstrap.go +++ b/cmd/logwisp/bootstrap.go @@ -4,24 +4,24 @@ import ( "context" "fmt" - _ "logwisp/src/internal/source/console" - _ "logwisp/src/internal/source/file" - _ "logwisp/src/internal/source/httpchain" - _ "logwisp/src/internal/source/null" - _ "logwisp/src/internal/source/random" - _ "logwisp/src/internal/source/tcpchain" + _ "logwisp/internal/source/console" + _ "logwisp/internal/source/file" + _ "logwisp/internal/source/httpchain" + _ "logwisp/internal/source/null" + _ "logwisp/internal/source/random" + _ "logwisp/internal/source/tcpchain" - _ "logwisp/src/internal/sink/console" - _ "logwisp/src/internal/sink/file" - _ "logwisp/src/internal/sink/http" - _ "logwisp/src/internal/sink/httpchain" - _ "logwisp/src/internal/sink/null" - _ "logwisp/src/internal/sink/tcp" - _ "logwisp/src/internal/sink/tcpchain" + _ "logwisp/internal/sink/console" + _ "logwisp/internal/sink/file" + _ "logwisp/internal/sink/http" + _ "logwisp/internal/sink/httpchain" + _ "logwisp/internal/sink/null" + _ "logwisp/internal/sink/tcp" + _ "logwisp/internal/sink/tcpchain" - "logwisp/src/internal/config" - "logwisp/src/internal/service" - "logwisp/src/internal/version" + "logwisp/internal/config" + "logwisp/internal/service" + "logwisp/internal/version" "github.com/lixenwraith/log" "github.com/lixenwraith/log/sanitizer" diff --git a/src/cmd/logwisp/help.go b/cmd/logwisp/help.go similarity index 98% rename from src/cmd/logwisp/help.go rename to cmd/logwisp/help.go index aacfc1f..fcdfdbb 100644 --- a/src/cmd/logwisp/help.go +++ b/cmd/logwisp/help.go @@ -2,7 +2,7 @@ package main import ( "fmt" - "logwisp/src/internal/version" + "logwisp/internal/version" "os" ) diff --git a/src/cmd/logwisp/main.go b/cmd/logwisp/main.go similarity index 97% rename from src/cmd/logwisp/main.go rename to cmd/logwisp/main.go index 776c463..56ed3b5 100644 --- a/src/cmd/logwisp/main.go +++ b/cmd/logwisp/main.go @@ -8,9 +8,9 @@ import ( "strings" "syscall" - "logwisp/src/internal/config" - "logwisp/src/internal/core" - "logwisp/src/internal/version" + "logwisp/internal/config" + "logwisp/internal/core" + "logwisp/internal/version" "github.com/lixenwraith/log" ) diff --git a/src/cmd/logwisp/output.go b/cmd/logwisp/output.go similarity index 100% rename from src/cmd/logwisp/output.go rename to cmd/logwisp/output.go diff --git a/src/cmd/logwisp/status.go b/cmd/logwisp/status.go similarity index 99% rename from src/cmd/logwisp/status.go rename to cmd/logwisp/status.go index 56bea25..bb8e483 100644 --- a/src/cmd/logwisp/status.go +++ b/cmd/logwisp/status.go @@ -5,7 +5,7 @@ import ( "fmt" "time" - "logwisp/src/internal/service" + "logwisp/internal/service" ) // startStatusReporter starts a new status reporter for a service and returns its cancel function. diff --git a/doc/installation.md b/doc/installation.md index 4d95374..393bea2 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -36,7 +36,7 @@ sudo install -m 755 logwisp /usr/local/bin/ Install directly using Go (version information will not be embedded): ```bash -go install github.com/yourusername/logwisp/src/cmd/logwisp@latest +go install github.com/yourusername/logwisp/cmd/logwisp@latest ``` ## Service Configuration diff --git a/go.sum b/go.sum index cf405da..4871b2b 100644 --- a/go.sum +++ b/go.sum @@ -1,63 +1,27 @@ github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= -github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= -github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= -github.com/andybalholm/brotli v1.2.1 h1:R+f5xP285VArJDRgowrfb9DqL18yVK0gKAW/F+eTWro= -github.com/andybalholm/brotli v1.2.1/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/andybalholm/brotli v1.2.2 h1:HzTuoo2ErYQqf5qvcJInB8uvqSVxRttzkFexPWtnceM= github.com/andybalholm/brotli v1.2.2/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= -github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co= -github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0= -github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk= -github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= -github.com/klauspost/compress v1.18.3 h1:9PJRvfbmTabkOX8moIpXPbMMbYN60bWImDDU7L+/6zw= -github.com/klauspost/compress v1.18.3/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= -github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c= -github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= -github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= -github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/klauspost/compress v1.19.0 h1:sXLILfc9jV2QYWkzFOPWStmcUVH2RHEB1JCdY2oVvCQ= github.com/klauspost/compress v1.19.0/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= -github.com/lixenwraith/config v0.1.1-0.20251114180219-f7875023a51b h1:TzTV0ArJ+nzVGPN8aiEJ2MknUqJdmHRP/0/RSfov2Qw= -github.com/lixenwraith/config v0.1.1-0.20251114180219-f7875023a51b/go.mod h1:roNPTSCT5HSV9dru/zi/Catwc3FZVCFf7vob2pSlNW0= github.com/lixenwraith/config v0.1.1-0.20260712172228-ccd280ba6a98 h1:VEFo2WsYgM5YYfzAfvXRKigCWr3zEz6h4M59N5TXMpk= github.com/lixenwraith/config v0.1.1-0.20260712172228-ccd280ba6a98/go.mod h1:J9ydxY7he4Dz+S59xKs/kDQ2YAv+zOLF05b3Rr2/ogE= -github.com/lixenwraith/log v0.1.1-0.20251115213227-55d2c92d483f h1:X2LX5FQEuWYGBS3qp5z7XxBB1sWAlqumf/oW7n/f9c0= -github.com/lixenwraith/log v0.1.1-0.20251115213227-55d2c92d483f/go.mod h1:XcRPRuijAs+43Djk8VmioUJhcK8irRzUjCZaZqkd3gg= github.com/lixenwraith/log v0.1.1-0.20251117213308-9ae1b6669bf3 h1:brSUhER7EZ28aMRFTSovZskiIoobUiAWlx+DYXYvWXQ= github.com/lixenwraith/log v0.1.1-0.20251117213308-9ae1b6669bf3/go.mod h1:MY59N65ltw/9uTqJKwCRKjxO6w3CApXsLXCVuaekbu0= -github.com/panjf2000/ants/v2 v2.11.3 h1:AfI0ngBoXJmYOpDh9m516vjqoUu2sLrIVgppI9TZVpg= -github.com/panjf2000/ants/v2 v2.11.3/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek= -github.com/panjf2000/ants/v2 v2.11.4 h1:UJQbtN1jIcI5CYNocTj0fuAUYvsLjPoYi0YuhqV/Y48= -github.com/panjf2000/ants/v2 v2.11.4/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek= -github.com/panjf2000/ants/v2 v2.11.5 h1:a7LMnMEeux/ebqTux140tRiaqcFTV0q2bEHF03nl6Rg= -github.com/panjf2000/ants/v2 v2.11.5/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek= github.com/panjf2000/ants/v2 v2.12.1 h1:BWvU2wHpyXWxhhNXsGB6JXLCNbshyLd1QxvoAmZnu10= github.com/panjf2000/ants/v2 v2.12.1/go.mod h1:tSQuaNQ6r6NRhPt+IZVUevvDyFMTs+eS4ztZc52uJTY= -github.com/panjf2000/gnet/v2 v2.9.7 h1:6zW7Jl3oAfXwSuh1PxHLndoL2MQRWx0AJR6aaQjxUgA= -github.com/panjf2000/gnet/v2 v2.9.7/go.mod h1:WQTxDWYuQ/hz3eccH0FN32IVuvZ19HewEWx0l62fx7E= -github.com/panjf2000/gnet/v2 v2.9.8 h1:OzVnIKm4UMoGphWgypcVZMq8roVjXzXOZvLdyZHxvkE= -github.com/panjf2000/gnet/v2 v2.9.8/go.mod h1:f9wdbOFsdbZqlSvXctWbPRW5bB/W++q8Zqz+D7tQIVQ= github.com/panjf2000/gnet/v2 v2.10.0 h1:rC4jNF+jtXj/FH+8JOIQ3XxjD+yBunYBLKg9TE3dc4g= github.com/panjf2000/gnet/v2 v2.10.0/go.mod h1:f9wdbOFsdbZqlSvXctWbPRW5bB/W++q8Zqz+D7tQIVQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.68.0 h1:v12Nx16iepr8r9ySOwqI+5RBJ/DqTxhOy1HrHoDFnok= -github.com/valyala/fasthttp v1.68.0/go.mod h1:5EXiRfYQAoiO/khu4oU9VISC/eVY6JqmSpPJoHCKsz4= -github.com/valyala/fasthttp v1.69.0 h1:fNLLESD2SooWeh2cidsuFtOcrEi4uB4m1mPrkJMZyVI= -github.com/valyala/fasthttp v1.69.0/go.mod h1:4wA4PfAraPlAsJ5jMSqCE2ug5tqUPwKXxVj8oNECGcw= -github.com/valyala/fasthttp v1.71.0 h1:tepR7H+Guh9VUqxxcPggYi8R3lGUu2Rsdh+z7/FCY3k= -github.com/valyala/fasthttp v1.71.0/go.mod h1:z1sDUvOShhXq/C9mwH/fSm1Vb71tUJwmQdgkBrBNwnA= github.com/valyala/fasthttp v1.72.0 h1:R7kYdoWhn1ye1fVpP+cDHDJwYm3NkwLliwgzJ/Abg7M= github.com/valyala/fasthttp v1.72.0/go.mod h1:zsbLTYqcpIktdQytlVBwIjY9La5d6bs990nBxWg8efk= github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= @@ -66,32 +30,12 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= -go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go.uber.org/zap v1.28.0 h1:IZzaP1Fv73/T/pBMLk4VutPl36uNC+OSUh3JLG3FIjo= go.uber.org/zap v1.28.0/go.mod h1:rDLpOi171uODNm/mxFcuYWxDsqWSAVkFdX4XojSKg/Q= -golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= -golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= -golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= -golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= -golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= -golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= -golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= -golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= -golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= -golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= -golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= diff --git a/src/internal/chain/proto.go b/internal/chain/proto.go similarity index 98% rename from src/internal/chain/proto.go rename to internal/chain/proto.go index eaeecbb..e3f26ab 100644 --- a/src/internal/chain/proto.go +++ b/internal/chain/proto.go @@ -3,7 +3,7 @@ package chain import ( "encoding/json" "fmt" - "logwisp/src/internal/core" + "logwisp/internal/core" "math/rand/v2" "time" ) diff --git a/src/internal/config/config.go b/internal/config/config.go similarity index 100% rename from src/internal/config/config.go rename to internal/config/config.go diff --git a/src/internal/config/loader.go b/internal/config/loader.go similarity index 99% rename from src/internal/config/loader.go rename to internal/config/loader.go index 7bad3e5..603fa05 100644 --- a/src/internal/config/loader.go +++ b/internal/config/loader.go @@ -7,7 +7,7 @@ import ( "path/filepath" "strings" - "logwisp/src/internal/core" + "logwisp/internal/core" lconfig "github.com/lixenwraith/config" ) diff --git a/src/internal/config/validate.go b/internal/config/validate.go similarity index 100% rename from src/internal/config/validate.go rename to internal/config/validate.go diff --git a/src/internal/core/capability.go b/internal/core/capability.go similarity index 100% rename from src/internal/core/capability.go rename to internal/core/capability.go diff --git a/src/internal/core/const.go b/internal/core/const.go similarity index 100% rename from src/internal/core/const.go rename to internal/core/const.go diff --git a/src/internal/core/flow.go b/internal/core/flow.go similarity index 100% rename from src/internal/core/flow.go rename to internal/core/flow.go diff --git a/src/internal/filter/chain.go b/internal/filter/chain.go similarity index 96% rename from src/internal/filter/chain.go rename to internal/filter/chain.go index 27ffe34..f30dfa3 100644 --- a/src/internal/filter/chain.go +++ b/internal/filter/chain.go @@ -4,8 +4,8 @@ import ( "fmt" "sync/atomic" - "logwisp/src/internal/config" - "logwisp/src/internal/core" + "logwisp/internal/config" + "logwisp/internal/core" "github.com/lixenwraith/log" ) diff --git a/src/internal/filter/filter.go b/internal/filter/filter.go similarity index 98% rename from src/internal/filter/filter.go rename to internal/filter/filter.go index 8c9da39..bf17a23 100644 --- a/src/internal/filter/filter.go +++ b/internal/filter/filter.go @@ -6,8 +6,8 @@ import ( "sync" "sync/atomic" - "logwisp/src/internal/config" - "logwisp/src/internal/core" + "logwisp/internal/config" + "logwisp/internal/core" lconfig "github.com/lixenwraith/config" "github.com/lixenwraith/log" diff --git a/src/internal/flow/flow.go b/internal/flow/flow.go similarity index 96% rename from src/internal/flow/flow.go rename to internal/flow/flow.go index 348b8d8..98014a7 100644 --- a/src/internal/flow/flow.go +++ b/internal/flow/flow.go @@ -5,10 +5,10 @@ import ( "fmt" "sync/atomic" - "logwisp/src/internal/config" - "logwisp/src/internal/core" - "logwisp/src/internal/filter" - "logwisp/src/internal/format" + "logwisp/internal/config" + "logwisp/internal/core" + "logwisp/internal/filter" + "logwisp/internal/format" "github.com/lixenwraith/log" ) diff --git a/src/internal/flow/heartbeat.go b/internal/flow/heartbeat.go similarity index 97% rename from src/internal/flow/heartbeat.go rename to internal/flow/heartbeat.go index c7821f7..e723aea 100644 --- a/src/internal/flow/heartbeat.go +++ b/internal/flow/heartbeat.go @@ -8,9 +8,9 @@ import ( "sync/atomic" "time" - "logwisp/src/internal/config" - "logwisp/src/internal/core" - "logwisp/src/internal/format" + "logwisp/internal/config" + "logwisp/internal/core" + "logwisp/internal/format" lconfig "github.com/lixenwraith/config" "github.com/lixenwraith/log" diff --git a/src/internal/flow/ratelimiter.go b/internal/flow/ratelimiter.go similarity index 96% rename from src/internal/flow/ratelimiter.go rename to internal/flow/ratelimiter.go index 9e56778..e7f95b9 100644 --- a/src/internal/flow/ratelimiter.go +++ b/internal/flow/ratelimiter.go @@ -5,9 +5,9 @@ import ( "strings" "sync/atomic" - "logwisp/src/internal/config" - "logwisp/src/internal/core" - "logwisp/src/internal/tokenbucket" + "logwisp/internal/config" + "logwisp/internal/core" + "logwisp/internal/tokenbucket" lconfig "github.com/lixenwraith/config" "github.com/lixenwraith/log" diff --git a/src/internal/format/adapter.go b/internal/format/adapter.go similarity index 87% rename from src/internal/format/adapter.go rename to internal/format/adapter.go index f817f94..d6e1595 100644 --- a/src/internal/format/adapter.go +++ b/internal/format/adapter.go @@ -1,11 +1,13 @@ package format import ( + "bytes" "encoding/json" "fmt" + "sync" - "logwisp/src/internal/config" - "logwisp/src/internal/core" + "logwisp/internal/config" + "logwisp/internal/core" lconfig "github.com/lixenwraith/config" "github.com/lixenwraith/log/formatter" @@ -21,6 +23,7 @@ type FormatterAdapter struct { formatter *formatter.Formatter format string flags int64 + mu sync.Mutex // formatter reuses internal buffer, not goroutine-safe } // NewFormatterAdapter creates adapter from config @@ -94,6 +97,7 @@ func (a *FormatterAdapter) Format(entry core.LogEntry) ([]byte, error) { // Build args based on whether we have structured fields var args []any + effectiveFlags := a.flags if len(entry.Fields) > 0 { // Parse fields JSON @@ -102,14 +106,18 @@ func (a *FormatterAdapter) Format(entry core.LogEntry) ([]byte, error) { // Use structured JSON format for fields args = []any{entry.Message, fields} // Add structured flag to properly format fields as JSON object - effectiveFlags := a.flags | formatter.FlagStructuredJSON + effectiveFlags |= formatter.FlagStructuredJSON return a.formatter.Format(effectiveFlags, entry.Time, level, src, args), nil } } + if args == nil { + args = []any{entry.Message} + } - // Simple message without fields - args = []any{entry.Message} - return a.formatter.Format(a.flags, entry.Time, level, src, args), nil + a.mu.Lock() + out := bytes.Clone(a.formatter.Format(effectiveFlags, entry.Time, level, src, args)) + a.mu.Unlock() + return out, nil } // FormatWithFlags allows custom flags for specific formatting needs @@ -123,14 +131,16 @@ func (a *FormatterAdapter) FormatWithFlags(entry core.LogEntry, customFlags int6 if err := json.Unmarshal(entry.Fields, &fields); err == nil && len(fields) > 0 { args = []any{entry.Message, fields} customFlags |= formatter.FlagStructuredJSON - } else { - args = []any{entry.Message} } - } else { + } + if args == nil { args = []any{entry.Message} } - return a.formatter.Format(customFlags, entry.Time, level, src, args), nil + a.mu.Lock() + out := bytes.Clone(a.formatter.Format(customFlags, entry.Time, level, src, args)) + a.mu.Unlock() + return out, nil } // Name returns formatter type @@ -161,4 +171,3 @@ func sourceLabel(entry core.LogEntry) string { } return entry.Node + "/" + entry.Source } - diff --git a/src/internal/format/format.go b/internal/format/format.go similarity index 91% rename from src/internal/format/format.go rename to internal/format/format.go index 6a3ea81..bdb47eb 100644 --- a/src/internal/format/format.go +++ b/internal/format/format.go @@ -1,8 +1,8 @@ package format import ( - "logwisp/src/internal/config" - "logwisp/src/internal/core" + "logwisp/internal/config" + "logwisp/internal/core" ) // Formatter defines the interface for transforming a LogEntry into a byte slice diff --git a/src/internal/pipeline/pipeline.go b/internal/pipeline/pipeline.go similarity index 98% rename from src/internal/pipeline/pipeline.go rename to internal/pipeline/pipeline.go index 06265fc..9e5d1e4 100644 --- a/src/internal/pipeline/pipeline.go +++ b/internal/pipeline/pipeline.go @@ -7,12 +7,12 @@ import ( "sync/atomic" "time" - "logwisp/src/internal/config" - "logwisp/src/internal/core" - "logwisp/src/internal/flow" - "logwisp/src/internal/session" - "logwisp/src/internal/sink" - "logwisp/src/internal/source" + "logwisp/internal/config" + "logwisp/internal/core" + "logwisp/internal/flow" + "logwisp/internal/session" + "logwisp/internal/sink" + "logwisp/internal/source" "github.com/lixenwraith/log" ) diff --git a/src/internal/pipeline/registry.go b/internal/pipeline/registry.go similarity index 97% rename from src/internal/pipeline/registry.go rename to internal/pipeline/registry.go index 4204819..bd1bddd 100644 --- a/src/internal/pipeline/registry.go +++ b/internal/pipeline/registry.go @@ -4,10 +4,10 @@ import ( "fmt" "sync" - "logwisp/src/internal/plugin" - "logwisp/src/internal/session" - "logwisp/src/internal/sink" - "logwisp/src/internal/source" + "logwisp/internal/plugin" + "logwisp/internal/session" + "logwisp/internal/sink" + "logwisp/internal/source" "github.com/lixenwraith/log" ) diff --git a/src/internal/plugin/factory.go b/internal/plugin/factory.go similarity index 97% rename from src/internal/plugin/factory.go rename to internal/plugin/factory.go index 7ea1287..e530031 100644 --- a/src/internal/plugin/factory.go +++ b/internal/plugin/factory.go @@ -4,10 +4,10 @@ import ( "fmt" "sync" - "logwisp/src/internal/core" - "logwisp/src/internal/session" - "logwisp/src/internal/sink" - "logwisp/src/internal/source" + "logwisp/internal/core" + "logwisp/internal/session" + "logwisp/internal/sink" + "logwisp/internal/source" "github.com/lixenwraith/log" ) diff --git a/src/internal/sanitize/sanitize.go b/internal/sanitize/sanitize.go similarity index 100% rename from src/internal/sanitize/sanitize.go rename to internal/sanitize/sanitize.go diff --git a/src/internal/service/service.go b/internal/service/service.go similarity index 98% rename from src/internal/service/service.go rename to internal/service/service.go index f48d3ef..965ead6 100644 --- a/src/internal/service/service.go +++ b/internal/service/service.go @@ -6,8 +6,8 @@ import ( "fmt" "sync" - "logwisp/src/internal/config" - "logwisp/src/internal/pipeline" + "logwisp/internal/config" + "logwisp/internal/pipeline" "github.com/lixenwraith/log" ) diff --git a/src/internal/session/proxy.go b/internal/session/proxy.go similarity index 100% rename from src/internal/session/proxy.go rename to internal/session/proxy.go diff --git a/src/internal/session/session.go b/internal/session/session.go similarity index 99% rename from src/internal/session/session.go rename to internal/session/session.go index ed09f5f..d45cb79 100644 --- a/src/internal/session/session.go +++ b/internal/session/session.go @@ -7,7 +7,7 @@ import ( "sync" "time" - "logwisp/src/internal/core" + "logwisp/internal/core" ) // Session represents a connection session diff --git a/src/internal/sink/console/console.go b/internal/sink/console/console.go similarity index 96% rename from src/internal/sink/console/console.go rename to internal/sink/console/console.go index b03ecba..b04e547 100644 --- a/src/internal/sink/console/console.go +++ b/internal/sink/console/console.go @@ -8,11 +8,11 @@ import ( "sync/atomic" "time" - "logwisp/src/internal/config" - "logwisp/src/internal/core" - "logwisp/src/internal/plugin" - "logwisp/src/internal/session" - "logwisp/src/internal/sink" + "logwisp/internal/config" + "logwisp/internal/core" + "logwisp/internal/plugin" + "logwisp/internal/session" + "logwisp/internal/sink" lconfig "github.com/lixenwraith/config" "github.com/lixenwraith/log" diff --git a/src/internal/sink/file/file.go b/internal/sink/file/file.go similarity index 97% rename from src/internal/sink/file/file.go rename to internal/sink/file/file.go index 088778d..80c6b91 100644 --- a/src/internal/sink/file/file.go +++ b/internal/sink/file/file.go @@ -6,11 +6,11 @@ import ( "sync/atomic" "time" - "logwisp/src/internal/config" - "logwisp/src/internal/core" - "logwisp/src/internal/plugin" - "logwisp/src/internal/session" - "logwisp/src/internal/sink" + "logwisp/internal/config" + "logwisp/internal/core" + "logwisp/internal/plugin" + "logwisp/internal/session" + "logwisp/internal/sink" lconfig "github.com/lixenwraith/config" "github.com/lixenwraith/log" diff --git a/src/internal/sink/http/http.go b/internal/sink/http/http.go similarity index 98% rename from src/internal/sink/http/http.go rename to internal/sink/http/http.go index 9d204c1..2e12762 100644 --- a/src/internal/sink/http/http.go +++ b/internal/sink/http/http.go @@ -10,12 +10,12 @@ import ( "sync/atomic" "time" - "logwisp/src/internal/config" - "logwisp/src/internal/core" - "logwisp/src/internal/plugin" - "logwisp/src/internal/session" - "logwisp/src/internal/sink" - "logwisp/src/internal/version" + "logwisp/internal/config" + "logwisp/internal/core" + "logwisp/internal/plugin" + "logwisp/internal/session" + "logwisp/internal/sink" + "logwisp/internal/version" lconfig "github.com/lixenwraith/config" "github.com/lixenwraith/log" diff --git a/src/internal/sink/httpchain/httpchain.go b/internal/sink/httpchain/httpchain.go similarity index 98% rename from src/internal/sink/httpchain/httpchain.go rename to internal/sink/httpchain/httpchain.go index 3bd065a..5dbbfaf 100644 --- a/src/internal/sink/httpchain/httpchain.go +++ b/internal/sink/httpchain/httpchain.go @@ -15,12 +15,12 @@ import ( "sync/atomic" "time" - "logwisp/src/internal/chain" - "logwisp/src/internal/config" - "logwisp/src/internal/core" - "logwisp/src/internal/plugin" - "logwisp/src/internal/session" - "logwisp/src/internal/sink" + "logwisp/internal/chain" + "logwisp/internal/config" + "logwisp/internal/core" + "logwisp/internal/plugin" + "logwisp/internal/session" + "logwisp/internal/sink" lconfig "github.com/lixenwraith/config" "github.com/lixenwraith/log" diff --git a/src/internal/sink/null/null.go b/internal/sink/null/null.go similarity index 96% rename from src/internal/sink/null/null.go rename to internal/sink/null/null.go index e5ae090..6744409 100644 --- a/src/internal/sink/null/null.go +++ b/internal/sink/null/null.go @@ -6,10 +6,10 @@ import ( "sync/atomic" "time" - "logwisp/src/internal/core" - "logwisp/src/internal/plugin" - "logwisp/src/internal/session" - "logwisp/src/internal/sink" + "logwisp/internal/core" + "logwisp/internal/plugin" + "logwisp/internal/session" + "logwisp/internal/sink" "github.com/lixenwraith/log" ) diff --git a/src/internal/sink/sink.go b/internal/sink/sink.go similarity index 96% rename from src/internal/sink/sink.go rename to internal/sink/sink.go index 4f0ba0c..aaecf00 100644 --- a/src/internal/sink/sink.go +++ b/internal/sink/sink.go @@ -4,7 +4,7 @@ import ( "context" "time" - "logwisp/src/internal/core" + "logwisp/internal/core" ) // Sink represents an output data stream. diff --git a/src/internal/sink/tcp/tcp.go b/internal/sink/tcp/tcp.go similarity index 98% rename from src/internal/sink/tcp/tcp.go rename to internal/sink/tcp/tcp.go index 22683f5..4f18c22 100644 --- a/src/internal/sink/tcp/tcp.go +++ b/internal/sink/tcp/tcp.go @@ -9,11 +9,11 @@ import ( "sync/atomic" "time" - "logwisp/src/internal/config" - "logwisp/src/internal/core" - "logwisp/src/internal/plugin" - "logwisp/src/internal/session" - "logwisp/src/internal/sink" + "logwisp/internal/config" + "logwisp/internal/core" + "logwisp/internal/plugin" + "logwisp/internal/session" + "logwisp/internal/sink" lconfig "github.com/lixenwraith/config" "github.com/lixenwraith/log" diff --git a/src/internal/sink/tcpchain/tcpchain.go b/internal/sink/tcpchain/tcpchain.go similarity index 98% rename from src/internal/sink/tcpchain/tcpchain.go rename to internal/sink/tcpchain/tcpchain.go index 334af5a..a5c0eaf 100644 --- a/src/internal/sink/tcpchain/tcpchain.go +++ b/internal/sink/tcpchain/tcpchain.go @@ -12,12 +12,12 @@ import ( "sync/atomic" "time" - "logwisp/src/internal/chain" - "logwisp/src/internal/config" - "logwisp/src/internal/core" - "logwisp/src/internal/plugin" - "logwisp/src/internal/session" - "logwisp/src/internal/sink" + "logwisp/internal/chain" + "logwisp/internal/config" + "logwisp/internal/core" + "logwisp/internal/plugin" + "logwisp/internal/session" + "logwisp/internal/sink" lconfig "github.com/lixenwraith/config" "github.com/lixenwraith/log" diff --git a/src/internal/source/console/console.go b/internal/source/console/console.go similarity index 97% rename from src/internal/source/console/console.go rename to internal/source/console/console.go index 1a43cd5..7ae21a7 100644 --- a/src/internal/source/console/console.go +++ b/internal/source/console/console.go @@ -7,11 +7,11 @@ import ( "sync/atomic" "time" - "logwisp/src/internal/config" - "logwisp/src/internal/core" - "logwisp/src/internal/plugin" - "logwisp/src/internal/session" - "logwisp/src/internal/source" + "logwisp/internal/config" + "logwisp/internal/core" + "logwisp/internal/plugin" + "logwisp/internal/session" + "logwisp/internal/source" lconfig "github.com/lixenwraith/config" "github.com/lixenwraith/log" diff --git a/src/internal/source/file/file.go b/internal/source/file/file.go similarity index 98% rename from src/internal/source/file/file.go rename to internal/source/file/file.go index 9f6b753..58c4ac5 100644 --- a/src/internal/source/file/file.go +++ b/internal/source/file/file.go @@ -12,11 +12,11 @@ import ( "sync/atomic" "time" - "logwisp/src/internal/config" - "logwisp/src/internal/core" - "logwisp/src/internal/plugin" - "logwisp/src/internal/session" - "logwisp/src/internal/source" + "logwisp/internal/config" + "logwisp/internal/core" + "logwisp/internal/plugin" + "logwisp/internal/session" + "logwisp/internal/source" lconfig "github.com/lixenwraith/config" "github.com/lixenwraith/log" diff --git a/src/internal/source/file/file_watcher.go b/internal/source/file/file_watcher.go similarity index 99% rename from src/internal/source/file/file_watcher.go rename to internal/source/file/file_watcher.go index d16f99f..3119501 100644 --- a/src/internal/source/file/file_watcher.go +++ b/internal/source/file/file_watcher.go @@ -13,8 +13,8 @@ import ( "syscall" "time" - "logwisp/src/internal/core" - "logwisp/src/internal/source" + "logwisp/internal/core" + "logwisp/internal/source" "github.com/lixenwraith/log" ) diff --git a/src/internal/source/httpchain/httpchain.go b/internal/source/httpchain/httpchain.go similarity index 97% rename from src/internal/source/httpchain/httpchain.go rename to internal/source/httpchain/httpchain.go index 8e8cd86..bb4e059 100644 --- a/src/internal/source/httpchain/httpchain.go +++ b/internal/source/httpchain/httpchain.go @@ -13,12 +13,12 @@ import ( "sync/atomic" "time" - "logwisp/src/internal/chain" - "logwisp/src/internal/config" - "logwisp/src/internal/core" - "logwisp/src/internal/plugin" - "logwisp/src/internal/session" - "logwisp/src/internal/source" + "logwisp/internal/chain" + "logwisp/internal/config" + "logwisp/internal/core" + "logwisp/internal/plugin" + "logwisp/internal/session" + "logwisp/internal/source" lconfig "github.com/lixenwraith/config" "github.com/lixenwraith/log" diff --git a/src/internal/source/null/null.go b/internal/source/null/null.go similarity index 95% rename from src/internal/source/null/null.go rename to internal/source/null/null.go index 5a2c864..2ad5cd6 100644 --- a/src/internal/source/null/null.go +++ b/internal/source/null/null.go @@ -5,10 +5,10 @@ import ( "sync/atomic" "time" - "logwisp/src/internal/core" - "logwisp/src/internal/plugin" - "logwisp/src/internal/session" - "logwisp/src/internal/source" + "logwisp/internal/core" + "logwisp/internal/plugin" + "logwisp/internal/session" + "logwisp/internal/source" "github.com/lixenwraith/log" ) diff --git a/src/internal/source/random/random.go b/internal/source/random/random.go similarity index 98% rename from src/internal/source/random/random.go rename to internal/source/random/random.go index 2dd1850..1604e3e 100644 --- a/src/internal/source/random/random.go +++ b/internal/source/random/random.go @@ -8,11 +8,11 @@ import ( "sync/atomic" "time" - "logwisp/src/internal/config" - "logwisp/src/internal/core" - "logwisp/src/internal/plugin" - "logwisp/src/internal/session" - "logwisp/src/internal/source" + "logwisp/internal/config" + "logwisp/internal/core" + "logwisp/internal/plugin" + "logwisp/internal/session" + "logwisp/internal/source" lconfig "github.com/lixenwraith/config" "github.com/lixenwraith/log" diff --git a/src/internal/source/source.go b/internal/source/source.go similarity index 98% rename from src/internal/source/source.go rename to internal/source/source.go index 40c53b1..7c48cbc 100644 --- a/src/internal/source/source.go +++ b/internal/source/source.go @@ -4,7 +4,7 @@ import ( "strings" "time" - "logwisp/src/internal/core" + "logwisp/internal/core" ) // Source represents an input data stream for log entries diff --git a/src/internal/source/tcpchain/tcpchain.go b/internal/source/tcpchain/tcpchain.go similarity index 97% rename from src/internal/source/tcpchain/tcpchain.go rename to internal/source/tcpchain/tcpchain.go index f10af83..2b5fedc 100644 --- a/src/internal/source/tcpchain/tcpchain.go +++ b/internal/source/tcpchain/tcpchain.go @@ -12,12 +12,12 @@ import ( "sync/atomic" "time" - "logwisp/src/internal/chain" - "logwisp/src/internal/config" - "logwisp/src/internal/core" - "logwisp/src/internal/plugin" - "logwisp/src/internal/session" - "logwisp/src/internal/source" + "logwisp/internal/chain" + "logwisp/internal/config" + "logwisp/internal/core" + "logwisp/internal/plugin" + "logwisp/internal/session" + "logwisp/internal/source" lconfig "github.com/lixenwraith/config" "github.com/lixenwraith/log" diff --git a/src/internal/tokenbucket/bucket.go b/internal/tokenbucket/bucket.go similarity index 100% rename from src/internal/tokenbucket/bucket.go rename to internal/tokenbucket/bucket.go diff --git a/src/internal/version/version.go b/internal/version/version.go similarity index 100% rename from src/internal/version/version.go rename to internal/version/version.go diff --git a/test/chain-test.sh b/test/chain-test.sh new file mode 100755 index 0000000..1839698 --- /dev/null +++ b/test/chain-test.sh @@ -0,0 +1,242 @@ +#!/usr/bin/env bash +# logwisp chain topology test +# +# random --> tcp_chain sink --> :15801 tcp_chain src --> :15803 tcp sink +# random --> http_chain sink --> :15802 http_chain src --> :15804 http sink (SSE) +# +# Usage: +# ./chain_test.sh manual mode: 2 edge daemons + relay foreground +# ./chain_test.sh --auto all daemonized, automated curl//dev/tcp checks, teardown +# ./chain_test.sh --keep (with --auto) skip teardown on success +# +# Requires: bash 5+, coreutils (timeout), curl. Linux dev host only. + +set -u + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BIN="${LOGWISP_BIN:-$SCRIPT_DIR/../bin/logwisp}" +RUN="$SCRIPT_DIR/run" +CONF="$RUN/conf" +LOG="$RUN/log" + +PORT_TCP_CHAIN=15801 +PORT_HTTP_CHAIN=15802 +PORT_TCP_SINK=15803 +PORT_HTTP_SINK=15804 + +AUTO=0; KEEP=0 +for a in "$@"; do case "$a" in + --auto) AUTO=1 ;; + --keep) KEEP=1 ;; + *) echo "unknown arg: $a" >&2; exit 1 ;; +esac; done + +PIDS=() +cleanup() { + local rc=$? + trap - EXIT INT TERM + if (( ${#PIDS[@]} )); then + echo "--- teardown: stopping ${#PIDS[@]} daemon(s)" + kill -TERM "${PIDS[@]}" 2>/dev/null + local deadline=$(( SECONDS + 10 )) + for pid in "${PIDS[@]}"; do + while kill -0 "$pid" 2>/dev/null && (( SECONDS < deadline )); do sleep 0.2; done + kill -KILL "$pid" 2>/dev/null + done + fi + exit "$rc" +} +trap cleanup EXIT INT TERM + +port_open() { (exec 3<>"/dev/tcp/127.0.0.1/$1") 2>/dev/null && exec 3>&-; } + +wait_port() { # port timeout_s + local i; for (( i=0; i < $2 * 10; i++ )); do + port_open "$1" && return 0 + sleep 0.1 + done + return 1 +} + +# Reads TCP sink stream for N seconds; connection counts as a sink client +tcp_read() { # port secs + timeout "$2" bash -c "exec 3<>/dev/tcp/127.0.0.1/$1; cat <&3" 2>/dev/null || true +} + +start_daemon() { # name conf + "$BIN" -c "$CONF/$2" > "$LOG/$1.out" 2>&1 & + PIDS+=($!) + echo "started $1 (pid $!)" +} + +# --- Preflight --- +[[ -x "$BIN" ]] || { echo "binary not found: $BIN (build: go build -o bin/logwisp ./cmd/logwisp)" >&2; exit 1; } +for p in $PORT_TCP_CHAIN $PORT_HTTP_CHAIN $PORT_TCP_SINK $PORT_HTTP_SINK; do + port_open "$p" && { echo "port $p already in use" >&2; exit 1; } +done +mkdir -p "$CONF" "$LOG" + +# --- Config generation --- +cat > "$CONF/edge_tcp.toml" < "$CONF/edge_http.toml" < "$CONF/relay.toml" < live check: nc 127.0.0.1 $PORT_TCP_SINK + $PORT_HTTP_SINK HTTP sink -> live check: browser/curl: + http://127.0.0.1:$PORT_HTTP_SINK/stream (SSE) + http://127.0.0.1:$PORT_HTTP_SINK/status (JSON stats) + Use 127.0.0.1, not localhost — sinks reject IPv6. + Expected: json entries, node "edge-tcp" on :$PORT_TCP_SINK, "edge-http" on :$PORT_HTTP_SINK. + Logs: $LOG/ +================================================================ +EOF + +if (( AUTO == 0 )); then + # Manual mode: edges daemonized first (chain sinks backoff-retry), relay foreground + start_daemon edge_tcp edge_tcp.toml + start_daemon edge_http edge_http.toml + echo "--- relay starting in FOREGROUND; Ctrl-C stops relay and both edges" + "$BIN" -c "$CONF/relay.toml" + exit 0 +fi + +# --- Auto mode --- +start_daemon relay relay.toml +for p in $PORT_TCP_CHAIN $PORT_HTTP_CHAIN $PORT_TCP_SINK $PORT_HTTP_SINK; do + wait_port "$p" 10 || { echo "FAIL: relay port $p not listening (see $LOG/relay.out)"; exit 1; } +done +start_daemon edge_tcp edge_tcp.toml +start_daemon edge_http edge_http.toml + +echo "--- settling 3s (connect + first http_chain flush)" +sleep 3 + +fail=0 +check() { # label condition_result + if (( $2 )); then echo "PASS: $1"; else echo "FAIL: $1"; fail=1; fi +} + +# 1. TCP chain: edge-tcp -> relay -> tcp sink +tcp_out="$(tcp_read "$PORT_TCP_SINK" 4)" +n=$(grep -c '"node":"edge-tcp"' <<< "$tcp_out") +check "tcp path: entries on :$PORT_TCP_SINK with node=edge-tcp ($n lines)" $(( n >= 1 )) + +# 2. HTTP chain: edge-http -> relay -> SSE sink +sse_out="$(curl -sN --max-time 4 "http://127.0.0.1:$PORT_HTTP_SINK/stream" || true)" +n=$(grep -c '^data:.*"node":"edge-http"' <<< "$sse_out") +check "http path: SSE events on :$PORT_HTTP_SINK with node=edge-http ($n events)" $(( n >= 1 )) + +# 3. HTTP sink status endpoint +status="$(curl -s --max-time 3 "http://127.0.0.1:$PORT_HTTP_SINK/status" || true)" +proc=$(grep -o '"total_processed":[0-9]*' <<< "$status" | grep -o '[0-9]*' || echo 0) +check "status endpoint: total_processed=$proc > 0" $(( proc > 0 )) + +echo "================================================================" +if (( fail == 0 )); then + echo "RESULT: ALL PASS" + (( KEEP )) && { echo "--keep: daemons left running (pids: ${PIDS[*]})"; PIDS=(); } +else + echo "RESULT: FAILURES — inspect $LOG/*.out and $LOG/*.log" +fi +exit "$fail" +