From 9da0baa8c96c8fe987f7002c91551805eb8afc8d Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 11 Feb 2025 10:28:02 +0800 Subject: [PATCH 001/142] fix: barry quick commit, 2025-02-11 10:28:02 --- pkg/wsproxy/websocket_proxy.go | 38 +++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/pkg/wsproxy/websocket_proxy.go b/pkg/wsproxy/websocket_proxy.go index a24f8fe0e..95476b0e6 100644 --- a/pkg/wsproxy/websocket_proxy.go +++ b/pkg/wsproxy/websocket_proxy.go @@ -3,10 +3,12 @@ package wsproxy import ( "bufio" "bytes" + "errors" "io" "net" "net/http" "strings" + "sync" "time" "github.com/gorilla/websocket" @@ -170,16 +172,17 @@ func (p *Proxy) proxy(w http.ResponseWriter, r *http.Request) { p.timeWait = timeWait } - conn, err := upgrade.Upgrade(w, r, responseHeader) + conn1, err := upgrade.Upgrade(w, r, responseHeader) if err != nil { log.Warn().Err(err).Msg("error upgrading websocket") return } - defer conn.Close() + defer conn1.Close() ctx, cancelFn := context.WithCancel(context.Background()) defer cancelFn() + conn := WsConn{Conn: conn1, mu: &sync.Mutex{}} conn.SetReadLimit(maxMessageSize) conn.SetPingHandler(func(text string) error { logutil.HandlerErr(conn.SetReadDeadline(time.Now().Add(p.timeWait))) @@ -187,7 +190,7 @@ func (p *Proxy) proxy(w http.ResponseWriter, r *http.Request) { log.Info().Str("text", text).Msg("websocket received ping frame") // 不设置 write deadline err := conn.WriteControl(websocket.PongMessage, []byte(text), time.Time{}) - if err == websocket.ErrCloseSent { + if errors.Is(err, websocket.ErrCloseSent) { return nil } else if _, ok := err.(net.Error); ok { return nil @@ -354,3 +357,32 @@ func (w *inMemoryResponseWriter) CloseNotify() <-chan bool { return w.closed } func (w *inMemoryResponseWriter) Flush() {} + +type WsConn struct { + *websocket.Conn + mu *sync.Mutex +} + +func (ws WsConn) WritePreparedMessage(pm *websocket.PreparedMessage) error { + ws.mu.Lock() + defer ws.mu.Unlock() + return ws.Conn.WritePreparedMessage(pm) +} + +func (ws WsConn) WriteJSON(v interface{}) error { + ws.mu.Lock() + defer ws.mu.Unlock() + return ws.Conn.WriteJSON(v) +} + +func (ws WsConn) WriteControl(messageType int, data []byte, deadline time.Time) error { + ws.mu.Lock() + defer ws.mu.Unlock() + return ws.Conn.WriteControl(messageType, data, deadline) +} + +func (ws WsConn) WriteMessage(messageType int, data []byte) error { + ws.mu.Lock() + defer ws.mu.Unlock() + return ws.Conn.WriteMessage(messageType, data) +} From 714c537962e96db13029ecb4a0435a318d85f2c0 Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 18 Mar 2025 19:20:07 +0800 Subject: [PATCH 002/142] fix: barry quick fix, 2025-03-18 19:20:07 --- servers/https/server.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/servers/https/server.go b/servers/https/server.go index e9eaaeab2..5c3ee4839 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -19,7 +19,6 @@ import ( "github.com/pubgo/funk/stack" "github.com/pubgo/funk/version" "github.com/pubgo/opendoc/opendoc" - "github.com/valyala/fasthttp" "google.golang.org/grpc/codes" "github.com/pubgo/lava/core/debug" @@ -51,8 +50,6 @@ func (s *serviceImpl) Run() { defer s.stop() s.start() signal.Wait() - - fasthttp.AcquireArgs() } func (s *serviceImpl) Start() { s.start() } From ecade967f203784c23401c4def4884c3ac87af0d Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 25 Mar 2025 21:18:33 +0800 Subject: [PATCH 003/142] fix: barry quick fix, 2025-03-25 21:18:33 --- go.mod | 1 + go.sum | 2 ++ main.go | 2 ++ 3 files changed, 5 insertions(+) diff --git a/go.mod b/go.mod index 45c45e433..adc7bf1b0 100644 --- a/go.mod +++ b/go.mod @@ -64,6 +64,7 @@ require ( github.com/rs/zerolog v1.33.0 github.com/samber/lo v1.47.0 github.com/stretchr/testify v1.9.0 + github.com/thejerf/suture/v4 v4.0.6 github.com/uber-go/tally/v4 v4.1.16 github.com/urfave/cli/v3 v3.0.0-alpha9.0.20240717192922-127cf54fac9f github.com/valyala/fasthttp v1.52.0 diff --git a/go.sum b/go.sum index e4890f5d4..c5ae8eb87 100644 --- a/go.sum +++ b/go.sum @@ -653,6 +653,8 @@ github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpR github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= github.com/tetafro/godot v1.4.17 h1:pGzu+Ye7ZUEFx7LHU0dAKmCOXWsPjl7qA6iMGndsjPs= github.com/tetafro/godot v1.4.17/go.mod h1:2oVxTBSftRTh4+MVfUaUXR6bn2GDXCaMcOG4Dk3rfio= +github.com/thejerf/suture/v4 v4.0.6 h1:QsuCEsCqb03xF9tPAsWAj8QOAJBgQI1c0VqJNaingg8= +github.com/thejerf/suture/v4 v4.0.6/go.mod h1:gu9Y4dXNUWFrByqRt30Rm9/UZ0wzRSt9AJS6xu/ZGxU= github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U= github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= diff --git a/main.go b/main.go index 05d8e1267..6ae506051 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,8 @@ import ( "github.com/pubgo/funk/assert" "github.com/pubgo/lava/buildtasks" "github.com/pubgo/lava/core/flags" + + _ "github.com/thejerf/suture/v4" ) func main() { From d2edf2297757205c90fed2b3c2499b84a2b91044 Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 25 Mar 2025 22:19:18 +0800 Subject: [PATCH 004/142] fix: barry quick fix, 2025-03-25 22:19:18 --- core/debug/panicparse/panicparse.go | 10 ++++++++++ go.mod | 11 +++++++---- go.sum | 13 ++++++++----- main.go | 1 + 4 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 core/debug/panicparse/panicparse.go diff --git a/core/debug/panicparse/panicparse.go b/core/debug/panicparse/panicparse.go new file mode 100644 index 000000000..a81e672ab --- /dev/null +++ b/core/debug/panicparse/panicparse.go @@ -0,0 +1,10 @@ +package panicparse + +import ( + "github.com/maruel/panicparse/v2/stack/webstack" + "github.com/pubgo/lava/core/debug" +) + +func init() { + debug.Get("/panicparse", debug.WrapFunc(webstack.SnapshotHandler)) +} diff --git a/go.mod b/go.mod index adc7bf1b0..b0547436e 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/pubgo/lava -go 1.22.1 +go 1.23.0 + +toolchain go1.23.1 require ( github.com/gofiber/fiber/v2 v2.52.4 @@ -23,7 +25,7 @@ require ( golang.org/x/crypto v0.27.0 // indirect golang.org/x/mod v0.21.0 // indirect golang.org/x/net v0.29.0 - golang.org/x/sys v0.25.0 // indirect + golang.org/x/sys v0.31.0 // indirect google.golang.org/grpc v1.66.1 google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 ) @@ -56,6 +58,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 github.com/maragudk/gomponents v0.20.0 + github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.48.0 github.com/pubgo/dix v0.3.19 github.com/pubgo/funk v0.5.56 @@ -166,7 +169,7 @@ require ( github.com/golangci/plugin-module-register v0.1.1 // indirect github.com/golangci/revgrep v0.5.3 // indirect github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed // indirect - github.com/google/go-cmp v0.6.0 // indirect + github.com/google/go-cmp v0.7.0 // indirect github.com/google/pprof v0.0.0-20240910150728-a0b0bb1d4134 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gordonklaus/ineffassign v0.1.0 // indirect @@ -207,7 +210,7 @@ require ( github.com/maratori/testableexamples v1.0.0 // indirect github.com/maratori/testpackage v1.1.1 // indirect github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mattn/go-shellwords v1.0.12 // indirect diff --git a/go.sum b/go.sum index c5ae8eb87..06a88fd9e 100644 --- a/go.sum +++ b/go.sum @@ -295,8 +295,8 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/pprof v0.0.0-20240910150728-a0b0bb1d4134 h1:c5FlPPgxOn7kJz3VoPLkQYQXGBS3EklQ4Zfi57uOuqQ= @@ -434,12 +434,15 @@ github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04= github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc= +github.com/maruel/panicparse/v2 v2.5.0 h1:yCtuS0FWjfd0RTYMXGpDvWcb0kINm8xJGu18/xMUh00= +github.com/maruel/panicparse/v2 v2.5.0/go.mod h1:DA2fDiBk63bKfBf4CVZP9gb4fuvzdPbLDsSI873hweQ= github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 h1:gWg6ZQ4JhDfJPqlo2srm/LN17lpybq15AryXIRcWYLE= github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= @@ -866,8 +869,8 @@ golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= -golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/telemetry v0.0.0-20240522233618-39ace7a40ae7 h1:FemxDzfMUcK2f3YY4H+05K9CDzbSVr2+q/JKN45pey0= golang.org/x/telemetry v0.0.0-20240522233618-39ace7a40ae7/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= diff --git a/main.go b/main.go index 6ae506051..8f8520e40 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "flag" + "net/http" "github.com/goyek/goyek/v2" "github.com/goyek/workflow" From df4af4c89a4d8141258f414fa2833a386dd54da6 Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 15 Apr 2025 00:39:36 +0800 Subject: [PATCH 005/142] fix: barry quick fix, 2025-04-15 00:39:36 --- main.go | 2 -- pkg/gateway/{code.go => status_code.go} | 0 2 files changed, 2 deletions(-) rename pkg/gateway/{code.go => status_code.go} (100%) diff --git a/main.go b/main.go index 8f8520e40..e77ae549f 100644 --- a/main.go +++ b/main.go @@ -2,8 +2,6 @@ package main import ( "flag" - "net/http" - "github.com/goyek/goyek/v2" "github.com/goyek/workflow" "github.com/goyek/x/boot" diff --git a/pkg/gateway/code.go b/pkg/gateway/status_code.go similarity index 100% rename from pkg/gateway/code.go rename to pkg/gateway/status_code.go From 3da6dc6d98dbb4899d956f7be641cdbdc2c9cb0c Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 15 Apr 2025 23:00:30 +0800 Subject: [PATCH 006/142] fix: barry quick fix, 2025-04-15 23:00:30 --- main.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/main.go b/main.go index e77ae549f..a8664760c 100644 --- a/main.go +++ b/main.go @@ -8,6 +8,7 @@ import ( "github.com/pubgo/funk/assert" "github.com/pubgo/lava/buildtasks" "github.com/pubgo/lava/core/flags" + "github.com/thejerf/suture/v4" _ "github.com/thejerf/suture/v4" ) @@ -15,6 +16,10 @@ import ( func main() { goyek.Undefine(workflow.PipelineAll) + s := suture.NewSimple("") + s.Add() + s.Remove() + workflow.StageTest.SetDeps(append(workflow.StageTest.Deps(), buildtasks.GoLint)) goyek.SetDefault(goyek.Define(goyek.Task{ Name: "all", From 9b20e4899e07b0c54076fe3885e6290bc8ef6130 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 26 Apr 2025 21:25:30 +0800 Subject: [PATCH 007/142] fix: barry quick fix, 2025-04-26 21:25:29 --- buildtasks/bench.go | 27 ---- buildtasks/lint.go | 17 --- buildtasks/util.go | 23 ---- core/debug/mux.go | 5 - core/lifecycle/lifecycle.go | 30 +++-- core/registry/builder.go | 6 +- docs/_doc.go | 2 + go.mod | 41 +++--- go.sum | 85 ++++++------ lava/router.go | 10 +- lava/service.go | 6 +- main.go | 21 +-- pkg/gateway/wrapper.go | 6 +- servers/grpcs/server.go | 245 ++++++++--------------------------- servers/https/server.go | 16 +-- servers/sses/sse.go | 250 ++++++++++++++++++++++++++++++++++++ servers/tasks/server.go | 16 +-- servers/wss/server.go | 10 +- 18 files changed, 415 insertions(+), 401 deletions(-) delete mode 100644 buildtasks/bench.go delete mode 100644 buildtasks/lint.go delete mode 100644 buildtasks/util.go create mode 100644 servers/sses/sse.go diff --git a/buildtasks/bench.go b/buildtasks/bench.go deleted file mode 100644 index ec3993e02..000000000 --- a/buildtasks/bench.go +++ /dev/null @@ -1,27 +0,0 @@ -package buildtasks - -import "fmt" - -type BenchMode int - -const ( - BenchModeWazero BenchMode = iota - BenchModeCGO - BenchModeDefault -) - -func BenchArgs(pkg string, count int, mode BenchMode, libName string) []string { - args := []string{"test", "-bench=.", "-run=^$", "-v", "-timeout=60m"} - if count > 0 { - args = append(args, fmt.Sprintf("-count=%d", count)) - } - switch mode { - case BenchModeCGO: - args = append(args, fmt.Sprintf("-tags=%s_cgo", libName)) - case BenchModeDefault: - args = append(args, fmt.Sprintf("-tags=%s_bench_default", libName)) - } - args = append(args, pkg) - - return args -} diff --git a/buildtasks/lint.go b/buildtasks/lint.go deleted file mode 100644 index f08864404..000000000 --- a/buildtasks/lint.go +++ /dev/null @@ -1,17 +0,0 @@ -package buildtasks - -import ( - "github.com/goyek/goyek/v2" - "github.com/goyek/x/cmd" -) - -var GoLint = goyek.Define(goyek.Task{ - Name: "go-lint", - Usage: "golangci-lint run --fix", - Action: func(a *goyek.A) { - if !cmd.Exec(a, "go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest") { - return - } - cmd.Exec(a, "golangci-lint run --fix") - }, -}) diff --git a/buildtasks/util.go b/buildtasks/util.go deleted file mode 100644 index e519e3d46..000000000 --- a/buildtasks/util.go +++ /dev/null @@ -1,23 +0,0 @@ -package buildtasks - -import ( - "os/exec" - - "github.com/goyek/goyek/v2" - "github.com/goyek/x/cmd" -) - -// check if docker is installed and running -func checkDocker(a *goyek.A) bool { - if !hasBinary("docker") { - return true - } - - return cmd.Exec(a, "docker ps") -} - -// check if a binary exists -func hasBinary(binaryName string) bool { - _, err := exec.LookPath(binaryName) - return err == nil -} diff --git a/core/debug/mux.go b/core/debug/mux.go index 2cd3f6e7b..0d692bc79 100644 --- a/core/debug/mux.go +++ b/core/debug/mux.go @@ -16,11 +16,6 @@ type Config struct { var app = fiber.New() -func Handler(ctx *fiber.Ctx) error { - app.Handler()(ctx.Context()) - return nil -} - func App() *fiber.App { return app } func WrapFunc(h http.HandlerFunc) fiber.Handler { return adaptor.HTTPHandlerFunc(h) } func Wrap(h http.Handler) fiber.Handler { return adaptor.HTTPHandler(h) } diff --git a/core/lifecycle/lifecycle.go b/core/lifecycle/lifecycle.go index 6b43248a7..9f7cb8e86 100644 --- a/core/lifecycle/lifecycle.go +++ b/core/lifecycle/lifecycle.go @@ -1,16 +1,20 @@ package lifecycle +import "context" + +type ExecFunc = func(context.Context) error + type Executor struct { - Handler func() + Exec ExecFunc } type Handler func(lc Lifecycle) type Lifecycle interface { - AfterStop(f func()) - BeforeStop(f func()) - AfterStart(f func()) - BeforeStart(f func()) + AfterStop(f ExecFunc) + BeforeStop(f ExecFunc) + AfterStart(f ExecFunc) + BeforeStart(f ExecFunc) } type Getter interface { @@ -36,18 +40,18 @@ func (t *lifecycleImpl) GetAfterStops() []Executor { return t.afterStops } func (t *lifecycleImpl) GetBeforeStops() []Executor { return t.beforeStops } func (t *lifecycleImpl) GetAfterStarts() []Executor { return t.afterStarts } func (t *lifecycleImpl) GetBeforeStarts() []Executor { return t.beforeStarts } -func (t *lifecycleImpl) BeforeStart(f func()) { - t.beforeStarts = append(t.beforeStarts, Executor{Handler: f}) +func (t *lifecycleImpl) BeforeStart(f ExecFunc) { + t.beforeStarts = append(t.beforeStarts, Executor{Exec: f}) } -func (t *lifecycleImpl) BeforeStop(f func()) { - t.beforeStops = append([]Executor{{Handler: f}}, t.beforeStops...) +func (t *lifecycleImpl) BeforeStop(f ExecFunc) { + t.beforeStops = append([]Executor{{Exec: f}}, t.beforeStops...) } -func (t *lifecycleImpl) AfterStart(f func()) { - t.afterStarts = append(t.afterStarts, Executor{Handler: f}) +func (t *lifecycleImpl) AfterStart(f ExecFunc) { + t.afterStarts = append(t.afterStarts, Executor{Exec: f}) } -func (t *lifecycleImpl) AfterStop(f func()) { - t.afterStops = append([]Executor{{Handler: f}}, t.afterStops...) +func (t *lifecycleImpl) AfterStop(f ExecFunc) { + t.afterStops = append([]Executor{{Exec: f}}, t.afterStops...) } diff --git a/core/registry/builder.go b/core/registry/builder.go index 6bb03b4b2..2d242f418 100644 --- a/core/registry/builder.go +++ b/core/registry/builder.go @@ -38,7 +38,7 @@ func New(c *Config, lifecycle lifecycle.Lifecycle, regs map[string]Registry) { }) // 服务注册 - lifecycle.AfterStart(func() { + lifecycle.AfterStart(func(ctx context.Context) error { SetDefault(reg) register(reg) @@ -65,10 +65,12 @@ func New(c *Config, lifecycle lifecycle.Lifecycle, regs map[string]Registry) { }) // 服务撤销 - lifecycle.BeforeStop(func() { + lifecycle.BeforeStop(func(ctx context.Context) error { cancel() deregister(reg) + return nil }) + return nil }) } diff --git a/docs/_doc.go b/docs/_doc.go index df8bac9df..b22a41dd1 100644 --- a/docs/_doc.go +++ b/docs/_doc.go @@ -20,3 +20,5 @@ package docs // import _ "go.etcd.io/etcd/pkg/fileutil" // https://github.com/tideland/go-slices/blob/main/slices.go // https://github.com/labstack/gommon + +// https://github.com/ThreeDotsLabs/watermill diff --git a/go.mod b/go.mod index b0547436e..9624c421f 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.0 toolchain go1.23.1 require ( - github.com/gofiber/fiber/v2 v2.52.4 + github.com/gofiber/fiber/v2 v2.52.6 github.com/golang/protobuf v1.5.4 // indirect github.com/grandcat/zeroconf v1.0.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 @@ -22,9 +22,9 @@ require ( go.opentelemetry.io/otel/trace v1.30.0 go.uber.org/atomic v1.11.0 // indirect go.uber.org/automaxprocs v1.5.3 - golang.org/x/crypto v0.27.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/mod v0.21.0 // indirect - golang.org/x/net v0.29.0 + golang.org/x/net v0.33.0 golang.org/x/sys v0.31.0 // indirect google.golang.org/grpc v1.66.1 google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 @@ -43,34 +43,32 @@ require ( github.com/dave/jennifer v1.7.0 github.com/ecordell/optgen v0.0.9 github.com/fasthttp/router v1.5.0 - github.com/fasthttp/websocket v1.5.8 + github.com/fasthttp/websocket v1.5.12 github.com/felixge/fgprof v0.9.5 github.com/fullstorydev/grpchan v1.1.1 github.com/go-playground/validator/v10 v10.19.0 github.com/gofiber/adaptor/v2 v2.2.1 + github.com/gofiber/contrib/socketio v1.1.5 + github.com/gofiber/contrib/websocket v1.3.4 github.com/gofiber/utils v1.1.0 - github.com/gofiber/websocket/v2 v2.2.1 github.com/golangci/golangci-lint v1.61.0 github.com/gorilla/websocket v1.5.1 - github.com/goyek/goyek/v2 v2.2.0 - github.com/goyek/workflow v0.0.0-20240815094733-414d2a904ff9 - github.com/goyek/x v0.2.0 github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 github.com/maragudk/gomponents v0.20.0 github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.48.0 github.com/pubgo/dix v0.3.19 - github.com/pubgo/funk v0.5.56 + github.com/pubgo/funk v0.5.64 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.5.0 github.com/rs/zerolog v1.33.0 github.com/samber/lo v1.47.0 - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.10.0 github.com/thejerf/suture/v4 v4.0.6 github.com/uber-go/tally/v4 v4.1.16 github.com/urfave/cli/v3 v3.0.0-alpha9.0.20240717192922-127cf54fac9f - github.com/valyala/fasthttp v1.52.0 + github.com/valyala/fasthttp v1.58.0 github.com/valyala/fasttemplate v1.2.2 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.26.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 @@ -107,7 +105,7 @@ require ( github.com/alexkohler/nakedret/v2 v2.0.4 // indirect github.com/alexkohler/prealloc v1.0.0 // indirect github.com/alingse/asasalint v0.0.11 // indirect - github.com/andybalholm/brotli v1.1.0 // indirect + github.com/andybalholm/brotli v1.1.1 // indirect github.com/ashanbrown/forbidigo v1.6.0 // indirect github.com/ashanbrown/makezero v1.1.1 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -131,10 +129,10 @@ require ( github.com/curioswitch/go-reassign v0.2.0 // indirect github.com/daixiang0/gci v0.13.5 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/denis-tingaikin/go-header v0.5.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect github.com/ettle/strcase v0.2.0 // indirect + github.com/expr-lang/expr v1.16.9 // indirect github.com/fatih/color v1.17.0 // indirect github.com/fatih/structtag v1.2.0 // indirect github.com/firefart/nonamedreturns v1.0.5 // indirect @@ -194,7 +192,7 @@ require ( github.com/karamaru-alpha/copyloopvar v1.1.0 // indirect github.com/kisielk/errcheck v1.7.0 // indirect github.com/kkHAIKE/contextcheck v1.1.5 // indirect - github.com/klauspost/compress v1.17.9 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/kulti/thelper v0.6.3 // indirect github.com/kunwardeep/paralleltest v1.0.10 // indirect github.com/kyoh86/exportloopref v0.1.11 // indirect @@ -212,8 +210,7 @@ require ( github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/mattn/go-shellwords v1.0.12 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mgechev/revive v1.3.9 // indirect github.com/miekg/dns v1.1.50 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect @@ -222,13 +219,9 @@ require ( github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/moricho/tparallel v0.3.2 // indirect github.com/nakabonne/nestif v0.3.1 // indirect - github.com/nats-io/nats.go v1.37.0 // indirect - github.com/nats-io/nkeys v0.4.7 // indirect - github.com/nats-io/nuid v1.0.1 // indirect github.com/nishanths/exhaustive v0.12.0 // indirect github.com/nishanths/predeclared v0.2.2 // indirect github.com/nunnatsa/ginkgolinter v0.16.2 // indirect - github.com/panjf2000/ants/v2 v2.10.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect @@ -242,14 +235,14 @@ require ( github.com/quasilyte/gogrep v0.5.0 // indirect github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect - github.com/rivo/uniseg v0.2.0 // indirect + github.com/rivo/uniseg v0.4.4 // indirect github.com/ryancurrah/gomodguard v1.3.5 // indirect github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect github.com/sashamelentyev/interfacebloat v1.1.0 // indirect github.com/sashamelentyev/usestdlibvars v1.27.0 // indirect - github.com/savsgio/gotils v0.0.0-20240303185622-093b76447511 // indirect + github.com/savsgio/gotils v0.0.0-20240704082632-aef3928b8a38 // indirect github.com/securego/gosec/v2 v2.21.2 // indirect github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect github.com/sirupsen/logrus v1.9.3 // indirect @@ -291,9 +284,9 @@ require ( go.uber.org/zap v1.24.0 // indirect golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f // indirect - golang.org/x/sync v0.8.0 // indirect + golang.org/x/sync v0.10.0 // indirect golang.org/x/telemetry v0.0.0-20240522233618-39ace7a40ae7 // indirect - golang.org/x/text v0.18.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 06a88fd9e..42abe1749 100644 --- a/go.sum +++ b/go.sum @@ -54,8 +54,8 @@ github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pO github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= -github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= -github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= github.com/arl/statsviz v0.6.0 h1:jbW1QJkEYQkufd//4NDYRSNBpwJNrdzPahF7ZmoGdyE= github.com/arl/statsviz v0.6.0/go.mod h1:0toboo+YGSUXDaS4g1D5TVS4dXs7S7YYT5J/qnW2h8s= github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8gerOIVIY= @@ -129,8 +129,6 @@ github.com/dave/jennifer v1.7.0/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= -github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8= github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY= github.com/ecordell/optgen v0.0.9 h1:kmRMqOkbNsWayOnZSk2m5SeGaOTOc7amfi+MAnaMOeI= @@ -146,10 +144,12 @@ github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6 github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= +github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= +github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/fasthttp/router v1.5.0 h1:3Qbbo27HAPzwbpRzgiV5V9+2faPkPt3eNuRaDV6LYDA= github.com/fasthttp/router v1.5.0/go.mod h1:FddcKNXFZg1imHcy+uKB0oo/o6yE9zD3wNguqlhWDak= -github.com/fasthttp/websocket v1.5.8 h1:k5DpirKkftIF/w1R8ZzjSgARJrs54Je9YJK37DL/Ah8= -github.com/fasthttp/websocket v1.5.8/go.mod h1:d08g8WaT6nnyvg9uMm8K9zMYyDjfKyj3170AtPRuVU0= +github.com/fasthttp/websocket v1.5.12 h1:e4RGPpWW2HTbL3zV0Y/t7g0ub294LkiuXXUuTOUInlE= +github.com/fasthttp/websocket v1.5.12/go.mod h1:I+liyL7/4moHojiOgUOIKEWm9EIxHqxZChS+aMFltyg= github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= @@ -237,12 +237,14 @@ github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofiber/adaptor/v2 v2.2.1 h1:givE7iViQWlsTR4Jh7tB4iXzrlKBgiraB/yTdHs9Lv4= github.com/gofiber/adaptor/v2 v2.2.1/go.mod h1:AhR16dEqs25W2FY/l8gSj1b51Azg5dtPDmm+pruNOrc= -github.com/gofiber/fiber/v2 v2.52.4 h1:P+T+4iK7VaqUsq2PALYEfBBo6bJZ4q3FP8cZ84EggTM= -github.com/gofiber/fiber/v2 v2.52.4/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= +github.com/gofiber/contrib/socketio v1.1.5 h1:qcl+VBH57lHdEq5gFRRM3HNo8NQUmWQmJdI58g1mxEA= +github.com/gofiber/contrib/socketio v1.1.5/go.mod h1:r4hsdPAHbPUZVy+klFQ60KmMPGk6M4HPlzfp3eWeEhA= +github.com/gofiber/contrib/websocket v1.3.4 h1:tWeBdbJ8q0WFQXariLN4dBIbGH9KBU75s0s7YXplOSg= +github.com/gofiber/contrib/websocket v1.3.4/go.mod h1:kTFBPC6YENCnKfKx0BoOFjgXxdz7E85/STdkmZPEmPs= +github.com/gofiber/fiber/v2 v2.52.6 h1:Rfp+ILPiYSvvVuIPvxrBns+HJp8qGLDnLJawAu27XVI= +github.com/gofiber/fiber/v2 v2.52.6/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= github.com/gofiber/utils v1.1.0 h1:vdEBpn7AzIUJRhe+CiTOJdUcTg4Q9RK+pEa0KPbLdrM= github.com/gofiber/utils v1.1.0/go.mod h1:poZpsnhBykfnY1Mc0KeEa6mSHrS3dV0+oBWyeQmb2e0= -github.com/gofiber/websocket/v2 v2.2.1 h1:C9cjxvloojayOp9AovmpQrk8VqvVnT8Oao3+IUygH7w= -github.com/gofiber/websocket/v2 v2.2.1/go.mod h1:Ao/+nyNnX5u/hIFPuHl28a+NIkrqK7PRimyKaj4JxVU= github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -322,12 +324,6 @@ github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY= github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= -github.com/goyek/goyek/v2 v2.2.0 h1:FXdta04rwVN/HE33XKcBtYht6iaDkJ9Z5Bdh1TdXjO0= -github.com/goyek/goyek/v2 v2.2.0/go.mod h1:mqU0PSD8q3TRCzhJ1mL79/X7FOrXJcpvOtDEBXi92+E= -github.com/goyek/workflow v0.0.0-20240815094733-414d2a904ff9 h1:rB0kFkFNb66K5JPGDrh+xibOJQBmCQgcC4EkKYCkU/w= -github.com/goyek/workflow v0.0.0-20240815094733-414d2a904ff9/go.mod h1:ApuON/7oB3flhv3Fy5XrKe3K/lQDkVedvWjP/mUAq4Y= -github.com/goyek/x v0.2.0 h1:vLTzDTqbUQnWTM3NOnejGAWwWZA+hJHElv/cd/3ybQc= -github.com/goyek/x v0.2.0/go.mod h1:I1yv17Zj0g3Zv5iDC+kB9gh3cqJquJSTEgfognEfe94= github.com/grandcat/zeroconf v1.0.0 h1:uHhahLBKqwWBV6WZUDAT71044vwOTL+McW0mBJvo6kE= github.com/grandcat/zeroconf v1.0.0/go.mod h1:lTKmG1zh86XyCoUeIHSA4FJMBwCJiQmGfcP2PdzytEs= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= @@ -389,8 +385,8 @@ github.com/kisielk/errcheck v1.7.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkHAIKE/contextcheck v1.1.5 h1:CdnJh63tcDe53vG+RebdpdXJTc9atMgGqdx8LXxiilg= github.com/kkHAIKE/contextcheck v1.1.5/go.mod h1:O930cpht4xb1YQpK+1+AgoM3mFsvxr7uyFptcnWTYUA= -github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= -github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -448,10 +444,8 @@ github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= -github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mgechev/revive v1.3.9 h1:18Y3R4a2USSBF+QZKFQwVkBROUda7uoBlkEuBD+YD1A= github.com/mgechev/revive v1.3.9/go.mod h1:+uxEIr5UH0TjXWHTno3xh4u7eg6jDpXKzQccA9UGhHU= @@ -477,12 +471,6 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/nats-io/nats.go v1.37.0 h1:07rauXbVnnJvv1gfIyghFEo6lUcYRY0WXc3x7x0vUxE= -github.com/nats-io/nats.go v1.37.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= -github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI= -github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= -github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhKRf3Swg= github.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs= github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= @@ -504,8 +492,6 @@ github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJ github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/panjf2000/ants/v2 v2.10.0 h1:zhRg1pQUtkyRiOFo2Sbqwjp0GfBNo9cUY2/Grpx1p+8= -github.com/panjf2000/ants/v2 v2.10.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= @@ -551,8 +537,8 @@ github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/pubgo/dix v0.3.19 h1:a4RRmljw7ePUvc9uJKqXXs6JpYL8s3VqPP2NV2vxI9U= github.com/pubgo/dix v0.3.19/go.mod h1:J0PyuMm7mW6ZrN13l9xz0rtKbzliREFyvb7fuaGYyVw= -github.com/pubgo/funk v0.5.56 h1:LYpjOBDSSeTorRWda0lmf23sJNDm6ZtbbNS0xQjb1CE= -github.com/pubgo/funk v0.5.56/go.mod h1:uAs5IQDz6ovr5zy4LC0Uq7No/eTIbeloSCjF0EQJesw= +github.com/pubgo/funk v0.5.64 h1:viU8O9HHLppiHDwbAIV0I7msbI8TArJmwdEtLolqzx0= +github.com/pubgo/funk v0.5.64/go.mod h1:tfDZqz/x00YvqbvluiMh2s5HmZh1OIjNcv4fsdh4kSQ= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/pubgo/protobuild v0.0.21 h1:QSwh92QxsD6Mv7kQlowzE7fxtcOm1eMWmgADsD803Js= @@ -569,8 +555,9 @@ github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4l github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= github.com/reugn/go-quartz v0.11.2 h1:+jc54Ji06n/D/endEPmc+CuG/Jc8466nda1oxtFRrks= github.com/reugn/go-quartz v0.11.2/go.mod h1:no4ktgYbAAuY0E1SchR8cTx1LF4jYIzdgaQhzRPSkpk= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= @@ -592,8 +579,8 @@ github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tM github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= github.com/sashamelentyev/usestdlibvars v1.27.0 h1:t/3jZpSXtRPRf2xr0m63i32ZrusyurIGT9E5wAvXQnI= github.com/sashamelentyev/usestdlibvars v1.27.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8= -github.com/savsgio/gotils v0.0.0-20240303185622-093b76447511 h1:KanIMPX0QdEdB4R3CiimCAbxFrhB3j7h0/OvpYGVQa8= -github.com/savsgio/gotils v0.0.0-20240303185622-093b76447511/go.mod h1:sM7Mt7uEoCeFSCBM+qBrqvEo+/9vdmj19wzp3yzUhmg= +github.com/savsgio/gotils v0.0.0-20240704082632-aef3928b8a38 h1:D0vL7YNisV2yqE55+q0lFuGse6U8lxlg7fYTctlT5Gc= +github.com/savsgio/gotils v0.0.0-20240704082632-aef3928b8a38/go.mod h1:sM7Mt7uEoCeFSCBM+qBrqvEo+/9vdmj19wzp3yzUhmg= github.com/securego/gosec/v2 v2.21.2 h1:deZp5zmYf3TWwU7A7cR2+SolbTpZ3HQiwFqnzQyEl3M= github.com/securego/gosec/v2 v2.21.2/go.mod h1:au33kg78rNseF5PwPnTWhuYBFf534bvJRvOrgZ/bFzU= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= @@ -642,10 +629,9 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +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/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/tdakkota/asciicheck v0.2.0 h1:o8jvnUANo0qXtnslk2d3nMKTFNlOnJjRrNcj0j9qkHM= @@ -688,8 +674,8 @@ github.com/uudashr/gocognit v1.1.3 h1:l+a111VcDbKfynh+airAy/DJQKaXh2m9vkoysMPSZy github.com/uudashr/gocognit v1.1.3/go.mod h1:aKH8/e8xbTRBwjbCkwZ8qt4l2EpKXl31KMHgSS+lZ2U= 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.52.0 h1:wqBQpxH71XW0e2g+Og4dzQM8pk34aFYlA1Ga8db7gU0= -github.com/valyala/fasthttp v1.52.0/go.mod h1:hf5C4QnVMkNXMspnsUlfM3WitlgYflyhHYoKol/szxQ= +github.com/valyala/fasthttp v1.58.0 h1:GGB2dWxSbEprU9j0iMJHgdKYJVDyjrOwF9RE59PbRuE= +github.com/valyala/fasthttp v1.58.0/go.mod h1:SYXvHHaFp7QZHGKSHmoMipInhrI5StHrhDTYVEjK/Kw= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= @@ -700,6 +686,8 @@ github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAh github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/xen0n/gosmopolitan v1.2.2 h1:/p2KTnMzwRexIW8GlKawsTWOxn7UHA+jCMF/V8HHtvU= github.com/xen0n/gosmopolitan v1.2.2/go.mod h1:7XX7Mj61uLYrj0qmeN0zi7XDon9JRAEhYQqAPLVNTeg= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= github.com/yeya24/promlinter v0.3.0 h1:JVDbMp08lVCP7Y6NP3qHroGAO6z2yGKQtS5JsjqtoFs= @@ -766,8 +754,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= -golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= @@ -815,8 +803,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= -golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -830,9 +818,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -887,8 +874,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= diff --git a/lava/router.go b/lava/router.go index a193f0f81..152c08151 100644 --- a/lava/router.go +++ b/lava/router.go @@ -1,18 +1,17 @@ package lava import ( - "context" - "github.com/gofiber/fiber/v2" - "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "google.golang.org/grpc" ) type ProxyCfg struct { // Name service name Name string `yaml:"name"` + // Addr service address Addr string `yaml:"addr"` + // Resolver service resolver, default direct Resolver string `yaml:"resolver"` } @@ -27,11 +26,6 @@ type GrpcRouter interface { ServiceDesc() *grpc.ServiceDesc } -type GrpcGatewayRouter interface { - GrpcRouter - RegisterGateway(ctx context.Context, mux *runtime.ServeMux, conn grpc.ClientConnInterface) error -} - type HttpRouter interface { Middlewares() []Middleware Router(router fiber.Router) diff --git a/lava/service.go b/lava/service.go index 5d071a8dc..e4839a6c9 100644 --- a/lava/service.go +++ b/lava/service.go @@ -12,13 +12,11 @@ type Init interface { } type Close interface { - Close() + Close(ctx context.Context) error } type Service interface { - Start() - Stop() - Run() + Serve(ctx context.Context) error } // Server provides an interface for starting and stopping the server. diff --git a/main.go b/main.go index a8664760c..ca47e28eb 100644 --- a/main.go +++ b/main.go @@ -2,37 +2,22 @@ package main import ( "flag" - "github.com/goyek/goyek/v2" - "github.com/goyek/workflow" - "github.com/goyek/x/boot" + "github.com/pubgo/funk/assert" - "github.com/pubgo/lava/buildtasks" "github.com/pubgo/lava/core/flags" + "github.com/pubgo/lava/core/signal" "github.com/thejerf/suture/v4" _ "github.com/thejerf/suture/v4" ) func main() { - goyek.Undefine(workflow.PipelineAll) - s := suture.NewSimple("") s.Add() s.Remove() - - workflow.StageTest.SetDeps(append(workflow.StageTest.Deps(), buildtasks.GoLint)) - goyek.SetDefault(goyek.Define(goyek.Task{ - Name: "all", - Usage: "exec all tasks", - Deps: goyek.Deps{ - workflow.StageInit, - workflow.StageBuild, - workflow.StageTest, - }, - })) + s.Serve(signal.Context()) for _, f := range flags.GetFlags() { assert.Exit(f.Apply(flag.CommandLine)) } - boot.Main() } diff --git a/pkg/gateway/wrapper.go b/pkg/gateway/wrapper.go index aa55fdfd2..5901cfa0a 100644 --- a/pkg/gateway/wrapper.go +++ b/pkg/gateway/wrapper.go @@ -47,7 +47,7 @@ type methodWrapper struct { // if h.grpcMethodDesc != nil { // ctx := stream.Context() // -// reply, err := h.grpcMethodDesc.Handler(h.srv.srv, ctx, stream.RecvMsg, h.srv.opts.unaryInterceptor) +// reply, err := h.grpcMethodDesc.Exec(h.srv.srv, ctx, stream.RecvMsg, h.srv.opts.unaryInterceptor) // if err != nil { // return errors.WrapCaller(err) // } @@ -61,9 +61,9 @@ type methodWrapper struct { // } // // if h.srv.opts.streamInterceptor != nil { -// return errors.WrapCaller(h.srv.opts.streamInterceptor(h.srv.srv, stream, info, h.grpcStreamDesc.Handler)) +// return errors.WrapCaller(h.srv.opts.streamInterceptor(h.srv.srv, stream, info, h.grpcStreamDesc.Exec)) // } else { -// return errors.WrapCaller(h.grpcStreamDesc.Handler(h.srv.srv, stream)) +// return errors.WrapCaller(h.grpcStreamDesc.Exec(h.srv.srv, stream)) // } // } else { // return errors.Format("cannot find server handler") diff --git a/servers/grpcs/server.go b/servers/grpcs/server.go index 7277fa711..1535eae52 100644 --- a/servers/grpcs/server.go +++ b/servers/grpcs/server.go @@ -4,29 +4,29 @@ import ( "context" "errors" "fmt" - "io" "net" "net/http" "net/url" - "path/filepath" "strings" "github.com/fullstorydev/grpchan/inprocgrpc" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cors" - "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "github.com/pubgo/funk/assert" "github.com/pubgo/funk/async" "github.com/pubgo/funk/config" "github.com/pubgo/funk/errors/errutil" "github.com/pubgo/funk/generic" "github.com/pubgo/funk/log" - "github.com/pubgo/funk/proto/errorpb" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/running" "github.com/pubgo/funk/stack" "github.com/pubgo/funk/vars" "github.com/pubgo/funk/version" + "github.com/rs/xid" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "github.com/pubgo/lava/clients/grpcc" "github.com/pubgo/lava/clients/grpcc/grpcc_config" "github.com/pubgo/lava/core/debug" @@ -42,14 +42,6 @@ import ( "github.com/pubgo/lava/lava" "github.com/pubgo/lava/pkg/gateway" "github.com/pubgo/lava/pkg/httputil" - "github.com/pubgo/lava/pkg/wsproxy" - "github.com/rs/xid" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" - "google.golang.org/protobuf/encoding/protojson" ) func New() lava.Service { return newService() } @@ -72,15 +64,14 @@ type serviceImpl struct { conf *Config } -func (s *serviceImpl) Run() { - defer s.stop() - s.start() +func (s *serviceImpl) Serve(ctx context.Context) error { + defer s.stop(ctx) + s.start(ctx) signal.Wait() + <-ctx.Done() + return ctx.Err() } -func (s *serviceImpl) Start() { s.start() } -func (s *serviceImpl) Stop() { s.stop() } - func (s *serviceImpl) DixInject( grpcRouters []lava.GrpcRouter, httpRouters []lava.HttpRouter, @@ -165,9 +156,7 @@ func (s *serviceImpl) DixInject( })) } - app := fiber.New() - app.Group("/debug", httputil.StripPrefix(filepath.Join(conf.BaseUrl, "/debug"), debug.Handler)) - + httpApp := fiber.New() //app.Use(handlerHttpMiddle(globalMiddlewares)) for _, h := range httpRouters { //srv := doc.WithService() @@ -180,11 +169,9 @@ func (s *serviceImpl) DixInject( // } //} - if h.Prefix() == "" { - panic("http handler prefix is required") - } + assert.If(h.Prefix() == "", "http handler prefix required") - g := app.Group(h.Prefix(), handlerHttpMiddle(append(globalMiddlewares, h.Middlewares()...))) + g := httpApp.Group(h.Prefix(), handlerHttpMiddle(append(globalMiddlewares, h.Middlewares()...))) h.Router(g) if m, ok := h.(lava.Close); ok { @@ -196,122 +183,6 @@ func (s *serviceImpl) DixInject( } } - for _, handler := range grpcRouters { - h, ok := handler.(lava.HttpRouter) - if !ok { - continue - } - - if h.Prefix() == "" { - panic("http handler prefix is required") - } - - g := app.Group(h.Prefix(), handlerHttpMiddle(append(globalMiddlewares, h.Middlewares()...))) - h.Router(g) - - if m, ok := h.(lava.Close); ok { - lifecycle.BeforeStop(m.Close) - } - - if m, ok := h.(lava.Init); ok { - s.initList = append(s.initList, m.Init) - } - } - - httpServer.Mount(conf.BaseUrl, app) - - grpcGateway := runtime.NewServeMux( - runtime.WithMarshalerOption(runtime.MIMEWildcard, &runtime.HTTPBodyMarshaler{ - Marshaler: &runtime.JSONPb{ - MarshalOptions: protojson.MarshalOptions{ - EmitUnpopulated: true, - }, - UnmarshalOptions: protojson.UnmarshalOptions{ - DiscardUnknown: true, - }, - }, - }), - runtime.SetQueryParameterParser(new(DefaultQueryParser)), - runtime.WithIncomingHeaderMatcher(func(s string) (string, bool) { - return strings.ToLower(s), true - }), - runtime.WithOutgoingHeaderMatcher(func(s string) (string, bool) { - return strings.ToUpper(s), true - }), - runtime.WithMetadata(func(ctx context.Context, request *http.Request) metadata.MD { - path, ok := runtime.HTTPPathPattern(ctx) - if !ok { - return nil - } - return metadata.Pairs("http_path", path, "http_method", request.Method, "http_url", request.URL.Path) - }), - runtime.WithErrorHandler(func(ctx context.Context, mux *runtime.ServeMux, marshal runtime.Marshaler, w http.ResponseWriter, request *http.Request, err error) { - md, ok := runtime.ServerMetadataFromContext(ctx) - if ok && w != nil { - for k, v := range md.HeaderMD { - for i := range v { - w.Header().Add(k, v[i]) - } - } - - for k, v := range md.TrailerMD { - for i := range v { - w.Header().Add(k, v[i]) - } - } - } - - var pb *errorpb.ErrCode - sts, ok := status.FromError(err) - if !ok || sts == nil { - w.Header().Set("Content-Type", "application/json") - pb = &errorpb.ErrCode{ - Message: err.Error(), - StatusCode: errorpb.Code_Internal, - Code: int32(errorpb.Code_Internal), - Name: "lava.grpc.status", - } - } else { - w.Header().Set("Content-Type", marshal.ContentType(sts)) - if len(sts.Details()) > 0 { - if code, ok := sts.Details()[0].(*errorpb.Error); ok { - pb = code.Code - } - } else { - pb = &errorpb.ErrCode{ - Message: sts.Message(), - Code: int32(errorpb.Code(sts.Code())), - StatusCode: errorpb.Code(sts.Code()), - Name: "lava.grpc.status", - Details: sts.Proto().Details, - } - } - } - - const fallback = `{"code":13, "name":"lava.grpc.status", "status_code": 500, "message": "failed to marshal error message"}` - - // skip error - if pb.StatusCode == errorpb.Code_OK { - return - } - - buf, mErr := marshal.Marshal(pb) - if mErr != nil { - grpclog.Infof("Failed to marshal error message %q: %v", pb, mErr) - w.WriteHeader(http.StatusInternalServerError) - if _, err := io.WriteString(w, fallback); err != nil { - grpclog.Infof("Failed to write response: %v", err) - } - return - } - - w.WriteHeader(runtime.HTTPStatusFromCode(codes.Code(pb.StatusCode))) - if _, err := w.Write(buf); err != nil { - grpclog.Infof("Failed to write response: %v", err) - } - }), - ) - mux := gateway.NewMux() if len(gw) > 0 { mux = gw[0] @@ -339,9 +210,6 @@ func (s *serviceImpl) DixInject( mux.RegisterService(desc, h) s.cc.RegisterService(desc, h) - if m, ok := h.(lava.GrpcGatewayRouter); ok { - assert.Exit(m.RegisterGateway(context.Background(), grpcGateway, s.cc)) - } } for _, h := range grpcProxy { @@ -396,53 +264,56 @@ func (s *serviceImpl) DixInject( grpcServer.RegisterService(h.ServiceDesc(), h) } - apiPrefix1 := assert.Must1(url.JoinPath(conf.BaseUrl, "gw")) - s.log.Info().Str("path", apiPrefix1).Msg("service grpc gateway base path") - httpServer.Group(apiPrefix1, httputil.StripPrefix(apiPrefix1, mux.Handler)) + grpcGatewayApiPrefix := assert.Must1(url.JoinPath(conf.BaseUrl, "api")) + s.log.Info().Str("path", grpcGatewayApiPrefix).Msg("service grpc gateway base path") + for _, m := range mux.GetRouteMethods() { log.Info(). Str("operation", m.Operation). Any("rpc-meta", mux.GetOperation(m.Operation).Meta). Str("http-method", m.Method). - Str("http-path", "/"+strings.Trim(apiPrefix1, "/")+m.Path). + Str("http-path", "/"+strings.Trim(grpcGatewayApiPrefix, "/")+m.Path). Str("verb", m.Verb). Any("path-vars", m.Vars). Str("extras", fmt.Sprintf("%v", m.Extras)). Msg("grpc gateway router info") } - apiPrefix := assert.Must1(url.JoinPath(conf.BaseUrl, "api")) - s.log.Info().Str("path", apiPrefix).Msg("service grpc gateway base path") - httpServer.Group(apiPrefix, httputil.HTTPHandler(http.StripPrefix(apiPrefix, wsproxy.WebsocketProxy(grpcGateway, - wsproxy.WithPingPong(conf.EnablePingPong), - wsproxy.WithTimeWait(conf.PingPongTime), - wsproxy.WithReadLimit(int64(generic.FromPtr(conf.WsReadLimit))), - )))) + httpServer.Mount("/debug", debug.App()) + httpServer.Mount(conf.BaseUrl, httpApp) + httpServer.Group(grpcGatewayApiPrefix, httputil.StripPrefix(grpcGatewayApiPrefix, mux.Handler)) s.httpServer = httpServer s.grpcServer = grpcServer vars.RegisterValue(fmt.Sprintf("%s-grpc-server-config-%s", version.Project(), xid.New()), &conf) - // vars.RegisterValue(fmt.Sprintf("%s-grpc-server-router-%s", version.Project(), xid.New()), mux.App().Stack()) + vars.Register(fmt.Sprintf("%s-grpc-server-router-%s", version.Project(), xid.New()), func() interface{} { + return mux.GetRouteMethods() + }) + vars.Register(fmt.Sprintf("%s-grpc-server-desc-%s", version.Project(), xid.New()), func() interface{} { + return grpcServer.GetServiceInfo() + }) + vars.Register(fmt.Sprintf("%s-http-server-router-%s", version.Project(), xid.New()), func() interface{} { + return httpServer.Stack() + }) } -func (s *serviceImpl) start() { +func (s *serviceImpl) start(ctx context.Context) (gErr error) { defer recovery.Exit() logutil.OkOrFailed(s.log, "running before service starts", func() error { - defer recovery.Exit() for _, run := range s.lc.GetBeforeStarts() { - s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Handler)) - run.Handler() + s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) + assert.Exit(run.Exec(ctx)) } return nil }) logutil.OkOrFailed(s.log, "init handler before service starts", func() error { defer recovery.Exit() - for _, ii := range s.initList { - s.log.Info().Msgf("init handler %s", stack.CallerWithFunc(ii)) - ii() + for _, init := range s.initList { + s.log.Info().Msgf("init handler %s", stack.CallerWithFunc(init)) + init() } return nil }) @@ -451,21 +322,21 @@ func (s *serviceImpl) start() { Int("grpc-port", *s.conf.GrpcPort). Int("http-port", *s.conf.HttpPort). Msg("create network listener") - grpcLn := assert.Must1(net.Listen("tcp", fmt.Sprintf(":%d", *s.conf.GrpcPort))) - httpLn := assert.Must1(net.Listen("tcp", fmt.Sprintf(":%d", *s.conf.HttpPort))) + grpcLn := assert.Exit1(net.Listen("tcp", fmt.Sprintf(":%d", *s.conf.GrpcPort))) + httpLn := assert.Exit1(net.Listen("tcp", fmt.Sprintf(":%d", *s.conf.HttpPort))) logutil.OkOrFailed(s.log, "service starts", func() error { // 启动grpc服务 async.GoDelay(func() error { s.log.Info().Msg("[grpc] Server Starting") logutil.LogOrErr(s.log, "[grpc] Server Stop", func() error { - defer recovery.Exit() - if err := s.grpcServer.Serve(grpcLn); err != nil && - !errors.Is(err, http.ErrServerClosed) && - !errors.Is(err, net.ErrClosed) { - return err + defer recovery.DebugPrint() + err := s.grpcServer.Serve(grpcLn) + if err == nil || errors.Is(err, http.ErrServerClosed) || errors.Is(err, net.ErrClosed) { + return nil } - return nil + + return err }) return nil }) @@ -474,13 +345,13 @@ func (s *serviceImpl) start() { async.GoDelay(func() error { s.log.Info().Msg("[http] Server Starting") logutil.LogOrErr(s.log, "[http] Server Stop", func() error { - defer recovery.Exit() - if err := s.httpServer.Listener(httpLn); err != nil && - !errors.Is(err, http.ErrServerClosed) && - !errors.Is(err, net.ErrClosed) { - return err + defer recovery.DebugPrint() + err := s.httpServer.Listener(httpLn) + if err == nil || errors.Is(err, http.ErrServerClosed) || errors.Is(err, net.ErrClosed) { + return nil } - return nil + + return err }) return nil }) @@ -489,25 +360,23 @@ func (s *serviceImpl) start() { logutil.OkOrFailed(s.log, "running after service starts", func() error { for _, run := range s.lc.GetAfterStarts() { - logutil.LogOrErr( - s.log, - fmt.Sprintf("running %s", stack.CallerWithFunc(run.Handler)), - func() error { run.Handler(); return nil }, - ) + s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) + assert.Exit(run.Exec(ctx)) } return nil }) + return nil } -func (s *serviceImpl) stop() { - defer recovery.Exit() +func (s *serviceImpl) stop(ctx context.Context) { + defer recovery.DebugPrint() logutil.OkOrFailed(s.log, "running before service stops", func() error { for _, run := range s.lc.GetBeforeStops() { logutil.LogOrErr( s.log, - fmt.Sprintf("running %s", stack.CallerWithFunc(run.Handler)), - func() error { run.Handler(); return nil }, + fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), + func() error { return run.Exec(ctx) }, ) } return nil @@ -526,8 +395,8 @@ func (s *serviceImpl) stop() { for _, run := range s.lc.GetAfterStops() { logutil.LogOrErr( s.log, - fmt.Sprintf("running %s", stack.CallerWithFunc(run.Handler)), - func() error { run.Handler(); return nil }, + fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), + func() error { return run.Exec(ctx) }, ) } return nil diff --git a/servers/https/server.go b/servers/https/server.go index 5c3ee4839..929370fbf 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -168,8 +168,8 @@ func (s *serviceImpl) start() { logutil.OkOrFailed(s.log, "service before-start", func() error { defer recovery.Exit() for _, run := range s.lc.GetBeforeStarts() { - s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Handler)) - run.Handler() + s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) + run.Exec() } return nil }) @@ -196,8 +196,8 @@ func (s *serviceImpl) start() { logutil.OkOrFailed(s.log, "service after-start", func() error { defer recovery.Exit() for _, run := range s.lc.GetAfterStarts() { - s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Handler)) - run.Handler() + s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) + run.Exec() } return nil }) @@ -206,8 +206,8 @@ func (s *serviceImpl) start() { func (s *serviceImpl) stop() { logutil.OkOrFailed(s.log, "service before-stop", func() error { for _, run := range s.lc.GetBeforeStops() { - s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Handler)) - run.Handler() + s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) + run.Exec() } return nil }) @@ -218,8 +218,8 @@ func (s *serviceImpl) stop() { logutil.OkOrFailed(s.log, "service after-stop", func() error { for _, run := range s.lc.GetAfterStops() { - s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Handler)) - run.Handler() + s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) + run.Exec() } return nil }) diff --git a/servers/sses/sse.go b/servers/sses/sse.go new file mode 100644 index 000000000..5dcb0ffab --- /dev/null +++ b/servers/sses/sse.go @@ -0,0 +1,250 @@ +package sses + +import ( + "bufio" + "fmt" + "time" + + "github.com/gofiber/fiber/v2" +) + +// SSEEvent is a struct that represents an SSE event +type FiberSSEEvent struct { + Timestamp time.Time `json:"timestamp"` + ID string `json:"id"` + Event string `json:"event"` + Data string `json:"data"` + Retry string `json:"retry"` + OnChannel *FiberSSEChannel +} + +// # TypeDef +// +// Exec for channel events +type FiberSSEEventHandler func(ctx *fiber.Ctx, sseChannel *FiberSSEChannel) + +// # TypeDef +// +// Exec for specific events on a channel +type FiberSSEOnEventHandler func(ctx *fiber.Ctx, sseChannel *FiberSSEChannel, sseEvent *FiberSSEEvent) +type FiberSSEEvents interface { + OnConnect(handlers ...FiberSSEEventHandler) + OnDisconnect(handlers ...FiberSSEEventHandler) + OnEvent(eventName string, handlers ...FiberSSEOnEventHandler) + FireOnEventHandlers(fiberCtx *fiber.Ctx, event string) +} + +/* +A channel with a name, and a sub-base-path +*/ +type FiberSSEChannel struct { + FiberSSEEvents + Name string + Base string + Events chan *FiberSSEEvent + ParentSSEApp *FiberSSEApp + Handlers map[string]([]FiberSSEEventHandler) + EventHandlers map[string]([]FiberSSEOnEventHandler) +} +type FiberSSEHandler func(c *fiber.Ctx, w *bufio.Writer) error + +/* +The SSE Information Structure includes a list of channels and the fiber application +*/ +type FiberSSEApp struct { + IFiberSSEApp + Base string + Router *fiber.Router + Channels map[string]*FiberSSEChannel + FiberApp *fiber.App +} + +// FiberSSEApp Interface +type IFiberSSEApp interface { + ServeHTTP(ctx *fiber.Ctx) error + CreateChannel(name, base string) *FiberSSEChannel + ListChannels() map[string]*FiberSSEChannel + GetChannel(name string) *FiberSSEChannel +} + +/* +New initializes a base SSE route group at `base`. + +The base route is the base path for all channels. + +The channels parameter is a list of channels that will be created. +Each channel has a name, a base route, and a channel for sending events. + + // Create a new SSE app + app := fiber.New() + // Create a new SSE app on the fiber app + sseApp := ssefiber.New(app, "/sse") + // Add a channel to the SSE app + testChan := sseApp.CreateChannel("test", "/test") // Channel at /sse/test + // Events Channel + eventsChan := testChan.Events +*/ +func New(app *fiber.App, base string) *FiberSSEApp { + // Add the base route + fiberRouter := app.Group(base, func(c *fiber.Ctx) error { + // Set the headers for SSE + c.Set("Cache-Control", "no-cache") + c.Set("Content-Type", "text/event-stream") + c.Set("Connection", "keep-alive") + c.Set("Access-Control-Allow-Origin", "*") + return c.Next() + }) + + // Create a new SSE App + newFSSEApp := &FiberSSEApp{ + Base: base, + Router: &fiberRouter, + FiberApp: app, + Channels: make(map[string]*FiberSSEChannel), + } + return newFSSEApp +} + +/* +CreateChannel creates a new channel with the given name and base path. +Functions as a shortcut for making a new chan each time + +Example: + + app := fiber.New() + sseApp := ssefiber.New(app, "/sse") + chanOne := sseApp.CreateChannel("Channel One", "/one") + chanTwo := sseApp.CreateChannel("Channel Two", "/two") +*/ +func (app *FiberSSEApp) CreateChannel(name, base string) *FiberSSEChannel { + newChannel := &FiberSSEChannel{ + Name: name, + Base: base, + Events: make(chan *FiberSSEEvent), + ParentSSEApp: app, + Handlers: make(map[string][]FiberSSEEventHandler), + EventHandlers: make(map[string][]FiberSSEOnEventHandler), + } + app.Channels[name] = newChannel + // Add the sub-route for the channel + (*app.Router).Get(newChannel.Base, newChannel.ServeHTTP) + return newChannel +} + +// ListChannels returns a list of all the channels and prints them to the console +func (app *FiberSSEApp) ListChannels() map[string]*FiberSSEChannel { + fmt.Println("Listing Channels...") + for _, channel := range app.Channels { + channel.Print() + } + return app.Channels +} + +/* +Create an event and send it to the channel. +*/ +func (channel *FiberSSEChannel) SendEvent(event, data string) { + sseEvent := &FiberSSEEvent{ + Timestamp: time.Now(), + Event: event, + Data: data, + OnChannel: channel, + } + channel.Events <- sseEvent +} + +// Flush the event to the writer `w` - formats according to SSE standard +func (e *FiberSSEEvent) Flush(w *bufio.Writer) error { + fmt.Fprintf(w, "event: %s\ndata: %s\n\n", e.Event, e.Data) + return w.Flush() +} + +// Prints the channel information to the console +func (c *FiberSSEChannel) Print() { + fmt.Printf("==CHANNEL CREATED==\nName: %s\nRoute Endpoint: %s\n===================", c.Name, c.ParentSSEApp.Base+c.Base) +} + +// # Internal Method +// +// ServeHTTP returns a fiber.Handler for the channel. +// +// Use `sseApp.CreateChannel` to create a new channel. +func (fChan *FiberSSEChannel) ServeHTTP(c *fiber.Ctx) error { + + c.Context().SetBodyStreamWriter(func(w *bufio.Writer) { + // Fire OnConnect Event Handlers + + go fChan.FireHandlers(c, "connect") + + for { + event, more := <-fChan.Events + // fmt.Fprintf(w, "event: %s\ndata: %s\n\n", string(event.Event), string(event.Data)) + // w.Flush() + go event.FireEventHandlers(c) + if err := event.Flush(w); err != nil { + go fChan.FireHandlers(c, "disconnect") + return + } + if !more { + // Fire OnDisconnect Event Handlers + go fChan.FireHandlers(c, "disconnect") + return + } + } + }) + + return nil + +} + +// Cleanup removes all of the channels from the app. Should be used as a defer +func (sseApp *FiberSSEApp) Cleanup() { + for _, channel := range sseApp.Channels { + close(channel.Events) + } + fmt.Println("All Channels Closed - Cleanup Successful") +} + +// Fire the handlers for a given channel event (connect, disconnect) +func (channel *FiberSSEChannel) FireHandlers(fiberCtx *fiber.Ctx, event string) { + for _, handler := range channel.Handlers[event] { + handler(fiberCtx, channel) + } +} + +// Fire the handlers for this event +func (e *FiberSSEEvent) FireEventHandlers(fiberCtx *fiber.Ctx) { + channel := e.OnChannel + for _, handler := range channel.EventHandlers[e.Event] { + handler(fiberCtx, channel, e) + } +} + +// Adds the handlers to the channel for the connect method +func (channel *FiberSSEChannel) OnConnect(handlers ...FiberSSEEventHandler) { + channel.Handlers["connect"] = []FiberSSEEventHandler{} + channel.Handlers["connect"] = append(channel.Handlers["connect"], handlers...) +} + +// Adds the handlers to the channel for the disconnect method +func (channel *FiberSSEChannel) OnDisconnect(handlers ...FiberSSEEventHandler) { + channel.Handlers["disconnect"] = []FiberSSEEventHandler{} + channel.Handlers["disconnect"] = append(channel.Handlers["disconnect"], handlers...) +} + +// Add handlers for the any given event +// +// Example: +// +// channelOne.OnEvent("test", ...) // Fires anytime the event "test" is fired +func (channel *FiberSSEChannel) OnEvent(eventName string, handlers ...FiberSSEOnEventHandler) { + channel.EventHandlers[eventName] = []FiberSSEOnEventHandler{} + channel.EventHandlers[eventName] = append(channel.EventHandlers[eventName], handlers...) + +} + +// Returns a channel by name +func (app *FiberSSEApp) GetChannel(name string) *FiberSSEChannel { + findChan := app.Channels[name] + return findChan +} diff --git a/servers/tasks/server.go b/servers/tasks/server.go index 587f010ad..4ef41e6cd 100644 --- a/servers/tasks/server.go +++ b/servers/tasks/server.go @@ -86,8 +86,8 @@ func (s *Server) start() { logutil.OkOrFailed(s.log, "running before service starts", func() error { defer recovery.Exit() for _, run := range s.lc.GetBeforeStarts() { - s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Handler)) - run.Handler() + s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) + run.Exec() } return nil }) @@ -120,8 +120,8 @@ func (s *Server) start() { for _, run := range s.lc.GetAfterStarts() { logutil.LogOrErr( s.log, - fmt.Sprintf("running %s", stack.CallerWithFunc(run.Handler)), - func() error { run.Handler(); return nil }, + fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), + func() error { run.Exec(); return nil }, ) } return nil @@ -135,8 +135,8 @@ func (s *Server) stop() { for _, run := range s.lc.GetBeforeStops() { logutil.LogOrErr( s.log, - fmt.Sprintf("running %s", stack.CallerWithFunc(run.Handler)), - func() error { run.Handler(); return nil }, + fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), + func() error { run.Exec(); return nil }, ) } return nil @@ -155,8 +155,8 @@ func (s *Server) stop() { for _, run := range s.lc.GetAfterStops() { logutil.LogOrErr( s.log, - fmt.Sprintf("running %s", stack.CallerWithFunc(run.Handler)), - func() error { run.Handler(); return nil }, + fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), + func() error { run.Exec(); return nil }, ) } return nil diff --git a/servers/wss/server.go b/servers/wss/server.go index 405ba9927..ffc572a7c 100644 --- a/servers/wss/server.go +++ b/servers/wss/server.go @@ -1,10 +1,10 @@ package wss import ( - "log" - + _ "github.com/gofiber/contrib/socketio" + "github.com/gofiber/contrib/websocket" "github.com/gofiber/fiber/v2" - "github.com/gofiber/websocket/v2" + "log" ) func init() { @@ -20,7 +20,7 @@ func init() { return fiber.ErrUpgradeRequired }) - app.Get("/ws/:id", websocket.New(func(c *websocket.Conn) { + app.Get("/ws/:id", websocket.New(func(c *Conn) { // c.Locals is added to the *websocket.Conn log.Println(c.Locals("allowed")) // true log.Println(c.Params("id")) // 123 @@ -33,11 +33,13 @@ func init() { msg []byte err error ) + for { if mt, msg, err = c.ReadMessage(); err != nil { log.Println("read:", err) break } + log.Printf("recv: %s", msg) if err = c.WriteMessage(mt, msg); err != nil { From 3af40fb1b3e2b08d300bb1da3f782e32759dd9a5 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 26 Apr 2025 22:05:00 +0800 Subject: [PATCH 008/142] fix: barry quick fix, 2025-04-26 22:05:00 --- clients/grpcc/grpcc_lb/p2c/p2c.go | 2 +- cmds/grpcservercmd/cmd.go | 12 ++--- cmds/httpservercmd/cmd.go | 10 ++-- core/flags/default.go | 42 ++++++++-------- core/metrics/metric.go | 4 +- core/pidfile/builder.go | 4 +- core/responses/response.go | 10 ---- core/responses/response_test.go | 19 -------- core/scheduler/builder.go | 5 +- core/tracing/telemetry.go | 32 +++++++------ go.mod | 30 ++++++------ go.sum | 58 ++++++++++++----------- lava/service.go | 7 ++- main.go | 23 --------- pkg/gateway/internal/routertree/parser.go | 7 ++- servers/grpcs/server.go | 13 ++--- servers/https/server.go | 38 ++++++++------- servers/tasks/server.go | 43 ++++++++--------- servers/wss/server.go | 5 +- 19 files changed, 166 insertions(+), 198 deletions(-) delete mode 100644 core/responses/response.go delete mode 100644 core/responses/response_test.go delete mode 100644 main.go diff --git a/clients/grpcc/grpcc_lb/p2c/p2c.go b/clients/grpcc/grpcc_lb/p2c/p2c.go index 46906894b..2a2440d0d 100644 --- a/clients/grpcc/grpcc_lb/p2c/p2c.go +++ b/clients/grpcc/grpcc_lb/p2c/p2c.go @@ -11,7 +11,7 @@ var _ base.PickerBuilder = (*p2cBalancer)(nil) type p2cBalancer struct{} func (p2c *p2cBalancer) Build(info base.PickerBuildInfo) balancer.Picker { - if info.ReadySCs == nil || len(info.ReadySCs) == 0 { + if len(info.ReadySCs) == 0 { return base.NewErrPicker(balancer.ErrNoSubConnAvailable) } diff --git a/cmds/grpcservercmd/cmd.go b/cmds/grpcservercmd/cmd.go index ca9a0373d..dbc2d275b 100644 --- a/cmds/grpcservercmd/cmd.go +++ b/cmds/grpcservercmd/cmd.go @@ -2,23 +2,21 @@ package grpcservercmd import ( "context" + "github.com/pubgo/dix" - "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/version" + "github.com/urfave/cli/v3" + "github.com/pubgo/lava/pkg/cmdutil" "github.com/pubgo/lava/servers/grpcs" - "github.com/urfave/cli/v3" ) func New(di *dix.Dix) *cli.Command { return &cli.Command{ Name: "grpc", - Usage: cmdutil.UsageDesc("%s grpc service", version.Project()), + Usage: cmdutil.UsageDesc("grpc service %s(%s)", version.Project(), version.Version()), Action: func(ctx context.Context, command *cli.Command) error { - defer recovery.Exit() - srv := dix.Inject(di, grpcs.New()) - srv.Run() - return nil + return dix.Inject(di, grpcs.New()).Serve(ctx) }, } } diff --git a/cmds/httpservercmd/cmd.go b/cmds/httpservercmd/cmd.go index 896ba2d23..b8362ec98 100644 --- a/cmds/httpservercmd/cmd.go +++ b/cmds/httpservercmd/cmd.go @@ -2,12 +2,13 @@ package httpservercmd import ( "context" + "github.com/pubgo/dix" - "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/version" + "github.com/urfave/cli/v3" + "github.com/pubgo/lava/pkg/cmdutil" "github.com/pubgo/lava/servers/https" - "github.com/urfave/cli/v3" ) func New(di *dix.Dix) *cli.Command { @@ -15,10 +16,7 @@ func New(di *dix.Dix) *cli.Command { Name: "http", Usage: cmdutil.UsageDesc("%s http service", version.Project()), Action: func(ctx context.Context, command *cli.Command) error { - defer recovery.Exit() - srv := dix.Inject(di, https.New()) - srv.Run() - return nil + return dix.Inject(di, https.New()).Serve(ctx) }, } } diff --git a/core/flags/default.go b/core/flags/default.go index 293e55442..31ff86243 100644 --- a/core/flags/default.go +++ b/core/flags/default.go @@ -17,25 +17,25 @@ func init() { env.GetIntVal(&running.GrpcPort, grpcPort) Register(&cli.IntFlag{ - Name: "http-port", - Usage: "service http port", - Persistent: true, - Value: int64(running.HttpPort), - Sources: cli.EnvVars(env.Key(httpPort)), - Action: func(ctx context.Context, command *cli.Command, i int64) error { - running.HttpPort = int(i) + Name: "http-port", + Usage: "service http port", + Local: true, + Value: running.HttpPort, + Sources: cli.EnvVars(env.Key(httpPort)), + Action: func(ctx context.Context, command *cli.Command, i int) error { + running.HttpPort = i return nil }, }) Register(&cli.IntFlag{ - Name: "grpc-port", - Usage: "service grpc port", - Persistent: true, - Value: int64(running.GrpcPort), - Sources: cli.EnvVars(env.Key("server_grpc_port")), - Action: func(ctx context.Context, command *cli.Command, i int64) error { - running.GrpcPort = int(i) + Name: "grpc-port", + Usage: "service grpc port", + Local: true, + Value: running.GrpcPort, + Sources: cli.EnvVars(env.Key(grpcPort)), + Action: func(ctx context.Context, command *cli.Command, i int) error { + running.GrpcPort = i return nil }, }) @@ -43,19 +43,19 @@ func init() { Register(&cli.BoolFlag{ Name: "debug", Usage: "enable debug mode", - Persistent: true, + Local: true, Value: running.IsDebug, Destination: &running.IsDebug, Sources: cli.EnvVars(env.Key("debug"), env.Key("enable_debug")), }) Register(&cli.StringFlag{ - Name: "config", - Aliases: []string{"c"}, - Usage: "config path", - Value: config.GetConfigPath(), - Persistent: true, - Sources: cli.EnvVars(env.Key(conf)), + Name: "config", + Aliases: []string{"c"}, + Usage: "config path", + Value: config.GetConfigPath(), + Local: true, + Sources: cli.EnvVars(env.Key(conf)), Action: func(ctx context.Context, command *cli.Command, s string) error { config.SetConfigPath(s) return nil diff --git a/core/metrics/metric.go b/core/metrics/metric.go index 030cc942b..a252a7a6d 100644 --- a/core/metrics/metric.go +++ b/core/metrics/metric.go @@ -1,6 +1,8 @@ package metrics import ( + "context" + "github.com/pubgo/funk/assert" "github.com/pubgo/funk/generic" "github.com/pubgo/funk/log" @@ -27,7 +29,7 @@ func New(m lifecycle.Lifecycle, cfg *Config, log log.Logger) Metric { opts.Tags = Tags{"project": version.Project()} scope, closer := tally.NewRootScope(lo.FromPtr(opts), cfg.Interval) - m.BeforeStop(func() { assert.Must(closer.Close()) }) + m.BeforeStop(func(ctx context.Context) error { return closer.Close() }) registerVars(scope) return scope diff --git a/core/pidfile/builder.go b/core/pidfile/builder.go index 1ca2f406d..5ad1f3c2d 100644 --- a/core/pidfile/builder.go +++ b/core/pidfile/builder.go @@ -1,9 +1,9 @@ package pidfile import ( + "context" "path/filepath" - "github.com/pubgo/funk/assert" "github.com/pubgo/funk/config" "github.com/pubgo/funk/pathutil" @@ -16,6 +16,6 @@ func New() lifecycle.Handler { _ = pathutil.IsNotExistMkDir(pidPath) - lc.AfterStart(func() { assert.Must(SavePid()) }) + lc.AfterStart(func(ctx context.Context) error { return SavePid() }) } } diff --git a/core/responses/response.go b/core/responses/response.go deleted file mode 100644 index cd5639f57..000000000 --- a/core/responses/response.go +++ /dev/null @@ -1,10 +0,0 @@ -package responses - -import ( - "github.com/pubgo/funk/proto/errorpb" -) - -type Response struct { - Err *errorpb.ErrCode `json:"err"` - Data any `json:"data"` -} diff --git a/core/responses/response_test.go b/core/responses/response_test.go deleted file mode 100644 index d2f612c5c..000000000 --- a/core/responses/response_test.go +++ /dev/null @@ -1,19 +0,0 @@ -package responses - -import ( - "encoding/json" - "testing" - - "github.com/pubgo/funk/proto/testcodepb" - "github.com/stretchr/testify/assert" -) - -func TestResponse(t *testing.T) { - rsp := &Response{ - Err: testcodepb.ErrCodeDbConn, - Data: nil, - } - bytes, err1 := json.Marshal(rsp) - assert.Nil(t, err1) - t.Log(string(bytes)) -} diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index e2e573290..735faeebe 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -37,7 +37,10 @@ func New(m lifecycle.Lifecycle, log log.Logger, opts []*Config, routers []CronRo } quart.start() - m.BeforeStop(quart.stop) + m.BeforeStop(func(ctx context.Context) error { + quart.stop() + return nil + }) for _, r := range routers { r.Crontab(quart) diff --git a/core/tracing/telemetry.go b/core/tracing/telemetry.go index 0934ea30b..eefb2b5b7 100644 --- a/core/tracing/telemetry.go +++ b/core/tracing/telemetry.go @@ -8,31 +8,28 @@ import ( "github.com/goccy/go-json" "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/errors/errcheck" "github.com/pubgo/funk/log" + "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/version" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" "go.opentelemetry.io/otel/exporters/otlp/otlptrace" otlpTraceGrpc "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" otelprom "go.opentelemetry.io/otel/exporters/prometheus" + "go.opentelemetry.io/otel/exporters/stdout/stdoutmetric" "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" + otelmetric "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/propagation" - + "go.opentelemetry.io/otel/sdk/metric" sdkmetric "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.7.0" - - otelmetric "go.opentelemetry.io/otel/metric" oteltrace "go.opentelemetry.io/otel/trace" - "google.golang.org/grpc/encoding/gzip" "github.com/pubgo/lava/core/lifecycle" - - "go.opentelemetry.io/otel/sdk/metric" - - "go.opentelemetry.io/otel/exporters/stdout/stdoutmetric" ) var logs = log.GetLogger("tracing") @@ -76,11 +73,14 @@ func New(cfg *Config, lc lifecycle.Lifecycle) Provider { propagation.Baggage{}, ), ) - meterProvider := NewPrometheusMeterProvider(config) + meterProvider, err := NewPrometheusMeterProvider(config) + assert.Exit(err) - lc.AfterStop(func() { + lc.AfterStop(func(ctx context.Context) (gErr error) { + defer recovery.Err(&gErr) assert.Must(tracerProvider.Shutdown(context.Background())) assert.Must(meterProvider.Shutdown(context.Background())) + return nil }) // name := instrumentationName + "/" + config.serviceInfo.Namespace + "/" + config.serviceInfo.Name @@ -105,7 +105,7 @@ func mergeResource(config *Config) *resource.Resource { semconv.ProcessCommandKey.String(os.Args[0]), ) - return assert.Must1(resource.Merge(resource.Default(), defaultResource)) + return assert.Exit1(resource.Merge(resource.Default(), defaultResource)) } func NewTracer(config *Config) *sdktrace.TracerProvider { @@ -165,14 +165,18 @@ func initTracerExporter(config *Config) (sdktrace.SpanExporter, error) { return nil, fmt.Errorf("tracer exporter endpoint is nil, no exporter is inited") } -func NewPrometheusMeterProvider(config *Config) *sdkmetric.MeterProvider { +func NewPrometheusMeterProvider(config *Config, opts ...otelprom.Option) (_ *sdkmetric.MeterProvider, gErr error) { + exporter, err := otelprom.New(opts...) + if errcheck.Check(&gErr, err) { + return + } + res := mergeResource(config) - exporter := assert.Must1(otelprom.New()) provider := sdkmetric.NewMeterProvider( sdkmetric.WithReader(exporter), sdkmetric.WithResource(res), ) - return provider + return provider, nil } func TraceID(span oteltrace.Span) string { diff --git a/go.mod b/go.mod index 9624c421f..efe0db6d1 100644 --- a/go.mod +++ b/go.mod @@ -17,9 +17,14 @@ require ( github.com/pubgo/opendoc v0.0.5 github.com/reugn/go-quartz v0.11.2 github.com/vmihailenco/msgpack/v5 v5.4.1 - go.opentelemetry.io/otel v1.30.0 - go.opentelemetry.io/otel/metric v1.30.0 - go.opentelemetry.io/otel/trace v1.30.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0 + go.opentelemetry.io/otel/exporters/prometheus v0.54.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk v1.32.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 go.uber.org/atomic v1.11.0 // indirect go.uber.org/automaxprocs v1.5.3 golang.org/x/crypto v0.31.0 // indirect @@ -27,18 +32,18 @@ require ( golang.org/x/net v0.33.0 golang.org/x/sys v0.31.0 // indirect google.golang.org/grpc v1.66.1 - google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 + google.golang.org/protobuf v1.35.1 ) require ( github.com/goccy/go-json v0.10.2 github.com/mailgun/holster/v4 v4.19.0 - github.com/prometheus/client_golang v1.19.1 + github.com/prometheus/client_golang v1.20.5 github.com/valyala/bytebufferpool v1.0.0 ) require ( - github.com/alecthomas/participle/v2 v2.1.1 + github.com/alecthomas/participle/v2 v2.1.4 github.com/arl/statsviz v0.6.0 github.com/dave/jennifer v1.7.0 github.com/ecordell/optgen v0.0.9 @@ -57,7 +62,7 @@ require ( github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 github.com/maragudk/gomponents v0.20.0 github.com/maruel/panicparse/v2 v2.5.0 - github.com/prometheus/common v0.48.0 + github.com/prometheus/common v0.60.1 github.com/pubgo/dix v0.3.19 github.com/pubgo/funk v0.5.64 github.com/pubgo/protobuild v0.0.21 @@ -65,19 +70,13 @@ require ( github.com/rs/zerolog v1.33.0 github.com/samber/lo v1.47.0 github.com/stretchr/testify v1.10.0 - github.com/thejerf/suture/v4 v4.0.6 github.com/uber-go/tally/v4 v4.1.16 - github.com/urfave/cli/v3 v3.0.0-alpha9.0.20240717192922-127cf54fac9f + github.com/urfave/cli/v3 v3.2.0 github.com/valyala/fasthttp v1.58.0 github.com/valyala/fasttemplate v1.2.2 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.26.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0 - go.opentelemetry.io/otel/exporters/prometheus v0.45.2 go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.23.1 go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 - go.opentelemetry.io/otel/sdk v1.30.0 - go.opentelemetry.io/otel/sdk/metric v1.26.0 golang.org/x/tools v0.25.0 golang.org/x/vuln v1.1.3 google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 @@ -218,6 +217,7 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/moricho/tparallel v0.3.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nakabonne/nestif v0.3.1 // indirect github.com/nishanths/exhaustive v0.12.0 // indirect github.com/nishanths/predeclared v0.2.2 // indirect @@ -229,7 +229,7 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/polyfloyd/go-errorlint v1.6.0 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/procfs v0.12.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 // indirect github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect github.com/quasilyte/gogrep v0.5.0 // indirect diff --git a/go.sum b/go.sum index 42abe1749..6f7d7ea68 100644 --- a/go.sum +++ b/go.sum @@ -35,12 +35,12 @@ github.com/a8m/envsubst v1.3.0 h1:GmXKmVssap0YtlU3E230W98RWtWCyIZzjtf1apWWyAg= github.com/a8m/envsubst v1.3.0/go.mod h1:MVUTQNGQ3tsjOOtKCNd+fl8RzhsXcDvvAEzkhGtlsbY= github.com/ahmetb/go-linq v3.0.0+incompatible h1:qQkjjOXKrKOTy83X8OpRmnKflXKQIL/mC/gMVVDMhOA= github.com/ahmetb/go-linq v3.0.0+incompatible/go.mod h1:PFffvbdbtw+QTB0WKRP0cNht7vnCfnGlEpak/DVg5cY= -github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0= -github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= +github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= +github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= github.com/alecthomas/go-check-sumtype v0.1.4 h1:WCvlB3l5Vq5dZQTFmodqL2g68uHiSwwlWcT5a2FGK0c= github.com/alecthomas/go-check-sumtype v0.1.4/go.mod h1:WyYPfhfkdhyrdaligV6svFopZV8Lqdzn5pyVBaV6jhQ= -github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= -github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= +github.com/alecthomas/participle/v2 v2.1.4 h1:W/H79S8Sat/krZ3el6sQMvMaahJ+XcM9WSI2naI7w2U= +github.com/alecthomas/participle/v2 v2.1.4/go.mod h1:8tqVbpTX20Ru4NfYQgZf4mP18eXPTBViyMWiArNEgGI= github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -401,6 +401,8 @@ github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= github.com/kunwardeep/paralleltest v1.0.10 h1:wrodoaKYzS2mdNVnc4/w31YaXFtsc21PCTdvWJ/lDDs= github.com/kunwardeep/paralleltest v1.0.10/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ= github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= github.com/lasiar/canonicalheader v1.1.1 h1:wC+dY9ZfiqiPwAexUApFush/csSPXeIi4QqyxXmng8I= @@ -467,6 +469,8 @@ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKHTI= github.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= @@ -516,8 +520,8 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -527,14 +531,14 @@ github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQy github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= -github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= +github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= +github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/pubgo/dix v0.3.19 h1:a4RRmljw7ePUvc9uJKqXXs6JpYL8s3VqPP2NV2vxI9U= github.com/pubgo/dix v0.3.19/go.mod h1:J0PyuMm7mW6ZrN13l9xz0rtKbzliREFyvb7fuaGYyVw= github.com/pubgo/funk v0.5.64 h1:viU8O9HHLppiHDwbAIV0I7msbI8TArJmwdEtLolqzx0= @@ -642,8 +646,6 @@ github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpR github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= github.com/tetafro/godot v1.4.17 h1:pGzu+Ye7ZUEFx7LHU0dAKmCOXWsPjl7qA6iMGndsjPs= github.com/tetafro/godot v1.4.17/go.mod h1:2oVxTBSftRTh4+MVfUaUXR6bn2GDXCaMcOG4Dk3rfio= -github.com/thejerf/suture/v4 v4.0.6 h1:QsuCEsCqb03xF9tPAsWAj8QOAJBgQI1c0VqJNaingg8= -github.com/thejerf/suture/v4 v4.0.6/go.mod h1:gu9Y4dXNUWFrByqRt30Rm9/UZ0wzRSt9AJS6xu/ZGxU= github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U= github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= @@ -668,8 +670,8 @@ github.com/ultraware/funlen v0.1.0 h1:BuqclbkY6pO+cvxoq7OsktIXZpgBSkYTQtmwhAK81v github.com/ultraware/funlen v0.1.0/go.mod h1:XJqmOQja6DpxarLj6Jj1U7JuoS8PvL4nEqDaQhy22p4= github.com/ultraware/whitespace v0.1.1 h1:bTPOGejYFulW3PkcrqkeQwOd6NKOOXvmGD9bo/Gk8VQ= github.com/ultraware/whitespace v0.1.1/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8= -github.com/urfave/cli/v3 v3.0.0-alpha9.0.20240717192922-127cf54fac9f h1:yCJ90PBe7+45EQSF3qJXyAGW5rkE65lE8huv5pM0HY8= -github.com/urfave/cli/v3 v3.0.0-alpha9.0.20240717192922-127cf54fac9f/go.mod h1:Z1ItyMma7t6I7zHG9OpbExhHQOSkFf/96n+mAZ9MtVI= +github.com/urfave/cli/v3 v3.2.0 h1:m8WIXY0U9LCuUl5r+0fqLWDhNYWt6qvlW+GcF4EoXf8= +github.com/urfave/cli/v3 v3.2.0/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo= github.com/uudashr/gocognit v1.1.3 h1:l+a111VcDbKfynh+airAy/DJQKaXh2m9vkoysMPSZyM= github.com/uudashr/gocognit v1.1.3/go.mod h1:aKH8/e8xbTRBwjbCkwZ8qt4l2EpKXl31KMHgSS+lZ2U= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -709,28 +711,28 @@ go-simpler.org/musttag v0.12.2 h1:J7lRc2ysXOq7eM8rwaTYnNrHd5JwjppzB6mScysB2Cs= go-simpler.org/musttag v0.12.2/go.mod h1:uN1DVIasMTQKk6XSik7yrJoEysGtR2GRqvWnI9S7TYM= go-simpler.org/sloglint v0.7.2 h1:Wc9Em/Zeuu7JYpl+oKoYOsQSy2X560aVueCW/m6IijY= go-simpler.org/sloglint v0.7.2/go.mod h1:US+9C80ppl7VsThQclkM7BkCHQAzuz8kHLsW3ppuluo= -go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= -go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.26.0 h1:+hm+I+KigBy3M24/h1p/NHkUx/evbLH0PNcjpMyCHc4= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.26.0/go.mod h1:NjC8142mLvvNT6biDpaMjyz78kyEHIwAJlSX0N9P5KI= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 h1:1u/AyyOqAWzy+SkPxDpahCNZParHV8Vid1RnI2clyDE= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0/go.mod h1:z46paqbJ9l7c9fIPCXTqTGwhQZ5XoTIsfeFYWboizjs= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0 h1:Waw9Wfpo/IXzOI8bCB7DIk+0JZcqqsyn1JFnAc+iam8= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0/go.mod h1:wnJIG4fOqyynOnnQF/eQb4/16VlX2EJAHhHgqIqWfAo= -go.opentelemetry.io/otel/exporters/prometheus v0.45.2 h1:pe2Jqk1K18As0RCw7J08QhgXNqr+6npx0a5W4IgAFA8= -go.opentelemetry.io/otel/exporters/prometheus v0.45.2/go.mod h1:B38pscHKI6bhFS44FDw0eFU3iqG3ASNIvY+fZgR5sAc= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0 h1:rFwzp68QMgtzu9PgP3jm9XaMICI6TsofWWPcBDKwlsU= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0/go.mod h1:QyjcV9qDP6VeK5qPyKETvNjmaaEc7+gqjh4SS0ZYzDU= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.23.1 h1:C8r95vDR125t815KD+b1tI0Fbc1pFnwHTBxkbIZ6Szc= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.23.1/go.mod h1:Qr0qomr64jentMtOjWMbtYeJMSuMSlsPEjmnRA2sWZ4= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= -go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= -go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= -go.opentelemetry.io/otel/sdk v1.30.0 h1:cHdik6irO49R5IysVhdn8oaiR9m8XluDaJAs4DfOrYE= -go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg= -go.opentelemetry.io/otel/sdk/metric v1.26.0 h1:cWSks5tfriHPdWFnl+qpX3P681aAYqlZHcAyHw5aU9Y= -go.opentelemetry.io/otel/sdk/metric v1.26.0/go.mod h1:ClMFFknnThJCksebJwz7KIyEDHO+nTB6gK8obLy8RyE= -go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= -go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -943,8 +945,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 h1:hNwajDgT0MlsxZzlUajZVmUYFpts8/CYe4BSNx503ZE= -google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/lava/service.go b/lava/service.go index e4839a6c9..648ce2e8d 100644 --- a/lava/service.go +++ b/lava/service.go @@ -15,10 +15,15 @@ type Close interface { Close(ctx context.Context) error } -type Service interface { +type Supervisor interface { Serve(ctx context.Context) error } +type Service interface { + Start(ctx context.Context) error + Stop(ctx context.Context) error +} + // Server provides an interface for starting and stopping the server. type Server interface { Serve(context.Context, net.Listener) error diff --git a/main.go b/main.go deleted file mode 100644 index ca47e28eb..000000000 --- a/main.go +++ /dev/null @@ -1,23 +0,0 @@ -package main - -import ( - "flag" - - "github.com/pubgo/funk/assert" - "github.com/pubgo/lava/core/flags" - "github.com/pubgo/lava/core/signal" - "github.com/thejerf/suture/v4" - - _ "github.com/thejerf/suture/v4" -) - -func main() { - s := suture.NewSimple("") - s.Add() - s.Remove() - s.Serve(signal.Context()) - - for _, f := range flags.GetFlags() { - assert.Exit(f.Apply(flag.CommandLine)) - } -} diff --git a/pkg/gateway/internal/routertree/parser.go b/pkg/gateway/internal/routertree/parser.go index 5bf95dc02..2f8d96975 100644 --- a/pkg/gateway/internal/routertree/parser.go +++ b/pkg/gateway/internal/routertree/parser.go @@ -1,4 +1,5 @@ -//nolint:all +//nolint + package routertree import ( @@ -32,21 +33,25 @@ var ( // Variable = "{" FieldPath [ "=" Segments ] "}" ; // FieldPath = IDENT { "." IDENT } ; // Verb = ":" LITERAL ; +// nolint type httpRule struct { Slash string `@"/"` Segments *segments `@@!` Verb *string `(":" @Ident)?` } +// nolint type segments struct { Segments []*segment `@@ ("/" @@)*` } +// nolint type segment struct { Path *string `@("*" "*" | "*" | Ident)` Variable *variable `| @@*` } +// nolint type variable struct { Fields []string `"{" @Ident ("." @Ident)*` Segments *segments `("=" @@)? "}"` diff --git a/servers/grpcs/server.go b/servers/grpcs/server.go index 1535eae52..b517d3b0e 100644 --- a/servers/grpcs/server.go +++ b/servers/grpcs/server.go @@ -32,7 +32,6 @@ import ( "github.com/pubgo/lava/core/debug" "github.com/pubgo/lava/core/lifecycle" "github.com/pubgo/lava/core/metrics" - "github.com/pubgo/lava/core/signal" "github.com/pubgo/lava/internal/consts" "github.com/pubgo/lava/internal/logutil" "github.com/pubgo/lava/internal/middlewares/middleware_accesslog" @@ -44,7 +43,7 @@ import ( "github.com/pubgo/lava/pkg/httputil" ) -func New() lava.Service { return newService() } +func New() lava.Supervisor { return newService() } func newService() *serviceImpl { return &serviceImpl{ @@ -52,7 +51,7 @@ func newService() *serviceImpl { } } -var _ lava.Service = (*serviceImpl)(nil) +var _ lava.Supervisor = (*serviceImpl)(nil) type serviceImpl struct { lc lifecycle.Getter @@ -66,10 +65,12 @@ type serviceImpl struct { func (s *serviceImpl) Serve(ctx context.Context) error { defer s.stop(ctx) - s.start(ctx) - signal.Wait() + if err := s.start(ctx); err != nil { + return err + } + <-ctx.Done() - return ctx.Err() + return nil } func (s *serviceImpl) DixInject( diff --git a/servers/https/server.go b/servers/https/server.go index 929370fbf..7dd12281e 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -1,6 +1,7 @@ package https import ( + "context" "errors" "fmt" "net" @@ -24,7 +25,6 @@ import ( "github.com/pubgo/lava/core/debug" "github.com/pubgo/lava/core/lifecycle" "github.com/pubgo/lava/core/metrics" - "github.com/pubgo/lava/core/signal" "github.com/pubgo/lava/internal/logutil" "github.com/pubgo/lava/internal/middlewares/middleware_accesslog" "github.com/pubgo/lava/internal/middlewares/middleware_metric" @@ -32,13 +32,13 @@ import ( "github.com/pubgo/lava/lava" ) -func New() lava.Service { return newService() } +func New() lava.Supervisor { return newService() } func newService() *serviceImpl { return &serviceImpl{} } -var _ lava.Service = (*serviceImpl)(nil) +var _ lava.Supervisor = (*serviceImpl)(nil) type serviceImpl struct { lc lifecycle.Getter @@ -46,15 +46,13 @@ type serviceImpl struct { log log.Logger } -func (s *serviceImpl) Run() { - defer s.stop() - s.start() - signal.Wait() +func (s *serviceImpl) Serve(ctx context.Context) error { + s.start(ctx) + <-ctx.Done() + s.stop(ctx) + return nil } -func (s *serviceImpl) Start() { s.start() } -func (s *serviceImpl) Stop() { s.stop() } - func (s *serviceImpl) DixInject( handlers []lava.HttpRouter, middlewares []lava.Middleware, @@ -164,12 +162,13 @@ func (s *serviceImpl) DixInject( } } -func (s *serviceImpl) start() { +func (s *serviceImpl) start(ctx context.Context) { + defer recovery.Exit() logutil.OkOrFailed(s.log, "service before-start", func() error { defer recovery.Exit() for _, run := range s.lc.GetBeforeStarts() { s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) - run.Exec() + assert.Exit(run.Exec(ctx)) } return nil }) @@ -197,17 +196,19 @@ func (s *serviceImpl) start() { defer recovery.Exit() for _, run := range s.lc.GetAfterStarts() { s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) - run.Exec() + assert.Exit(run.Exec(ctx)) } return nil }) } -func (s *serviceImpl) stop() { +func (s *serviceImpl) stop(ctx context.Context) { + defer recovery.DebugPrint() logutil.OkOrFailed(s.log, "service before-stop", func() error { for _, run := range s.lc.GetBeforeStops() { - s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) - run.Exec() + logutil.LogOrErr(s.log, fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), func() error { + return run.Exec(ctx) + }) } return nil }) @@ -218,8 +219,9 @@ func (s *serviceImpl) stop() { logutil.OkOrFailed(s.log, "service after-stop", func() error { for _, run := range s.lc.GetAfterStops() { - s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) - run.Exec() + logutil.LogOrErr(s.log, fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), func() error { + return run.Exec(ctx) + }) } return nil }) diff --git a/servers/tasks/server.go b/servers/tasks/server.go index 4ef41e6cd..8f02830c9 100644 --- a/servers/tasks/server.go +++ b/servers/tasks/server.go @@ -1,6 +1,7 @@ package tasks import ( + "context" "fmt" "net" "net/http" @@ -16,14 +17,16 @@ import ( "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/running" "github.com/pubgo/funk/stack" + "google.golang.org/grpc/codes" + "github.com/pubgo/lava/core/debug" "github.com/pubgo/lava/core/lifecycle" - "github.com/pubgo/lava/core/signal" "github.com/pubgo/lava/internal/logutil" "github.com/pubgo/lava/lava" - "google.golang.org/grpc/codes" ) +var _ lava.Supervisor = (*Server)(nil) + func New(srv lava.Service) *Server { assert.If(srv == nil, "service is nil") @@ -38,10 +41,11 @@ type Server struct { conf *Config } -func (s *Server) Run() { - defer s.stop() - s.start() - signal.Wait() +func (s *Server) Serve(ctx context.Context) error { + s.start(ctx) + <-ctx.Done() + s.stop(ctx) + return nil } func (s *Server) DixInject( @@ -80,19 +84,19 @@ func (s *Server) DixInject( s.httpServer.Mount("/debug", debug.App()) } -func (s *Server) start() { +func (s *Server) start(ctx context.Context) { defer recovery.Exit() logutil.OkOrFailed(s.log, "running before service starts", func() error { defer recovery.Exit() for _, run := range s.lc.GetBeforeStarts() { s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) - run.Exec() + assert.Exit(run.Exec(ctx)) } return nil }) - httpLn := assert.Must1(net.Listen("tcp", fmt.Sprintf(":%d", generic.DePtr(s.conf.HttpPort)))) + httpLn := assert.Exit1(net.Listen("tcp", fmt.Sprintf(":%d", generic.FromPtr(s.conf.HttpPort)))) logutil.OkOrFailed(s.log, "service starts", func() error { async.GoDelay(func() error { @@ -110,33 +114,29 @@ func (s *Server) start() { }) async.GoSafe(func() error { - s.srv.Start() - return nil + return s.srv.Start(ctx) }) return nil }) logutil.OkOrFailed(s.log, "running after service starts", func() error { for _, run := range s.lc.GetAfterStarts() { - logutil.LogOrErr( - s.log, - fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), - func() error { run.Exec(); return nil }, - ) + s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) + assert.Exit(run.Exec(ctx)) } return nil }) } -func (s *Server) stop() { - defer recovery.Exit() +func (s *Server) stop(ctx context.Context) { + defer recovery.DebugPrint() logutil.OkOrFailed(s.log, "running before service stops", func() error { for _, run := range s.lc.GetBeforeStops() { logutil.LogOrErr( s.log, fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), - func() error { run.Exec(); return nil }, + func() error { return run.Exec(ctx) }, ) } return nil @@ -147,8 +147,7 @@ func (s *Server) stop() { }) logutil.LogOrErr(s.log, "[task] Server Stop", func() error { - s.srv.Stop() - return nil + return s.srv.Stop(ctx) }) logutil.OkOrFailed(s.log, "running after service stops", func() error { @@ -156,7 +155,7 @@ func (s *Server) stop() { logutil.LogOrErr( s.log, fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), - func() error { run.Exec(); return nil }, + func() error { return run.Exec(ctx) }, ) } return nil diff --git a/servers/wss/server.go b/servers/wss/server.go index ffc572a7c..454e74725 100644 --- a/servers/wss/server.go +++ b/servers/wss/server.go @@ -1,10 +1,11 @@ package wss import ( + "log" + _ "github.com/gofiber/contrib/socketio" "github.com/gofiber/contrib/websocket" "github.com/gofiber/fiber/v2" - "log" ) func init() { @@ -20,7 +21,7 @@ func init() { return fiber.ErrUpgradeRequired }) - app.Get("/ws/:id", websocket.New(func(c *Conn) { + app.Get("/ws/:id", websocket.New(func(c *websocket.Conn) { // c.Locals is added to the *websocket.Conn log.Println(c.Locals("allowed")) // true log.Println(c.Params("id")) // 123 From 952a280fb708fe77dde6fe59c407fe9ec99d193d Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 14 May 2025 22:30:20 +0800 Subject: [PATCH 009/142] fix: barry quick fix, 2025-05-14 22:30:20 --- cmds/app/cmd.go | 4 +- cmds/grpcservercmd/cmd.go | 5 ++- cmds/httpservercmd/cmd.go | 5 ++- cmds/schedulercmd/cmd.go | 27 +++++++++++ cmds/taskcmd/cmd.go | 26 +++++++++++ core/lifecycle/builder.go | 18 -------- core/lifecycle/lifecycle.go | 44 +++++------------- core/lifecycle/lifecyclebuilder/builder.go | 52 ++++++++++++++++++++++ core/scheduler/builder.go | 9 ++-- core/scheduler/interface.go | 15 +++++-- core/scheduler/scheduler.go | 23 ++++++++-- core/supervisor/supervisor.go | 28 ++++++++++++ go.mod | 1 + go.sum | 2 + lava/service.go | 12 +++-- servers/grpcs/server.go | 25 +++++++---- servers/https/server.go | 8 +++- servers/tasks/server.go | 43 +++++++++++------- 18 files changed, 250 insertions(+), 97 deletions(-) create mode 100644 cmds/schedulercmd/cmd.go create mode 100644 cmds/taskcmd/cmd.go delete mode 100644 core/lifecycle/builder.go create mode 100644 core/lifecycle/lifecyclebuilder/builder.go create mode 100644 core/supervisor/supervisor.go diff --git a/cmds/app/cmd.go b/cmds/app/cmd.go index 6ff12195b..339b784b5 100644 --- a/cmds/app/cmd.go +++ b/cmds/app/cmd.go @@ -19,7 +19,7 @@ import ( "github.com/pubgo/lava/cmds/versioncmd" "github.com/pubgo/lava/core/discovery" "github.com/pubgo/lava/core/flags" - "github.com/pubgo/lava/core/lifecycle" + "github.com/pubgo/lava/core/lifecycle/lifecyclebuilder" "github.com/pubgo/lava/core/logging" "github.com/pubgo/lava/core/metrics" "github.com/pubgo/lava/core/scheduler" @@ -61,7 +61,7 @@ var defaultProviders = []any{ logging.New, metrics.New, - lifecycle.New, + lifecyclebuilder.New, scheduler.New, } diff --git a/cmds/grpcservercmd/cmd.go b/cmds/grpcservercmd/cmd.go index dbc2d275b..37bac1dd4 100644 --- a/cmds/grpcservercmd/cmd.go +++ b/cmds/grpcservercmd/cmd.go @@ -4,9 +4,11 @@ import ( "context" "github.com/pubgo/dix" + "github.com/pubgo/funk/errors" "github.com/pubgo/funk/version" "github.com/urfave/cli/v3" + "github.com/pubgo/lava/core/supervisor" "github.com/pubgo/lava/pkg/cmdutil" "github.com/pubgo/lava/servers/grpcs" ) @@ -16,7 +18,8 @@ func New(di *dix.Dix) *cli.Command { Name: "grpc", Usage: cmdutil.UsageDesc("grpc service %s(%s)", version.Project(), version.Version()), Action: func(ctx context.Context, command *cli.Command) error { - return dix.Inject(di, grpcs.New()).Serve(ctx) + srv := dix.Inject(di, grpcs.New()) + return errors.WrapCaller(supervisor.Run(ctx, srv)) }, } } diff --git a/cmds/httpservercmd/cmd.go b/cmds/httpservercmd/cmd.go index b8362ec98..e0a610313 100644 --- a/cmds/httpservercmd/cmd.go +++ b/cmds/httpservercmd/cmd.go @@ -4,9 +4,11 @@ import ( "context" "github.com/pubgo/dix" + "github.com/pubgo/funk/errors" "github.com/pubgo/funk/version" "github.com/urfave/cli/v3" + "github.com/pubgo/lava/core/supervisor" "github.com/pubgo/lava/pkg/cmdutil" "github.com/pubgo/lava/servers/https" ) @@ -16,7 +18,8 @@ func New(di *dix.Dix) *cli.Command { Name: "http", Usage: cmdutil.UsageDesc("%s http service", version.Project()), Action: func(ctx context.Context, command *cli.Command) error { - return dix.Inject(di, https.New()).Serve(ctx) + srv := dix.Inject(di, https.New()) + return errors.WrapCaller(supervisor.Run(ctx, srv)) }, } } diff --git a/cmds/schedulercmd/cmd.go b/cmds/schedulercmd/cmd.go new file mode 100644 index 000000000..ae4b6d447 --- /dev/null +++ b/cmds/schedulercmd/cmd.go @@ -0,0 +1,27 @@ +package schedulercmd + +import ( + "context" + + "github.com/pubgo/dix" + "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/version" + "github.com/urfave/cli/v3" + + "github.com/pubgo/lava/core/scheduler" + "github.com/pubgo/lava/core/supervisor" + "github.com/pubgo/lava/pkg/cmdutil" +) + +func New(di *dix.Dix) *cli.Command { + return &cli.Command{ + Name: "scheduler", + Usage: cmdutil.UsageDesc("grpc service %s(%s)", version.Project(), version.Version()), + Action: func(ctx context.Context, command *cli.Command) error { + srv := dix.Inject(di, new(struct { + Scheduler *scheduler.Scheduler + })) + return errors.WrapCaller(supervisor.Run(ctx, srv.Scheduler)) + }, + } +} diff --git a/cmds/taskcmd/cmd.go b/cmds/taskcmd/cmd.go new file mode 100644 index 000000000..885e64abd --- /dev/null +++ b/cmds/taskcmd/cmd.go @@ -0,0 +1,26 @@ +package grpcservercmd + +import ( + "context" + + "github.com/pubgo/dix" + "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/version" + "github.com/urfave/cli/v3" + + "github.com/pubgo/lava/core/supervisor" + "github.com/pubgo/lava/lava" + "github.com/pubgo/lava/pkg/cmdutil" + "github.com/pubgo/lava/servers/tasks" +) + +func New(di *dix.Dix, services []lava.Server) *cli.Command { + return &cli.Command{ + Name: "grpc", + Usage: cmdutil.UsageDesc("grpc service %s(%s)", version.Project(), version.Version()), + Action: func(ctx context.Context, command *cli.Command) error { + srv := dix.Inject(di, tasks.New(services...)) + return errors.WrapCaller(supervisor.Run(ctx, srv)) + }, + } +} diff --git a/core/lifecycle/builder.go b/core/lifecycle/builder.go deleted file mode 100644 index 48f289f21..000000000 --- a/core/lifecycle/builder.go +++ /dev/null @@ -1,18 +0,0 @@ -package lifecycle - -type Provider struct { - Setter Lifecycle - Getter Getter -} - -func New(handlers []Handler) Provider { - lc := new(lifecycleImpl) - for i := range handlers { - handlers[i](lc) - } - - return Provider{ - Setter: lc, - Getter: lc, - } -} diff --git a/core/lifecycle/lifecycle.go b/core/lifecycle/lifecycle.go index 9f7cb8e86..8a71eb766 100644 --- a/core/lifecycle/lifecycle.go +++ b/core/lifecycle/lifecycle.go @@ -2,6 +2,18 @@ package lifecycle import "context" +func WrapNoError(fn func(context.Context)) ExecFunc { + return func(ctx context.Context) error { fn(ctx); return nil } +} + +func WrapNoCtx(fn func() error) ExecFunc { + return func(ctx context.Context) error { return fn() } +} + +func WrapNoCtxErr(fn func()) ExecFunc { + return func(ctx context.Context) error { fn(); return nil } +} + type ExecFunc = func(context.Context) error type Executor struct { @@ -23,35 +35,3 @@ type Getter interface { GetAfterStarts() []Executor GetBeforeStarts() []Executor } - -var ( - _ Lifecycle = (*lifecycleImpl)(nil) - _ Getter = (*lifecycleImpl)(nil) -) - -type lifecycleImpl struct { - beforeStarts []Executor - afterStarts []Executor - beforeStops []Executor - afterStops []Executor -} - -func (t *lifecycleImpl) GetAfterStops() []Executor { return t.afterStops } -func (t *lifecycleImpl) GetBeforeStops() []Executor { return t.beforeStops } -func (t *lifecycleImpl) GetAfterStarts() []Executor { return t.afterStarts } -func (t *lifecycleImpl) GetBeforeStarts() []Executor { return t.beforeStarts } -func (t *lifecycleImpl) BeforeStart(f ExecFunc) { - t.beforeStarts = append(t.beforeStarts, Executor{Exec: f}) -} - -func (t *lifecycleImpl) BeforeStop(f ExecFunc) { - t.beforeStops = append([]Executor{{Exec: f}}, t.beforeStops...) -} - -func (t *lifecycleImpl) AfterStart(f ExecFunc) { - t.afterStarts = append(t.afterStarts, Executor{Exec: f}) -} - -func (t *lifecycleImpl) AfterStop(f ExecFunc) { - t.afterStops = append([]Executor{{Exec: f}}, t.afterStops...) -} diff --git a/core/lifecycle/lifecyclebuilder/builder.go b/core/lifecycle/lifecyclebuilder/builder.go new file mode 100644 index 000000000..2222a2a3d --- /dev/null +++ b/core/lifecycle/lifecyclebuilder/builder.go @@ -0,0 +1,52 @@ +package lifecyclebuilder + +import "github.com/pubgo/lava/core/lifecycle" + +type Provider struct { + Setter lifecycle.Lifecycle + Getter lifecycle.Getter +} + +func New(handlers []lifecycle.Handler) Provider { + lc := new(lifecycleImpl) + for i := range handlers { + handlers[i](lc) + } + + return Provider{ + Setter: lc, + Getter: lc, + } +} + +var ( + _ lifecycle.Lifecycle = (*lifecycleImpl)(nil) + _ lifecycle.Getter = (*lifecycleImpl)(nil) +) + +type lifecycleImpl struct { + beforeStarts []lifecycle.Executor + afterStarts []lifecycle.Executor + beforeStops []lifecycle.Executor + afterStops []lifecycle.Executor +} + +func (t *lifecycleImpl) GetAfterStops() []lifecycle.Executor { return t.afterStops } +func (t *lifecycleImpl) GetBeforeStops() []lifecycle.Executor { return t.beforeStops } +func (t *lifecycleImpl) GetAfterStarts() []lifecycle.Executor { return t.afterStarts } +func (t *lifecycleImpl) GetBeforeStarts() []lifecycle.Executor { return t.beforeStarts } +func (t *lifecycleImpl) BeforeStart(f lifecycle.ExecFunc) { + t.beforeStarts = append(t.beforeStarts, lifecycle.Executor{Exec: f}) +} + +func (t *lifecycleImpl) BeforeStop(f lifecycle.ExecFunc) { + t.beforeStops = append([]lifecycle.Executor{{Exec: f}}, t.beforeStops...) +} + +func (t *lifecycleImpl) AfterStart(f lifecycle.ExecFunc) { + t.afterStarts = append(t.afterStarts, lifecycle.Executor{Exec: f}) +} + +func (t *lifecycleImpl) AfterStop(f lifecycle.ExecFunc) { + t.afterStops = append([]lifecycle.Executor{{Exec: f}}, t.afterStops...) +} diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index 735faeebe..3f6509040 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -13,7 +13,7 @@ import ( const Name = "scheduler" -func New(m lifecycle.Lifecycle, log log.Logger, opts []*Config, routers []CronRouter, metric metrics.Metric) *Scheduler { +func New(m lifecycle.Lifecycle, log log.Logger, opts []*Config, routers []Register, metric metrics.Metric) *Scheduler { config := make(map[string]JobSetting) if len(opts) > 0 && opts[0] != nil { for _, setting := range opts[0].JobSettings { @@ -37,13 +37,10 @@ func New(m lifecycle.Lifecycle, log log.Logger, opts []*Config, routers []CronRo } quart.start() - m.BeforeStop(func(ctx context.Context) error { - quart.stop() - return nil - }) + m.BeforeStop(lifecycle.WrapNoCtxErr(quart.stop)) for _, r := range routers { - r.Crontab(quart) + r.RegisterCrontabScheduler(quart) } return quart diff --git a/core/scheduler/interface.go b/core/scheduler/interface.go index 64b18dfe4..5da5b5d10 100644 --- a/core/scheduler/interface.go +++ b/core/scheduler/interface.go @@ -1,9 +1,18 @@ package scheduler -import "context" +import ( + "context" + "time" +) type JobFunc func(ctx context.Context, name string) error -type CronRouter interface { - Crontab(s *Scheduler) +type Register interface { + RegisterCrontabScheduler(reg Registry) +} + +type Registry interface { + Once(name string, delay time.Duration, fn JobFunc) + Every(name string, dur time.Duration, fn JobFunc) + Cron(name, expr string, fn JobFunc) } diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index 84f2e7a90..5fa4c70cd 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -14,8 +14,11 @@ import ( "github.com/reugn/go-quartz/quartz" "github.com/pubgo/lava/core/metrics" + "github.com/pubgo/lava/lava" ) +var _ lava.Server = (*Scheduler)(nil) + type job struct { key string cron string @@ -33,6 +36,17 @@ type Scheduler struct { jobs map[string]JobFunc } +func (s *Scheduler) String() string { + return Name +} + +func (s *Scheduler) Serve(ctx context.Context) error { + defer s.stop() + s.start() + <-ctx.Done() + return nil +} + func (s *Scheduler) stop() { s.cancel() s.scheduler.Stop() @@ -105,13 +119,14 @@ func (t namedJob) Execute(ctx context.Context) error { return t.fn(ctx, t.name) }) - t.s.metric.Tagged(metrics.Tags{"job_name": t.name}).Gauge("scheduler_job_cost").Update(float64(time.Since(start).Microseconds()) / 1000) + cost := float64(time.Since(start).Milliseconds()) + t.s.metric.Tagged(metrics.Tags{"job_name": t.name}).Gauge("job_cost_ms").Update(cost) logger := generic.Ternary(generic.IsNil(err), t.log.Info(), t.log.Err(err)) logger. - Float32("job-cost-ms", float32(time.Since(start).Microseconds())/1000). - Str("job-name", t.name). - Msg("scheduler job execution") + Float32("job_cost_ms", float32(cost)). + Str("job_name", t.name). + Msg("exec scheduler job") return err } diff --git a/core/supervisor/supervisor.go b/core/supervisor/supervisor.go new file mode 100644 index 000000000..9cbe508dd --- /dev/null +++ b/core/supervisor/supervisor.go @@ -0,0 +1,28 @@ +package supervisor + +import ( + "context" + + "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/running" + "github.com/thejerf/suture/v4" +) + +type Service = suture.Service +type Supervisor = suture.Supervisor + +func New() *Supervisor { + return suture.NewSimple(running.Project) +} + +func Run(ctx context.Context, services ...suture.Service) error { + if len(services) == 0 { + return nil + } + + manager := suture.NewSimple(running.Project) + for _, service := range services { + manager.Add(service) + } + return errors.WrapCaller(manager.Serve(ctx)) +} diff --git a/go.mod b/go.mod index efe0db6d1..5fef231e5 100644 --- a/go.mod +++ b/go.mod @@ -70,6 +70,7 @@ require ( github.com/rs/zerolog v1.33.0 github.com/samber/lo v1.47.0 github.com/stretchr/testify v1.10.0 + github.com/thejerf/suture/v4 v4.0.6 github.com/uber-go/tally/v4 v4.1.16 github.com/urfave/cli/v3 v3.2.0 github.com/valyala/fasthttp v1.58.0 diff --git a/go.sum b/go.sum index 6f7d7ea68..b33b766c9 100644 --- a/go.sum +++ b/go.sum @@ -646,6 +646,8 @@ github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpR github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= github.com/tetafro/godot v1.4.17 h1:pGzu+Ye7ZUEFx7LHU0dAKmCOXWsPjl7qA6iMGndsjPs= github.com/tetafro/godot v1.4.17/go.mod h1:2oVxTBSftRTh4+MVfUaUXR6bn2GDXCaMcOG4Dk3rfio= +github.com/thejerf/suture/v4 v4.0.6 h1:QsuCEsCqb03xF9tPAsWAj8QOAJBgQI1c0VqJNaingg8= +github.com/thejerf/suture/v4 v4.0.6/go.mod h1:gu9Y4dXNUWFrByqRt30Rm9/UZ0wzRSt9AJS6xu/ZGxU= github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U= github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= diff --git a/lava/service.go b/lava/service.go index 648ce2e8d..3625a88a1 100644 --- a/lava/service.go +++ b/lava/service.go @@ -2,6 +2,7 @@ package lava import ( "context" + "fmt" "net" "google.golang.org/grpc" @@ -15,7 +16,10 @@ type Close interface { Close(ctx context.Context) error } -type Supervisor interface { +type Server interface { + fmt.Stringer + + // Serve starts the server, no async. Serve(ctx context.Context) error } @@ -24,9 +28,9 @@ type Service interface { Stop(ctx context.Context) error } -// Server provides an interface for starting and stopping the server. -type Server interface { - Serve(context.Context, net.Listener) error +// Listener provides an interface for starting and stopping the server. +type Listener interface { + Listen(context.Context, net.Listener) error } type Validator interface { diff --git a/servers/grpcs/server.go b/servers/grpcs/server.go index b517d3b0e..1824da964 100644 --- a/servers/grpcs/server.go +++ b/servers/grpcs/server.go @@ -43,7 +43,7 @@ import ( "github.com/pubgo/lava/pkg/httputil" ) -func New() lava.Supervisor { return newService() } +func New() lava.Server { return newService() } func newService() *serviceImpl { return &serviceImpl{ @@ -51,7 +51,7 @@ func newService() *serviceImpl { } } -var _ lava.Supervisor = (*serviceImpl)(nil) +var _ lava.Server = (*serviceImpl)(nil) type serviceImpl struct { lc lifecycle.Getter @@ -63,14 +63,23 @@ type serviceImpl struct { conf *Config } -func (s *serviceImpl) Serve(ctx context.Context) error { +func (s *serviceImpl) String() string { + return "grpc-server" +} + +func (s *serviceImpl) Serve(ctx context.Context) (err error) { defer s.stop(ctx) - if err := s.start(ctx); err != nil { - return err + for { + select { + case <-ctx.Done(): + return nil + default: + err = s.start(ctx) + if err != nil { + return err + } + } } - - <-ctx.Done() - return nil } func (s *serviceImpl) DixInject( diff --git a/servers/https/server.go b/servers/https/server.go index 7dd12281e..d8ce1c00b 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -32,13 +32,13 @@ import ( "github.com/pubgo/lava/lava" ) -func New() lava.Supervisor { return newService() } +func New() lava.Server { return newService() } func newService() *serviceImpl { return &serviceImpl{} } -var _ lava.Supervisor = (*serviceImpl)(nil) +var _ lava.Server = (*serviceImpl)(nil) type serviceImpl struct { lc lifecycle.Getter @@ -46,6 +46,10 @@ type serviceImpl struct { log log.Logger } +func (s *serviceImpl) String() string { + return "http-server" +} + func (s *serviceImpl) Serve(ctx context.Context) error { s.start(ctx) <-ctx.Done() diff --git a/servers/tasks/server.go b/servers/tasks/server.go index 8f02830c9..7af44572f 100644 --- a/servers/tasks/server.go +++ b/servers/tasks/server.go @@ -21,31 +21,43 @@ import ( "github.com/pubgo/lava/core/debug" "github.com/pubgo/lava/core/lifecycle" + "github.com/pubgo/lava/core/supervisor" "github.com/pubgo/lava/internal/logutil" "github.com/pubgo/lava/lava" ) -var _ lava.Supervisor = (*Server)(nil) +var _ lava.Server = (*Server)(nil) -func New(srv lava.Service) *Server { - assert.If(srv == nil, "service is nil") +func New(services ...lava.Server) *Server { + assert.If(len(services) == 0, "service is nil") - return &Server{srv: srv} + return &Server{services: services, supervisor: supervisor.New()} } type Server struct { - srv lava.Service + supervisor *supervisor.Supervisor + services []lava.Server log log.Logger lc lifecycle.Getter httpServer *fiber.App conf *Config } +func (s *Server) String() string { + return "task" +} + func (s *Server) Serve(ctx context.Context) error { - s.start(ctx) - <-ctx.Done() - s.stop(ctx) - return nil + defer s.stop(ctx) + + for { + select { + case <-ctx.Done(): + return nil + default: + s.start(ctx) + } + } } func (s *Server) DixInject( @@ -54,7 +66,7 @@ func (s *Server) DixInject( conf []*Config, ) { s.lc = getLifecycle - s.log = log.WithName("task-server") + s.log = log.WithName("tasks") if len(conf) > 0 { s.conf = conf[0] @@ -87,7 +99,7 @@ func (s *Server) DixInject( func (s *Server) start(ctx context.Context) { defer recovery.Exit() - logutil.OkOrFailed(s.log, "running before service starts", func() error { + logutil.OkOrFailed(s.log, "running before service start", func() error { defer recovery.Exit() for _, run := range s.lc.GetBeforeStarts() { s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) @@ -114,7 +126,10 @@ func (s *Server) start(ctx context.Context) { }) async.GoSafe(func() error { - return s.srv.Start(ctx) + for _, srv := range s.services { + s.supervisor.Add(srv) + } + return s.supervisor.Serve(ctx) }) return nil }) @@ -146,10 +161,6 @@ func (s *Server) stop(ctx context.Context) { return s.httpServer.ShutdownWithTimeout(time.Second * 5) }) - logutil.LogOrErr(s.log, "[task] Server Stop", func() error { - return s.srv.Stop(ctx) - }) - logutil.OkOrFailed(s.log, "running after service stops", func() error { for _, run := range s.lc.GetAfterStops() { logutil.LogOrErr( From f3fa06d649d3fde6143f057cee4c2baf90cb7f86 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 14 May 2025 22:35:28 +0800 Subject: [PATCH 010/142] fix: barry quick fix, 2025-05-14 22:35:28 --- cmds/app/cmd.go | 2 ++ cmds/schedulercmd/cmd.go | 9 ++++++--- cmds/taskcmd/cmd.go | 4 ++-- cmds/versioncmd/cmd.go | 2 +- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/cmds/app/cmd.go b/cmds/app/cmd.go index 339b784b5..6e4b3a0f4 100644 --- a/cmds/app/cmd.go +++ b/cmds/app/cmd.go @@ -16,6 +16,7 @@ import ( "github.com/pubgo/lava/cmds/grpcservercmd" "github.com/pubgo/lava/cmds/healthcmd" "github.com/pubgo/lava/cmds/httpservercmd" + "github.com/pubgo/lava/cmds/schedulercmd" "github.com/pubgo/lava/cmds/versioncmd" "github.com/pubgo/lava/core/discovery" "github.com/pubgo/lava/core/flags" @@ -81,6 +82,7 @@ func Run(di *dix.Dix) { di.Provide(depcmd.New) di.Provide(grpcservercmd.New) di.Provide(httpservercmd.New) + di.Provide(schedulercmd.New) di.Inject(func(cmd []*cli.Command) { app := &cli.Command{ diff --git a/cmds/schedulercmd/cmd.go b/cmds/schedulercmd/cmd.go index ae4b6d447..c1064176b 100644 --- a/cmds/schedulercmd/cmd.go +++ b/cmds/schedulercmd/cmd.go @@ -11,17 +11,20 @@ import ( "github.com/pubgo/lava/core/scheduler" "github.com/pubgo/lava/core/supervisor" "github.com/pubgo/lava/pkg/cmdutil" + "github.com/pubgo/lava/servers/tasks" ) func New(di *dix.Dix) *cli.Command { return &cli.Command{ Name: "scheduler", - Usage: cmdutil.UsageDesc("grpc service %s(%s)", version.Project(), version.Version()), + Usage: cmdutil.UsageDesc("crontab scheduler service %s(%s)", version.Project(), version.Version()), Action: func(ctx context.Context, command *cli.Command) error { - srv := dix.Inject(di, new(struct { + s := dix.Inject(di, new(struct { Scheduler *scheduler.Scheduler })) - return errors.WrapCaller(supervisor.Run(ctx, srv.Scheduler)) + + srv := dix.Inject(di, tasks.New(s.Scheduler)) + return errors.WrapCaller(supervisor.Run(ctx, srv)) }, } } diff --git a/cmds/taskcmd/cmd.go b/cmds/taskcmd/cmd.go index 885e64abd..09978a27c 100644 --- a/cmds/taskcmd/cmd.go +++ b/cmds/taskcmd/cmd.go @@ -16,8 +16,8 @@ import ( func New(di *dix.Dix, services []lava.Server) *cli.Command { return &cli.Command{ - Name: "grpc", - Usage: cmdutil.UsageDesc("grpc service %s(%s)", version.Project(), version.Version()), + Name: "task", + Usage: cmdutil.UsageDesc("async task service %s(%s)", version.Project(), version.Version()), Action: func(ctx context.Context, command *cli.Command) error { srv := dix.Inject(di, tasks.New(services...)) return errors.WrapCaller(supervisor.Run(ctx, srv)) diff --git a/cmds/versioncmd/cmd.go b/cmds/versioncmd/cmd.go index 92053ae70..37f08cc46 100644 --- a/cmds/versioncmd/cmd.go +++ b/cmds/versioncmd/cmd.go @@ -3,12 +3,12 @@ package versioncmd import ( "context" "fmt" - "github.com/urfave/cli/v3" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/running" "github.com/pubgo/funk/version" "github.com/pubgo/lava/pkg/cmdutil" + "github.com/urfave/cli/v3" ) func New() *cli.Command { From e8a5f54fa77c3c10d5c82ca9118288828e9a6d4b Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 14 May 2025 22:46:32 +0800 Subject: [PATCH 011/142] fix: barry quick fix, 2025-05-14 22:46:32 --- clients/grpcc/aaa.go | 4 ++-- clients/grpcc/client.go | 8 +++---- .../{grpcc_config => grpccconfig}/config.go | 6 ++--- .../{grpcc_config => grpccconfig}/grpc.go | 2 +- clients/grpcc/{grpcc_lb => grpcclb}/p2c/lc.go | 0 .../grpcc/{grpcc_lb => grpcclb}/p2c/p2c.go | 0 .../{grpcc_lb => grpcclb}/p2c/register.go | 0 .../directbuilder.go | 2 +- .../discoverybuilder.go | 2 +- .../endpoint.go | 2 +- .../register.go | 2 +- .../resolver.go | 2 +- .../{grpcc_resolver => grpccresolver}/util.go | 2 +- clients/grpcc/middleware.go | 6 ++--- clients/grpcc/util.go | 20 ++++++++-------- cmds/app/cmd.go | 10 ++++---- core/flags/default.go | 24 ++++++++++++++----- .../{metric.go => metricbuilder/builder.go} | 13 +++++----- core/metrics/{ => metricbuilder}/vars.go | 9 +++---- go.mod | 2 +- go.sum | 4 ++-- servers/grpcs/inner_server.go | 6 ++--- servers/grpcs/server.go | 6 ++--- 23 files changed, 73 insertions(+), 59 deletions(-) rename clients/grpcc/{grpcc_config => grpccconfig}/config.go (95%) rename clients/grpcc/{grpcc_config => grpccconfig}/grpc.go (99%) rename clients/grpcc/{grpcc_lb => grpcclb}/p2c/lc.go (100%) rename clients/grpcc/{grpcc_lb => grpcclb}/p2c/p2c.go (100%) rename clients/grpcc/{grpcc_lb => grpcclb}/p2c/register.go (100%) rename clients/grpcc/{grpcc_resolver => grpccresolver}/directbuilder.go (98%) rename clients/grpcc/{grpcc_resolver => grpccresolver}/discoverybuilder.go (99%) rename clients/grpcc/{grpcc_resolver => grpccresolver}/endpoint.go (99%) rename clients/grpcc/{grpcc_resolver => grpccresolver}/register.go (90%) rename clients/grpcc/{grpcc_resolver => grpccresolver}/resolver.go (96%) rename clients/grpcc/{grpcc_resolver => grpccresolver}/util.go (98%) rename core/metrics/{metric.go => metricbuilder/builder.go} (64%) rename core/metrics/{ => metricbuilder}/vars.go (59%) diff --git a/clients/grpcc/aaa.go b/clients/grpcc/aaa.go index 9be9e315f..89f306fa9 100644 --- a/clients/grpcc/aaa.go +++ b/clients/grpcc/aaa.go @@ -3,13 +3,13 @@ package grpcc import ( "context" - "github.com/pubgo/lava/clients/grpcc/grpcc_config" + "github.com/pubgo/lava/clients/grpcc/grpccconfig" "google.golang.org/grpc" ) const Name = "grpcc" -type Config = grpcc_config.Cfg +type Config = grpccconfig.Cfg // Client grpc client interface type Client interface { diff --git a/clients/grpcc/client.go b/clients/grpcc/client.go index 5e548aef5..9d505a36e 100644 --- a/clients/grpcc/client.go +++ b/clients/grpcc/client.go @@ -11,7 +11,7 @@ import ( "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/result" "github.com/pubgo/funk/vars" - "github.com/pubgo/lava/clients/grpcc/grpcc_config" + "github.com/pubgo/lava/clients/grpcc/grpccconfig" "github.com/pubgo/lava/core/metrics" "github.com/pubgo/lava/lava" "google.golang.org/grpc" @@ -25,8 +25,8 @@ type Params struct { Resolvers []resolver.Builder } -func New(cfg *grpcc_config.Cfg, p Params, middlewares ...lava.Middleware) Client { - cfg = config.MergeR(grpcc_config.DefaultCfg(), cfg).Unwrap() +func New(cfg *grpccconfig.Cfg, p Params, middlewares ...lava.Middleware) Client { + cfg = config.MergeR(grpccconfig.DefaultCfg(), cfg).Unwrap() cfg.Resolvers = p.Resolvers c := &clientImpl{ @@ -41,7 +41,7 @@ func New(cfg *grpcc_config.Cfg, p Params, middlewares ...lava.Middleware) Client type clientImpl struct { log log.Logger - cfg *grpcc_config.Cfg + cfg *grpccconfig.Cfg mu sync.Mutex conn grpc.ClientConnInterface middlewares []lava.Middleware diff --git a/clients/grpcc/grpcc_config/config.go b/clients/grpcc/grpccconfig/config.go similarity index 95% rename from clients/grpcc/grpcc_config/config.go rename to clients/grpcc/grpccconfig/config.go index f2e32a263..bf6d89c5d 100644 --- a/clients/grpcc/grpcc_config/config.go +++ b/clients/grpcc/grpccconfig/config.go @@ -1,9 +1,9 @@ -package grpcc_config +package grpccconfig import ( "time" - "github.com/pubgo/lava/clients/grpcc/grpcc_resolver" + "github.com/pubgo/lava/clients/grpcc/grpccresolver" "google.golang.org/grpc" "google.golang.org/grpc/resolver" ) @@ -45,7 +45,7 @@ type ServiceCfg struct { func DefaultCfg() *Cfg { cfg := &Cfg{ Service: &ServiceCfg{ - Scheme: grpcc_resolver.DirectScheme, + Scheme: grpccresolver.DirectScheme, }, Client: &GrpcClientCfg{ Insecure: true, diff --git a/clients/grpcc/grpcc_config/grpc.go b/clients/grpcc/grpccconfig/grpc.go similarity index 99% rename from clients/grpcc/grpcc_config/grpc.go rename to clients/grpcc/grpccconfig/grpc.go index fb8869c3b..3fe2145ff 100644 --- a/clients/grpcc/grpcc_config/grpc.go +++ b/clients/grpcc/grpccconfig/grpc.go @@ -1,4 +1,4 @@ -package grpcc_config +package grpccconfig import ( "time" diff --git a/clients/grpcc/grpcc_lb/p2c/lc.go b/clients/grpcc/grpcclb/p2c/lc.go similarity index 100% rename from clients/grpcc/grpcc_lb/p2c/lc.go rename to clients/grpcc/grpcclb/p2c/lc.go diff --git a/clients/grpcc/grpcc_lb/p2c/p2c.go b/clients/grpcc/grpcclb/p2c/p2c.go similarity index 100% rename from clients/grpcc/grpcc_lb/p2c/p2c.go rename to clients/grpcc/grpcclb/p2c/p2c.go diff --git a/clients/grpcc/grpcc_lb/p2c/register.go b/clients/grpcc/grpcclb/p2c/register.go similarity index 100% rename from clients/grpcc/grpcc_lb/p2c/register.go rename to clients/grpcc/grpcclb/p2c/register.go diff --git a/clients/grpcc/grpcc_resolver/directbuilder.go b/clients/grpcc/grpccresolver/directbuilder.go similarity index 98% rename from clients/grpcc/grpcc_resolver/directbuilder.go rename to clients/grpcc/grpccresolver/directbuilder.go index b89b30712..40ed9fb38 100644 --- a/clients/grpcc/grpcc_resolver/directbuilder.go +++ b/clients/grpcc/grpccresolver/directbuilder.go @@ -1,4 +1,4 @@ -package grpcc_resolver +package grpccresolver import ( "fmt" diff --git a/clients/grpcc/grpcc_resolver/discoverybuilder.go b/clients/grpcc/grpccresolver/discoverybuilder.go similarity index 99% rename from clients/grpcc/grpcc_resolver/discoverybuilder.go rename to clients/grpcc/grpccresolver/discoverybuilder.go index af59b1e2c..acbb7ef14 100644 --- a/clients/grpcc/grpcc_resolver/discoverybuilder.go +++ b/clients/grpcc/grpccresolver/discoverybuilder.go @@ -1,4 +1,4 @@ -package grpcc_resolver +package grpccresolver import ( "context" diff --git a/clients/grpcc/grpcc_resolver/endpoint.go b/clients/grpcc/grpccresolver/endpoint.go similarity index 99% rename from clients/grpcc/grpcc_resolver/endpoint.go rename to clients/grpcc/grpccresolver/endpoint.go index b4ff8013d..6c0ad583f 100644 --- a/clients/grpcc/grpcc_resolver/endpoint.go +++ b/clients/grpcc/grpccresolver/endpoint.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package grpcc_resolver +package grpccresolver import ( "fmt" diff --git a/clients/grpcc/grpcc_resolver/register.go b/clients/grpcc/grpccresolver/register.go similarity index 90% rename from clients/grpcc/grpcc_resolver/register.go rename to clients/grpcc/grpccresolver/register.go index 446f39fb1..f392973b2 100644 --- a/clients/grpcc/grpcc_resolver/register.go +++ b/clients/grpcc/grpccresolver/register.go @@ -1,4 +1,4 @@ -package grpcc_resolver +package grpccresolver import "google.golang.org/grpc/resolver" diff --git a/clients/grpcc/grpcc_resolver/resolver.go b/clients/grpcc/grpccresolver/resolver.go similarity index 96% rename from clients/grpcc/grpcc_resolver/resolver.go rename to clients/grpcc/grpccresolver/resolver.go index 502f2189d..d4d4c18ed 100644 --- a/clients/grpcc/grpcc_resolver/resolver.go +++ b/clients/grpcc/grpccresolver/resolver.go @@ -1,4 +1,4 @@ -package grpcc_resolver +package grpccresolver import ( "context" diff --git a/clients/grpcc/grpcc_resolver/util.go b/clients/grpcc/grpccresolver/util.go similarity index 98% rename from clients/grpcc/grpcc_resolver/util.go rename to clients/grpcc/grpccresolver/util.go index ba90e66ec..a2d640277 100644 --- a/clients/grpcc/grpcc_resolver/util.go +++ b/clients/grpcc/grpccresolver/util.go @@ -1,4 +1,4 @@ -package grpcc_resolver +package grpccresolver import ( "fmt" diff --git a/clients/grpcc/middleware.go b/clients/grpcc/middleware.go index aa3140552..8a72581c2 100644 --- a/clients/grpcc/middleware.go +++ b/clients/grpcc/middleware.go @@ -8,7 +8,7 @@ import ( "github.com/pubgo/funk/convert" "github.com/pubgo/funk/errors" "github.com/pubgo/funk/strutil" - "github.com/pubgo/lava/clients/grpcc/grpcc_config" + "github.com/pubgo/lava/clients/grpcc/grpccconfig" "github.com/pubgo/lava/core/lavacontexts" "github.com/pubgo/lava/lava" "github.com/pubgo/lava/pkg/grpcutil" @@ -66,7 +66,7 @@ func unaryInterceptor(middlewares []lava.Middleware) grpc.UnaryClientInterceptor }, func() string { return grpcutil.HeaderGet(md, "x-content-type") }, func() string { - return grpcc_config.DefaultContentType + return grpccconfig.DefaultContentType }) delete(md, "x-content-type") @@ -145,7 +145,7 @@ func streamInterceptor(middlewares []lava.Middleware) grpc.StreamClientIntercept }, func() string { return grpcutil.HeaderGet(md, "x-content-type") }, func() string { - return grpcc_config.DefaultContentType + return grpccconfig.DefaultContentType }) delete(md, "x-content-type") diff --git a/clients/grpcc/util.go b/clients/grpcc/util.go index 1db160b3c..5d516bf5c 100644 --- a/clients/grpcc/util.go +++ b/clients/grpcc/util.go @@ -5,34 +5,34 @@ import ( "github.com/pubgo/funk/errors" "github.com/pubgo/funk/log" - "github.com/pubgo/lava/clients/grpcc/grpcc_config" - "github.com/pubgo/lava/clients/grpcc/grpcc_resolver" + "github.com/pubgo/lava/clients/grpcc/grpccconfig" + "github.com/pubgo/lava/clients/grpcc/grpccresolver" "github.com/pubgo/lava/core/logging/logkey" "github.com/pubgo/lava/lava" "github.com/rs/zerolog" "google.golang.org/grpc" ) -func buildTarget(cfg *grpcc_config.ServiceCfg) string { +func buildTarget(cfg *grpccconfig.ServiceCfg) string { addr := cfg.Addr - scheme := grpcc_resolver.DirectScheme + scheme := grpccresolver.DirectScheme if cfg.Scheme != "" { scheme = cfg.Scheme } switch scheme { - case grpcc_resolver.DiscoveryScheme: - return grpcc_resolver.BuildDiscoveryTarget(addr) - case grpcc_resolver.DirectScheme: - return grpcc_resolver.BuildDirectTarget(cfg.Name, addr) - case grpcc_resolver.K8sScheme, grpcc_resolver.DnsScheme: + case grpccresolver.DiscoveryScheme: + return grpccresolver.BuildDiscoveryTarget(addr) + case grpccresolver.DirectScheme: + return grpccresolver.BuildDirectTarget(cfg.Name, addr) + case grpccresolver.K8sScheme, grpccresolver.DnsScheme: return fmt.Sprintf("dns:///%s", addr) default: return addr } } -func createConn(cfg *grpcc_config.Cfg, log log.Logger, mm []lava.Middleware) (_ grpc.ClientConnInterface, gErr error) { +func createConn(cfg *grpccconfig.Cfg, log log.Logger, mm []lava.Middleware) (_ grpc.ClientConnInterface, gErr error) { addr := buildTarget(cfg.Service) var logMsg = func(e *zerolog.Event) { diff --git a/cmds/app/cmd.go b/cmds/app/cmd.go index 6e4b3a0f4..a2ebc831e 100644 --- a/cmds/app/cmd.go +++ b/cmds/app/cmd.go @@ -11,7 +11,7 @@ import ( "github.com/pubgo/funk/version" cli "github.com/urfave/cli/v3" - "github.com/pubgo/lava/clients/grpcc/grpcc_resolver" + "github.com/pubgo/lava/clients/grpcc/grpccresolver" "github.com/pubgo/lava/cmds/depcmd" "github.com/pubgo/lava/cmds/grpcservercmd" "github.com/pubgo/lava/cmds/healthcmd" @@ -22,7 +22,7 @@ import ( "github.com/pubgo/lava/core/flags" "github.com/pubgo/lava/core/lifecycle/lifecyclebuilder" "github.com/pubgo/lava/core/logging" - "github.com/pubgo/lava/core/metrics" + "github.com/pubgo/lava/core/metrics/metricbuilder" "github.com/pubgo/lava/core/scheduler" "github.com/pubgo/lava/core/signal" "github.com/pubgo/lava/internal/middlewares/middleware_accesslog" @@ -53,14 +53,14 @@ import ( ) var defaultProviders = []any{ - grpcc_resolver.NewDirectBuilder, - grpcc_resolver.NewDiscoveryBuilder, + grpccresolver.NewDirectBuilder, + grpccresolver.NewDiscoveryBuilder, discovery.NewNoopDiscovery, middleware_accesslog.New, middleware_metric.New, logging.New, - metrics.New, + metricbuilder.New, lifecyclebuilder.New, scheduler.New, diff --git a/core/flags/default.go b/core/flags/default.go index 31ff86243..4034b7299 100644 --- a/core/flags/default.go +++ b/core/flags/default.go @@ -10,18 +10,18 @@ import ( ) func init() { - const httpPort = "server_http_port" - const grpcPort = "server_grpc_port" + var httpPortEnvs = []string{env.Key("server_http_port"), env.Key("service_http_port")} + var grpcPortEnvs = []string{env.Key("server_grpc_port"), env.Key("service_grpc_port")} const conf = "config_path" - env.GetIntVal(&running.HttpPort, httpPort) - env.GetIntVal(&running.GrpcPort, grpcPort) + env.GetIntVal(&running.HttpPort, httpPortEnvs...) + env.GetIntVal(&running.GrpcPort, grpcPortEnvs...) Register(&cli.IntFlag{ Name: "http-port", Usage: "service http port", Local: true, Value: running.HttpPort, - Sources: cli.EnvVars(env.Key(httpPort)), + Sources: cli.EnvVars(httpPortEnvs...), Action: func(ctx context.Context, command *cli.Command, i int) error { running.HttpPort = i return nil @@ -33,7 +33,7 @@ func init() { Usage: "service grpc port", Local: true, Value: running.GrpcPort, - Sources: cli.EnvVars(env.Key(grpcPort)), + Sources: cli.EnvVars(grpcPortEnvs...), Action: func(ctx context.Context, command *cli.Command, i int) error { running.GrpcPort = i return nil @@ -61,4 +61,16 @@ func init() { return nil }, }) + + Register(&cli.StringFlag{ + Name: "env", + Usage: "runtime env", + Value: running.Env, + Local: true, + Sources: cli.EnvVars(env.Key("env"), env.Key("app_env")), + Action: func(ctx context.Context, command *cli.Command, s string) error { + running.Env = s + return nil + }, + }) } diff --git a/core/metrics/metric.go b/core/metrics/metricbuilder/builder.go similarity index 64% rename from core/metrics/metric.go rename to core/metrics/metricbuilder/builder.go index a252a7a6d..9b7f7168d 100644 --- a/core/metrics/metric.go +++ b/core/metrics/metricbuilder/builder.go @@ -1,4 +1,4 @@ -package metrics +package metricbuilder import ( "context" @@ -12,21 +12,22 @@ import ( "github.com/uber-go/tally/v4" "github.com/pubgo/lava/core/lifecycle" + "github.com/pubgo/lava/core/metrics" ) -func New(m lifecycle.Lifecycle, cfg *Config, log log.Logger) Metric { - cfg = merge.Struct(generic.Ptr(DefaultCfg()), cfg).Unwrap() +func New(m lifecycle.Lifecycle, cfg *metrics.Config, log log.Logger) metrics.Metric { + cfg = merge.Struct(generic.Ptr(metrics.DefaultCfg()), cfg).Unwrap() - log = log.WithName(Name) + log = log.WithName(metrics.Name) - factory := Get(cfg.Driver) + factory := metrics.Get(cfg.Driver) assert.If(factory == nil, "driver factory[%s] not found", cfg.Driver) opts := factory(cfg, log.WithName("driver")) if opts == nil { return tally.NoopScope } - opts.Tags = Tags{"project": version.Project()} + opts.Tags = metrics.Tags{"project": version.Project()} scope, closer := tally.NewRootScope(lo.FromPtr(opts), cfg.Interval) m.BeforeStop(func(ctx context.Context) error { return closer.Close() }) diff --git a/core/metrics/vars.go b/core/metrics/metricbuilder/vars.go similarity index 59% rename from core/metrics/vars.go rename to core/metrics/metricbuilder/vars.go index 24d741b97..c9ab8ae02 100644 --- a/core/metrics/vars.go +++ b/core/metrics/metricbuilder/vars.go @@ -1,13 +1,14 @@ -package metrics +package metricbuilder import ( "github.com/pubgo/funk/typex" "github.com/pubgo/funk/vars" + "github.com/pubgo/lava/core/metrics" "github.com/uber-go/tally/v4" ) -func registerVars(m Metric) { - vars.Register(Name+"_capabilities", func() interface{} { +func registerVars(m metrics.Metric) { + vars.Register(metrics.Name+"_capabilities", func() interface{} { c := m.Capabilities() return typex.Ctx{ "reporting": c.Reporting(), @@ -15,7 +16,7 @@ func registerVars(m Metric) { } }) - vars.Register(Name+"_snapshot", func() interface{} { + vars.Register(metrics.Name+"_snapshot", func() interface{} { if c, ok := m.(tally.TestScope); ok { // TODO 数据序列化处理 return c.Snapshot() diff --git a/go.mod b/go.mod index 5fef231e5..5640c9d50 100644 --- a/go.mod +++ b/go.mod @@ -72,7 +72,7 @@ require ( github.com/stretchr/testify v1.10.0 github.com/thejerf/suture/v4 v4.0.6 github.com/uber-go/tally/v4 v4.1.16 - github.com/urfave/cli/v3 v3.2.0 + github.com/urfave/cli/v3 v3.3.3 github.com/valyala/fasthttp v1.58.0 github.com/valyala/fasttemplate v1.2.2 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.26.0 diff --git a/go.sum b/go.sum index b33b766c9..1ffa17f70 100644 --- a/go.sum +++ b/go.sum @@ -672,8 +672,8 @@ github.com/ultraware/funlen v0.1.0 h1:BuqclbkY6pO+cvxoq7OsktIXZpgBSkYTQtmwhAK81v github.com/ultraware/funlen v0.1.0/go.mod h1:XJqmOQja6DpxarLj6Jj1U7JuoS8PvL4nEqDaQhy22p4= github.com/ultraware/whitespace v0.1.1 h1:bTPOGejYFulW3PkcrqkeQwOd6NKOOXvmGD9bo/Gk8VQ= github.com/ultraware/whitespace v0.1.1/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8= -github.com/urfave/cli/v3 v3.2.0 h1:m8WIXY0U9LCuUl5r+0fqLWDhNYWt6qvlW+GcF4EoXf8= -github.com/urfave/cli/v3 v3.2.0/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo= +github.com/urfave/cli/v3 v3.3.3 h1:byCBaVdIXuLPIDm5CYZRVG6NvT7tv1ECqdU4YzlEa3I= +github.com/urfave/cli/v3 v3.3.3/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo= github.com/uudashr/gocognit v1.1.3 h1:l+a111VcDbKfynh+airAy/DJQKaXh2m9vkoysMPSZyM= github.com/uudashr/gocognit v1.1.3/go.mod h1:aKH8/e8xbTRBwjbCkwZ8qt4l2EpKXl31KMHgSS+lZ2U= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= diff --git a/servers/grpcs/inner_server.go b/servers/grpcs/inner_server.go index ec6baa79d..baa61e5a8 100644 --- a/servers/grpcs/inner_server.go +++ b/servers/grpcs/inner_server.go @@ -9,7 +9,7 @@ import ( "github.com/pubgo/funk/errors" "github.com/pubgo/funk/log" "github.com/pubgo/lava/clients/grpcc" - "github.com/pubgo/lava/clients/grpcc/grpcc_config" + "github.com/pubgo/lava/clients/grpcc/grpccconfig" "github.com/pubgo/lava/core/metrics" "github.com/pubgo/lava/internal/middlewares/middleware_accesslog" "github.com/pubgo/lava/internal/middlewares/middleware_metric" @@ -52,8 +52,8 @@ func NewInner(handlers []lava.GrpcRouter, grpcProxy []lava.GrpcProxy, dixMiddlew srvMidMap[desc.ServiceName] = append(srvMidMap[desc.ServiceName], h.Middlewares()...) cli := grpcc.New( - &grpcc_config.Cfg{ - Service: &grpcc_config.ServiceCfg{ + &grpccconfig.Cfg{ + Service: &grpccconfig.ServiceCfg{ Name: h.Proxy().Name, Addr: h.Proxy().Addr, Scheme: h.Proxy().Resolver, diff --git a/servers/grpcs/server.go b/servers/grpcs/server.go index 1824da964..9a147fbbe 100644 --- a/servers/grpcs/server.go +++ b/servers/grpcs/server.go @@ -28,7 +28,7 @@ import ( "google.golang.org/grpc/codes" "github.com/pubgo/lava/clients/grpcc" - "github.com/pubgo/lava/clients/grpcc/grpcc_config" + "github.com/pubgo/lava/clients/grpcc/grpccconfig" "github.com/pubgo/lava/core/debug" "github.com/pubgo/lava/core/lifecycle" "github.com/pubgo/lava/core/metrics" @@ -242,8 +242,8 @@ func (s *serviceImpl) DixInject( } cli := grpcc.New( - &grpcc_config.Cfg{ - Service: &grpcc_config.ServiceCfg{ + &grpccconfig.Cfg{ + Service: &grpccconfig.ServiceCfg{ Name: h.Proxy().Name, Addr: h.Proxy().Addr, Scheme: h.Proxy().Resolver, From 443590089cbf5045f3c070a80e182c142f4b7f48 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 14 May 2025 22:53:25 +0800 Subject: [PATCH 012/142] fix: barry quick fix, 2025-05-14 22:53:25 --- core/scheduler/config.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/scheduler/config.go b/core/scheduler/config.go index 5174d1a29..208ecdbd6 100644 --- a/core/scheduler/config.go +++ b/core/scheduler/config.go @@ -5,6 +5,8 @@ type JobSetting struct { Schedule string `yaml:"schedule"` Name string `yaml:"name"` Timeout string `yaml:"timeout"` + + // quartz.JobDetailOptions } type Config struct { From e218ba71371f13c7c8bf4780ff0db1fae11f3e6a Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 14 May 2025 22:59:09 +0800 Subject: [PATCH 013/142] fix: barry quick fix, 2025-05-14 22:59:09 --- core/signal/signal.go | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/core/signal/signal.go b/core/signal/signal.go index a13aa83f2..038338a75 100644 --- a/core/signal/signal.go +++ b/core/signal/signal.go @@ -13,24 +13,20 @@ const Name = "signal" var logger = log.GetLogger(Name) -func Wait() { +func getCh() chan os.Signal { ch := make(chan os.Signal, 1) signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGHUP) - sig := <-ch + return ch +} + +func Wait() { + sig := <-getCh() logger.Info().Str("signal", sig.String()).Msg("signal trigger notify") } func Context() context.Context { ctx, cancel := context.WithCancel(context.Background()) - ch := make(chan os.Signal, 1) - signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGHUP) - go func() { - select { - case <-ch: - cancel() - case <-ctx.Done(): - cancel() - } - }() + ch := getCh() + go func() { <-ch; cancel() }() return ctx } From de6ca765f983a83ac8c01b126e17f5d9815a7ca0 Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 15 May 2025 15:01:11 +0800 Subject: [PATCH 014/142] fix: barry quick fix, 2025-05-15 15:01:11 --- cmds/app/cmd.go | 4 ++-- core/logging/{ => logbuilder}/builder.go | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) rename core/logging/{ => logbuilder}/builder.go (91%) diff --git a/cmds/app/cmd.go b/cmds/app/cmd.go index a2ebc831e..6b998faf5 100644 --- a/cmds/app/cmd.go +++ b/cmds/app/cmd.go @@ -21,7 +21,7 @@ import ( "github.com/pubgo/lava/core/discovery" "github.com/pubgo/lava/core/flags" "github.com/pubgo/lava/core/lifecycle/lifecyclebuilder" - "github.com/pubgo/lava/core/logging" + "github.com/pubgo/lava/core/logging/logbuilder" "github.com/pubgo/lava/core/metrics/metricbuilder" "github.com/pubgo/lava/core/scheduler" "github.com/pubgo/lava/core/signal" @@ -59,7 +59,7 @@ var defaultProviders = []any{ middleware_accesslog.New, middleware_metric.New, - logging.New, + logbuilder.New, metricbuilder.New, lifecyclebuilder.New, diff --git a/core/logging/builder.go b/core/logging/logbuilder/builder.go similarity index 91% rename from core/logging/builder.go rename to core/logging/logbuilder/builder.go index dbd3e5f4c..7b927d60b 100644 --- a/core/logging/builder.go +++ b/core/logging/logbuilder/builder.go @@ -1,4 +1,4 @@ -package logging +package logbuilder import ( "io" @@ -10,6 +10,7 @@ import ( "github.com/pubgo/funk/result" "github.com/pubgo/funk/running" "github.com/pubgo/funk/stack" + "github.com/pubgo/lava/core/logging" "github.com/pubgo/lava/core/logging/logkey" "github.com/rs/zerolog" ) @@ -21,7 +22,7 @@ func init() { } // New logger -func New(cfg *Config) log.Logger { +func New(cfg *logging.Config) log.Logger { defer recovery.Exit() level := zerolog.DebugLevel @@ -54,7 +55,7 @@ func New(cfg *Config) log.Logger { log.SetLogger(&logger) gl := log.New(&logger) - for _, ext := range List() { + for _, ext := range logging.List() { ext(gl) } return gl From 26f625a136d300f6c7dba610b9d7a1d2c0ac4fb0 Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 15 May 2025 15:03:31 +0800 Subject: [PATCH 015/142] fix: barry quick fix, 2025-05-15 15:03:31 --- core/pidfile/builder.go | 21 --------------------- core/pidfile/pidfile.go | 4 ++-- core/pidfile/pidfilebuilder/builder.go | 22 ++++++++++++++++++++++ 3 files changed, 24 insertions(+), 23 deletions(-) delete mode 100644 core/pidfile/builder.go create mode 100644 core/pidfile/pidfilebuilder/builder.go diff --git a/core/pidfile/builder.go b/core/pidfile/builder.go deleted file mode 100644 index 5ad1f3c2d..000000000 --- a/core/pidfile/builder.go +++ /dev/null @@ -1,21 +0,0 @@ -package pidfile - -import ( - "context" - "path/filepath" - - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/pathutil" - - "github.com/pubgo/lava/core/lifecycle" -) - -func New() lifecycle.Handler { - return func(lc lifecycle.Lifecycle) { - pidPath = filepath.Join(config.GetConfigDir(), Name) - - _ = pathutil.IsNotExistMkDir(pidPath) - - lc.AfterStart(func(ctx context.Context) error { return SavePid() }) - } -} diff --git a/core/pidfile/pidfile.go b/core/pidfile/pidfile.go index 8efb60336..962e7f169 100644 --- a/core/pidfile/pidfile.go +++ b/core/pidfile/pidfile.go @@ -14,7 +14,7 @@ import ( const Name = "pidfile" -var pidPath = filepath.Join(config.GetConfigDir(), Name) +var PidPath = filepath.Join(config.GetConfigDir(), Name) const pidPerm os.FileMode = 0o666 @@ -34,7 +34,7 @@ func GetPid() result.Result[int] { func GetPidF() result.Result[string] { filename := fmt.Sprintf("%s.pid", running.Project) - return result.OK(filepath.Join(pidPath, filename)) + return result.OK(filepath.Join(PidPath, filename)) } func SavePid() error { diff --git a/core/pidfile/pidfilebuilder/builder.go b/core/pidfile/pidfilebuilder/builder.go new file mode 100644 index 000000000..46937aeb7 --- /dev/null +++ b/core/pidfile/pidfilebuilder/builder.go @@ -0,0 +1,22 @@ +package pidfilebuilder + +import ( + "context" + "path/filepath" + + "github.com/pubgo/funk/config" + "github.com/pubgo/funk/pathutil" + + "github.com/pubgo/lava/core/lifecycle" + "github.com/pubgo/lava/core/pidfile" +) + +func New() lifecycle.Handler { + return func(lc lifecycle.Lifecycle) { + pidfile.PidPath = filepath.Join(config.GetConfigDir(), pidfile.Name) + + _ = pathutil.IsNotExistMkDir(pidfile.PidPath) + + lc.AfterStart(func(ctx context.Context) error { return pidfile.SavePid() }) + } +} From 941b3dd2f1cd9beb3802414213ed6cba86b594af Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 15 May 2025 22:09:05 +0800 Subject: [PATCH 016/142] fix: barry quick fix, 2025-05-15 22:09:05 --- pkg/cmdutil/flag.go | 3 - pkg/{fiber_builder => fiberbuilder}/config.go | 2 +- .../websocket.go | 2 +- pkg/gateway/internal/routertree/parser.go | 10 +- pkg/gateway/internal/routertree/router.go | 174 ++++++++++-------- .../internal/routertree/router_test.go | 21 ++- pkg/gateway/mux.go | 2 +- pkg/{grpc_builder => grpcbuilder}/config.go | 2 +- servers/grpcs/config.go | 14 +- servers/https/config.go | 14 +- servers/https/middleware.go | 17 +- servers/https/server.go | 8 +- 12 files changed, 154 insertions(+), 115 deletions(-) rename pkg/{fiber_builder => fiberbuilder}/config.go (98%) rename pkg/{fiber_builder => fiberbuilder}/websocket.go (99%) rename pkg/{grpc_builder => grpcbuilder}/config.go (99%) diff --git a/pkg/cmdutil/flag.go b/pkg/cmdutil/flag.go index 434ba0507..ad30a7261 100644 --- a/pkg/cmdutil/flag.go +++ b/pkg/cmdutil/flag.go @@ -25,6 +25,3 @@ func IsHelp() bool { arg := strings.TrimSpace(os.Args[len(os.Args)-1]) return arg == "--help" || arg == "-h" } - -//https://github.com/valyala/fasttemplate -//"text/template" diff --git a/pkg/fiber_builder/config.go b/pkg/fiberbuilder/config.go similarity index 98% rename from pkg/fiber_builder/config.go rename to pkg/fiberbuilder/config.go index 1d13bee78..4cabe24ec 100644 --- a/pkg/fiber_builder/config.go +++ b/pkg/fiberbuilder/config.go @@ -1,4 +1,4 @@ -package fiber_builder +package fiberbuilder import ( "time" diff --git a/pkg/fiber_builder/websocket.go b/pkg/fiberbuilder/websocket.go similarity index 99% rename from pkg/fiber_builder/websocket.go rename to pkg/fiberbuilder/websocket.go index 19107be48..a5956499d 100644 --- a/pkg/fiber_builder/websocket.go +++ b/pkg/fiberbuilder/websocket.go @@ -1,4 +1,4 @@ -package fiber_builder +package fiberbuilder import ( "errors" diff --git a/pkg/gateway/internal/routertree/parser.go b/pkg/gateway/internal/routertree/parser.go index 2f8d96975..e8688e2fd 100644 --- a/pkg/gateway/internal/routertree/parser.go +++ b/pkg/gateway/internal/routertree/parser.go @@ -58,7 +58,7 @@ type variable struct { } type pathVariable struct { - Fields []string + fields []string start, end int } @@ -98,12 +98,12 @@ func (r routePath) Match(urls []string, verb string) ([]PathFieldVar, error) { continue } - return nil, errors.New("path is not match") + return nil, errors.Format("path(%s) not match", path) } var vv []PathFieldVar for _, v := range r.Vars { - pathVar := PathFieldVar{Fields: v.Fields} + pathVar := PathFieldVar{Fields: v.fields} if v.end > 0 { pathVar.Value = strings.Join(urls[v.start:v.end+1], "/") } else { @@ -123,7 +123,7 @@ func (r routePath) String() string { copy(paths, r.Paths) for _, v := range r.Vars { - varS := "{" + strings.Join(v.Fields, ".") + "=" + varS := "{" + strings.Join(v.fields, ".") + "=" end := generic.Ternary(v.end == -1, len(paths)-1, v.end) for i := v.start; i <= end; i++ { @@ -152,7 +152,7 @@ func handleSegments(s *segment, rr *routePath) { return } - vv := &pathVariable{Fields: s.Variable.Fields, start: len(rr.Paths)} + vv := &pathVariable{fields: s.Variable.Fields, start: len(rr.Paths)} if s.Variable.Segments == nil { rr.Paths = append(rr.Paths, star) } else { diff --git a/pkg/gateway/internal/routertree/router.go b/pkg/gateway/internal/routertree/router.go index bb6b7577d..007ed43aa 100644 --- a/pkg/gateway/internal/routertree/router.go +++ b/pkg/gateway/internal/routertree/router.go @@ -9,24 +9,56 @@ import ( ) var ( - ErrPathNodeNotFound = errors.New("path node not found") - ErrNotFound = errors.New("operation not found") + ErrPathNodeNotFound = errors.New("path node not found") + ErrOperationNotFound = errors.New("operation not found") ) -func NewRouteTree() *RouteTree { - return &RouteTree{nodes: make(map[string]*nodeTree)} +func New() *RouteTree { + return &RouteTree{nodeMap: make(map[string]*nodeTree)} +} + +type RouteOperation struct { + Method string `json:"method,omitempty"` + Path string `json:"path,omitempty"` + Operation string `json:"operation,omitempty"` + Verb string `json:"verb,omitempty"` + Vars []string `json:"vars,omitempty"` + Extras map[string]any `json:"extras"` +} + +type MatchOperation struct { + Method string `json:"method"` + Path string `json:"path"` + Operation string `json:"operation"` + Verb string `json:"verb"` + Vars []PathFieldVar `json:"vars"` + Extras map[string]any `json:"extras"` +} + +type routeTarget struct { + Method string + Path string + Operation string + Verb *string + Vars []*pathVariable + extras map[string]any +} + +type nodeTree struct { + nodeMap map[string]*nodeTree + verbMap map[string]*routeTarget } type RouteTree struct { - nodes map[string]*nodeTree + nodeMap map[string]*nodeTree } func (r *RouteTree) List() []RouteOperation { - return getOpt(r.nodes) + return getOpt(r.nodeMap) } func (r *RouteTree) Add(method string, path string, operation string, extras map[string]any) error { - var errMsg = func() string { + errMsg := func() string { return fmt.Sprintf("method: %s, path: %s, operation: %s", method, path, operation) } @@ -35,23 +67,25 @@ func (r *RouteTree) Add(method string, path string, operation string, extras map return errors.Wrap(err, errMsg()) } - var node = parseToRoute(rule) + node := parseToRoute(rule) if len(node.Paths) == 0 { - return errors.Wrap(fmt.Errorf("path is null"), errMsg()) + return errors.Format("node path is empty: %s", errMsg()) } - var nodes = r.nodes - paths := append(node.Paths, handlerMethod(method)) + nodeMap := r.nodeMap + method = handlerMethod(method) + paths := node.Paths for i, n := range paths { - var lastNode = nodes[n] + var lastNode = nodeMap[n] if lastNode == nil { - lastNode = &nodeTree{nodes: make(map[string]*nodeTree), verbs: make(map[string]*routeTarget)} - nodes[n] = lastNode + lastNode = &nodeTree{nodeMap: make(map[string]*nodeTree), verbMap: make(map[string]*routeTarget)} + nodeMap[n] = lastNode } - nodes = lastNode.nodes + nodeMap = lastNode.nodeMap if i == len(paths)-1 { - lastNode.verbs[generic.FromPtr(node.Verb)] = &routeTarget{ + verbKey := fmt.Sprintf("%s:%s", method, generic.FromPtr(node.Verb)) + lastNode.verbMap[verbKey] = &routeTarget{ Method: method, Path: path, Operation: operation, @@ -65,23 +99,25 @@ func (r *RouteTree) Add(method string, path string, operation string, extras map } func (r *RouteTree) Match(method, url string) (*MatchOperation, error) { - var paths = strings.Split(strings.Trim(strings.TrimSpace(url), "/"), "/") - var lastPath = strings.SplitN(paths[len(paths)-1], ":", 2) + var pathNodes = strings.Split(strings.Trim(strings.TrimSpace(url), "/"), "/") + var lastPath = strings.SplitN(pathNodes[len(pathNodes)-1], ":", 2) var errMsg = func(tags ...errors.Tag) errors.Tags { return append(tags, errors.T("method", method), errors.T("url", url)) } var verb = "" - paths[len(paths)-1] = lastPath[0] + pathNodes[len(pathNodes)-1] = lastPath[0] if len(lastPath) > 1 { verb = lastPath[1] } - paths = append(paths, handlerMethod(method)) + method = handlerMethod(method) + verbKey := fmt.Sprintf("%s:%s", method, verb) + var getVars = func(vars []*pathVariable, paths []string) []PathFieldVar { var vv = make([]PathFieldVar, 0, len(vars)) for _, v := range vars { - pathVar := PathFieldVar{Fields: v.Fields} + pathVar := PathFieldVar{Fields: v.fields} if v.end > 0 { pathVar.Value = strings.Join(paths[v.start:v.end+1], "/") } else { @@ -92,87 +128,75 @@ func (r *RouteTree) Match(method, url string) (*MatchOperation, error) { } return vv } - var getPath = func(nodes map[string]*nodeTree, names ...string) *nodeTree { - for _, n := range names { - path := nodes[n] + + var getPath = func(nodeMap map[string]*nodeTree, names ...string) (string, *nodeTree) { + for _, name := range names { + path := nodeMap[name] if path != nil { - return path + return name, path } } - return nil + return "", nil } - var nodes = r.nodes - for _, n := range paths { - path := getPath(nodes, n, star, doubleStar) + nodeMap := r.nodeMap + lastIndex := len(pathNodes) - 1 + for index, node := range pathNodes { + nodeName, path := getPath(nodeMap, node, star, doubleStar) if path == nil { return nil, errors.WrapFn(ErrPathNodeNotFound, func() errors.Tags { - return errMsg(errors.T("node", n)) + return errMsg(errors.T("node", node)) }) } - if vv := path.verbs[verb]; vv != nil && vv.Operation != "" && vv.Method == method { - return &MatchOperation{ - Extras: vv.extras, - Method: vv.Method, - Path: vv.Path, - Operation: vv.Operation, - Verb: verb, - Vars: getVars(vv.Vars, paths), - }, nil + nodeMap = path.nodeMap + switch nodeName { + case node: + if index != lastIndex { + continue + } + case star: + if index != lastIndex && len(path.nodeMap) != 0 { + nextPath := path.nodeMap[pathNodes[index+1]] + if nextPath != nil { + continue + } + } + case doubleStar: } - nodes = path.nodes - } - - return nil, errors.WrapTag(ErrNotFound, errMsg()...) -} - -type RouteOperation struct { - Method string `json:"method,omitempty"` - Path string `json:"path,omitempty"` - Operation string `json:"operation,omitempty"` - Verb string `json:"verb,omitempty"` - Vars []string `json:"vars,omitempty"` - Extras map[string]any `json:"extras"` -} -type routeTarget struct { - Method string - Path string - Operation string - Verb *string - Vars []*pathVariable - extras map[string]any -} + vv := path.verbMap[verbKey] + if vv == nil { + return nil, errors.WrapTag(ErrOperationNotFound, errMsg(errors.T("node", node))...) + } -type nodeTree struct { - nodes map[string]*nodeTree - verbs map[string]*routeTarget -} + return &MatchOperation{ + Extras: vv.extras, + Method: vv.Method, + Path: vv.Path, + Operation: vv.Operation, + Verb: verb, + Vars: getVars(vv.Vars, pathNodes), + }, nil + } -type MatchOperation struct { - Method string - Path string - Operation string - Verb string - Vars []PathFieldVar - Extras map[string]any + return nil, errors.WrapTag(ErrOperationNotFound, errMsg()...) } func getOpt(nodes map[string]*nodeTree) []RouteOperation { var sets []RouteOperation for _, n := range nodes { - for _, v := range n.verbs { + for _, v := range n.verbMap { sets = append(sets, RouteOperation{ Method: v.Method, Path: v.Path, Operation: v.Operation, Verb: generic.FromPtr(v.Verb), - Vars: generic.Map(v.Vars, func(i int) string { return strings.Join(v.Vars[i].Fields, ".") }), + Vars: generic.Map(v.Vars, func(i int) string { return strings.Join(v.Vars[i].fields, ".") }), Extras: v.extras, }) } - sets = append(sets, getOpt(n.nodes)...) + sets = append(sets, getOpt(n.nodeMap)...) } return sets } diff --git a/pkg/gateway/internal/routertree/router_test.go b/pkg/gateway/internal/routertree/router_test.go index 19d23f4fe..8fc904423 100644 --- a/pkg/gateway/internal/routertree/router_test.go +++ b/pkg/gateway/internal/routertree/router_test.go @@ -1,19 +1,36 @@ package routertree import ( + "github.com/pubgo/funk/pretty" "testing" "github.com/stretchr/testify/assert" ) func TestRoute(t *testing.T) { - tree := NewRouteTree() + tree := New() assert.NoError(t, tree.Add("get", "/user/user/{id}:get1", "get_user", nil)) assert.NoError(t, tree.Add("post", "/user/user/{id}", "post_user", nil)) + assert.NoError(t, tree.Add("post", "/user/user1/{id=**}", "post_user1", nil)) assert.NoError(t, tree.Add("post", "/user/user/{id}/send_mail", "post_mail", nil)) - opt, err := tree.Match("get", "/user/user/1:get1") + opt, err := tree.Match("post", "/user/user/1/send_mail") + pretty.Println(opt) + assert.NoError(t, err) + assert.NotNil(t, opt) + assert.Equal(t, "post_mail", opt.Operation) + assert.Equal(t, "", opt.Verb) + + opt, err = tree.Match("get", "/user/user/1:get1") + pretty.Println(opt) assert.NoError(t, err) assert.NotNil(t, opt) assert.Equal(t, "get_user", opt.Operation) assert.Equal(t, "get1", opt.Verb) + + opt, err = tree.Match("post", "/user/user1/123/123456") + pretty.Println(opt) + assert.NoError(t, err) + assert.NotNil(t, opt) + assert.Equal(t, "post_user1", opt.Operation) + assert.Equal(t, "", opt.Verb) } diff --git a/pkg/gateway/mux.go b/pkg/gateway/mux.go index 169cf53b7..240350ee8 100644 --- a/pkg/gateway/mux.go +++ b/pkg/gateway/mux.go @@ -310,7 +310,7 @@ func NewMux(opts ...MuxOption) *Mux { mux := &Mux{ opts: &muxOpts, localClient: new(inprocgrpc.Channel), - routerTree: routertree.NewRouteTree(), + routerTree: routertree.New(), } return mux diff --git a/pkg/grpc_builder/config.go b/pkg/grpcbuilder/config.go similarity index 99% rename from pkg/grpc_builder/config.go rename to pkg/grpcbuilder/config.go index e7fe170d0..1dc606872 100644 --- a/pkg/grpc_builder/config.go +++ b/pkg/grpcbuilder/config.go @@ -1,4 +1,4 @@ -package grpc_builder +package grpcbuilder import ( "time" diff --git a/servers/grpcs/config.go b/servers/grpcs/config.go index e6009ee9f..ea6ea8a6f 100644 --- a/servers/grpcs/config.go +++ b/servers/grpcs/config.go @@ -2,7 +2,7 @@ package grpcs import ( "github.com/pubgo/funk/version" - "github.com/pubgo/lava/pkg/grpc_builder" + "github.com/pubgo/lava/pkg/grpcbuilder" ) const ( @@ -14,11 +14,11 @@ type GrpcServerConfigLoader struct { } type Config struct { - EnablePrintRoutes bool `yaml:"enable_print_routes"` - BaseUrl string `yaml:"base_url"` - GrpcConfig *grpc_builder.Config `yaml:"grpc_config"` - EnableCors bool `yaml:"enable_cors"` - EnablePingPong bool `yaml:"enable_ping_pong"` + EnablePrintRoutes bool `yaml:"enable_print_routes"` + BaseUrl string `yaml:"base_url"` + GrpcConfig *grpcbuilder.Config `yaml:"grpc_config"` + EnableCors bool `yaml:"enable_cors"` + EnablePingPong bool `yaml:"enable_ping_pong"` // unix seconds PingPongTime int32 `yaml:"ping_pong_time"` @@ -32,6 +32,6 @@ func defaultCfg() *Config { return &Config{ EnablePrintRoutes: true, BaseUrl: version.Project(), - GrpcConfig: grpc_builder.GetDefaultCfg(), + GrpcConfig: grpcbuilder.GetDefaultCfg(), } } diff --git a/servers/https/config.go b/servers/https/config.go index 324b2db71..ab42765ab 100644 --- a/servers/https/config.go +++ b/servers/https/config.go @@ -2,23 +2,23 @@ package https import ( "github.com/pubgo/funk/version" - "github.com/pubgo/lava/pkg/fiber_builder" + "github.com/pubgo/lava/pkg/fiberbuilder" ) // DefaultMaxBodyBytes is the maximum allowed size of a request body in bytes. const DefaultMaxBodyBytes = 256 * 1024 type Config struct { - Http *fiber_builder.Config `yaml:"http"` - Ws *fiber_builder.WsCfg `yaml:"ws"` - EnablePrintRouter bool `yaml:"enable_print_router"` - BaseUrl string `yaml:"base_url"` + Http *fiberbuilder.Config `yaml:"http"` + Ws *fiberbuilder.WsCfg `yaml:"ws"` + EnablePrintRouter bool `yaml:"enable_print_router"` + BaseUrl string `yaml:"base_url"` } func DefaultCfg() Config { return Config{ - Http: &fiber_builder.Config{}, - Ws: &fiber_builder.WsCfg{}, + Http: &fiberbuilder.Config{}, + Ws: &fiberbuilder.WsCfg{}, EnablePrintRouter: true, BaseUrl: version.Project(), } diff --git a/servers/https/middleware.go b/servers/https/middleware.go index 8759a21df..f357393ae 100644 --- a/servers/https/middleware.go +++ b/servers/https/middleware.go @@ -2,18 +2,23 @@ package https import ( "context" - "reflect" "github.com/gofiber/fiber/v2" "github.com/pubgo/lava/lava" ) -var parserTypes []fiber.ParserType +func init() { + fiber.SetParserDecoder(fiber.ParserConfig{ + IgnoreUnknownKeys: true, + ZeroEmpty: true, + }) +} -func RegParser(customType interface{}, converter func(string) reflect.Value) { - parserTypes = append(parserTypes, fiber.ParserType{ - Customtype: customType, - Converter: converter, +func RegParser(parsers []fiber.ParserType) { + fiber.SetParserDecoder(fiber.ParserConfig{ + IgnoreUnknownKeys: true, + ZeroEmpty: true, + ParserType: parsers, }) } diff --git a/servers/https/server.go b/servers/https/server.go index d8ce1c00b..99dcec6df 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "github.com/pubgo/lava/internal/middlewares/middleware_service_info" "net" "net/http" "strings" @@ -71,12 +72,6 @@ func (s *serviceImpl) DixInject( cfg.BaseUrl = "/" + version.Project() } - fiber.SetParserDecoder(fiber.ParserConfig{ - IgnoreUnknownKeys: true, - ZeroEmpty: true, - ParserType: parserTypes, - }) - log = log.WithName("http-server") s.lc = getLifecycle @@ -124,6 +119,7 @@ func (s *serviceImpl) DixInject( })) defaultMiddlewares := []lava.Middleware{ + middleware_service_info.New(), middleware_metric.New(m), middleware_accesslog.New(log), middleware_recovery.New(), From 2c53af7067262cd7a5c867932b795191cc567d0e Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 15 May 2025 22:28:28 +0800 Subject: [PATCH 017/142] fix: barry quick fix, 2025-05-15 22:28:28 --- pkg/gateway/_doc.go | 11 + pkg/gateway/aaa.go | 8 +- pkg/gateway/internal/routex/_doc.go | 12 - pkg/gateway/internal/routex/path_parser.go | 377 -------------- .../internal/routex/path_parser_test.go | 313 ------------ pkg/gateway/internal/routex/path_scanner.go | 110 ----- pkg/gateway/internal/routex/router.go | 464 ------------------ pkg/gateway/internal/routex/router_test.go | 332 ------------- pkg/gateway/internal/routex/types.go | 10 - pkg/gateway/mux.go | 2 +- pkg/gateway/routertree/lex.go | 36 ++ .../{internal => }/routertree/parser.go | 63 +-- .../{internal => }/routertree/parser_test.go | 0 .../{internal => }/routertree/router.go | 0 .../{internal => }/routertree/router_test.go | 2 +- pkg/gateway/stream_http.go | 2 +- pkg/gateway/util.go | 2 +- 17 files changed, 70 insertions(+), 1674 deletions(-) delete mode 100644 pkg/gateway/internal/routex/_doc.go delete mode 100644 pkg/gateway/internal/routex/path_parser.go delete mode 100644 pkg/gateway/internal/routex/path_parser_test.go delete mode 100644 pkg/gateway/internal/routex/path_scanner.go delete mode 100644 pkg/gateway/internal/routex/router.go delete mode 100644 pkg/gateway/internal/routex/router_test.go delete mode 100644 pkg/gateway/internal/routex/types.go create mode 100644 pkg/gateway/routertree/lex.go rename pkg/gateway/{internal => }/routertree/parser.go (69%) rename pkg/gateway/{internal => }/routertree/parser_test.go (100%) rename pkg/gateway/{internal => }/routertree/router.go (100%) rename pkg/gateway/{internal => }/routertree/router_test.go (100%) diff --git a/pkg/gateway/_doc.go b/pkg/gateway/_doc.go index 5f26478fa..5c610c0d5 100644 --- a/pkg/gateway/_doc.go +++ b/pkg/gateway/_doc.go @@ -13,3 +13,14 @@ package gateway // https://github.com/nhooyr/websocket // https://github.com/connectrpc/vanguard-go // https://github.com/emcfarlane/larking + +// https://github.com/GoogleCloudPlatform/esp-v2/blob/master/src/go/configgenerator/routegen/helpers/backend_route.go +// https://github.com/vine-io/vine/blob/e435e77c14082e84c92028ef035d1d7597e8616b/lib/api/router/httprule/runtime.go +// https://github.com/grpc-ecosystem/grpc-gateway/blob/1bf77dd97e2f74c7511a7405ad7c950d36e45894/runtime/mux.go#L313 +// https://github.com/solo-io/gloo +// https://github.com/altipla-consulting/protoc-gen-grpc_browser/tree/master +// https://github.com/emcfarlane/larking/blob/91250e03da0d4670288dbc663aab7481e07c81dc/larking/rules.go#L53 +// https://github.com/connectrpc/vanguard-go +// https://github.com/stackrox/go-grpc-http1 +// https://github.com/flakrimjusufi/grpc-with-rest +// https://github.com/tidwall/match/blob/master/match.go diff --git a/pkg/gateway/aaa.go b/pkg/gateway/aaa.go index 2884f6150..b0a44c1f4 100644 --- a/pkg/gateway/aaa.go +++ b/pkg/gateway/aaa.go @@ -2,11 +2,11 @@ package gateway import ( "context" + routertree2 "github.com/pubgo/lava/pkg/gateway/routertree" "io" "net/http" "github.com/gofiber/fiber/v2" - "github.com/pubgo/lava/pkg/gateway/internal/routertree" "google.golang.org/grpc" "google.golang.org/grpc/encoding" "google.golang.org/protobuf/proto" @@ -14,9 +14,9 @@ import ( ) type ( - MatchOperation = routertree.MatchOperation - PathFieldVar = routertree.PathFieldVar - RouteOperation = routertree.RouteOperation + MatchOperation = routertree2.MatchOperation + PathFieldVar = routertree2.PathFieldVar + RouteOperation = routertree2.RouteOperation Gateway interface { grpc.ClientConnInterface SetUnaryInterceptor(interceptor grpc.UnaryServerInterceptor) diff --git a/pkg/gateway/internal/routex/_doc.go b/pkg/gateway/internal/routex/_doc.go deleted file mode 100644 index e81ab3808..000000000 --- a/pkg/gateway/internal/routex/_doc.go +++ /dev/null @@ -1,12 +0,0 @@ -package routex - -// https://github.com/GoogleCloudPlatform/esp-v2/blob/master/src/go/configgenerator/routegen/helpers/backend_route.go -// https://github.com/vine-io/vine/blob/e435e77c14082e84c92028ef035d1d7597e8616b/lib/api/router/httprule/runtime.go -// https://github.com/grpc-ecosystem/grpc-gateway/blob/1bf77dd97e2f74c7511a7405ad7c950d36e45894/runtime/mux.go#L313 -// https://github.com/solo-io/gloo -// https://github.com/altipla-consulting/protoc-gen-grpc_browser/tree/master -// https://github.com/emcfarlane/larking/blob/91250e03da0d4670288dbc663aab7481e07c81dc/larking/rules.go#L53 -// https://github.com/connectrpc/vanguard-go -// https://github.com/stackrox/go-grpc-http1 -// https://github.com/flakrimjusufi/grpc-with-rest -// https://github.com/tidwall/match/blob/master/match.go diff --git a/pkg/gateway/internal/routex/path_parser.go b/pkg/gateway/internal/routex/path_parser.go deleted file mode 100644 index d3071d51a..000000000 --- a/pkg/gateway/internal/routex/path_parser.go +++ /dev/null @@ -1,377 +0,0 @@ -// Copyright 2023-2024 Buf Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package routex - -import ( - "fmt" - "net/url" - "strconv" - "strings" - - "github.com/pubgo/funk/errors" -) - -// pathSegments holds the path segments for a HttpMethod. -// The verb is the final segment, if any. Wildcards segments are annotated by -// '*' and '**' path values. Each segment is URL unescaped. -type pathSegments struct { - path []string // segment path values. - verb string // final segment verb, if any. -} - -// String returns the URL HttpPath representation of the segments. -func (s pathSegments) String() string { - var out strings.Builder - for _, value := range s.path { - out.WriteByte('/') - if value != "*" && value != "**" { - value = url.PathEscape(value) - } - out.WriteString(value) - } - if s.verb != "" { - out.WriteByte(':') - out.WriteString(url.PathEscape(s.verb)) - } - return out.String() -} - -// pathVariable holds the HttpPath variables for a HttpMethod. -// The start and end Fields are the start and end HttpPath segments, inclusive-exclusive. -// If the end is -1, the variable is unbounded, representing a '**' wildcard capture. -type pathVariable struct { - FieldPath string // field HttpPath for the variable. - start, end int // start and end HttpPath segments, inclusive-exclusive, -1 for unbounded. -} - -// parsePathTemplate parsers a methods template into HttpPath segments and variables. -// -// The grammar for the HttpPath template is given in the protobuf definition -// in [google/api/http.proto]. -// -// Template = "/" Segments [ Verb ] ; -// Segments = Segment { "/" Segment } ; -// Segment = "*" | "**" | LITERAL | Variable ; -// Variable = "{" FieldPath [ "=" Segments ] "}" ; -// FieldPath = IDENT { "." IDENT } ; -// Verb = ":" LITERAL ; -// -// [google/api/http.proto]: https://github.com/googleapis/googleapis/blob/ecb1cf0a0021267dd452289fc71c75674ae29fe3/google/api/http.proto#L227-L235 -func parsePathTemplate(template string) (pathSegments, []pathVariable, error) { - parser := &pathParser{scan: pathScanner{input: template}} - if err := parser.parseTemplate(); err != nil { - return pathSegments{}, nil, err - } - return parser.segments, parser.variables, nil -} - -// pathParser holds the state for the recursive descent HttpPath template parser. -type pathParser struct { - scan pathScanner // scanner for the input. - seenVars map[string]bool // set of field paths. - seenDoubleStar bool // true if we've seen a double star wildcard. - segments pathSegments // output segments. - variables []pathVariable // output variables. -} - -func (p *pathParser) currentChar() string { - if char := p.scan.current(); char != eof { - return strconv.QuoteRune(char) - } - return "EOF" -} - -func (p *pathParser) errSyntax(msg string) error { - return fmt.Errorf("syntax error at column %v: %s", p.scan.pos, msg) -} - -func (p *pathParser) errUnexpected() error { - return p.errSyntax("unexpected " + p.currentChar()) -} - -func (p *pathParser) errExpected(expected rune) error { - return p.errSyntax("expected " + strconv.QuoteRune(expected) + ", got " + p.currentChar()) -} - -func (p *pathParser) parseTemplate() error { - if !p.scan.consume('/') { - return p.errExpected('/') // empty HttpPath is not allowed. - } - if err := p.parseSegments(); err != nil { - return err - } - switch p.scan.next() { - case ':': - p.scan.discard() - return p.parseVerb() - case eof: - return nil - default: - return p.errUnexpected() - } -} - -func (p *pathParser) parseVerb() error { - literal, err := p.parseLiteral() - if err != nil { - return err - } - p.segments.verb = literal - if !p.scan.consume(eof) { - return p.errUnexpected() - } - return nil -} - -func (p *pathParser) parseSegments() error { - for { - if err := p.parseSegment(); err != nil { - return err - } - if p.scan.next() != '/' { - p.scan.backup() - return nil - } - p.scan.discard() - if p.seenDoubleStar { - return errors.New("double wildcard '**' must be the final HttpPath segment") - } - } -} - -// parseLiteral parses a URL HttpPath segment in URL HttpPath escaped form. -func (p *pathParser) parseLiteral() (string, error) { - literal := p.scan.captureRun(isLiteral) - if literal == "" { - p.scan.next() - return "", errors.WrapCaller(p.errUnexpected()) - } - - unescaped, err := pathUnescape(literal, pathEncodeSingle) - if err != nil { - return "", errors.WrapCaller(p.errSyntax(err.Error())) - } - - return pathEscape(unescaped, pathEncodeSingle), nil -} - -func (p *pathParser) parseSegment() error { - var segment string - switch p.scan.next() { - case '*': - if p.scan.next() == '*' { - p.seenDoubleStar = true - } else { - p.scan.backup() - } - segment = p.scan.capture() - case '{': - p.scan.discard() - return p.parseVariable() - default: - if !isLiteral(p.scan.current()) { - return p.errSyntax("expected HttpPath Value") - } - literal, err := p.parseLiteral() - if err != nil { - return err - } - segment = literal - } - p.segments.path = append(p.segments.path, segment) - return nil -} - -func (p *pathParser) parseFieldPath() (string, error) { - for { - if !isIdentStart(p.scan.next()) { - return "", p.errSyntax("expected identifier") - } - for isIdent(p.scan.next()) { - continue - } - if p.scan.current() != '.' { - p.scan.backup() - return p.scan.capture(), nil - } - } -} - -func (p *pathParser) parseVariable() error { - fieldPath, err := p.parseFieldPath() - if err != nil { - return err - } - if p.seenVars[fieldPath] { - return fmt.Errorf("duplicate variable %q", fieldPath) - } - if p.seenVars == nil { - p.seenVars = make(map[string]bool) - } - p.seenVars[fieldPath] = true - - variable := pathVariable{FieldPath: fieldPath, start: len(p.segments.path)} - - switch p.scan.next() { - case '}': - p.scan.discard() - p.segments.path = append(p.segments.path, "*") // default capture. - case '=': - p.scan.discard() - if err := p.parseSegments(); err != nil { - return err - } - if !p.scan.consume('}') { - return p.errExpected('}') - } - default: - return p.errExpected('}') - } - variable.end = len(p.segments.path) - if p.seenDoubleStar { - variable.end = -1 // double star wildcard. - } - p.variables = append(p.variables, variable) - return nil -} - -const upperhex = "0123456789ABCDEF" - -func ishex(char byte) bool { - switch { - case '0' <= char && char <= '9': - return true - case 'a' <= char && char <= 'f': - return true - case 'A' <= char && char <= 'F': - return true - } - return false -} - -func unhex(char byte) byte { - switch { - case '0' <= char && char <= '9': - return char - '0' - case 'a' <= char && char <= 'f': - return char - 'a' + 10 - case 'A' <= char && char <= 'F': - return char - 'A' + 10 - } - return 0 -} - -// pathEncoding is the encoding used for HttpPath variables. -// Single encoding is used for single segment capture variables, -// while multi encoding is used for multi segment capture variables. -// On multi encoding variables, '/' is not escaped and is preserved -// as '%2F' if encoded in the HttpPath. -// -// See: https://github.com/googleapis/googleapis/blob/1769846666fbeb0f9ece6ad929ddc0d563cccd8d/google/api/http.proto#L249-L264 -type pathEncoding int - -const ( - pathEncodeSingle pathEncoding = iota - pathEncodeMulti -) - -func pathShouldEscape(char byte, _ pathEncoding) bool { - return !isVariable(rune(char)) -} - -func pathIsHexSlash(input string) bool { - if len(input) < 3 { - return false - } - return input[0] == '%' && input[1] == '2' && (input[2] == 'f' || input[2] == 'F') -} - -func pathEscape(input string, mode pathEncoding) string { - // Count the number of characters that possibly escaping. - hexCount := 0 - for i := 0; i < len(input); i++ { - if pathShouldEscape(input[i], mode) { - hexCount++ - } - } - if hexCount == 0 { - return input - } - - var sb strings.Builder - sb.Grow(len(input) + 2*hexCount) - for i := 0; i < len(input); i++ { - switch char := input[i]; { - case char == '%' && mode == pathEncodeMulti && pathIsHexSlash(input[i:]): - sb.WriteString("%2F") - i += 2 - case pathShouldEscape(char, mode): - sb.WriteByte('%') - sb.WriteByte(upperhex[char>>4]) - sb.WriteByte(upperhex[char&15]) - default: - sb.WriteByte(char) - } - } - return sb.String() -} - -func validateHex(input string) error { - if len(input) < 3 || input[0] != '%' || !ishex(input[1]) || !ishex(input[2]) { - if len(input) > 3 { - input = input[:3] - } - return errors.WrapCaller(url.EscapeError(input)) - } - return nil -} - -func pathUnescape(input string, mode pathEncoding) (string, error) { - // Count %, check that they're well-formed. - percentCount := 0 - for i := 0; i < len(input); { - switch input[i] { - case '%': - percentCount++ - if err := validateHex(input[i:]); err != nil { - return "", errors.WrapCaller(err) - } - i += 3 - default: - i++ - } - } - if percentCount == 0 { - return input, nil - } - - var sb strings.Builder - sb.Grow(len(input) - 2*percentCount) - for i := 0; i < len(input); i++ { - switch input[i] { - case '%': - if mode == pathEncodeMulti && pathIsHexSlash(input[i:]) { - // Multi doesn't escape /, so we don't escape. - sb.WriteString("%2F") - } else { - sb.WriteByte(unhex(input[i+1])<<4 | unhex(input[i+2])) - } - i += 2 - default: - sb.WriteByte(input[i]) - } - } - return sb.String(), nil -} diff --git a/pkg/gateway/internal/routex/path_parser_test.go b/pkg/gateway/internal/routex/path_parser_test.go deleted file mode 100644 index d174c03a7..000000000 --- a/pkg/gateway/internal/routex/path_parser_test.go +++ /dev/null @@ -1,313 +0,0 @@ -// Copyright 2023-2024 Buf Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package routex - -import ( - "net/url" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestPath_ParsePathTemplate(t *testing.T) { - t.Parallel() - - testCases := []struct { - tmpl string - wantPath []string - wantVerb string - wantVars []pathVariable - expectedErr string - }{{ - // no error, but lots of encoding for special/reserved characters - tmpl: "/my%2fcool-blog~about%2Cstuff%5Bwat%5D/{var={abc=%2F%2A}/{def=%2F%2A/**}}:baz", - wantPath: []string{"my%2Fcool-blog~about%2Cstuff%5Bwat%5D", "%2F%2A", "%2F%2A", "**"}, - wantVerb: "baz", - wantVars: []pathVariable{ - {FieldPath: "var", start: 1, end: -1}, - {FieldPath: "abc", start: 1, end: 2}, - {FieldPath: "def", start: 2, end: -1}, - }, - }, { - tmpl: "/{1}", - expectedErr: "syntax error at column 3: expected identifier", - }, { - tmpl: "/{field.1}", - expectedErr: "syntax error at column 9: expected identifier", - }, { - tmpl: "/{_}", - wantPath: []string{"*"}, - wantVars: []pathVariable{ - {FieldPath: "_", start: 0, end: 1}, - }, - }, { - tmpl: "/{-}", - expectedErr: "syntax error at column 3: expected identifier", - }, { - tmpl: "/{field-}", - expectedErr: "syntax error at column 8: expected '}', got '-'", - }, { - tmpl: "/foo/bar/baz?abc=def", - expectedErr: "syntax error at column 13: unexpected '?'", // no query string allowed - }, { - tmpl: "/foo/bar/baz buzz", - expectedErr: "syntax error at column 13: unexpected ' '", // no whitespace allowed - }, { - tmpl: "foo/bar/baz", - expectedErr: "syntax error at column 1: expected '/', got 'f'", // must start with slash - }, { - tmpl: "/foo/bar/", - expectedErr: "syntax error at column 9: expected HttpPath Value", // must not end in slash - }, { - tmpl: "/foo/bar:baz/buzz", - expectedErr: "syntax error at column 13: unexpected '/'", // ":baz" Verb can only come at the very end - }, { - tmpl: "/foo/{bar/baz}/buzz", - expectedErr: "syntax error at column 10: expected '}', got '/'", // invalid field HttpPath - }, { - tmpl: "/foo/bar:baz%12xyz%abcde", - wantPath: []string{"foo", "bar"}, - wantVerb: "baz%12xyz%ABcde", - }, { - tmpl: "/{hello}/world", - wantPath: []string{"*", "world"}, - wantVars: []pathVariable{ - {FieldPath: "hello", start: 0, end: 1}, - }, - }, { - tmpl: "/foo/bar%55:baz%1", - expectedErr: "syntax error at column 17: invalid URL escape \"%1\"", - }, { - tmpl: "/foo/bar*", - expectedErr: "syntax error at column 9: unexpected '*'", // wildcard must be entire HttpPath component - }, { - tmpl: "/foo/bar/***", - expectedErr: "syntax error at column 12: unexpected '*'", // no such thing as triple-wildcard - }, { - tmpl: "/foo/**/bar", - expectedErr: "double wildcard '**' must be the final HttpPath segment", // double-wildcard must be at end - }, { - tmpl: "/{a}/{a}", // TODO: allow this? - expectedErr: "duplicate variable \"a\"", - }, { - tmpl: "/f/bar", - wantPath: []string{"f", "bar"}, - }, { - tmpl: "/v1/{Name=shelves/*/books/*}", - wantPath: []string{"v1", "shelves", "*", "books", "*"}, - wantVars: []pathVariable{ - {FieldPath: "Name", start: 1, end: 5}, - }, - }, { - tmpl: "/v1/{parent=shelves/*}/books", - wantPath: []string{"v1", "shelves", "*", "books"}, - wantVars: []pathVariable{ - {FieldPath: "parent", start: 1, end: 3}, - }, - }, { - tmpl: "/v1/{book.Name=shelves/*/books/*}", - wantPath: []string{"v1", "shelves", "*", "books", "*"}, - wantVars: []pathVariable{ - {FieldPath: "book.Name", start: 1, end: 5}, - }, - }, { - tmpl: "/v1:watch", - wantPath: []string{"v1"}, - wantVerb: "watch", - }, { - tmpl: "/v3/events:clear", - wantPath: []string{"v3", "events"}, - wantVerb: "clear", - }, { - tmpl: "/v3/{Name=events/*}:cancel", - wantPath: []string{"v3", "events", "*"}, - wantVerb: "cancel", - wantVars: []pathVariable{ - {FieldPath: "Name", start: 1, end: 3}, - }, - }, { - tmpl: "/foo/bar/baz/buzz", - wantPath: []string{"foo", "bar", "baz", "buzz"}, - }, { - tmpl: "/foo/bar/{Name}", - wantPath: []string{"foo", "bar", "*"}, - wantVars: []pathVariable{ - {FieldPath: "Name", start: 2, end: 3}, - }, - }, { - tmpl: "/foo/bar/{Name}/baz/{child}", - wantPath: []string{"foo", "bar", "*", "baz", "*"}, - wantVars: []pathVariable{ - {FieldPath: "Name", start: 2, end: 3}, - {FieldPath: "child", start: 4, end: 5}, - }, - }, { - tmpl: "/foo/bar/{Name}/baz/{child.id}/buzz/{child.thing.id}", - wantPath: []string{"foo", "bar", "*", "baz", "*", "buzz", "*"}, - wantVars: []pathVariable{ - {FieldPath: "Name", start: 2, end: 3}, - {FieldPath: "child.id", start: 4, end: 5}, - {FieldPath: "child.thing.id", start: 6, end: 7}, - }, - }, { - tmpl: "/foo/bar/*/{thing.id}/{cat=**}", - wantPath: []string{"foo", "bar", "*", "*", "**"}, - wantVars: []pathVariable{ - {FieldPath: "thing.id", start: 3, end: 4}, - {FieldPath: "cat", start: 4, end: -1}, - }, - }, { - tmpl: "/foo/bar/*/{thing.id}/{cat=**}:do", - wantPath: []string{"foo", "bar", "*", "*", "**"}, - wantVerb: "do", - wantVars: []pathVariable{ - {FieldPath: "thing.id", start: 3, end: 4}, - {FieldPath: "cat", start: 4, end: -1}, - }, - }, { - tmpl: "/foo/bar/*/{thing.id}/{cat=**}:cancel", - wantPath: []string{"foo", "bar", "*", "*", "**"}, - wantVerb: "cancel", - wantVars: []pathVariable{ - {FieldPath: "thing.id", start: 3, end: 4}, - {FieldPath: "cat", start: 4, end: -1}, - }, - }, { - tmpl: "/foo/bob/{book_id={author}/{isbn}/*}/details", - wantPath: []string{"foo", "bob", "*", "*", "*", "details"}, - wantVars: []pathVariable{ - {FieldPath: "book_id", start: 2, end: 5}, - {FieldPath: "author", start: 2, end: 3}, - {FieldPath: "isbn", start: 3, end: 4}, - }, - }, { - tmpl: "/foo/blah/{longest_var={long_var.a={medium.a={short.aa}/*/{short.ab}/foo}/*}/{long_var.b={medium.b={short.ba}/*/{short.bb}/foo}/{last=**}}}:details", - wantPath: []string{ - "foo", "blah", - "*", // 2 logest_var, long_var.a, medium.a, short.aa - "*", // 3 - "*", // 4 short.ab - "foo", // 5 - "*", // 6 - "*", // 7 long_var.b, medium.b, short.ba - "*", // 8 - "*", // 9 short.bb - "foo", // 10 - "**", // 11 last - }, - wantVerb: "details", - wantVars: []pathVariable{ - {FieldPath: "longest_var", start: 2, end: -1}, - {FieldPath: "long_var.a", start: 2, end: 7}, - {FieldPath: "medium.a", start: 2, end: 6}, - {FieldPath: "short.aa", start: 2, end: 3}, - {FieldPath: "short.ab", start: 4, end: 5}, - {FieldPath: "long_var.b", start: 7, end: -1}, - {FieldPath: "medium.b", start: 7, end: 11}, - {FieldPath: "short.ba", start: 7, end: 8}, - {FieldPath: "short.bb", start: 9, end: 10}, - {FieldPath: "last", start: 11, end: -1}, - }, - }, { - tmpl: "/foo%2Fbar/%2A/%2A%2a/{starstar=%2A%2a/**}:%2c", - wantPath: []string{"foo%2Fbar", "%2A", "%2A%2A", "%2A%2A", "**"}, - wantVerb: "%2C", - wantVars: []pathVariable{ - {FieldPath: "starstar", start: 3, end: -1}, - }, - }} - for _, testCase := range testCases { - testCase := testCase - t.Run(testCase.tmpl, func(t *testing.T) { - t.Parallel() - segments, variables, err := parsePathTemplate(testCase.tmpl) - if testCase.expectedErr != "" { - assert.ErrorContains(t, err, testCase.expectedErr) - return - } - t.Log(segments) - require.NoError(t, err) - assert.ElementsMatch(t, testCase.wantPath, segments.path, "HttpPath mismatch") - assert.Equal(t, testCase.wantVerb, segments.verb, "Verb mismatch") - assert.ElementsMatch(t, testCase.wantVars, variables, "variables mismatch") - }) - } -} - -func TestPath_SafeLiterals(t *testing.T) { - t.Parallel() - literalvalues := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._%25~" - for _, r := range literalvalues { - if !isLiteral(r) { - t.Errorf("isLiteral(%q) = false, want true", r) - } - } - unescaped, err := url.PathUnescape(literalvalues) - require.NoError(t, err) - escaped := url.PathEscape(unescaped) - assert.Equal(t, literalvalues, escaped) -} - -func TestPath_Escaping(t *testing.T) { - t.Parallel() - testCases := []struct { - input string - mode pathEncoding - want string - wantEscaped string - wantErr string - }{{ - input: "foo", - mode: pathEncodeSingle, - want: "foo", - }, { - input: "foo%2Fbar", - mode: pathEncodeSingle, - want: "foo/bar", - }, { - input: "foo%252Fbar", - mode: pathEncodeSingle, - want: "foo%2Fbar", - }, { - input: "foo%2Fbar", - mode: pathEncodeMulti, - want: "foo%2Fbar", - }, { - input: "foo%2fbar", - mode: pathEncodeMulti, - want: "foo%2Fbar", - wantEscaped: "foo%2Fbar", - }} - for _, testCase := range testCases { - testCase := testCase - t.Run(testCase.input, func(t *testing.T) { - t.Parallel() - dec, err := pathUnescape(testCase.input, testCase.mode) - if err != nil { - assert.EqualError(t, err, testCase.wantErr) - return - } - require.NoError(t, err) - assert.Equal(t, testCase.want, dec) - enc := pathEscape(dec, testCase.mode) - if testCase.wantEscaped != "" { - assert.Equal(t, testCase.wantEscaped, enc) - } else { - assert.Equal(t, testCase.input, enc) - } - }) - } -} diff --git a/pkg/gateway/internal/routex/path_scanner.go b/pkg/gateway/internal/routex/path_scanner.go deleted file mode 100644 index 6cd02f5eb..000000000 --- a/pkg/gateway/internal/routex/path_scanner.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2023-2024 Buf Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package routex - -import ( - "unicode/utf8" -) - -// pathScanner holds the state of the scanner. -type pathScanner struct { - input string // the string being scanned. - start int // start position of this token. - pos int // current position in the input. - width int // width of last rune read from input. -} - -const eof = -1 - -func (s *pathScanner) next() rune { - var char rune - if s.pos >= len(s.input) { - s.width = 0 - return eof - } - char, s.width = utf8.DecodeRuneInString(s.input[s.pos:]) - s.pos += s.width - return char -} - -func (s *pathScanner) current() rune { - var char rune - if s.width > 0 { - char, _ = utf8.DecodeRuneInString(s.input[s.pos-s.width:]) - } else if s.pos > len(s.input) { - char = eof - } - return char -} - -func (s *pathScanner) backup() { - s.pos -= s.width - s.width = 0 -} - -func (s *pathScanner) captureRun(isValid func(r rune) bool) string { - for isValid(s.next()) { - continue - } - s.backup() - return s.capture() -} - -func (s *pathScanner) consume(expected rune) bool { - if s.next() == expected { - s.discard() - return true - } - return false -} - -func (s *pathScanner) discard() { - s.start = s.pos -} - -func (s *pathScanner) capture() string { - value := s.input[s.start:s.pos] - s.discard() - return value -} - -func isIdentStart(char rune) bool { - return (char >= 'a' && char <= 'z') || (char >= 'A' && char <= 'Z') || char == '_' -} - -func isDigit(char rune) bool { - return char >= '0' && char <= '9' -} - -func isIdent(char rune) bool { - return isIdentStart(char) || isDigit(char) -} - -func isFieldPath(char rune) bool { - return isIdent(char) || char == '.' -} - -func isLiteral(char rune) bool { - // Allow [-_.~0-9a-zA-Z] and % for escaped characters. - return isVariable(char) || char == '%' -} - -// isVariable is used to determine if a character is allowed in a single variable segment. -// -// See: https://github.com/googleapis/googleapis/blob/master/google/api/http.proto#L251C34-L251C38 -func isVariable(char rune) bool { - // Allow [-_.~0-9a-zA-Z]. - return isFieldPath(char) || char == '-' || char == '~' -} diff --git a/pkg/gateway/internal/routex/router.go b/pkg/gateway/internal/routex/router.go deleted file mode 100644 index 39c26685f..000000000 --- a/pkg/gateway/internal/routex/router.go +++ /dev/null @@ -1,464 +0,0 @@ -// Copyright 2023-2024 Buf Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package routex - -import ( - "fmt" - "net/http" - "strings" - - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - - "google.golang.org/genproto/googleapis/api/annotations" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" -) - -func NewRouteTrie() *RouteTrie { - return new(RouteTrie) -} - -// RouteTrie is a prefix trie of valid REST URI paths to route targets. -// It supports evaluation of variables as the HttpPath is matched, for -// interpolating parts of the URI HttpPath into an RPC request field. The -// map is keyed by the HttpPath component that corresponds to a given node. -type RouteTrie struct { - // Child nodes, keyed by the next segment in the HttpPath. - children map[string]*RouteTrie - // Final node in the HttpPath has a map of verbs to methods. - // Verbs are either an empty string or a single literal. - verbs map[string]RouteMethods -} - -func (t *RouteTrie) GetRouteMethods() []*RouteTarget { - var rr []*RouteTarget - for _, verbs := range t.verbs { - for _, target := range verbs { - rr = append(rr, target) - } - } - - for _, child := range t.children { - rr = append(rr, child.GetRouteMethods()...) - } - - return rr -} - -func (t *RouteTrie) Match(uriPath, httpMethod string) (*RouteTarget, []RouteTargetVarMatch, RouteMethods) { - return t.match(uriPath, httpMethod) -} - -func (t *RouteTrie) AddRoute(grpcMethod string, mth protoreflect.MethodDescriptor) error { - httpRule := getExtensionHTTP(mth) - return t.addRoute(&MethodConfig{Descriptor: mth, MethodPath: grpcMethod}, httpRule) -} - -// addRoute adds a target to the router for the given HttpMethod and the given -// HTTP rule. Only the rule itself is added. If the rule indicates additional -// bindings, they are ignored. To add routes for all bindings, callers must -// invoke this HttpMethod for each rule. -func (t *RouteTrie) addRoute(config *MethodConfig, httpRule *annotations.HttpRule) error { - if httpRule == nil { - return nil - } - - var method, template string - switch pattern := httpRule.GetPattern().(type) { - case *annotations.HttpRule_Get: - method, template = http.MethodGet, pattern.Get - case *annotations.HttpRule_Put: - method, template = http.MethodPut, pattern.Put - case *annotations.HttpRule_Post: - method, template = http.MethodPost, pattern.Post - case *annotations.HttpRule_Delete: - method, template = http.MethodDelete, pattern.Delete - case *annotations.HttpRule_Patch: - method, template = http.MethodPatch, pattern.Patch - case *annotations.HttpRule_Custom: - method, template = pattern.Custom.GetKind(), pattern.Custom.GetPath() - default: - return fmt.Errorf("invalid type of pattern for HTTP httpRule: %T", pattern) - } - - if method == "" { - return errors.New("invalid HTTP httpRule: HttpMethod is blank") - } - if template == "" { - return errors.New("invalid HTTP httpRule: HttpPath template is blank") - } - segments, variables, err := parsePathTemplate(template) - if err != nil { - return err - } - - target, err := makeTarget(config, method, httpRule.GetBody(), httpRule.GetResponseBody(), segments, variables) - if err != nil { - return err - } - if err := t.insert(method, target, segments); err != nil { - return err - } - - for i, rule := range httpRule.GetAdditionalBindings() { - if len(rule.GetAdditionalBindings()) > 0 { - return fmt.Errorf("nested additional bindings are not supported (HttpMethod %s)", config.MethodPath) - } - if err = t.addRoute(config, rule); err != nil { - return fmt.Errorf("failed to add REST route (add'l binding #%d) for HttpMethod %s: %w", i+1, config.MethodPath, err) - } - } - - return nil -} - -func (t *RouteTrie) insertChild(segment string) *RouteTrie { - child := t.children[segment] - if child == nil { - if t.children == nil { - t.children = make(map[string]*RouteTrie, 1) - } - child = &RouteTrie{} - t.children[segment] = child - } - return child -} - -func (t *RouteTrie) insertVerb(verb string) RouteMethods { - methods := t.verbs[verb] - if methods == nil { - if t.verbs == nil { - t.verbs = make(map[string]RouteMethods, 1) - } - methods = make(RouteMethods, 1) - t.verbs[verb] = methods - } - return methods -} - -// insert the target into the trie using the given HttpMethod and segment HttpPath. -// The HttpPath is followed until the final segment is reached. -func (t *RouteTrie) insert(method string, target *RouteTarget, segments pathSegments) error { - cursor := t - for _, segment := range segments.path { - cursor = cursor.insertChild(segment) - } - if existing := cursor.verbs[segments.verb][method]; existing != nil { - return alreadyExistsError{ - existing: existing, - pathPattern: segments.String(), - method: method, - } - } - cursor.insertVerb(segments.verb)[method] = target - return nil -} - -// match finds a route for the given request. If a match is found, the associated target and a map -// of matched variable values is returned. -func (t *RouteTrie) match(uriPath, httpMethod string) (*RouteTarget, []RouteTargetVarMatch, RouteMethods) { - if len(uriPath) == 0 || uriPath[0] != '/' || uriPath[len(uriPath)-1] == ':' { - // Must start with "/" or if it ends with ":" it won't match - return nil, nil, nil - } - uriPath = uriPath[1:] // skip the leading slash - - path := strings.Split(uriPath, "/") - var verb string - if len(path) > 0 { - lastElement := path[len(path)-1] - if pos := strings.IndexRune(lastElement, ':'); pos >= 0 { - path[len(path)-1] = lastElement[:pos] - verb = lastElement[pos+1:] - } - } - target, methods := t.findTarget(path, verb, httpMethod) - if target == nil { - return nil, nil, methods - } - - vars, err := computeVarValues(path, target) - if err != nil { - log.Err(err).Msg("failed to compute var values") - return nil, nil, nil - } - - return target, vars, nil -} - -// findTarget finds the target for the given HttpPath components, Verb, and HttpMethod. -// The HttpMethod either returns a target OR the set of methods for the given HttpPath -// and Verb. If the target is non-nil, the request was matched. If the target -// is nil but methods are non-nil, the HttpPath and Verb matched a route, but not -// the HttpMethod. This can be used to send back a well-formed "Allow" response -// header. If both are nil, the HttpPath and Verb did not match. -func (t *RouteTrie) findTarget(path []string, verb, method string) (*RouteTarget, RouteMethods) { - if len(path) == 0 { - return t.getTarget(verb, method) - } - current := path[0] - path = path[1:] - - if child := t.children[current]; child != nil { - target, methods := child.findTarget(path, verb, method) - if target != nil || methods != nil { - return target, methods - } - } - - if childAst := t.children["*"]; childAst != nil { - target, methods := childAst.findTarget(path, verb, method) - if target != nil || methods != nil { - return target, methods - } - } - - // Double-asterisk must be the last element in pattern. - // So it consumes all remaining HttpPath elements. - if childDblAst := t.children["**"]; childDblAst != nil { - return childDblAst.findTarget(nil, verb, method) - } - return nil, nil -} - -// getTarget gets the target for the given Verb and HttpMethod from the -// node trie. It is like findTarget, except that it does not use a -// HttpPath to first descend into a sub-trie. -func (t *RouteTrie) getTarget(verb, method string) (*RouteTarget, RouteMethods) { - methods := t.verbs[verb] - if target := methods[method]; target != nil { - return target, methods - } - // See if a wildcard HttpMethod was used - if target := methods["*"]; target != nil { - return target, methods - } - return nil, methods -} - -type RouteMethods map[string]*RouteTarget - -type RouteTarget struct { - GrpcMethodName string - HttpMethod string - HttpPath []string - Verb string - - RequestBodyFieldPath string - RequestBodyFields []protoreflect.FieldDescriptor - ResponseBodyFieldPath string - ResponseBodyFields []protoreflect.FieldDescriptor - Vars []RouteTargetVar -} - -func makeTarget(config *MethodConfig, method, requestBody, responseBody string, segments pathSegments, variables []pathVariable) (*RouteTarget, error) { - requestBodyFields, err := resolvePathToDescriptors(config.Descriptor.Input(), requestBody) - if err != nil { - return nil, err - } - if len(requestBodyFields) > 1 { - return nil, fmt.Errorf( - "unexpected request body HttpPath %q: must be a single field", - requestBody, - ) - } - - responseBodyFields, err := resolvePathToDescriptors(config.Descriptor.Output(), responseBody) - if err != nil { - return nil, err - } - if len(responseBodyFields) > 1 { - return nil, fmt.Errorf( - "unexpected response body HttpPath %q: must be a single field", - requestBody, - ) - } - - routeTargetVars := make([]RouteTargetVar, len(variables)) - for i, variable := range variables { - fields, err := resolvePathToDescriptors(config.Descriptor.Input(), variable.FieldPath) - if err != nil { - return nil, err - } - if last := fields[len(fields)-1]; last.IsList() { - return nil, fmt.Errorf( - "unexpected HttpPath variable %q: cannot be a repeated field", - variable.FieldPath, - ) - } - - routeTargetVars[i] = RouteTargetVar{ - pathVariable: variable, - fields: fields, - } - } - return &RouteTarget{ - GrpcMethodName: config.MethodPath, - HttpMethod: method, - HttpPath: segments.path, - Verb: segments.verb, - RequestBodyFieldPath: requestBody, - RequestBodyFields: requestBodyFields, - ResponseBodyFieldPath: responseBody, - ResponseBodyFields: responseBodyFields, - Vars: routeTargetVars, - }, nil -} - -type RouteTargetVar struct { - pathVariable - - fields []protoreflect.FieldDescriptor -} - -func (v RouteTargetVar) size() int { - if v.end == -1 { - return -1 - } - return v.end - v.start -} - -func (v RouteTargetVar) index(segments []string) []string { - start, end := v.start, v.end - if end == -1 { - if start >= len(segments) { - return nil - } - return segments[start:] - } - return segments[start:end] -} - -func (v RouteTargetVar) capture(segments []string) (string, error) { - parts := v.index(segments) - mode := pathEncodeSingle - if v.end == -1 || v.start-v.end > 1 { - mode = pathEncodeMulti - } - - var sb strings.Builder - for i, part := range parts { - val, err := pathUnescape(part, mode) - if err != nil { - return "", err - } - if i > 0 { - sb.WriteByte('/') - } - sb.WriteString(val) - } - return sb.String(), nil -} - -type RouteTargetVarMatch struct { - Fields []protoreflect.FieldDescriptor - Value string - Name string -} - -func computeVarValues(path []string, target *RouteTarget) ([]RouteTargetVarMatch, error) { - if len(target.Vars) == 0 { - return nil, nil - } - vars := make([]RouteTargetVarMatch, len(target.Vars)) - for i, varDef := range target.Vars { - val, err := varDef.capture(path) - if err != nil { - return nil, err - } - vars[i].Fields = varDef.fields - vars[i].Value = val - vars[i].Name = varDef.FieldPath - } - return vars, nil -} - -// resolvePathToDescriptors translates the given HttpPath string, in the form of "ident.ident.ident", -// into a HttpPath of FieldDescriptors, relative to the given msg. -func resolvePathToDescriptors(msg protoreflect.MessageDescriptor, path string) ([]protoreflect.FieldDescriptor, error) { - if path == "" { - return nil, nil - } - if path == "*" { - // non-nil, empty slice means use the whole thing - return []protoreflect.FieldDescriptor{}, nil - } - - fields := msg.Fields() - parts := strings.Split(path, ".") - result := make([]protoreflect.FieldDescriptor, len(parts)) - for i, part := range parts { - field := fields.ByName(protoreflect.Name(part)) - if field == nil { - return nil, fmt.Errorf("in field HttpPath %q: element %q does not correspond to any field of type %s", - path, part, msg.FullName()) - } - result[i] = field - if i == len(parts)-1 { - break - } - if field.Cardinality() == protoreflect.Repeated { - return nil, fmt.Errorf("in field HttpPath %q: field %q of type %s should not be a list or map", - path, part, msg.FullName()) - } - msg = field.Message() - if msg == nil { - return nil, fmt.Errorf("in field HttpPath %q: field %q of type %s should be a message but is instead %s", - path, part, msg.FullName(), field.Kind()) - } - fields = msg.Fields() - } - return result, nil -} - -// resolveFieldDescriptorsToPath translates the given HttpPath of FieldDescriptors into a string -// of the form "ident.ident.ident". -func resolveFieldDescriptorsToPath(fields []protoreflect.FieldDescriptor) string { - if len(fields) == 0 { - return "" - } - parts := make([]string, len(fields)) - for i, field := range fields { - parts[i] = string(field.Name()) - } - return strings.Join(parts, ".") -} - -type alreadyExistsError struct { - existing *RouteTarget - pathPattern, method string -} - -func (a alreadyExistsError) Error() string { - return fmt.Sprintf("target for %s, HttpMethod %s already exists: %s", a.pathPattern, a.method, a.existing.GrpcMethodName) -} - -// getExtensionHTTP -func getExtensionHTTP(m protoreflect.MethodDescriptor) *annotations.HttpRule { - if m == nil { - return nil - } - - if m.Options() == nil { - return nil - } - - ext, ok := proto.GetExtension(m.Options(), annotations.E_Http).(*annotations.HttpRule) - if ok { - return ext - } - return nil -} diff --git a/pkg/gateway/internal/routex/router_test.go b/pkg/gateway/internal/routex/router_test.go deleted file mode 100644 index 41aac5c71..000000000 --- a/pkg/gateway/internal/routex/router_test.go +++ /dev/null @@ -1,332 +0,0 @@ -// Copyright 2023-2024 Buf Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package routex - -import ( - "fmt" - "net/http" - "strings" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "google.golang.org/protobuf/reflect/protoreflect" -) - -func TestRouteTrie_Insert(t *testing.T) { - t.Parallel() - _ = initTrie(t) -} - -func TestRouteTrie_FindTarget(t *testing.T) { - t.Parallel() - testCases := []struct { - path string - expectedPath string // if blank, HttpPath is expected to NOT match - expectedVars map[string]string - }{ - { - path: "/bob/lob/law", - }, - { - path: "/foo/bar/baz", - expectedPath: "/foo/bar/{Name}", - expectedVars: map[string]string{"Name": "baz"}, - }, - { - path: "/foo/bob/lob/law", - }, - { - path: "/foo/bar/baz/buzz", - expectedPath: "/foo/bar/baz/buzz", - }, - { - path: "/foo/bar/baz/baz/buzz", - expectedPath: "/foo/bar/{Name}/baz/{child}", - expectedVars: map[string]string{"Name": "baz", "child": "buzz"}, - }, - { - path: "/foo/bar/1/baz/2/buzz/3", - expectedPath: "/foo/bar/{Name}/baz/{child.id}/buzz/{child.thing.id}", - expectedVars: map[string]string{"Name": "1", "child.id": "2", "child.thing.id": "3"}, - }, - { - path: "/foo/bar/baz/123", - }, - { - path: "/foo/bar/baz/123/buzz", - expectedPath: "/foo/bar/*/{thing.id}/{cat=**}", - expectedVars: map[string]string{"thing.id": "123", "cat": "buzz"}, - }, - { - path: "/foo/bar/baz/123/buzz/buzz", - expectedPath: "/foo/bar/*/{thing.id}/{cat=**}", - expectedVars: map[string]string{"thing.id": "123", "cat": "buzz/buzz"}, - }, - { - path: "/foo/bar/baz/123/buzz/buzz:do", - expectedPath: "/foo/bar/*/{thing.id}/{cat=**}:do", - expectedVars: map[string]string{"thing.id": "123", "cat": "buzz/buzz"}, - }, - { - path: "/foo/bar/baz/123/fizz/buzz/frob/nitz:do", - expectedPath: "/foo/bar/*/{thing.id}/{cat=**}:do", - expectedVars: map[string]string{"thing.id": "123", "cat": "fizz/buzz/frob/nitz"}, - }, - { - path: "/foo/bar/baz/123/buzz/buzz:cancel", - expectedPath: "/foo/bar/*/{thing.id}/{cat=**}:cancel", - expectedVars: map[string]string{"thing.id": "123", "cat": "buzz/buzz"}, - }, - { - path: "foo/bar/baz/123/buzz/buzz:blah", - }, - { - path: "/foo/bob/bar/baz/123/details", - expectedPath: "/foo/bob/{book_id={author}/{isbn}/*}/details", - expectedVars: map[string]string{"book_id": "bar/baz/123", "author": "bar", "isbn": "baz"}, - }, - { - path: "/foo/bob/bar/baz/123/details:do", - }, - { - path: "/foo/blah/A/B/C/foo/D/E/F/G/foo/H/I/J/K/L/M:details", - expectedPath: "/foo/blah/{longest_var={long_var.a={medium.a={short.aa}/*/{short.ab}/foo}/*}/{long_var.b={medium.b={short.ba}/*/{short.bb}/foo}/{last=**}}}:details", - expectedVars: map[string]string{ - "longest_var": "A/B/C/foo/D/E/F/G/foo/H/I/J/K/L/M", - "long_var.a": "A/B/C/foo/D", - "medium.a": "A/B/C/foo", - "short.aa": "A", - "short.ab": "C", - "long_var.b": "E/F/G/foo/H/I/J/K/L/M", - "medium.b": "E/F/G/foo", - "short.ba": "E", - "short.bb": "G", - "last": "H/I/J/K/L/M", - }, - }, - { - // No trailing slash in the HttpPath, so this should not match. - path: "/trailing:slash", - }, - { - // Trailing slash in the HttpPath, so this should match. - path: "/trailing/:slash", - expectedPath: "/trailing/**:slash", - }, - { - // Trailing Verb, should not match. - path: "/Verb:", - }, - { - // No trailing Verb, should match. - path: "/Verb", - expectedPath: "/Verb", - }, - { - // Var capture use HttpPath unescaping. - path: "/foo/bar/baz/%2f/%2A/%2f", - expectedPath: "/foo/bar/*/{thing.id}/{cat=**}", - expectedVars: map[string]string{"thing.id": "/", "cat": "*/%2F"}, - }, - } - - trie := initTrie(t) - - for _, testCase := range testCases { - testCase := testCase - t.Run(testCase.path, func(t *testing.T) { - t.Parallel() - var present, absent []string - if testCase.expectedPath != "" { - present = []string{http.MethodGet, http.MethodPost} - absent = []string{http.MethodDelete, http.MethodPut} - } else { - absent = []string{http.MethodGet, http.MethodPost, http.MethodDelete, http.MethodPut} - } - for _, method := range present { - method := method - t.Run(method, func(t *testing.T) { - t.Parallel() - target, vars, _ := trie.match(testCase.path, method) - require.NotNil(t, target) - require.Equal(t, len(testCase.expectedVars), len(vars)) - for _, varMatch := range vars { - names := make([]string, len(varMatch.Fields)) - for i, fld := range varMatch.Fields { - names[i] = string(fld.Name()) - } - name := strings.Join(names, ".") - expectedValue, ok := testCase.expectedVars[name] - assert.True(t, ok, name) - require.Equal(t, expectedValue, varMatch.Value, name) - } - }) - } - for _, method := range absent { - method := method - t.Run(method, func(t *testing.T) { - t.Parallel() - target, _, _ := trie.match(testCase.path, method) - require.Nil(t, target) - }) - } - }) - } -} - -func BenchmarkTrieMatch(b *testing.B) { - trie := initTrie(b) - path := "/foo/blah/A/B/C/foo/D/E/F/G/foo/H/I/J/K/L/M:details" - var ( - method *RouteTarget - vars []RouteTargetVarMatch - ) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - method, vars, _ = trie.match(path, http.MethodPost) - if method == nil { - b.Fatal("HttpMethod not found") - } - } - b.StopTimer() - assert.NotNil(b, method) - assert.Len(b, vars, 10) -} - -func initTrie(tb testing.TB) *RouteTrie { - tb.Helper() - var trie RouteTrie - for _, route := range []string{ - "/foo/bar/baz/buzz", - "/foo/bar/{Name}", - "/foo/bar/{Name}/baz/{child}", - "/foo/bar/{Name}/baz/{child.id}/buzz/{child.thing.id}", - "/foo/bar/*/{thing.id}/{cat=**}", - "/foo/bar/*/{thing.id}/{cat=**}:do", - "/foo/bar/*/{thing.id}/{cat=**}:cancel", - "/foo/bob/{book_id={author}/{isbn}/*}/details", - "/foo/blah/{longest_var={long_var.a={medium.a={short.aa}/*/{short.ab}/foo}/*}/{long_var.b={medium.b={short.ba}/*/{short.bb}/foo}/{last=**}}}:details", - "/foo%2Fbar/%2A/%2A%2a/{starstar=%2A%2a/**}:%2c", - "/trailing/**:slash", - "/Verb", - } { - segments, variables, err := parsePathTemplate(route) - require.NoError(tb, err) - - for _, method := range []string{http.MethodGet, http.MethodPost} { - config := &MethodConfig{ - Descriptor: &fakeMethodDescriptor{ - name: fmt.Sprintf("%s %s", method, route), - }, - } - target, err := makeTarget(config, "POST", "*", "*", segments, variables) - require.NoError(tb, err) - err = trie.insert(method, target, segments) - require.NoError(tb, err) - } - } - return &trie -} - -type fakeMethodDescriptor struct { - protoreflect.MethodDescriptor - name string - in, out protoreflect.MessageDescriptor -} - -func (f *fakeMethodDescriptor) Name() protoreflect.Name { - return protoreflect.Name(f.name) -} - -func (f *fakeMethodDescriptor) Input() protoreflect.MessageDescriptor { - if f.in == nil { - f.in = &fakeMessageDescriptor{} - } - return f.in -} - -func (f *fakeMethodDescriptor) Output() protoreflect.MessageDescriptor { - if f.out == nil { - f.out = &fakeMessageDescriptor{} - } - return f.out -} - -type fakeMessageDescriptor struct { - protoreflect.MessageDescriptor - fields protoreflect.FieldDescriptors -} - -func (f *fakeMessageDescriptor) Fields() protoreflect.FieldDescriptors { - if f.fields == nil { - f.fields = &fakeFieldDescriptors{} - } - return f.fields -} - -type fakeFieldDescriptors struct { - protoreflect.FieldDescriptors - fields map[protoreflect.Name]protoreflect.FieldDescriptor -} - -func (f *fakeFieldDescriptors) ByName(name protoreflect.Name) protoreflect.FieldDescriptor { - fld := f.fields[name] - if fld == nil { - if f.fields == nil { - f.fields = map[protoreflect.Name]protoreflect.FieldDescriptor{} - } - fld = &fakeFieldDescriptor{name: name} - f.fields[name] = fld - } - return fld -} - -type fakeFieldDescriptor struct { - name protoreflect.Name - msg protoreflect.MessageDescriptor - kind protoreflect.Kind - protoreflect.FieldDescriptor -} - -func (f *fakeFieldDescriptor) Name() protoreflect.Name { - return f.name -} - -func (f *fakeFieldDescriptor) Cardinality() protoreflect.Cardinality { - return protoreflect.Optional -} - -func (f *fakeFieldDescriptor) Kind() protoreflect.Kind { - if f.kind > 0 { - return f.kind - } - if f.msg != nil { - return protoreflect.MessageKind - } - return protoreflect.StringKind -} - -func (f *fakeFieldDescriptor) Message() protoreflect.MessageDescriptor { - if f.msg == nil { - f.msg = &fakeMessageDescriptor{} - } - return f.msg -} - -func (f *fakeFieldDescriptor) IsList() bool { - return false -} diff --git a/pkg/gateway/internal/routex/types.go b/pkg/gateway/internal/routex/types.go deleted file mode 100644 index 76643ba9c..000000000 --- a/pkg/gateway/internal/routex/types.go +++ /dev/null @@ -1,10 +0,0 @@ -package routex - -import ( - "google.golang.org/protobuf/reflect/protoreflect" -) - -type MethodConfig struct { - Descriptor protoreflect.MethodDescriptor - MethodPath string -} diff --git a/pkg/gateway/mux.go b/pkg/gateway/mux.go index 240350ee8..4a66029fc 100644 --- a/pkg/gateway/mux.go +++ b/pkg/gateway/mux.go @@ -21,7 +21,7 @@ import ( "github.com/pubgo/funk/result" "github.com/pubgo/funk/version" "github.com/pubgo/lava/lava" - "github.com/pubgo/lava/pkg/gateway/internal/routertree" + "github.com/pubgo/lava/pkg/gateway/routertree" "github.com/pubgo/lava/pkg/httputil" "github.com/samber/lo" "google.golang.org/grpc" diff --git a/pkg/gateway/routertree/lex.go b/pkg/gateway/routertree/lex.go new file mode 100644 index 000000000..25f0df9a5 --- /dev/null +++ b/pkg/gateway/routertree/lex.go @@ -0,0 +1,36 @@ +package routertree + +const ( + doubleStar = "**" + star = "*" +) + +// httpRule +// Template = "/" Segments [ Verb ] ; +// Segments = Segment { "/" Segment } ; +// Segment = "*" | "**" | LITERAL | Variable ; +// Variable = "{" FieldPath [ "=" Segments ] "}" ; +// FieldPath = IDENT { "." IDENT } ; +// Verb = ":" LITERAL ; +type httpRule struct { + Slash string `parser:"@\"/\""` + Segments *segments `parser:"@@!"` + Verb *string `parser:"(\":\" @Ident)?"` +} + +// nolint +type segments struct { + Segments []*segment `parser:"@@ (\"/\" @@)*"` +} + +// nolint +type segment struct { + Path *string `parser:"@(\"*\" \"*\" | \"*\" | Ident)"` + Variable *variable `parser:"| @@*"` +} + +// nolint +type variable struct { + Fields []string `parser:"\"{\" @Ident (\".\" @Ident)*"` + Segments *segments `parser:"(\"=\" @@)? \"}\""` +} diff --git a/pkg/gateway/internal/routertree/parser.go b/pkg/gateway/routertree/parser.go similarity index 69% rename from pkg/gateway/internal/routertree/parser.go rename to pkg/gateway/routertree/parser.go index e8688e2fd..ef2762b18 100644 --- a/pkg/gateway/internal/routertree/parser.go +++ b/pkg/gateway/routertree/parser.go @@ -1,5 +1,3 @@ -//nolint - package routertree import ( @@ -7,56 +5,22 @@ import ( "github.com/alecthomas/participle/v2" "github.com/alecthomas/participle/v2/lexer" - "github.com/pubgo/funk/assert" "github.com/pubgo/funk/errors" "github.com/pubgo/funk/generic" ) -const ( - doubleStar = "**" - star = "*" -) - var ( - parser = assert.Exit1(participle.Build[httpRule]( - participle.Lexer(assert.Exit1(lexer.NewSimple([]lexer.SimpleRule{ - {Name: "Ident", Pattern: `[a-zA-Z][\w\_\-\.]*`}, - {Name: "Punct", Pattern: `[-[!@#$%^&*()+_={}\|:;"'<,>.?/]|]`}, - }))), - )) + parser = participle.MustBuild[httpRule]( + participle.Lexer(lexer.MustSimple([]lexer.SimpleRule{ + {"Comment", `(?:#|//)[^\n]*\n?`}, + {"Ident", `[a-zA-Z]\w*`}, + {"Number", `(?:\d*\.)?\d+`}, + {"Punct", `[-[!@#$%^&*()+_={}\|:;"'<,>.?/]|]`}, + {"Whitespace", `[ \t\n\r]+`}, + })), + ) ) -// httpRule -// Template = "/" Segments [ Verb ] ; -// Segments = Segment { "/" Segment } ; -// Segment = "*" | "**" | LITERAL | Variable ; -// Variable = "{" FieldPath [ "=" Segments ] "}" ; -// FieldPath = IDENT { "." IDENT } ; -// Verb = ":" LITERAL ; -// nolint -type httpRule struct { - Slash string `@"/"` - Segments *segments `@@!` - Verb *string `(":" @Ident)?` -} - -// nolint -type segments struct { - Segments []*segment `@@ ("/" @@)*` -} - -// nolint -type segment struct { - Path *string `@("*" "*" | "*" | Ident)` - Variable *variable `| @@*` -} - -// nolint -type variable struct { - Fields []string `"{" @Ident ("." @Ident)*` - Segments *segments `("=" @@)? "}"` -} - type pathVariable struct { fields []string start, end int @@ -184,7 +148,10 @@ func parseToRoute(rule *httpRule) *routePath { } func parse(url string) (*httpRule, error) { - return parser.ParseString("", url) - //participle.AllowTrailing(true), - //participle.Trace(os.Stdout), + return parser.ParseString( + "", + url, + //participle.AllowTrailing(true), + //participle.Trace(os.Stdout), + ) } diff --git a/pkg/gateway/internal/routertree/parser_test.go b/pkg/gateway/routertree/parser_test.go similarity index 100% rename from pkg/gateway/internal/routertree/parser_test.go rename to pkg/gateway/routertree/parser_test.go diff --git a/pkg/gateway/internal/routertree/router.go b/pkg/gateway/routertree/router.go similarity index 100% rename from pkg/gateway/internal/routertree/router.go rename to pkg/gateway/routertree/router.go diff --git a/pkg/gateway/internal/routertree/router_test.go b/pkg/gateway/routertree/router_test.go similarity index 100% rename from pkg/gateway/internal/routertree/router_test.go rename to pkg/gateway/routertree/router_test.go index 8fc904423..fba32065f 100644 --- a/pkg/gateway/internal/routertree/router_test.go +++ b/pkg/gateway/routertree/router_test.go @@ -1,9 +1,9 @@ package routertree import ( - "github.com/pubgo/funk/pretty" "testing" + "github.com/pubgo/funk/pretty" "github.com/stretchr/testify/assert" ) diff --git a/pkg/gateway/stream_http.go b/pkg/gateway/stream_http.go index 229b9a98a..e30abcbbb 100644 --- a/pkg/gateway/stream_http.go +++ b/pkg/gateway/stream_http.go @@ -11,7 +11,7 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" "github.com/pubgo/funk/errors" "github.com/pubgo/funk/generic" - "github.com/pubgo/lava/pkg/gateway/internal/routertree" + "github.com/pubgo/lava/pkg/gateway/routertree" "google.golang.org/grpc" "google.golang.org/grpc/metadata" "google.golang.org/protobuf/encoding/protojson" diff --git a/pkg/gateway/util.go b/pkg/gateway/util.go index 2eebc9b69..b3e9d947b 100644 --- a/pkg/gateway/util.go +++ b/pkg/gateway/util.go @@ -11,7 +11,7 @@ import ( "github.com/pubgo/funk/assert" "github.com/pubgo/funk/errors" - "github.com/pubgo/lava/pkg/gateway/internal/routertree" + "github.com/pubgo/lava/pkg/gateway/routertree" "github.com/pubgo/lava/pkg/proto/lavapbv1" "google.golang.org/genproto/googleapis/api/annotations" "google.golang.org/grpc/metadata" From e0f6d7dd0dedd38f337145db6411a16e9f6f8e15 Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 15 May 2025 22:43:25 +0800 Subject: [PATCH 018/142] fix: barry quick fix, 2025-05-15 22:43:25 --- pkg/gateway/routertree/lex.go | 8 ++++++++ pkg/gateway/routertree/parser.go | 7 ++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/pkg/gateway/routertree/lex.go b/pkg/gateway/routertree/lex.go index 25f0df9a5..2dbf601ef 100644 --- a/pkg/gateway/routertree/lex.go +++ b/pkg/gateway/routertree/lex.go @@ -1,5 +1,9 @@ package routertree +import ( + "github.com/alecthomas/participle/v2/lexer" +) + const ( doubleStar = "**" star = "*" @@ -13,6 +17,7 @@ const ( // FieldPath = IDENT { "." IDENT } ; // Verb = ":" LITERAL ; type httpRule struct { + Pos lexer.Position Slash string `parser:"@\"/\""` Segments *segments `parser:"@@!"` Verb *string `parser:"(\":\" @Ident)?"` @@ -20,17 +25,20 @@ type httpRule struct { // nolint type segments struct { + Pos lexer.Position Segments []*segment `parser:"@@ (\"/\" @@)*"` } // nolint type segment struct { + Pos lexer.Position Path *string `parser:"@(\"*\" \"*\" | \"*\" | Ident)"` Variable *variable `parser:"| @@*"` } // nolint type variable struct { + Pos lexer.Position Fields []string `parser:"\"{\" @Ident (\".\" @Ident)*"` Segments *segments `parser:"(\"=\" @@)? \"}\""` } diff --git a/pkg/gateway/routertree/parser.go b/pkg/gateway/routertree/parser.go index ef2762b18..0d10e3116 100644 --- a/pkg/gateway/routertree/parser.go +++ b/pkg/gateway/routertree/parser.go @@ -12,11 +12,8 @@ import ( var ( parser = participle.MustBuild[httpRule]( participle.Lexer(lexer.MustSimple([]lexer.SimpleRule{ - {"Comment", `(?:#|//)[^\n]*\n?`}, - {"Ident", `[a-zA-Z]\w*`}, - {"Number", `(?:\d*\.)?\d+`}, - {"Punct", `[-[!@#$%^&*()+_={}\|:;"'<,>.?/]|]`}, - {"Whitespace", `[ \t\n\r]+`}, + {Name: "Ident", Pattern: `[a-zA-Z][\w\_\-\.]*`}, + {Name: "Punct", Pattern: `[-[!@#$%^&*()+_={}\|:;"'<,>.?/]|]`}, })), ) ) From 7dccbe541603488ba7dfdd10b906b170eb1d6058 Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 15 May 2025 23:00:28 +0800 Subject: [PATCH 019/142] fix: barry quick fix, 2025-05-15 23:00:28 --- pkg/gateway/aaa.go | 8 ++++---- .../{server_transport_stream.go => transport_stream.go} | 0 2 files changed, 4 insertions(+), 4 deletions(-) rename pkg/gateway/{server_transport_stream.go => transport_stream.go} (100%) diff --git a/pkg/gateway/aaa.go b/pkg/gateway/aaa.go index b0a44c1f4..81fe69442 100644 --- a/pkg/gateway/aaa.go +++ b/pkg/gateway/aaa.go @@ -2,11 +2,11 @@ package gateway import ( "context" - routertree2 "github.com/pubgo/lava/pkg/gateway/routertree" "io" "net/http" "github.com/gofiber/fiber/v2" + "github.com/pubgo/lava/pkg/gateway/routertree" "google.golang.org/grpc" "google.golang.org/grpc/encoding" "google.golang.org/protobuf/proto" @@ -14,9 +14,9 @@ import ( ) type ( - MatchOperation = routertree2.MatchOperation - PathFieldVar = routertree2.PathFieldVar - RouteOperation = routertree2.RouteOperation + MatchOperation = routertree.MatchOperation + PathFieldVar = routertree.PathFieldVar + RouteOperation = routertree.RouteOperation Gateway interface { grpc.ClientConnInterface SetUnaryInterceptor(interceptor grpc.UnaryServerInterceptor) diff --git a/pkg/gateway/server_transport_stream.go b/pkg/gateway/transport_stream.go similarity index 100% rename from pkg/gateway/server_transport_stream.go rename to pkg/gateway/transport_stream.go From 210d6de2975f6c87af4891e2485e4f3c364a5d11 Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 15 May 2025 23:08:55 +0800 Subject: [PATCH 020/142] fix: barry quick fix, 2025-05-15 23:08:55 --- clients/resty/client.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/clients/resty/client.go b/clients/resty/client.go index c9d5d01f9..c877253d2 100644 --- a/clients/resty/client.go +++ b/clients/resty/client.go @@ -7,8 +7,9 @@ import ( "github.com/pubgo/funk/assert" "github.com/pubgo/funk/config" + "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/errors/errcheck" "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/result" "github.com/pubgo/funk/retry" "github.com/valyala/fasthttp" @@ -45,8 +46,10 @@ func New(cfg *Config, p Params, mm ...lava.Middleware) *Client { backoff = retry.WithMaxRetries(cfg.DefaultRetryCount, backoff) } + handler := do(cfg) + handler = lava.Chain(middlewares...).Middleware(handler) return &Client{ - do: lava.Chain(middlewares...).Middleware(do(cfg)), + do: handler, log: p.Log, cfg: cfg, baseUrl: assert.Must1(url.Parse(cfg.BaseUrl)), @@ -67,7 +70,10 @@ type Client struct { } func (c *Client) Do(ctx context.Context, req *Request) (r result.Result[*fasthttp.Response]) { - defer recovery.Result(&r) + defer errcheck.RecoveryAndCheck(&r.E, func(err error) error { + errors.Debug(err) + return err + }) reqErr := doRequest(c, req) if reqErr.IsErr() { From 95579466daf1fb2152ad6e4ae65286d3bc7941fe Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 15 May 2025 23:12:44 +0800 Subject: [PATCH 021/142] fix: barry quick fix, 2025-05-15 23:12:44 --- clients/resty/request.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/clients/resty/request.go b/clients/resty/request.go index 07ab27b6f..9c71c5470 100644 --- a/clients/resty/request.go +++ b/clients/resty/request.go @@ -21,7 +21,12 @@ type RequestConfig struct { } func NewRequest(cfg *RequestConfig) *Request { - r := &Request{cfg: cfg} + r := &Request{ + cfg: cfg, + header: make(http.Header), + query: make(url.Values), + params: make(map[string]any), + } return r } From 808763adff24a6e45ccad60a832ed198e96b48a3 Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 16 May 2025 21:14:02 +0800 Subject: [PATCH 022/142] fix: barry quick fix, 2025-05-16 21:14:02 --- core/logging/logext/gologr/log.go | 104 ++++++++++++ core/logging/logext/gologr/log_test.go | 24 +++ core/tracing/tracingbuilder/config.go | 118 +++++++++++++ core/tracing/tracingbuilder/telemetry.go | 206 +++++++++++++++++++++++ core/tracing/tracingbuilder/util.go | 19 +++ 5 files changed, 471 insertions(+) create mode 100644 core/logging/logext/gologr/log.go create mode 100644 core/logging/logext/gologr/log_test.go create mode 100644 core/tracing/tracingbuilder/config.go create mode 100644 core/tracing/tracingbuilder/telemetry.go create mode 100644 core/tracing/tracingbuilder/util.go diff --git a/core/logging/logext/gologr/log.go b/core/logging/logext/gologr/log.go new file mode 100644 index 000000000..8b2a94adb --- /dev/null +++ b/core/logging/logext/gologr/log.go @@ -0,0 +1,104 @@ +package gologr + +import ( + "fmt" + "slices" + + "github.com/go-logr/logr" + "github.com/pubgo/funk/log" + "github.com/rs/zerolog" +) + +var ( + RenderArgsHook = defaultRender + RenderValuesHook = defaultRender +) + +// LogSink implements logr.LogSink and logr.CallDepthLogSink. +type LogSink struct { + l log.Logger + keysAndValues []any +} + +var ( + _ logr.LogSink = &LogSink{} + _ logr.CallDepthLogSink = &LogSink{} +) + +func NewSink(l log.Logger) *LogSink { + return &LogSink{l: l} +} + +func (ls *LogSink) Init(ri logr.RuntimeInfo) { + ls.l = ls.l.WithCallerSkip(ri.CallDepth + 2) +} + +func (ls *LogSink) Enabled(level int) bool { return true } + +func (ls *LogSink) Info(level int, msg string, keysAndValues ...interface{}) { + ls.msg(ls.l.Info(), msg, keysAndValues) +} + +func (ls *LogSink) Error(err error, msg string, keysAndValues ...interface{}) { + ls.msg(ls.l.Err(err), msg, keysAndValues) +} + +func (ls *LogSink) msg(e *zerolog.Event, msg string, keysAndValues []interface{}) { + if e == nil { + return + } + + if RenderArgsHook != nil { + keysAndValues = RenderArgsHook(keysAndValues) + } + + e = e.Fields(keysAndValues) + e.Msg(msg) +} + +func (ls *LogSink) copy() *LogSink { + return &LogSink{ + l: ls.l, + keysAndValues: slices.Clone(ls.keysAndValues), + } +} + +func (ls *LogSink) WithValues(keysAndValues ...interface{}) logr.LogSink { + if len(keysAndValues) == 0 { + return ls + } + + if RenderValuesHook != nil { + keysAndValues = RenderValuesHook(keysAndValues) + } + + ll := ls.copy() + ll.keysAndValues = append(ll.keysAndValues, keysAndValues...) + + return ll +} + +func (ls *LogSink) WithName(name string) logr.LogSink { + ll := ls.copy() + ll.l = ll.l.WithName(name) + return ll +} + +func (ls *LogSink) WithCallDepth(depth int) logr.LogSink { + ll := ls.copy() + ll.l = ll.l.WithCallerSkip(depth) + return ll +} + +func defaultRender(keysAndValues []interface{}) []interface{} { + for i, n := 1, len(keysAndValues); i < n; i += 2 { + value := keysAndValues[i] + switch v := value.(type) { + case logr.Marshaler: + keysAndValues[i] = v.MarshalLog() + case fmt.Stringer: + keysAndValues[i] = v.String() + } + } + return keysAndValues +} diff --git a/core/logging/logext/gologr/log_test.go b/core/logging/logext/gologr/log_test.go new file mode 100644 index 000000000..7366c0924 --- /dev/null +++ b/core/logging/logext/gologr/log_test.go @@ -0,0 +1,24 @@ +package gologr + +import ( + "bytes" + "encoding/json" + "testing" + + "github.com/go-logr/logr" + "github.com/pubgo/funk/log" + "github.com/stretchr/testify/assert" +) + +func TestName(t *testing.T) { + var buf bytes.Buffer + ll := logr.New(NewSink(log.Output(&buf))) + ll.Info("test", "hello", 123456) + + var data = make(map[string]any) + assert.NoError(t, json.Unmarshal(buf.Bytes(), &data)) + assert.Equal(t, data["hello"], float64(123456)) + assert.Equal(t, data["level"], "info") + assert.Equal(t, data["message"], "test") + assert.Contains(t, data["caller"], "otellogger/log_test.go") +} diff --git a/core/tracing/tracingbuilder/config.go b/core/tracing/tracingbuilder/config.go new file mode 100644 index 000000000..0ba57715a --- /dev/null +++ b/core/tracing/tracingbuilder/config.go @@ -0,0 +1,118 @@ +package tracingbuilder + +import ( + "crypto/tls" + "time" + + "github.com/pubgo/funk/version" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/sdk/metric" + "go.opentelemetry.io/otel/sdk/resource" + "google.golang.org/grpc/credentials" + "google.golang.org/protobuf/types/known/durationpb" + + sdktrace "go.opentelemetry.io/otel/sdk/trace" + //"google.golang.org/grpc/credentials" +) + +const ( + DefaultStdout = "stdout" +) + +type TraceConfigLoader struct { + TraceCfg *Config `yaml:"tracing"` +} + +type Config struct { + traceExporter *Exporter + metricExporter *Exporter + metricReportPeriod string + serviceInfo *ServiceInfo + attributes map[string]string + headers map[string]string + idGenerator sdktrace.IDGenerator + otelErrorHandler otel.ErrorHandler + traceBatchOptions []sdktrace.BatchSpanProcessorOption + sampleRatio float64 + + resourceAttributes []attribute.KeyValue + resourceDetectors []resource.Detector + + tlsConf *tls.Config + + // Tracing options + + tracingEnabled bool + textMapPropagator propagation.TextMapPropagator + tracerProvider *sdktrace.TracerProvider + traceSampler sdktrace.Sampler + prettyPrint bool + bspOptions []sdktrace.BatchSpanProcessorOption + + // Metrics options + + metricsEnabled bool + metricOptions []metric.Option +} + +type Exporter struct { + ExporterEndpoint string + Insecure bool + Creds credentials.TransportCredentials +} + +type ServiceInfo struct { + Name string + Namespace string + Version string +} + +// OTLP contains specific configuration used by the OpenTelemetry Metrics exporter. +type OTLP struct { + GRPC *OtelGRPC `description:"gRPC configuration for the OpenTelemetry collector." json:"grpc,omitempty" toml:"grpc,omitempty" yaml:"grpc,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` + HTTP *OtelHTTP `description:"HTTP configuration for the OpenTelemetry collector." json:"http,omitempty" toml:"http,omitempty" yaml:"http,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` + + AddEntryPointsLabels bool `description:"Enable metrics on entry points." json:"addEntryPointsLabels,omitempty" toml:"addEntryPointsLabels,omitempty" yaml:"addEntryPointsLabels,omitempty" export:"true"` + AddRoutersLabels bool `description:"Enable metrics on routers." json:"addRoutersLabels,omitempty" toml:"addRoutersLabels,omitempty" yaml:"addRoutersLabels,omitempty" export:"true"` + AddServicesLabels bool `description:"Enable metrics on services." json:"addServicesLabels,omitempty" toml:"addServicesLabels,omitempty" yaml:"addServicesLabels,omitempty" export:"true"` + ExplicitBoundaries []float64 `description:"Boundaries for latency metrics." json:"explicitBoundaries,omitempty" toml:"explicitBoundaries,omitempty" yaml:"explicitBoundaries,omitempty" export:"true"` + PushInterval *durationpb.Duration `description:"Period between calls to collect a checkpoint." json:"pushInterval,omitempty" toml:"pushInterval,omitempty" yaml:"pushInterval,omitempty" export:"true"` + ServiceName string `description:"OTEL service name to use." json:"serviceName,omitempty" toml:"serviceName,omitempty" yaml:"serviceName,omitempty" export:"true"` +} + +// SetDefaults sets the default values. +func (o *OTLP) SetDefaults() { + o.HTTP = &OtelHTTP{} + o.HTTP.SetDefaults() + + o.AddEntryPointsLabels = true + o.AddServicesLabels = true + o.ExplicitBoundaries = []float64{.005, .01, .025, .05, .075, .1, .25, .5, .75, 1, 2.5, 5, 7.5, 10} + o.PushInterval = durationpb.New(10 * time.Second) + o.ServiceName = version.Project() +} + +// OtelGRPC provides configuration settings for the gRPC open-telemetry. +type OtelGRPC struct { + Endpoint string `description:"Sets the gRPC endpoint (host:port) of the collector." json:"endpoint,omitempty" toml:"endpoint,omitempty" yaml:"endpoint,omitempty"` + Insecure bool `description:"Disables client transport security for the exporter." json:"insecure,omitempty" toml:"insecure,omitempty" yaml:"insecure,omitempty" export:"true"` + Headers map[string]string `description:"Headers sent with payload." json:"headers,omitempty" toml:"headers,omitempty" yaml:"headers,omitempty"` +} + +// SetDefaults sets the default values. +func (c *OtelGRPC) SetDefaults() { + c.Endpoint = "localhost:4317" +} + +// OtelHTTP provides configuration settings for the HTTP open-telemetry. +type OtelHTTP struct { + Endpoint string `description:"Sets the HTTP endpoint (scheme://host:port/path) of the collector." json:"endpoint,omitempty" toml:"endpoint,omitempty" yaml:"endpoint,omitempty"` + Headers map[string]string `description:"Headers sent with payload." json:"headers,omitempty" toml:"headers,omitempty" yaml:"headers,omitempty"` +} + +// SetDefaults sets the default values. +func (c *OtelHTTP) SetDefaults() { + c.Endpoint = "https://localhost:4318" +} diff --git a/core/tracing/tracingbuilder/telemetry.go b/core/tracing/tracingbuilder/telemetry.go new file mode 100644 index 000000000..0435b0061 --- /dev/null +++ b/core/tracing/tracingbuilder/telemetry.go @@ -0,0 +1,206 @@ +package tracingbuilder + +import ( + "context" + "errors" + "fmt" + "os" + "time" + + "github.com/goccy/go-json" + "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/log" + "github.com/pubgo/funk/version" + "github.com/pubgo/lava/core/lifecycle" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" + otelprom "go.opentelemetry.io/otel/exporters/prometheus" + "go.opentelemetry.io/otel/exporters/stdout/stdoutmetric" + "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" + otelmetric "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/sdk/metric" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" + "go.opentelemetry.io/otel/sdk/resource" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.7.0" + oteltrace "go.opentelemetry.io/otel/trace" + "google.golang.org/grpc/encoding/gzip" +) + +type Provider struct { + TracerProvider oteltrace.TracerProvider + Tracer oteltrace.Tracer + MeterProvider otelmetric.MeterProvider + Meter otelmetric.Meter +} + +type Params struct { + Cfg *Config + LC lifecycle.Lifecycle +} + +func New(params Params) Provider { + config := &Config{ + traceExporter: &Exporter{}, + metricExporter: &Exporter{}, + metricReportPeriod: "", + serviceInfo: &ServiceInfo{}, + attributes: map[string]string{}, + headers: map[string]string{}, + idGenerator: nil, + traceBatchOptions: []sdktrace.BatchSpanProcessorOption{}, + sampleRatio: 1, + } + + tracerProvider := NewTracerProvider(config) + meterProvider := NewMeterProvider(config) + propagator := propagation.NewCompositeTextMapPropagator( + propagation.TraceContext{}, + propagation.Baggage{}, + ) + + otel.SetTracerProvider(tracerProvider) + otel.SetMeterProvider(meterProvider) + otel.SetTextMapPropagator(propagator) + + params.LC.AfterStop(func(ctx context.Context) error { + return errors.Join( + tracerProvider.Shutdown(ctx), + meterProvider.Shutdown(ctx), + ) + }) + + return Provider{ + TracerProvider: tracerProvider, + Tracer: otel.Tracer( + version.Project(), + oteltrace.WithInstrumentationVersion(version.Version()), + oteltrace.WithInstrumentationAttributes(), + ), + MeterProvider: meterProvider, + Meter: otel.Meter( + version.Project(), + otelmetric.WithInstrumentationVersion(version.Version()), + otelmetric.WithInstrumentationAttributes(), + ), + } +} + +// merge config resource with default resource +func mergeResource(config *Config) *resource.Resource { + res := assert.Must1(resource.New(context.Background(), + resource.WithFromEnv(), + resource.WithTelemetrySDK(), + resource.WithOSType(), + resource.WithProcessCommandArgs(), + )) + res = assert.Must1(resource.Merge(resource.Default(), res)) + + hostname, _ := os.Hostname() + defaultResource := resource.NewWithAttributes( + semconv.SchemaURL, + semconv.ServiceNameKey.String(config.serviceInfo.Name), + semconv.HostNameKey.String(hostname), + semconv.ServiceNamespaceKey.String(config.serviceInfo.Namespace), + semconv.ServiceVersionKey.String(config.serviceInfo.Version), + semconv.ProcessPIDKey.Int(os.Getpid()), + semconv.ProcessCommandKey.String(os.Args[0]), + ) + res = assert.Must1(resource.Merge(resource.Default(), defaultResource)) + + return res +} + +func NewTracerProvider(config *Config) *sdktrace.TracerProvider { + res := mergeResource(config) + + traceExporter := assert.Must1(newGrpcTracerExporter(config)) + sampler := sdktrace.ParentBased(sdktrace.AlwaysSample()) + if config.sampleRatio < 1 && config.sampleRatio >= 0 { + sampler = sdktrace.ParentBased(sdktrace.TraceIDRatioBased(config.sampleRatio)) + log.Info().Msgf("set sample ratio %v", config.sampleRatio) + } + + traceProvider := sdktrace.NewTracerProvider( + sdktrace.WithResource(res), + sdktrace.WithSampler(sampler), + sdktrace.WithBatcher(traceExporter, + sdktrace.WithMaxQueueSize(queueSize()), + sdktrace.WithMaxExportBatchSize(queueSize()), + sdktrace.WithBatchTimeout(10*time.Second), + sdktrace.WithExportTimeout(10*time.Second), + ), + sdktrace.WithRawSpanLimits(sdktrace.SpanLimits{ + AttributeCountLimit: 1024, + EventCountLimit: 1024, + LinkCountLimit: 1024, + AttributePerEventCountLimit: 1024, + AttributePerLinkCountLimit: 1024, + AttributeValueLengthLimit: 1024, + }), + ) + + return traceProvider +} + +func newGrpcTracerExporter(config *Config) (sdktrace.SpanExporter, error) { + if config.traceExporter.ExporterEndpoint == DefaultStdout { + return stdouttrace.New(stdouttrace.WithPrettyPrint()) + } + + //opts = append(opts, otlptracegrpc.WithTLSCredentials(credentials.NewTLS(tlsConfig))) + traceSecureOption := otlptracegrpc.WithTLSCredentials(config.traceExporter.Creds) + if config.traceExporter.Insecure { + traceSecureOption = otlptracegrpc.WithInsecure() + } + + return otlptrace.New( + context.Background(), + otlptracegrpc.NewClient( + otlptracegrpc.WithEndpoint(config.traceExporter.ExporterEndpoint), + traceSecureOption, + otlptracegrpc.WithHeaders(config.headers), + otlptracegrpc.WithCompressor(gzip.Name), + ), + ) +} + +func newGrpcMetricExporter(config *Config) (metric.Exporter, error) { + if config.metricExporter.ExporterEndpoint == DefaultStdout { + encoder := json.NewEncoder(os.Stdout) + return stdoutmetric.New(stdoutmetric.WithEncoder(encoder)) + } + + if config.metricExporter.ExporterEndpoint != "" { + metricSecureOption := otlpmetricgrpc.WithTLSCredentials(config.metricExporter.Creds) + if config.metricExporter.Insecure { + metricSecureOption = otlpmetricgrpc.WithInsecure() + } + + return otlpmetricgrpc.New( + context.Background(), + otlpmetricgrpc.WithEndpoint(config.metricExporter.ExporterEndpoint), + metricSecureOption, + otlpmetricgrpc.WithHeaders(config.headers), + otlpmetricgrpc.WithCompressor(gzip.Name)) + } + return nil, fmt.Errorf("metric exporter endpoint is nil, no exporter is inited") +} + +func NewMeterProvider(config *Config) *sdkmetric.MeterProvider { + reader := metric.NewPeriodicReader(assert.Must1(newGrpcMetricExporter(config))) + readerOpt := sdkmetric.WithReader(reader) + + exporter := assert.Must1(otelprom.New()) + readerOpt = sdkmetric.WithReader(exporter) + + res := mergeResource(config) + provider := sdkmetric.NewMeterProvider( + readerOpt, + sdkmetric.WithResource(res), + ) + return provider +} diff --git a/core/tracing/tracingbuilder/util.go b/core/tracing/tracingbuilder/util.go new file mode 100644 index 000000000..0af34d492 --- /dev/null +++ b/core/tracing/tracingbuilder/util.go @@ -0,0 +1,19 @@ +package tracingbuilder + +import ( + "runtime" +) + +func queueSize() int { + const minSize = 1000 + const maxSize = 16000 + + n := (runtime.GOMAXPROCS(0) / 2) * 1000 + if n < minSize { + return minSize + } + if n > maxSize { + return maxSize + } + return n +} From 01e4d206e0745b0425ebc5884efc8a4dbde49775 Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 16 May 2025 22:43:48 +0800 Subject: [PATCH 023/142] fix: barry quick fix, 2025-05-16 22:43:48 --- go.mod | 6 +- go.sum | 10 +++ servers/tunnelserver/server.go | 113 +++++++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 servers/tunnelserver/server.go diff --git a/go.mod b/go.mod index 5640c9d50..5efac7994 100644 --- a/go.mod +++ b/go.mod @@ -51,6 +51,7 @@ require ( github.com/fasthttp/websocket v1.5.12 github.com/felixge/fgprof v0.9.5 github.com/fullstorydev/grpchan v1.1.1 + github.com/go-logr/logr v1.4.2 github.com/go-playground/validator/v10 v10.19.0 github.com/gofiber/adaptor/v2 v2.2.1 github.com/gofiber/contrib/socketio v1.1.5 @@ -60,6 +61,7 @@ require ( github.com/gorilla/websocket v1.5.1 github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 + github.com/libp2p/go-yamux/v5 v5.0.0 github.com/maragudk/gomponents v0.20.0 github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.60.1 @@ -75,9 +77,11 @@ require ( github.com/urfave/cli/v3 v3.3.3 github.com/valyala/fasthttp v1.58.0 github.com/valyala/fasttemplate v1.2.2 + github.com/xtaci/smux v1.5.34 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.26.0 go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.23.1 go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 + golang.ngrok.com/muxado/v2 v2.0.1 golang.org/x/tools v0.25.0 golang.org/x/vuln v1.1.3 google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 @@ -142,7 +146,6 @@ require ( github.com/getkin/kin-openapi v0.124.0 // indirect github.com/ghostiam/protogetter v0.3.6 // indirect github.com/go-critic/go-critic v0.11.4 // indirect - github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.20.2 // indirect github.com/go-openapi/swag v0.22.8 // indirect @@ -201,6 +204,7 @@ require ( github.com/ldez/tagliatelle v0.5.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/leonklingele/grouper v1.1.2 // indirect + github.com/libp2p/go-buffer-pool v0.0.2 // indirect github.com/lufeee/execinquery v1.2.1 // indirect github.com/macabu/inamedparam v0.1.3 // indirect github.com/magiconair/properties v1.8.7 // indirect diff --git a/go.sum b/go.sum index 1ffa17f70..a0098f557 100644 --- a/go.sum +++ b/go.sum @@ -335,6 +335,8 @@ github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKe github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= @@ -416,6 +418,10 @@ github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-yamux/v5 v5.0.0 h1:2djUh96d3Jiac/JpGkKs4TO49YhsfLopAoryfPmf+Po= +github.com/libp2p/go-yamux/v5 v5.0.0/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU= github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= github.com/macabu/inamedparam v0.1.3 h1:2tk/phHkMlEL/1GNe/Yf6kkR/hkcUdAEY3L0hjYV1Mk= @@ -690,6 +696,8 @@ github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAh github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/xen0n/gosmopolitan v1.2.2 h1:/p2KTnMzwRexIW8GlKawsTWOxn7UHA+jCMF/V8HHtvU= github.com/xen0n/gosmopolitan v1.2.2/go.mod h1:7XX7Mj61uLYrj0qmeN0zi7XDon9JRAEhYQqAPLVNTeg= +github.com/xtaci/smux v1.5.34 h1:OUA9JaDFHJDT8ZT3ebwLWPAgEfE6sWo2LaTy3anXqwg= +github.com/xtaci/smux v1.5.34/go.mod h1:OMlQbT5vcgl2gb49mFkYo6SMf+zP3rcjcwQz7ZU7IGY= github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= @@ -752,6 +760,8 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +golang.ngrok.com/muxado/v2 v2.0.1 h1:jM9i6Pom6GGmnPrHKNR6OJRrUoHFkSZlJ3/S0zqdVpY= +golang.ngrok.com/muxado/v2 v2.0.1/go.mod h1:wzxJYX4xiAtmwumzL+QsukVwFRXmPNv86vB8RPpOxyM= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= diff --git a/servers/tunnelserver/server.go b/servers/tunnelserver/server.go new file mode 100644 index 000000000..811e9cdc9 --- /dev/null +++ b/servers/tunnelserver/server.go @@ -0,0 +1,113 @@ +package tunnelserver + +import ( + "github.com/goccy/go-json" + "io" + "net" + "net/http" + "net/http/httputil" + "net/rpc/jsonrpc" + "time" + + yamux "github.com/libp2p/go-yamux/v5" + _ "github.com/xtaci/smux" + _ "golang.ngrok.com/muxado/v2" +) + +func client() { + // Get a TCP connection + conn, err := net.Dial(...) + if err != nil { + panic(err) + } + + // Setup client side of yamux + session, err := yamux.Client(conn, nil, nil) + if err != nil { + panic(err) + } + + // Open a new stream + stream, err := session.Open(nil) + if err != nil { + panic(err) + } + stream.Close() + + // Stream implements net.Conn + stream.Write([]byte("ping")) +} + +func server() { + http.DefaultServeMux.HandleFunc("", func(writer http.ResponseWriter, request *http.Request) { + httputil.NewSingleHostReverseProxy(nil).ServeHTTP(writer, request) + }) + srv := &http.Server{} + + listener, _ := net.Listen("", "") + + for { + // Accept a TCP connection + conn, err := listener.Accept() + if err != nil { + panic(err) + } + + go func() { + // Setup server side of yamux + session, err := yamux.Server(conn, nil, nil) + if err != nil { + panic(err) + } + + // Accept a stream + stream, err := session.Accept() + if err != nil { + panic(err) + } + + sss := jsonrpc.NewServerCodec(stream) + for { + sss.ReadRequestHeader() + sss.WriteResponse(nil, nil) + } + + ccc := jsonrpc.NewClientCodec(stream) + ccc.WriteRequest() + ccc.ReadResponseHeader() + + json.NewDecoder(stream).Decode() + json.NewEncoder(stream).Encode() + stream.Close() + + // Listen for a message + buf := make([]byte, 4) + stream.Read(buf) + stream.Write(buf) + }() + } + + //session.Open(nil) + // + //http.Client{ + // Transport: http.DefaultTransport, + //} + // + //_ = httpproxy.Config{} + //proxy.Dial() + //proxy.Dial() + //session.Open(nil) +} + +func init() { + _ = yamux.Config{} + // 关键参数调整 + yamuxConfig := yamux.DefaultConfig() + yamuxConfig.MaxStreamWindowSize = 1024 * 1024 * 4 // 单个流窗口 4MB + yamuxConfig.AcceptBacklog = 128 // 流接收队列长度 + yamuxConfig.EnableKeepAlive = true // 开启保活 + yamuxConfig.KeepAliveInterval = 15 * time.Second // 保活间隔 + yamuxConfig.MaxMessageSize = 16 * 1024 * 1024 // 最大消息大小 + yamuxConfig.LogOutput = io.Discard // 日志输出 + yamux.Server() +} From 852f485030642f4256e7d743debcd82813e7c83e Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 16 May 2025 22:54:16 +0800 Subject: [PATCH 024/142] fix: barry quick fix, 2025-05-16 22:54:16 --- servers/tunnelserver/server.go | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/servers/tunnelserver/server.go b/servers/tunnelserver/server.go index 811e9cdc9..4e1e15304 100644 --- a/servers/tunnelserver/server.go +++ b/servers/tunnelserver/server.go @@ -6,6 +6,7 @@ import ( "net" "net/http" "net/http/httputil" + "net/rpc" "net/rpc/jsonrpc" "time" @@ -32,7 +33,13 @@ func client() { if err != nil { panic(err) } - stream.Close() + ccc := jsonrpc.NewClientCodec(stream) + req:=&rpc.Request{} + ccc.WriteRequest(req, nil) + + rsp:=new(rpc.Response) + ccc.ReadResponseHeader(rsp) + ccc.ReadResponseBody(nil) // Stream implements net.Conn stream.Write([]byte("ping")) @@ -60,7 +67,9 @@ func server() { panic(err) } - // Accept a stream + session.GoAway() + + // client request stream, err := session.Accept() if err != nil { panic(err) @@ -68,22 +77,13 @@ func server() { sss := jsonrpc.NewServerCodec(stream) for { - sss.ReadRequestHeader() + req:=new(rpc.Request) + sss.ReadRequestHeader(req) + sss.ReadRequestBody(nil) sss.WriteResponse(nil, nil) } - ccc := jsonrpc.NewClientCodec(stream) - ccc.WriteRequest() - ccc.ReadResponseHeader() - - json.NewDecoder(stream).Decode() - json.NewEncoder(stream).Encode() stream.Close() - - // Listen for a message - buf := make([]byte, 4) - stream.Read(buf) - stream.Write(buf) }() } From 320b32e792c12907df9bb9fb6245f0508222392b Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 19 May 2025 20:47:34 +0800 Subject: [PATCH 025/142] fix: barry quick fix, 2025-05-19 20:47:34 --- servers/tunnelserver/server.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/servers/tunnelserver/server.go b/servers/tunnelserver/server.go index 4e1e15304..eae5234ad 100644 --- a/servers/tunnelserver/server.go +++ b/servers/tunnelserver/server.go @@ -68,6 +68,8 @@ func server() { } session.GoAway() + session.CloseChan() + session.CloseWithError() // client request stream, err := session.Accept() From df5489131b0bb4ccd616c11eae5f4236a0188267 Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 20 May 2025 15:11:27 +0800 Subject: [PATCH 026/142] fix: barry quick fix, 2025-05-20 15:11:27 --- core/scheduler/scheduler.go | 5 ++++- servers/grpcs/server.go | 16 ++++++---------- servers/https/server.go | 4 ++-- servers/tasks/server.go | 12 +++--------- 4 files changed, 15 insertions(+), 22 deletions(-) diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index 5fa4c70cd..1a567876f 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -49,7 +49,10 @@ func (s *Scheduler) Serve(ctx context.Context) error { func (s *Scheduler) stop() { s.cancel() - s.scheduler.Stop() + + if s.scheduler.IsStarted() { + s.scheduler.Stop() + } } func (s *Scheduler) start() { diff --git a/servers/grpcs/server.go b/servers/grpcs/server.go index 9a147fbbe..7edd6f715 100644 --- a/servers/grpcs/server.go +++ b/servers/grpcs/server.go @@ -69,17 +69,13 @@ func (s *serviceImpl) String() string { func (s *serviceImpl) Serve(ctx context.Context) (err error) { defer s.stop(ctx) - for { - select { - case <-ctx.Done(): - return nil - default: - err = s.start(ctx) - if err != nil { - return err - } - } + err = s.start(ctx) + if err != nil { + return err } + + <-ctx.Done() + return nil } func (s *serviceImpl) DixInject( diff --git a/servers/https/server.go b/servers/https/server.go index 99dcec6df..352c2ac59 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - "github.com/pubgo/lava/internal/middlewares/middleware_service_info" "net" "net/http" "strings" @@ -30,6 +29,7 @@ import ( "github.com/pubgo/lava/internal/middlewares/middleware_accesslog" "github.com/pubgo/lava/internal/middlewares/middleware_metric" "github.com/pubgo/lava/internal/middlewares/middleware_recovery" + "github.com/pubgo/lava/internal/middlewares/middleware_service_info" "github.com/pubgo/lava/lava" ) @@ -52,9 +52,9 @@ func (s *serviceImpl) String() string { } func (s *serviceImpl) Serve(ctx context.Context) error { + defer s.stop(ctx) s.start(ctx) <-ctx.Done() - s.stop(ctx) return nil } diff --git a/servers/tasks/server.go b/servers/tasks/server.go index 7af44572f..76c20eb3f 100644 --- a/servers/tasks/server.go +++ b/servers/tasks/server.go @@ -49,15 +49,9 @@ func (s *Server) String() string { func (s *Server) Serve(ctx context.Context) error { defer s.stop(ctx) - - for { - select { - case <-ctx.Done(): - return nil - default: - s.start(ctx) - } - } + s.start(ctx) + <-ctx.Done() + return nil } func (s *Server) DixInject( From 5e0226223c80c2eef794157eb18ef3538025c217 Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 20 May 2025 20:49:48 +0800 Subject: [PATCH 027/142] fix: barry quick fix, 2025-05-20 20:49:48 --- go.mod | 6 - go.sum | 14 -- servers/sses/sse.go | 250 --------------------------------- servers/tunnelserver/server.go | 115 --------------- servers/wss/_docs.go | 10 -- servers/wss/aaa.go | 23 --- servers/wss/config.go | 1 - servers/wss/factory.go | 19 --- servers/wss/option.go | 63 --------- servers/wss/server.go | 56 -------- servers/wss/wsconnection.go | 204 --------------------------- 11 files changed, 761 deletions(-) delete mode 100644 servers/sses/sse.go delete mode 100644 servers/tunnelserver/server.go delete mode 100644 servers/wss/_docs.go delete mode 100644 servers/wss/aaa.go delete mode 100644 servers/wss/config.go delete mode 100644 servers/wss/factory.go delete mode 100644 servers/wss/option.go delete mode 100644 servers/wss/server.go delete mode 100644 servers/wss/wsconnection.go diff --git a/go.mod b/go.mod index 5efac7994..18498b63f 100644 --- a/go.mod +++ b/go.mod @@ -54,14 +54,11 @@ require ( github.com/go-logr/logr v1.4.2 github.com/go-playground/validator/v10 v10.19.0 github.com/gofiber/adaptor/v2 v2.2.1 - github.com/gofiber/contrib/socketio v1.1.5 - github.com/gofiber/contrib/websocket v1.3.4 github.com/gofiber/utils v1.1.0 github.com/golangci/golangci-lint v1.61.0 github.com/gorilla/websocket v1.5.1 github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 - github.com/libp2p/go-yamux/v5 v5.0.0 github.com/maragudk/gomponents v0.20.0 github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.60.1 @@ -77,11 +74,9 @@ require ( github.com/urfave/cli/v3 v3.3.3 github.com/valyala/fasthttp v1.58.0 github.com/valyala/fasttemplate v1.2.2 - github.com/xtaci/smux v1.5.34 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.26.0 go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.23.1 go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 - golang.ngrok.com/muxado/v2 v2.0.1 golang.org/x/tools v0.25.0 golang.org/x/vuln v1.1.3 google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 @@ -204,7 +199,6 @@ require ( github.com/ldez/tagliatelle v0.5.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/leonklingele/grouper v1.1.2 // indirect - github.com/libp2p/go-buffer-pool v0.0.2 // indirect github.com/lufeee/execinquery v1.2.1 // indirect github.com/macabu/inamedparam v0.1.3 // indirect github.com/magiconair/properties v1.8.7 // indirect diff --git a/go.sum b/go.sum index a0098f557..c30a3d1bd 100644 --- a/go.sum +++ b/go.sum @@ -237,10 +237,6 @@ github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofiber/adaptor/v2 v2.2.1 h1:givE7iViQWlsTR4Jh7tB4iXzrlKBgiraB/yTdHs9Lv4= github.com/gofiber/adaptor/v2 v2.2.1/go.mod h1:AhR16dEqs25W2FY/l8gSj1b51Azg5dtPDmm+pruNOrc= -github.com/gofiber/contrib/socketio v1.1.5 h1:qcl+VBH57lHdEq5gFRRM3HNo8NQUmWQmJdI58g1mxEA= -github.com/gofiber/contrib/socketio v1.1.5/go.mod h1:r4hsdPAHbPUZVy+klFQ60KmMPGk6M4HPlzfp3eWeEhA= -github.com/gofiber/contrib/websocket v1.3.4 h1:tWeBdbJ8q0WFQXariLN4dBIbGH9KBU75s0s7YXplOSg= -github.com/gofiber/contrib/websocket v1.3.4/go.mod h1:kTFBPC6YENCnKfKx0BoOFjgXxdz7E85/STdkmZPEmPs= github.com/gofiber/fiber/v2 v2.52.6 h1:Rfp+ILPiYSvvVuIPvxrBns+HJp8qGLDnLJawAu27XVI= github.com/gofiber/fiber/v2 v2.52.6/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= github.com/gofiber/utils v1.1.0 h1:vdEBpn7AzIUJRhe+CiTOJdUcTg4Q9RK+pEa0KPbLdrM= @@ -335,8 +331,6 @@ github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKe github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= @@ -418,10 +412,6 @@ github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= -github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= -github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= -github.com/libp2p/go-yamux/v5 v5.0.0 h1:2djUh96d3Jiac/JpGkKs4TO49YhsfLopAoryfPmf+Po= -github.com/libp2p/go-yamux/v5 v5.0.0/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU= github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= github.com/macabu/inamedparam v0.1.3 h1:2tk/phHkMlEL/1GNe/Yf6kkR/hkcUdAEY3L0hjYV1Mk= @@ -696,8 +686,6 @@ github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAh github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/xen0n/gosmopolitan v1.2.2 h1:/p2KTnMzwRexIW8GlKawsTWOxn7UHA+jCMF/V8HHtvU= github.com/xen0n/gosmopolitan v1.2.2/go.mod h1:7XX7Mj61uLYrj0qmeN0zi7XDon9JRAEhYQqAPLVNTeg= -github.com/xtaci/smux v1.5.34 h1:OUA9JaDFHJDT8ZT3ebwLWPAgEfE6sWo2LaTy3anXqwg= -github.com/xtaci/smux v1.5.34/go.mod h1:OMlQbT5vcgl2gb49mFkYo6SMf+zP3rcjcwQz7ZU7IGY= github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= @@ -760,8 +748,6 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -golang.ngrok.com/muxado/v2 v2.0.1 h1:jM9i6Pom6GGmnPrHKNR6OJRrUoHFkSZlJ3/S0zqdVpY= -golang.ngrok.com/muxado/v2 v2.0.1/go.mod h1:wzxJYX4xiAtmwumzL+QsukVwFRXmPNv86vB8RPpOxyM= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= diff --git a/servers/sses/sse.go b/servers/sses/sse.go deleted file mode 100644 index 5dcb0ffab..000000000 --- a/servers/sses/sse.go +++ /dev/null @@ -1,250 +0,0 @@ -package sses - -import ( - "bufio" - "fmt" - "time" - - "github.com/gofiber/fiber/v2" -) - -// SSEEvent is a struct that represents an SSE event -type FiberSSEEvent struct { - Timestamp time.Time `json:"timestamp"` - ID string `json:"id"` - Event string `json:"event"` - Data string `json:"data"` - Retry string `json:"retry"` - OnChannel *FiberSSEChannel -} - -// # TypeDef -// -// Exec for channel events -type FiberSSEEventHandler func(ctx *fiber.Ctx, sseChannel *FiberSSEChannel) - -// # TypeDef -// -// Exec for specific events on a channel -type FiberSSEOnEventHandler func(ctx *fiber.Ctx, sseChannel *FiberSSEChannel, sseEvent *FiberSSEEvent) -type FiberSSEEvents interface { - OnConnect(handlers ...FiberSSEEventHandler) - OnDisconnect(handlers ...FiberSSEEventHandler) - OnEvent(eventName string, handlers ...FiberSSEOnEventHandler) - FireOnEventHandlers(fiberCtx *fiber.Ctx, event string) -} - -/* -A channel with a name, and a sub-base-path -*/ -type FiberSSEChannel struct { - FiberSSEEvents - Name string - Base string - Events chan *FiberSSEEvent - ParentSSEApp *FiberSSEApp - Handlers map[string]([]FiberSSEEventHandler) - EventHandlers map[string]([]FiberSSEOnEventHandler) -} -type FiberSSEHandler func(c *fiber.Ctx, w *bufio.Writer) error - -/* -The SSE Information Structure includes a list of channels and the fiber application -*/ -type FiberSSEApp struct { - IFiberSSEApp - Base string - Router *fiber.Router - Channels map[string]*FiberSSEChannel - FiberApp *fiber.App -} - -// FiberSSEApp Interface -type IFiberSSEApp interface { - ServeHTTP(ctx *fiber.Ctx) error - CreateChannel(name, base string) *FiberSSEChannel - ListChannels() map[string]*FiberSSEChannel - GetChannel(name string) *FiberSSEChannel -} - -/* -New initializes a base SSE route group at `base`. - -The base route is the base path for all channels. - -The channels parameter is a list of channels that will be created. -Each channel has a name, a base route, and a channel for sending events. - - // Create a new SSE app - app := fiber.New() - // Create a new SSE app on the fiber app - sseApp := ssefiber.New(app, "/sse") - // Add a channel to the SSE app - testChan := sseApp.CreateChannel("test", "/test") // Channel at /sse/test - // Events Channel - eventsChan := testChan.Events -*/ -func New(app *fiber.App, base string) *FiberSSEApp { - // Add the base route - fiberRouter := app.Group(base, func(c *fiber.Ctx) error { - // Set the headers for SSE - c.Set("Cache-Control", "no-cache") - c.Set("Content-Type", "text/event-stream") - c.Set("Connection", "keep-alive") - c.Set("Access-Control-Allow-Origin", "*") - return c.Next() - }) - - // Create a new SSE App - newFSSEApp := &FiberSSEApp{ - Base: base, - Router: &fiberRouter, - FiberApp: app, - Channels: make(map[string]*FiberSSEChannel), - } - return newFSSEApp -} - -/* -CreateChannel creates a new channel with the given name and base path. -Functions as a shortcut for making a new chan each time - -Example: - - app := fiber.New() - sseApp := ssefiber.New(app, "/sse") - chanOne := sseApp.CreateChannel("Channel One", "/one") - chanTwo := sseApp.CreateChannel("Channel Two", "/two") -*/ -func (app *FiberSSEApp) CreateChannel(name, base string) *FiberSSEChannel { - newChannel := &FiberSSEChannel{ - Name: name, - Base: base, - Events: make(chan *FiberSSEEvent), - ParentSSEApp: app, - Handlers: make(map[string][]FiberSSEEventHandler), - EventHandlers: make(map[string][]FiberSSEOnEventHandler), - } - app.Channels[name] = newChannel - // Add the sub-route for the channel - (*app.Router).Get(newChannel.Base, newChannel.ServeHTTP) - return newChannel -} - -// ListChannels returns a list of all the channels and prints them to the console -func (app *FiberSSEApp) ListChannels() map[string]*FiberSSEChannel { - fmt.Println("Listing Channels...") - for _, channel := range app.Channels { - channel.Print() - } - return app.Channels -} - -/* -Create an event and send it to the channel. -*/ -func (channel *FiberSSEChannel) SendEvent(event, data string) { - sseEvent := &FiberSSEEvent{ - Timestamp: time.Now(), - Event: event, - Data: data, - OnChannel: channel, - } - channel.Events <- sseEvent -} - -// Flush the event to the writer `w` - formats according to SSE standard -func (e *FiberSSEEvent) Flush(w *bufio.Writer) error { - fmt.Fprintf(w, "event: %s\ndata: %s\n\n", e.Event, e.Data) - return w.Flush() -} - -// Prints the channel information to the console -func (c *FiberSSEChannel) Print() { - fmt.Printf("==CHANNEL CREATED==\nName: %s\nRoute Endpoint: %s\n===================", c.Name, c.ParentSSEApp.Base+c.Base) -} - -// # Internal Method -// -// ServeHTTP returns a fiber.Handler for the channel. -// -// Use `sseApp.CreateChannel` to create a new channel. -func (fChan *FiberSSEChannel) ServeHTTP(c *fiber.Ctx) error { - - c.Context().SetBodyStreamWriter(func(w *bufio.Writer) { - // Fire OnConnect Event Handlers - - go fChan.FireHandlers(c, "connect") - - for { - event, more := <-fChan.Events - // fmt.Fprintf(w, "event: %s\ndata: %s\n\n", string(event.Event), string(event.Data)) - // w.Flush() - go event.FireEventHandlers(c) - if err := event.Flush(w); err != nil { - go fChan.FireHandlers(c, "disconnect") - return - } - if !more { - // Fire OnDisconnect Event Handlers - go fChan.FireHandlers(c, "disconnect") - return - } - } - }) - - return nil - -} - -// Cleanup removes all of the channels from the app. Should be used as a defer -func (sseApp *FiberSSEApp) Cleanup() { - for _, channel := range sseApp.Channels { - close(channel.Events) - } - fmt.Println("All Channels Closed - Cleanup Successful") -} - -// Fire the handlers for a given channel event (connect, disconnect) -func (channel *FiberSSEChannel) FireHandlers(fiberCtx *fiber.Ctx, event string) { - for _, handler := range channel.Handlers[event] { - handler(fiberCtx, channel) - } -} - -// Fire the handlers for this event -func (e *FiberSSEEvent) FireEventHandlers(fiberCtx *fiber.Ctx) { - channel := e.OnChannel - for _, handler := range channel.EventHandlers[e.Event] { - handler(fiberCtx, channel, e) - } -} - -// Adds the handlers to the channel for the connect method -func (channel *FiberSSEChannel) OnConnect(handlers ...FiberSSEEventHandler) { - channel.Handlers["connect"] = []FiberSSEEventHandler{} - channel.Handlers["connect"] = append(channel.Handlers["connect"], handlers...) -} - -// Adds the handlers to the channel for the disconnect method -func (channel *FiberSSEChannel) OnDisconnect(handlers ...FiberSSEEventHandler) { - channel.Handlers["disconnect"] = []FiberSSEEventHandler{} - channel.Handlers["disconnect"] = append(channel.Handlers["disconnect"], handlers...) -} - -// Add handlers for the any given event -// -// Example: -// -// channelOne.OnEvent("test", ...) // Fires anytime the event "test" is fired -func (channel *FiberSSEChannel) OnEvent(eventName string, handlers ...FiberSSEOnEventHandler) { - channel.EventHandlers[eventName] = []FiberSSEOnEventHandler{} - channel.EventHandlers[eventName] = append(channel.EventHandlers[eventName], handlers...) - -} - -// Returns a channel by name -func (app *FiberSSEApp) GetChannel(name string) *FiberSSEChannel { - findChan := app.Channels[name] - return findChan -} diff --git a/servers/tunnelserver/server.go b/servers/tunnelserver/server.go deleted file mode 100644 index eae5234ad..000000000 --- a/servers/tunnelserver/server.go +++ /dev/null @@ -1,115 +0,0 @@ -package tunnelserver - -import ( - "github.com/goccy/go-json" - "io" - "net" - "net/http" - "net/http/httputil" - "net/rpc" - "net/rpc/jsonrpc" - "time" - - yamux "github.com/libp2p/go-yamux/v5" - _ "github.com/xtaci/smux" - _ "golang.ngrok.com/muxado/v2" -) - -func client() { - // Get a TCP connection - conn, err := net.Dial(...) - if err != nil { - panic(err) - } - - // Setup client side of yamux - session, err := yamux.Client(conn, nil, nil) - if err != nil { - panic(err) - } - - // Open a new stream - stream, err := session.Open(nil) - if err != nil { - panic(err) - } - ccc := jsonrpc.NewClientCodec(stream) - req:=&rpc.Request{} - ccc.WriteRequest(req, nil) - - rsp:=new(rpc.Response) - ccc.ReadResponseHeader(rsp) - ccc.ReadResponseBody(nil) - - // Stream implements net.Conn - stream.Write([]byte("ping")) -} - -func server() { - http.DefaultServeMux.HandleFunc("", func(writer http.ResponseWriter, request *http.Request) { - httputil.NewSingleHostReverseProxy(nil).ServeHTTP(writer, request) - }) - srv := &http.Server{} - - listener, _ := net.Listen("", "") - - for { - // Accept a TCP connection - conn, err := listener.Accept() - if err != nil { - panic(err) - } - - go func() { - // Setup server side of yamux - session, err := yamux.Server(conn, nil, nil) - if err != nil { - panic(err) - } - - session.GoAway() - session.CloseChan() - session.CloseWithError() - - // client request - stream, err := session.Accept() - if err != nil { - panic(err) - } - - sss := jsonrpc.NewServerCodec(stream) - for { - req:=new(rpc.Request) - sss.ReadRequestHeader(req) - sss.ReadRequestBody(nil) - sss.WriteResponse(nil, nil) - } - - stream.Close() - }() - } - - //session.Open(nil) - // - //http.Client{ - // Transport: http.DefaultTransport, - //} - // - //_ = httpproxy.Config{} - //proxy.Dial() - //proxy.Dial() - //session.Open(nil) -} - -func init() { - _ = yamux.Config{} - // 关键参数调整 - yamuxConfig := yamux.DefaultConfig() - yamuxConfig.MaxStreamWindowSize = 1024 * 1024 * 4 // 单个流窗口 4MB - yamuxConfig.AcceptBacklog = 128 // 流接收队列长度 - yamuxConfig.EnableKeepAlive = true // 开启保活 - yamuxConfig.KeepAliveInterval = 15 * time.Second // 保活间隔 - yamuxConfig.MaxMessageSize = 16 * 1024 * 1024 // 最大消息大小 - yamuxConfig.LogOutput = io.Discard // 日志输出 - yamux.Server() -} diff --git a/servers/wss/_docs.go b/servers/wss/_docs.go deleted file mode 100644 index 01fe4a6df..000000000 --- a/servers/wss/_docs.go +++ /dev/null @@ -1,10 +0,0 @@ -package wss - -// https://github.com/gofiber/contrib/tree/main/websocket -// https://github.com/klauspost/compress -// https://github.com/andybalholm/brotli -// https://github.com/philhofer/fwd -// https://github.com/fasthttp/websocket/tree/master/_examples -// https://github.com/fasthttp/websocket/blob/master/_examples/filewatch/main.go -// https://github.com/tinylib/msgp -// https://github.com/gofiber/contrib/tree/main/socketio diff --git a/servers/wss/aaa.go b/servers/wss/aaa.go deleted file mode 100644 index ddf3048b8..000000000 --- a/servers/wss/aaa.go +++ /dev/null @@ -1,23 +0,0 @@ -package wss - -import ( - "context" - - "github.com/fasthttp/websocket" -) - -// Connection for Websocket Server 2.0 -type Connection interface { - ID() string - Node() string - AuthIdentity() string - Start(ctx context.Context, readMsgHandler func(msgType int, bytes []byte)) error - Write(msg []byte) error - Close() error -} - -// Factory for Connection. -type Factory interface { - // NewConnection for WS Server 2.0. - NewConnection(args ConstructorArgs, conn *websocket.Conn, opts ...Option) Connection -} diff --git a/servers/wss/config.go b/servers/wss/config.go deleted file mode 100644 index c4004307c..000000000 --- a/servers/wss/config.go +++ /dev/null @@ -1 +0,0 @@ -package wss diff --git a/servers/wss/factory.go b/servers/wss/factory.go deleted file mode 100644 index f6541ddc5..000000000 --- a/servers/wss/factory.go +++ /dev/null @@ -1,19 +0,0 @@ -package wss - -import "github.com/fasthttp/websocket" - -// NewFactory for WSConnection. Saves and passes appropriate option. -func NewFactory(opts ...Option) Factory { - return &factory{ - savedOptions: opts, - } -} - -type factory struct { - savedOptions []Option -} - -func (f factory) NewConnection(args ConstructorArgs, conn *websocket.Conn, opts ...Option) Connection { - combinedOptions := append(f.savedOptions, opts...) - return New(args, conn, combinedOptions...) -} diff --git a/servers/wss/option.go b/servers/wss/option.go deleted file mode 100644 index bac2b8006..000000000 --- a/servers/wss/option.go +++ /dev/null @@ -1,63 +0,0 @@ -package wss - -import ( - "time" - - "github.com/pubgo/funk/log" -) - -// configuration of WebsocketConnection. -type configuration struct { - WriteDeadline time.Duration - ReadDeadline *time.Duration - PingInterval time.Duration - MaxInactiveDuration time.Duration -} - -func defaultConfiguration() *configuration { - return &configuration{ - WriteDeadline: 3 * time.Second, - ReadDeadline: nil, - PingInterval: 30 * time.Second, - MaxInactiveDuration: 1 * time.Minute, - } -} - -func (c *configuration) ensureValidated() { - if c.MaxInactiveDuration <= 2*c.PingInterval { - log.Warn().Msgf("websocket max_inactive_duration <= 2 * ping_interval, max_inactive_duration change to 3 * ping_interval") - c.MaxInactiveDuration = 3 * c.PingInterval - } -} - -// Option is the function signature that applies configurable option for UILoadWebsocket. -type Option func(*configuration) - -// ReadDeadline for how long it should wait until reading a message. Default infinite. -func ReadDeadline(d time.Duration) Option { - return func(c *configuration) { - c.ReadDeadline = &d - } -} - -// WriteDeadline for how long it should try before giving up writing a message. Default 3s. -func WriteDeadline(d time.Duration) Option { - return func(c *configuration) { - c.WriteDeadline = d - } -} - -// MaxInactiveDuration means the max time a connection can be 'quiet' before server will deem it as inactive and dead. -// Idea is that pongs and client-based pings would suffice. Default 1m. -func MaxInactiveDuration(d time.Duration) Option { - return func(c *configuration) { - c.MaxInactiveDuration = d - } -} - -// PingInterval sets frequency to write ping messages. Default 30s. -func PingInterval(d time.Duration) Option { - return func(c *configuration) { - c.PingInterval = d - } -} diff --git a/servers/wss/server.go b/servers/wss/server.go deleted file mode 100644 index 454e74725..000000000 --- a/servers/wss/server.go +++ /dev/null @@ -1,56 +0,0 @@ -package wss - -import ( - "log" - - _ "github.com/gofiber/contrib/socketio" - "github.com/gofiber/contrib/websocket" - "github.com/gofiber/fiber/v2" -) - -func init() { - app := fiber.New() - - app.Use("/ws", func(c *fiber.Ctx) error { - // IsWebSocketUpgrade returns true if the client - // requested upgrade to the WebSocket protocol. - if websocket.IsWebSocketUpgrade(c) { - c.Locals("allowed", true) - return c.Next() - } - return fiber.ErrUpgradeRequired - }) - - app.Get("/ws/:id", websocket.New(func(c *websocket.Conn) { - // c.Locals is added to the *websocket.Conn - log.Println(c.Locals("allowed")) // true - log.Println(c.Params("id")) // 123 - log.Println(c.Query("v")) // 1.0 - log.Println(c.Cookies("session")) // "" - - // websocket.Conn bindings https://pkg.go.dev/github.com/fasthttp/websocket?tab=doc#pkg-index - var ( - mt int - msg []byte - err error - ) - - for { - if mt, msg, err = c.ReadMessage(); err != nil { - log.Println("read:", err) - break - } - - log.Printf("recv: %s", msg) - - if err = c.WriteMessage(mt, msg); err != nil { - log.Println("write:", err) - break - } - } - })) - - log.Fatal(app.Listen(":3000")) - // Access the websocket server: ws://localhost:3000/ws/123?v=1.0 - // https://www.websocket.org/echo.html -} diff --git a/servers/wss/wsconnection.go b/servers/wss/wsconnection.go deleted file mode 100644 index 58927c3f4..000000000 --- a/servers/wss/wsconnection.go +++ /dev/null @@ -1,204 +0,0 @@ -package wss - -import ( - "context" - "errors" - "net" - "strings" - "sync" - "time" - - "github.com/fasthttp/websocket" - "github.com/pubgo/funk/log" -) - -// ConstructorArgs for WebsocketConnection -type ConstructorArgs struct { - ID string - Node string - AuthIdentity string -} - -// New will return a new Websocket connection that would bridge to a message queue. For now, underlying connection is stemmed from gorilla.websocket -func New(args ConstructorArgs, conn *websocket.Conn, opts ...Option) Connection { - cfg := defaultConfiguration() - for _, applyOption := range opts { - applyOption(cfg) - } - cfg.ensureValidated() - - return &connection{ - ConstructorArgs: args, - Conn: conn, - configuration: cfg, - closeLock: sync.Mutex{}, - writeLock: sync.Mutex{}, - isClosed: false, - stopConnection: func() {}, - } -} - -type connection struct { - ConstructorArgs - *websocket.Conn - *configuration - closeLock sync.Mutex - writeLock sync.Mutex - isClosed bool - stopConnection func() - log log.Logger -} - -func (c *connection) Write(msg []byte) error { - c.writeLock.Lock() - defer c.writeLock.Unlock() - err := c.Conn.SetWriteDeadline(time.Now().Add(c.WriteDeadline)) - if err != nil { - return err - } - return c.Conn.WriteMessage(websocket.TextMessage, msg) -} - -func (c *connection) ID() string { - return c.ConstructorArgs.ID -} - -func (c *connection) Node() string { - return c.ConstructorArgs.Node -} - -func (c *connection) AuthIdentity() string { - return c.ConstructorArgs.AuthIdentity -} - -func (c *connection) Close() error { - var err error - c.closeLock.Lock() - defer func() { - if err == nil && !c.isClosed { - c.isClosed = true - } - c.closeLock.Unlock() - }() - if c.isClosed { - return nil - } - c.stopConnection() - return c.Conn.Close() -} - -func (c *connection) Start(ctx context.Context, readMsgHandler func(int, []byte)) error { - ctxWithCancel, cancel := context.WithCancel(ctx) - c.stopConnection = cancel - lastMsgCh := make(chan struct{}, 1) - go c.startMonitorForZombieConns(ctxWithCancel, lastMsgCh) - c.Conn.SetPongHandler(func(_ string) error { - c.log.Debug().Msgf("received pong for conn %v", c.ID()) - c.notifyLatestMessage(lastMsgCh) - return nil - }) - c.Conn.SetPingHandler(func(message string) error { - c.log.Debug().Msgf("received ping for conn %v", c.ID()) - c.notifyLatestMessage(lastMsgCh) - err := c.WriteControl(websocket.PongMessage, []byte(message), time.Now().Add(c.WriteDeadline)) - if errors.Is(err, websocket.ErrCloseSent) { - return nil - } - - var e net.Error - if errors.As(err, &e) && e.Timeout() { - return nil - } - return err - }) - - for { - select { - case <-ctxWithCancel.Done(): - return nil - default: - } - var readDeadline time.Time - if c.ReadDeadline != nil { - readDeadline = time.Now().Add(*c.ReadDeadline) - } - err := c.Conn.SetReadDeadline(readDeadline) - if err != nil { - return err - } - msgType, bytes, err := c.Conn.ReadMessage() - if err != nil { - if websocket.IsCloseError(err, websocket.CloseNormalClosure) { - c.log.Err(err).Msgf("failed to read msg for %v", c.ID()) - return nil - } - if websocket.IsUnexpectedCloseError(err) || isClosedConnectionReadErr(err) { - c.log.Err(err).Msgf("failed to read msg for %v", c.ID()) - return nil - } - c.log.Err(err).Msgf("failed to read msg for %v", c.ID()) - return nil - } - c.notifyLatestMessage(lastMsgCh) - readMsgHandler(msgType, bytes) - } -} - -func (c *connection) startMonitorForZombieConns(ctx context.Context, anyMsgReceived <-chan struct{}) { - inactiveCheckTicker := time.NewTicker(c.MaxInactiveDuration) - defer inactiveCheckTicker.Stop() - lastMsgReceived := time.Now() - - pingTicker := time.NewTicker(c.PingInterval) - defer pingTicker.Stop() - - for { - select { - case <-ctx.Done(): - return - case <-pingTicker.C: - timeSinceLastMsg := time.Since(lastMsgReceived) - if timeSinceLastMsg >= c.PingInterval { - err := c.writePing([]byte("")) - if err != nil { - c.log.Err(err).Msgf("failed to write ping msg for conn %v", c.ID()) - } - } else { - c.log.Debug().Msgf("conn %v has received msg before send next ping", c.ID()) - } - continue - case <-inactiveCheckTicker.C: - timeSinceLastMsg := time.Since(lastMsgReceived) - if timeSinceLastMsg > c.MaxInactiveDuration { - c.log.Warn().Msgf("killing connection %v because haven't received any msg [ping, pong, application] in %v seconds", - c.ID(), timeSinceLastMsg.Seconds()) - if err := c.Close(); err != nil { - c.log.Err(err).Msgf("failed to properly close %v", c.ID()) - } - return - } - continue - - case <-anyMsgReceived: - lastMsgReceived = time.Now() - pingTicker.Reset(c.PingInterval) - continue - } - } -} - -func (c *connection) writePing(msg []byte) error { - return c.Conn.WriteControl(websocket.PingMessage, msg, time.Now().Add(c.WriteDeadline)) -} - -func (c *connection) notifyLatestMessage(ch chan<- struct{}) { - select { - case ch <- struct{}{}: - default: - c.log.Warn().Msgf("notify latest msg channel blocked for connection %v", c.ID()) - } -} - -func isClosedConnectionReadErr(err error) bool { - return strings.Contains(err.Error(), "use of closed network connection") -} From fbdb3c364fd073e67b19e4065229f50a5d4e378b Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 20 May 2025 21:56:39 +0800 Subject: [PATCH 028/142] fix: barry quick fix, 2025-05-20 21:56:38 --- core/logging/logbuilder/builder.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/logging/logbuilder/builder.go b/core/logging/logbuilder/builder.go index 7b927d60b..2a9a6bea7 100644 --- a/core/logging/logbuilder/builder.go +++ b/core/logging/logbuilder/builder.go @@ -22,7 +22,7 @@ func init() { } // New logger -func New(cfg *logging.Config) log.Logger { +func New(cfg *logging.Config, hooks []zerolog.Hook) log.Logger { defer recovery.Exit() level := zerolog.DebugLevel @@ -41,6 +41,10 @@ func New(cfg *logging.Config) log.Logger { }) } + if len(hooks) > 0 { + logger = logger.Hook(hooks...) + } + // 全局log设置 ee := logger.With(). Str(logkey.Hostname, running.Hostname). From 14b49fa51dfd8d36d8a9bbb8b561a4c094b0cfb5 Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 29 May 2025 21:29:54 +0800 Subject: [PATCH 029/142] fix: barry quick fix, 2025-05-29 21:29:54 --- core/supervisor/supervisor.go | 1 + go.mod | 1 + go.sum | 3 +++ servers/grpcs/middleware.go | 7 +++---- servers/grpcs/util.go | 25 ------------------------- 5 files changed, 8 insertions(+), 29 deletions(-) diff --git a/core/supervisor/supervisor.go b/core/supervisor/supervisor.go index 9cbe508dd..891598006 100644 --- a/core/supervisor/supervisor.go +++ b/core/supervisor/supervisor.go @@ -3,6 +3,7 @@ package supervisor import ( "context" + _ "github.com/kardianos/service" "github.com/pubgo/funk/errors" "github.com/pubgo/funk/running" "github.com/thejerf/suture/v4" diff --git a/go.mod b/go.mod index 18498b63f..372825b8f 100644 --- a/go.mod +++ b/go.mod @@ -58,6 +58,7 @@ require ( github.com/golangci/golangci-lint v1.61.0 github.com/gorilla/websocket v1.5.1 github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 + github.com/kardianos/service v1.2.2 github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 github.com/maragudk/gomponents v0.20.0 github.com/maruel/panicparse/v2 v2.5.0 diff --git a/go.sum b/go.sum index c30a3d1bd..94b0d2db6 100644 --- a/go.sum +++ b/go.sum @@ -373,6 +373,8 @@ github.com/k0kubun/pp/v3 v3.2.0 h1:h33hNTZ9nVFNP3u2Fsgz8JXiF5JINoZfFq4SvKJwNcs= github.com/k0kubun/pp/v3 v3.2.0/go.mod h1:ODtJQbQcIRfAD3N+theGCV1m/CBxweERz2dapdz1EwA= github.com/karamaru-alpha/copyloopvar v1.1.0 h1:x7gNyKcC2vRBO1H2Mks5u1VxQtYvFiym7fCjIP8RPos= github.com/karamaru-alpha/copyloopvar v1.1.0/go.mod h1:u7CIfztblY0jZLOQZgH3oYsJzpC2A7S6u/lfgSXHy0k= +github.com/kardianos/service v1.2.2 h1:ZvePhAHfvo0A7Mftk/tEzqEZ7Q4lgnR8sGz4xu1YX60= +github.com/kardianos/service v1.2.2/go.mod h1:CIMRFEJVL+0DS1a3Nx06NaMn4Dz63Ng6O7dl0qH0zVM= github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 h1:WjT3fLi9n8YWh/Ih8Q1LHAPsTqGddPcHqscN+PJ3i68= github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19/go.mod h1:hY+WOq6m2FpbvyrI93sMaypsttvaIL5nhVR92dTMUcQ= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -832,6 +834,7 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/servers/grpcs/middleware.go b/servers/grpcs/middleware.go index 1136f425d..01050e377 100644 --- a/servers/grpcs/middleware.go +++ b/servers/grpcs/middleware.go @@ -14,16 +14,15 @@ import ( "github.com/pubgo/funk/strutil" "github.com/pubgo/funk/version" "github.com/pubgo/lava/core/lavacontexts" + "github.com/pubgo/lava/lava" + "github.com/pubgo/lava/pkg/grpcutil" + "github.com/pubgo/lava/pkg/httputil" "github.com/pubgo/lava/pkg/proto/lavapbv1" "github.com/rs/xid" "github.com/valyala/fasthttp" "google.golang.org/grpc" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" - - "github.com/pubgo/lava/lava" - "github.com/pubgo/lava/pkg/grpcutil" - "github.com/pubgo/lava/pkg/httputil" ) func handlerUnaryMiddle(middlewares map[string][]lava.Middleware) grpc.UnaryServerInterceptor { diff --git a/servers/grpcs/util.go b/servers/grpcs/util.go index 7e3a640eb..bbfea8353 100644 --- a/servers/grpcs/util.go +++ b/servers/grpcs/util.go @@ -1,12 +1,7 @@ package grpcs import ( - "net/url" "strings" - - "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" - "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" - "google.golang.org/protobuf/proto" ) // serviceFromMethod returns the service @@ -18,23 +13,3 @@ func serviceFromMethod(m string) string { return strings.Split(strings.Trim(m, "/"), "/")[0] } - -type DefaultQueryParser struct{} - -// Parse populates "values" into "msg". -// A value is ignored if its key starts with one of the elements in "filter". -func (*DefaultQueryParser) Parse(msg proto.Message, values url.Values, filter *utilities.DoubleArray) error { - for key, v := range values { - if len(v) == 0 { - delete(values, key) - continue - } - - if len(v) == 1 && v[0] == "" { - delete(values, key) - continue - } - } - - return new(runtime.DefaultQueryParser).Parse(msg, values, filter) -} From 7808f7948d52ebe5dbce399b2b36a3d547539034 Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 29 May 2025 21:35:44 +0800 Subject: [PATCH 030/142] fix: barry quick fix, 2025-05-29 21:35:44 --- cmds/lava/main.go | 5 ----- cmds/{app => lavabuilder}/cmd.go | 4 ++-- 2 files changed, 2 insertions(+), 7 deletions(-) delete mode 100644 cmds/lava/main.go rename cmds/{app => lavabuilder}/cmd.go (97%) diff --git a/cmds/lava/main.go b/cmds/lava/main.go deleted file mode 100644 index 660cd81c5..000000000 --- a/cmds/lava/main.go +++ /dev/null @@ -1,5 +0,0 @@ -package main - -func main() { - // https://github.com/beego/bee -} diff --git a/cmds/app/cmd.go b/cmds/lavabuilder/cmd.go similarity index 97% rename from cmds/app/cmd.go rename to cmds/lavabuilder/cmd.go index 6b998faf5..5ce90f054 100644 --- a/cmds/app/cmd.go +++ b/cmds/lavabuilder/cmd.go @@ -1,4 +1,4 @@ -package app +package lavabuilder import ( "os" @@ -66,7 +66,7 @@ var defaultProviders = []any{ scheduler.New, } -func NewBuilder(opts ...dix.Option) *dix.Dix { +func New(opts ...dix.Option) *dix.Dix { di := dix.New(append(opts, dix.WithValuesNull())...) for _, p := range defaultProviders { di.Provide(p) From fd093e0a2a5c0052b283c810cfd5b27bcb9d0ceb Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 29 May 2025 21:59:30 +0800 Subject: [PATCH 031/142] fix: barry quick fix, 2025-05-29 21:59:30 --- clients/resty/client.go | 4 ++-- {cmds => core}/lavabuilder/cmd.go | 0 core/logging/logbuilder/builder.go | 7 ++++-- .../middleware_accesslog/middleware.go | 24 ++++++++++++------- .../middleware.go | 2 +- servers/grpcs/inner_server.go | 4 ++-- servers/grpcs/server.go | 4 ++-- servers/https/server.go | 4 ++-- 8 files changed, 30 insertions(+), 19 deletions(-) rename {cmds => core}/lavabuilder/cmd.go (100%) rename internal/middlewares/{middleware_service_info => middleware_serviceinfo}/middleware.go (98%) diff --git a/clients/resty/client.go b/clients/resty/client.go index c877253d2..bbe51a0d8 100644 --- a/clients/resty/client.go +++ b/clients/resty/client.go @@ -18,7 +18,7 @@ import ( "github.com/pubgo/lava/internal/middlewares/middleware_accesslog" "github.com/pubgo/lava/internal/middlewares/middleware_metric" "github.com/pubgo/lava/internal/middlewares/middleware_recovery" - "github.com/pubgo/lava/internal/middlewares/middleware_service_info" + "github.com/pubgo/lava/internal/middlewares/middleware_serviceinfo" "github.com/pubgo/lava/lava" ) @@ -30,7 +30,7 @@ type Params struct { func New(cfg *Config, p Params, mm ...lava.Middleware) *Client { cfg = config.MergeR(DefaultCfg(), cfg).Unwrap() middlewares := lava.Middlewares{ - middleware_service_info.New(), + middleware_serviceinfo.New(), middleware_metric.New(p.Metric), middleware_accesslog.New(p.Log.WithFields(log.Map{"service": cfg.ServiceName})), middleware_recovery.New(), diff --git a/cmds/lavabuilder/cmd.go b/core/lavabuilder/cmd.go similarity index 100% rename from cmds/lavabuilder/cmd.go rename to core/lavabuilder/cmd.go diff --git a/core/logging/logbuilder/builder.go b/core/logging/logbuilder/builder.go index 2a9a6bea7..6fa4fdc17 100644 --- a/core/logging/logbuilder/builder.go +++ b/core/logging/logbuilder/builder.go @@ -15,6 +15,8 @@ import ( "github.com/rs/zerolog" ) +var GlobalHook zerolog.Hook + func init() { zerolog.CallerMarshalFunc = func(pc uintptr, file string, line int) string { return stack.Stack(pc).Short() @@ -41,9 +43,10 @@ func New(cfg *logging.Config, hooks []zerolog.Hook) log.Logger { }) } - if len(hooks) > 0 { - logger = logger.Hook(hooks...) + if GlobalHook != nil { + hooks = append(hooks, GlobalHook) } + logger = logger.Hook(hooks...) // 全局log设置 ee := logger.With(). diff --git a/internal/middlewares/middleware_accesslog/middleware.go b/internal/middlewares/middleware_accesslog/middleware.go index 1a989ffc3..828c368d4 100644 --- a/internal/middlewares/middleware_accesslog/middleware.go +++ b/internal/middlewares/middleware_accesslog/middleware.go @@ -67,10 +67,10 @@ func (l LogMiddleware) Middleware(next lava.HandlerFunc) lava.HandlerFunc { // 错误和panic处理 defer func() { if !generic.IsNil(gErr) { - logOpts := handleLogOption(req.Header().PeekAll("X-Log-Option")) - if logOpts["all"] { + evt.Stringer("req_header", req.Header()) + logOpts := handleLogOption(req.Header()) + if logOpts.EnableAll() { evt.Any("req_body", req.Payload()) - evt.Bytes("req_header", req.Header().Header()) if rsp != nil { evt.Any("rsp_body", rsp.Payload()) evt.Any("rsp_header", rsp.Header()) @@ -150,16 +150,24 @@ func (l LogMiddleware) Middleware(next lava.HandlerFunc) lava.HandlerFunc { } } -func handleLogOption(data [][]byte) (val map[string]bool) { +func handleLogOption(header *lava.RequestHeader) *logOption { + data := header.PeekAll("X-Log-Option") if len(data) == 0 { - val = map[string]bool{} - return + return nil } - val = make(map[string]bool, len(data)) + val := make(map[string]bool, len(data)) for i := range data { val[convert.B2S(data[i])] = true } - return val + return &logOption{data: val} +} + +type logOption struct { + data map[string]bool +} + +func (opt logOption) EnableAll() bool { + return opt.data["all"] } diff --git a/internal/middlewares/middleware_service_info/middleware.go b/internal/middlewares/middleware_serviceinfo/middleware.go similarity index 98% rename from internal/middlewares/middleware_service_info/middleware.go rename to internal/middlewares/middleware_serviceinfo/middleware.go index debfa106b..28d8e4dcf 100644 --- a/internal/middlewares/middleware_service_info/middleware.go +++ b/internal/middlewares/middleware_serviceinfo/middleware.go @@ -1,4 +1,4 @@ -package middleware_service_info +package middleware_serviceinfo import ( "context" diff --git a/servers/grpcs/inner_server.go b/servers/grpcs/inner_server.go index baa61e5a8..09c762bdf 100644 --- a/servers/grpcs/inner_server.go +++ b/servers/grpcs/inner_server.go @@ -14,7 +14,7 @@ import ( "github.com/pubgo/lava/internal/middlewares/middleware_accesslog" "github.com/pubgo/lava/internal/middlewares/middleware_metric" "github.com/pubgo/lava/internal/middlewares/middleware_recovery" - "github.com/pubgo/lava/internal/middlewares/middleware_service_info" + "github.com/pubgo/lava/internal/middlewares/middleware_serviceinfo" "github.com/pubgo/lava/lava" "github.com/pubgo/lava/pkg/gateway" "google.golang.org/grpc" @@ -26,7 +26,7 @@ import ( // NewInner grpc 服务内部通信 func NewInner(handlers []lava.GrpcRouter, grpcProxy []lava.GrpcProxy, dixMiddlewares []lava.Middleware, metric metrics.Metric, log log.Logger) *lava.InnerServer { middlewares := lava.Middlewares{ - middleware_service_info.New(), + middleware_serviceinfo.New(), middleware_metric.New(metric), middleware_accesslog.New(log), middleware_recovery.New(), diff --git a/servers/grpcs/server.go b/servers/grpcs/server.go index 7edd6f715..769b98a90 100644 --- a/servers/grpcs/server.go +++ b/servers/grpcs/server.go @@ -37,7 +37,7 @@ import ( "github.com/pubgo/lava/internal/middlewares/middleware_accesslog" "github.com/pubgo/lava/internal/middlewares/middleware_metric" "github.com/pubgo/lava/internal/middlewares/middleware_recovery" - "github.com/pubgo/lava/internal/middlewares/middleware_service_info" + "github.com/pubgo/lava/internal/middlewares/middleware_serviceinfo" "github.com/pubgo/lava/lava" "github.com/pubgo/lava/pkg/gateway" "github.com/pubgo/lava/pkg/httputil" @@ -109,7 +109,7 @@ func (s *serviceImpl) DixInject( conf.BaseUrl = "/" + strings.Trim(conf.BaseUrl, "/") globalMiddlewares := lava.Middlewares{ - middleware_service_info.New(), + middleware_serviceinfo.New(), middleware_metric.New(metric), middleware_accesslog.New(log), middleware_recovery.New(), diff --git a/servers/https/server.go b/servers/https/server.go index 352c2ac59..6c5499284 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -29,7 +29,7 @@ import ( "github.com/pubgo/lava/internal/middlewares/middleware_accesslog" "github.com/pubgo/lava/internal/middlewares/middleware_metric" "github.com/pubgo/lava/internal/middlewares/middleware_recovery" - "github.com/pubgo/lava/internal/middlewares/middleware_service_info" + "github.com/pubgo/lava/internal/middlewares/middleware_serviceinfo" "github.com/pubgo/lava/lava" ) @@ -119,7 +119,7 @@ func (s *serviceImpl) DixInject( })) defaultMiddlewares := []lava.Middleware{ - middleware_service_info.New(), + middleware_serviceinfo.New(), middleware_metric.New(m), middleware_accesslog.New(log), middleware_recovery.New(), From dcb28c887f84a701b38237985411d402ba92c9bf Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 29 May 2025 22:02:02 +0800 Subject: [PATCH 032/142] fix: barry quick fix, 2025-05-29 22:02:02 --- servers/grpcs/config.go | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/servers/grpcs/config.go b/servers/grpcs/config.go index ea6ea8a6f..4f090fe68 100644 --- a/servers/grpcs/config.go +++ b/servers/grpcs/config.go @@ -18,14 +18,9 @@ type Config struct { BaseUrl string `yaml:"base_url"` GrpcConfig *grpcbuilder.Config `yaml:"grpc_config"` EnableCors bool `yaml:"enable_cors"` - EnablePingPong bool `yaml:"enable_ping_pong"` - // unix seconds - PingPongTime int32 `yaml:"ping_pong_time"` - GrpcPort *int `yaml:"grpc_port"` - HttpPort *int `yaml:"http_port"` - - WsReadLimit *int `yaml:"ws_read_limit"` + GrpcPort *int `yaml:"grpc_port"` + HttpPort *int `yaml:"http_port"` } func defaultCfg() *Config { From 7e0a975c89ccba4577b8d7ac449de9349551ebc7 Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 29 May 2025 22:17:14 +0800 Subject: [PATCH 033/142] fix: barry quick fix, 2025-05-29 22:17:14 --- clients/grpcc/client.go | 2 +- clients/grpcc/util.go | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/clients/grpcc/client.go b/clients/grpcc/client.go index 9d505a36e..5bf46a835 100644 --- a/clients/grpcc/client.go +++ b/clients/grpcc/client.go @@ -67,7 +67,7 @@ func (t *clientImpl) Healthy(ctx context.Context) error { } _, err := grpc_health_v1.NewHealthClient(conn.Unwrap()).Check(ctx, &grpc_health_v1.HealthCheckRequest{}) - return errors.Wrapf(err, "service %s heath check failed", t.cfg.Service) + return errors.Wrapf(err, "failed to check service %s heath", t.cfg.Service) } func (t *clientImpl) NewStream(ctx context.Context, desc *grpc.StreamDesc, method string, opts ...grpc.CallOption) (grpc.ClientStream, error) { diff --git a/clients/grpcc/util.go b/clients/grpcc/util.go index 5d516bf5c..a2b1c8cf7 100644 --- a/clients/grpcc/util.go +++ b/clients/grpcc/util.go @@ -51,15 +51,14 @@ func createConn(cfg *grpccconfig.Cfg, log log.Logger, mm []lava.Middleware) (_ g } }() - opts := append( - cfg.Client.ToOpts(), - grpc.WithResolvers(cfg.Resolvers...), - grpc.WithChainUnaryInterceptor(unaryInterceptor(mm)), - grpc.WithChainStreamInterceptor(streamInterceptor(mm)), - ) + opts := cfg.Client.ToOpts() + opts = append(opts, grpc.WithResolvers(cfg.Resolvers...)) + opts = append(opts, grpc.WithChainUnaryInterceptor(unaryInterceptor(mm))) + opts = append(opts, grpc.WithChainStreamInterceptor(streamInterceptor(mm))) + conn, err := grpc.NewClient(addr, opts...) if err != nil { - return nil, errors.Wrapf(err, "grpc dial failed, target=>%s", addr) + return nil, errors.Wrapf(err, "failed to dial grpc server, target=%s", addr) } return conn, nil From 093d2b804dabf8a737c13cafb221b9e12ca57349 Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 29 May 2025 22:19:42 +0800 Subject: [PATCH 034/142] fix: barry quick fix, 2025-05-29 22:19:42 --- core/lavabuilder/{cmd.go => builder.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename core/lavabuilder/{cmd.go => builder.go} (100%) diff --git a/core/lavabuilder/cmd.go b/core/lavabuilder/builder.go similarity index 100% rename from core/lavabuilder/cmd.go rename to core/lavabuilder/builder.go From 5c28fbcab99221891a6642b0a0b4ba2c666722b4 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 7 Jun 2025 12:34:35 +0800 Subject: [PATCH 035/142] fix: barry quick fix, 2025-06-07 12:34:35 --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 372825b8f..b7373d128 100644 --- a/go.mod +++ b/go.mod @@ -63,8 +63,8 @@ require ( github.com/maragudk/gomponents v0.20.0 github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.60.1 - github.com/pubgo/dix v0.3.19 - github.com/pubgo/funk v0.5.64 + github.com/pubgo/dix v0.3.21-alpha.2 + github.com/pubgo/funk v0.5.65-alpha.4 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.5.0 github.com/rs/zerolog v1.33.0 diff --git a/go.sum b/go.sum index 94b0d2db6..09a490bf5 100644 --- a/go.sum +++ b/go.sum @@ -537,10 +537,10 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/pubgo/dix v0.3.19 h1:a4RRmljw7ePUvc9uJKqXXs6JpYL8s3VqPP2NV2vxI9U= -github.com/pubgo/dix v0.3.19/go.mod h1:J0PyuMm7mW6ZrN13l9xz0rtKbzliREFyvb7fuaGYyVw= -github.com/pubgo/funk v0.5.64 h1:viU8O9HHLppiHDwbAIV0I7msbI8TArJmwdEtLolqzx0= -github.com/pubgo/funk v0.5.64/go.mod h1:tfDZqz/x00YvqbvluiMh2s5HmZh1OIjNcv4fsdh4kSQ= +github.com/pubgo/dix v0.3.21-alpha.2 h1:cb5vNTV1IFpb02GYVELXJ3GegGp9QLzM1AtnhIw/4Bk= +github.com/pubgo/dix v0.3.21-alpha.2/go.mod h1:B+ww+GEO4THUXq/APWKMODp1QIXyZFfC7JyBgSbTIWQ= +github.com/pubgo/funk v0.5.65-alpha.4 h1:WhkIH7WMbwzuQG/KFrKuhp2wdGpihuZCnIsjyEZ6hKQ= +github.com/pubgo/funk v0.5.65-alpha.4/go.mod h1:1YPKRM0yOD4uRZNKKF4LLwmVlLmnOP1xwNVoJqATuyY= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/pubgo/protobuild v0.0.21 h1:QSwh92QxsD6Mv7kQlowzE7fxtcOm1eMWmgADsD803Js= From e9bcca3ebd85e1b8b94553d0edaca49e6547cd26 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 7 Jun 2025 12:58:25 +0800 Subject: [PATCH 036/142] fix: barry quick fix, 2025-06-07 12:58:25 --- cmds/httpservercmd/cmd.go | 2 +- core/lavabuilder/builder.go | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cmds/httpservercmd/cmd.go b/cmds/httpservercmd/cmd.go index e0a610313..043e804f4 100644 --- a/cmds/httpservercmd/cmd.go +++ b/cmds/httpservercmd/cmd.go @@ -13,7 +13,7 @@ import ( "github.com/pubgo/lava/servers/https" ) -func New(di *dix.Dix) *cli.Command { +func New(di dix.Container) *cli.Command { return &cli.Command{ Name: "http", Usage: cmdutil.UsageDesc("%s http service", version.Project()), diff --git a/core/lavabuilder/builder.go b/core/lavabuilder/builder.go index 5ce90f054..92cc6bd48 100644 --- a/core/lavabuilder/builder.go +++ b/core/lavabuilder/builder.go @@ -66,25 +66,25 @@ var defaultProviders = []any{ scheduler.New, } -func New(opts ...dix.Option) *dix.Dix { +func New(opts ...dix.Option) dix.Container { di := dix.New(append(opts, dix.WithValuesNull())...) for _, p := range defaultProviders { - di.Provide(p) + dix.Provide(di, p) } return di } -func Run(di *dix.Dix) { +func Run(di dix.Container) { defer recovery.Exit() - di.Provide(versioncmd.New) - di.Provide(healthcmd.New) - di.Provide(depcmd.New) - di.Provide(grpcservercmd.New) - di.Provide(httpservercmd.New) - di.Provide(schedulercmd.New) - - di.Inject(func(cmd []*cli.Command) { + dix.Provide(di, versioncmd.New) + dix.Provide(di, versioncmd.New) + dix.Provide(di, healthcmd.New) + dix.Provide(di, depcmd.New) + dix.Provide(di, grpcservercmd.New) + dix.Provide(di, httpservercmd.New) + dix.Provide(di, schedulercmd.New) + dix.Provide(di, func(cmd []*cli.Command) { app := &cli.Command{ Name: version.Project(), Suggest: true, From 34ec54474d584a2ae4874472ad77a8bffbd55de7 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 7 Jun 2025 14:50:27 +0800 Subject: [PATCH 037/142] fix: barry quick fix, 2025-06-07 14:50:27 --- .golangci.yaml | 17 +++++++---------- Makefile | 6 +----- clients/grpcc/client.go | 26 +++++++++++++------------- cmds/depcmd/cmd.go | 2 +- cmds/schedulercmd/cmd.go | 2 +- go.mod | 2 +- go.sum | 4 ++-- pkg/fiberbuilder/config.go | 9 ++++----- pkg/grpcbuilder/config.go | 12 +++++------- 9 files changed, 35 insertions(+), 45 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 133d78670..383de8027 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -2,28 +2,25 @@ linters: fast: true disable-all: true enable: -# - bodyclose # checks whether HTTP response body is closed successfully - - errcheck # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases - - gosimple # Linter for Go source code that specializes in simplifying a code + # - bodyclose # checks whether HTTP response body is closed successfully + # - errcheck # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases + # - gosimple # Linter for Go source code that specializes in simplifying a code - govet # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string -# - ineffassign # Detects when assignments to existing variables are not used -# - dogsled # Checks assignments with too many blank identifiers (e.g. x, , , _, := f()) -# - goconst # Finds repeated strings that could be replaced by a constant + # - ineffassign # Detects when assignments to existing variables are not used + # - dogsled # Checks assignments with too many blank identifiers (e.g. x, , , _, := f()) + # - goconst # Finds repeated strings that could be replaced by a constant - goimports # Goimports does everything that gofmt does. Additionally it checks unused imports # - goprintffuncname # Checks that printf-like functions are named with f at the end # - nolintlint # Reports ill-formed or insufficient nolint directives # - rowserrcheck # checks whether Err of rows is checked successfully - - staticcheck # Staticcheck is a go vet on steroids, applying a ton of static analysis checks +# - staticcheck # Staticcheck is a go vet on steroids, applying a ton of static analysis checks # - unconvert # Remove unnecessary type conversions # - unparam # Reports unused function parameters # - unused # Checks Go code for unused constants, variables, functions and types issues: exclude-dirs: - - internal/example - - cmds - vendor - - pkg/proto exclude-generated: strict exclude-dirs-use-default: true exclude-case-sensitive: false diff --git a/Makefile b/Makefile index 14a6e8783..601ab3a29 100644 --- a/Makefile +++ b/Makefile @@ -43,8 +43,4 @@ protobuf: .PHONY: lint lint: - golangci-lint --version - golangci-lint run --timeout 3m --verbose ./... - -install-protoc: - go install -v ./cmds/protoc-gen-lava + golangci-lint run --out-format=colored-line-number --timeout=10m --verbose ./... diff --git a/clients/grpcc/client.go b/clients/grpcc/client.go index 5bf46a835..dcf139bf9 100644 --- a/clients/grpcc/client.go +++ b/clients/grpcc/client.go @@ -5,11 +5,11 @@ import ( "fmt" "sync" + "github.com/pubgo/funk/anyhow" "github.com/pubgo/funk/config" "github.com/pubgo/funk/errors" "github.com/pubgo/funk/log" "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/result" "github.com/pubgo/funk/vars" "github.com/pubgo/lava/clients/grpcc/grpccconfig" "github.com/pubgo/lava/core/metrics" @@ -54,38 +54,38 @@ func (t *clientImpl) Invoke(ctx context.Context, method string, args, reply inte conn := t.Get() if conn.IsErr() { - return errors.Wrapf(conn.Err(), "failed to get grpc client, service=%s, method=%s", t.cfg.Service, method) + return errors.Wrapf(conn.GetErr(), "failed to get grpc client, service=%s, method=%s", t.cfg.Service, method) } - return conn.Unwrap().Invoke(ctx, method, args, reply, opts...) + return conn.GetValue().Invoke(ctx, method, args, reply, opts...) } func (t *clientImpl) Healthy(ctx context.Context) error { conn := t.Get() if conn.IsErr() { - return errors.Wrapf(conn.Err(), "failed to get grpc client, service=%s, method=healthy", t.cfg.Service) + return errors.Wrapf(conn.GetErr(), "failed to get grpc client, service=%s, method=healthy", t.cfg.Service) } - _, err := grpc_health_v1.NewHealthClient(conn.Unwrap()).Check(ctx, &grpc_health_v1.HealthCheckRequest{}) + _, err := grpc_health_v1.NewHealthClient(conn.GetValue()).Check(ctx, &grpc_health_v1.HealthCheckRequest{}) return errors.Wrapf(err, "failed to check service %s heath", t.cfg.Service) } func (t *clientImpl) NewStream(ctx context.Context, desc *grpc.StreamDesc, method string, opts ...grpc.CallOption) (grpc.ClientStream, error) { conn := t.Get() if conn.IsErr() { - return nil, errors.Wrapf(conn.Err(), "failed to get grpc client, service=%s, method=%s", t.cfg.Service, method) + return nil, errors.Wrapf(conn.GetErr(), "failed to get grpc client, service=%s, method=%s", t.cfg.Service, method) } - c, err1 := conn.Unwrap().NewStream(ctx, desc, method, opts...) + c, err1 := conn.GetValue().NewStream(ctx, desc, method, opts...) return c, errors.Wrap(err1, method) } // Get new grpc client -func (t *clientImpl) Get() (r result.Result[grpc.ClientConnInterface]) { - defer recovery.Result(&r) +func (t *clientImpl) Get() (r anyhow.Result[grpc.ClientConnInterface]) { + defer anyhow.Recovery(&r.Err) if t.conn != nil { - return r.WithVal(t.conn) + return r.SetWithValue(t.conn) } t.mu.Lock() @@ -93,14 +93,14 @@ func (t *clientImpl) Get() (r result.Result[grpc.ClientConnInterface]) { // 双检, 避免多次创建 if t.conn != nil { - return r.WithVal(t.conn) + return r.SetWithValue(t.conn) } conn, err := createConn(t.cfg, t.log, t.middlewares) if err != nil { - return r.WithErr(err) + return r.SetWithErr(err) } t.conn = conn - return r.WithVal(t.conn) + return r.SetWithValue(t.conn) } diff --git a/cmds/depcmd/cmd.go b/cmds/depcmd/cmd.go index bdc7a1557..04ef0aa19 100644 --- a/cmds/depcmd/cmd.go +++ b/cmds/depcmd/cmd.go @@ -17,7 +17,7 @@ import ( "github.com/pubgo/lava/pkg/cmdutil" ) -func New(di *dix.Dix) *cli.Command { +func New(di dix.Container) *cli.Command { return &cli.Command{ Name: "dep", Usage: "Print the dependency package information", diff --git a/cmds/schedulercmd/cmd.go b/cmds/schedulercmd/cmd.go index c1064176b..dd64c9730 100644 --- a/cmds/schedulercmd/cmd.go +++ b/cmds/schedulercmd/cmd.go @@ -14,7 +14,7 @@ import ( "github.com/pubgo/lava/servers/tasks" ) -func New(di *dix.Dix) *cli.Command { +func New(di dix.Container) *cli.Command { return &cli.Command{ Name: "scheduler", Usage: cmdutil.UsageDesc("crontab scheduler service %s(%s)", version.Project(), version.Version()), diff --git a/go.mod b/go.mod index b7373d128..33e2ab402 100644 --- a/go.mod +++ b/go.mod @@ -63,7 +63,7 @@ require ( github.com/maragudk/gomponents v0.20.0 github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.60.1 - github.com/pubgo/dix v0.3.21-alpha.2 + github.com/pubgo/dix v0.3.21-alpha.4 github.com/pubgo/funk v0.5.65-alpha.4 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.5.0 diff --git a/go.sum b/go.sum index 09a490bf5..5e8c8ae12 100644 --- a/go.sum +++ b/go.sum @@ -537,8 +537,8 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/pubgo/dix v0.3.21-alpha.2 h1:cb5vNTV1IFpb02GYVELXJ3GegGp9QLzM1AtnhIw/4Bk= -github.com/pubgo/dix v0.3.21-alpha.2/go.mod h1:B+ww+GEO4THUXq/APWKMODp1QIXyZFfC7JyBgSbTIWQ= +github.com/pubgo/dix v0.3.21-alpha.4 h1:MiZC/2f5Lg27SEIOsrmqwYS6QDKfw/S9Uwmy7wzW9QY= +github.com/pubgo/dix v0.3.21-alpha.4/go.mod h1:B+ww+GEO4THUXq/APWKMODp1QIXyZFfC7JyBgSbTIWQ= github.com/pubgo/funk v0.5.65-alpha.4 h1:WhkIH7WMbwzuQG/KFrKuhp2wdGpihuZCnIsjyEZ6hKQ= github.com/pubgo/funk v0.5.65-alpha.4/go.mod h1:1YPKRM0yOD4uRZNKKF4LLwmVlLmnOP1xwNVoJqATuyY= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= diff --git a/pkg/fiberbuilder/config.go b/pkg/fiberbuilder/config.go index 4cabe24ec..7fb02b5af 100644 --- a/pkg/fiberbuilder/config.go +++ b/pkg/fiberbuilder/config.go @@ -4,10 +4,9 @@ import ( "time" "github.com/gofiber/fiber/v2" + "github.com/pubgo/funk/anyhow" "github.com/pubgo/funk/generic" "github.com/pubgo/funk/merge" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/result" ) type Config struct { @@ -40,8 +39,8 @@ type Config struct { ReduceMemoryUsage bool `yaml:"reduce_memory_usage"` } -func (t *Config) Build() (r result.Result[*fiber.App]) { - defer recovery.Result(&r) +func (t *Config) Build() (r anyhow.Result[*fiber.App]) { + defer anyhow.Recovery(&r.Err) fc := merge.Struct(generic.Ptr(fiber.New().Config()), &t).Unwrap() - return r.WithVal(fiber.New(*fc)) + return r.SetWithValue(fiber.New(*fc)) } diff --git a/pkg/grpcbuilder/config.go b/pkg/grpcbuilder/config.go index 1dc606872..b32901429 100644 --- a/pkg/grpcbuilder/config.go +++ b/pkg/grpcbuilder/config.go @@ -3,12 +3,10 @@ package grpcbuilder import ( "time" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/result" + "github.com/pubgo/funk/anyhow" + "github.com/pubgo/lava/pkg/grpcutil" "google.golang.org/grpc" "google.golang.org/grpc/keepalive" - - "github.com/pubgo/lava/pkg/grpcutil" ) // default config: google.golang.org/grpc/internal/transport/defaults.go @@ -62,8 +60,8 @@ type Config struct { WriteBufferSize int64 `yaml:"write_buffer_size"` } -func (t *Config) Build(opts ...grpc.ServerOption) (r result.Result[*grpc.Server]) { - defer recovery.Result(&r) +func (t *Config) Build(opts ...grpc.ServerOption) (r anyhow.Result[*grpc.Server]) { + defer anyhow.Recovery(&r.Err) if t.KeepalivePolicy != nil { opts = append(opts, t.KeepalivePolicy.ToOpts()) @@ -78,7 +76,7 @@ func (t *Config) Build(opts ...grpc.ServerOption) (r result.Result[*grpc.Server] grpcutil.EnableReflection(srv) grpcutil.EnableHealth("", srv) grpcutil.EnableDebug(srv) - return r.WithVal(srv) + return r.SetWithValue(srv) } func GetDefaultCfg() *Config { From 31fbd4b4be5648d4c27880890151eb6b979f8c7d Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 7 Jun 2025 14:53:57 +0800 Subject: [PATCH 038/142] fix: barry quick fix, 2025-06-07 14:53:57 --- .golangci.yaml | 2 +- Makefile | 3 +++ cmds/grpcservercmd/cmd.go | 4 ++-- cmds/httpservercmd/cmd.go | 2 +- cmds/schedulercmd/cmd.go | 4 ++-- cmds/taskcmd/cmd.go | 4 ++-- 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 383de8027..59a12d18f 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -9,7 +9,7 @@ linters: # - ineffassign # Detects when assignments to existing variables are not used # - dogsled # Checks assignments with too many blank identifiers (e.g. x, , , _, := f()) # - goconst # Finds repeated strings that could be replaced by a constant - - goimports # Goimports does everything that gofmt does. Additionally it checks unused imports +# - goimports # Goimports does everything that gofmt does. Additionally it checks unused imports # - goprintffuncname # Checks that printf-like functions are named with f at the end # - nolintlint # Reports ill-formed or insufficient nolint directives # - rowserrcheck # checks whether Err of rows is checked successfully diff --git a/Makefile b/Makefile index 601ab3a29..a5c831b60 100644 --- a/Makefile +++ b/Makefile @@ -44,3 +44,6 @@ protobuf: .PHONY: lint lint: golangci-lint run --out-format=colored-line-number --timeout=10m --verbose ./... + +vet: + go vet ./... diff --git a/cmds/grpcservercmd/cmd.go b/cmds/grpcservercmd/cmd.go index 37bac1dd4..c7afa2278 100644 --- a/cmds/grpcservercmd/cmd.go +++ b/cmds/grpcservercmd/cmd.go @@ -13,12 +13,12 @@ import ( "github.com/pubgo/lava/servers/grpcs" ) -func New(di *dix.Dix) *cli.Command { +func New(di dix.Container) *cli.Command { return &cli.Command{ Name: "grpc", Usage: cmdutil.UsageDesc("grpc service %s(%s)", version.Project(), version.Version()), Action: func(ctx context.Context, command *cli.Command) error { - srv := dix.Inject(di, grpcs.New()) + srv := dix.InjectMust(di, grpcs.New()) return errors.WrapCaller(supervisor.Run(ctx, srv)) }, } diff --git a/cmds/httpservercmd/cmd.go b/cmds/httpservercmd/cmd.go index 043e804f4..fd2031b65 100644 --- a/cmds/httpservercmd/cmd.go +++ b/cmds/httpservercmd/cmd.go @@ -18,7 +18,7 @@ func New(di dix.Container) *cli.Command { Name: "http", Usage: cmdutil.UsageDesc("%s http service", version.Project()), Action: func(ctx context.Context, command *cli.Command) error { - srv := dix.Inject(di, https.New()) + srv := dix.InjectMust(di, https.New()) return errors.WrapCaller(supervisor.Run(ctx, srv)) }, } diff --git a/cmds/schedulercmd/cmd.go b/cmds/schedulercmd/cmd.go index dd64c9730..8f51b2091 100644 --- a/cmds/schedulercmd/cmd.go +++ b/cmds/schedulercmd/cmd.go @@ -19,11 +19,11 @@ func New(di dix.Container) *cli.Command { Name: "scheduler", Usage: cmdutil.UsageDesc("crontab scheduler service %s(%s)", version.Project(), version.Version()), Action: func(ctx context.Context, command *cli.Command) error { - s := dix.Inject(di, new(struct { + s := dix.InjectMust(di, new(struct { Scheduler *scheduler.Scheduler })) - srv := dix.Inject(di, tasks.New(s.Scheduler)) + srv := dix.InjectMust(di, tasks.New(s.Scheduler)) return errors.WrapCaller(supervisor.Run(ctx, srv)) }, } diff --git a/cmds/taskcmd/cmd.go b/cmds/taskcmd/cmd.go index 09978a27c..cee28b2b4 100644 --- a/cmds/taskcmd/cmd.go +++ b/cmds/taskcmd/cmd.go @@ -14,12 +14,12 @@ import ( "github.com/pubgo/lava/servers/tasks" ) -func New(di *dix.Dix, services []lava.Server) *cli.Command { +func New(di dix.Container, services []lava.Server) *cli.Command { return &cli.Command{ Name: "task", Usage: cmdutil.UsageDesc("async task service %s(%s)", version.Project(), version.Version()), Action: func(ctx context.Context, command *cli.Command) error { - srv := dix.Inject(di, tasks.New(services...)) + srv := dix.InjectMust(di, tasks.New(services...)) return errors.WrapCaller(supervisor.Run(ctx, srv)) }, } From 30e69c66d7a17b5155c312b593aefce3ced14261 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 7 Jun 2025 22:17:17 +0800 Subject: [PATCH 039/142] fix: barry quick fix, 2025-06-07 22:17:17 --- core/lavabuilder/builder.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/lavabuilder/builder.go b/core/lavabuilder/builder.go index 92cc6bd48..146124f47 100644 --- a/core/lavabuilder/builder.go +++ b/core/lavabuilder/builder.go @@ -84,7 +84,7 @@ func Run(di dix.Container) { dix.Provide(di, grpcservercmd.New) dix.Provide(di, httpservercmd.New) dix.Provide(di, schedulercmd.New) - dix.Provide(di, func(cmd []*cli.Command) { + dix.InjectMust(di, func(cmd []*cli.Command) { app := &cli.Command{ Name: version.Project(), Suggest: true, From 6d7cdee4a40a728c791d771d3069d08872995a2c Mon Sep 17 00:00:00 2001 From: barry Date: Sun, 8 Jun 2025 11:25:28 +0800 Subject: [PATCH 040/142] fix: barry quick fix, 2025-06-08 11:25:28 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 33e2ab402..1c8bf0b28 100644 --- a/go.mod +++ b/go.mod @@ -63,7 +63,7 @@ require ( github.com/maragudk/gomponents v0.20.0 github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.60.1 - github.com/pubgo/dix v0.3.21-alpha.4 + github.com/pubgo/dix v0.3.21-alpha.7 github.com/pubgo/funk v0.5.65-alpha.4 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.5.0 diff --git a/go.sum b/go.sum index 5e8c8ae12..9b7cbf593 100644 --- a/go.sum +++ b/go.sum @@ -537,8 +537,8 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/pubgo/dix v0.3.21-alpha.4 h1:MiZC/2f5Lg27SEIOsrmqwYS6QDKfw/S9Uwmy7wzW9QY= -github.com/pubgo/dix v0.3.21-alpha.4/go.mod h1:B+ww+GEO4THUXq/APWKMODp1QIXyZFfC7JyBgSbTIWQ= +github.com/pubgo/dix v0.3.21-alpha.7 h1:NN9be8BaA8fKU3RXFRf1oHSS80QvtAfqDTJl9HASzxA= +github.com/pubgo/dix v0.3.21-alpha.7/go.mod h1:B+ww+GEO4THUXq/APWKMODp1QIXyZFfC7JyBgSbTIWQ= github.com/pubgo/funk v0.5.65-alpha.4 h1:WhkIH7WMbwzuQG/KFrKuhp2wdGpihuZCnIsjyEZ6hKQ= github.com/pubgo/funk v0.5.65-alpha.4/go.mod h1:1YPKRM0yOD4uRZNKKF4LLwmVlLmnOP1xwNVoJqATuyY= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= From 1cdf66652248a0be8c5b1948684e70dbbbb5844f Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 9 Jun 2025 13:36:19 +0800 Subject: [PATCH 041/142] fix: barry quick fix, 2025-06-09 13:36:19 --- go.mod | 4 -- go.sum | 10 --- servers/sses/config.go | 1 + servers/tunnelserver/server.go | 115 --------------------------------- 4 files changed, 1 insertion(+), 129 deletions(-) create mode 100644 servers/sses/config.go delete mode 100644 servers/tunnelserver/server.go diff --git a/go.mod b/go.mod index 5efac7994..ebf03691e 100644 --- a/go.mod +++ b/go.mod @@ -61,7 +61,6 @@ require ( github.com/gorilla/websocket v1.5.1 github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 - github.com/libp2p/go-yamux/v5 v5.0.0 github.com/maragudk/gomponents v0.20.0 github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.60.1 @@ -77,11 +76,9 @@ require ( github.com/urfave/cli/v3 v3.3.3 github.com/valyala/fasthttp v1.58.0 github.com/valyala/fasttemplate v1.2.2 - github.com/xtaci/smux v1.5.34 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.26.0 go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.23.1 go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 - golang.ngrok.com/muxado/v2 v2.0.1 golang.org/x/tools v0.25.0 golang.org/x/vuln v1.1.3 google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 @@ -204,7 +201,6 @@ require ( github.com/ldez/tagliatelle v0.5.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/leonklingele/grouper v1.1.2 // indirect - github.com/libp2p/go-buffer-pool v0.0.2 // indirect github.com/lufeee/execinquery v1.2.1 // indirect github.com/macabu/inamedparam v0.1.3 // indirect github.com/magiconair/properties v1.8.7 // indirect diff --git a/go.sum b/go.sum index a0098f557..1ffa17f70 100644 --- a/go.sum +++ b/go.sum @@ -335,8 +335,6 @@ github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKe github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= @@ -418,10 +416,6 @@ github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= -github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= -github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= -github.com/libp2p/go-yamux/v5 v5.0.0 h1:2djUh96d3Jiac/JpGkKs4TO49YhsfLopAoryfPmf+Po= -github.com/libp2p/go-yamux/v5 v5.0.0/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU= github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= github.com/macabu/inamedparam v0.1.3 h1:2tk/phHkMlEL/1GNe/Yf6kkR/hkcUdAEY3L0hjYV1Mk= @@ -696,8 +690,6 @@ github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAh github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/xen0n/gosmopolitan v1.2.2 h1:/p2KTnMzwRexIW8GlKawsTWOxn7UHA+jCMF/V8HHtvU= github.com/xen0n/gosmopolitan v1.2.2/go.mod h1:7XX7Mj61uLYrj0qmeN0zi7XDon9JRAEhYQqAPLVNTeg= -github.com/xtaci/smux v1.5.34 h1:OUA9JaDFHJDT8ZT3ebwLWPAgEfE6sWo2LaTy3anXqwg= -github.com/xtaci/smux v1.5.34/go.mod h1:OMlQbT5vcgl2gb49mFkYo6SMf+zP3rcjcwQz7ZU7IGY= github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= @@ -760,8 +752,6 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -golang.ngrok.com/muxado/v2 v2.0.1 h1:jM9i6Pom6GGmnPrHKNR6OJRrUoHFkSZlJ3/S0zqdVpY= -golang.ngrok.com/muxado/v2 v2.0.1/go.mod h1:wzxJYX4xiAtmwumzL+QsukVwFRXmPNv86vB8RPpOxyM= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= diff --git a/servers/sses/config.go b/servers/sses/config.go new file mode 100644 index 000000000..b87fd291f --- /dev/null +++ b/servers/sses/config.go @@ -0,0 +1 @@ +package sses diff --git a/servers/tunnelserver/server.go b/servers/tunnelserver/server.go deleted file mode 100644 index eae5234ad..000000000 --- a/servers/tunnelserver/server.go +++ /dev/null @@ -1,115 +0,0 @@ -package tunnelserver - -import ( - "github.com/goccy/go-json" - "io" - "net" - "net/http" - "net/http/httputil" - "net/rpc" - "net/rpc/jsonrpc" - "time" - - yamux "github.com/libp2p/go-yamux/v5" - _ "github.com/xtaci/smux" - _ "golang.ngrok.com/muxado/v2" -) - -func client() { - // Get a TCP connection - conn, err := net.Dial(...) - if err != nil { - panic(err) - } - - // Setup client side of yamux - session, err := yamux.Client(conn, nil, nil) - if err != nil { - panic(err) - } - - // Open a new stream - stream, err := session.Open(nil) - if err != nil { - panic(err) - } - ccc := jsonrpc.NewClientCodec(stream) - req:=&rpc.Request{} - ccc.WriteRequest(req, nil) - - rsp:=new(rpc.Response) - ccc.ReadResponseHeader(rsp) - ccc.ReadResponseBody(nil) - - // Stream implements net.Conn - stream.Write([]byte("ping")) -} - -func server() { - http.DefaultServeMux.HandleFunc("", func(writer http.ResponseWriter, request *http.Request) { - httputil.NewSingleHostReverseProxy(nil).ServeHTTP(writer, request) - }) - srv := &http.Server{} - - listener, _ := net.Listen("", "") - - for { - // Accept a TCP connection - conn, err := listener.Accept() - if err != nil { - panic(err) - } - - go func() { - // Setup server side of yamux - session, err := yamux.Server(conn, nil, nil) - if err != nil { - panic(err) - } - - session.GoAway() - session.CloseChan() - session.CloseWithError() - - // client request - stream, err := session.Accept() - if err != nil { - panic(err) - } - - sss := jsonrpc.NewServerCodec(stream) - for { - req:=new(rpc.Request) - sss.ReadRequestHeader(req) - sss.ReadRequestBody(nil) - sss.WriteResponse(nil, nil) - } - - stream.Close() - }() - } - - //session.Open(nil) - // - //http.Client{ - // Transport: http.DefaultTransport, - //} - // - //_ = httpproxy.Config{} - //proxy.Dial() - //proxy.Dial() - //session.Open(nil) -} - -func init() { - _ = yamux.Config{} - // 关键参数调整 - yamuxConfig := yamux.DefaultConfig() - yamuxConfig.MaxStreamWindowSize = 1024 * 1024 * 4 // 单个流窗口 4MB - yamuxConfig.AcceptBacklog = 128 // 流接收队列长度 - yamuxConfig.EnableKeepAlive = true // 开启保活 - yamuxConfig.KeepAliveInterval = 15 * time.Second // 保活间隔 - yamuxConfig.MaxMessageSize = 16 * 1024 * 1024 // 最大消息大小 - yamuxConfig.LogOutput = io.Discard // 日志输出 - yamux.Server() -} From e660e3fd1f46d7099daaf31664e1467d1af9d8ad Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 9 Jun 2025 13:41:36 +0800 Subject: [PATCH 042/142] fix: barry quick fix, 2025-06-09 13:41:36 --- cmds/depcmd/cmd.go | 2 +- cmds/grpcservercmd/cmd.go | 4 ++-- cmds/httpservercmd/cmd.go | 4 ++-- cmds/schedulercmd/cmd.go | 6 +++--- cmds/taskcmd/cmd.go | 4 ++-- core/lavabuilder/builder.go | 6 +++--- go.mod | 4 ++-- go.sum | 8 ++++---- 8 files changed, 19 insertions(+), 19 deletions(-) diff --git a/cmds/depcmd/cmd.go b/cmds/depcmd/cmd.go index 04ef0aa19..bdc7a1557 100644 --- a/cmds/depcmd/cmd.go +++ b/cmds/depcmd/cmd.go @@ -17,7 +17,7 @@ import ( "github.com/pubgo/lava/pkg/cmdutil" ) -func New(di dix.Container) *cli.Command { +func New(di *dix.Dix) *cli.Command { return &cli.Command{ Name: "dep", Usage: "Print the dependency package information", diff --git a/cmds/grpcservercmd/cmd.go b/cmds/grpcservercmd/cmd.go index c7afa2278..37bac1dd4 100644 --- a/cmds/grpcservercmd/cmd.go +++ b/cmds/grpcservercmd/cmd.go @@ -13,12 +13,12 @@ import ( "github.com/pubgo/lava/servers/grpcs" ) -func New(di dix.Container) *cli.Command { +func New(di *dix.Dix) *cli.Command { return &cli.Command{ Name: "grpc", Usage: cmdutil.UsageDesc("grpc service %s(%s)", version.Project(), version.Version()), Action: func(ctx context.Context, command *cli.Command) error { - srv := dix.InjectMust(di, grpcs.New()) + srv := dix.Inject(di, grpcs.New()) return errors.WrapCaller(supervisor.Run(ctx, srv)) }, } diff --git a/cmds/httpservercmd/cmd.go b/cmds/httpservercmd/cmd.go index fd2031b65..e0a610313 100644 --- a/cmds/httpservercmd/cmd.go +++ b/cmds/httpservercmd/cmd.go @@ -13,12 +13,12 @@ import ( "github.com/pubgo/lava/servers/https" ) -func New(di dix.Container) *cli.Command { +func New(di *dix.Dix) *cli.Command { return &cli.Command{ Name: "http", Usage: cmdutil.UsageDesc("%s http service", version.Project()), Action: func(ctx context.Context, command *cli.Command) error { - srv := dix.InjectMust(di, https.New()) + srv := dix.Inject(di, https.New()) return errors.WrapCaller(supervisor.Run(ctx, srv)) }, } diff --git a/cmds/schedulercmd/cmd.go b/cmds/schedulercmd/cmd.go index 8f51b2091..c1064176b 100644 --- a/cmds/schedulercmd/cmd.go +++ b/cmds/schedulercmd/cmd.go @@ -14,16 +14,16 @@ import ( "github.com/pubgo/lava/servers/tasks" ) -func New(di dix.Container) *cli.Command { +func New(di *dix.Dix) *cli.Command { return &cli.Command{ Name: "scheduler", Usage: cmdutil.UsageDesc("crontab scheduler service %s(%s)", version.Project(), version.Version()), Action: func(ctx context.Context, command *cli.Command) error { - s := dix.InjectMust(di, new(struct { + s := dix.Inject(di, new(struct { Scheduler *scheduler.Scheduler })) - srv := dix.InjectMust(di, tasks.New(s.Scheduler)) + srv := dix.Inject(di, tasks.New(s.Scheduler)) return errors.WrapCaller(supervisor.Run(ctx, srv)) }, } diff --git a/cmds/taskcmd/cmd.go b/cmds/taskcmd/cmd.go index cee28b2b4..09978a27c 100644 --- a/cmds/taskcmd/cmd.go +++ b/cmds/taskcmd/cmd.go @@ -14,12 +14,12 @@ import ( "github.com/pubgo/lava/servers/tasks" ) -func New(di dix.Container, services []lava.Server) *cli.Command { +func New(di *dix.Dix, services []lava.Server) *cli.Command { return &cli.Command{ Name: "task", Usage: cmdutil.UsageDesc("async task service %s(%s)", version.Project(), version.Version()), Action: func(ctx context.Context, command *cli.Command) error { - srv := dix.InjectMust(di, tasks.New(services...)) + srv := dix.Inject(di, tasks.New(services...)) return errors.WrapCaller(supervisor.Run(ctx, srv)) }, } diff --git a/core/lavabuilder/builder.go b/core/lavabuilder/builder.go index 146124f47..4e1a1a4cd 100644 --- a/core/lavabuilder/builder.go +++ b/core/lavabuilder/builder.go @@ -66,7 +66,7 @@ var defaultProviders = []any{ scheduler.New, } -func New(opts ...dix.Option) dix.Container { +func New(opts ...dix.Option) *dix.Dix { di := dix.New(append(opts, dix.WithValuesNull())...) for _, p := range defaultProviders { dix.Provide(di, p) @@ -74,7 +74,7 @@ func New(opts ...dix.Option) dix.Container { return di } -func Run(di dix.Container) { +func Run(di *dix.Dix) { defer recovery.Exit() dix.Provide(di, versioncmd.New) @@ -84,7 +84,7 @@ func Run(di dix.Container) { dix.Provide(di, grpcservercmd.New) dix.Provide(di, httpservercmd.New) dix.Provide(di, schedulercmd.New) - dix.InjectMust(di, func(cmd []*cli.Command) { + dix.Inject(di, func(cmd []*cli.Command) { app := &cli.Command{ Name: version.Project(), Suggest: true, diff --git a/go.mod b/go.mod index 1c8bf0b28..77c7ad679 100644 --- a/go.mod +++ b/go.mod @@ -63,8 +63,8 @@ require ( github.com/maragudk/gomponents v0.20.0 github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.60.1 - github.com/pubgo/dix v0.3.21-alpha.7 - github.com/pubgo/funk v0.5.65-alpha.4 + github.com/pubgo/dix v0.3.21-alpha.8 + github.com/pubgo/funk v0.5.65-alpha.5 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.5.0 github.com/rs/zerolog v1.33.0 diff --git a/go.sum b/go.sum index 9b7cbf593..8143d08dc 100644 --- a/go.sum +++ b/go.sum @@ -537,10 +537,10 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/pubgo/dix v0.3.21-alpha.7 h1:NN9be8BaA8fKU3RXFRf1oHSS80QvtAfqDTJl9HASzxA= -github.com/pubgo/dix v0.3.21-alpha.7/go.mod h1:B+ww+GEO4THUXq/APWKMODp1QIXyZFfC7JyBgSbTIWQ= -github.com/pubgo/funk v0.5.65-alpha.4 h1:WhkIH7WMbwzuQG/KFrKuhp2wdGpihuZCnIsjyEZ6hKQ= -github.com/pubgo/funk v0.5.65-alpha.4/go.mod h1:1YPKRM0yOD4uRZNKKF4LLwmVlLmnOP1xwNVoJqATuyY= +github.com/pubgo/dix v0.3.21-alpha.8 h1:5fuYXhOeTyoqiavP5vpse9ATCGZxTi+vS+vasBwzzeQ= +github.com/pubgo/dix v0.3.21-alpha.8/go.mod h1:mhr6Z1PGCGTTbWVw8SdjsaJSRgmBVqq9YmZb29M8pAU= +github.com/pubgo/funk v0.5.65-alpha.5 h1:YPpbOJCyBzZsJs58TEySNLmyHhYu4WRt0OdgPzWT9eE= +github.com/pubgo/funk v0.5.65-alpha.5/go.mod h1:1YPKRM0yOD4uRZNKKF4LLwmVlLmnOP1xwNVoJqATuyY= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/pubgo/protobuild v0.0.21 h1:QSwh92QxsD6Mv7kQlowzE7fxtcOm1eMWmgADsD803Js= From e6ee4956eba836f3c1c2076f3bcc091ececcf1a1 Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 20 Jun 2025 23:04:06 +0800 Subject: [PATCH 043/142] fix: barry quick fix, 2025-06-20 23:04:06 --- clients/grpcc/client.go | 18 +++++++++--------- clients/grpcc/util.go | 19 ++++++++++++------- go.mod | 2 +- go.sum | 4 ++-- pkg/fiberbuilder/config.go | 8 ++++---- pkg/grpcbuilder/config.go | 8 ++++---- 6 files changed, 32 insertions(+), 27 deletions(-) diff --git a/clients/grpcc/client.go b/clients/grpcc/client.go index dcf139bf9..792d67fa6 100644 --- a/clients/grpcc/client.go +++ b/clients/grpcc/client.go @@ -5,11 +5,11 @@ import ( "fmt" "sync" - "github.com/pubgo/funk/anyhow" "github.com/pubgo/funk/config" "github.com/pubgo/funk/errors" "github.com/pubgo/funk/log" "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/result" "github.com/pubgo/funk/vars" "github.com/pubgo/lava/clients/grpcc/grpccconfig" "github.com/pubgo/lava/core/metrics" @@ -81,11 +81,11 @@ func (t *clientImpl) NewStream(ctx context.Context, desc *grpc.StreamDesc, metho } // Get new grpc client -func (t *clientImpl) Get() (r anyhow.Result[grpc.ClientConnInterface]) { - defer anyhow.Recovery(&r.Err) +func (t *clientImpl) Get() (r result.Result[grpc.ClientConnInterface]) { + defer result.RecoveryErr(&r) if t.conn != nil { - return r.SetWithValue(t.conn) + return r.WithValue(t.conn) } t.mu.Lock() @@ -93,14 +93,14 @@ func (t *clientImpl) Get() (r anyhow.Result[grpc.ClientConnInterface]) { // 双检, 避免多次创建 if t.conn != nil { - return r.SetWithValue(t.conn) + return r.WithValue(t.conn) } - conn, err := createConn(t.cfg, t.log, t.middlewares) - if err != nil { - return r.SetWithErr(err) + conn := createConn(t.cfg, t.log, t.middlewares).UnwrapErr(&r) + if r.IsErr() { + return } t.conn = conn - return r.SetWithValue(t.conn) + return r.WithValue(conn) } diff --git a/clients/grpcc/util.go b/clients/grpcc/util.go index a2b1c8cf7..31c4e2cfb 100644 --- a/clients/grpcc/util.go +++ b/clients/grpcc/util.go @@ -5,6 +5,7 @@ import ( "github.com/pubgo/funk/errors" "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/clients/grpcc/grpccconfig" "github.com/pubgo/lava/clients/grpcc/grpccresolver" "github.com/pubgo/lava/core/logging/logkey" @@ -32,7 +33,7 @@ func buildTarget(cfg *grpccconfig.ServiceCfg) string { } } -func createConn(cfg *grpccconfig.Cfg, log log.Logger, mm []lava.Middleware) (_ grpc.ClientConnInterface, gErr error) { +func createConn(cfg *grpccconfig.Cfg, log log.Logger, mm []lava.Middleware) (r result.Result[grpc.ClientConnInterface]) { addr := buildTarget(cfg.Service) var logMsg = func(e *zerolog.Event) { @@ -42,11 +43,11 @@ func createConn(cfg *grpccconfig.Cfg, log log.Logger, mm []lava.Middleware) (_ g } defer func() { - if gErr == nil { + if r.IsOK() { log.Info(). Func(logMsg).Msg("succeed to create grpc client") } else { - log.Err(gErr). + log.Err(r.GetErr()). Func(logMsg).Msg("failed to create grpc client") } }() @@ -56,10 +57,14 @@ func createConn(cfg *grpccconfig.Cfg, log log.Logger, mm []lava.Middleware) (_ g opts = append(opts, grpc.WithChainUnaryInterceptor(unaryInterceptor(mm))) opts = append(opts, grpc.WithChainStreamInterceptor(streamInterceptor(mm))) - conn, err := grpc.NewClient(addr, opts...) - if err != nil { - return nil, errors.Wrapf(err, "failed to dial grpc server, target=%s", addr) + conn := result.Wrap(grpc.NewClient(addr, opts...)). + MapErr(func(err error) error { + return errors.Wrapf(err, "failed to dial grpc server, target=%s", addr) + }). + UnwrapErr(&r) + if r.IsErr() { + return } - return conn, nil + return r.WithValue(conn) } diff --git a/go.mod b/go.mod index 1c8bf0b28..b32751178 100644 --- a/go.mod +++ b/go.mod @@ -64,7 +64,7 @@ require ( github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.60.1 github.com/pubgo/dix v0.3.21-alpha.7 - github.com/pubgo/funk v0.5.65-alpha.4 + github.com/pubgo/funk v0.5.65-alpha.18 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.5.0 github.com/rs/zerolog v1.33.0 diff --git a/go.sum b/go.sum index 9b7cbf593..7c94253d8 100644 --- a/go.sum +++ b/go.sum @@ -539,8 +539,8 @@ github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0leargg github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/pubgo/dix v0.3.21-alpha.7 h1:NN9be8BaA8fKU3RXFRf1oHSS80QvtAfqDTJl9HASzxA= github.com/pubgo/dix v0.3.21-alpha.7/go.mod h1:B+ww+GEO4THUXq/APWKMODp1QIXyZFfC7JyBgSbTIWQ= -github.com/pubgo/funk v0.5.65-alpha.4 h1:WhkIH7WMbwzuQG/KFrKuhp2wdGpihuZCnIsjyEZ6hKQ= -github.com/pubgo/funk v0.5.65-alpha.4/go.mod h1:1YPKRM0yOD4uRZNKKF4LLwmVlLmnOP1xwNVoJqATuyY= +github.com/pubgo/funk v0.5.65-alpha.18 h1:2b/1DDXCfz/sWi0DX7bYBSddegWO1zb6RL4IibH+AHc= +github.com/pubgo/funk v0.5.65-alpha.18/go.mod h1:1YPKRM0yOD4uRZNKKF4LLwmVlLmnOP1xwNVoJqATuyY= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/pubgo/protobuild v0.0.21 h1:QSwh92QxsD6Mv7kQlowzE7fxtcOm1eMWmgADsD803Js= diff --git a/pkg/fiberbuilder/config.go b/pkg/fiberbuilder/config.go index 7fb02b5af..49a51ea14 100644 --- a/pkg/fiberbuilder/config.go +++ b/pkg/fiberbuilder/config.go @@ -1,10 +1,10 @@ package fiberbuilder import ( + "github.com/pubgo/funk/v2/result" "time" "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk/anyhow" "github.com/pubgo/funk/generic" "github.com/pubgo/funk/merge" ) @@ -39,8 +39,8 @@ type Config struct { ReduceMemoryUsage bool `yaml:"reduce_memory_usage"` } -func (t *Config) Build() (r anyhow.Result[*fiber.App]) { - defer anyhow.Recovery(&r.Err) +func (t *Config) Build() (r result.Result[*fiber.App]) { + defer result.RecoveryErr(&r) fc := merge.Struct(generic.Ptr(fiber.New().Config()), &t).Unwrap() - return r.SetWithValue(fiber.New(*fc)) + return r.WithValue(fiber.New(*fc)) } diff --git a/pkg/grpcbuilder/config.go b/pkg/grpcbuilder/config.go index b32901429..18746b79b 100644 --- a/pkg/grpcbuilder/config.go +++ b/pkg/grpcbuilder/config.go @@ -3,7 +3,7 @@ package grpcbuilder import ( "time" - "github.com/pubgo/funk/anyhow" + "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/pkg/grpcutil" "google.golang.org/grpc" "google.golang.org/grpc/keepalive" @@ -60,8 +60,8 @@ type Config struct { WriteBufferSize int64 `yaml:"write_buffer_size"` } -func (t *Config) Build(opts ...grpc.ServerOption) (r anyhow.Result[*grpc.Server]) { - defer anyhow.Recovery(&r.Err) +func (t *Config) Build(opts ...grpc.ServerOption) (r result.Result[*grpc.Server]) { + defer result.RecoveryErr(&r) if t.KeepalivePolicy != nil { opts = append(opts, t.KeepalivePolicy.ToOpts()) @@ -76,7 +76,7 @@ func (t *Config) Build(opts ...grpc.ServerOption) (r anyhow.Result[*grpc.Server] grpcutil.EnableReflection(srv) grpcutil.EnableHealth("", srv) grpcutil.EnableDebug(srv) - return r.SetWithValue(srv) + return r.WithValue(srv) } func GetDefaultCfg() *Config { From b4fb51ec4ba36fba9e9f89d74866822a89f33785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BE=E9=87=8C=28barry=29?= Date: Sun, 22 Jun 2025 19:51:32 +0800 Subject: [PATCH 044/142] Fix/concurrent write conn (#61) * fix: barry quick commit, 2025-02-11 10:28:02 * fix: barry quick fix, 2025-03-18 19:20:07 * feat(grpcs): add metadata handlers for gRPC gateway * feat(grpcs): add context middleware to http server --- lava/middleware.go | 9 ++++++++- servers/grpcs/server.go | 20 ++++++++++++++++---- servers/https/server.go | 3 --- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/lava/middleware.go b/lava/middleware.go index de0c0c100..49ad462a9 100644 --- a/lava/middleware.go +++ b/lava/middleware.go @@ -1,6 +1,13 @@ package lava -import "context" +import ( + "context" + "net/http" + + "google.golang.org/grpc/metadata" +) + +type GrpcGatewayMetadata func(ctx context.Context, req *http.Request, rpcPath string, httpPattern string) metadata.MD type HandlerFunc func(ctx context.Context, req Request) (Response, error) diff --git a/servers/grpcs/server.go b/servers/grpcs/server.go index 7277fa711..e2ee16f14 100644 --- a/servers/grpcs/server.go +++ b/servers/grpcs/server.go @@ -92,6 +92,7 @@ func (s *serviceImpl) DixInject( log log.Logger, conf *Config, gw []*gateway.Mux, + metadataHandlers []lava.GrpcGatewayMetadata, ) { s.conf = conf if conf.HttpPort == nil { @@ -165,6 +166,11 @@ func (s *serviceImpl) DixInject( })) } + httpServer.Use(func(ctx *fiber.Ctx) error { + ctx.SetUserContext(ctx.Context()) + return ctx.Next() + }) + app := fiber.New() app.Group("/debug", httputil.StripPrefix(filepath.Join(conf.BaseUrl, "/debug"), debug.Handler)) @@ -239,11 +245,17 @@ func (s *serviceImpl) DixInject( return strings.ToUpper(s), true }), runtime.WithMetadata(func(ctx context.Context, request *http.Request) metadata.MD { - path, ok := runtime.HTTPPathPattern(ctx) - if !ok { - return nil + rpcPath, _ := runtime.RPCMethod(ctx) + path, _ := runtime.HTTPPathPattern(ctx) + + md := metadata.Pairs("http_path", path, "http_method", request.Method, "http_url", request.URL.Path) + for _, h := range metadataHandlers { + for k, v := range h(ctx, request, rpcPath, path) { + md.Append(k, v...) + } } - return metadata.Pairs("http_path", path, "http_method", request.Method, "http_url", request.URL.Path) + + return md }), runtime.WithErrorHandler(func(ctx context.Context, mux *runtime.ServeMux, marshal runtime.Marshaler, w http.ResponseWriter, request *http.Request, err error) { md, ok := runtime.ServerMetadataFromContext(ctx) diff --git a/servers/https/server.go b/servers/https/server.go index e9eaaeab2..5c3ee4839 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -19,7 +19,6 @@ import ( "github.com/pubgo/funk/stack" "github.com/pubgo/funk/version" "github.com/pubgo/opendoc/opendoc" - "github.com/valyala/fasthttp" "google.golang.org/grpc/codes" "github.com/pubgo/lava/core/debug" @@ -51,8 +50,6 @@ func (s *serviceImpl) Run() { defer s.stop() s.start() signal.Wait() - - fasthttp.AcquireArgs() } func (s *serviceImpl) Start() { s.start() } From 0646da99739c2abecba4c1ff4f652dbacef89f75 Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 23 Jun 2025 22:36:31 +0800 Subject: [PATCH 045/142] fix: barry quick fix, 2025-06-23 22:36:31 --- lava/router.go | 6 ++++++ servers/grpcs/server.go | 21 ++++++++++----------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lava/router.go b/lava/router.go index 152c08151..9c858a3ab 100644 --- a/lava/router.go +++ b/lava/router.go @@ -21,6 +21,12 @@ type GrpcProxy interface { Proxy() ProxyCfg } +type GrpcHttpRouter interface { + GrpcRouter + Router(router fiber.Router) + Prefix() string +} + type GrpcRouter interface { Middlewares() []Middleware ServiceDesc() *grpc.ServiceDesc diff --git a/servers/grpcs/server.go b/servers/grpcs/server.go index 769b98a90..15b6df201 100644 --- a/servers/grpcs/server.go +++ b/servers/grpcs/server.go @@ -163,18 +163,17 @@ func (s *serviceImpl) DixInject( } httpApp := fiber.New() - //app.Use(handlerHttpMiddle(globalMiddlewares)) - for _, h := range httpRouters { - //srv := doc.WithService() - //for _, an := range h.Annotation() { - // switch a := an.(type) { - // case *annotation.Openapi: - // if a.ServiceName != "" { - // srv.SetName(a.ServiceName) - // } - // } - //} + for _, h := range grpcRouters { + r, ok := h.(lava.HttpRouter) + if !ok { + continue + } + + httpRouters = append(httpRouters, r) + } + + for _, h := range httpRouters { assert.If(h.Prefix() == "", "http handler prefix required") g := httpApp.Group(h.Prefix(), handlerHttpMiddle(append(globalMiddlewares, h.Middlewares()...))) From 881da2210f6f0e0c85be6f9f5af1c6de46ba39b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BE=E9=87=8C=28barry=29?= Date: Tue, 24 Jun 2025 10:38:10 +0800 Subject: [PATCH 046/142] fix: barry quick fix, 2025-06-24 10:38:10 --- servers/grpcs/server.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/servers/grpcs/server.go b/servers/grpcs/server.go index 15b6df201..c28477e0d 100644 --- a/servers/grpcs/server.go +++ b/servers/grpcs/server.go @@ -81,6 +81,7 @@ func (s *serviceImpl) Serve(ctx context.Context) (err error) { func (s *serviceImpl) DixInject( grpcRouters []lava.GrpcRouter, httpRouters []lava.HttpRouter, + grpcHttpRouters []lava.GrpcHttpRouter, grpcProxy []lava.GrpcProxy, dixMiddlewares []lava.Middleware, getLifecycle lifecycle.Getter, @@ -173,6 +174,16 @@ func (s *serviceImpl) DixInject( httpRouters = append(httpRouters, r) } + for _, h := range grpcHttpRouters { + if r, ok := h.(lava.HttpRouter); ok { + httpRouters = append(httpRouters, r) + } + + if r, ok := h.(lava.GrpcRouter); ok { + grpcRouters = append(grpcRouters, r) + } + } + for _, h := range httpRouters { assert.If(h.Prefix() == "", "http handler prefix required") From 0885a0c8d9f93bc148e106d413c00bda2474fb33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BE=E9=87=8C=28barry=29?= Date: Thu, 26 Jun 2025 18:46:34 +0800 Subject: [PATCH 047/142] fix: barry quick fix, 2025-06-26 18:46:34 --- core/supervisor/supervisor.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/core/supervisor/supervisor.go b/core/supervisor/supervisor.go index 891598006..569f34068 100644 --- a/core/supervisor/supervisor.go +++ b/core/supervisor/supervisor.go @@ -25,5 +25,15 @@ func Run(ctx context.Context, services ...suture.Service) error { for _, service := range services { manager.Add(service) } - return errors.WrapCaller(manager.Serve(ctx)) + + err := manager.Serve(ctx) + if err == nil { + return nil + } + + if errors.Is(err, context.Canceled) { + return nil + } + + return errors.WrapCaller(err) } From b42a4d364d157c737cbe893fe2f2b34e4ba5b6e2 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 5 Jul 2025 17:28:58 +0800 Subject: [PATCH 048/142] fix: barry quick fix, 2025-07-05 17:28:58 --- proto/lava/service.proto | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/proto/lava/service.proto b/proto/lava/service.proto index 93c38be62..b9d5510fe 100644 --- a/proto/lava/service.proto +++ b/proto/lava/service.proto @@ -2,6 +2,9 @@ syntax = "proto3"; package lava.v1; +import "google/protobuf/struct.proto"; +import "google/protobuf/wrappers.proto"; + option go_package = "github.com/pubgo/lava/pkg/proto/lavapbv1;lavapbv1"; message ServiceInfo { @@ -11,3 +14,9 @@ message ServiceInfo { string hostname = 4; string ip = 5; } + +message HttpResponse { + string body = 1; + int32 status_code = 2; + map headers = 3; +} From 7b8e1c292a643e41f0a710488823877c5c0d948c Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 5 Jul 2025 19:42:20 +0800 Subject: [PATCH 049/142] fix: barry quick fix, 2025-07-05 19:42:20 --- Makefile | 2 +- core/debug/{_docs.go => _.go} | 4 ++++ core/debug/mux.go | 1 - core/debug/zpags/debug.go | 11 +++++++++++ go.mod | 15 +++++++-------- go.sum | 30 ++++++++++++++++-------------- 6 files changed, 39 insertions(+), 24 deletions(-) rename core/debug/{_docs.go => _.go} (56%) create mode 100644 core/debug/zpags/debug.go diff --git a/Makefile b/Makefile index a5c831b60..4045331e4 100644 --- a/Makefile +++ b/Makefile @@ -43,7 +43,7 @@ protobuf: .PHONY: lint lint: - golangci-lint run --out-format=colored-line-number --timeout=10m --verbose ./... + golangci-lint run --verbose ./... vet: go vet ./... diff --git a/core/debug/_docs.go b/core/debug/_.go similarity index 56% rename from core/debug/_docs.go rename to core/debug/_.go index c59e48f9f..927b1681d 100644 --- a/core/debug/_docs.go +++ b/core/debug/_.go @@ -1,3 +1,7 @@ package debug // https://github.com/go-echarts/statsview + +import ( + _ "github.com/fasthttp/router" +) diff --git a/core/debug/mux.go b/core/debug/mux.go index 0d692bc79..6860355b0 100644 --- a/core/debug/mux.go +++ b/core/debug/mux.go @@ -3,7 +3,6 @@ package debug import ( "net/http" - _ "github.com/fasthttp/router" "github.com/gofiber/adaptor/v2" "github.com/gofiber/fiber/v2" ) diff --git a/core/debug/zpags/debug.go b/core/debug/zpags/debug.go new file mode 100644 index 000000000..e3cc52812 --- /dev/null +++ b/core/debug/zpags/debug.go @@ -0,0 +1,11 @@ +package zpags + +import ( + "github.com/gofiber/adaptor/v2" + "github.com/pubgo/lava/core/debug" + "go.opentelemetry.io/contrib/zpages" +) + +func init() { + debug.Get("/z", adaptor.HTTPHandler(zpages.NewTracezHandler(zpages.NewSpanProcessor()))) +} diff --git a/go.mod b/go.mod index 3a693ec34..4a85ac665 100644 --- a/go.mod +++ b/go.mod @@ -2,8 +2,6 @@ module github.com/pubgo/lava go 1.23.0 -toolchain go1.23.1 - require ( github.com/gofiber/fiber/v2 v2.52.6 github.com/golang/protobuf v1.5.4 // indirect @@ -17,20 +15,21 @@ require ( github.com/pubgo/opendoc v0.0.5 github.com/reugn/go-quartz v0.11.2 github.com/vmihailenco/msgpack/v5 v5.4.1 - go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/contrib/zpages v0.61.0 + go.opentelemetry.io/otel v1.36.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0 go.opentelemetry.io/otel/exporters/prometheus v0.54.0 - go.opentelemetry.io/otel/metric v1.32.0 - go.opentelemetry.io/otel/sdk v1.32.0 + go.opentelemetry.io/otel/metric v1.36.0 + go.opentelemetry.io/otel/sdk v1.36.0 go.opentelemetry.io/otel/sdk/metric v1.32.0 - go.opentelemetry.io/otel/trace v1.32.0 + go.opentelemetry.io/otel/trace v1.36.0 go.uber.org/atomic v1.11.0 // indirect go.uber.org/automaxprocs v1.5.3 golang.org/x/crypto v0.31.0 // indirect golang.org/x/mod v0.21.0 // indirect golang.org/x/net v0.33.0 - golang.org/x/sys v0.31.0 // indirect + golang.org/x/sys v0.33.0 // indirect google.golang.org/grpc v1.66.1 google.golang.org/protobuf v1.35.1 ) @@ -47,7 +46,6 @@ require ( github.com/arl/statsviz v0.6.0 github.com/dave/jennifer v1.7.0 github.com/ecordell/optgen v0.0.9 - github.com/fasthttp/router v1.5.0 github.com/fasthttp/websocket v1.5.12 github.com/felixge/fgprof v0.9.5 github.com/fullstorydev/grpchan v1.1.1 @@ -279,6 +277,7 @@ require ( gitlab.com/bosi/decorder v0.4.2 // indirect go-simpler.org/musttag v0.12.2 // indirect go-simpler.org/sloglint v0.7.2 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/proto/otlp v1.2.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.24.0 // indirect diff --git a/go.sum b/go.sum index 5f72d6131..e79eca2a2 100644 --- a/go.sum +++ b/go.sum @@ -146,8 +146,6 @@ github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= -github.com/fasthttp/router v1.5.0 h1:3Qbbo27HAPzwbpRzgiV5V9+2faPkPt3eNuRaDV6LYDA= -github.com/fasthttp/router v1.5.0/go.mod h1:FddcKNXFZg1imHcy+uKB0oo/o6yE9zD3wNguqlhWDak= github.com/fasthttp/websocket v1.5.12 h1:e4RGPpWW2HTbL3zV0Y/t7g0ub294LkiuXXUuTOUInlE= github.com/fasthttp/websocket v1.5.12/go.mod h1:I+liyL7/4moHojiOgUOIKEWm9EIxHqxZChS+aMFltyg= github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= @@ -560,8 +558,8 @@ github.com/reugn/go-quartz v0.11.2/go.mod h1:no4ktgYbAAuY0E1SchR8cTx1LF4jYIzdgaQ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= @@ -711,8 +709,12 @@ go-simpler.org/musttag v0.12.2 h1:J7lRc2ysXOq7eM8rwaTYnNrHd5JwjppzB6mScysB2Cs= go-simpler.org/musttag v0.12.2/go.mod h1:uN1DVIasMTQKk6XSik7yrJoEysGtR2GRqvWnI9S7TYM= go-simpler.org/sloglint v0.7.2 h1:Wc9Em/Zeuu7JYpl+oKoYOsQSy2X560aVueCW/m6IijY= go-simpler.org/sloglint v0.7.2/go.mod h1:US+9C80ppl7VsThQclkM7BkCHQAzuz8kHLsW3ppuluo= -go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= -go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/contrib/zpages v0.61.0 h1:tYvUj377Dn3k1wf1le/f8YWSNQ8k0byS3jK8PiIXu9Y= +go.opentelemetry.io/contrib/zpages v0.61.0/go.mod h1:MFNPHMJOGA1P6m5501ANjOJDp4A9BUQja1Y53CDL8LQ= +go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= +go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.26.0 h1:+hm+I+KigBy3M24/h1p/NHkUx/evbLH0PNcjpMyCHc4= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.26.0/go.mod h1:NjC8142mLvvNT6biDpaMjyz78kyEHIwAJlSX0N9P5KI= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 h1:1u/AyyOqAWzy+SkPxDpahCNZParHV8Vid1RnI2clyDE= @@ -725,14 +727,14 @@ go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.23.1 h1:C8r95vDR125t81 go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.23.1/go.mod h1:Qr0qomr64jentMtOjWMbtYeJMSuMSlsPEjmnRA2sWZ4= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= -go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= -go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= -go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= -go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= +go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= +go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= +go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= -go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= -go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= +go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -859,8 +861,8 @@ golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/telemetry v0.0.0-20240522233618-39ace7a40ae7 h1:FemxDzfMUcK2f3YY4H+05K9CDzbSVr2+q/JKN45pey0= golang.org/x/telemetry v0.0.0-20240522233618-39ace7a40ae7/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= From e1679882814e96eda4743bf5aa41fe5c8f03b5b7 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 5 Jul 2025 19:43:23 +0800 Subject: [PATCH 050/142] fix: barry quick fix, 2025-07-05 19:43:23 --- .golangci.yaml | 45 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 59a12d18f..81dae61de 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -1,27 +1,22 @@ +version: "2" linters: - fast: true - disable-all: true + default: none enable: - # - bodyclose # checks whether HTTP response body is closed successfully - # - errcheck # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases - # - gosimple # Linter for Go source code that specializes in simplifying a code - - govet # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string - # - ineffassign # Detects when assignments to existing variables are not used - # - dogsled # Checks assignments with too many blank identifiers (e.g. x, , , _, := f()) - # - goconst # Finds repeated strings that could be replaced by a constant -# - goimports # Goimports does everything that gofmt does. Additionally it checks unused imports -# - goprintffuncname # Checks that printf-like functions are named with f at the end -# - nolintlint # Reports ill-formed or insufficient nolint directives -# - rowserrcheck # checks whether Err of rows is checked successfully -# - staticcheck # Staticcheck is a go vet on steroids, applying a ton of static analysis checks -# - unconvert # Remove unnecessary type conversions -# - unparam # Reports unused function parameters -# - unused # Checks Go code for unused constants, variables, functions and types - -issues: - exclude-dirs: - - vendor - exclude-generated: strict - exclude-dirs-use-default: true - exclude-case-sensitive: false - exclude-use-default: true + - govet + exclusions: + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + paths: + - vendor + - third_party$ + - builtin$ + - examples$ +formatters: + exclusions: + paths: + - third_party$ + - builtin$ + - examples$ From 69bf9202196b1f9c86a826523dbf2c39b09e7dc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BE=E9=87=8C=28barry=29?= Date: Sat, 5 Jul 2025 20:48:16 +0800 Subject: [PATCH 051/142] fix: upgrade dix, funk (#62) --- .github/workflows/lint-test.yml | 19 +- .github/workflows/release.yml | 25 --- .golangci.yaml | 58 +++--- .goreleaser.yaml | 26 --- Makefile | 2 +- clients/grpcc/client.go | 24 +-- .../grpcc/grpcc_resolver/discoverybuilder.go | 26 +-- clients/resty/aaa.go | 2 +- clients/resty/client.go | 7 +- cmds/grpcservercmd/cmd.go | 1 + cmds/httpservercmd/cmd.go | 1 + cmds/lava/main.go | 5 - cmds/protoc-gen-lava/internal/gen.go | 105 ----------- cmds/protoc-gen-lava/internal/version.go | 21 --- cmds/protoc-gen-lava/main.go | 26 --- cmds/versioncmd/cmd.go | 2 +- core/discovery/aaa.go | 2 +- core/discovery/noop.go | 6 +- core/registry/drivers/mdns/mdns.go | 2 + core/responses/response_test.go | 2 +- go.mod | 82 +++++---- go.sum | 169 +++++++++--------- pkg/fiber_builder/config.go | 7 +- pkg/gateway/internal/routertree/parser.go | 16 +- pkg/grpc_builder/config.go | 7 +- 25 files changed, 216 insertions(+), 427 deletions(-) delete mode 100644 .github/workflows/release.yml delete mode 100644 .goreleaser.yaml delete mode 100644 cmds/lava/main.go delete mode 100644 cmds/protoc-gen-lava/internal/gen.go delete mode 100644 cmds/protoc-gen-lava/internal/version.go delete mode 100644 cmds/protoc-gen-lava/main.go diff --git a/.github/workflows/lint-test.yml b/.github/workflows/lint-test.yml index 0d2cbd1e0..f3cb3a75c 100644 --- a/.github/workflows/lint-test.yml +++ b/.github/workflows/lint-test.yml @@ -12,15 +12,14 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - + - uses: "actions/checkout@v4" - name: Set up Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v5 with: - go-version: 1.22 + go-version-file: 'go.mod' - name: golangci-lint - uses: golangci/golangci-lint-action@v2 + uses: golangci/golangci-lint-action@v8 with: skip-go-installation: true args: --timeout 3m --verbose @@ -30,12 +29,10 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v2 - - - name: Set up Go - uses: actions/setup-go@v2 + uses: actions/checkout@v4 + - uses: actions/setup-go@v5 with: - go-version: 1.22 + go-version-file: 'go.mod' - name: Collect dependencies run: | @@ -46,7 +43,7 @@ jobs: run: gotestsum --junitfile unit-tests.xml -- -gcflags=-l ./... - name: Test report - uses: dorny/test-reporter@v1 + uses: dorny/test-reporter@v2 if: success() || failure() with: name: Test report diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 986be8ffb..000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Release -on: - push: - tags: ["v*.*.*"] - -jobs: - release: - name: Release on GitHub - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - name: Set up Go - uses: actions/setup-go@v5 - with: - cache-dependency-path: "**/*.sum" - - name: Run GoReleaser - uses: goreleaser/goreleaser-action@v5 - with: - version: latest - args: release --clean - env: - GITHUB_TOKEN: ${{ secrets.TOKEN }} diff --git a/.golangci.yaml b/.golangci.yaml index 133d78670..45afc5201 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -1,30 +1,32 @@ +version: "2" linters: - fast: true - disable-all: true + default: none enable: -# - bodyclose # checks whether HTTP response body is closed successfully - - errcheck # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases - - gosimple # Linter for Go source code that specializes in simplifying a code - - govet # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string -# - ineffassign # Detects when assignments to existing variables are not used -# - dogsled # Checks assignments with too many blank identifiers (e.g. x, , , _, := f()) -# - goconst # Finds repeated strings that could be replaced by a constant - - goimports # Goimports does everything that gofmt does. Additionally it checks unused imports -# - goprintffuncname # Checks that printf-like functions are named with f at the end -# - nolintlint # Reports ill-formed or insufficient nolint directives -# - rowserrcheck # checks whether Err of rows is checked successfully - - staticcheck # Staticcheck is a go vet on steroids, applying a ton of static analysis checks -# - unconvert # Remove unnecessary type conversions -# - unparam # Reports unused function parameters -# - unused # Checks Go code for unused constants, variables, functions and types - -issues: - exclude-dirs: - - internal/example - - cmds - - vendor - - pkg/proto - exclude-generated: strict - exclude-dirs-use-default: true - exclude-case-sensitive: false - exclude-use-default: true + - govet + exclusions: + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + paths: + - internal/example + - cmds + - vendor + - pkg/proto + - third_party$ + - builtin$ + - examples$ +formatters: + enable: + - goimports + - gofmt + exclusions: + paths: + - internal/example + - cmds + - vendor + - pkg/proto + - third_party$ + - builtin$ + - examples$ diff --git a/.goreleaser.yaml b/.goreleaser.yaml deleted file mode 100644 index 27a6a68d0..000000000 --- a/.goreleaser.yaml +++ /dev/null @@ -1,26 +0,0 @@ -builds: - - main: ./cmds/protoc-gen-lava/main.go - id: protoc-gen-lava - binary: protoc-gen-lava - goos: - - linux - - darwin - - windows - - main: ./main.go - id: lava - binary: lava - env: - - CGO_ENABLED=0 - goos: - - linux - - darwin - - windows - ldflags: - - -X 'github.com/pubgo/lava/version.BuildTime={{ .Date }}' - - -X 'github.com/pubgo/lava/version.CommitID={{ .Commit }}' - - -X 'github.com/pubgo/lava/version.Version={{ .Version }}' -archives: - - name_template: "{{ .Binary }}-{{ .Tag }}-{{ .Os }}-{{ .Arch }}" - format: binary - replacements: - amd64: x86_64 diff --git a/Makefile b/Makefile index 14a6e8783..bc466f5ad 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,7 @@ protobuf: .PHONY: lint lint: golangci-lint --version - golangci-lint run --timeout 3m --verbose ./... + golangci-lint run --timeout=10m --verbose install-protoc: go install -v ./cmds/protoc-gen-lava diff --git a/clients/grpcc/client.go b/clients/grpcc/client.go index 5e548aef5..5e919f11e 100644 --- a/clients/grpcc/client.go +++ b/clients/grpcc/client.go @@ -9,7 +9,7 @@ import ( "github.com/pubgo/funk/errors" "github.com/pubgo/funk/log" "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/result" + "github.com/pubgo/funk/v2/result" "github.com/pubgo/funk/vars" "github.com/pubgo/lava/clients/grpcc/grpcc_config" "github.com/pubgo/lava/core/metrics" @@ -47,45 +47,45 @@ type clientImpl struct { middlewares []lava.Middleware } -func (t *clientImpl) Invoke(ctx context.Context, method string, args, reply interface{}, opts ...grpc.CallOption) (err error) { +func (t *clientImpl) Invoke(ctx context.Context, method string, args, reply any, opts ...grpc.CallOption) (err error) { defer recovery.Err(&err, func(err error) error { return errors.WrapTag(err, errors.T("method", method), errors.T("args", args)) }) conn := t.Get() if conn.IsErr() { - return errors.Wrapf(conn.Err(), "failed to get grpc client, service=%s, method=%s", t.cfg.Service, method) + return errors.Wrapf(conn.GetErr(), "failed to get grpc client, service=%s, method=%s", t.cfg.Service, method) } - return conn.Unwrap().Invoke(ctx, method, args, reply, opts...) + return conn.Must().Invoke(ctx, method, args, reply, opts...) } func (t *clientImpl) Healthy(ctx context.Context) error { conn := t.Get() if conn.IsErr() { - return errors.Wrapf(conn.Err(), "failed to get grpc client, service=%s, method=healthy", t.cfg.Service) + return errors.Wrapf(conn.GetErr(), "failed to get grpc client, service=%s, method=healthy", t.cfg.Service) } - _, err := grpc_health_v1.NewHealthClient(conn.Unwrap()).Check(ctx, &grpc_health_v1.HealthCheckRequest{}) + _, err := grpc_health_v1.NewHealthClient(conn.Must()).Check(ctx, &grpc_health_v1.HealthCheckRequest{}) return errors.Wrapf(err, "service %s heath check failed", t.cfg.Service) } func (t *clientImpl) NewStream(ctx context.Context, desc *grpc.StreamDesc, method string, opts ...grpc.CallOption) (grpc.ClientStream, error) { conn := t.Get() if conn.IsErr() { - return nil, errors.Wrapf(conn.Err(), "failed to get grpc client, service=%s, method=%s", t.cfg.Service, method) + return nil, errors.Wrapf(conn.GetErr(), "failed to get grpc client, service=%s, method=%s", t.cfg.Service, method) } - c, err1 := conn.Unwrap().NewStream(ctx, desc, method, opts...) + c, err1 := conn.Must().NewStream(ctx, desc, method, opts...) return c, errors.Wrap(err1, method) } // Get new grpc client func (t *clientImpl) Get() (r result.Result[grpc.ClientConnInterface]) { - defer recovery.Result(&r) + defer result.RecoveryErr(&r) if t.conn != nil { - return r.WithVal(t.conn) + return r.WithValue(t.conn) } t.mu.Lock() @@ -93,7 +93,7 @@ func (t *clientImpl) Get() (r result.Result[grpc.ClientConnInterface]) { // 双检, 避免多次创建 if t.conn != nil { - return r.WithVal(t.conn) + return r.WithValue(t.conn) } conn, err := createConn(t.cfg, t.log, t.middlewares) @@ -102,5 +102,5 @@ func (t *clientImpl) Get() (r result.Result[grpc.ClientConnInterface]) { } t.conn = conn - return r.WithVal(t.conn) + return r.WithValue(t.conn) } diff --git a/clients/grpcc/grpcc_resolver/discoverybuilder.go b/clients/grpcc/grpcc_resolver/discoverybuilder.go index af59b1e2c..ae31da544 100644 --- a/clients/grpcc/grpcc_resolver/discoverybuilder.go +++ b/clients/grpcc/grpcc_resolver/discoverybuilder.go @@ -96,9 +96,10 @@ func (d *discoveryBuilder) Build(target resolver.Target, cc resolver.ClientConn, // target.Endpoint是服务的名字, 是项目启动的时候注册中心中注册的项目名字 // GetService根据服务名字获取注册中心该项目所有服务 - services := d.disco.GetService(context.Background(), srv).Unwrap(func(err error) error { - return errors.Wrapf(err, "failed to GetService, srv=%s", srv) - }) + services := d.disco.GetService(context.Background(), srv). + MapErr(func(err error) error { + return errors.Wrapf(err, "failed to GetService, srv=%s", srv) + }).Unwrap(&gErr) // 启动后,更新服务地址 d.updateService(services...) @@ -109,9 +110,10 @@ func (d *discoveryBuilder) Build(target resolver.Target, cc resolver.ClientConn, logs.Info().Msgf("discovery builder UpdateState, address=%v", address) assert.MustF(cc.UpdateState(newState(address)), "update resolver address: %v", address) - w := d.disco.Watch(context.Background(), srv).Unwrap(func(err error) error { - return errors.Wrapf(err, "target.Endpoint: %s", srv) - }) + w := d.disco.Watch(context.Background(), srv). + MapErr(func(err error) error { + return errors.Wrapf(err, "target.Endpoint: %s", srv) + }).Unwrap(&gErr) return &baseResolver{ serviceName: srv, @@ -126,13 +128,13 @@ func (d *discoveryBuilder) Build(target resolver.Target, cc resolver.ClientConn, default: res := w.Next() if res.IsErr() { - if errors.Is(res.Err(), discovery.ErrWatcherStopped) { + if errors.Is(res.GetErr(), discovery.ErrWatcherStopped) { return } - d.log.Err(res.Err(), ctx).Msg("failed to get service watcher event") + d.log.Err(res.GetErr(), ctx).Msg("failed to get service watcher event") - if errors.Is(res.Err(), discovery.ErrTimeout) { + if errors.Is(res.GetErr(), discovery.ErrTimeout) { continue } @@ -140,10 +142,10 @@ func (d *discoveryBuilder) Build(target resolver.Target, cc resolver.ClientConn, } // 注册中心删除服务 - if res.Unwrap().Action == lavapbv1.EventType_DELETE { - d.delService(res.Unwrap().Service) + if res.Must().Action == lavapbv1.EventType_DELETE { + d.delService(res.Must().Service) } else { - d.updateService(res.Unwrap().Service) + d.updateService(res.Must().Service) } logutil.ErrRecord(logs, try.Try(func() error { diff --git a/clients/resty/aaa.go b/clients/resty/aaa.go index 1256367f6..0cc70cf58 100644 --- a/clients/resty/aaa.go +++ b/clients/resty/aaa.go @@ -4,7 +4,7 @@ import ( "context" "time" - "github.com/pubgo/funk/result" + "github.com/pubgo/funk/v2/result" "github.com/valyala/fasthttp" ) diff --git a/clients/resty/client.go b/clients/resty/client.go index c9d5d01f9..0262e1620 100644 --- a/clients/resty/client.go +++ b/clients/resty/client.go @@ -8,9 +8,8 @@ import ( "github.com/pubgo/funk/assert" "github.com/pubgo/funk/config" "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/result" "github.com/pubgo/funk/retry" + "github.com/pubgo/funk/v2/result" "github.com/valyala/fasthttp" "github.com/pubgo/lava/core/metrics" @@ -67,7 +66,7 @@ type Client struct { } func (c *Client) Do(ctx context.Context, req *Request) (r result.Result[*fasthttp.Response]) { - defer recovery.Result(&r) + defer result.RecoveryErr(&r) reqErr := doRequest(c, req) if reqErr.IsErr() { @@ -82,5 +81,5 @@ func (c *Client) Do(ctx context.Context, req *Request) (r result.Result[*fasthtt return r.WithErr(err) } - return r.WithVal(resp.(*responseImpl).resp) + return r.WithValue(resp.(*responseImpl).resp) } diff --git a/cmds/grpcservercmd/cmd.go b/cmds/grpcservercmd/cmd.go index ca9a0373d..9e857c639 100644 --- a/cmds/grpcservercmd/cmd.go +++ b/cmds/grpcservercmd/cmd.go @@ -2,6 +2,7 @@ package grpcservercmd import ( "context" + "github.com/pubgo/dix" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/version" diff --git a/cmds/httpservercmd/cmd.go b/cmds/httpservercmd/cmd.go index 896ba2d23..35d5f92c5 100644 --- a/cmds/httpservercmd/cmd.go +++ b/cmds/httpservercmd/cmd.go @@ -2,6 +2,7 @@ package httpservercmd import ( "context" + "github.com/pubgo/dix" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/version" diff --git a/cmds/lava/main.go b/cmds/lava/main.go deleted file mode 100644 index 660cd81c5..000000000 --- a/cmds/lava/main.go +++ /dev/null @@ -1,5 +0,0 @@ -package main - -func main() { - // https://github.com/beego/bee -} diff --git a/cmds/protoc-gen-lava/internal/gen.go b/cmds/protoc-gen-lava/internal/gen.go deleted file mode 100644 index 81fe1d0da..000000000 --- a/cmds/protoc-gen-lava/internal/gen.go +++ /dev/null @@ -1,105 +0,0 @@ -package internal - -import ( - "fmt" - "reflect" - "strings" - - "github.com/dave/jennifer/jen" - "github.com/pubgo/lava/core/rpcmeta" - "github.com/pubgo/lava/pkg/proto/lavapbv1" - "google.golang.org/protobuf/compiler/protogen" - "google.golang.org/protobuf/proto" -) - -var rpcMetaPkg = reflect.TypeOf(rpcmeta.RpcMeta{}).PkgPath() - -type rpcMetaInfo struct { - srv *protogen.Service - mth *protogen.Method - meta *lavapbv1.RpcMeta -} - -// GenerateFile generates a .errors.pb.go file containing service definitions. -func GenerateFile(gen *protogen.Plugin, file *protogen.File) (g *protogen.GeneratedFile) { - filename := file.GeneratedFilenamePrefix + ".lava.pb.go" - genFile := jen.NewFile(string(file.GoPackageName)) - genFile.HeaderComment("Code generated by protoc-gen-lava. DO NOT EDIT.") - genFile.HeaderComment("versions:") - genFile.HeaderComment(fmt.Sprintf(" - protoc-gen-lava %s", Version)) - genFile.HeaderComment(fmt.Sprintf(" - protoc %s", protocVersion(gen))) - if file.Proto.GetOptions().GetDeprecated() { - genFile.HeaderComment(fmt.Sprintf("%s is a deprecated file.", file.Desc.Path())) - } else { - genFile.HeaderComment(fmt.Sprintf("source: %s", file.Desc.Path())) - } - - g = gen.NewGeneratedFile(filename, file.GoImportPath) - g.Skip() - - if len(file.Services) == 0 { - return g - } - - var rpcMetas = make(map[string]*rpcMetaInfo) - for _, srv := range file.Services { - for _, m := range srv.Methods { - rpcMeta, ok := proto.GetExtension(m.Desc.Options(), lavapbv1.E_Options).(*lavapbv1.RpcMeta) - if !ok || rpcMeta == nil { - continue - } - - if rpcMeta.Name == "" { - gen.Error(fmt.Errorf("rpc meta name is null, method=%s", m.GoName)) - return - } - - if rpcMetas[rpcMeta.Name] != nil { - gen.Error(fmt.Errorf("rpc meta name:%s already exists, method=%s", rpcMeta.Name, m.GoName)) - return - } - - rpcMetas[rpcMeta.Name] = &rpcMetaInfo{srv: srv, mth: m, meta: rpcMeta} - } - } - - if len(rpcMetas) == 0 { - return g - } - - g.Unskip() - for _, meta := range rpcMetas { - srvInfo := meta.srv - keyPrefix := strings.ReplaceAll(srvInfo.GoName, "InnerService", "") - keyPrefix = strings.ReplaceAll(keyPrefix, "Inner", "") + "Service" - - genFile.Var().Op("_").Op("=").Qual(rpcMetaPkg, "Register").Call( - jen.Op("&").Qual(rpcMetaPkg, "RpcMeta").Values( - jen.Dict{ - jen.Id("Input"): jen.New(getPkg(file, meta.mth.Input.GoIdent)), - jen.Id("Output"): jen.New(getPkg(file, meta.mth.Output.GoIdent)), - jen.Id("Name"): jen.Lit(meta.meta.Name), - jen.Id("Method"): jen.Lit(fmt.Sprintf("%s/%s", meta.srv.Desc.FullName(), meta.mth.GoName)), - jen.Id("Tags"): jen.Map(jen.String()).String().Values( - jen.DictFunc(func(dict jen.Dict) { - for k, v := range meta.meta.Tags { - dict[jen.Lit(k)] = jen.Lit(v) - } - }), - ), - }, - )) - } - - g.P(genFile.GoString()) - return g -} - -func getPkg(file *protogen.File, goIdent protogen.GoIdent) *jen.Statement { - var pkgName = "" - if file.GoImportPath != goIdent.GoImportPath { - pkgName = string(goIdent.GoImportPath) - } - - return jen.Qual(pkgName, goIdent.GoName) -} diff --git a/cmds/protoc-gen-lava/internal/version.go b/cmds/protoc-gen-lava/internal/version.go deleted file mode 100644 index d71300e2f..000000000 --- a/cmds/protoc-gen-lava/internal/version.go +++ /dev/null @@ -1,21 +0,0 @@ -package internal - -import ( - "fmt" - - "google.golang.org/protobuf/compiler/protogen" -) - -const Version = "v0.0.3" - -func protocVersion(gen *protogen.Plugin) string { - v := gen.Request.GetCompilerVersion() - if v == nil { - return "(unknown)" - } - var suffix string - if s := v.GetSuffix(); s != "" { - suffix = "-" + s - } - return fmt.Sprintf("v%d.%d.%d%s", v.GetMajor(), v.GetMinor(), v.GetPatch(), suffix) -} diff --git a/cmds/protoc-gen-lava/main.go b/cmds/protoc-gen-lava/main.go deleted file mode 100644 index 964990e65..000000000 --- a/cmds/protoc-gen-lava/main.go +++ /dev/null @@ -1,26 +0,0 @@ -package main - -import ( - "flag" - - "github.com/pubgo/lava/cmds/protoc-gen-lava/internal" - "google.golang.org/protobuf/compiler/protogen" - "google.golang.org/protobuf/types/pluginpb" -) - -var _ = flag.String("version", internal.Version, "version") - -func main() { - flag.Parse() - - protogen.Options{ParamFunc: flag.CommandLine.Set}. - Run(func(plugin *protogen.Plugin) error { - plugin.SupportedFeatures = uint64(pluginpb.CodeGeneratorResponse_FEATURE_PROTO3_OPTIONAL) - - for _, name := range plugin.Request.FileToGenerate { - internal.GenerateFile(plugin, plugin.FilesByPath[name]) - } - - return nil - }) -} diff --git a/cmds/versioncmd/cmd.go b/cmds/versioncmd/cmd.go index 92053ae70..37f08cc46 100644 --- a/cmds/versioncmd/cmd.go +++ b/cmds/versioncmd/cmd.go @@ -3,12 +3,12 @@ package versioncmd import ( "context" "fmt" - "github.com/urfave/cli/v3" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/running" "github.com/pubgo/funk/version" "github.com/pubgo/lava/pkg/cmdutil" + "github.com/urfave/cli/v3" ) func New() *cli.Command { diff --git a/core/discovery/aaa.go b/core/discovery/aaa.go index 50099e1df..a5af79378 100644 --- a/core/discovery/aaa.go +++ b/core/discovery/aaa.go @@ -4,7 +4,7 @@ import ( "context" "time" - "github.com/pubgo/funk/result" + "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/core/service" "github.com/pubgo/lava/pkg/proto/lavapbv1" ) diff --git a/core/discovery/noop.go b/core/discovery/noop.go index 209b56fb1..51774d320 100644 --- a/core/discovery/noop.go +++ b/core/discovery/noop.go @@ -3,7 +3,7 @@ package discovery import ( "context" - "github.com/pubgo/funk/result" + "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/core/service" ) @@ -19,8 +19,8 @@ var ( type noopDiscovery struct{} -func (n *noopDiscovery) Next() result.Result[*Result] { - return result.Err[*Result](ErrWatcherStopped) +func (n *noopDiscovery) Next() (r result.Result[*Result]) { + return r.WithErr(ErrWatcherStopped) } func (n *noopDiscovery) Stop() error { return nil } diff --git a/core/registry/drivers/mdns/mdns.go b/core/registry/drivers/mdns/mdns.go index 2c4e927e8..1233938bb 100644 --- a/core/registry/drivers/mdns/mdns.go +++ b/core/registry/drivers/mdns/mdns.go @@ -79,6 +79,8 @@ func (m *mdnsRegistry) Register(ctx context.Context, service *service.Service, o optList[i](&opts) } + _ = opts + m.services.Set(node.Id, &serverNode{ srv: server, id: node.Id, diff --git a/core/responses/response_test.go b/core/responses/response_test.go index d2f612c5c..76ae441fd 100644 --- a/core/responses/response_test.go +++ b/core/responses/response_test.go @@ -10,7 +10,7 @@ import ( func TestResponse(t *testing.T) { rsp := &Response{ - Err: testcodepb.ErrCodeDbConn, + Err: testcodepb.TestErrCodeCustomCode, Data: nil, } bytes, err1 := json.Marshal(rsp) diff --git a/go.mod b/go.mod index 45c45e433..f36efb500 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,9 @@ module github.com/pubgo/lava -go 1.22.1 +go 1.24 require ( - github.com/gofiber/fiber/v2 v2.52.4 + github.com/gofiber/fiber/v2 v2.52.7 github.com/golang/protobuf v1.5.4 // indirect github.com/grandcat/zeroconf v1.0.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 @@ -15,30 +15,29 @@ require ( github.com/pubgo/opendoc v0.0.5 github.com/reugn/go-quartz v0.11.2 github.com/vmihailenco/msgpack/v5 v5.4.1 - go.opentelemetry.io/otel v1.30.0 - go.opentelemetry.io/otel/metric v1.30.0 - go.opentelemetry.io/otel/trace v1.30.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 go.uber.org/atomic v1.11.0 // indirect go.uber.org/automaxprocs v1.5.3 - golang.org/x/crypto v0.27.0 // indirect - golang.org/x/mod v0.21.0 // indirect - golang.org/x/net v0.29.0 - golang.org/x/sys v0.25.0 // indirect - google.golang.org/grpc v1.66.1 - google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 + golang.org/x/crypto v0.39.0 // indirect + golang.org/x/mod v0.25.0 // indirect + golang.org/x/net v0.41.0 + golang.org/x/sys v0.33.0 // indirect + google.golang.org/grpc v1.67.1 + google.golang.org/protobuf v1.35.1 ) require ( github.com/goccy/go-json v0.10.2 github.com/mailgun/holster/v4 v4.19.0 - github.com/prometheus/client_golang v1.19.1 + github.com/prometheus/client_golang v1.20.5 github.com/valyala/bytebufferpool v1.0.0 ) require ( github.com/alecthomas/participle/v2 v2.1.1 github.com/arl/statsviz v0.6.0 - github.com/dave/jennifer v1.7.0 github.com/ecordell/optgen v0.0.9 github.com/fasthttp/router v1.5.0 github.com/fasthttp/websocket v1.5.8 @@ -53,32 +52,32 @@ require ( github.com/goyek/goyek/v2 v2.2.0 github.com/goyek/workflow v0.0.0-20240815094733-414d2a904ff9 github.com/goyek/x v0.2.0 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 github.com/maragudk/gomponents v0.20.0 - github.com/prometheus/common v0.48.0 - github.com/pubgo/dix v0.3.19 - github.com/pubgo/funk v0.5.56 + github.com/prometheus/common v0.60.1 + github.com/pubgo/dix v0.3.21 + github.com/pubgo/funk v0.5.66 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.5.0 github.com/rs/zerolog v1.33.0 - github.com/samber/lo v1.47.0 + github.com/samber/lo v1.51.0 github.com/stretchr/testify v1.9.0 github.com/uber-go/tally/v4 v4.1.16 github.com/urfave/cli/v3 v3.0.0-alpha9.0.20240717192922-127cf54fac9f github.com/valyala/fasthttp v1.52.0 github.com/valyala/fasttemplate v1.2.2 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.26.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0 - go.opentelemetry.io/otel/exporters/prometheus v0.45.2 - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.23.1 - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 - go.opentelemetry.io/otel/sdk v1.30.0 - go.opentelemetry.io/otel/sdk/metric v1.26.0 - golang.org/x/tools v0.25.0 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 + go.opentelemetry.io/otel/exporters/prometheus v0.54.0 + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 + go.opentelemetry.io/otel/sdk v1.32.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 + golang.org/x/tools v0.34.0 golang.org/x/vuln v1.1.3 - google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 gopkg.in/yaml.v3 v3.0.1 ) @@ -99,7 +98,6 @@ require ( github.com/OpenPeeDeeP/depguard/v2 v2.2.0 // indirect github.com/a8m/envsubst v1.3.0 // indirect github.com/alecthomas/go-check-sumtype v0.1.4 // indirect - github.com/alecthomas/repr v0.4.0 // indirect github.com/alexkohler/nakedret/v2 v2.0.4 // indirect github.com/alexkohler/prealloc v1.0.0 // indirect github.com/alingse/asasalint v0.0.11 // indirect @@ -126,11 +124,11 @@ require ( github.com/creasty/defaults v1.7.0 // indirect github.com/curioswitch/go-reassign v0.2.0 // indirect github.com/daixiang0/gci v0.13.5 // indirect + github.com/dave/jennifer v1.7.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/denis-tingaikin/go-header v0.5.0 // indirect - github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect github.com/ettle/strcase v0.2.0 // indirect + github.com/expr-lang/expr v1.16.9 // indirect github.com/fatih/color v1.17.0 // indirect github.com/fatih/structtag v1.2.0 // indirect github.com/firefart/nonamedreturns v1.0.5 // indirect @@ -191,6 +189,8 @@ require ( github.com/kisielk/errcheck v1.7.0 // indirect github.com/kkHAIKE/contextcheck v1.1.5 // indirect github.com/klauspost/compress v1.17.9 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect github.com/kulti/thelper v0.6.3 // indirect github.com/kunwardeep/paralleltest v1.0.10 // indirect github.com/kyoh86/exportloopref v0.1.11 // indirect @@ -208,7 +208,7 @@ require ( github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mattn/go-shellwords v1.0.12 // indirect github.com/mgechev/revive v1.3.9 // indirect github.com/miekg/dns v1.1.50 // indirect @@ -217,14 +217,11 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/moricho/tparallel v0.3.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nakabonne/nestif v0.3.1 // indirect - github.com/nats-io/nats.go v1.37.0 // indirect - github.com/nats-io/nkeys v0.4.7 // indirect - github.com/nats-io/nuid v1.0.1 // indirect github.com/nishanths/exhaustive v0.12.0 // indirect github.com/nishanths/predeclared v0.2.2 // indirect github.com/nunnatsa/ginkgolinter v0.16.2 // indirect - github.com/panjf2000/ants/v2 v2.10.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect @@ -232,13 +229,14 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/polyfloyd/go-errorlint v1.6.0 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/procfs v0.12.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 // indirect github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect github.com/quasilyte/gogrep v0.5.0 // indirect github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect github.com/rivo/uniseg v0.2.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/ryancurrah/gomodguard v1.3.5 // indirect github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect @@ -282,15 +280,15 @@ require ( gitlab.com/bosi/decorder v0.4.2 // indirect go-simpler.org/musttag v0.12.2 // indirect go-simpler.org/sloglint v0.7.2 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect + golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f // indirect - golang.org/x/sync v0.8.0 // indirect + golang.org/x/sync v0.15.0 // indirect golang.org/x/telemetry v0.0.0-20240522233618-39ace7a40ae7 // indirect - golang.org/x/text v0.18.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + golang.org/x/text v0.26.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect honnef.co/go/tools v0.5.1 // indirect diff --git a/go.sum b/go.sum index e4890f5d4..81430d924 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,8 @@ 4d63.com/gocheckcompilerdirectives v1.2.1/go.mod h1:yjDJSxmDTtIHHCqX0ufRYZDL6vQtMG7tJdKVeWwsqvs= 4d63.com/gochecknoglobals v0.2.1 h1:1eiorGsgHOFOuoOiJDy2psSrQbRdIHrlge0IJIkUgDc= 4d63.com/gochecknoglobals v0.2.1/go.mod h1:KRE8wtJB3CXCsb1xy421JfTHIIbmT3U5ruxw2Qu8fSU= -cel.dev/expr v0.15.0 h1:O1jzfJCQBfL5BFoYktaxwIhuttaQPsVWerH9/EEKx0w= -cel.dev/expr v0.15.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= +cel.dev/expr v0.16.0 h1:yloc84fytn4zmJX2GU3TkXGsaieaV7dQ057Qs4sIG2Y= +cel.dev/expr v0.16.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= @@ -114,10 +114,11 @@ github.com/ckaznocha/intrange v0.2.0/go.mod h1:r5I7nUlAAG56xmkOpw4XVr16BXhwYTUdc github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b h1:ga8SEFjZ60pxLcmhnThWgvH2wg8376yUJmPhEH4H3kw= -github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20 h1:N+3sFI5GUjRKBi+i0TxYVST9h4Ie192jJWpHvthBBgg= +github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creasty/defaults v1.7.0 h1:eNdqZvc5B509z18lD8yc212CAqJNvfT1Jq6L8WowdBA= github.com/creasty/defaults v1.7.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbDy08fPzYM= github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= @@ -129,8 +130,6 @@ github.com/dave/jennifer v1.7.0/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= -github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8= github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY= github.com/ecordell/optgen v0.0.9 h1:kmRMqOkbNsWayOnZSk2m5SeGaOTOc7amfi+MAnaMOeI= @@ -139,13 +138,15 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.12.1-0.20240621013728-1eb8caab5155 h1:IgJPqnrlY2Mr4pYB6oaMKvFvwJ9H+X6CCY5x1vCTcpc= -github.com/envoyproxy/go-control-plane v0.12.1-0.20240621013728-1eb8caab5155/go.mod h1:5Wkq+JduFtdAXihLmeTJf+tRYIT4KBc2vPXDhwVo1pA= +github.com/envoyproxy/go-control-plane v0.13.0 h1:HzkeUz1Knt+3bK+8LG1bxOO/jzWZmdxpwC51i202les= +github.com/envoyproxy/go-control-plane v0.13.0/go.mod h1:GRaKG3dwvFoTg4nj7aXdZnvMg4d7nvT/wl9WgVXn3Q8= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= +github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= +github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/fasthttp/router v1.5.0 h1:3Qbbo27HAPzwbpRzgiV5V9+2faPkPt3eNuRaDV6LYDA= github.com/fasthttp/router v1.5.0/go.mod h1:FddcKNXFZg1imHcy+uKB0oo/o6yE9zD3wNguqlhWDak= github.com/fasthttp/websocket v1.5.8 h1:k5DpirKkftIF/w1R8ZzjSgARJrs54Je9YJK37DL/Ah8= @@ -237,8 +238,8 @@ github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofiber/adaptor/v2 v2.2.1 h1:givE7iViQWlsTR4Jh7tB4iXzrlKBgiraB/yTdHs9Lv4= github.com/gofiber/adaptor/v2 v2.2.1/go.mod h1:AhR16dEqs25W2FY/l8gSj1b51Azg5dtPDmm+pruNOrc= -github.com/gofiber/fiber/v2 v2.52.4 h1:P+T+4iK7VaqUsq2PALYEfBBo6bJZ4q3FP8cZ84EggTM= -github.com/gofiber/fiber/v2 v2.52.4/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= +github.com/gofiber/fiber/v2 v2.52.7 h1:6xJpE4sSqErvMiEZo9ZpJLRSVcpkNBvioeqAHKwhTZY= +github.com/gofiber/fiber/v2 v2.52.7/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= github.com/gofiber/utils v1.1.0 h1:vdEBpn7AzIUJRhe+CiTOJdUcTg4Q9RK+pEa0KPbLdrM= github.com/gofiber/utils v1.1.0/go.mod h1:poZpsnhBykfnY1Mc0KeEa6mSHrS3dV0+oBWyeQmb2e0= github.com/gofiber/websocket/v2 v2.2.1 h1:C9cjxvloojayOp9AovmpQrk8VqvVnT8Oao3+IUygH7w= @@ -332,8 +333,8 @@ github.com/grandcat/zeroconf v1.0.0 h1:uHhahLBKqwWBV6WZUDAT71044vwOTL+McW0mBJvo6 github.com/grandcat/zeroconf v1.0.0/go.mod h1:lTKmG1zh86XyCoUeIHSA4FJMBwCJiQmGfcP2PdzytEs= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -405,6 +406,8 @@ github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= github.com/kunwardeep/paralleltest v1.0.10 h1:wrodoaKYzS2mdNVnc4/w31YaXFtsc21PCTdvWJ/lDDs= github.com/kunwardeep/paralleltest v1.0.10/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ= github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= github.com/lasiar/canonicalheader v1.1.1 h1:wC+dY9ZfiqiPwAexUApFush/csSPXeIi4QqyxXmng8I= @@ -445,8 +448,8 @@ github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -470,16 +473,12 @@ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKHTI= github.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/nats-io/nats.go v1.37.0 h1:07rauXbVnnJvv1gfIyghFEo6lUcYRY0WXc3x7x0vUxE= -github.com/nats-io/nats.go v1.37.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= -github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI= -github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= -github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhKRf3Swg= github.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs= github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= @@ -501,8 +500,6 @@ github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJ github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/panjf2000/ants/v2 v2.10.0 h1:zhRg1pQUtkyRiOFo2Sbqwjp0GfBNo9cUY2/Grpx1p+8= -github.com/panjf2000/ants/v2 v2.10.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= @@ -511,6 +508,7 @@ github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/phuslu/goid v1.0.0 h1:Cgcvd/R54UO1fCtyt+iKXAi+yZQ/KWlAm6MmZNizCLM= github.com/phuslu/goid v1.0.0/go.mod h1:txc2fUIdrdnn+v9Vq+QpiPQ3dnrXEchjoVDgic+r+L0= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -527,8 +525,8 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -538,18 +536,18 @@ github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQy github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= -github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= +github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= +github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/pubgo/dix v0.3.19 h1:a4RRmljw7ePUvc9uJKqXXs6JpYL8s3VqPP2NV2vxI9U= -github.com/pubgo/dix v0.3.19/go.mod h1:J0PyuMm7mW6ZrN13l9xz0rtKbzliREFyvb7fuaGYyVw= -github.com/pubgo/funk v0.5.56 h1:LYpjOBDSSeTorRWda0lmf23sJNDm6ZtbbNS0xQjb1CE= -github.com/pubgo/funk v0.5.56/go.mod h1:uAs5IQDz6ovr5zy4LC0Uq7No/eTIbeloSCjF0EQJesw= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/pubgo/dix v0.3.21 h1:jtriLYT6srKrxv0KRwic1no0d9ZTMtLx6r3JJxQ5Jvw= +github.com/pubgo/dix v0.3.21/go.mod h1:5qHJ7ycvBVw1AUjgYMEsobzx1tggiRs+spgzd4Jglb4= +github.com/pubgo/funk v0.5.66 h1:/UNvZITWdUlntSbrIHbfPJqIfAFpqMQ6cv9OGDCXj2k= +github.com/pubgo/funk v0.5.66/go.mod h1:lM2VGLa+uBEWf8wteXGZyXeo6lkdiRTc+0lwFV88NAk= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/pubgo/protobuild v0.0.21 h1:QSwh92QxsD6Mv7kQlowzE7fxtcOm1eMWmgADsD803Js= @@ -568,8 +566,9 @@ github.com/reugn/go-quartz v0.11.2 h1:+jc54Ji06n/D/endEPmc+CuG/Jc8466nda1oxtFRrk github.com/reugn/go-quartz v0.11.2/go.mod h1:no4ktgYbAAuY0E1SchR8cTx1LF4jYIzdgaQhzRPSkpk= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= @@ -579,8 +578,8 @@ github.com/ryancurrah/gomodguard v1.3.5 h1:cShyguSwUEeC0jS7ylOiG/idnd1TpJ1LfHGpV github.com/ryancurrah/gomodguard v1.3.5/go.mod h1:MXlEPQRxgfPQa62O8wzK3Ozbkv9Rkqr+wKjSxTdsNJE= github.com/ryanrolds/sqlclosecheck v0.5.1 h1:dibWW826u0P8jNLsLN+En7+RqWWTYrjCB9fJfSfdyCU= github.com/ryanrolds/sqlclosecheck v0.5.1/go.mod h1:2g3dUjoS6AL4huFdv6wn55WpLIDjY7ZgUR4J8HOO/XQ= -github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc= -github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= +github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI= +github.com/samber/lo v1.51.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= github.com/sanposhiho/wastedassign/v2 v2.0.7 h1:J+6nrY4VW+gC9xFzUc+XjPD3g3wF3je/NsJFwFK7Uxc= github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= @@ -639,7 +638,6 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= @@ -716,30 +714,30 @@ go-simpler.org/musttag v0.12.2 h1:J7lRc2ysXOq7eM8rwaTYnNrHd5JwjppzB6mScysB2Cs= go-simpler.org/musttag v0.12.2/go.mod h1:uN1DVIasMTQKk6XSik7yrJoEysGtR2GRqvWnI9S7TYM= go-simpler.org/sloglint v0.7.2 h1:Wc9Em/Zeuu7JYpl+oKoYOsQSy2X560aVueCW/m6IijY= go-simpler.org/sloglint v0.7.2/go.mod h1:US+9C80ppl7VsThQclkM7BkCHQAzuz8kHLsW3ppuluo= -go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= -go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.26.0 h1:+hm+I+KigBy3M24/h1p/NHkUx/evbLH0PNcjpMyCHc4= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.26.0/go.mod h1:NjC8142mLvvNT6biDpaMjyz78kyEHIwAJlSX0N9P5KI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 h1:1u/AyyOqAWzy+SkPxDpahCNZParHV8Vid1RnI2clyDE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0/go.mod h1:z46paqbJ9l7c9fIPCXTqTGwhQZ5XoTIsfeFYWboizjs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0 h1:Waw9Wfpo/IXzOI8bCB7DIk+0JZcqqsyn1JFnAc+iam8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0/go.mod h1:wnJIG4fOqyynOnnQF/eQb4/16VlX2EJAHhHgqIqWfAo= -go.opentelemetry.io/otel/exporters/prometheus v0.45.2 h1:pe2Jqk1K18As0RCw7J08QhgXNqr+6npx0a5W4IgAFA8= -go.opentelemetry.io/otel/exporters/prometheus v0.45.2/go.mod h1:B38pscHKI6bhFS44FDw0eFU3iqG3ASNIvY+fZgR5sAc= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.23.1 h1:C8r95vDR125t815KD+b1tI0Fbc1pFnwHTBxkbIZ6Szc= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.23.1/go.mod h1:Qr0qomr64jentMtOjWMbtYeJMSuMSlsPEjmnRA2sWZ4= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= -go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= -go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= -go.opentelemetry.io/otel/sdk v1.30.0 h1:cHdik6irO49R5IysVhdn8oaiR9m8XluDaJAs4DfOrYE= -go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg= -go.opentelemetry.io/otel/sdk/metric v1.26.0 h1:cWSks5tfriHPdWFnl+qpX3P681aAYqlZHcAyHw5aU9Y= -go.opentelemetry.io/otel/sdk/metric v1.26.0/go.mod h1:ClMFFknnThJCksebJwz7KIyEDHO+nTB6gK8obLy8RyE= -go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= -go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0 h1:rFwzp68QMgtzu9PgP3jm9XaMICI6TsofWWPcBDKwlsU= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0/go.mod h1:QyjcV9qDP6VeK5qPyKETvNjmaaEc7+gqjh4SS0ZYzDU= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 h1:SZmDnHcgp3zwlPBS2JX2urGYe/jBKEIT6ZedHRUyCz8= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0/go.mod h1:fdWW0HtZJ7+jNpTKUR0GpMEDP69nR8YBJQxNiVCE3jk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 h1:cC2yDI3IQd0Udsux7Qmq8ToKAx1XCilTQECZ0KDZyTw= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0/go.mod h1:2PD5Ex6z8CFzDbTdOlwyNIUywRr1DN0ospafJM1wJ+s= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= @@ -761,11 +759,11 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= -golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= +golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= -golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= +golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= +golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f h1:phY1HzDcf18Aq9A8KkmRtY9WvOFIxN8wgfvy6Zm1DV8= @@ -785,8 +783,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= -golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -810,8 +808,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= -golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= +golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -825,9 +823,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -864,8 +861,8 @@ golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= -golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/telemetry v0.0.0-20240522233618-39ace7a40ae7 h1:FemxDzfMUcK2f3YY4H+05K9CDzbSVr2+q/JKN45pey0= golang.org/x/telemetry v0.0.0-20240522233618-39ace7a40ae7/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -882,8 +879,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -914,8 +911,8 @@ golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE= -golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg= +golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= +golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= golang.org/x/vuln v1.1.3 h1:NPGnvPOTgnjBc9HTaUx+nj+EaUYxl5SJOWqaDYGaFYw= golang.org/x/vuln v1.1.3/go.mod h1:7Le6Fadm5FOqE9C926BCD0g12NWyhg7cxV4BwcPFuNY= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -928,18 +925,18 @@ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoA google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.66.1 h1:hO5qAXR19+/Z44hmvIM4dQFMSYX9XcWsByfoxutBpAM= -google.golang.org/grpc v1.66.1/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -951,8 +948,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 h1:hNwajDgT0MlsxZzlUajZVmUYFpts8/CYe4BSNx503ZE= -google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/pkg/fiber_builder/config.go b/pkg/fiber_builder/config.go index 1d13bee78..651c491bd 100644 --- a/pkg/fiber_builder/config.go +++ b/pkg/fiber_builder/config.go @@ -6,8 +6,7 @@ import ( "github.com/gofiber/fiber/v2" "github.com/pubgo/funk/generic" "github.com/pubgo/funk/merge" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/result" + "github.com/pubgo/funk/v2/result" ) type Config struct { @@ -41,7 +40,7 @@ type Config struct { } func (t *Config) Build() (r result.Result[*fiber.App]) { - defer recovery.Result(&r) + defer result.RecoveryErr(&r) fc := merge.Struct(generic.Ptr(fiber.New().Config()), &t).Unwrap() - return r.WithVal(fiber.New(*fc)) + return r.WithValue(fiber.New(*fc)) } diff --git a/pkg/gateway/internal/routertree/parser.go b/pkg/gateway/internal/routertree/parser.go index 5bf95dc02..12bfafc5c 100644 --- a/pkg/gateway/internal/routertree/parser.go +++ b/pkg/gateway/internal/routertree/parser.go @@ -33,23 +33,23 @@ var ( // FieldPath = IDENT { "." IDENT } ; // Verb = ":" LITERAL ; type httpRule struct { - Slash string `@"/"` - Segments *segments `@@!` - Verb *string `(":" @Ident)?` + Slash string `@"/"` //nolint:govet + Segments *segments `@@!` //nolint:govet + Verb *string `(":" @Ident)?` //nolint:govet } type segments struct { - Segments []*segment `@@ ("/" @@)*` + Segments []*segment `@@ ("/" @@)*` //nolint:govet } type segment struct { - Path *string `@("*" "*" | "*" | Ident)` - Variable *variable `| @@*` + Path *string `@("*" "*" | "*" | Ident)` //nolint:govet + Variable *variable `| @@*` //nolint:govet } type variable struct { - Fields []string `"{" @Ident ("." @Ident)*` - Segments *segments `("=" @@)? "}"` + Fields []string `"{" @Ident ("." @Ident)*` //nolint:govet + Segments *segments `("=" @@)? "}"` //nolint:govet } type pathVariable struct { diff --git a/pkg/grpc_builder/config.go b/pkg/grpc_builder/config.go index e7fe170d0..17ac6a178 100644 --- a/pkg/grpc_builder/config.go +++ b/pkg/grpc_builder/config.go @@ -3,8 +3,7 @@ package grpc_builder import ( "time" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/result" + "github.com/pubgo/funk/v2/result" "google.golang.org/grpc" "google.golang.org/grpc/keepalive" @@ -63,7 +62,7 @@ type Config struct { } func (t *Config) Build(opts ...grpc.ServerOption) (r result.Result[*grpc.Server]) { - defer recovery.Result(&r) + defer result.RecoveryErr(&r) if t.KeepalivePolicy != nil { opts = append(opts, t.KeepalivePolicy.ToOpts()) @@ -78,7 +77,7 @@ func (t *Config) Build(opts ...grpc.ServerOption) (r result.Result[*grpc.Server] grpcutil.EnableReflection(srv) grpcutil.EnableHealth("", srv) grpcutil.EnableDebug(srv) - return r.WithVal(srv) + return r.WithValue(srv) } func GetDefaultCfg() *Config { From a769adb089ba99704f9ac59ae4a41f8d933f6346 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 5 Jul 2025 22:09:05 +0800 Subject: [PATCH 052/142] fix: barry quick fix, 2025-07-05 22:09:05 --- clients/resty/client.go | 4 +- cmds/depcmd/cmd.go | 2 +- core/scheduler/builder.go | 7 +- go.mod | 105 ++++++------- go.sum | 299 +++++++++++++++---------------------- pkg/fiberbuilder/config.go | 2 - 6 files changed, 177 insertions(+), 242 deletions(-) diff --git a/clients/resty/client.go b/clients/resty/client.go index 131659866..adaa5d548 100644 --- a/clients/resty/client.go +++ b/clients/resty/client.go @@ -8,9 +8,7 @@ import ( "github.com/pubgo/funk/assert" "github.com/pubgo/funk/config" "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/errors/errcheck" "github.com/pubgo/funk/log" - "github.com/pubgo/funk/result" "github.com/pubgo/funk/retry" "github.com/pubgo/funk/v2/result" "github.com/valyala/fasthttp" @@ -71,7 +69,7 @@ type Client struct { } func (c *Client) Do(ctx context.Context, req *Request) (r result.Result[*fasthttp.Response]) { - defer errcheck.RecoveryAndCheck(&r.E, func(err error) error { + defer result.RecoveryErr(&r, func(err error) error { errors.Debug(err) return err }) diff --git a/cmds/depcmd/cmd.go b/cmds/depcmd/cmd.go index bdc7a1557..e6c66ab89 100644 --- a/cmds/depcmd/cmd.go +++ b/cmds/depcmd/cmd.go @@ -45,7 +45,7 @@ func New(di *dix.Dix) *cli.Command { pretty.Println(running.GetSysInfo()) case "table", "tb", "t": table := tablewriter.NewWriter(os.Stdout) - table.SetHeader([]string{"path", "Version", "Replace"}) + table.Header([]string{"path", "Version", "Replace"}) table.Append([]string{info.Main.Path, version.Version(), replace(info.Main.Replace)}) for _, dep := range info.Deps { diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index 3f6509040..4481ae768 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/result" "github.com/reugn/go-quartz/quartz" "github.com/pubgo/lava/core/lifecycle" @@ -13,7 +14,7 @@ import ( const Name = "scheduler" -func New(m lifecycle.Lifecycle, log log.Logger, opts []*Config, routers []Register, metric metrics.Metric) *Scheduler { +func New(m lifecycle.Lifecycle, log log.Logger, opts []*Config, routers []Register, metric metrics.Metric) (*Scheduler, error) { config := make(map[string]JobSetting) if len(opts) > 0 && opts[0] != nil { for _, setting := range opts[0].JobSettings { @@ -29,7 +30,7 @@ func New(m lifecycle.Lifecycle, log log.Logger, opts []*Config, routers []Regist quart := &Scheduler{ metric: metric, config: config, - scheduler: quartz.NewStdScheduler(), + scheduler: result.Wrap(quartz.NewStdScheduler()).Must(), log: log.WithName(Name), ctx: ctx, cancel: cancel, @@ -43,5 +44,5 @@ func New(m lifecycle.Lifecycle, log log.Logger, opts []*Config, routers []Regist r.RegisterCrontabScheduler(quart) } - return quart + return quart, nil } diff --git a/go.mod b/go.mod index e496ab64b..4ab8020b4 100644 --- a/go.mod +++ b/go.mod @@ -3,35 +3,35 @@ module github.com/pubgo/lava go 1.24 require ( - github.com/gofiber/fiber/v2 v2.52.7 + github.com/gofiber/fiber/v2 v2.52.8 github.com/golang/protobuf v1.5.4 // indirect github.com/grandcat/zeroconf v1.0.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/jinzhu/copier v0.4.0 // indirect github.com/json-iterator/go v1.1.12 github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/olekukonko/tablewriter v0.0.5 + github.com/olekukonko/tablewriter v1.0.8 github.com/pkg/errors v0.9.1 github.com/pubgo/opendoc v0.0.5 - github.com/reugn/go-quartz v0.11.2 + github.com/reugn/go-quartz v0.14.0 github.com/vmihailenco/msgpack/v5 v5.4.1 go.opentelemetry.io/otel v1.37.0 go.opentelemetry.io/otel/metric v1.37.0 go.opentelemetry.io/otel/trace v1.37.0 go.uber.org/atomic v1.11.0 // indirect - go.uber.org/automaxprocs v1.5.3 + go.uber.org/automaxprocs v1.6.0 golang.org/x/crypto v0.39.0 // indirect golang.org/x/mod v0.25.0 // indirect golang.org/x/net v0.41.0 golang.org/x/sys v0.33.0 // indirect - google.golang.org/grpc v1.67.1 - google.golang.org/protobuf v1.35.1 + google.golang.org/grpc v1.73.0 + google.golang.org/protobuf v1.36.6 ) require ( - github.com/goccy/go-json v0.10.2 - github.com/mailgun/holster/v4 v4.19.0 - github.com/prometheus/client_golang v1.20.5 + github.com/goccy/go-json v0.10.5 + github.com/mailgun/holster/v4 v4.21.0 + github.com/prometheus/client_golang v1.22.0 github.com/valyala/bytebufferpool v1.0.0 ) @@ -43,48 +43,48 @@ require ( github.com/felixge/fgprof v0.9.5 github.com/fullstorydev/grpchan v1.1.1 github.com/go-logr/logr v1.4.3 - github.com/go-playground/validator/v10 v10.19.0 + github.com/go-playground/validator/v10 v10.27.0 github.com/gofiber/adaptor/v2 v2.2.1 github.com/gofiber/utils v1.1.0 github.com/golangci/golangci-lint v1.61.0 - github.com/gorilla/websocket v1.5.1 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 + github.com/gorilla/websocket v1.5.3 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 github.com/kardianos/service v1.2.2 github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 - github.com/maragudk/gomponents v0.20.0 + github.com/maragudk/gomponents v0.22.0 github.com/maruel/panicparse/v2 v2.5.0 - github.com/prometheus/common v0.60.1 + github.com/prometheus/common v0.65.0 github.com/pubgo/dix v0.3.21 github.com/pubgo/funk v0.5.66 github.com/pubgo/protobuild v0.0.21 - github.com/rs/xid v1.5.0 - github.com/rs/zerolog v1.33.0 + github.com/rs/xid v1.6.0 + github.com/rs/zerolog v1.34.0 github.com/samber/lo v1.51.0 github.com/stretchr/testify v1.10.0 github.com/thejerf/suture/v4 v4.0.6 - github.com/uber-go/tally/v4 v4.1.16 - github.com/urfave/cli/v3 v3.3.3 - github.com/valyala/fasthttp v1.58.0 + github.com/uber-go/tally/v4 v4.1.17 + github.com/urfave/cli/v3 v3.3.8 + github.com/valyala/fasthttp v1.63.0 github.com/valyala/fasttemplate v1.2.2 go.opentelemetry.io/contrib/zpages v0.62.0 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 - go.opentelemetry.io/otel/exporters/prometheus v0.54.0 - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 + go.opentelemetry.io/otel/exporters/prometheus v0.59.0 + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.37.0 + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0 go.opentelemetry.io/otel/sdk v1.37.0 go.opentelemetry.io/otel/sdk/metric v1.37.0 golang.org/x/tools v0.34.0 golang.org/x/vuln v1.1.3 - google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 + google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 gopkg.in/yaml.v3 v3.0.1 ) require ( 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect 4d63.com/gochecknoglobals v0.2.1 // indirect - dario.cat/mergo v1.0.0 // indirect + dario.cat/mergo v1.0.2 // indirect github.com/4meepo/tagalign v1.3.4 // indirect github.com/Abirdcfly/dupword v0.1.1 // indirect github.com/Antonboom/errname v0.1.13 // indirect @@ -96,12 +96,12 @@ require ( github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0 // indirect github.com/Masterminds/semver/v3 v3.3.0 // indirect github.com/OpenPeeDeeP/depguard/v2 v2.2.0 // indirect - github.com/a8m/envsubst v1.3.0 // indirect + github.com/a8m/envsubst v1.4.3 // indirect github.com/alecthomas/go-check-sumtype v0.1.4 // indirect github.com/alexkohler/nakedret/v2 v2.0.4 // indirect github.com/alexkohler/prealloc v1.0.0 // indirect github.com/alingse/asasalint v0.0.11 // indirect - github.com/andybalholm/brotli v1.1.1 // indirect + github.com/andybalholm/brotli v1.2.0 // indirect github.com/ashanbrown/forbidigo v1.6.0 // indirect github.com/ashanbrown/makezero v1.1.1 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -116,7 +116,7 @@ require ( github.com/catenacyber/perfsprint v0.7.1 // indirect github.com/ccojocar/zxcvbn-go v1.0.2 // indirect github.com/cenkalti/backoff v2.2.1+incompatible // indirect - github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.2 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/charithe/durationcheck v0.0.10 // indirect github.com/chavacava/garif v0.1.0 // indirect @@ -128,19 +128,19 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/denis-tingaikin/go-header v0.5.0 // indirect github.com/ettle/strcase v0.2.0 // indirect - github.com/expr-lang/expr v1.16.9 // indirect - github.com/fatih/color v1.17.0 // indirect + github.com/expr-lang/expr v1.17.5 // indirect + github.com/fatih/color v1.18.0 // indirect github.com/fatih/structtag v1.2.0 // indirect github.com/firefart/nonamedreturns v1.0.5 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.3 // indirect - github.com/getkin/kin-openapi v0.124.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.9 // indirect + github.com/getkin/kin-openapi v0.132.0 // indirect github.com/ghostiam/protogetter v0.3.6 // indirect github.com/go-critic/go-critic v0.11.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/jsonpointer v0.20.2 // indirect - github.com/go-openapi/swag v0.22.8 // indirect + github.com/go-openapi/jsonpointer v0.21.1 // indirect + github.com/go-openapi/swag v0.23.1 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-toolsmith/astcast v1.1.0 // indirect @@ -163,7 +163,7 @@ require ( github.com/golangci/revgrep v0.5.3 // indirect github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed // indirect github.com/google/go-cmp v0.7.0 // indirect - github.com/google/pprof v0.0.0-20240910150728-a0b0bb1d4134 // indirect + github.com/google/pprof v0.0.0-20250630185457-6e76a2b096b5 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gordonklaus/ineffassign v0.1.0 // indirect github.com/gostaticanalysis/analysisutil v0.7.1 // indirect @@ -183,11 +183,11 @@ require ( github.com/joho/godotenv v1.5.1 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/julz/importas v0.1.0 // indirect - github.com/k0kubun/pp/v3 v3.2.0 // indirect + github.com/k0kubun/pp/v3 v3.4.1 // indirect github.com/karamaru-alpha/copyloopvar v1.1.0 // indirect github.com/kisielk/errcheck v1.7.0 // indirect github.com/kkHAIKE/contextcheck v1.1.5 // indirect - github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/compress v1.18.0 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/kulti/thelper v0.6.3 // indirect @@ -201,7 +201,7 @@ require ( github.com/lufeee/execinquery v1.2.1 // indirect github.com/macabu/inamedparam v0.1.3 // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mailru/easyjson v0.7.7 // indirect + github.com/mailru/easyjson v0.9.0 // indirect github.com/maratori/testableexamples v1.0.0 // indirect github.com/maratori/testpackage v1.1.1 // indirect github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect @@ -209,7 +209,7 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mgechev/revive v1.3.9 // indirect - github.com/miekg/dns v1.1.50 // indirect + github.com/miekg/dns v1.1.66 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -220,28 +220,32 @@ require ( github.com/nishanths/exhaustive v0.12.0 // indirect github.com/nishanths/predeclared v0.2.2 // indirect github.com/nunnatsa/ginkgolinter v0.16.2 // indirect + github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect + github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect + github.com/olekukonko/errors v1.1.0 // indirect + github.com/olekukonko/ll v0.0.9 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect - github.com/phuslu/goid v1.0.0 // indirect + github.com/phuslu/goid v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/polyfloyd/go-errorlint v1.6.0 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/procfs v0.15.1 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/procfs v0.17.0 // indirect github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 // indirect github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect github.com/quasilyte/gogrep v0.5.0 // indirect github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/rogpeppe/go-internal v1.13.1 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect github.com/ryancurrah/gomodguard v1.3.5 // indirect github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect github.com/sashamelentyev/interfacebloat v1.1.0 // indirect github.com/sashamelentyev/usestdlibvars v1.27.0 // indirect - github.com/savsgio/gotils v0.0.0-20240704082632-aef3928b8a38 // indirect + github.com/savsgio/gotils v0.0.0-20250408102913-196191ec6287 // indirect github.com/securego/gosec/v2 v2.21.2 // indirect github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect github.com/sirupsen/logrus v1.9.3 // indirect @@ -265,11 +269,10 @@ require ( github.com/timonwong/loggercheck v0.9.4 // indirect github.com/tomarrell/wrapcheck/v2 v2.9.0 // indirect github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect - github.com/twmb/murmur3 v1.1.5 // indirect + github.com/twmb/murmur3 v1.1.8 // indirect github.com/ultraware/funlen v0.1.0 // indirect github.com/ultraware/whitespace v0.1.1 // indirect github.com/uudashr/gocognit v1.1.3 // indirect - github.com/valyala/tcplisten v1.0.0 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/xen0n/gosmopolitan v1.2.2 // indirect github.com/yagipy/maintidx v1.0.0 // indirect @@ -279,7 +282,7 @@ require ( go-simpler.org/musttag v0.12.2 // indirect go-simpler.org/sloglint v0.7.2 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.opentelemetry.io/proto/otlp v1.7.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.24.0 // indirect golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect @@ -287,7 +290,7 @@ require ( golang.org/x/sync v0.15.0 // indirect golang.org/x/telemetry v0.0.0-20240522233618-39ace7a40ae7 // indirect golang.org/x/text v0.26.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect honnef.co/go/tools v0.5.1 // indirect diff --git a/go.sum b/go.sum index 1c94a3e28..0823ad7a9 100644 --- a/go.sum +++ b/go.sum @@ -2,12 +2,11 @@ 4d63.com/gocheckcompilerdirectives v1.2.1/go.mod h1:yjDJSxmDTtIHHCqX0ufRYZDL6vQtMG7tJdKVeWwsqvs= 4d63.com/gochecknoglobals v0.2.1 h1:1eiorGsgHOFOuoOiJDy2psSrQbRdIHrlge0IJIkUgDc= 4d63.com/gochecknoglobals v0.2.1/go.mod h1:KRE8wtJB3CXCsb1xy421JfTHIIbmT3U5ruxw2Qu8fSU= -cel.dev/expr v0.16.0 h1:yloc84fytn4zmJX2GU3TkXGsaieaV7dQ057Qs4sIG2Y= -cel.dev/expr v0.16.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= +cel.dev/expr v0.23.0 h1:wUb94w6OYQS4uXraxo9U+wUAs9jT47Xvl4iPgAwM2ss= +cel.dev/expr v0.23.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= +dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= github.com/4meepo/tagalign v1.3.4 h1:P51VcvBnf04YkHzjfclN6BbsopfJR5rxs1n+5zHt+w8= github.com/4meepo/tagalign v1.3.4/go.mod h1:M+pnkHH2vG8+qhE5bVc/zeP7HS/j910Fwa9TUSyZVI0= github.com/Abirdcfly/dupword v0.1.1 h1:Bsxe0fIw6OwBtXMIncaTxCLHYO5BB+3mcsR5E8VXloY= @@ -31,8 +30,8 @@ github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+ github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/OpenPeeDeeP/depguard/v2 v2.2.0 h1:vDfG60vDtIuf0MEOhmLlLLSzqaRM8EMcgJPdp74zmpA= github.com/OpenPeeDeeP/depguard/v2 v2.2.0/go.mod h1:CIzddKRvLBC4Au5aYP/i3nyaWQ+ClszLIuVocRiCYFQ= -github.com/a8m/envsubst v1.3.0 h1:GmXKmVssap0YtlU3E230W98RWtWCyIZzjtf1apWWyAg= -github.com/a8m/envsubst v1.3.0/go.mod h1:MVUTQNGQ3tsjOOtKCNd+fl8RzhsXcDvvAEzkhGtlsbY= +github.com/a8m/envsubst v1.4.3 h1:kDF7paGK8QACWYaQo6KtyYBozY2jhQrTuNNuUxQkhJY= +github.com/a8m/envsubst v1.4.3/go.mod h1:4jjHWQlZoaXPoLQUb7H2qT4iLkZDdmEQiOUogdUmqVU= github.com/ahmetb/go-linq v3.0.0+incompatible h1:qQkjjOXKrKOTy83X8OpRmnKflXKQIL/mC/gMVVDMhOA= github.com/ahmetb/go-linq v3.0.0+incompatible/go.mod h1:PFffvbdbtw+QTB0WKRP0cNht7vnCfnGlEpak/DVg5cY= github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= @@ -43,19 +42,14 @@ github.com/alecthomas/participle/v2 v2.1.4 h1:W/H79S8Sat/krZ3el6sQMvMaahJ+XcM9WS github.com/alecthomas/participle/v2 v2.1.4/go.mod h1:8tqVbpTX20Ru4NfYQgZf4mP18eXPTBViyMWiArNEgGI= github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alexkohler/nakedret/v2 v2.0.4 h1:yZuKmjqGi0pSmjGpOC016LtPJysIL0WEUiaXW5SUnNg= github.com/alexkohler/nakedret/v2 v2.0.4/go.mod h1:bF5i0zF2Wo2o4X4USt9ntUWve6JbFv02Ff4vlkmS/VU= github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= -github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= -github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/arl/statsviz v0.6.0 h1:jbW1QJkEYQkufd//4NDYRSNBpwJNrdzPahF7ZmoGdyE= github.com/arl/statsviz v0.6.0/go.mod h1:0toboo+YGSUXDaS4g1D5TVS4dXs7S7YYT5J/qnW2h8s= github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8gerOIVIY= @@ -64,8 +58,6 @@ github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5Fc github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bkielbasa/cyclop v1.2.1 h1:AeF71HZDob1P2/pRm1so9cd1alZnrpyc4q2uP2l0gJY= @@ -84,19 +76,15 @@ github.com/butuzov/ireturn v0.3.0 h1:hTjMqWw3y5JC3kpnC5vXmFJAWI/m31jaCYQqzkS6PL0 github.com/butuzov/ireturn v0.3.0/go.mod h1:A09nIiwiqzN/IoVo9ogpa0Hzi9fex1kd9PSD6edP5ZA= github.com/butuzov/mirror v1.2.0 h1:9YVK1qIjNspaqWutSv8gsge2e/Xpq1eqEkslEUHy5cs= github.com/butuzov/mirror v1.2.0/go.mod h1:DqZZDtzm42wIAIyHXeN8W/qb1EPlb9Qn/if9icBOpdQ= -github.com/cactus/go-statsd-client/v5 v5.0.0/go.mod h1:COEvJ1E+/E2L4q6QE5CkjWPi4eeDw9maJBMIuMPBZbY= github.com/catenacyber/perfsprint v0.7.1 h1:PGW5G/Kxn+YrN04cRAZKC+ZuvlVwolYMrIyyTJ/rMmc= github.com/catenacyber/perfsprint v0.7.1/go.mod h1:/wclWYompEyjUD2FuIIDVKNkqz7IgBIWXIH3V0Zol50= github.com/ccojocar/zxcvbn-go v1.0.2 h1:na/czXU8RrhXO4EZme6eQJLR4PzcGsahsBOAwU6I3Vg= github.com/ccojocar/zxcvbn-go v1.0.2/go.mod h1:g1qkXtUSvHP8lhHp5GrSmTz6uWALGRMQdw6Qnz/hi60= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= -github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8= +github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iyoHGPf5w4= @@ -114,8 +102,8 @@ github.com/ckaznocha/intrange v0.2.0/go.mod h1:r5I7nUlAAG56xmkOpw4XVr16BXhwYTUdc github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20 h1:N+3sFI5GUjRKBi+i0TxYVST9h4Ie192jJWpHvthBBgg= -github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f h1:C5bqEmzEPLsHm9Mv73lSE9e9bKV23aB1vxOsmZrkl3k= +github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -138,19 +126,20 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.13.0 h1:HzkeUz1Knt+3bK+8LG1bxOO/jzWZmdxpwC51i202les= -github.com/envoyproxy/go-control-plane v0.13.0/go.mod h1:GRaKG3dwvFoTg4nj7aXdZnvMg4d7nvT/wl9WgVXn3Q8= +github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= +github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= +github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= -github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= +github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= +github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= -github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= -github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= +github.com/expr-lang/expr v1.17.5 h1:i1WrMvcdLF249nSNlpQZN1S6NXuW9WaOfF5tPi3aw3k= +github.com/expr-lang/expr v1.17.5/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/fasthttp/websocket v1.5.12 h1:e4RGPpWW2HTbL3zV0Y/t7g0ub294LkiuXXUuTOUInlE= github.com/fasthttp/websocket v1.5.12/go.mod h1:I+liyL7/4moHojiOgUOIKEWm9EIxHqxZChS+aMFltyg= -github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/fgprof v0.9.5 h1:8+vR6yu2vvSKn08urWyEuxx75NWPEvybbkBirEpsbVY= @@ -165,37 +154,33 @@ github.com/fullstorydev/grpchan v1.1.1 h1:heQqIJlAv5Cnks9a70GRL2EJke6QQoUB25VGR6 github.com/fullstorydev/grpchan v1.1.1/go.mod h1:f4HpiV8V6htfY/K44GWV1ESQzHBTq7DinhzqQ95lpgc= github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= -github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= -github.com/getkin/kin-openapi v0.124.0 h1:VSFNMB9C9rTKBnQ/fpyDU8ytMTr4dWI9QovSKj9kz/M= -github.com/getkin/kin-openapi v0.124.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM= +github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY= +github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok= +github.com/getkin/kin-openapi v0.132.0 h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7MIRUwk= +github.com/getkin/kin-openapi v0.132.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58= github.com/ghostiam/protogetter v0.3.6 h1:R7qEWaSgFCsy20yYHNIJsU9ZOb8TziSRRxuAOTVKeOk= github.com/ghostiam/protogetter v0.3.6/go.mod h1:7lpeDnEJ1ZjL/YtyoN99ljO4z0pd3H0d18/t2dPBxHw= github.com/go-critic/go-critic v0.11.4 h1:O7kGOCx0NDIni4czrkRIXTnit0mkyKOCePh3My6OyEU= github.com/go-critic/go-critic v0.11.4/go.mod h1:2QAdo4iuLik5S9YG0rT4wcZ8QxwHYkrr6/2MWAiv/vc= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= -github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= -github.com/go-openapi/swag v0.22.8 h1:/9RjDSQ0vbFR+NyjGMkFTsA1IA0fmhKSThmfGZjicbw= -github.com/go-openapi/swag v0.22.8/go.mod h1:6QT22icPLEqAM/z/TChgb4WAveCHF92+2gF0CNjHpPI= +github.com/go-openapi/jsonpointer v0.21.1 h1:whnzv/pNXtK2FbX/W9yJfRmE2gsmkfahjMKB0fZvcic= +github.com/go-openapi/jsonpointer v0.21.1/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk= +github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= +github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn0+wvQ3bZ8b/AU4= -github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4= +github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI= github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -231,25 +216,23 @@ github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJA github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofiber/adaptor/v2 v2.2.1 h1:givE7iViQWlsTR4Jh7tB4iXzrlKBgiraB/yTdHs9Lv4= github.com/gofiber/adaptor/v2 v2.2.1/go.mod h1:AhR16dEqs25W2FY/l8gSj1b51Azg5dtPDmm+pruNOrc= -github.com/gofiber/fiber/v2 v2.52.7 h1:6xJpE4sSqErvMiEZo9ZpJLRSVcpkNBvioeqAHKwhTZY= -github.com/gofiber/fiber/v2 v2.52.7/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= +github.com/gofiber/fiber/v2 v2.52.8 h1:xl4jJQ0BV5EJTA2aWiKw/VddRpHrKeZLF0QPUxqn0x4= +github.com/gofiber/fiber/v2 v2.52.8/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= github.com/gofiber/utils v1.1.0 h1:vdEBpn7AzIUJRhe+CiTOJdUcTg4Q9RK+pEa0KPbLdrM= github.com/gofiber/utils v1.1.0/go.mod h1:poZpsnhBykfnY1Mc0KeEa6mSHrS3dV0+oBWyeQmb2e0= github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= @@ -259,7 +242,6 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= @@ -296,8 +278,8 @@ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/pprof v0.0.0-20240910150728-a0b0bb1d4134 h1:c5FlPPgxOn7kJz3VoPLkQYQXGBS3EklQ4Zfi57uOuqQ= -github.com/google/pprof v0.0.0-20240910150728-a0b0bb1d4134/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/pprof v0.0.0-20250630185457-6e76a2b096b5 h1:xhMrHhTJ6zxu3gA4enFM9MLn9AY7613teCdFnlUVbSQ= +github.com/google/pprof v0.0.0-20250630185457-6e76a2b096b5/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA= github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -305,8 +287,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gordonklaus/ineffassign v0.1.0 h1:y2Gd/9I7MdY1oEIt+n+rowjBNDcLQq3RsH5hwJd0f9s= github.com/gordonklaus/ineffassign v0.1.0/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= -github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= @@ -323,8 +305,8 @@ github.com/grandcat/zeroconf v1.0.0 h1:uHhahLBKqwWBV6WZUDAT71044vwOTL+McW0mBJvo6 github.com/grandcat/zeroconf v1.0.0/go.mod h1:lTKmG1zh86XyCoUeIHSA4FJMBwCJiQmGfcP2PdzytEs= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -337,7 +319,6 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso= github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jgautheron/goconst v1.7.1 h1:VpdAG7Ca7yvvJk5n8dMwQhfEZJh95kl/Hl9S1OI5Jkk= github.com/jgautheron/goconst v1.7.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= @@ -358,18 +339,12 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/k0kubun/pp/v3 v3.2.0 h1:h33hNTZ9nVFNP3u2Fsgz8JXiF5JINoZfFq4SvKJwNcs= -github.com/k0kubun/pp/v3 v3.2.0/go.mod h1:ODtJQbQcIRfAD3N+theGCV1m/CBxweERz2dapdz1EwA= +github.com/k0kubun/pp/v3 v3.4.1 h1:1WdFZDRRqe8UsR61N/2RoOZ3ziTEqgTPVqKrHeb779Y= +github.com/k0kubun/pp/v3 v3.4.1/go.mod h1:+SiNiqKnBfw1Nkj82Lh5bIeKQOAkPy6Xw9CAZUZ8npI= github.com/karamaru-alpha/copyloopvar v1.1.0 h1:x7gNyKcC2vRBO1H2Mks5u1VxQtYvFiym7fCjIP8RPos= github.com/karamaru-alpha/copyloopvar v1.1.0/go.mod h1:u7CIfztblY0jZLOQZgH3oYsJzpC2A7S6u/lfgSXHy0k= github.com/kardianos/service v1.2.2 h1:ZvePhAHfvo0A7Mftk/tEzqEZ7Q4lgnR8sGz4xu1YX60= @@ -382,11 +357,9 @@ github.com/kisielk/errcheck v1.7.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkHAIKE/contextcheck v1.1.5 h1:CdnJh63tcDe53vG+RebdpdXJTc9atMgGqdx8LXxiilg= github.com/kkHAIKE/contextcheck v1.1.5/go.mod h1:O930cpht4xb1YQpK+1+AgoM3mFsvxr7uyFptcnWTYUA= -github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -419,12 +392,13 @@ github.com/macabu/inamedparam v0.1.3 h1:2tk/phHkMlEL/1GNe/Yf6kkR/hkcUdAEY3L0hjYV github.com/macabu/inamedparam v0.1.3/go.mod h1:93FLICAIk/quk7eaPPQvbzihUdn/QkGDwIZEoLtpH6I= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailgun/holster/v4 v4.19.0 h1:BQ390TMYg7CxBTMvZsHbq0fKnfRY7wxNb0uV+ZdwTJk= -github.com/mailgun/holster/v4 v4.19.0/go.mod h1:/5ijRCyMjOHxt69WdAgvB2gyYCapJaJdT/QciGIcu50= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailgun/holster/v4 v4.21.0 h1:EH3fwKEGv56WA5gUwxjOTqZbeILY+oJ/VWEo1xku7t8= +github.com/mailgun/holster/v4 v4.21.0/go.mod h1:G06Q741dj+zsH1WFrmoFvih3LtaocvBIoNtxITdWEtg= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/maragudk/gomponents v0.20.0 h1:lJn5PMYHAKm8jywfk3UiL9tm54ZBkv5R5WktY4S8kxY= -github.com/maragudk/gomponents v0.20.0/go.mod h1:nHkNnZL6ODgMBeJhrZjkMHVvNdoYsfmpKB2/hjdQ0Hg= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= +github.com/maragudk/gomponents v0.22.0 h1:0gNrSDC1nM6w0Vxj5wgGXqV8frDH9UVPE+dEyy4ApPQ= +github.com/maragudk/gomponents v0.22.0/go.mod h1:nHkNnZL6ODgMBeJhrZjkMHVvNdoYsfmpKB2/hjdQ0Hg= github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04= @@ -442,15 +416,13 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mgechev/revive v1.3.9 h1:18Y3R4a2USSBF+QZKFQwVkBROUda7uoBlkEuBD+YD1A= github.com/mgechev/revive v1.3.9/go.mod h1:+uxEIr5UH0TjXWHTno3xh4u7eg6jDpXKzQccA9UGhHU= github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= -github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= +github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE= +github.com/miekg/dns v1.1.66/go.mod h1:jGFzBsSNbJw6z1HYut1RKBKHA9PBdxeHrZG8J+gC2WE= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -458,8 +430,6 @@ github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= @@ -468,8 +438,6 @@ github.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKH github.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhKRf3Swg= @@ -478,8 +446,16 @@ github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= github.com/nunnatsa/ginkgolinter v0.16.2 h1:8iLqHIZvN4fTLDC0Ke9tbSZVcyVHoBs0HIbnVSxfHJk= github.com/nunnatsa/ginkgolinter v0.16.2/go.mod h1:4tWRinDN1FeJgU+iJANW/kz7xKN5nYRAOfJDQUS9dOQ= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 h1:G7ERwszslrBzRxj//JalHPu/3yz+De2J+4aLtSRlHiY= +github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037/go.mod h1:2bpvgLBZEtENV5scfDFEtB/5+1M4hkQhDQrccEJ/qGw= +github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 h1:bQx3WeLcUWy+RletIKwUIt4x3t8n2SxavmoclizMb8c= +github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o= +github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5sM= +github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y= +github.com/olekukonko/ll v0.0.9 h1:Y+1YqDfVkqMWuEQMclsF9HUR5+a82+dxJuL1HHSRpxI= +github.com/olekukonko/ll v0.0.9/go.mod h1:En+sEW0JNETl26+K8eZ6/W4UQ7CYSrrgg/EdIYT2H8g= +github.com/olekukonko/tablewriter v1.0.8 h1:f6wJzHg4QUtJdvrVPKco4QTrAylgaU0+b9br/lJxEiQ= +github.com/olekukonko/tablewriter v1.0.8/go.mod h1:H428M+HzoUXC6JU2Abj9IT9ooRmdq9CxuDmKMtrOCMs= github.com/onsi/ginkgo/v2 v2.20.2 h1:7NVCeyIWROIAheY21RLS+3j2bb52W0W82tkberYytp4= github.com/onsi/ginkgo/v2 v2.20.2/go.mod h1:K9gyxPIlb+aIvnZ8bd9Ak+YP18w3APlR+5coaZoE2ag= github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8= @@ -499,10 +475,9 @@ github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNH github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= -github.com/phuslu/goid v1.0.0 h1:Cgcvd/R54UO1fCtyt+iKXAi+yZQ/KWlAm6MmZNizCLM= -github.com/phuslu/goid v1.0.0/go.mod h1:txc2fUIdrdnn+v9Vq+QpiPQ3dnrXEchjoVDgic+r+L0= +github.com/phuslu/goid v1.0.2 h1:NfPgJ5gJoAhQYCSp6DTbnPvHQYjPBjTyFiBeNu3jvMw= +github.com/phuslu/goid v1.0.2/go.mod h1:txc2fUIdrdnn+v9Vq+QpiPQ3dnrXEchjoVDgic+r+L0= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -514,29 +489,15 @@ github.com/polyfloyd/go-errorlint v1.6.0 h1:tftWV9DE7txiFzPpztTAwyoRLKNj9gpVm2cg github.com/polyfloyd/go-errorlint v1.6.0/go.mod h1:HR7u8wuP1kb1NeN1zqTd1ZMlqUKPPHF+Id4vIPvDqVw= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= -github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= +github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= -github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= +github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= +github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= +github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/pubgo/dix v0.3.21 h1:jtriLYT6srKrxv0KRwic1no0d9ZTMtLx6r3JJxQ5Jvw= github.com/pubgo/dix v0.3.21/go.mod h1:5qHJ7ycvBVw1AUjgYMEsobzx1tggiRs+spgzd4Jglb4= github.com/pubgo/funk v0.5.66 h1:/UNvZITWdUlntSbrIHbfPJqIfAFpqMQ6cv9OGDCXj2k= @@ -555,17 +516,18 @@ github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= -github.com/reugn/go-quartz v0.11.2 h1:+jc54Ji06n/D/endEPmc+CuG/Jc8466nda1oxtFRrks= -github.com/reugn/go-quartz v0.11.2/go.mod h1:no4ktgYbAAuY0E1SchR8cTx1LF4jYIzdgaQhzRPSkpk= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/reugn/go-quartz v0.14.0 h1:KlIBAsOIw1JI8Rc7/f8VrrHBHOr+BiqrTiB35pRe84M= +github.com/reugn/go-quartz v0.14.0/go.mod h1:00DVnBKq2Fxag/HlR9mGXjmHNlMFQ1n/LNM+Fn0jUaE= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= -github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= -github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= +github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryancurrah/gomodguard v1.3.5 h1:cShyguSwUEeC0jS7ylOiG/idnd1TpJ1LfHGpV3oJmPU= github.com/ryancurrah/gomodguard v1.3.5/go.mod h1:MXlEPQRxgfPQa62O8wzK3Ozbkv9Rkqr+wKjSxTdsNJE= @@ -581,17 +543,15 @@ github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tM github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= github.com/sashamelentyev/usestdlibvars v1.27.0 h1:t/3jZpSXtRPRf2xr0m63i32ZrusyurIGT9E5wAvXQnI= github.com/sashamelentyev/usestdlibvars v1.27.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8= -github.com/savsgio/gotils v0.0.0-20240704082632-aef3928b8a38 h1:D0vL7YNisV2yqE55+q0lFuGse6U8lxlg7fYTctlT5Gc= -github.com/savsgio/gotils v0.0.0-20240704082632-aef3928b8a38/go.mod h1:sM7Mt7uEoCeFSCBM+qBrqvEo+/9vdmj19wzp3yzUhmg= +github.com/savsgio/gotils v0.0.0-20250408102913-196191ec6287 h1:qIQ0tWF9vxGtkJa24bR+2i53WBCz1nW/Pc47oVYauC4= +github.com/savsgio/gotils v0.0.0-20250408102913-196191ec6287/go.mod h1:sM7Mt7uEoCeFSCBM+qBrqvEo+/9vdmj19wzp3yzUhmg= github.com/securego/gosec/v2 v2.21.2 h1:deZp5zmYf3TWwU7A7cR2+SolbTpZ3HQiwFqnzQyEl3M= github.com/securego/gosec/v2 v2.21.2/go.mod h1:au33kg78rNseF5PwPnTWhuYBFf534bvJRvOrgZ/bFzU= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= @@ -660,28 +620,26 @@ github.com/tomarrell/wrapcheck/v2 v2.9.0 h1:801U2YCAjLhdN8zhZ/7tdjB3EnAoRlJHt/s+ github.com/tomarrell/wrapcheck/v2 v2.9.0/go.mod h1:g9vNIyhb5/9TQgumxQyOEqDHsmGYcGsVMOx/xGkqdMo= github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= -github.com/twmb/murmur3 v1.1.5 h1:i9OLS9fkuLzBXjt6dptlAEyk58fJsSTXbRg3SgVyqgk= -github.com/twmb/murmur3 v1.1.5/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= -github.com/uber-go/tally/v4 v4.1.16 h1:by2hveWRh/cUReButk6ns1sHK/hiKry7BuOV6iY16XI= -github.com/uber-go/tally/v4 v4.1.16/go.mod h1:RW5DgqsyEPs0lA4b0YNf4zKj7DveKHd73hnO6zVlyW0= +github.com/twmb/murmur3 v1.1.8 h1:8Yt9taO/WN3l08xErzjeschgZU2QSrwm1kclYq+0aRg= +github.com/twmb/murmur3 v1.1.8/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= +github.com/uber-go/tally/v4 v4.1.17 h1:C+U4BKtVDXTszuzU+WH8JVQvRVnaVKxzZrROFyDrvS8= +github.com/uber-go/tally/v4 v4.1.17/go.mod h1:ZdpiHRGSa3z4NIAc1VlEH4SiknR885fOIF08xmS0gaU= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/ultraware/funlen v0.1.0 h1:BuqclbkY6pO+cvxoq7OsktIXZpgBSkYTQtmwhAK81vI= github.com/ultraware/funlen v0.1.0/go.mod h1:XJqmOQja6DpxarLj6Jj1U7JuoS8PvL4nEqDaQhy22p4= github.com/ultraware/whitespace v0.1.1 h1:bTPOGejYFulW3PkcrqkeQwOd6NKOOXvmGD9bo/Gk8VQ= github.com/ultraware/whitespace v0.1.1/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8= -github.com/urfave/cli/v3 v3.3.3 h1:byCBaVdIXuLPIDm5CYZRVG6NvT7tv1ECqdU4YzlEa3I= -github.com/urfave/cli/v3 v3.3.3/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo= +github.com/urfave/cli/v3 v3.3.8 h1:BzolUExliMdet9NlJ/u4m5vHSotJ3PzEqSAZ1oPMa/E= +github.com/urfave/cli/v3 v3.3.8/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo= github.com/uudashr/gocognit v1.1.3 h1:l+a111VcDbKfynh+airAy/DJQKaXh2m9vkoysMPSZyM= github.com/uudashr/gocognit v1.1.3/go.mod h1:aKH8/e8xbTRBwjbCkwZ8qt4l2EpKXl31KMHgSS+lZ2U= 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.58.0 h1:GGB2dWxSbEprU9j0iMJHgdKYJVDyjrOwF9RE59PbRuE= -github.com/valyala/fasthttp v1.58.0/go.mod h1:SYXvHHaFp7QZHGKSHmoMipInhrI5StHrhDTYVEjK/Kw= +github.com/valyala/fasthttp v1.63.0 h1:DisIL8OjB7ul2d7cBaMRcKTQDYnrGy56R4FCiuDP0Ns= +github.com/valyala/fasthttp v1.63.0/go.mod h1:REc4IeW+cAEyLrRPa5A81MIjvz0QE1laoTX2EaPHKJM= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= @@ -717,18 +675,18 @@ go.opentelemetry.io/contrib/zpages v0.62.0 h1:9fUYTLmrK0x/lweM2uM+BOx069jLx8PxVq go.opentelemetry.io/contrib/zpages v0.62.0/go.mod h1:C8kXoiC1Ytvereztus2R+kqdSa6W/MZ8FfS8Zwj+LiM= go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= -go.opentelemetry.io/otel/exporters/prometheus v0.54.0 h1:rFwzp68QMgtzu9PgP3jm9XaMICI6TsofWWPcBDKwlsU= -go.opentelemetry.io/otel/exporters/prometheus v0.54.0/go.mod h1:QyjcV9qDP6VeK5qPyKETvNjmaaEc7+gqjh4SS0ZYzDU= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 h1:SZmDnHcgp3zwlPBS2JX2urGYe/jBKEIT6ZedHRUyCz8= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0/go.mod h1:fdWW0HtZJ7+jNpTKUR0GpMEDP69nR8YBJQxNiVCE3jk= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 h1:cC2yDI3IQd0Udsux7Qmq8ToKAx1XCilTQECZ0KDZyTw= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0/go.mod h1:2PD5Ex6z8CFzDbTdOlwyNIUywRr1DN0ospafJM1wJ+s= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0 h1:zG8GlgXCJQd5BU98C0hZnBbElszTmUgCNCfYneaDL0A= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0/go.mod h1:hOfBCz8kv/wuq73Mx2H2QnWokh/kHZxkh6SNF2bdKtw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI= +go.opentelemetry.io/otel/exporters/prometheus v0.59.0 h1:HHf+wKS6o5++XZhS98wvILrLVgHxjA/AMjqHKes+uzo= +go.opentelemetry.io/otel/exporters/prometheus v0.59.0/go.mod h1:R8GpRXTZrqvXHDEGVH5bF6+JqAZcK8PjJcZ5nGhEWiE= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.37.0 h1:6VjV6Et+1Hd2iLZEPtdV7vie80Yyqf7oikJLjQ/myi0= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.37.0/go.mod h1:u8hcp8ji5gaM/RfcOo8z9NMnf1pVLfVY7lBY2VOGuUU= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0 h1:SNhVp/9q4Go/XHBkQ1/d5u9P/U+L1yaGPoi0x+mStaI= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0/go.mod h1:tx8OOlGH6R4kLV67YaYO44GFXloEjGPZuMjEkaaqIp4= go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= @@ -737,15 +695,14 @@ go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFh go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os= +go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= -go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= +go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= +go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= 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.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= @@ -754,7 +711,6 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -788,12 +744,9 @@ golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -802,7 +755,6 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= @@ -812,31 +764,23 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -845,9 +789,7 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -905,7 +847,6 @@ golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0t golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= @@ -927,18 +868,18 @@ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoA google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY= +google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= +google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -950,9 +891,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -960,13 +900,8 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/validator.v2 v2.0.0-20200605151824-2b28d334fa05/go.mod h1:o4V0GXN9/CAmCsvJ0oXYZvrZOe7syiDZSN1GWGZTGzc= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/fiberbuilder/config.go b/pkg/fiberbuilder/config.go index b76162c02..063adbfbd 100644 --- a/pkg/fiberbuilder/config.go +++ b/pkg/fiberbuilder/config.go @@ -6,8 +6,6 @@ import ( "github.com/gofiber/fiber/v2" "github.com/pubgo/funk/generic" "github.com/pubgo/funk/merge" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/result" "github.com/pubgo/funk/v2/result" ) From 2aaa1a8a62ad4365a6cdae3f25b3685044915140 Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 21 Jul 2025 20:59:03 +0800 Subject: [PATCH 053/142] fix: barry quick fix, 2025-07-21 20:59:03 --- servers/grpcs/server.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/servers/grpcs/server.go b/servers/grpcs/server.go index c28477e0d..98ad357ab 100644 --- a/servers/grpcs/server.go +++ b/servers/grpcs/server.go @@ -287,12 +287,10 @@ func (s *serviceImpl) DixInject( log.Info(). Str("operation", m.Operation). Any("rpc-meta", mux.GetOperation(m.Operation).Meta). - Str("http-method", m.Method). - Str("http-path", "/"+strings.Trim(grpcGatewayApiPrefix, "/")+m.Path). Str("verb", m.Verb). Any("path-vars", m.Vars). Str("extras", fmt.Sprintf("%v", m.Extras)). - Msg("grpc gateway router info") + Msgf("grpc gateway router info: %s %s", m.Method, "/"+strings.Trim(grpcGatewayApiPrefix, "/")+m.Path) } httpServer.Mount("/debug", debug.App()) From 3845c19f399cb7c5652435aae9eacac73b476fd3 Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 11 Aug 2025 15:39:57 +0800 Subject: [PATCH 054/142] fix: barry quick fix, 2025-08-11 15:39:57 --- proto/lava/event.proto | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 proto/lava/event.proto diff --git a/proto/lava/event.proto b/proto/lava/event.proto deleted file mode 100644 index 548b76079..000000000 --- a/proto/lava/event.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -package lava.v1; - -option go_package = "github.com/pubgo/lava/pkg/proto/lavapbv1;lavapbv1"; - -enum EventType { - UNKNOWN = 0; - CREATE = 1; - UPDATE = 2; - DELETE = 3; -} From e9519591bec6cac434be354bf803729e70ae3d3c Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 13 Aug 2025 10:28:47 +0800 Subject: [PATCH 055/142] fix: barry quick fix, 2025-08-13 10:28:47 --- core/supervisor/_.go | 4 ++++ core/supervisor/supervisor.go | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 core/supervisor/_.go diff --git a/core/supervisor/_.go b/core/supervisor/_.go new file mode 100644 index 000000000..426e0e9cc --- /dev/null +++ b/core/supervisor/_.go @@ -0,0 +1,4 @@ +package supervisor + +// "github.com/kardianos/service" +// github.com/thejerf/suture diff --git a/core/supervisor/supervisor.go b/core/supervisor/supervisor.go index 569f34068..69fd323d6 100644 --- a/core/supervisor/supervisor.go +++ b/core/supervisor/supervisor.go @@ -3,7 +3,6 @@ package supervisor import ( "context" - _ "github.com/kardianos/service" "github.com/pubgo/funk/errors" "github.com/pubgo/funk/running" "github.com/thejerf/suture/v4" @@ -34,6 +33,6 @@ func Run(ctx context.Context, services ...suture.Service) error { if errors.Is(err, context.Canceled) { return nil } - + return errors.WrapCaller(err) } From 8393297852c9d9a1ed15f0b4739b2396d33f8ec1 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 13 Aug 2025 11:02:22 +0800 Subject: [PATCH 056/142] fix: barry quick fix, 2025-08-13 11:02:22 --- core/supervisor/supervisor.go | 6 +- core/supervisor/util.go | 234 ++++++++++++++++++++++++++++++++++ servers/tasks/server.go | 2 +- 3 files changed, 240 insertions(+), 2 deletions(-) create mode 100644 core/supervisor/util.go diff --git a/core/supervisor/supervisor.go b/core/supervisor/supervisor.go index 69fd323d6..56deb4999 100644 --- a/core/supervisor/supervisor.go +++ b/core/supervisor/supervisor.go @@ -10,10 +10,14 @@ import ( type Service = suture.Service type Supervisor = suture.Supervisor +type Spec = suture.Spec -func New() *Supervisor { +func Default() *Supervisor { return suture.NewSimple(running.Project) } +func New(name string, spec Spec) *Supervisor { + return suture.New(name, spec) +} func Run(ctx context.Context, services ...suture.Service) error { if len(services) == 0 { diff --git a/core/supervisor/util.go b/core/supervisor/util.go new file mode 100644 index 000000000..d5fd4f9d8 --- /dev/null +++ b/core/supervisor/util.go @@ -0,0 +1,234 @@ +package supervisor + +import ( + "context" + "fmt" + "log/slog" + "sync" + "time" + + "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/log" + "github.com/thejerf/suture/v4" +) + +const ServiceTimeout = 10 * time.Second + +type FatalErr struct { + Err error + Status ExitStatus +} + +// AsFatalErr wraps the given error creating a FatalErr. If the given error +// already is of type FatalErr, it is not wrapped again. +func AsFatalErr(err error, status ExitStatus) (gErr *FatalErr) { + if errors.As(err, &gErr) { + return + } + + return &FatalErr{ + Err: err, + Status: status, + } +} + +func IsFatal(err error) bool { + return errors.As(err, &FatalErr{}) +} + +func (e *FatalErr) Error() string { + return e.Err.Error() +} + +func (e *FatalErr) Unwrap() error { + return e.Err +} + +func (*FatalErr) Is(target error) bool { + return target == suture.ErrTerminateSupervisorTree +} + +// NoRestartErr wraps the given error err (which may be nil) to make sure that +// `errors.Is(err, suture.ErrDoNotRestart) == true`. +func NoRestartErr(err error) error { + if err == nil { + return suture.ErrDoNotRestart + } + return &noRestartErr{err} +} + +type noRestartErr struct { + err error +} + +func (e *noRestartErr) Error() string { + return e.err.Error() +} + +func (e *noRestartErr) Unwrap() error { + return e.err +} + +func (*noRestartErr) Is(target error) bool { + return target == suture.ErrDoNotRestart +} + +type ExitStatus int + +const ( + ExitSuccess ExitStatus = 0 + ExitError ExitStatus = 1 + ExitNoUpgradeAvailable ExitStatus = 2 + ExitRestart ExitStatus = 3 + ExitUpgrade ExitStatus = 4 +) + +func (s ExitStatus) AsInt() int { + return int(s) +} + +type ServiceWithError interface { + suture.Service + fmt.Stringer + Error() error +} + +// AsService wraps the given function to implement suture.Service. In addition +// it keeps track of the returned error and allows querying that error. +func AsService(fn func(ctx context.Context) error, creator string) ServiceWithError { + return &service{ + creator: creator, + serve: fn, + } +} + +type service struct { + creator string + serve func(ctx context.Context) error + err error + mut sync.Mutex +} + +func (s *service) Serve(ctx context.Context) error { + s.mut.Lock() + s.err = nil + s.mut.Unlock() + + // The error returned by serve() may well be a network timeout, which as + // of Go 1.19 is a context.DeadlineExceeded, which Suture interprets as + // a signal to stop the service instead of restarting it. This typically + // isn't what we want, so we make sure to remove the context specific + // error types unless *our* context is actually cancelled. + err := asNonContextError(ctx, s.serve(ctx)) + + s.mut.Lock() + s.err = err + s.mut.Unlock() + + return err +} + +func (s *service) Error() error { + s.mut.Lock() + defer s.mut.Unlock() + return s.err +} + +func (s *service) String() string { + return fmt.Sprintf("Service@%p created by %v", s, s.creator) +} + +type doneService func() + +func (fn doneService) Serve(ctx context.Context) error { + <-ctx.Done() + fn() + return nil +} + +// OnSupervisorDone calls fn when sup is done. +func OnSupervisorDone(sup *suture.Supervisor, fn func()) { + sup.Add(doneService(fn)) +} + +func SpecWithDebugLogger() suture.Spec { + return spec(func(e suture.Event) { log.Debug().Msg(e.String()) }) +} + +func SpecWithInfoLogger() suture.Spec { + return spec(infoEventHook()) +} + +func spec(eventHook suture.EventHook) suture.Spec { + return suture.Spec{ + EventHook: eventHook, + Timeout: ServiceTimeout, + PassThroughPanics: true, + DontPropagateTermination: false, + } +} + +// infoEventHook prints service failures and failures to stop services at level +// info. All other events and identical, consecutive failures are logged at +// debug only. +func infoEventHook() suture.EventHook { + var prevTerminate suture.EventServiceTerminate + return func(ei suture.Event) { + m := ei.Map() + l := slog.Default().With("supervisor", m["supervisor_name"], "service", m["service_name"]) + switch e := ei.(type) { + case suture.EventStopTimeout: + l.Warn("Service failed to terminate in a timely manner") + case suture.EventServicePanic: + l.Error("Caught a service panic, which shouldn't happen") + l.Warn(e.String()) //nolint:sloglint + case suture.EventServiceTerminate: + if e.ServiceName == prevTerminate.ServiceName && e.Err == prevTerminate.Err { + l.Debug("Service failed repeatedly", e.Err) + } else { + l.Warn("Service failed", e.Err) + } + prevTerminate = e + l.Debug(e.String()) // Contains some backoff statistics + case suture.EventBackoff: + l.Debug("Exiting the backoff state") + case suture.EventResume: + l.Debug("Too many service failures - entering the backoff state") + default: + l.Warn("Unknown suture supervisor event", slog.Any("type", e.Type())) + l.Warn(e.String()) //nolint:sloglint + } + } +} + +// asNonContextError returns err, except if it is context.Canceled or +// context.DeadlineExceeded in which case the error will be a simple string +// representation instead. The given context is checked for cancellation, +// and if it is cancelled then that error is returned instead of err. +func asNonContextError(ctx context.Context, err error) error { + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { + return fmt.Errorf("%s (non-context)", err.Error()) + } + return err +} + +func CallWithContext(ctx context.Context, fn func() error) error { + var err error + done := make(chan struct{}) + go func() { + defer close(done) + err = fn() + }() + + select { + case <-done: + return err + case <-ctx.Done(): + return ctx.Err() + } +} diff --git a/servers/tasks/server.go b/servers/tasks/server.go index 76c20eb3f..bd53cb2bd 100644 --- a/servers/tasks/server.go +++ b/servers/tasks/server.go @@ -31,7 +31,7 @@ var _ lava.Server = (*Server)(nil) func New(services ...lava.Server) *Server { assert.If(len(services) == 0, "service is nil") - return &Server{services: services, supervisor: supervisor.New()} + return &Server{services: services, supervisor: supervisor.Default()} } type Server struct { From 828afaf29c9419cc3cdbfd5391f26e42240c9f37 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 13 Aug 2025 21:13:08 +0800 Subject: [PATCH 057/142] fix: barry quick fix, 2025-08-13 21:13:08 --- core/supervisor/manager.go | 103 ++++++++++++++++++++++++++++++++++ core/supervisor/service.go | 45 +++++++++++++++ core/supervisor/supervisor.go | 40 +++---------- core/supervisor/util.go | 74 ------------------------ 4 files changed, 155 insertions(+), 107 deletions(-) create mode 100644 core/supervisor/manager.go create mode 100644 core/supervisor/service.go diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go new file mode 100644 index 000000000..cbedeb7db --- /dev/null +++ b/core/supervisor/manager.go @@ -0,0 +1,103 @@ +package supervisor + +import ( + "context" + + "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/errors/errcheck" + "github.com/pubgo/funk/log" + "github.com/pubgo/funk/running" + "github.com/thejerf/suture/v4" +) + +type serviceWrapper struct { + token suture.ServiceToken + service Service +} + +func DefaultManager() *Manager { + return NewManager(running.Project) +} + +func NewManager(name string) *Manager { + return &Manager{ + supervisor: suture.New(name, SpecWithInfoLogger()), + services: make(map[string]*serviceWrapper), + logger: log.GetLogger(name), + } +} + +type Manager struct { + logger log.Logger + supervisor *Supervisor + services map[string]*serviceWrapper +} + +func (m *Manager) Has(name string) bool { + _, ok := m.services[name] + return ok +} + +func (m *Manager) OnClose(fn func()) { + m.supervisor.Add(doneService(fn)) +} + +func (m *Manager) Add(srv Service) error { + name := srv.Name() + if _, ok := m.services[name]; ok { + return errors.Errorf("service already exists, name=%s", name) + } + + m.logger.Info().Str("name", name).Msg("add service to supervisor") + m.services[name] = &serviceWrapper{service: srv, token: m.supervisor.Add(srv)} + return nil +} + +func (m *Manager) Delete(name string) error { + srv := m.services[name] + if srv == nil { + return nil + } + + m.logger.Info().Str("name", name).Msg("delete service from supervisor") + return errors.Wrapf(m.supervisor.Remove(srv.token), "failed to remove service, name=%s", name) +} + +func (m *Manager) Restart(name string) (gErr error) { + srv := m.services[name] + if srv == nil { + m.logger.Warn().Str("name", name).Msg("service not found, cannot restart") + return nil + } + + if errcheck.Check(&gErr, m.supervisor.Remove(srv.token)) { + return errors.Wrapf(gErr, "failed to remove service, name=%s", name) + } + + m.services[name] = &serviceWrapper{service: srv.service, token: m.supervisor.Add(srv.service)} + m.logger.Info().Str("name", name).Msg("restarting service in supervisor") + + return nil +} + +func (m *Manager) Services() []Service { + var services []Service + for _, srv := range m.services { + services = append(services, srv.service) + } + return services +} + +func (m *Manager) Serve(ctx context.Context) error { + err := m.supervisor.Serve(ctx) + + if errors.Is(err, context.Canceled) { + return nil + } + + return err +} + +func (m *Manager) ServeBackground(ctx context.Context) <-chan error { + return m.supervisor.ServeBackground(ctx) +} diff --git a/core/supervisor/service.go b/core/supervisor/service.go new file mode 100644 index 000000000..52488f4b9 --- /dev/null +++ b/core/supervisor/service.go @@ -0,0 +1,45 @@ +package supervisor + +import ( + "context" + "fmt" + + "github.com/pubgo/funk/errors" +) + +func NewService(name string, fn func(ctx context.Context) error) Service { + return &serviceImpl{ + name: name, + fn: fn, + } +} + +var _ Service = &serviceImpl{} + +type serviceImpl struct { + name string + err error + fn func(ctx context.Context) error +} + +func (s *serviceImpl) Name() string { + return s.name +} + +func (s *serviceImpl) String() string { + return s.name +} + +func (s *serviceImpl) Serve(ctx context.Context) error { + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + + err := s.fn(ctx) + if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { + return fmt.Errorf("non context error, service=%s, err=%w", s.name, err) + } + return err +} diff --git a/core/supervisor/supervisor.go b/core/supervisor/supervisor.go index 56deb4999..4a1734b6b 100644 --- a/core/supervisor/supervisor.go +++ b/core/supervisor/supervisor.go @@ -1,42 +1,16 @@ package supervisor import ( - "context" + "fmt" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/running" "github.com/thejerf/suture/v4" ) -type Service = suture.Service -type Supervisor = suture.Supervisor -type Spec = suture.Spec - -func Default() *Supervisor { - return suture.NewSimple(running.Project) +type Service interface { + Name() string + fmt.Stringer + suture.Service } -func New(name string, spec Spec) *Supervisor { - return suture.New(name, spec) -} - -func Run(ctx context.Context, services ...suture.Service) error { - if len(services) == 0 { - return nil - } - - manager := suture.NewSimple(running.Project) - for _, service := range services { - manager.Add(service) - } - err := manager.Serve(ctx) - if err == nil { - return nil - } - - if errors.Is(err, context.Canceled) { - return nil - } - - return errors.WrapCaller(err) -} +type Supervisor = suture.Supervisor +type Spec = suture.Spec diff --git a/core/supervisor/util.go b/core/supervisor/util.go index d5fd4f9d8..18a665fa7 100644 --- a/core/supervisor/util.go +++ b/core/supervisor/util.go @@ -2,9 +2,7 @@ package supervisor import ( "context" - "fmt" "log/slog" - "sync" "time" "github.com/pubgo/funk/errors" @@ -87,57 +85,6 @@ func (s ExitStatus) AsInt() int { return int(s) } -type ServiceWithError interface { - suture.Service - fmt.Stringer - Error() error -} - -// AsService wraps the given function to implement suture.Service. In addition -// it keeps track of the returned error and allows querying that error. -func AsService(fn func(ctx context.Context) error, creator string) ServiceWithError { - return &service{ - creator: creator, - serve: fn, - } -} - -type service struct { - creator string - serve func(ctx context.Context) error - err error - mut sync.Mutex -} - -func (s *service) Serve(ctx context.Context) error { - s.mut.Lock() - s.err = nil - s.mut.Unlock() - - // The error returned by serve() may well be a network timeout, which as - // of Go 1.19 is a context.DeadlineExceeded, which Suture interprets as - // a signal to stop the service instead of restarting it. This typically - // isn't what we want, so we make sure to remove the context specific - // error types unless *our* context is actually cancelled. - err := asNonContextError(ctx, s.serve(ctx)) - - s.mut.Lock() - s.err = err - s.mut.Unlock() - - return err -} - -func (s *service) Error() error { - s.mut.Lock() - defer s.mut.Unlock() - return s.err -} - -func (s *service) String() string { - return fmt.Sprintf("Service@%p created by %v", s, s.creator) -} - type doneService func() func (fn doneService) Serve(ctx context.Context) error { @@ -146,11 +93,6 @@ func (fn doneService) Serve(ctx context.Context) error { return nil } -// OnSupervisorDone calls fn when sup is done. -func OnSupervisorDone(sup *suture.Supervisor, fn func()) { - sup.Add(doneService(fn)) -} - func SpecWithDebugLogger() suture.Spec { return spec(func(e suture.Event) { log.Debug().Msg(e.String()) }) } @@ -201,22 +143,6 @@ func infoEventHook() suture.EventHook { } } -// asNonContextError returns err, except if it is context.Canceled or -// context.DeadlineExceeded in which case the error will be a simple string -// representation instead. The given context is checked for cancellation, -// and if it is cancelled then that error is returned instead of err. -func asNonContextError(ctx context.Context, err error) error { - select { - case <-ctx.Done(): - return ctx.Err() - default: - } - if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { - return fmt.Errorf("%s (non-context)", err.Error()) - } - return err -} - func CallWithContext(ctx context.Context, fn func() error) error { var err error done := make(chan struct{}) From 09dfbab05324752a290bf8e5e72fa6cb140cf93a Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 13 Aug 2025 21:15:00 +0800 Subject: [PATCH 058/142] fix: barry quick fix, 2025-08-13 21:15:00 --- core/supervisor/manager.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go index cbedeb7db..4e8e9f454 100644 --- a/core/supervisor/manager.go +++ b/core/supervisor/manager.go @@ -56,9 +56,11 @@ func (m *Manager) Add(srv Service) error { func (m *Manager) Delete(name string) error { srv := m.services[name] if srv == nil { + m.logger.Warn().Str("name", name).Msg("service not found, cannot delete") return nil } + defer func() { delete(m.services, name) }() m.logger.Info().Str("name", name).Msg("delete service from supervisor") return errors.Wrapf(m.supervisor.Remove(srv.token), "failed to remove service, name=%s", name) } From c1ed8658e2da15cf6203552ba909acfb88ae99cf Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 13 Aug 2025 21:17:00 +0800 Subject: [PATCH 059/142] fix: barry quick fix, 2025-08-13 21:17:00 --- core/supervisor/manager.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go index 4e8e9f454..c90b6a54b 100644 --- a/core/supervisor/manager.go +++ b/core/supervisor/manager.go @@ -65,6 +65,19 @@ func (m *Manager) Delete(name string) error { return errors.Wrapf(m.supervisor.Remove(srv.token), "failed to remove service, name=%s", name) } +func (m *Manager) RestartAll() (gErr error) { + for name, srv := range m.services { + if errcheck.Check(&gErr, m.supervisor.Remove(srv.token)) { + return errors.Wrapf(gErr, "failed to remove service, name=%s", name) + } + + m.services[name] = &serviceWrapper{service: srv.service, token: m.supervisor.Add(srv.service)} + m.logger.Info().Str("name", name).Msg("restarting service in supervisor") + } + + return nil +} + func (m *Manager) Restart(name string) (gErr error) { srv := m.services[name] if srv == nil { From a7c671708b471d2ef1939d02c6db6d383e667c69 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 13 Aug 2025 21:43:46 +0800 Subject: [PATCH 060/142] fix: barry quick fix, 2025-08-13 21:43:46 --- core/signal/signal.go | 21 ++++++++++++++++++++- core/supervisor/manager.go | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/core/signal/signal.go b/core/signal/signal.go index 038338a75..b0e6cebc3 100644 --- a/core/signal/signal.go +++ b/core/signal/signal.go @@ -7,6 +7,7 @@ import ( "syscall" "github.com/pubgo/funk/log" + "github.com/pubgo/funk/try" ) const Name = "signal" @@ -15,7 +16,7 @@ var logger = log.GetLogger(Name) func getCh() chan os.Signal { ch := make(chan os.Signal, 1) - signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGHUP) + signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGHUP, syscall.SIGUSR1) return ch } @@ -30,3 +31,21 @@ func Context() context.Context { go func() { <-ch; cancel() }() return ctx } + +func WaitRestart(restart func() error) { + sigChan := getCh() + for sig := range sigChan { + logger.Info().Str("signal", sig.String()).Msg("signal trigger notify") + switch sig { + case syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT: + logger.Info().Str("signal", sig.String()).Msg("stop trigger") + return + case syscall.SIGHUP, syscall.SIGUSR1: + logger.Info().Str("signal", sig.String()).Msg("restart trigger") + err := try.Try(restart) + if err != nil { + logger.Error().Err(err).Msg("restart error") + } + } + } +} diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go index c90b6a54b..bd425cd42 100644 --- a/core/supervisor/manager.go +++ b/core/supervisor/manager.go @@ -7,6 +7,7 @@ import ( "github.com/pubgo/funk/errors/errcheck" "github.com/pubgo/funk/log" "github.com/pubgo/funk/running" + "github.com/pubgo/lava/core/signal" "github.com/thejerf/suture/v4" ) @@ -65,7 +66,19 @@ func (m *Manager) Delete(name string) error { return errors.Wrapf(m.supervisor.Remove(srv.token), "failed to remove service, name=%s", name) } -func (m *Manager) RestartAll() (gErr error) { +func (m *Manager) RemoveServices() (gErr error) { + for name, srv := range m.services { + if errcheck.Check(&gErr, m.supervisor.Remove(srv.token)) { + return errors.Wrapf(gErr, "failed to remove service, name=%s", name) + } + m.logger.Info().Str("name", name).Msg("removing service from supervisor") + } + + m.services = make(map[string]*serviceWrapper) + return nil +} + +func (m *Manager) RestartServices() (gErr error) { for name, srv := range m.services { if errcheck.Check(&gErr, m.supervisor.Remove(srv.token)) { return errors.Wrapf(gErr, "failed to remove service, name=%s", name) @@ -78,7 +91,7 @@ func (m *Manager) RestartAll() (gErr error) { return nil } -func (m *Manager) Restart(name string) (gErr error) { +func (m *Manager) RestartService(name string) (gErr error) { srv := m.services[name] if srv == nil { m.logger.Warn().Str("name", name).Msg("service not found, cannot restart") @@ -103,6 +116,24 @@ func (m *Manager) Services() []Service { return services } +func (m *Manager) Run() { + ctx, cancel := context.WithCancel(context.Background()) + + go func() { + err := m.Serve(ctx) + if err != nil { + m.logger.Err(err).Msg("supervisor failed") + } + }() + + defer cancel() + signal.WaitRestart(m.RestartServices) + err := m.RemoveServices() + if err != nil { + m.logger.Err(err).Msg("failed to remove services") + } +} + func (m *Manager) Serve(ctx context.Context) error { err := m.supervisor.Serve(ctx) From c503867f68d216dc86f3a1621dbbc8869eea7322 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 13 Aug 2025 21:49:47 +0800 Subject: [PATCH 061/142] fix: barry quick fix, 2025-08-13 21:49:47 --- core/scheduler/scheduler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index 1a567876f..af315d19f 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -41,8 +41,8 @@ func (s *Scheduler) String() string { } func (s *Scheduler) Serve(ctx context.Context) error { - defer s.stop() s.start() + defer s.stop() <-ctx.Done() return nil } From bf448bc39e475ed8e7d8f5026ab4ee698259361d Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 13 Aug 2025 21:51:41 +0800 Subject: [PATCH 062/142] fix: barry quick fix, 2025-08-13 21:51:40 --- core/scheduler/builder.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index 4481ae768..d9c387adb 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -19,7 +19,7 @@ func New(m lifecycle.Lifecycle, log log.Logger, opts []*Config, routers []Regist if len(opts) > 0 && opts[0] != nil { for _, setting := range opts[0].JobSettings { if _, ok := config[setting.Name]; ok { - panic(fmt.Sprintf("schedule job(%s) exists", setting.Name)) + return nil, fmt.Errorf("schedule job(%s) exists", setting.Name) } config[setting.Name] = setting From 0b09d88e2cf3046b2204976364e812647b42f807 Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 15 Aug 2025 14:53:10 +0800 Subject: [PATCH 063/142] fix: barry quick fix, 2025-08-15 14:53:10 --- core/supervisor/manager.go | 2 +- core/supervisor/service.go | 21 +++++++++++++++------ core/supervisor/supervisor.go | 1 + 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go index bd425cd42..a2fee9f71 100644 --- a/core/supervisor/manager.go +++ b/core/supervisor/manager.go @@ -16,7 +16,7 @@ type serviceWrapper struct { service Service } -func DefaultManager() *Manager { +func Default() *Manager { return NewManager(running.Project) } diff --git a/core/supervisor/service.go b/core/supervisor/service.go index 52488f4b9..f883fcedc 100644 --- a/core/supervisor/service.go +++ b/core/supervisor/service.go @@ -2,9 +2,11 @@ package supervisor import ( "context" + "expvar" "fmt" "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/recovery" ) func NewService(name string, fn func(ctx context.Context) error) Service { @@ -20,6 +22,12 @@ type serviceImpl struct { name string err error fn func(ctx context.Context) error + + restartCounter expvar.Int +} + +func (s *serviceImpl) Error() error { + return s.err } func (s *serviceImpl) Name() string { @@ -30,13 +38,14 @@ func (s *serviceImpl) String() string { return s.name } -func (s *serviceImpl) Serve(ctx context.Context) error { - select { - case <-ctx.Done(): - return ctx.Err() - default: - } +func (s *serviceImpl) Serve(ctx context.Context) (gErr error) { + defer recovery.Recovery(func(err error) { + s.err = err + gErr = err + }) + s.err = nil + s.restartCounter.Add(1) err := s.fn(ctx) if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { return fmt.Errorf("non context error, service=%s, err=%w", s.name, err) diff --git a/core/supervisor/supervisor.go b/core/supervisor/supervisor.go index 4a1734b6b..3987e2b2a 100644 --- a/core/supervisor/supervisor.go +++ b/core/supervisor/supervisor.go @@ -8,6 +8,7 @@ import ( type Service interface { Name() string + Error() error fmt.Stringer suture.Service } From dc6aa65525fe45cb966d6eeb9bbf741442bd3524 Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 15 Aug 2025 15:11:00 +0800 Subject: [PATCH 064/142] fix: barry quick fix, 2025-08-15 15:11:00 --- core/supervisor/service.go | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/core/supervisor/service.go b/core/supervisor/service.go index f883fcedc..1fe768a6d 100644 --- a/core/supervisor/service.go +++ b/core/supervisor/service.go @@ -7,13 +7,12 @@ import ( "github.com/pubgo/funk/errors" "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/vars" ) func NewService(name string, fn func(ctx context.Context) error) Service { - return &serviceImpl{ - name: name, - fn: fn, - } + srv := &serviceImpl{name: name, fn: fn} + return srv.initMetric() } var _ Service = &serviceImpl{} @@ -23,7 +22,15 @@ type serviceImpl struct { err error fn func(ctx context.Context) error - restartCounter expvar.Int + metric *expvar.Map +} + +func (s *serviceImpl) initMetric() *serviceImpl { + metric := new(expvar.Map).Init() + metric.Set(s.name, s) + metric.Set(s.name+".error", vars.Value(func() interface{} { return s.err })) + s.metric = metric + return s } func (s *serviceImpl) Error() error { @@ -45,10 +52,10 @@ func (s *serviceImpl) Serve(ctx context.Context) (gErr error) { }) s.err = nil - s.restartCounter.Add(1) + s.metric.Add("restart", 1) err := s.fn(ctx) if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { - return fmt.Errorf("non context error, service=%s, err=%w", s.name, err) + return fmt.Errorf("non-context error, service=%s meta=%s err=%w", s.name, s.metric.String(), err) } return err } From a71df9c9e144e2a9d55aae3ddaebe8913a14c9ba Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 15 Aug 2025 15:13:19 +0800 Subject: [PATCH 065/142] fix: barry quick fix, 2025-08-15 15:13:19 --- core/supervisor/service.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/supervisor/service.go b/core/supervisor/service.go index 1fe768a6d..ff98ee11e 100644 --- a/core/supervisor/service.go +++ b/core/supervisor/service.go @@ -28,7 +28,12 @@ type serviceImpl struct { func (s *serviceImpl) initMetric() *serviceImpl { metric := new(expvar.Map).Init() metric.Set(s.name, s) - metric.Set(s.name+".error", vars.Value(func() interface{} { return s.err })) + metric.Set(s.name+".error", vars.Value(func() interface{} { + if s.err == nil { + return nil + } + return s.err.Error() + })) s.metric = metric return s } From 2d612584d7b1fc11ec1adde94b592342f8973bd3 Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 15 Aug 2025 15:23:55 +0800 Subject: [PATCH 066/142] fix: barry quick fix, 2025-08-15 15:23:55 --- core/supervisor/errs.go | 79 +++++++++++++++++ core/supervisor/manager.go | 6 +- core/supervisor/spec.go | 61 +++++++++++++ core/supervisor/supervisor.go | 7 ++ core/supervisor/util.go | 160 ---------------------------------- 5 files changed, 152 insertions(+), 161 deletions(-) create mode 100644 core/supervisor/errs.go create mode 100644 core/supervisor/spec.go delete mode 100644 core/supervisor/util.go diff --git a/core/supervisor/errs.go b/core/supervisor/errs.go new file mode 100644 index 000000000..23424652f --- /dev/null +++ b/core/supervisor/errs.go @@ -0,0 +1,79 @@ +package supervisor + +import ( + "github.com/pubgo/funk/errors" + "github.com/thejerf/suture/v4" +) + +type FatalErr struct { + Err error + Status ExitStatus +} + +// AsFatalErr wraps the given error creating a FatalErr. If the given error +// already is of type FatalErr, it is not wrapped again. +func AsFatalErr(err error, status ExitStatus) (gErr *FatalErr) { + if errors.As(err, &gErr) { + return + } + + return &FatalErr{ + Err: err, + Status: status, + } +} + +func IsFatal(err error) bool { + return errors.As(err, &FatalErr{}) +} + +func (e *FatalErr) Error() string { + return e.Err.Error() +} + +func (e *FatalErr) Unwrap() error { + return e.Err +} + +func (*FatalErr) Is(target error) bool { + return target == suture.ErrTerminateSupervisorTree +} + +// NoRestartErr wraps the given error err (which may be nil) to make sure that +// `errors.Is(err, suture.ErrDoNotRestart) == true`. +func NoRestartErr(err error) error { + if err == nil { + return suture.ErrDoNotRestart + } + return &noRestartErr{err} +} + +type noRestartErr struct { + err error +} + +func (e *noRestartErr) Error() string { + return e.err.Error() +} + +func (e *noRestartErr) Unwrap() error { + return e.err +} + +func (*noRestartErr) Is(target error) bool { + return target == suture.ErrDoNotRestart +} + +type ExitStatus int + +const ( + ExitSuccess ExitStatus = 0 + ExitError ExitStatus = 1 + ExitNoUpgradeAvailable ExitStatus = 2 + ExitRestart ExitStatus = 3 + ExitUpgrade ExitStatus = 4 +) + +func (s ExitStatus) AsInt() int { + return int(s) +} diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go index a2fee9f71..61071df71 100644 --- a/core/supervisor/manager.go +++ b/core/supervisor/manager.go @@ -40,7 +40,11 @@ func (m *Manager) Has(name string) bool { } func (m *Manager) OnClose(fn func()) { - m.supervisor.Add(doneService(fn)) + m.supervisor.Add(serviceFn(func(ctx context.Context) error { + <-ctx.Done() + fn() + return nil + })) } func (m *Manager) Add(srv Service) error { diff --git a/core/supervisor/spec.go b/core/supervisor/spec.go new file mode 100644 index 000000000..813944cc8 --- /dev/null +++ b/core/supervisor/spec.go @@ -0,0 +1,61 @@ +package supervisor + +import ( + "log/slog" + "time" + + "github.com/pubgo/funk/log" + "github.com/thejerf/suture/v4" +) + +const ServiceTimeout = 10 * time.Second + +func SpecWithDebugLogger() suture.Spec { + return spec(func(e suture.Event) { log.Debug().Msg(e.String()) }) +} + +func SpecWithInfoLogger() suture.Spec { + return spec(infoEventHook()) +} + +func spec(eventHook suture.EventHook) suture.Spec { + return suture.Spec{ + EventHook: eventHook, + Timeout: ServiceTimeout, + PassThroughPanics: true, + DontPropagateTermination: false, + } +} + +// infoEventHook prints service failures and failures to stop services at level +// info. All other events and identical, consecutive failures are logged at +// debug only. +func infoEventHook() suture.EventHook { + var prevTerminate suture.EventServiceTerminate + return func(ei suture.Event) { + m := ei.Map() + l := slog.Default().With("supervisor", m["supervisor_name"], "service", m["service_name"]) + switch e := ei.(type) { + case suture.EventStopTimeout: + l.Warn("Service failed to terminate in a timely manner") + case suture.EventServicePanic: + l.Error("Caught a service panic, which shouldn't happen") + l.Warn(e.String()) //nolint:sloglint + case suture.EventServiceTerminate: + if e.ServiceName == prevTerminate.ServiceName && e.Err == prevTerminate.Err { + l.Debug("Service failed repeatedly", e.Err) + } else { + l.Warn("Service failed", e.Err) + } + prevTerminate = e + l.Debug(e.String()) // Contains some backoff statistics + case suture.EventBackoff: + l.Debug("Exiting the backoff state") + case suture.EventResume: + l.Debug("Too many service failures - entering the backoff state") + default: + l.Warn("Unknown suture supervisor event", slog.Any("type", e.Type())) + l.Warn(e.String()) //nolint:sloglint + } + } +} diff --git a/core/supervisor/supervisor.go b/core/supervisor/supervisor.go index 3987e2b2a..10837a9fb 100644 --- a/core/supervisor/supervisor.go +++ b/core/supervisor/supervisor.go @@ -1,6 +1,7 @@ package supervisor import ( + "context" "fmt" "github.com/thejerf/suture/v4" @@ -15,3 +16,9 @@ type Service interface { type Supervisor = suture.Supervisor type Spec = suture.Spec + +type serviceFn func(ctx context.Context) error + +func (fn serviceFn) Serve(ctx context.Context) error { + return fn(ctx) +} diff --git a/core/supervisor/util.go b/core/supervisor/util.go deleted file mode 100644 index 18a665fa7..000000000 --- a/core/supervisor/util.go +++ /dev/null @@ -1,160 +0,0 @@ -package supervisor - -import ( - "context" - "log/slog" - "time" - - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/thejerf/suture/v4" -) - -const ServiceTimeout = 10 * time.Second - -type FatalErr struct { - Err error - Status ExitStatus -} - -// AsFatalErr wraps the given error creating a FatalErr. If the given error -// already is of type FatalErr, it is not wrapped again. -func AsFatalErr(err error, status ExitStatus) (gErr *FatalErr) { - if errors.As(err, &gErr) { - return - } - - return &FatalErr{ - Err: err, - Status: status, - } -} - -func IsFatal(err error) bool { - return errors.As(err, &FatalErr{}) -} - -func (e *FatalErr) Error() string { - return e.Err.Error() -} - -func (e *FatalErr) Unwrap() error { - return e.Err -} - -func (*FatalErr) Is(target error) bool { - return target == suture.ErrTerminateSupervisorTree -} - -// NoRestartErr wraps the given error err (which may be nil) to make sure that -// `errors.Is(err, suture.ErrDoNotRestart) == true`. -func NoRestartErr(err error) error { - if err == nil { - return suture.ErrDoNotRestart - } - return &noRestartErr{err} -} - -type noRestartErr struct { - err error -} - -func (e *noRestartErr) Error() string { - return e.err.Error() -} - -func (e *noRestartErr) Unwrap() error { - return e.err -} - -func (*noRestartErr) Is(target error) bool { - return target == suture.ErrDoNotRestart -} - -type ExitStatus int - -const ( - ExitSuccess ExitStatus = 0 - ExitError ExitStatus = 1 - ExitNoUpgradeAvailable ExitStatus = 2 - ExitRestart ExitStatus = 3 - ExitUpgrade ExitStatus = 4 -) - -func (s ExitStatus) AsInt() int { - return int(s) -} - -type doneService func() - -func (fn doneService) Serve(ctx context.Context) error { - <-ctx.Done() - fn() - return nil -} - -func SpecWithDebugLogger() suture.Spec { - return spec(func(e suture.Event) { log.Debug().Msg(e.String()) }) -} - -func SpecWithInfoLogger() suture.Spec { - return spec(infoEventHook()) -} - -func spec(eventHook suture.EventHook) suture.Spec { - return suture.Spec{ - EventHook: eventHook, - Timeout: ServiceTimeout, - PassThroughPanics: true, - DontPropagateTermination: false, - } -} - -// infoEventHook prints service failures and failures to stop services at level -// info. All other events and identical, consecutive failures are logged at -// debug only. -func infoEventHook() suture.EventHook { - var prevTerminate suture.EventServiceTerminate - return func(ei suture.Event) { - m := ei.Map() - l := slog.Default().With("supervisor", m["supervisor_name"], "service", m["service_name"]) - switch e := ei.(type) { - case suture.EventStopTimeout: - l.Warn("Service failed to terminate in a timely manner") - case suture.EventServicePanic: - l.Error("Caught a service panic, which shouldn't happen") - l.Warn(e.String()) //nolint:sloglint - case suture.EventServiceTerminate: - if e.ServiceName == prevTerminate.ServiceName && e.Err == prevTerminate.Err { - l.Debug("Service failed repeatedly", e.Err) - } else { - l.Warn("Service failed", e.Err) - } - prevTerminate = e - l.Debug(e.String()) // Contains some backoff statistics - case suture.EventBackoff: - l.Debug("Exiting the backoff state") - case suture.EventResume: - l.Debug("Too many service failures - entering the backoff state") - default: - l.Warn("Unknown suture supervisor event", slog.Any("type", e.Type())) - l.Warn(e.String()) //nolint:sloglint - } - } -} - -func CallWithContext(ctx context.Context, fn func() error) error { - var err error - done := make(chan struct{}) - go func() { - defer close(done) - err = fn() - }() - - select { - case <-done: - return err - case <-ctx.Done(): - return ctx.Err() - } -} From d350b58304d84fcc4f06c372c7c2bbbb1f039c48 Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 15 Aug 2025 15:25:45 +0800 Subject: [PATCH 067/142] fix: barry quick fix, 2025-08-15 15:25:45 --- core/supervisor/service.go | 7 +++++-- core/supervisor/supervisor.go | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/core/supervisor/service.go b/core/supervisor/service.go index ff98ee11e..52eaa8cb0 100644 --- a/core/supervisor/service.go +++ b/core/supervisor/service.go @@ -11,8 +11,7 @@ import ( ) func NewService(name string, fn func(ctx context.Context) error) Service { - srv := &serviceImpl{name: name, fn: fn} - return srv.initMetric() + return (&serviceImpl{name: name, fn: fn}).initMetric() } var _ Service = &serviceImpl{} @@ -25,6 +24,10 @@ type serviceImpl struct { metric *expvar.Map } +func (s *serviceImpl) Metrics() *expvar.Map { + return s.metric +} + func (s *serviceImpl) initMetric() *serviceImpl { metric := new(expvar.Map).Init() metric.Set(s.name, s) diff --git a/core/supervisor/supervisor.go b/core/supervisor/supervisor.go index 10837a9fb..e70372ccd 100644 --- a/core/supervisor/supervisor.go +++ b/core/supervisor/supervisor.go @@ -2,6 +2,7 @@ package supervisor import ( "context" + "expvar" "fmt" "github.com/thejerf/suture/v4" @@ -12,6 +13,7 @@ type Service interface { Error() error fmt.Stringer suture.Service + Metrics() *expvar.Map } type Supervisor = suture.Supervisor From 911dc449ce66d1e1f38c314c75eca1d1ea042e0a Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 16 Aug 2025 17:18:46 +0800 Subject: [PATCH 068/142] fix: barry@feat/supervisor, 2025-08-16 17:18:46 --- core/supervisor/manager.go | 4 ---- core/supervisor/service.go | 8 ++++++++ go.mod | 4 ++-- go.sum | 9 ++++----- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go index 61071df71..b80a4e7e5 100644 --- a/core/supervisor/manager.go +++ b/core/supervisor/manager.go @@ -132,10 +132,6 @@ func (m *Manager) Run() { defer cancel() signal.WaitRestart(m.RestartServices) - err := m.RemoveServices() - if err != nil { - m.logger.Err(err).Msg("failed to remove services") - } } func (m *Manager) Serve(ctx context.Context) error { diff --git a/core/supervisor/service.go b/core/supervisor/service.go index 52eaa8cb0..02374b242 100644 --- a/core/supervisor/service.go +++ b/core/supervisor/service.go @@ -4,6 +4,7 @@ import ( "context" "expvar" "fmt" + "time" "github.com/pubgo/funk/errors" "github.com/pubgo/funk/recovery" @@ -37,6 +38,7 @@ func (s *serviceImpl) initMetric() *serviceImpl { } return s.err.Error() })) + metric.Add("restart", 0) s.metric = metric return s } @@ -54,10 +56,16 @@ func (s *serviceImpl) String() string { } func (s *serviceImpl) Serve(ctx context.Context) (gErr error) { + now := time.Now() defer recovery.Recovery(func(err error) { s.err = err gErr = err + s.metric.Set("error", vars.Any(err)) }) + defer func() { + s.metric.Set("start_time", vars.Any(now.UTC().String())) + s.metric.Set("online_duration", vars.Any(time.Since(now).String())) + }() s.err = nil s.metric.Add("restart", 1) diff --git a/go.mod b/go.mod index 4ab8020b4..0f8f0c837 100644 --- a/go.mod +++ b/go.mod @@ -49,13 +49,12 @@ require ( github.com/golangci/golangci-lint v1.61.0 github.com/gorilla/websocket v1.5.3 github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 - github.com/kardianos/service v1.2.2 github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 github.com/maragudk/gomponents v0.22.0 github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.65.0 github.com/pubgo/dix v0.3.21 - github.com/pubgo/funk v0.5.66 + github.com/pubgo/funk v0.5.69-alpha.3 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.6.0 github.com/rs/zerolog v1.34.0 @@ -230,6 +229,7 @@ require ( github.com/phuslu/goid v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/polyfloyd/go-errorlint v1.6.0 // indirect + github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/procfs v0.17.0 // indirect github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 // indirect diff --git a/go.sum b/go.sum index 0823ad7a9..67c4ff304 100644 --- a/go.sum +++ b/go.sum @@ -347,8 +347,6 @@ github.com/k0kubun/pp/v3 v3.4.1 h1:1WdFZDRRqe8UsR61N/2RoOZ3ziTEqgTPVqKrHeb779Y= github.com/k0kubun/pp/v3 v3.4.1/go.mod h1:+SiNiqKnBfw1Nkj82Lh5bIeKQOAkPy6Xw9CAZUZ8npI= github.com/karamaru-alpha/copyloopvar v1.1.0 h1:x7gNyKcC2vRBO1H2Mks5u1VxQtYvFiym7fCjIP8RPos= github.com/karamaru-alpha/copyloopvar v1.1.0/go.mod h1:u7CIfztblY0jZLOQZgH3oYsJzpC2A7S6u/lfgSXHy0k= -github.com/kardianos/service v1.2.2 h1:ZvePhAHfvo0A7Mftk/tEzqEZ7Q4lgnR8sGz4xu1YX60= -github.com/kardianos/service v1.2.2/go.mod h1:CIMRFEJVL+0DS1a3Nx06NaMn4Dz63Ng6O7dl0qH0zVM= github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 h1:WjT3fLi9n8YWh/Ih8Q1LHAPsTqGddPcHqscN+PJ3i68= github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19/go.mod h1:hY+WOq6m2FpbvyrI93sMaypsttvaIL5nhVR92dTMUcQ= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -489,6 +487,8 @@ github.com/polyfloyd/go-errorlint v1.6.0 h1:tftWV9DE7txiFzPpztTAwyoRLKNj9gpVm2cg github.com/polyfloyd/go-errorlint v1.6.0/go.mod h1:HR7u8wuP1kb1NeN1zqTd1ZMlqUKPPHF+Id4vIPvDqVw= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= +github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 h1:eR+0HE//Ciyfwy3HC7fjRyKShSJHYoX2Pv7pPshjK/Q= +github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582/go.mod h1:3G3BRKui7nMuDFAZKR/M2hiOLtaOmyukT20g88qRQjI= github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -500,8 +500,8 @@ github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7D github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/pubgo/dix v0.3.21 h1:jtriLYT6srKrxv0KRwic1no0d9ZTMtLx6r3JJxQ5Jvw= github.com/pubgo/dix v0.3.21/go.mod h1:5qHJ7ycvBVw1AUjgYMEsobzx1tggiRs+spgzd4Jglb4= -github.com/pubgo/funk v0.5.66 h1:/UNvZITWdUlntSbrIHbfPJqIfAFpqMQ6cv9OGDCXj2k= -github.com/pubgo/funk v0.5.66/go.mod h1:lM2VGLa+uBEWf8wteXGZyXeo6lkdiRTc+0lwFV88NAk= +github.com/pubgo/funk v0.5.69-alpha.3 h1:qG1Xj5wAt1CDZfNuiaiQaxLHfraCaCvaAOlOoEE/O60= +github.com/pubgo/funk v0.5.69-alpha.3/go.mod h1:2pmwhKjmb6h/IltbdQCGmjn3T+yY7vvY+jNrIJh8mhU= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/pubgo/protobuild v0.0.21 h1:QSwh92QxsD6Mv7kQlowzE7fxtcOm1eMWmgADsD803Js= @@ -782,7 +782,6 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= From 8e2e07fa934eca9c8f4d25fb7cb7323dcfa01518 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 16 Aug 2025 17:41:12 +0800 Subject: [PATCH 069/142] fix: barry@feat/supervisor, 2025-08-16 17:41:12 --- cmds/httpservercmd/cmd.go | 5 +++-- core/signal/signal.go | 6 ++++-- core/supervisor/manager.go | 7 ++++--- core/supervisor/service.go | 13 ++++++++----- lava/service.go | 21 ++++++++++----------- servers/https/server.go | 15 ++++++++++----- servers/tasks/server.go | 4 ++-- 7 files changed, 41 insertions(+), 30 deletions(-) diff --git a/cmds/httpservercmd/cmd.go b/cmds/httpservercmd/cmd.go index e0a610313..d8e152b52 100644 --- a/cmds/httpservercmd/cmd.go +++ b/cmds/httpservercmd/cmd.go @@ -4,7 +4,6 @@ import ( "context" "github.com/pubgo/dix" - "github.com/pubgo/funk/errors" "github.com/pubgo/funk/version" "github.com/urfave/cli/v3" @@ -19,7 +18,9 @@ func New(di *dix.Dix) *cli.Command { Usage: cmdutil.UsageDesc("%s http service", version.Project()), Action: func(ctx context.Context, command *cli.Command) error { srv := dix.Inject(di, https.New()) - return errors.WrapCaller(supervisor.Run(ctx, srv)) + manager := supervisor.Default() + manager.Add() + return manager.Run() }, } } diff --git a/core/signal/signal.go b/core/signal/signal.go index b0e6cebc3..94169e21f 100644 --- a/core/signal/signal.go +++ b/core/signal/signal.go @@ -32,20 +32,22 @@ func Context() context.Context { return ctx } -func WaitRestart(restart func() error) { +func WaitRestart(restart func() error) error { sigChan := getCh() for sig := range sigChan { logger.Info().Str("signal", sig.String()).Msg("signal trigger notify") switch sig { case syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT: logger.Info().Str("signal", sig.String()).Msg("stop trigger") - return + return nil case syscall.SIGHUP, syscall.SIGUSR1: logger.Info().Str("signal", sig.String()).Msg("restart trigger") err := try.Try(restart) if err != nil { logger.Error().Err(err).Msg("restart error") + return err } } } + return nil } diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go index b80a4e7e5..368972113 100644 --- a/core/supervisor/manager.go +++ b/core/supervisor/manager.go @@ -7,6 +7,7 @@ import ( "github.com/pubgo/funk/errors/errcheck" "github.com/pubgo/funk/log" "github.com/pubgo/funk/running" + "github.com/pubgo/funk/try" "github.com/pubgo/lava/core/signal" "github.com/thejerf/suture/v4" ) @@ -120,18 +121,18 @@ func (m *Manager) Services() []Service { return services } -func (m *Manager) Run() { +func (m *Manager) Run() error { ctx, cancel := context.WithCancel(context.Background()) go func() { - err := m.Serve(ctx) + err := try.Try(func() error { return m.Serve(ctx) }) if err != nil { m.logger.Err(err).Msg("supervisor failed") } }() defer cancel() - signal.WaitRestart(m.RestartServices) + return signal.WaitRestart(m.RestartServices) } func (m *Manager) Serve(ctx context.Context) error { diff --git a/core/supervisor/service.go b/core/supervisor/service.go index 02374b242..61125c1e6 100644 --- a/core/supervisor/service.go +++ b/core/supervisor/service.go @@ -7,6 +7,7 @@ import ( "time" "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/log" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/vars" ) @@ -57,18 +58,20 @@ func (s *serviceImpl) String() string { func (s *serviceImpl) Serve(ctx context.Context) (gErr error) { now := time.Now() - defer recovery.Recovery(func(err error) { - s.err = err - gErr = err - s.metric.Set("error", vars.Any(err)) - }) defer func() { + if gErr != nil { + s.err = gErr + } + s.metric.Set("error", vars.Any(s.err)) s.metric.Set("start_time", vars.Any(now.UTC().String())) s.metric.Set("online_duration", vars.Any(time.Since(now).String())) + log.Info(ctx).Msgf("stop service %s", s.name) }() + defer recovery.Err(&gErr) s.err = nil s.metric.Add("restart", 1) + log.Info(ctx).Msgf("start service %s", s.name) err := s.fn(ctx) if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { return fmt.Errorf("non-context error, service=%s meta=%s err=%w", s.name, s.metric.String(), err) diff --git a/lava/service.go b/lava/service.go index 3625a88a1..3fcf82cc4 100644 --- a/lava/service.go +++ b/lava/service.go @@ -2,7 +2,6 @@ package lava import ( "context" - "fmt" "net" "google.golang.org/grpc" @@ -16,17 +15,17 @@ type Close interface { Close(ctx context.Context) error } -type Server interface { - fmt.Stringer +//type Server interface { +// fmt.Stringer +// +// // Serve starts the server, no async. +// Serve(ctx context.Context) error +//} - // Serve starts the server, no async. - Serve(ctx context.Context) error -} - -type Service interface { - Start(ctx context.Context) error - Stop(ctx context.Context) error -} +//type Service interface { +// Start(ctx context.Context) error +// Stop(ctx context.Context) error +//} // Listener provides an interface for starting and stopping the server. type Listener interface { diff --git a/servers/https/server.go b/servers/https/server.go index 6c5499284..61be4d297 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -25,6 +25,7 @@ import ( "github.com/pubgo/lava/core/debug" "github.com/pubgo/lava/core/lifecycle" "github.com/pubgo/lava/core/metrics" + "github.com/pubgo/lava/core/supervisor" "github.com/pubgo/lava/internal/logutil" "github.com/pubgo/lava/internal/middlewares/middleware_accesslog" "github.com/pubgo/lava/internal/middlewares/middleware_metric" @@ -33,14 +34,18 @@ import ( "github.com/pubgo/lava/lava" ) -func New() lava.Server { return newService() } +func New(services []supervisor.Service) *supervisor.Manager { return newService(services) } -func newService() *serviceImpl { - return &serviceImpl{} +func newService(services []supervisor.Service) *supervisor.Manager { + srv := &serviceImpl{} + manager := supervisor.Default() + assert.Exit(manager.Add(supervisor.NewService("http-server", srv.Serve))) + for _, srv := range services { + assert.Exit(manager.Add(srv)) + } + return manager } -var _ lava.Server = (*serviceImpl)(nil) - type serviceImpl struct { lc lifecycle.Getter httpServer *fiber.App diff --git a/servers/tasks/server.go b/servers/tasks/server.go index bd53cb2bd..485b54809 100644 --- a/servers/tasks/server.go +++ b/servers/tasks/server.go @@ -26,9 +26,9 @@ import ( "github.com/pubgo/lava/lava" ) -var _ lava.Server = (*Server)(nil) +//var _ lava.Server = (*Server)(nil) -func New(services ...lava.Server) *Server { +func New(services ...supervisor.Service) *supervisor.Supervisor { assert.If(len(services) == 0, "service is nil") return &Server{services: services, supervisor: supervisor.Default()} From 51b661f29a1c55113556020732351c571dfe5c3b Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 16 Aug 2025 18:04:25 +0800 Subject: [PATCH 070/142] fix: barry@feat/supervisor, 2025-08-16 18:04:25 --- cmds/grpcservercmd/cmd.go | 8 ++++--- cmds/httpservercmd/cmd.go | 6 ++--- cmds/schedulercmd/cmd.go | 7 ++---- cmds/taskcmd/cmd.go | 10 ++++---- core/scheduler/scheduler.go | 3 --- servers/grpcs/server.go | 47 +++++++++++++++++++++++++++++++------ servers/https/server.go | 35 ++++++++++++++++++++++----- servers/tasks/server.go | 36 +++++++++++++++++----------- 8 files changed, 104 insertions(+), 48 deletions(-) diff --git a/cmds/grpcservercmd/cmd.go b/cmds/grpcservercmd/cmd.go index 37bac1dd4..9abc46665 100644 --- a/cmds/grpcservercmd/cmd.go +++ b/cmds/grpcservercmd/cmd.go @@ -4,7 +4,6 @@ import ( "context" "github.com/pubgo/dix" - "github.com/pubgo/funk/errors" "github.com/pubgo/funk/version" "github.com/urfave/cli/v3" @@ -18,8 +17,11 @@ func New(di *dix.Dix) *cli.Command { Name: "grpc", Usage: cmdutil.UsageDesc("grpc service %s(%s)", version.Project(), version.Version()), Action: func(ctx context.Context, command *cli.Command) error { - srv := dix.Inject(di, grpcs.New()) - return errors.WrapCaller(supervisor.Run(ctx, srv)) + dix.Provide(di, grpcs.New) + m := dix.Inject(di, new(struct { + Manager *supervisor.Manager + })) + return m.Manager.Run() }, } } diff --git a/cmds/httpservercmd/cmd.go b/cmds/httpservercmd/cmd.go index d8e152b52..0ae92e239 100644 --- a/cmds/httpservercmd/cmd.go +++ b/cmds/httpservercmd/cmd.go @@ -7,7 +7,6 @@ import ( "github.com/pubgo/funk/version" "github.com/urfave/cli/v3" - "github.com/pubgo/lava/core/supervisor" "github.com/pubgo/lava/pkg/cmdutil" "github.com/pubgo/lava/servers/https" ) @@ -17,9 +16,8 @@ func New(di *dix.Dix) *cli.Command { Name: "http", Usage: cmdutil.UsageDesc("%s http service", version.Project()), Action: func(ctx context.Context, command *cli.Command) error { - srv := dix.Inject(di, https.New()) - manager := supervisor.Default() - manager.Add() + params := dix.Inject(di, https.Params{}) + manager := https.New(params) return manager.Run() }, } diff --git a/cmds/schedulercmd/cmd.go b/cmds/schedulercmd/cmd.go index c1064176b..f3f029522 100644 --- a/cmds/schedulercmd/cmd.go +++ b/cmds/schedulercmd/cmd.go @@ -4,14 +4,12 @@ import ( "context" "github.com/pubgo/dix" - "github.com/pubgo/funk/errors" "github.com/pubgo/funk/version" "github.com/urfave/cli/v3" "github.com/pubgo/lava/core/scheduler" "github.com/pubgo/lava/core/supervisor" "github.com/pubgo/lava/pkg/cmdutil" - "github.com/pubgo/lava/servers/tasks" ) func New(di *dix.Dix) *cli.Command { @@ -19,12 +17,11 @@ func New(di *dix.Dix) *cli.Command { Name: "scheduler", Usage: cmdutil.UsageDesc("crontab scheduler service %s(%s)", version.Project(), version.Version()), Action: func(ctx context.Context, command *cli.Command) error { - s := dix.Inject(di, new(struct { + _ = dix.Inject(di, new(struct { Scheduler *scheduler.Scheduler })) - srv := dix.Inject(di, tasks.New(s.Scheduler)) - return errors.WrapCaller(supervisor.Run(ctx, srv)) + return supervisor.Default().Run() }, } } diff --git a/cmds/taskcmd/cmd.go b/cmds/taskcmd/cmd.go index 09978a27c..94a3e6a50 100644 --- a/cmds/taskcmd/cmd.go +++ b/cmds/taskcmd/cmd.go @@ -4,23 +4,21 @@ import ( "context" "github.com/pubgo/dix" - "github.com/pubgo/funk/errors" "github.com/pubgo/funk/version" "github.com/urfave/cli/v3" - "github.com/pubgo/lava/core/supervisor" - "github.com/pubgo/lava/lava" "github.com/pubgo/lava/pkg/cmdutil" "github.com/pubgo/lava/servers/tasks" ) -func New(di *dix.Dix, services []lava.Server) *cli.Command { +func New(di *dix.Dix) *cli.Command { return &cli.Command{ Name: "task", Usage: cmdutil.UsageDesc("async task service %s(%s)", version.Project(), version.Version()), Action: func(ctx context.Context, command *cli.Command) error { - srv := dix.Inject(di, tasks.New(services...)) - return errors.WrapCaller(supervisor.Run(ctx, srv)) + params := dix.Inject(di, tasks.Params{}) + manager := tasks.New(params) + return manager.Run() }, } } diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index af315d19f..26f5f072b 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -14,11 +14,8 @@ import ( "github.com/reugn/go-quartz/quartz" "github.com/pubgo/lava/core/metrics" - "github.com/pubgo/lava/lava" ) -var _ lava.Server = (*Scheduler)(nil) - type job struct { key string cron string diff --git a/servers/grpcs/server.go b/servers/grpcs/server.go index 98ad357ab..e3cc824ba 100644 --- a/servers/grpcs/server.go +++ b/servers/grpcs/server.go @@ -32,6 +32,7 @@ import ( "github.com/pubgo/lava/core/debug" "github.com/pubgo/lava/core/lifecycle" "github.com/pubgo/lava/core/metrics" + "github.com/pubgo/lava/core/supervisor" "github.com/pubgo/lava/internal/consts" "github.com/pubgo/lava/internal/logutil" "github.com/pubgo/lava/internal/middlewares/middleware_accesslog" @@ -43,16 +44,48 @@ import ( "github.com/pubgo/lava/pkg/httputil" ) -func New() lava.Server { return newService() } +type Params struct { + Services []supervisor.Service + + GrpcRouters []lava.GrpcRouter + HttpRouters []lava.HttpRouter + GrpcHttpRouters []lava.GrpcHttpRouter + GrpcProxy []lava.GrpcProxy + DixMiddlewares []lava.Middleware + GetLifecycle lifecycle.Getter + Lifecycle lifecycle.Lifecycle + Metric metrics.Metric + Log log.Logger + Conf *Config + Gw []*gateway.Mux +} -func newService() *serviceImpl { - return &serviceImpl{ - cc: new(inprocgrpc.Channel), +func New(params Params) *supervisor.Manager { return newService(params) } + +func newService(params Params) *supervisor.Manager { + s := &serviceImpl{cc: new(inprocgrpc.Channel)} + s.init( + params.GrpcRouters, + params.HttpRouters, + params.GrpcHttpRouters, + params.GrpcProxy, + params.DixMiddlewares, + params.GetLifecycle, + params.Lifecycle, + params.Metric, + params.Log, + params.Conf, + params.Gw, + ) + + manager := supervisor.Default() + assert.Exit(manager.Add(supervisor.NewService("grpc-server", s.Serve))) + for _, srv := range params.Services { + assert.Exit(manager.Add(srv)) } + return manager } -var _ lava.Server = (*serviceImpl)(nil) - type serviceImpl struct { lc lifecycle.Getter httpServer *fiber.App @@ -78,7 +111,7 @@ func (s *serviceImpl) Serve(ctx context.Context) (err error) { return nil } -func (s *serviceImpl) DixInject( +func (s *serviceImpl) init( grpcRouters []lava.GrpcRouter, httpRouters []lava.HttpRouter, grpcHttpRouters []lava.GrpcHttpRouter, diff --git a/servers/https/server.go b/servers/https/server.go index 61be4d297..2c230190e 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -34,13 +34,36 @@ import ( "github.com/pubgo/lava/lava" ) -func New(services []supervisor.Service) *supervisor.Manager { return newService(services) } +type Params struct { + Services []supervisor.Service + Handlers []lava.HttpRouter + Middlewares []lava.Middleware + GetLifecycle lifecycle.Getter + Lifecycle lifecycle.Lifecycle + M metrics.Metric + Log log.Logger + Cfg *Config + Docs []*opendoc.Swagger +} + +func New(params Params) *supervisor.Manager { return newService(params) } + +func newService(params Params) *supervisor.Manager { + s := &serviceImpl{} + s.init( + params.Handlers, + params.Middlewares, + params.GetLifecycle, + params.Lifecycle, + params.M, + params.Log, + params.Cfg, + params.Docs, + ) -func newService(services []supervisor.Service) *supervisor.Manager { - srv := &serviceImpl{} manager := supervisor.Default() - assert.Exit(manager.Add(supervisor.NewService("http-server", srv.Serve))) - for _, srv := range services { + assert.Exit(manager.Add(supervisor.NewService("http-server", s.Serve))) + for _, srv := range params.Services { assert.Exit(manager.Add(srv)) } return manager @@ -63,7 +86,7 @@ func (s *serviceImpl) Serve(ctx context.Context) error { return nil } -func (s *serviceImpl) DixInject( +func (s *serviceImpl) init( handlers []lava.HttpRouter, middlewares []lava.Middleware, getLifecycle lifecycle.Getter, diff --git a/servers/tasks/server.go b/servers/tasks/server.go index 485b54809..4d8f0a090 100644 --- a/servers/tasks/server.go +++ b/servers/tasks/server.go @@ -23,20 +23,34 @@ import ( "github.com/pubgo/lava/core/lifecycle" "github.com/pubgo/lava/core/supervisor" "github.com/pubgo/lava/internal/logutil" - "github.com/pubgo/lava/lava" ) -//var _ lava.Server = (*Server)(nil) +type Params struct { + Services []supervisor.Service + GetLifecycle lifecycle.Getter + Log log.Logger + Conf []*Config +} + +func New(params Params) *supervisor.Manager { + assert.If(len(params.Services) == 0, "services is nil") -func New(services ...supervisor.Service) *supervisor.Supervisor { - assert.If(len(services) == 0, "service is nil") + s := &Server{} + s.init( + params.GetLifecycle, + params.Log, + params.Conf, + ) - return &Server{services: services, supervisor: supervisor.Default()} + manager := supervisor.Default() + assert.Exit(manager.Add(supervisor.NewService("task", s.Serve))) + for _, srv := range params.Services { + assert.Exit(manager.Add(srv)) + } + return manager } type Server struct { - supervisor *supervisor.Supervisor - services []lava.Server log log.Logger lc lifecycle.Getter httpServer *fiber.App @@ -54,7 +68,7 @@ func (s *Server) Serve(ctx context.Context) error { return nil } -func (s *Server) DixInject( +func (s *Server) init( getLifecycle lifecycle.Getter, log log.Logger, conf []*Config, @@ -119,12 +133,6 @@ func (s *Server) start(ctx context.Context) { return nil }) - async.GoSafe(func() error { - for _, srv := range s.services { - s.supervisor.Add(srv) - } - return s.supervisor.Serve(ctx) - }) return nil }) From 2190504a27d096b81399f2e03c602cd294a1d725 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 16 Aug 2025 18:16:37 +0800 Subject: [PATCH 071/142] fix: barry@feat/supervisor, 2025-08-16 18:16:37 --- core/scheduler/interface.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/core/scheduler/interface.go b/core/scheduler/interface.go index 5da5b5d10..0d6874e6b 100644 --- a/core/scheduler/interface.go +++ b/core/scheduler/interface.go @@ -12,7 +12,10 @@ type Register interface { } type Registry interface { - Once(name string, delay time.Duration, fn JobFunc) - Every(name string, dur time.Duration, fn JobFunc) - Cron(name, expr string, fn JobFunc) + Once(name string, delay time.Duration, fn JobFunc, opts ...Options) + Every(name string, dur time.Duration, fn JobFunc, opts ...Options) + Cron(name, expr string, fn JobFunc, opts ...Options) +} + +type Options struct { } From d902d4720669379075aec2dc235027cbe22d048d Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 16 Aug 2025 18:17:17 +0800 Subject: [PATCH 072/142] fix: barry@feat/supervisor, 2025-08-16 18:17:17 --- core/scheduler/scheduler.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index 26f5f072b..a1fca2221 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -72,7 +72,7 @@ func (s *Scheduler) checkJobExists(name string, fn JobFunc) error { return nil } -func (s *Scheduler) Once(name string, delay time.Duration, fn JobFunc) { +func (s *Scheduler) Once(name string, delay time.Duration, fn JobFunc, opts ...Options) { assert.Must(s.checkJobExists(name, fn)) s.log.WithCallerSkip(1).Info(). @@ -82,7 +82,7 @@ func (s *Scheduler) Once(name string, delay time.Duration, fn JobFunc) { do(s, job{dur: delay, key: name, once: true}, fn) } -func (s *Scheduler) Every(name string, dur time.Duration, fn JobFunc) { +func (s *Scheduler) Every(name string, dur time.Duration, fn JobFunc, opts ...Options) { assert.Must(s.checkJobExists(name, fn)) s.log.WithCallerSkip(1).Info(). @@ -92,7 +92,7 @@ func (s *Scheduler) Every(name string, dur time.Duration, fn JobFunc) { do(s, job{dur: dur, key: name}, fn) } -func (s *Scheduler) Cron(name, expr string, fn JobFunc) { +func (s *Scheduler) Cron(name, expr string, fn JobFunc, opts ...Options) { assert.Must(s.checkJobExists(name, fn)) s.log.WithCallerSkip(1).Info(). From 24f3012768495f2c4130c1a6af5294dbf6d1e7c3 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 16 Aug 2025 18:19:59 +0800 Subject: [PATCH 073/142] fix: barry@feat/supervisor, 2025-08-16 18:19:59 --- core/scheduler/config.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/scheduler/config.go b/core/scheduler/config.go index 208ecdbd6..d52da677c 100644 --- a/core/scheduler/config.go +++ b/core/scheduler/config.go @@ -13,3 +13,7 @@ type Config struct { Timeout string `yaml:"timeout"` JobSettings []JobSetting `yaml:"jobs"` } + +type JobsConfigLoader struct { + Scheduler *Config `yaml:"scheduler"` +} From 550927794d26ec089a32e768a90a22aae4c789c0 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 16 Aug 2025 23:25:51 +0800 Subject: [PATCH 074/142] fix: barry quick fix, 2025-08-16 23:25:51 --- core/scheduler/builder.go | 45 +++++++++++----- core/scheduler/config.go | 102 +++++++++++++++++++++++++++++++++-- core/scheduler/interface.go | 11 ++-- core/scheduler/job.go | 105 ++++++++++++++++++++++++++++++++++++ core/scheduler/scheduler.go | 47 +++------------- core/scheduler/util.go | 38 ------------- core/signal/signal.go | 14 +++-- core/supervisor/manager.go | 17 ++++-- 8 files changed, 270 insertions(+), 109 deletions(-) create mode 100644 core/scheduler/job.go delete mode 100644 core/scheduler/util.go diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index d9c387adb..43925e514 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -3,34 +3,55 @@ package scheduler import ( "context" "fmt" - "github.com/pubgo/funk/log" "github.com/pubgo/funk/v2/result" "github.com/reugn/go-quartz/quartz" "github.com/pubgo/lava/core/lifecycle" "github.com/pubgo/lava/core/metrics" + "github.com/pubgo/lava/core/supervisor" ) const Name = "scheduler" -func New(m lifecycle.Lifecycle, log log.Logger, opts []*Config, routers []Register, metric metrics.Metric) (*Scheduler, error) { - config := make(map[string]JobSetting) - if len(opts) > 0 && opts[0] != nil { - for _, setting := range opts[0].JobSettings { - if _, ok := config[setting.Name]; ok { - return nil, fmt.Errorf("schedule job(%s) exists", setting.Name) - } +type Params struct { + M lifecycle.Lifecycle + Log log.Logger + Configs []*Config + Routers []Register + Metric metrics.Metric +} + +func NewService(params Params) (supervisor.Service, error) { + s, err := New( + params.M, + params.Log, + params.Configs, + params.Routers, + params.Metric, + ) + if err != nil { + return nil, err + } + return supervisor.NewService(Name, s.Serve), err +} + +func New(m lifecycle.Lifecycle, log log.Logger, opts []*Config, routers []Register, metric metrics.Metric) (_ *Scheduler, gErr error) { + config := createConfig(opts).Unwrap(&gErr) + if gErr != nil { + return nil, fmt.Errorf("failed to create config, err:%w", gErr) + } - config[setting.Name] = setting - } + scheduler := result.Wrap(quartz.NewStdScheduler()).Unwrap(&gErr) + if gErr != nil { + return nil, fmt.Errorf("failed to create scheduler, err:%w", gErr) } ctx, cancel := context.WithCancel(context.Background()) quart := &Scheduler{ metric: metric, - config: config, - scheduler: result.Wrap(quartz.NewStdScheduler()).Must(), + configMap: config, + scheduler: scheduler, log: log.WithName(Name), ctx: ctx, cancel: cancel, diff --git a/core/scheduler/config.go b/core/scheduler/config.go index d52da677c..c35cbe0a4 100644 --- a/core/scheduler/config.go +++ b/core/scheduler/config.go @@ -1,12 +1,95 @@ package scheduler +import ( + "fmt" + "time" + + "github.com/pubgo/funk/v2/result" + "github.com/samber/lo" +) + +func createConfig(opts []*Config) (r result.Result[map[string]*JobSetting]) { + configMap := make(map[string]*JobSetting) + if len(opts) > 0 && opts[0] != nil { + for _, setting := range opts[0].JobSettings { + if setting.Name == "" { + return r.WithErrorf("schedule job name is empty") + } + + if _, ok := configMap[setting.Name]; ok { + return r.WithErrorf("schedule job(%s) exists", setting.Name) + } + + configMap[setting.Name] = initConfig(setting.Name, lo.ToPtr(setting)). + MapErr(func(err error) error { + return fmt.Errorf("schedule job(%s) error: %w", setting.Name, err) + }). + UnwrapErr(&r) + if r.IsErr() { + return + } + } + } + return r.WithValue(configMap) +} + +func initConfig(name string, cfg *JobSetting) (r result.Result[*JobSetting]) { + if cfg == nil { + cfg = &JobSetting{Name: name} + } + + if cfg.Disabled == nil { + cfg.Disabled = lo.ToPtr(false) + } + + if cfg.Timeout == nil { + cfg.Timeout = lo.ToPtr(time.Second * 10) + } + + if cfg.RetryInterval == nil { + cfg.RetryInterval = lo.ToPtr(time.Second) + } + + if cfg.MaxRetries == nil { + cfg.MaxRetries = lo.ToPtr(0) + } + + if cfg.Replace == nil { + cfg.Replace = lo.ToPtr(false) + } + + if cfg.Location == nil { + cfg.Location = lo.ToPtr(time.UTC.String()) + cfg.location = result.Wrap(time.LoadLocation(lo.FromPtr(cfg.Location))).UnwrapErr(&r) + } + + return r.WithValue(cfg) +} + type JobSetting struct { - Disabled bool `yaml:"disabled"` - Schedule string `yaml:"schedule"` - Name string `yaml:"name"` - Timeout string `yaml:"timeout"` + Disabled *bool `yaml:"disabled"` + Name string `yaml:"name"` + Timeout *time.Duration `yaml:"timeout"` + + // MaxRetries is the maximum number of retries before aborting the + // current job execution. + // Default: 0. + MaxRetries *int `yaml:"max_retries"` + + // RetryInterval is the fixed time interval between retry attempts. + // Default: 1 second. + RetryInterval *time.Duration `yaml:"retry_interval"` - // quartz.JobDetailOptions + // Replace indicates whether the job should replace an existing job + // with the same key. + // Default: false. + Replace *bool `yaml:"replace"` + + Location *string `yaml:"location"` + + location *time.Location + + //quartz.JobDetailOptions } type Config struct { @@ -17,3 +100,12 @@ type Config struct { type JobsConfigLoader struct { Scheduler *Config `yaml:"scheduler"` } + +type JobMetadata struct { + Name string + Timeout time.Duration + MaxRetries int + RetryInterval time.Duration + Replace bool + Location *time.Location +} diff --git a/core/scheduler/interface.go b/core/scheduler/interface.go index 0d6874e6b..463f49151 100644 --- a/core/scheduler/interface.go +++ b/core/scheduler/interface.go @@ -5,17 +5,14 @@ import ( "time" ) -type JobFunc func(ctx context.Context, name string) error +type JobFunc func(ctx context.Context, name string, metadata *JobMetadata) error type Register interface { RegisterCrontabScheduler(reg Registry) } type Registry interface { - Once(name string, delay time.Duration, fn JobFunc, opts ...Options) - Every(name string, dur time.Duration, fn JobFunc, opts ...Options) - Cron(name, expr string, fn JobFunc, opts ...Options) -} - -type Options struct { + Once(name string, delay time.Duration, fn JobFunc) + Every(name string, dur time.Duration, fn JobFunc) + Cron(name, expr string, fn JobFunc) } diff --git a/core/scheduler/job.go b/core/scheduler/job.go new file mode 100644 index 000000000..01ff7405f --- /dev/null +++ b/core/scheduler/job.go @@ -0,0 +1,105 @@ +package scheduler + +import ( + "context" + "time" + + "github.com/pubgo/funk/generic" + "github.com/pubgo/funk/log" + "github.com/pubgo/funk/try" + "github.com/pubgo/funk/v2/result" + "github.com/reugn/go-quartz/quartz" + "github.com/samber/lo" + + "github.com/pubgo/lava/core/metrics" +) + +type namedJob struct { + s *Scheduler + name string + fn JobFunc + log log.Logger + setting *JobSetting +} + +func (t namedJob) Description() string { return t.name } +func (t namedJob) Execute(ctx context.Context) error { + start := time.Now() + metadata := JobMetadata{ + Name: t.setting.Name, + Replace: lo.FromPtr(t.setting.Replace), + MaxRetries: lo.FromPtr(t.setting.MaxRetries), + RetryInterval: lo.FromPtr(t.setting.RetryInterval), + Timeout: lo.FromPtr(t.setting.Timeout), + Location: t.setting.location, + } + err := try.Try(func() error { + ctx, cancel := context.WithTimeout(ctx, lo.FromPtr(t.setting.Timeout)) + defer cancel() + + return t.fn(ctx, t.name, &metadata) + }) + + cost := float64(time.Since(start).Milliseconds()) + t.s.metric.Tagged(metrics.Tags{"job_name": t.name}).Gauge("job_cost_ms").Update(cost) + + logger := generic.Ternary(generic.IsNil(err), t.log.Info(), t.log.Err(err)) + logger. + Float32("job_cost_ms", float32(cost)). + Str("job_name", t.name). + Msg("exec scheduler job") + + return err +} + +func registerJob(s *Scheduler, job jobWrapper, fn JobFunc) (r result.Error) { + s.configMap[job.key] = initConfig(job.key, s.configMap[job.key]).UnwrapErr(&r) + if r.IsErr() { + return + } + + setting := s.configMap[job.key] + trigger := getTrigger(job, setting.location).UnwrapErr(&r) + if r.IsErr() { + return + } + + if fn == nil { + return result.ErrorOf("schedule job(%s) error: %s", job.key, "fn is nil") + } + + jobOpt := &quartz.JobDetailOptions{ + MaxRetries: lo.FromPtr(setting.MaxRetries), + RetryInterval: lo.FromPtr(setting.RetryInterval), + Replace: lo.FromPtr(setting.Replace), + Suspended: false, + } + return result.ErrOf(s.scheduler.ScheduleJob( + quartz.NewJobDetailWithOptions( + &namedJob{s: s, name: job.key, fn: fn, log: s.log, setting: setting}, + quartz.NewJobKey(job.key), + jobOpt, + ), + trigger, + )) +} + +func getTrigger(j jobWrapper, location *time.Location) (r result.Result[quartz.Trigger]) { + if j.once { + return r.WithValue(quartz.NewRunOnceTrigger(j.dur)) + } + + if j.cron != "" { + trigger, err := quartz.NewCronTriggerWithLoc(j.cron, location) + if err != nil { + return r.WithErrorf("cron-expr:%s, err:%s", j.cron, err.Error()) + } + return r.WithValue(trigger) + } + + if j.dur != 0 { + return r.WithValue(quartz.NewSimpleTrigger(j.dur)) + } + + return r.WithErrorf("please init dur or cron") +} diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index a1fca2221..9d89872a5 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -7,16 +7,14 @@ import ( "github.com/pubgo/funk/assert" "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/generic" "github.com/pubgo/funk/log" "github.com/pubgo/funk/stack" - "github.com/pubgo/funk/try" "github.com/reugn/go-quartz/quartz" "github.com/pubgo/lava/core/metrics" ) -type job struct { +type jobWrapper struct { key string cron string dur time.Duration @@ -25,7 +23,7 @@ type job struct { type Scheduler struct { metric metrics.Metric - config map[string]JobSetting + configMap map[string]*JobSetting scheduler quartz.Scheduler log log.Logger cancel context.CancelFunc @@ -72,61 +70,32 @@ func (s *Scheduler) checkJobExists(name string, fn JobFunc) error { return nil } -func (s *Scheduler) Once(name string, delay time.Duration, fn JobFunc, opts ...Options) { +func (s *Scheduler) Once(name string, delay time.Duration, fn JobFunc) { assert.Must(s.checkJobExists(name, fn)) s.log.WithCallerSkip(1).Info(). Str("name", name). Str("delay", delay.String()). Msg("register once scheduler") - do(s, job{dur: delay, key: name, once: true}, fn) + registerJob(s, jobWrapper{dur: delay, key: name, once: true}, fn) } -func (s *Scheduler) Every(name string, dur time.Duration, fn JobFunc, opts ...Options) { +func (s *Scheduler) Every(name string, dur time.Duration, fn JobFunc) { assert.Must(s.checkJobExists(name, fn)) s.log.WithCallerSkip(1).Info(). Str("name", name). Str("dur", dur.String()). Msg("register periodic scheduler") - do(s, job{dur: dur, key: name}, fn) + registerJob(s, jobWrapper{dur: dur, key: name}, fn) } -func (s *Scheduler) Cron(name, expr string, fn JobFunc, opts ...Options) { +func (s *Scheduler) Cron(name, expr string, fn JobFunc) { assert.Must(s.checkJobExists(name, fn)) s.log.WithCallerSkip(1).Info(). Str("name", name). Str("expr", expr). Msg("register cron scheduler") - do(s, job{cron: expr, key: name}, fn) -} - -type namedJob struct { - s *Scheduler - name string - fn JobFunc - log log.Logger -} - -func (t namedJob) Description() string { return t.name } -func (t namedJob) Execute(ctx context.Context) error { - start := time.Now() - err := try.Try(func() error { - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - return t.fn(ctx, t.name) - }) - - cost := float64(time.Since(start).Milliseconds()) - t.s.metric.Tagged(metrics.Tags{"job_name": t.name}).Gauge("job_cost_ms").Update(cost) - - logger := generic.Ternary(generic.IsNil(err), t.log.Info(), t.log.Err(err)) - logger. - Float32("job_cost_ms", float32(cost)). - Str("job_name", t.name). - Msg("exec scheduler job") - - return err + registerJob(s, jobWrapper{cron: expr, key: name}, fn) } diff --git a/core/scheduler/util.go b/core/scheduler/util.go deleted file mode 100644 index 3080e770e..000000000 --- a/core/scheduler/util.go +++ /dev/null @@ -1,38 +0,0 @@ -package scheduler - -import ( - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/result" - "github.com/reugn/go-quartz/quartz" -) - -func do(s *Scheduler, job job, fn JobFunc) { - trigger := getTrigger(job) - assert.If(job.key == "", "[name] should not be null") - assert.If(fn == nil, "[fn] should not be nil") - assert.If(trigger == nil, "please init dur or cron") - assert.Must(s.scheduler.ScheduleJob( - quartz.NewJobDetail( - &namedJob{s: s, name: job.key, fn: fn, log: s.log}, - quartz.NewJobKey(job.key)), trigger)) -} - -func getTrigger(j job) quartz.Trigger { - if j.once { - return quartz.NewRunOnceTrigger(j.dur) - } - - if j.cron != "" { - r := result.Wrap(quartz.NewCronTrigger(j.cron)) - return r.Unwrap(func(err error) error { - return errors.WrapKV(err, "cron-expr", j.cron) - }) - } - - if j.dur != 0 { - return quartz.NewSimpleTrigger(j.dur) - } - - return nil -} diff --git a/core/signal/signal.go b/core/signal/signal.go index 94169e21f..3b6fdfcfd 100644 --- a/core/signal/signal.go +++ b/core/signal/signal.go @@ -8,15 +8,18 @@ import ( "github.com/pubgo/funk/log" "github.com/pubgo/funk/try" + "github.com/samber/lo" ) const Name = "signal" var logger = log.GetLogger(Name) +var signals = []os.Signal{syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP, syscall.SIGUSR1} + func getCh() chan os.Signal { ch := make(chan os.Signal, 1) - signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGHUP, syscall.SIGUSR1) + signal.Notify(ch, signals...) return ch } @@ -32,22 +35,23 @@ func Context() context.Context { return ctx } -func WaitRestart(restart func() error) error { +func WaitRestart(restart func() error, close func() error) error { sigChan := getCh() for sig := range sigChan { logger.Info().Str("signal", sig.String()).Msg("signal trigger notify") switch sig { case syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT: logger.Info().Str("signal", sig.String()).Msg("stop trigger") - return nil + return try.Try(close) case syscall.SIGHUP, syscall.SIGUSR1: logger.Info().Str("signal", sig.String()).Msg("restart trigger") err := try.Try(restart) if err != nil { - logger.Error().Err(err).Msg("restart error") - return err + logger.Err(err).Msg("supervisor service restart failed") } + continue } + logger.Error().Msgf("unknown signal: %s, should in signals(%v)", sig, lo.Map(signals, func(s os.Signal, _ int) string { return s.String() })) } return nil } diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go index 368972113..07b5d4f21 100644 --- a/core/supervisor/manager.go +++ b/core/supervisor/manager.go @@ -2,7 +2,7 @@ package supervisor import ( "context" - + "github.com/pubgo/funk/errors" "github.com/pubgo/funk/errors/errcheck" "github.com/pubgo/funk/log" @@ -131,8 +131,19 @@ func (m *Manager) Run() error { } }() - defer cancel() - return signal.WaitRestart(m.RestartServices) + return signal.WaitRestart(m.RestartServices, func() error { + cancel() + + unstoppedServices, _ := m.supervisor.UnstoppedServiceReport() + if len(unstoppedServices) > 0 { + for _, service := range unstoppedServices { + m.logger.Error().Any("service", service).Msgf("service:%s is still running", service.Name) + } + return errors.New("services are still running") + } + + return nil + }) } func (m *Manager) Serve(ctx context.Context) error { From d6a1400897a0cbe6b98e946b3b7df380aa1333a4 Mon Sep 17 00:00:00 2001 From: barry Date: Sun, 17 Aug 2025 12:40:45 +0800 Subject: [PATCH 075/142] fix: barry quick fix, 2025-08-17 12:40:45 --- core/signal/signal.go | 7 +- core/supervisor/manager.go | 99 ++++++++++++++++++++++------ servers/tasks/server.go | 129 ++++++++++--------------------------- 3 files changed, 119 insertions(+), 116 deletions(-) diff --git a/core/signal/signal.go b/core/signal/signal.go index 3b6fdfcfd..daa6dbdab 100644 --- a/core/signal/signal.go +++ b/core/signal/signal.go @@ -35,7 +35,12 @@ func Context() context.Context { return ctx } -func WaitRestart(restart func() error, close func() error) error { +func WaitRestart(start func() error, close func() error, restart func() error) error { + err := start() + if err != nil { + return err + } + sigChan := getCh() for sig := range sigChan { logger.Info().Str("signal", sig.String()).Msg("signal trigger notify") diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go index 07b5d4f21..82e918bad 100644 --- a/core/supervisor/manager.go +++ b/core/supervisor/manager.go @@ -2,14 +2,22 @@ package supervisor import ( "context" - + "fmt" + "time" + + "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/async" "github.com/pubgo/funk/errors" "github.com/pubgo/funk/errors/errcheck" "github.com/pubgo/funk/log" + "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/running" - "github.com/pubgo/funk/try" - "github.com/pubgo/lava/core/signal" + "github.com/pubgo/funk/stack" "github.com/thejerf/suture/v4" + + "github.com/pubgo/lava/core/lifecycle" + "github.com/pubgo/lava/core/signal" + "github.com/pubgo/lava/internal/logutil" ) type serviceWrapper struct { @@ -17,12 +25,16 @@ type serviceWrapper struct { service Service } -func Default() *Manager { - return NewManager(running.Project) +func Default(lc lifecycle.Getter) *Manager { + return NewManager(running.Project, lc) } -func NewManager(name string) *Manager { +func NewManager(name string, lc lifecycle.Getter) *Manager { + ctx, cancel := context.WithCancel(context.Background()) return &Manager{ + cancel: cancel, + ctx: ctx, + lc: lc, supervisor: suture.New(name, SpecWithInfoLogger()), services: make(map[string]*serviceWrapper), logger: log.GetLogger(name), @@ -30,9 +42,12 @@ func NewManager(name string) *Manager { } type Manager struct { + lc lifecycle.Getter logger log.Logger supervisor *Supervisor services map[string]*serviceWrapper + ctx context.Context + cancel context.CancelFunc } func (m *Manager) Has(name string) bool { @@ -121,29 +136,71 @@ func (m *Manager) Services() []Service { return services } -func (m *Manager) Run() error { - ctx, cancel := context.WithCancel(context.Background()) +func (m *Manager) start() error { + ctx := m.ctx + defer recovery.Exit() + logutil.OkOrFailed(m.logger, "service before-start", func() error { + defer recovery.Exit() + for _, run := range m.lc.GetBeforeStarts() { + m.logger.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) + assert.Exit(run.Exec(ctx)) + } + return nil + }) - go func() { - err := try.Try(func() error { return m.Serve(ctx) }) - if err != nil { - m.logger.Err(err).Msg("supervisor failed") + async.GoDelay(func() error { + assert.Exit(m.supervisor.Serve(ctx)) + return nil + }, time.Second*2) + + logutil.OkOrFailed(m.logger, "service after-start", func() error { + defer recovery.Exit() + for _, run := range m.lc.GetAfterStarts() { + m.logger.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) + assert.Exit(run.Exec(ctx)) } - }() + return nil + }) - return signal.WaitRestart(m.RestartServices, func() error { - cancel() + return nil +} - unstoppedServices, _ := m.supervisor.UnstoppedServiceReport() - if len(unstoppedServices) > 0 { - for _, service := range unstoppedServices { - m.logger.Error().Any("service", service).Msgf("service:%s is still running", service.Name) - } - return errors.New("services are still running") +func (m *Manager) stop() error { + defer recovery.DebugPrint() + + ctx := m.ctx + logutil.OkOrFailed(m.logger, "service before-stop", func() error { + for _, run := range m.lc.GetBeforeStops() { + logutil.LogOrErr(m.logger, fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), func() error { + return run.Exec(ctx) + }) } + return nil + }) + + m.cancel() + logutil.OkOrFailed(m.logger, "service after-stop", func() error { + for _, run := range m.lc.GetAfterStops() { + logutil.LogOrErr(m.logger, fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), func() error { + return run.Exec(ctx) + }) + } return nil }) + + unstoppedServices, _ := m.supervisor.UnstoppedServiceReport() + if len(unstoppedServices) > 0 { + for _, service := range unstoppedServices { + m.logger.Error().Any("service", service).Msgf("service:%s is still running", service.Name) + } + return errors.New("services are still running") + } + return nil +} + +func (m *Manager) Run() error { + return signal.WaitRestart(m.start, m.stop, m.RestartServices) } func (m *Manager) Serve(ctx context.Context) error { diff --git a/servers/tasks/server.go b/servers/tasks/server.go index 4d8f0a090..88e86aff8 100644 --- a/servers/tasks/server.go +++ b/servers/tasks/server.go @@ -16,33 +16,27 @@ import ( "github.com/pubgo/funk/log" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/running" - "github.com/pubgo/funk/stack" - "google.golang.org/grpc/codes" - "github.com/pubgo/lava/core/debug" "github.com/pubgo/lava/core/lifecycle" "github.com/pubgo/lava/core/supervisor" "github.com/pubgo/lava/internal/logutil" + "google.golang.org/grpc/codes" ) type Params struct { - Services []supervisor.Service - GetLifecycle lifecycle.Getter - Log log.Logger - Conf []*Config + Services []supervisor.Service + Log log.Logger + Conf []*Config + LC lifecycle.Getter } func New(params Params) *supervisor.Manager { assert.If(len(params.Services) == 0, "services is nil") s := &Server{} - s.init( - params.GetLifecycle, - params.Log, - params.Conf, - ) + s.init(params.Log, params.Conf) - manager := supervisor.Default() + manager := supervisor.Default(params.LC) assert.Exit(manager.Add(supervisor.NewService("task", s.Serve))) for _, srv := range params.Services { assert.Exit(manager.Add(srv)) @@ -52,7 +46,6 @@ func New(params Params) *supervisor.Manager { type Server struct { log log.Logger - lc lifecycle.Getter httpServer *fiber.App conf *Config } @@ -62,18 +55,37 @@ func (s *Server) String() string { } func (s *Server) Serve(ctx context.Context) error { - defer s.stop(ctx) - s.start(ctx) - <-ctx.Done() + defer func() { + <-ctx.Done() + + logutil.LogOrErr(s.log, "[http-debug-server] Shutdown", func() error { + return s.httpServer.ShutdownWithTimeout(time.Second * 5) + }) + }() + + httpLn := assert.Exit1(net.Listen("tcp", fmt.Sprintf(":%d", generic.FromPtr(s.conf.HttpPort)))) + logutil.OkOrFailed(s.log, "service starts", func() error { + async.GoDelay(func() error { + s.log.Info().Msg("[http-debug-server] Server Starting") + logutil.LogOrErr(s.log, "[http-debug-server] Server Stop", func() error { + defer recovery.Exit() + if err := s.httpServer.Listener(httpLn); err != nil && + !errors.Is(err, http.ErrServerClosed) && + !errors.Is(err, net.ErrClosed) { + return err + } + return nil + }) + return nil + }) + + return nil + }) + return nil } -func (s *Server) init( - getLifecycle lifecycle.Getter, - log log.Logger, - conf []*Config, -) { - s.lc = getLifecycle +func (s *Server) init(log log.Logger, conf []*Config) { s.log = log.WithName("tasks") if len(conf) > 0 { @@ -103,74 +115,3 @@ func (s *Server) init( s.httpServer.Mount("/debug", debug.App()) } - -func (s *Server) start(ctx context.Context) { - defer recovery.Exit() - - logutil.OkOrFailed(s.log, "running before service start", func() error { - defer recovery.Exit() - for _, run := range s.lc.GetBeforeStarts() { - s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) - assert.Exit(run.Exec(ctx)) - } - return nil - }) - - httpLn := assert.Exit1(net.Listen("tcp", fmt.Sprintf(":%d", generic.FromPtr(s.conf.HttpPort)))) - - logutil.OkOrFailed(s.log, "service starts", func() error { - async.GoDelay(func() error { - s.log.Info().Msg("[http-debug-server] Server Starting") - logutil.LogOrErr(s.log, "[http-debug-server] Server Stop", func() error { - defer recovery.Exit() - if err := s.httpServer.Listener(httpLn); err != nil && - !errors.Is(err, http.ErrServerClosed) && - !errors.Is(err, net.ErrClosed) { - return err - } - return nil - }) - return nil - }) - - return nil - }) - - logutil.OkOrFailed(s.log, "running after service starts", func() error { - for _, run := range s.lc.GetAfterStarts() { - s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) - assert.Exit(run.Exec(ctx)) - } - return nil - }) -} - -func (s *Server) stop(ctx context.Context) { - defer recovery.DebugPrint() - - logutil.OkOrFailed(s.log, "running before service stops", func() error { - for _, run := range s.lc.GetBeforeStops() { - logutil.LogOrErr( - s.log, - fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), - func() error { return run.Exec(ctx) }, - ) - } - return nil - }) - - logutil.LogOrErr(s.log, "[http-debug-server] Shutdown", func() error { - return s.httpServer.ShutdownWithTimeout(time.Second * 5) - }) - - logutil.OkOrFailed(s.log, "running after service stops", func() error { - for _, run := range s.lc.GetAfterStops() { - logutil.LogOrErr( - s.log, - fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), - func() error { return run.Exec(ctx) }, - ) - } - return nil - }) -} From 3bdc1ccc5ab2914bce3f37769f7c93c98b287c4c Mon Sep 17 00:00:00 2001 From: barry Date: Sun, 17 Aug 2025 12:43:40 +0800 Subject: [PATCH 076/142] fix: barry quick fix, 2025-08-17 12:43:40 --- servers/tasks/server.go | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/servers/tasks/server.go b/servers/tasks/server.go index 88e86aff8..51f7a8999 100644 --- a/servers/tasks/server.go +++ b/servers/tasks/server.go @@ -9,7 +9,6 @@ import ( "github.com/gofiber/fiber/v2" "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/async" "github.com/pubgo/funk/errors" "github.com/pubgo/funk/errors/errutil" "github.com/pubgo/funk/generic" @@ -50,38 +49,26 @@ type Server struct { conf *Config } -func (s *Server) String() string { - return "task" -} - func (s *Server) Serve(ctx context.Context) error { defer func() { - <-ctx.Done() - logutil.LogOrErr(s.log, "[http-debug-server] Shutdown", func() error { return s.httpServer.ShutdownWithTimeout(time.Second * 5) }) }() httpLn := assert.Exit1(net.Listen("tcp", fmt.Sprintf(":%d", generic.FromPtr(s.conf.HttpPort)))) - logutil.OkOrFailed(s.log, "service starts", func() error { - async.GoDelay(func() error { - s.log.Info().Msg("[http-debug-server] Server Starting") - logutil.LogOrErr(s.log, "[http-debug-server] Server Stop", func() error { - defer recovery.Exit() - if err := s.httpServer.Listener(httpLn); err != nil && - !errors.Is(err, http.ErrServerClosed) && - !errors.Is(err, net.ErrClosed) { - return err - } - return nil - }) - return nil - }) - + s.log.Info().Msg("[http-debug-server] Server Starting") + logutil.LogOrErr(s.log, "[http-debug-server] Server Stop", func() error { + defer recovery.Exit() + if err := s.httpServer.Listener(httpLn); err != nil && + !errors.Is(err, http.ErrServerClosed) && + !errors.Is(err, net.ErrClosed) { + return err + } return nil }) + <-ctx.Done() return nil } From e623fb3e88e7dbb14ae6c6ea91f261c35986cc59 Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 18 Aug 2025 12:54:08 +0800 Subject: [PATCH 077/142] fix: barry@feat/supervisor, 2025-08-18 12:54:08 --- core/scheduler/builder.go | 1 + core/scheduler/config.go | 3 ++ core/scheduler/job.go | 87 +++++++++++++++++++++++++++++-------- core/scheduler/scheduler.go | 10 +---- 4 files changed, 74 insertions(+), 27 deletions(-) diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index 43925e514..08bf17174 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -3,6 +3,7 @@ package scheduler import ( "context" "fmt" + "github.com/pubgo/funk/log" "github.com/pubgo/funk/v2/result" "github.com/reugn/go-quartz/quartz" diff --git a/core/scheduler/config.go b/core/scheduler/config.go index c35cbe0a4..aa7b6f604 100644 --- a/core/scheduler/config.go +++ b/core/scheduler/config.go @@ -108,4 +108,7 @@ type JobMetadata struct { RetryInterval time.Duration Replace bool Location *time.Location + + PreRunTime int64 + NextRunTime int64 } diff --git a/core/scheduler/job.go b/core/scheduler/job.go index 01ff7405f..5bded287c 100644 --- a/core/scheduler/job.go +++ b/core/scheduler/job.go @@ -2,6 +2,7 @@ package scheduler import ( "context" + "fmt" "time" "github.com/pubgo/funk/generic" @@ -9,22 +10,49 @@ import ( "github.com/pubgo/funk/try" "github.com/pubgo/funk/v2/result" "github.com/reugn/go-quartz/quartz" + "github.com/rs/zerolog" "github.com/samber/lo" + "go.uber.org/atomic" "github.com/pubgo/lava/core/metrics" ) +type jobWrapper struct { + key string + cron string + dur time.Duration + once bool +} + type namedJob struct { s *Scheduler name string fn JobFunc log log.Logger setting *JobSetting + trigger *triggerImpl + + runs atomic.Uint64 } -func (t namedJob) Description() string { return t.name } -func (t namedJob) Execute(ctx context.Context) error { +func (t *namedJob) Description() string { return t.name } +func (t *namedJob) Execute(ctx context.Context) (gErr error) { start := time.Now() + + defer func() { + cost := float64(time.Since(start).Milliseconds()) + t.s.metric.Tagged(metrics.Tags{"job_name": t.name}).Gauge("job_cost_ms").Update(cost) + + logger := generic.Ternary(generic.IsNil(gErr), t.log.Info(), t.log.Err(gErr)) + logger.Func(func(e *zerolog.Event) { + e.Float32("job_cost_ms", float32(cost)) + e.Str("job_name", t.name) + e.Uint64("runs", t.runs.Load()) + e.Msg("exec scheduler job") + }) + }() + + t.runs.Inc() metadata := JobMetadata{ Name: t.setting.Name, Replace: lo.FromPtr(t.setting.Replace), @@ -32,24 +60,20 @@ func (t namedJob) Execute(ctx context.Context) error { RetryInterval: lo.FromPtr(t.setting.RetryInterval), Timeout: lo.FromPtr(t.setting.Timeout), Location: t.setting.location, + PreRunTime: t.trigger.prev, + NextRunTime: t.trigger.next, } - err := try.Try(func() error { + + if t.trigger.err != nil { + return fmt.Errorf("schedule job(%s) error: %w", t.name, t.trigger.err) + } + + return try.Try(func() error { ctx, cancel := context.WithTimeout(ctx, lo.FromPtr(t.setting.Timeout)) defer cancel() return t.fn(ctx, t.name, &metadata) }) - - cost := float64(time.Since(start).Milliseconds()) - t.s.metric.Tagged(metrics.Tags{"job_name": t.name}).Gauge("job_cost_ms").Update(cost) - - logger := generic.Ternary(generic.IsNil(err), t.log.Info(), t.log.Err(err)) - logger. - Float32("job_cost_ms", float32(cost)). - Str("job_name", t.name). - Msg("exec scheduler job") - - return err } func registerJob(s *Scheduler, job jobWrapper, fn JobFunc) (r result.Error) { @@ -74,9 +98,10 @@ func registerJob(s *Scheduler, job jobWrapper, fn JobFunc) (r result.Error) { Replace: lo.FromPtr(setting.Replace), Suspended: false, } + return result.ErrOf(s.scheduler.ScheduleJob( quartz.NewJobDetailWithOptions( - &namedJob{s: s, name: job.key, fn: fn, log: s.log, setting: setting}, + &namedJob{s: s, name: job.key, fn: fn, log: s.log, setting: setting, trigger: trigger}, quartz.NewJobKey(job.key), jobOpt, ), @@ -84,9 +109,33 @@ func registerJob(s *Scheduler, job jobWrapper, fn JobFunc) (r result.Error) { )) } -func getTrigger(j jobWrapper, location *time.Location) (r result.Result[quartz.Trigger]) { +var _ quartz.Trigger = &triggerImpl{} + +func newTrigger(trigger quartz.Trigger) *triggerImpl { + return &triggerImpl{trigger: trigger} +} + +type triggerImpl struct { + prev int64 + next int64 + err error + trigger quartz.Trigger +} + +func (t *triggerImpl) NextFireTime(prev int64) (next int64, err error) { + t.prev = prev + + defer func() { t.next, t.err = next, err }() + return t.trigger.NextFireTime(prev) +} + +func (t *triggerImpl) Description() string { + return t.trigger.Description() +} + +func getTrigger(j jobWrapper, location *time.Location) (r result.Result[*triggerImpl]) { if j.once { - return r.WithValue(quartz.NewRunOnceTrigger(j.dur)) + return r.WithValue(newTrigger(quartz.NewRunOnceTrigger(j.dur))) } if j.cron != "" { @@ -94,11 +143,11 @@ func getTrigger(j jobWrapper, location *time.Location) (r result.Result[quartz.T if err != nil { return r.WithErrorf("cron-expr:%s, err:%s", j.cron, err.Error()) } - return r.WithValue(trigger) + return r.WithValue(newTrigger(trigger)) } if j.dur != 0 { - return r.WithValue(quartz.NewSimpleTrigger(j.dur)) + return r.WithValue(newTrigger(quartz.NewSimpleTrigger(j.dur))) } return r.WithErrorf("please init dur or cron") diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index 9d89872a5..59e3be41b 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -14,13 +14,6 @@ import ( "github.com/pubgo/lava/core/metrics" ) -type jobWrapper struct { - key string - cron string - dur time.Duration - once bool -} - type Scheduler struct { metric metrics.Metric configMap map[string]*JobSetting @@ -38,7 +31,8 @@ func (s *Scheduler) String() string { func (s *Scheduler) Serve(ctx context.Context) error { s.start() defer s.stop() - <-ctx.Done() + + s.scheduler.Wait(ctx) return nil } From d5869afeccf8c70b8bbdc3a95f74c305f9d4349f Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 18 Aug 2025 12:59:16 +0800 Subject: [PATCH 078/142] fix: barry@feat/supervisor, 2025-08-18 12:59:16 --- core/scheduler/builder.go | 8 ++++---- core/scheduler/interface.go | 6 +++--- core/supervisor/supervisor.go | 10 ++-------- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index 08bf17174..8b8ccd30e 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -3,7 +3,7 @@ package scheduler import ( "context" "fmt" - + "github.com/pubgo/funk/log" "github.com/pubgo/funk/v2/result" "github.com/reugn/go-quartz/quartz" @@ -19,7 +19,7 @@ type Params struct { M lifecycle.Lifecycle Log log.Logger Configs []*Config - Routers []Register + Routers []JobRegister Metric metrics.Metric } @@ -37,7 +37,7 @@ func NewService(params Params) (supervisor.Service, error) { return supervisor.NewService(Name, s.Serve), err } -func New(m lifecycle.Lifecycle, log log.Logger, opts []*Config, routers []Register, metric metrics.Metric) (_ *Scheduler, gErr error) { +func New(m lifecycle.Lifecycle, log log.Logger, opts []*Config, routers []JobRegister, metric metrics.Metric) (_ *Scheduler, gErr error) { config := createConfig(opts).Unwrap(&gErr) if gErr != nil { return nil, fmt.Errorf("failed to create config, err:%w", gErr) @@ -63,7 +63,7 @@ func New(m lifecycle.Lifecycle, log log.Logger, opts []*Config, routers []Regist m.BeforeStop(lifecycle.WrapNoCtxErr(quart.stop)) for _, r := range routers { - r.RegisterCrontabScheduler(quart) + r.RegisterSchedulerJob(quart) } return quart, nil diff --git a/core/scheduler/interface.go b/core/scheduler/interface.go index 463f49151..06ed619c3 100644 --- a/core/scheduler/interface.go +++ b/core/scheduler/interface.go @@ -7,11 +7,11 @@ import ( type JobFunc func(ctx context.Context, name string, metadata *JobMetadata) error -type Register interface { - RegisterCrontabScheduler(reg Registry) +type JobRegister interface { + RegisterSchedulerJob(reg JobRegistry) } -type Registry interface { +type JobRegistry interface { Once(name string, delay time.Duration, fn JobFunc) Every(name string, dur time.Duration, fn JobFunc) Cron(name, expr string, fn JobFunc) diff --git a/core/supervisor/supervisor.go b/core/supervisor/supervisor.go index e70372ccd..6060cd72b 100644 --- a/core/supervisor/supervisor.go +++ b/core/supervisor/supervisor.go @@ -3,22 +3,16 @@ package supervisor import ( "context" "expvar" - "fmt" - - "github.com/thejerf/suture/v4" ) type Service interface { Name() string Error() error - fmt.Stringer - suture.Service + String() string + Serve(ctx context.Context) error Metrics() *expvar.Map } -type Supervisor = suture.Supervisor -type Spec = suture.Spec - type serviceFn func(ctx context.Context) error func (fn serviceFn) Serve(ctx context.Context) error { From 68986b4bda7f0bcd14ba8e99b0ee36204a7bcea2 Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 18 Aug 2025 13:06:00 +0800 Subject: [PATCH 079/142] fix: barry@feat/supervisor, 2025-08-18 13:06:00 --- core/scheduler/interface.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/scheduler/interface.go b/core/scheduler/interface.go index 06ed619c3..da07aa447 100644 --- a/core/scheduler/interface.go +++ b/core/scheduler/interface.go @@ -3,6 +3,8 @@ package scheduler import ( "context" "time" + + "github.com/reugn/go-quartz/quartz" ) type JobFunc func(ctx context.Context, name string, metadata *JobMetadata) error @@ -16,3 +18,14 @@ type JobRegistry interface { Every(name string, dur time.Duration, fn JobFunc) Cron(name, expr string, fn JobFunc) } + +type Job struct { + Name string + Delay *time.Duration + Dur *time.Duration + CronExpr string + Metadata JobMetadata + ExecErr error + JobKey *quartz.JobKey + Location *time.Location +} From bf65ad8a396c391ccc92e1350167d1c548446355 Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 18 Aug 2025 13:12:48 +0800 Subject: [PATCH 080/142] fix: barry@feat/supervisor, 2025-08-18 13:12:48 --- core/scheduler/interface.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/core/scheduler/interface.go b/core/scheduler/interface.go index da07aa447..d25dc5580 100644 --- a/core/scheduler/interface.go +++ b/core/scheduler/interface.go @@ -19,6 +19,35 @@ type JobRegistry interface { Cron(name, expr string, fn JobFunc) } +type JobManager interface { + Add(name string, spec JobSpec, fn JobFunc) + Pause(name string, spec JobSpec, fn JobFunc) + Resume(name string, spec JobSpec, fn JobFunc) + Delete(name string, spec JobSpec, fn JobFunc) + Start(name string, spec JobSpec, fn JobFunc) + Stop(name string, spec JobSpec, fn JobFunc) + List(name string, spec JobSpec, fn JobFunc) + Get(name string, spec JobSpec, fn JobFunc) +} + +type JobSpec struct { + Once *OnceJob + Every *EveryJob + Cron *CronJob +} + +type OnceJob struct { + Delay time.Duration +} + +type EveryJob struct { + Dur time.Duration +} + +type CronJob struct { + Expr string +} + type Job struct { Name string Delay *time.Duration From 42ce5a1dc4b46dd069aacb9488ce9d36f81245df Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 18 Aug 2025 21:11:03 +0800 Subject: [PATCH 081/142] fix: barry quick fix, 2025-08-18 21:11:03 --- core/scheduler/{interface.go => aaa.go} | 21 ++++++++++++--------- core/supervisor/{supervisor.go => aaa.go} | 4 ++++ 2 files changed, 16 insertions(+), 9 deletions(-) rename core/scheduler/{interface.go => aaa.go} (67%) rename core/supervisor/{supervisor.go => aaa.go} (81%) diff --git a/core/scheduler/interface.go b/core/scheduler/aaa.go similarity index 67% rename from core/scheduler/interface.go rename to core/scheduler/aaa.go index d25dc5580..b0e2e303c 100644 --- a/core/scheduler/interface.go +++ b/core/scheduler/aaa.go @@ -20,17 +20,20 @@ type JobRegistry interface { } type JobManager interface { - Add(name string, spec JobSpec, fn JobFunc) - Pause(name string, spec JobSpec, fn JobFunc) - Resume(name string, spec JobSpec, fn JobFunc) - Delete(name string, spec JobSpec, fn JobFunc) - Start(name string, spec JobSpec, fn JobFunc) - Stop(name string, spec JobSpec, fn JobFunc) - List(name string, spec JobSpec, fn JobFunc) - Get(name string, spec JobSpec, fn JobFunc) + Add(spec AddJobSpec) + Pause(name string) + Resume(name string) + Delete(name string) + Reload(name string) + List() + Get(name string) } -type JobSpec struct { +type AddJobSpec struct { + Name string + Setting JobSetting + Job JobFunc + Once *OnceJob Every *EveryJob Cron *CronJob diff --git a/core/supervisor/supervisor.go b/core/supervisor/aaa.go similarity index 81% rename from core/supervisor/supervisor.go rename to core/supervisor/aaa.go index 6060cd72b..03146401e 100644 --- a/core/supervisor/supervisor.go +++ b/core/supervisor/aaa.go @@ -3,8 +3,12 @@ package supervisor import ( "context" "expvar" + + "github.com/thejerf/suture/v4" ) +type Supervisor = suture.Supervisor + type Service interface { Name() string Error() error From 490f3dc292211fcb7f555b503addad4e5b607ee9 Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 18 Aug 2025 21:37:02 +0800 Subject: [PATCH 082/142] fix: barry quick fix, 2025-08-18 21:37:02 --- core/scheduler/aaa.go | 44 ++++++++++++++++++++++--------------- core/scheduler/job.go | 17 ++++++++++++++ core/scheduler/scheduler.go | 40 ++++++++++++++++++++++++++++++++- 3 files changed, 82 insertions(+), 19 deletions(-) diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index b0e2e303c..fad2e3a31 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -3,12 +3,20 @@ package scheduler import ( "context" "time" - - "github.com/reugn/go-quartz/quartz" ) +type JobExecutor interface { + Exec(ctx context.Context, name string, metadata *JobMetadata) error +} + +var _ JobExecutor = (JobFunc)(nil) + type JobFunc func(ctx context.Context, name string, metadata *JobMetadata) error +func (j JobFunc) Exec(ctx context.Context, name string, metadata *JobMetadata) error { + return j(ctx, name, metadata) +} + type JobRegister interface { RegisterSchedulerJob(reg JobRegistry) } @@ -25,39 +33,39 @@ type JobManager interface { Resume(name string) Delete(name string) Reload(name string) - List() - Get(name string) + List() []Job + Get(name string) Job } type AddJobSpec struct { - Name string - Setting JobSetting - Job JobFunc - - Once *OnceJob - Every *EveryJob - Cron *CronJob + Name string + Setting JobSetting + Executor string + Once *OnceJob + Ticker *TickerJob + Cron *CronJob } type OnceJob struct { Delay time.Duration } -type EveryJob struct { +type TickerJob struct { Dur time.Duration } type CronJob struct { - Expr string + Expr string + Location string } type Job struct { Name string - Delay *time.Duration - Dur *time.Duration - CronExpr string Metadata JobMetadata ExecErr error - JobKey *quartz.JobKey - Location *time.Location + Executor string + Once *OnceJob + Ticker *TickerJob + Cron *CronJob + Status string } diff --git a/core/scheduler/job.go b/core/scheduler/job.go index 5bded287c..524f02ca0 100644 --- a/core/scheduler/job.go +++ b/core/scheduler/job.go @@ -3,6 +3,7 @@ package scheduler import ( "context" "fmt" + "strings" "time" "github.com/pubgo/funk/generic" @@ -17,6 +18,14 @@ import ( "github.com/pubgo/lava/core/metrics" ) +type Status string + +const ( + StatusInit Status = "init" + StatusRunning Status = "running" + StatusStop Status = "stop" +) + type jobWrapper struct { key string cron string @@ -152,3 +161,11 @@ func getTrigger(j jobWrapper, location *time.Location) (r result.Result[*trigger return r.WithErrorf("please init dur or cron") } + +func parseJobKey(name string) *quartz.JobKey { + keys := strings.SplitN(name, quartz.Sep, 2) + if len(keys) == 1 { + return quartz.NewJobKey(keys[0]) + } + return quartz.NewJobKeyWithGroup(keys[0], keys[1]) +} diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index 59e3be41b..9a1dcee0d 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -14,6 +14,9 @@ import ( "github.com/pubgo/lava/core/metrics" ) +var _ JobManager = (*Scheduler)(nil) +var _ JobRegistry = (*Scheduler)(nil) + type Scheduler struct { metric metrics.Metric configMap map[string]*JobSetting @@ -24,13 +27,48 @@ type Scheduler struct { jobs map[string]JobFunc } +func (s *Scheduler) Add(spec AddJobSpec) { + //TODO implement me + panic("implement me") +} + +func (s *Scheduler) Pause(name string) { + //TODO implement me + panic("implement me") +} + +func (s *Scheduler) Resume(name string) { + //TODO implement me + panic("implement me") +} + +func (s *Scheduler) Delete(name string) { + //TODO implement me + panic("implement me") +} + +func (s *Scheduler) Reload(name string) { + //TODO implement me + panic("implement me") +} + +func (s *Scheduler) List() []Job { + //TODO implement me + panic("implement me") +} + +func (s *Scheduler) Get(name string) Job { + //TODO implement me + panic("implement me") +} + func (s *Scheduler) String() string { return Name } func (s *Scheduler) Serve(ctx context.Context) error { - s.start() defer s.stop() + s.start() s.scheduler.Wait(ctx) return nil From f6482939d127c72a8043903aca51c4c30371362f Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 18 Aug 2025 21:40:06 +0800 Subject: [PATCH 083/142] fix: barry quick fix, 2025-08-18 21:40:06 --- core/scheduler/aaa.go | 11 ++++++----- core/scheduler/scheduler.go | 15 ++++++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index fad2e3a31..4d6667829 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -28,11 +28,12 @@ type JobRegistry interface { } type JobManager interface { - Add(spec AddJobSpec) - Pause(name string) - Resume(name string) - Delete(name string) - Reload(name string) + Create(spec AddJobSpec) error + Patch(name string, setting JobSetting) error + Pause(name string) error + Resume(name string) error + Delete(name string) error + Reload(name string) error List() []Job Get(name string) Job } diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index 9a1dcee0d..27b66daad 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -27,27 +27,32 @@ type Scheduler struct { jobs map[string]JobFunc } -func (s *Scheduler) Add(spec AddJobSpec) { +func (s *Scheduler) Patch(name string, setting JobSetting) error { //TODO implement me panic("implement me") } -func (s *Scheduler) Pause(name string) { +func (s *Scheduler) Create(spec AddJobSpec) error { //TODO implement me panic("implement me") } -func (s *Scheduler) Resume(name string) { +func (s *Scheduler) Pause(name string) error { //TODO implement me panic("implement me") } -func (s *Scheduler) Delete(name string) { +func (s *Scheduler) Resume(name string) error { //TODO implement me panic("implement me") } -func (s *Scheduler) Reload(name string) { +func (s *Scheduler) Delete(name string) error { + //TODO implement me + panic("implement me") +} + +func (s *Scheduler) Reload(name string) error { //TODO implement me panic("implement me") } From b5a1a6f02108b39a25c566596f76dd9a0c870386 Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 18 Aug 2025 21:43:30 +0800 Subject: [PATCH 084/142] fix: barry quick fix, 2025-08-18 21:43:30 --- core/scheduler/aaa.go | 4 ++-- core/scheduler/config.go | 26 +++++++++++++------------- core/scheduler/job.go | 28 ++++++++++++++-------------- core/scheduler/scheduler.go | 4 ++-- 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index 4d6667829..a24f48235 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -29,7 +29,7 @@ type JobRegistry interface { type JobManager interface { Create(spec AddJobSpec) error - Patch(name string, setting JobSetting) error + Patch(name string, config JobConfig) error Pause(name string) error Resume(name string) error Delete(name string) error @@ -40,7 +40,7 @@ type JobManager interface { type AddJobSpec struct { Name string - Setting JobSetting + Config JobConfig Executor string Once *OnceJob Ticker *TickerJob diff --git a/core/scheduler/config.go b/core/scheduler/config.go index aa7b6f604..079d97ba8 100644 --- a/core/scheduler/config.go +++ b/core/scheduler/config.go @@ -8,21 +8,21 @@ import ( "github.com/samber/lo" ) -func createConfig(opts []*Config) (r result.Result[map[string]*JobSetting]) { - configMap := make(map[string]*JobSetting) +func createConfig(opts []*Config) (r result.Result[map[string]*JobConfig]) { + configMap := make(map[string]*JobConfig) if len(opts) > 0 && opts[0] != nil { - for _, setting := range opts[0].JobSettings { - if setting.Name == "" { + for _, config := range opts[0].JobConfigs { + if config.Name == "" { return r.WithErrorf("schedule job name is empty") } - if _, ok := configMap[setting.Name]; ok { - return r.WithErrorf("schedule job(%s) exists", setting.Name) + if _, ok := configMap[config.Name]; ok { + return r.WithErrorf("schedule job(%s) exists", config.Name) } - configMap[setting.Name] = initConfig(setting.Name, lo.ToPtr(setting)). + configMap[config.Name] = initConfig(config.Name, lo.ToPtr(config)). MapErr(func(err error) error { - return fmt.Errorf("schedule job(%s) error: %w", setting.Name, err) + return fmt.Errorf("schedule job(%s) error: %w", config.Name, err) }). UnwrapErr(&r) if r.IsErr() { @@ -33,9 +33,9 @@ func createConfig(opts []*Config) (r result.Result[map[string]*JobSetting]) { return r.WithValue(configMap) } -func initConfig(name string, cfg *JobSetting) (r result.Result[*JobSetting]) { +func initConfig(name string, cfg *JobConfig) (r result.Result[*JobConfig]) { if cfg == nil { - cfg = &JobSetting{Name: name} + cfg = &JobConfig{Name: name} } if cfg.Disabled == nil { @@ -66,7 +66,7 @@ func initConfig(name string, cfg *JobSetting) (r result.Result[*JobSetting]) { return r.WithValue(cfg) } -type JobSetting struct { +type JobConfig struct { Disabled *bool `yaml:"disabled"` Name string `yaml:"name"` Timeout *time.Duration `yaml:"timeout"` @@ -93,8 +93,8 @@ type JobSetting struct { } type Config struct { - Timeout string `yaml:"timeout"` - JobSettings []JobSetting `yaml:"jobs"` + Timeout string `yaml:"timeout"` + JobConfigs []JobConfig `yaml:"jobs"` } type JobsConfigLoader struct { diff --git a/core/scheduler/job.go b/core/scheduler/job.go index 524f02ca0..4cb5e7acd 100644 --- a/core/scheduler/job.go +++ b/core/scheduler/job.go @@ -38,7 +38,7 @@ type namedJob struct { name string fn JobFunc log log.Logger - setting *JobSetting + config *JobConfig trigger *triggerImpl runs atomic.Uint64 @@ -63,12 +63,12 @@ func (t *namedJob) Execute(ctx context.Context) (gErr error) { t.runs.Inc() metadata := JobMetadata{ - Name: t.setting.Name, - Replace: lo.FromPtr(t.setting.Replace), - MaxRetries: lo.FromPtr(t.setting.MaxRetries), - RetryInterval: lo.FromPtr(t.setting.RetryInterval), - Timeout: lo.FromPtr(t.setting.Timeout), - Location: t.setting.location, + Name: t.config.Name, + Replace: lo.FromPtr(t.config.Replace), + MaxRetries: lo.FromPtr(t.config.MaxRetries), + RetryInterval: lo.FromPtr(t.config.RetryInterval), + Timeout: lo.FromPtr(t.config.Timeout), + Location: t.config.location, PreRunTime: t.trigger.prev, NextRunTime: t.trigger.next, } @@ -78,7 +78,7 @@ func (t *namedJob) Execute(ctx context.Context) (gErr error) { } return try.Try(func() error { - ctx, cancel := context.WithTimeout(ctx, lo.FromPtr(t.setting.Timeout)) + ctx, cancel := context.WithTimeout(ctx, lo.FromPtr(t.config.Timeout)) defer cancel() return t.fn(ctx, t.name, &metadata) @@ -91,8 +91,8 @@ func registerJob(s *Scheduler, job jobWrapper, fn JobFunc) (r result.Error) { return } - setting := s.configMap[job.key] - trigger := getTrigger(job, setting.location).UnwrapErr(&r) + config := s.configMap[job.key] + trigger := getTrigger(job, config.location).UnwrapErr(&r) if r.IsErr() { return } @@ -102,15 +102,15 @@ func registerJob(s *Scheduler, job jobWrapper, fn JobFunc) (r result.Error) { } jobOpt := &quartz.JobDetailOptions{ - MaxRetries: lo.FromPtr(setting.MaxRetries), - RetryInterval: lo.FromPtr(setting.RetryInterval), - Replace: lo.FromPtr(setting.Replace), + MaxRetries: lo.FromPtr(config.MaxRetries), + RetryInterval: lo.FromPtr(config.RetryInterval), + Replace: lo.FromPtr(config.Replace), Suspended: false, } return result.ErrOf(s.scheduler.ScheduleJob( quartz.NewJobDetailWithOptions( - &namedJob{s: s, name: job.key, fn: fn, log: s.log, setting: setting, trigger: trigger}, + &namedJob{s: s, name: job.key, fn: fn, log: s.log, config: config, trigger: trigger}, quartz.NewJobKey(job.key), jobOpt, ), diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index 27b66daad..dd377ffd7 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -19,7 +19,7 @@ var _ JobRegistry = (*Scheduler)(nil) type Scheduler struct { metric metrics.Metric - configMap map[string]*JobSetting + configMap map[string]*JobConfig scheduler quartz.Scheduler log log.Logger cancel context.CancelFunc @@ -27,7 +27,7 @@ type Scheduler struct { jobs map[string]JobFunc } -func (s *Scheduler) Patch(name string, setting JobSetting) error { +func (s *Scheduler) Patch(name string, config JobConfig) error { //TODO implement me panic("implement me") } From e30584dcad9ff31a563844d7cb8d6207447cd8a8 Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 19 Aug 2025 12:42:23 +0800 Subject: [PATCH 085/142] fix: barry@feat/supervisor, 2025-08-19 12:42:23 --- core/scheduler/aaa.go | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index a24f48235..86d3400d2 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -3,17 +3,25 @@ package scheduler import ( "context" "time" + + "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2/result" ) type JobExecutor interface { - Exec(ctx context.Context, name string, metadata *JobMetadata) error + Name() string + Exec(ctx context.Context, name string, metadata *JobMetadata) result.Result[[]byte] } var _ JobExecutor = (JobFunc)(nil) -type JobFunc func(ctx context.Context, name string, metadata *JobMetadata) error +type JobFunc func(ctx context.Context, name string, metadata *JobMetadata) result.Result[[]byte] + +func (j JobFunc) Name() string { + return stack.CallerWithFunc(j).String() +} -func (j JobFunc) Exec(ctx context.Context, name string, metadata *JobMetadata) error { +func (j JobFunc) Exec(ctx context.Context, name string, metadata *JobMetadata) result.Result[[]byte] { return j(ctx, name, metadata) } @@ -38,6 +46,10 @@ type JobManager interface { Get(name string) Job } +type JobExecT interface { + string | JobFunc +} + type AddJobSpec struct { Name string Config JobConfig From 692ce2ee57fc6b67ab92f4061901f0cca5a1853d Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 19 Aug 2025 22:22:15 +0800 Subject: [PATCH 086/142] fix: barry quick fix, 2025-08-19 22:22:15 --- core/scheduler/aaa.go | 23 ++++++--- core/scheduler/builder.go | 28 ++++++---- core/scheduler/config.go | 71 +++++++++++++++++-------- core/scheduler/job.go | 45 ++++++---------- core/scheduler/scheduler.go | 100 +++++++++++++++++++++++++++++++----- go.mod | 6 +-- go.sum | 8 +-- 7 files changed, 193 insertions(+), 88 deletions(-) diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index 86d3400d2..f6a8df6db 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -2,12 +2,16 @@ package scheduler import ( "context" + stdLog "log" + "os" "time" "github.com/pubgo/funk/stack" "github.com/pubgo/funk/v2/result" ) +var schedulerLog = stdLog.New(os.Stdout, "scheduler", stdLog.LstdFlags|stdLog.Lmsgprefix|stdLog.Lshortfile) + type JobExecutor interface { Name() string Exec(ctx context.Context, name string, metadata *JobMetadata) result.Result[[]byte] @@ -36,7 +40,7 @@ type JobRegistry interface { } type JobManager interface { - Create(spec AddJobSpec) error + Create(spec AddJobSpec) result.Error Patch(name string, config JobConfig) error Pause(name string) error Resume(name string) error @@ -46,10 +50,6 @@ type JobManager interface { Get(name string) Job } -type JobExecT interface { - string | JobFunc -} - type AddJobSpec struct { Name string Config JobConfig @@ -68,8 +68,7 @@ type TickerJob struct { } type CronJob struct { - Expr string - Location string + Expr string } type Job struct { @@ -80,5 +79,13 @@ type Job struct { Once *OnceJob Ticker *TickerJob Cron *CronJob - Status string + Status Status } + +type Status string + +const ( + StatusInit Status = "init" + StatusRunning Status = "running" + StatusStop Status = "stop" +) diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index 8b8ccd30e..c6e31802e 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -3,9 +3,9 @@ package scheduler import ( "context" "fmt" - "github.com/pubgo/funk/log" "github.com/pubgo/funk/v2/result" + qlog "github.com/reugn/go-quartz/logger" "github.com/reugn/go-quartz/quartz" "github.com/pubgo/lava/core/lifecycle" @@ -37,26 +37,32 @@ func NewService(params Params) (supervisor.Service, error) { return supervisor.NewService(Name, s.Serve), err } -func New(m lifecycle.Lifecycle, log log.Logger, opts []*Config, routers []JobRegister, metric metrics.Metric) (_ *Scheduler, gErr error) { - config := createConfig(opts).Unwrap(&gErr) +func New(m lifecycle.Lifecycle, logger log.Logger, metric metrics.Metric, configs []*Config, routers []JobRegister, executors []JobExecutor) (_ *Scheduler, gErr error) { + configMap := createConfig(configs).Unwrap(&gErr) if gErr != nil { return nil, fmt.Errorf("failed to create config, err:%w", gErr) } - scheduler := result.Wrap(quartz.NewStdScheduler()).Unwrap(&gErr) + scheduler := result.Wrap(quartz.NewStdScheduler(quartz.WithLogger(qlog.NewSimpleLogger(schedulerLog, qlog.LevelDebug)))).Unwrap(&gErr) if gErr != nil { return nil, fmt.Errorf("failed to create scheduler, err:%w", gErr) } + jobExecutors := make(map[string]JobExecutor) + for _, executor := range executors { + regJobExecutor(jobExecutors, executor) + } + ctx, cancel := context.WithCancel(context.Background()) quart := &Scheduler{ - metric: metric, - configMap: config, - scheduler: scheduler, - log: log.WithName(Name), - ctx: ctx, - cancel: cancel, - jobs: make(map[string]JobFunc), + metric: metric, + configMap: configMap, + scheduler: scheduler, + log: logger.WithName(Name), + ctx: ctx, + cancel: cancel, + jobs: make(map[string]*jobTask), + jobExecutors: jobExecutors, } quart.start() diff --git a/core/scheduler/config.go b/core/scheduler/config.go index 079d97ba8..1b01d49fb 100644 --- a/core/scheduler/config.go +++ b/core/scheduler/config.go @@ -1,39 +1,32 @@ package scheduler import ( - "fmt" + "github.com/reugn/go-quartz/quartz" "time" "github.com/pubgo/funk/v2/result" "github.com/samber/lo" ) -func createConfig(opts []*Config) (r result.Result[map[string]*JobConfig]) { +func createConfig(configs []*Config) (r result.Result[map[string]*JobConfig]) { configMap := make(map[string]*JobConfig) - if len(opts) > 0 && opts[0] != nil { - for _, config := range opts[0].JobConfigs { - if config.Name == "" { - return r.WithErrorf("schedule job name is empty") - } - - if _, ok := configMap[config.Name]; ok { - return r.WithErrorf("schedule job(%s) exists", config.Name) - } - - configMap[config.Name] = initConfig(config.Name, lo.ToPtr(config)). - MapErr(func(err error) error { - return fmt.Errorf("schedule job(%s) error: %w", config.Name, err) - }). - UnwrapErr(&r) - if r.IsErr() { - return - } + if len(configs) == 0 || configs[0] == nil { + return r.WithValue(configMap) + } + + for _, config := range configs[0].JobConfigs { + if config.Name == "" { + return r.WithErrorf("schedule job name is empty") + } + + if _, ok := configMap[config.Name]; ok { + return r.WithErrorf("schedule job(%s) exists", config.Name) } } return r.WithValue(configMap) } -func initConfig(name string, cfg *JobConfig) (r result.Result[*JobConfig]) { +func initConfig(name string, cfg *JobConfig, mergeCfg *JobConfig) (r result.Result[*JobConfig]) { if cfg == nil { cfg = &JobConfig{Name: name} } @@ -63,6 +56,33 @@ func initConfig(name string, cfg *JobConfig) (r result.Result[*JobConfig]) { cfg.location = result.Wrap(time.LoadLocation(lo.FromPtr(cfg.Location))).UnwrapErr(&r) } + if mergeCfg != nil { + if mergeCfg.Disabled != nil { + cfg.Disabled = mergeCfg.Disabled + } + + if mergeCfg.Timeout != nil { + cfg.Timeout = mergeCfg.Timeout + } + + if mergeCfg.RetryInterval != nil { + cfg.RetryInterval = mergeCfg.RetryInterval + } + + if mergeCfg.MaxRetries != nil { + cfg.MaxRetries = mergeCfg.MaxRetries + } + + if mergeCfg.Replace != nil { + cfg.Replace = mergeCfg.Replace + } + + if mergeCfg.Location != nil { + cfg.Location = mergeCfg.Location + cfg.location = result.Wrap(time.LoadLocation(lo.FromPtr(cfg.Location))).UnwrapErr(&r) + } + } + return r.WithValue(cfg) } @@ -92,6 +112,15 @@ type JobConfig struct { //quartz.JobDetailOptions } +func (c JobConfig) ToJobDetailOptions() *quartz.JobDetailOptions { + return &quartz.JobDetailOptions{ + MaxRetries: lo.FromPtr(c.MaxRetries), + RetryInterval: lo.FromPtr(c.RetryInterval), + Replace: lo.FromPtr(c.Replace), + Suspended: false, + } +} + type Config struct { Timeout string `yaml:"timeout"` JobConfigs []JobConfig `yaml:"jobs"` diff --git a/core/scheduler/job.go b/core/scheduler/job.go index 4cb5e7acd..753f11599 100644 --- a/core/scheduler/job.go +++ b/core/scheduler/job.go @@ -10,20 +10,10 @@ import ( "github.com/pubgo/funk/log" "github.com/pubgo/funk/try" "github.com/pubgo/funk/v2/result" + "github.com/pubgo/lava/core/metrics" "github.com/reugn/go-quartz/quartz" "github.com/rs/zerolog" "github.com/samber/lo" - "go.uber.org/atomic" - - "github.com/pubgo/lava/core/metrics" -) - -type Status string - -const ( - StatusInit Status = "init" - StatusRunning Status = "running" - StatusStop Status = "stop" ) type jobWrapper struct { @@ -34,14 +24,11 @@ type jobWrapper struct { } type namedJob struct { - s *Scheduler - name string - fn JobFunc - log log.Logger - config *JobConfig - trigger *triggerImpl - - runs atomic.Uint64 + s *Scheduler + name string + log log.Logger + + task *jobTask } func (t *namedJob) Description() string { return t.name } @@ -61,7 +48,7 @@ func (t *namedJob) Execute(ctx context.Context) (gErr error) { }) }() - t.runs.Inc() + t.task.runs.Inc() metadata := JobMetadata{ Name: t.config.Name, Replace: lo.FromPtr(t.config.Replace), @@ -73,7 +60,7 @@ func (t *namedJob) Execute(ctx context.Context) (gErr error) { NextRunTime: t.trigger.next, } - if t.trigger.err != nil { + if t.task.trigger.err != nil { return fmt.Errorf("schedule job(%s) error: %w", t.name, t.trigger.err) } @@ -142,21 +129,21 @@ func (t *triggerImpl) Description() string { return t.trigger.Description() } -func getTrigger(j jobWrapper, location *time.Location) (r result.Result[*triggerImpl]) { - if j.once { - return r.WithValue(newTrigger(quartz.NewRunOnceTrigger(j.dur))) +func getTrigger(j AddJobSpec, location *time.Location) (r result.Result[*triggerImpl]) { + if j.Once != nil { + return r.WithValue(newTrigger(quartz.NewRunOnceTrigger(j.Once.Delay))) } - if j.cron != "" { - trigger, err := quartz.NewCronTriggerWithLoc(j.cron, location) + if j.Cron != nil { + trigger, err := quartz.NewCronTriggerWithLoc(j.Cron.Expr, location) if err != nil { - return r.WithErrorf("cron-expr:%s, err:%s", j.cron, err.Error()) + return r.WithErrorf("cron-expr:%s, err:%s", j.Cron.Expr, err.Error()) } return r.WithValue(newTrigger(trigger)) } - if j.dur != 0 { - return r.WithValue(newTrigger(quartz.NewSimpleTrigger(j.dur))) + if j.Ticker != nil { + return r.WithValue(newTrigger(quartz.NewSimpleTrigger(j.Ticker.Dur))) } return r.WithErrorf("please init dur or cron") diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index dd377ffd7..a74378b53 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -9,22 +9,54 @@ import ( "github.com/pubgo/funk/errors" "github.com/pubgo/funk/log" "github.com/pubgo/funk/stack" - "github.com/reugn/go-quartz/quartz" - + "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/core/metrics" + "github.com/reugn/go-quartz/quartz" + "go.uber.org/atomic" ) +type jobTask struct { + name string + executor JobExecutor + config *JobConfig + + Once *OnceJob + Ticker *TickerJob + Cron *CronJob + + trigger *triggerImpl + runs atomic.Uint64 +} + var _ JobManager = (*Scheduler)(nil) var _ JobRegistry = (*Scheduler)(nil) type Scheduler struct { - metric metrics.Metric - configMap map[string]*JobConfig - scheduler quartz.Scheduler - log log.Logger - cancel context.CancelFunc - ctx context.Context - jobs map[string]JobFunc + metric metrics.Metric + configMap map[string]*JobConfig + scheduler quartz.Scheduler + log log.Logger + cancel context.CancelFunc + ctx context.Context + jobs map[string]*jobTask + jobExecutors map[string]JobExecutor +} + +func regJobExecutor(jobExecutors map[string]JobExecutor, executor JobExecutor) (r result.Error) { + if executor == nil { + return result.Errorf("executor is nil") + } + + if executor.Name() == "" { + return result.Errorf("executor name is empty") + } + + if jobExecutors[executor.Name()] != nil { + return result.Errorf("[job executor] %s already exists", executor.Name()) + } + + jobExecutors[executor.Name()] = executor + return } func (s *Scheduler) Patch(name string, config JobConfig) error { @@ -32,9 +64,53 @@ func (s *Scheduler) Patch(name string, config JobConfig) error { panic("implement me") } -func (s *Scheduler) Create(spec AddJobSpec) error { - //TODO implement me - panic("implement me") +func (s *Scheduler) Create(spec AddJobSpec) (r result.Error) { + if spec.Name == "" { + return result.Errorf("job name is empty") + } + + name := spec.Name + if s.jobs[name] != nil { + return result.Errorf("job %s already exists", name) + } + + config := initConfig(name, s.configMap[name], &spec.Config). + InspectErr(func(err error) { + s.log.Err(err).Msgf("failed to init schedule job(%s) config", name) + }). + UnwrapErr(&r) + if r.IsErr() { + return + } + + executor := GetJobExecutor(spec.Executor) + if executor == nil { + return result.ErrorOf("schedule job(%s) error: %s", name, "executor is nil") + } + + trigger := getTrigger(spec, config.location).UnwrapErr(&r) + if r.IsErr() { + return + } + + task := &jobTask{ + name: name, + executor: executor, + config: config, + trigger: trigger, + + Once: spec.Once, + Ticker: spec.Ticker, + Cron: spec.Cron, + } + s.jobs[name] = task + + jobOpt := config.ToJobDetailOptions() + job := &namedJob{s: s, name: name, task: task, log: s.log} + return result.ErrOf(s.scheduler.ScheduleJob( + quartz.NewJobDetailWithOptions(job, parseJobKey(name), jobOpt), + trigger, + )) } func (s *Scheduler) Pause(name string) error { diff --git a/go.mod b/go.mod index 0f8f0c837..f85291b92 100644 --- a/go.mod +++ b/go.mod @@ -13,12 +13,12 @@ require ( github.com/olekukonko/tablewriter v1.0.8 github.com/pkg/errors v0.9.1 github.com/pubgo/opendoc v0.0.5 - github.com/reugn/go-quartz v0.14.0 + github.com/reugn/go-quartz v0.15.0 github.com/vmihailenco/msgpack/v5 v5.4.1 go.opentelemetry.io/otel v1.37.0 go.opentelemetry.io/otel/metric v1.37.0 go.opentelemetry.io/otel/trace v1.37.0 - go.uber.org/atomic v1.11.0 // indirect + go.uber.org/atomic v1.11.0 go.uber.org/automaxprocs v1.6.0 golang.org/x/crypto v0.39.0 // indirect golang.org/x/mod v0.25.0 // indirect @@ -54,7 +54,7 @@ require ( github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.65.0 github.com/pubgo/dix v0.3.21 - github.com/pubgo/funk v0.5.69-alpha.3 + github.com/pubgo/funk v0.5.69-alpha.4 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.6.0 github.com/rs/zerolog v1.34.0 diff --git a/go.sum b/go.sum index 67c4ff304..8d3b950ee 100644 --- a/go.sum +++ b/go.sum @@ -500,8 +500,8 @@ github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7D github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/pubgo/dix v0.3.21 h1:jtriLYT6srKrxv0KRwic1no0d9ZTMtLx6r3JJxQ5Jvw= github.com/pubgo/dix v0.3.21/go.mod h1:5qHJ7ycvBVw1AUjgYMEsobzx1tggiRs+spgzd4Jglb4= -github.com/pubgo/funk v0.5.69-alpha.3 h1:qG1Xj5wAt1CDZfNuiaiQaxLHfraCaCvaAOlOoEE/O60= -github.com/pubgo/funk v0.5.69-alpha.3/go.mod h1:2pmwhKjmb6h/IltbdQCGmjn3T+yY7vvY+jNrIJh8mhU= +github.com/pubgo/funk v0.5.69-alpha.4 h1:EaEu8Gcmcw29tEiH9EHenq05I5vLnoWDkD/L8z30LPc= +github.com/pubgo/funk v0.5.69-alpha.4/go.mod h1:2pmwhKjmb6h/IltbdQCGmjn3T+yY7vvY+jNrIJh8mhU= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/pubgo/protobuild v0.0.21 h1:QSwh92QxsD6Mv7kQlowzE7fxtcOm1eMWmgADsD803Js= @@ -516,8 +516,8 @@ github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= -github.com/reugn/go-quartz v0.14.0 h1:KlIBAsOIw1JI8Rc7/f8VrrHBHOr+BiqrTiB35pRe84M= -github.com/reugn/go-quartz v0.14.0/go.mod h1:00DVnBKq2Fxag/HlR9mGXjmHNlMFQ1n/LNM+Fn0jUaE= +github.com/reugn/go-quartz v0.15.0 h1:Zv4+p5jBIBDtnGK6HC08ecSSWuOYPngeLivApqBiwjc= +github.com/reugn/go-quartz v0.15.0/go.mod h1:00DVnBKq2Fxag/HlR9mGXjmHNlMFQ1n/LNM+Fn0jUaE= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= From 1e3be469fcff08d04e6145d7b4c125d0ddf503cb Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 19 Aug 2025 22:23:11 +0800 Subject: [PATCH 087/142] fix: barry quick fix, 2025-08-19 22:23:11 --- core/scheduler/config.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/scheduler/config.go b/core/scheduler/config.go index 1b01d49fb..2528f9e34 100644 --- a/core/scheduler/config.go +++ b/core/scheduler/config.go @@ -108,8 +108,6 @@ type JobConfig struct { Location *string `yaml:"location"` location *time.Location - - //quartz.JobDetailOptions } func (c JobConfig) ToJobDetailOptions() *quartz.JobDetailOptions { From 0a0c5903ad00f6e51aa69793c0ad4256d620006c Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 19 Aug 2025 22:39:56 +0800 Subject: [PATCH 088/142] fix: barry quick fix, 2025-08-19 22:39:56 --- core/scheduler/aaa.go | 16 ++++++++++++++++ core/scheduler/builder.go | 21 ++++++++++++--------- core/scheduler/config.go | 33 ++++++++++++++++++--------------- core/scheduler/job.go | 29 +++++++++++++++-------------- core/scheduler/scheduler.go | 6 ++++-- 5 files changed, 65 insertions(+), 40 deletions(-) diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index f6a8df6db..b07dfa7d7 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -50,6 +50,10 @@ type JobManager interface { Get(name string) Job } +type JobExecT interface { + string | JobFunc +} + type AddJobSpec struct { Name string Config JobConfig @@ -89,3 +93,15 @@ const ( StatusRunning Status = "running" StatusStop Status = "stop" ) + +type JobMetadata struct { + Name string + Timeout time.Duration + MaxRetries int + RetryInterval time.Duration + Replace bool + Location *time.Location + + PreRunTime int64 + NextRunTime int64 +} diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index c6e31802e..8a92196b0 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -3,6 +3,7 @@ package scheduler import ( "context" "fmt" + "github.com/pubgo/funk/log" "github.com/pubgo/funk/v2/result" qlog "github.com/reugn/go-quartz/logger" @@ -16,20 +17,22 @@ import ( const Name = "scheduler" type Params struct { - M lifecycle.Lifecycle - Log log.Logger - Configs []*Config - Routers []JobRegister - Metric metrics.Metric + M lifecycle.Lifecycle + Log log.Logger + Configs []*Config + Routers []JobRegister + Metric metrics.Metric + Executors []JobExecutor } func NewService(params Params) (supervisor.Service, error) { s, err := New( params.M, params.Log, + params.Metric, params.Configs, params.Routers, - params.Metric, + params.Executors, ) if err != nil { return nil, err @@ -65,12 +68,12 @@ func New(m lifecycle.Lifecycle, logger log.Logger, metric metrics.Metric, config jobExecutors: jobExecutors, } - quart.start() - m.BeforeStop(lifecycle.WrapNoCtxErr(quart.stop)) - for _, r := range routers { r.RegisterSchedulerJob(quart) } + quart.start() + m.BeforeStop(lifecycle.WrapNoCtxErr(quart.stop)) + return quart, nil } diff --git a/core/scheduler/config.go b/core/scheduler/config.go index 2528f9e34..57959f27c 100644 --- a/core/scheduler/config.go +++ b/core/scheduler/config.go @@ -1,10 +1,11 @@ package scheduler import ( - "github.com/reugn/go-quartz/quartz" "time" + "github.com/pubgo/funk/log" "github.com/pubgo/funk/v2/result" + "github.com/reugn/go-quartz/quartz" "github.com/samber/lo" ) @@ -53,7 +54,14 @@ func initConfig(name string, cfg *JobConfig, mergeCfg *JobConfig) (r result.Resu if cfg.Location == nil { cfg.Location = lo.ToPtr(time.UTC.String()) - cfg.location = result.Wrap(time.LoadLocation(lo.FromPtr(cfg.Location))).UnwrapErr(&r) + cfg.location = result.Wrap(time.LoadLocation(lo.FromPtr(cfg.Location))). + InspectErr(func(err error) { + log.Err(err).Msgf("failed to parse time location:%s", lo.FromPtr(mergeCfg.Location)) + }). + UnwrapErr(&r) + if r.IsErr() { + return + } } if mergeCfg != nil { @@ -79,7 +87,14 @@ func initConfig(name string, cfg *JobConfig, mergeCfg *JobConfig) (r result.Resu if mergeCfg.Location != nil { cfg.Location = mergeCfg.Location - cfg.location = result.Wrap(time.LoadLocation(lo.FromPtr(cfg.Location))).UnwrapErr(&r) + cfg.location = result.Wrap(time.LoadLocation(lo.FromPtr(cfg.Location))). + InspectErr(func(err error) { + log.Err(err).Msgf("failed to parse time location:%s", lo.FromPtr(mergeCfg.Location)) + }). + UnwrapErr(&r) + if r.IsErr() { + return + } } } @@ -127,15 +142,3 @@ type Config struct { type JobsConfigLoader struct { Scheduler *Config `yaml:"scheduler"` } - -type JobMetadata struct { - Name string - Timeout time.Duration - MaxRetries int - RetryInterval time.Duration - Replace bool - Location *time.Location - - PreRunTime int64 - NextRunTime int64 -} diff --git a/core/scheduler/job.go b/core/scheduler/job.go index 753f11599..f65424d2f 100644 --- a/core/scheduler/job.go +++ b/core/scheduler/job.go @@ -43,32 +43,33 @@ func (t *namedJob) Execute(ctx context.Context) (gErr error) { logger.Func(func(e *zerolog.Event) { e.Float32("job_cost_ms", float32(cost)) e.Str("job_name", t.name) - e.Uint64("runs", t.runs.Load()) + e.Uint64("runs", t.task.runs.Load()) e.Msg("exec scheduler job") }) }() t.task.runs.Inc() metadata := JobMetadata{ - Name: t.config.Name, - Replace: lo.FromPtr(t.config.Replace), - MaxRetries: lo.FromPtr(t.config.MaxRetries), - RetryInterval: lo.FromPtr(t.config.RetryInterval), - Timeout: lo.FromPtr(t.config.Timeout), - Location: t.config.location, - PreRunTime: t.trigger.prev, - NextRunTime: t.trigger.next, + Name: t.task.config.Name, + Replace: lo.FromPtr(t.task.config.Replace), + MaxRetries: lo.FromPtr(t.task.config.MaxRetries), + RetryInterval: lo.FromPtr(t.task.config.RetryInterval), + Timeout: lo.FromPtr(t.task.config.Timeout), + Location: t.task.config.location, + PreRunTime: t.task.trigger.prev, + NextRunTime: t.task.trigger.next, } if t.task.trigger.err != nil { - return fmt.Errorf("schedule job(%s) error: %w", t.name, t.trigger.err) + return fmt.Errorf("schedule job(%s) error: %w", t.name, t.task.trigger.err) } return try.Try(func() error { - ctx, cancel := context.WithTimeout(ctx, lo.FromPtr(t.config.Timeout)) + ctx, cancel := context.WithTimeout(ctx, lo.FromPtr(t.task.config.Timeout)) defer cancel() - return t.fn(ctx, t.name, &metadata) + t.task.result = t.task.executor.Exec(ctx, t.name, &metadata) + return t.task.result.GetErr() }) } @@ -85,7 +86,7 @@ func registerJob(s *Scheduler, job jobWrapper, fn JobFunc) (r result.Error) { } if fn == nil { - return result.ErrorOf("schedule job(%s) error: %s", job.key, "fn is nil") + return result.Errorf("schedule job(%s) error: %s", job.key, "fn is nil") } jobOpt := &quartz.JobDetailOptions{ @@ -146,7 +147,7 @@ func getTrigger(j AddJobSpec, location *time.Location) (r result.Result[*trigger return r.WithValue(newTrigger(quartz.NewSimpleTrigger(j.Ticker.Dur))) } - return r.WithErrorf("please init dur or cron") + return r.WithErrorf("please init Once, Cron or Ticker") } func parseJobKey(name string) *quartz.JobKey { diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index a74378b53..4d3c0d286 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -26,6 +26,8 @@ type jobTask struct { trigger *triggerImpl runs atomic.Uint64 + + result result.Result[[]byte] } var _ JobManager = (*Scheduler)(nil) @@ -83,9 +85,9 @@ func (s *Scheduler) Create(spec AddJobSpec) (r result.Error) { return } - executor := GetJobExecutor(spec.Executor) + executor := s.jobExecutors[spec.Executor] if executor == nil { - return result.ErrorOf("schedule job(%s) error: %s", name, "executor is nil") + return result.Errorf("schedule job(%s) executor is nil", name) } trigger := getTrigger(spec, config.location).UnwrapErr(&r) From 856647c3623c92a08370a6e5a9fdc81ef484c32b Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 19 Aug 2025 23:12:08 +0800 Subject: [PATCH 089/142] fix: barry quick fix, 2025-08-19 23:12:08 --- core/scheduler/aaa.go | 22 +++---- core/scheduler/scheduler.go | 122 ++++++++++++++++++++++-------------- 2 files changed, 86 insertions(+), 58 deletions(-) diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index b07dfa7d7..2e239902b 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -34,20 +34,20 @@ type JobRegister interface { } type JobRegistry interface { - Once(name string, delay time.Duration, fn JobFunc) - Every(name string, dur time.Duration, fn JobFunc) - Cron(name, expr string, fn JobFunc) + Once(name string, delay time.Duration, fn JobFunc) result.Error + Every(name string, dur time.Duration, fn JobFunc) result.Error + Cron(name, expr string, fn JobFunc) result.Error } type JobManager interface { - Create(spec AddJobSpec) result.Error - Patch(name string, config JobConfig) error - Pause(name string) error - Resume(name string) error - Delete(name string) error - Reload(name string) error - List() []Job - Get(name string) Job + CreateJob(spec AddJobSpec) result.Error + PatchJob(name string, config *JobConfig) result.Error + PauseJob(name string) result.Error + ResumeJob(name string) result.Error + DeleteJob(name string) result.Error + ReloadJob(name string) result.Error + ListJobs() []Job + GetJob(name string) Job } type JobExecT interface { diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index 4d3c0d286..2500a8c5a 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -6,12 +6,11 @@ import ( "time" "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" "github.com/pubgo/funk/log" - "github.com/pubgo/funk/stack" "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/core/metrics" "github.com/reugn/go-quartz/quartz" + "github.com/rs/zerolog" "go.uber.org/atomic" ) @@ -61,12 +60,37 @@ func regJobExecutor(jobExecutors map[string]JobExecutor, executor JobExecutor) ( return } -func (s *Scheduler) Patch(name string, config JobConfig) error { +func (s *Scheduler) PatchJob(name string, config *JobConfig) result.Error { //TODO implement me panic("implement me") } -func (s *Scheduler) Create(spec AddJobSpec) (r result.Error) { +func (s *Scheduler) createJob(spec AddJobSpec, fn JobFunc) (r result.Error) { + task := jobTask{Once: spec.Once, Ticker: spec.Ticker, Cron: spec.Cron, name: spec.Name} + + defer func() { + logFn := func(e *zerolog.Event) { + e.Str("name", task.name) + + if task.executor != nil { + e.Str("executor", task.executor.Name()) + } + + if task.config != nil { + e.Any("config", task.config) + } + e.Any("once", task.Once) + e.Any("ticker", task.Ticker) + e.Any("cron", task.Cron) + } + if r.IsErr() { + s.log.Err(r.GetErr()).Func(logFn).Msg("failed to register scheduler job") + } else { + s.log.Info().Func(logFn).Msg("register scheduler job ok") + } + }() + defer result.RecoveryErr(&r) + if spec.Name == "" { return result.Errorf("job name is empty") } @@ -76,71 +100,87 @@ func (s *Scheduler) Create(spec AddJobSpec) (r result.Error) { return result.Errorf("job %s already exists", name) } + result.WrapFn(func() (JobExecutor, error) { + executor := s.jobExecutors[spec.Executor] + if executor == nil { + executor = fn + } + + if executor == nil { + return nil, fmt.Errorf("schedule job(%s) executor is nil", name) + } + return executor, nil + }). + Inspect(func(executor JobExecutor) { + task.executor = executor + }). + UnwrapErr(&r) + if r.IsErr() { + return + } + config := initConfig(name, s.configMap[name], &spec.Config). InspectErr(func(err error) { s.log.Err(err).Msgf("failed to init schedule job(%s) config", name) }). + Inspect(func(config *JobConfig) { + task.config = config + }). UnwrapErr(&r) if r.IsErr() { return } - executor := s.jobExecutors[spec.Executor] - if executor == nil { - return result.Errorf("schedule job(%s) executor is nil", name) - } - - trigger := getTrigger(spec, config.location).UnwrapErr(&r) + trigger := getTrigger(spec, config.location). + Inspect(func(trigger *triggerImpl) { + task.trigger = trigger + }). + UnwrapErr(&r) if r.IsErr() { return } - task := &jobTask{ - name: name, - executor: executor, - config: config, - trigger: trigger, - - Once: spec.Once, - Ticker: spec.Ticker, - Cron: spec.Cron, + jobOpt := config.ToJobDetailOptions() + job := &namedJob{s: s, name: name, task: &task, log: s.log} + jobDetail := quartz.NewJobDetailWithOptions(job, parseJobKey(name), jobOpt) + if result.CatchErr(&r, s.scheduler.ScheduleJob(jobDetail, trigger)) { + return } - s.jobs[name] = task - jobOpt := config.ToJobDetailOptions() - job := &namedJob{s: s, name: name, task: task, log: s.log} - return result.ErrOf(s.scheduler.ScheduleJob( - quartz.NewJobDetailWithOptions(job, parseJobKey(name), jobOpt), - trigger, - )) + s.jobs[name] = &task + return } -func (s *Scheduler) Pause(name string) error { +func (s *Scheduler) CreateJob(spec AddJobSpec) (r result.Error) { + return s.createJob(spec, nil) +} + +func (s *Scheduler) PauseJob(name string) result.Error { //TODO implement me panic("implement me") } -func (s *Scheduler) Resume(name string) error { +func (s *Scheduler) ResumeJob(name string) result.Error { //TODO implement me panic("implement me") } -func (s *Scheduler) Delete(name string) error { +func (s *Scheduler) DeleteJob(name string) result.Error { //TODO implement me panic("implement me") } -func (s *Scheduler) Reload(name string) error { +func (s *Scheduler) ReloadJob(name string) result.Error { //TODO implement me panic("implement me") } -func (s *Scheduler) List() []Job { +func (s *Scheduler) ListJobs() []Job { //TODO implement me panic("implement me") } -func (s *Scheduler) Get(name string) Job { +func (s *Scheduler) GetJob(name string) Job { //TODO implement me panic("implement me") } @@ -173,19 +213,7 @@ func (s *Scheduler) start() { s.scheduler.Start(s.ctx) } -func (s *Scheduler) checkJobExists(name string, fn JobFunc) error { - if s.jobs[name] != nil { - return &errors.Err{ - Msg: fmt.Sprintf("job %s exists", name), - Detail: stack.CallerWithFunc(s.jobs[name]).String(), - } - } - - s.jobs[name] = fn - return nil -} - -func (s *Scheduler) Once(name string, delay time.Duration, fn JobFunc) { +func (s *Scheduler) Once(name string, delay time.Duration, fn JobFunc) result.Error { assert.Must(s.checkJobExists(name, fn)) s.log.WithCallerSkip(1).Info(). @@ -195,7 +223,7 @@ func (s *Scheduler) Once(name string, delay time.Duration, fn JobFunc) { registerJob(s, jobWrapper{dur: delay, key: name, once: true}, fn) } -func (s *Scheduler) Every(name string, dur time.Duration, fn JobFunc) { +func (s *Scheduler) Every(name string, dur time.Duration, fn JobFunc) result.Error { assert.Must(s.checkJobExists(name, fn)) s.log.WithCallerSkip(1).Info(). @@ -205,7 +233,7 @@ func (s *Scheduler) Every(name string, dur time.Duration, fn JobFunc) { registerJob(s, jobWrapper{dur: dur, key: name}, fn) } -func (s *Scheduler) Cron(name, expr string, fn JobFunc) { +func (s *Scheduler) Cron(name, expr string, fn JobFunc) result.Error { assert.Must(s.checkJobExists(name, fn)) s.log.WithCallerSkip(1).Info(). From ba3e52e2b7dc4762ea5a6597e3a35e7360a536dc Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 19 Aug 2025 23:14:08 +0800 Subject: [PATCH 090/142] fix: barry quick fix, 2025-08-19 23:14:08 --- core/scheduler/aaa.go | 4 ++-- core/scheduler/job.go | 2 +- core/scheduler/scheduler.go | 29 +++++------------------------ 3 files changed, 8 insertions(+), 27 deletions(-) diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index 2e239902b..25ce19b92 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -40,7 +40,7 @@ type JobRegistry interface { } type JobManager interface { - CreateJob(spec AddJobSpec) result.Error + CreateJob(spec JobSpec) result.Error PatchJob(name string, config *JobConfig) result.Error PauseJob(name string) result.Error ResumeJob(name string) result.Error @@ -54,7 +54,7 @@ type JobExecT interface { string | JobFunc } -type AddJobSpec struct { +type JobSpec struct { Name string Config JobConfig Executor string diff --git a/core/scheduler/job.go b/core/scheduler/job.go index f65424d2f..30cf45a7e 100644 --- a/core/scheduler/job.go +++ b/core/scheduler/job.go @@ -130,7 +130,7 @@ func (t *triggerImpl) Description() string { return t.trigger.Description() } -func getTrigger(j AddJobSpec, location *time.Location) (r result.Result[*triggerImpl]) { +func getTrigger(j JobSpec, location *time.Location) (r result.Result[*triggerImpl]) { if j.Once != nil { return r.WithValue(newTrigger(quartz.NewRunOnceTrigger(j.Once.Delay))) } diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index 2500a8c5a..bebb4633c 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -5,7 +5,6 @@ import ( "fmt" "time" - "github.com/pubgo/funk/assert" "github.com/pubgo/funk/log" "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/core/metrics" @@ -65,7 +64,7 @@ func (s *Scheduler) PatchJob(name string, config *JobConfig) result.Error { panic("implement me") } -func (s *Scheduler) createJob(spec AddJobSpec, fn JobFunc) (r result.Error) { +func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { task := jobTask{Once: spec.Once, Ticker: spec.Ticker, Cron: spec.Cron, name: spec.Name} defer func() { @@ -151,7 +150,7 @@ func (s *Scheduler) createJob(spec AddJobSpec, fn JobFunc) (r result.Error) { return } -func (s *Scheduler) CreateJob(spec AddJobSpec) (r result.Error) { +func (s *Scheduler) CreateJob(spec JobSpec) (r result.Error) { return s.createJob(spec, nil) } @@ -214,31 +213,13 @@ func (s *Scheduler) start() { } func (s *Scheduler) Once(name string, delay time.Duration, fn JobFunc) result.Error { - assert.Must(s.checkJobExists(name, fn)) - - s.log.WithCallerSkip(1).Info(). - Str("name", name). - Str("delay", delay.String()). - Msg("register once scheduler") - registerJob(s, jobWrapper{dur: delay, key: name, once: true}, fn) + return s.createJob(JobSpec{Name: name, Once: &OnceJob{Delay: delay}}, fn) } func (s *Scheduler) Every(name string, dur time.Duration, fn JobFunc) result.Error { - assert.Must(s.checkJobExists(name, fn)) - - s.log.WithCallerSkip(1).Info(). - Str("name", name). - Str("dur", dur.String()). - Msg("register periodic scheduler") - registerJob(s, jobWrapper{dur: dur, key: name}, fn) + return s.createJob(JobSpec{Name: name, Ticker: &TickerJob{Dur: dur}}, fn) } func (s *Scheduler) Cron(name, expr string, fn JobFunc) result.Error { - assert.Must(s.checkJobExists(name, fn)) - - s.log.WithCallerSkip(1).Info(). - Str("name", name). - Str("expr", expr). - Msg("register cron scheduler") - registerJob(s, jobWrapper{cron: expr, key: name}, fn) + return s.createJob(JobSpec{Name: name, Cron: &CronJob{Expr: expr}}, fn) } From e6ce08fac85292421060062762ad8457fdc60ad0 Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 19 Aug 2025 23:15:09 +0800 Subject: [PATCH 091/142] fix: barry quick fix, 2025-08-19 23:15:09 --- core/scheduler/aaa.go | 2 +- core/scheduler/scheduler.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index 25ce19b92..a6dcd1aa8 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -56,7 +56,7 @@ type JobExecT interface { type JobSpec struct { Name string - Config JobConfig + Config *JobConfig Executor string Once *OnceJob Ticker *TickerJob diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index bebb4633c..e5a42d43b 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -118,7 +118,7 @@ func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { return } - config := initConfig(name, s.configMap[name], &spec.Config). + config := initConfig(name, s.configMap[name], spec.Config). InspectErr(func(err error) { s.log.Err(err).Msgf("failed to init schedule job(%s) config", name) }). From 43ea3d289ee834f6157f378431de710fda203c50 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 20 Aug 2025 09:42:27 +0800 Subject: [PATCH 092/142] fix: barry@feat/supervisor, 2025-08-20 09:42:27 --- core/supervisor/manager.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go index 82e918bad..c445c5d4b 100644 --- a/core/supervisor/manager.go +++ b/core/supervisor/manager.go @@ -180,6 +180,14 @@ func (m *Manager) stop() error { m.cancel() + unstoppedServices, _ := m.supervisor.UnstoppedServiceReport() + if len(unstoppedServices) > 0 { + for _, service := range unstoppedServices { + m.logger.Error().Any("service", service).Msgf("service:%s is still running", service.Name) + } + return errors.New("services are still running") + } + logutil.OkOrFailed(m.logger, "service after-stop", func() error { for _, run := range m.lc.GetAfterStops() { logutil.LogOrErr(m.logger, fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), func() error { @@ -189,13 +197,6 @@ func (m *Manager) stop() error { return nil }) - unstoppedServices, _ := m.supervisor.UnstoppedServiceReport() - if len(unstoppedServices) > 0 { - for _, service := range unstoppedServices { - m.logger.Error().Any("service", service).Msgf("service:%s is still running", service.Name) - } - return errors.New("services are still running") - } return nil } From d1ae0a44b772c885b0d86d2300db8b3cb14eeb5d Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 20 Aug 2025 18:16:11 +0800 Subject: [PATCH 093/142] fix: barry@feat/supervisor, 2025-08-20 18:16:11 --- core/debug/gops/debug.go | 15 +++++++++++++++ core/lavabuilder/builder.go | 2 +- core/scheduler/builder.go | 23 +++++++++++++++++------ go.mod | 7 ++++--- go.sum | 14 ++++++++------ 5 files changed, 45 insertions(+), 16 deletions(-) create mode 100644 core/debug/gops/debug.go diff --git a/core/debug/gops/debug.go b/core/debug/gops/debug.go new file mode 100644 index 000000000..1b07f2bc8 --- /dev/null +++ b/core/debug/gops/debug.go @@ -0,0 +1,15 @@ +package gops + +import ( + "github.com/google/gops/agent" + "github.com/pubgo/funk/log" +) + +func init() { + err := agent.Listen(agent.Options{}) + if err != nil { + log.Err(err).Msg("failed to start gops agent") + } else { + log.Info().Msg("gops agent started ok") + } +} diff --git a/core/lavabuilder/builder.go b/core/lavabuilder/builder.go index 4e1a1a4cd..48ffd982c 100644 --- a/core/lavabuilder/builder.go +++ b/core/lavabuilder/builder.go @@ -30,7 +30,7 @@ import ( "github.com/pubgo/lava/pkg/cmdutil" _ "github.com/pubgo/lava/core/debug/debug" - // debug + _ "github.com/pubgo/lava/core/debug/gops" _ "github.com/pubgo/lava/core/debug/pprof" _ "github.com/pubgo/lava/core/debug/process" _ "github.com/pubgo/lava/core/debug/statsviz" diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index 8a92196b0..bda7c4c65 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -2,7 +2,6 @@ package scheduler import ( "context" - "fmt" "github.com/pubgo/funk/log" "github.com/pubgo/funk/v2/result" @@ -41,19 +40,31 @@ func NewService(params Params) (supervisor.Service, error) { } func New(m lifecycle.Lifecycle, logger log.Logger, metric metrics.Metric, configs []*Config, routers []JobRegister, executors []JobExecutor) (_ *Scheduler, gErr error) { - configMap := createConfig(configs).Unwrap(&gErr) + configMap := createConfig(configs). + InspectErr(func(err error) { + log.Err(err).Any("configs", configs).Msg("failed to create config") + }). + Unwrap(&gErr) if gErr != nil { - return nil, fmt.Errorf("failed to create config, err:%w", gErr) + return } - scheduler := result.Wrap(quartz.NewStdScheduler(quartz.WithLogger(qlog.NewSimpleLogger(schedulerLog, qlog.LevelDebug)))).Unwrap(&gErr) + scheduler := result.Wrap(quartz.NewStdScheduler(quartz.WithLogger(qlog.NewSimpleLogger(schedulerLog, qlog.LevelDebug)))). + InspectErr(func(err error) { + log.Err(err).Msg("failed to create scheduler") + }). + Unwrap(&gErr) if gErr != nil { - return nil, fmt.Errorf("failed to create scheduler, err:%w", gErr) + return } jobExecutors := make(map[string]JobExecutor) for _, executor := range executors { - regJobExecutor(jobExecutors, executor) + regJobExecutor(jobExecutors, executor). + Inspect(func(err error) { + log.Err(err).Msg("failed to register job executor") + }). + Catch(&gErr) } ctx, cancel := context.WithCancel(context.Background()) diff --git a/go.mod b/go.mod index f85291b92..e43c5777b 100644 --- a/go.mod +++ b/go.mod @@ -47,6 +47,7 @@ require ( github.com/gofiber/adaptor/v2 v2.2.1 github.com/gofiber/utils v1.1.0 github.com/golangci/golangci-lint v1.61.0 + github.com/google/gops v0.3.28 github.com/gorilla/websocket v1.5.3 github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 @@ -54,7 +55,7 @@ require ( github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.65.0 github.com/pubgo/dix v0.3.21 - github.com/pubgo/funk v0.5.69-alpha.4 + github.com/pubgo/funk v0.5.69-alpha.6 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.6.0 github.com/rs/zerolog v1.34.0 @@ -62,7 +63,7 @@ require ( github.com/stretchr/testify v1.10.0 github.com/thejerf/suture/v4 v4.0.6 github.com/uber-go/tally/v4 v4.1.17 - github.com/urfave/cli/v3 v3.3.8 + github.com/urfave/cli/v3 v3.4.1 github.com/valyala/fasthttp v1.63.0 github.com/valyala/fasttemplate v1.2.2 go.opentelemetry.io/contrib/zpages v0.62.0 @@ -182,7 +183,7 @@ require ( github.com/joho/godotenv v1.5.1 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/julz/importas v0.1.0 // indirect - github.com/k0kubun/pp/v3 v3.4.1 // indirect + github.com/k0kubun/pp/v3 v3.5.0 // indirect github.com/karamaru-alpha/copyloopvar v1.1.0 // indirect github.com/kisielk/errcheck v1.7.0 // indirect github.com/kkHAIKE/contextcheck v1.1.5 // indirect diff --git a/go.sum b/go.sum index 8d3b950ee..f9d811bb8 100644 --- a/go.sum +++ b/go.sum @@ -277,6 +277,8 @@ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gops v0.3.28 h1:2Xr57tqKAmQYRAfG12E+yLcoa2Y42UJo2lOrUFL9ark= +github.com/google/gops v0.3.28/go.mod h1:6f6+Nl8LcHrzJwi8+p0ii+vmBFSlB4f8cOOkTJ7sk4c= github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/pprof v0.0.0-20250630185457-6e76a2b096b5 h1:xhMrHhTJ6zxu3gA4enFM9MLn9AY7613teCdFnlUVbSQ= github.com/google/pprof v0.0.0-20250630185457-6e76a2b096b5/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA= @@ -343,8 +345,8 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/k0kubun/pp/v3 v3.4.1 h1:1WdFZDRRqe8UsR61N/2RoOZ3ziTEqgTPVqKrHeb779Y= -github.com/k0kubun/pp/v3 v3.4.1/go.mod h1:+SiNiqKnBfw1Nkj82Lh5bIeKQOAkPy6Xw9CAZUZ8npI= +github.com/k0kubun/pp/v3 v3.5.0 h1:iYNlYA5HJAJvkD4ibuf9c8y6SHM0QFhaBuCqm1zHp0w= +github.com/k0kubun/pp/v3 v3.5.0/go.mod h1:5lzno5ZZeEeTV/Ky6vs3g6d1U3WarDrH8k240vMtGro= github.com/karamaru-alpha/copyloopvar v1.1.0 h1:x7gNyKcC2vRBO1H2Mks5u1VxQtYvFiym7fCjIP8RPos= github.com/karamaru-alpha/copyloopvar v1.1.0/go.mod h1:u7CIfztblY0jZLOQZgH3oYsJzpC2A7S6u/lfgSXHy0k= github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 h1:WjT3fLi9n8YWh/Ih8Q1LHAPsTqGddPcHqscN+PJ3i68= @@ -500,8 +502,8 @@ github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7D github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/pubgo/dix v0.3.21 h1:jtriLYT6srKrxv0KRwic1no0d9ZTMtLx6r3JJxQ5Jvw= github.com/pubgo/dix v0.3.21/go.mod h1:5qHJ7ycvBVw1AUjgYMEsobzx1tggiRs+spgzd4Jglb4= -github.com/pubgo/funk v0.5.69-alpha.4 h1:EaEu8Gcmcw29tEiH9EHenq05I5vLnoWDkD/L8z30LPc= -github.com/pubgo/funk v0.5.69-alpha.4/go.mod h1:2pmwhKjmb6h/IltbdQCGmjn3T+yY7vvY+jNrIJh8mhU= +github.com/pubgo/funk v0.5.69-alpha.6 h1:deXmNq7UA6sA4kY6y8pQ27+LM8evaPZZCmBIQPhN4Xs= +github.com/pubgo/funk v0.5.69-alpha.6/go.mod h1:mWqaZftfwVoZk/qhLqb/S3iCa1LR7QKIMh3HsABCIjo= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/pubgo/protobuild v0.0.21 h1:QSwh92QxsD6Mv7kQlowzE7fxtcOm1eMWmgADsD803Js= @@ -630,8 +632,8 @@ github.com/ultraware/funlen v0.1.0 h1:BuqclbkY6pO+cvxoq7OsktIXZpgBSkYTQtmwhAK81v github.com/ultraware/funlen v0.1.0/go.mod h1:XJqmOQja6DpxarLj6Jj1U7JuoS8PvL4nEqDaQhy22p4= github.com/ultraware/whitespace v0.1.1 h1:bTPOGejYFulW3PkcrqkeQwOd6NKOOXvmGD9bo/Gk8VQ= github.com/ultraware/whitespace v0.1.1/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8= -github.com/urfave/cli/v3 v3.3.8 h1:BzolUExliMdet9NlJ/u4m5vHSotJ3PzEqSAZ1oPMa/E= -github.com/urfave/cli/v3 v3.3.8/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo= +github.com/urfave/cli/v3 v3.4.1 h1:1M9UOCy5bLmGnuu1yn3t3CB4rG79Rtoxuv1sPhnm6qM= +github.com/urfave/cli/v3 v3.4.1/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo= github.com/uudashr/gocognit v1.1.3 h1:l+a111VcDbKfynh+airAy/DJQKaXh2m9vkoysMPSZyM= github.com/uudashr/gocognit v1.1.3/go.mod h1:aKH8/e8xbTRBwjbCkwZ8qt4l2EpKXl31KMHgSS+lZ2U= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= From ae007c55003e847d1fdb176f104af5301fe4e61f Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 20 Aug 2025 18:18:22 +0800 Subject: [PATCH 094/142] fix: barry@feat/supervisor, 2025-08-20 18:18:22 --- core/scheduler/builder.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index bda7c4c65..0be90bd8d 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -61,10 +61,13 @@ func New(m lifecycle.Lifecycle, logger log.Logger, metric metrics.Metric, config jobExecutors := make(map[string]JobExecutor) for _, executor := range executors { regJobExecutor(jobExecutors, executor). - Inspect(func(err error) { + InspectErr(func(err error) { log.Err(err).Msg("failed to register job executor") }). Catch(&gErr) + if gErr != nil { + return + } } ctx, cancel := context.WithCancel(context.Background()) From e6a369052ec5b76558c648bf9007292eab598656 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 20 Aug 2025 18:33:05 +0800 Subject: [PATCH 095/142] fix: barry@feat/supervisor, 2025-08-20 18:33:05 --- core/scheduler/aaa.go | 4 ++-- core/scheduler/config.go | 32 ++++++++++++++++---------------- core/scheduler/job.go | 35 +---------------------------------- 3 files changed, 19 insertions(+), 52 deletions(-) diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index a6dcd1aa8..c3f1e911a 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -102,6 +102,6 @@ type JobMetadata struct { Replace bool Location *time.Location - PreRunTime int64 - NextRunTime int64 + PreRunTime int64 + ExecTime int64 } diff --git a/core/scheduler/config.go b/core/scheduler/config.go index 57959f27c..54dcb9a41 100644 --- a/core/scheduler/config.go +++ b/core/scheduler/config.go @@ -54,14 +54,14 @@ func initConfig(name string, cfg *JobConfig, mergeCfg *JobConfig) (r result.Resu if cfg.Location == nil { cfg.Location = lo.ToPtr(time.UTC.String()) - cfg.location = result.Wrap(time.LoadLocation(lo.FromPtr(cfg.Location))). - InspectErr(func(err error) { - log.Err(err).Msgf("failed to parse time location:%s", lo.FromPtr(mergeCfg.Location)) - }). - UnwrapErr(&r) - if r.IsErr() { - return - } + } + cfg.location = result.Wrap(time.LoadLocation(lo.FromPtr(cfg.Location))). + InspectErr(func(err error) { + log.Err(err).Msgf("failed to parse time location:%s", lo.FromPtr(cfg.Location)) + }). + UnwrapErr(&r) + if r.IsErr() { + return } if mergeCfg != nil { @@ -87,14 +87,14 @@ func initConfig(name string, cfg *JobConfig, mergeCfg *JobConfig) (r result.Resu if mergeCfg.Location != nil { cfg.Location = mergeCfg.Location - cfg.location = result.Wrap(time.LoadLocation(lo.FromPtr(cfg.Location))). - InspectErr(func(err error) { - log.Err(err).Msgf("failed to parse time location:%s", lo.FromPtr(mergeCfg.Location)) - }). - UnwrapErr(&r) - if r.IsErr() { - return - } + } + cfg.location = result.Wrap(time.LoadLocation(lo.FromPtr(cfg.Location))). + InspectErr(func(err error) { + log.Err(err).Msgf("failed to parse time location:%s", lo.FromPtr(cfg.Location)) + }). + UnwrapErr(&r) + if r.IsErr() { + return } } diff --git a/core/scheduler/job.go b/core/scheduler/job.go index 30cf45a7e..1421d0fec 100644 --- a/core/scheduler/job.go +++ b/core/scheduler/job.go @@ -57,7 +57,7 @@ func (t *namedJob) Execute(ctx context.Context) (gErr error) { Timeout: lo.FromPtr(t.task.config.Timeout), Location: t.task.config.location, PreRunTime: t.task.trigger.prev, - NextRunTime: t.task.trigger.next, + ExecTime: t.task.trigger.next, } if t.task.trigger.err != nil { @@ -73,39 +73,6 @@ func (t *namedJob) Execute(ctx context.Context) (gErr error) { }) } -func registerJob(s *Scheduler, job jobWrapper, fn JobFunc) (r result.Error) { - s.configMap[job.key] = initConfig(job.key, s.configMap[job.key]).UnwrapErr(&r) - if r.IsErr() { - return - } - - config := s.configMap[job.key] - trigger := getTrigger(job, config.location).UnwrapErr(&r) - if r.IsErr() { - return - } - - if fn == nil { - return result.Errorf("schedule job(%s) error: %s", job.key, "fn is nil") - } - - jobOpt := &quartz.JobDetailOptions{ - MaxRetries: lo.FromPtr(config.MaxRetries), - RetryInterval: lo.FromPtr(config.RetryInterval), - Replace: lo.FromPtr(config.Replace), - Suspended: false, - } - - return result.ErrOf(s.scheduler.ScheduleJob( - quartz.NewJobDetailWithOptions( - &namedJob{s: s, name: job.key, fn: fn, log: s.log, config: config, trigger: trigger}, - quartz.NewJobKey(job.key), - jobOpt, - ), - trigger, - )) -} - var _ quartz.Trigger = &triggerImpl{} func newTrigger(trigger quartz.Trigger) *triggerImpl { From 7c2d5ec8f30b22fc4bf96a3bbadf9f42c3a03fd7 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 20 Aug 2025 18:43:49 +0800 Subject: [PATCH 096/142] fix: barry@feat/supervisor, 2025-08-20 18:43:49 --- core/scheduler/scheduler.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index e5a42d43b..b1a5d9d80 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -131,6 +131,9 @@ func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { } trigger := getTrigger(spec, config.location). + InspectErr(func(err error) { + log.Err(err).Msgf("failed to get schedule job(%s) trigger", name) + }). Inspect(func(trigger *triggerImpl) { task.trigger = trigger }). From 785481c4470a31f672114a321734e3e3521f5f88 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 20 Aug 2025 18:46:02 +0800 Subject: [PATCH 097/142] fix: barry@feat/supervisor, 2025-08-20 18:46:02 --- core/scheduler/aaa.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index c3f1e911a..00fe44ba3 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -76,13 +76,9 @@ type CronJob struct { } type Job struct { - Name string + Spec JobSpec Metadata JobMetadata ExecErr error - Executor string - Once *OnceJob - Ticker *TickerJob - Cron *CronJob Status Status } From 6438c96d16c847deb30abfc9182cf5374af6969f Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 20 Aug 2025 22:18:41 +0800 Subject: [PATCH 098/142] fix: barry quick fix, 2025-08-20 22:18:41 --- cmds/schedulercmd/cmd.go | 8 +- core/scheduler/aaa.go | 46 ++++++++-- core/scheduler/config.go | 77 +++++++---------- core/scheduler/job.go | 52 ++---------- core/scheduler/scheduler.go | 165 ++++++++++++++++++++++-------------- core/scheduler/util.go | 54 ++++++++++++ go.mod | 3 +- go.sum | 8 +- 8 files changed, 242 insertions(+), 171 deletions(-) create mode 100644 core/scheduler/util.go diff --git a/cmds/schedulercmd/cmd.go b/cmds/schedulercmd/cmd.go index f3f029522..7f2b711d4 100644 --- a/cmds/schedulercmd/cmd.go +++ b/cmds/schedulercmd/cmd.go @@ -7,6 +7,7 @@ import ( "github.com/pubgo/funk/version" "github.com/urfave/cli/v3" + "github.com/pubgo/lava/core/lifecycle" "github.com/pubgo/lava/core/scheduler" "github.com/pubgo/lava/core/supervisor" "github.com/pubgo/lava/pkg/cmdutil" @@ -17,11 +18,12 @@ func New(di *dix.Dix) *cli.Command { Name: "scheduler", Usage: cmdutil.UsageDesc("crontab scheduler service %s(%s)", version.Project(), version.Version()), Action: func(ctx context.Context, command *cli.Command) error { - _ = dix.Inject(di, new(struct { - Scheduler *scheduler.Scheduler + di.Provide(scheduler.NewService) + params := dix.Inject(di, new(struct { + LC lifecycle.Getter })) - return supervisor.Default().Run() + return supervisor.Default(params.LC).Run() }, } } diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index 00fe44ba3..2b09c37fc 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -6,8 +6,11 @@ import ( "os" "time" + "github.com/pubgo/funk/clone" "github.com/pubgo/funk/stack" "github.com/pubgo/funk/v2/result" + "github.com/reugn/go-quartz/quartz" + "go.uber.org/atomic" ) var schedulerLog = stdLog.New(os.Stdout, "scheduler", stdLog.LstdFlags|stdLog.Lmsgprefix|stdLog.Lshortfile) @@ -46,12 +49,8 @@ type JobManager interface { ResumeJob(name string) result.Error DeleteJob(name string) result.Error ReloadJob(name string) result.Error - ListJobs() []Job - GetJob(name string) Job -} - -type JobExecT interface { - string | JobFunc + ListJobs() []*Job + GetJob(name string) result.Result[*Job] } type JobSpec struct { @@ -76,16 +75,45 @@ type CronJob struct { } type Job struct { - Spec JobSpec + Spec *JobSpec Metadata JobMetadata - ExecErr error Status Status + + PreExecTime int64 + ExecTime int64 + + Error error + Result []byte + Runs uint64 +} + +type jobTask struct { + spec *JobSpec + executor JobExecutor + + trigger *triggerImpl + runs atomic.Uint64 + jobKey *quartz.JobKey + status Status + + result result.Result[[]byte] +} + +func (job jobTask) ToJob() *Job { + return &Job{ + Status: job.status, + PreExecTime: job.trigger.prev, + ExecTime: job.trigger.next, + Error: job.result.GetErr(), + Result: job.result.GetValue(), + Runs: job.runs.Load(), + Spec: clone.Clone(job.spec), + } } type Status string const ( - StatusInit Status = "init" StatusRunning Status = "running" StatusStop Status = "stop" ) diff --git a/core/scheduler/config.go b/core/scheduler/config.go index 54dcb9a41..3e37aa3ce 100644 --- a/core/scheduler/config.go +++ b/core/scheduler/config.go @@ -27,67 +27,50 @@ func createConfig(configs []*Config) (r result.Result[map[string]*JobConfig]) { return r.WithValue(configMap) } -func initConfig(name string, cfg *JobConfig, mergeCfg *JobConfig) (r result.Result[*JobConfig]) { - if cfg == nil { - cfg = &JobConfig{Name: name} - } - - if cfg.Disabled == nil { - cfg.Disabled = lo.ToPtr(false) - } - - if cfg.Timeout == nil { - cfg.Timeout = lo.ToPtr(time.Second * 10) - } - - if cfg.RetryInterval == nil { - cfg.RetryInterval = lo.ToPtr(time.Second) - } - - if cfg.MaxRetries == nil { - cfg.MaxRetries = lo.ToPtr(0) - } - - if cfg.Replace == nil { - cfg.Replace = lo.ToPtr(false) +func defaultConfig(name string) *JobConfig { + return &JobConfig{ + Name: name, + Disabled: lo.ToPtr(false), + Timeout: lo.ToPtr(time.Second * 10), + RetryInterval: lo.ToPtr(time.Second), + MaxRetries: lo.ToPtr(0), + Replace: lo.ToPtr(false), + Location: lo.ToPtr(time.UTC.String()), + location: time.UTC, } +} - if cfg.Location == nil { - cfg.Location = lo.ToPtr(time.UTC.String()) - } - cfg.location = result.Wrap(time.LoadLocation(lo.FromPtr(cfg.Location))). - InspectErr(func(err error) { - log.Err(err).Msgf("failed to parse time location:%s", lo.FromPtr(cfg.Location)) - }). - UnwrapErr(&r) - if r.IsErr() { - return - } +func initAndMergeConfig(name string, jobConfigs ...*JobConfig) (r result.Result[*JobConfig]) { + cfg := defaultConfig(name) + for _, jobConfig := range jobConfigs { + if jobConfig == nil { + continue + } - if mergeCfg != nil { - if mergeCfg.Disabled != nil { - cfg.Disabled = mergeCfg.Disabled + if jobConfig.Disabled != nil { + cfg.Disabled = jobConfig.Disabled } - if mergeCfg.Timeout != nil { - cfg.Timeout = mergeCfg.Timeout + if jobConfig.Timeout != nil { + cfg.Timeout = jobConfig.Timeout } - if mergeCfg.RetryInterval != nil { - cfg.RetryInterval = mergeCfg.RetryInterval + if jobConfig.RetryInterval != nil { + cfg.RetryInterval = jobConfig.RetryInterval } - if mergeCfg.MaxRetries != nil { - cfg.MaxRetries = mergeCfg.MaxRetries + if jobConfig.MaxRetries != nil { + cfg.MaxRetries = jobConfig.MaxRetries } - if mergeCfg.Replace != nil { - cfg.Replace = mergeCfg.Replace + if jobConfig.Replace != nil { + cfg.Replace = jobConfig.Replace } - if mergeCfg.Location != nil { - cfg.Location = mergeCfg.Location + if jobConfig.Location != nil { + cfg.Location = jobConfig.Location } + cfg.location = result.Wrap(time.LoadLocation(lo.FromPtr(cfg.Location))). InspectErr(func(err error) { log.Err(err).Msgf("failed to parse time location:%s", lo.FromPtr(cfg.Location)) diff --git a/core/scheduler/job.go b/core/scheduler/job.go index 1421d0fec..e78380740 100644 --- a/core/scheduler/job.go +++ b/core/scheduler/job.go @@ -3,26 +3,17 @@ package scheduler import ( "context" "fmt" - "strings" "time" "github.com/pubgo/funk/generic" "github.com/pubgo/funk/log" "github.com/pubgo/funk/try" - "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/core/metrics" "github.com/reugn/go-quartz/quartz" "github.com/rs/zerolog" "github.com/samber/lo" ) -type jobWrapper struct { - key string - cron string - dur time.Duration - once bool -} - type namedJob struct { s *Scheduler name string @@ -49,13 +40,14 @@ func (t *namedJob) Execute(ctx context.Context) (gErr error) { }() t.task.runs.Inc() + config := t.task.spec.Config metadata := JobMetadata{ - Name: t.task.config.Name, - Replace: lo.FromPtr(t.task.config.Replace), - MaxRetries: lo.FromPtr(t.task.config.MaxRetries), - RetryInterval: lo.FromPtr(t.task.config.RetryInterval), - Timeout: lo.FromPtr(t.task.config.Timeout), - Location: t.task.config.location, + Name: config.Name, + Replace: lo.FromPtr(config.Replace), + MaxRetries: lo.FromPtr(config.MaxRetries), + RetryInterval: lo.FromPtr(config.RetryInterval), + Timeout: lo.FromPtr(config.Timeout), + Location: config.location, PreRunTime: t.task.trigger.prev, ExecTime: t.task.trigger.next, } @@ -65,7 +57,7 @@ func (t *namedJob) Execute(ctx context.Context) (gErr error) { } return try.Try(func() error { - ctx, cancel := context.WithTimeout(ctx, lo.FromPtr(t.task.config.Timeout)) + ctx, cancel := context.WithTimeout(ctx, lo.FromPtr(config.Timeout)) defer cancel() t.task.result = t.task.executor.Exec(ctx, t.name, &metadata) @@ -96,31 +88,3 @@ func (t *triggerImpl) NextFireTime(prev int64) (next int64, err error) { func (t *triggerImpl) Description() string { return t.trigger.Description() } - -func getTrigger(j JobSpec, location *time.Location) (r result.Result[*triggerImpl]) { - if j.Once != nil { - return r.WithValue(newTrigger(quartz.NewRunOnceTrigger(j.Once.Delay))) - } - - if j.Cron != nil { - trigger, err := quartz.NewCronTriggerWithLoc(j.Cron.Expr, location) - if err != nil { - return r.WithErrorf("cron-expr:%s, err:%s", j.Cron.Expr, err.Error()) - } - return r.WithValue(newTrigger(trigger)) - } - - if j.Ticker != nil { - return r.WithValue(newTrigger(quartz.NewSimpleTrigger(j.Ticker.Dur))) - } - - return r.WithErrorf("please init Once, Cron or Ticker") -} - -func parseJobKey(name string) *quartz.JobKey { - keys := strings.SplitN(name, quartz.Sep, 2) - if len(keys) == 1 { - return quartz.NewJobKey(keys[0]) - } - return quartz.NewJobKeyWithGroup(keys[0], keys[1]) -} diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index b1a5d9d80..92e5e516c 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -10,24 +10,8 @@ import ( "github.com/pubgo/lava/core/metrics" "github.com/reugn/go-quartz/quartz" "github.com/rs/zerolog" - "go.uber.org/atomic" ) -type jobTask struct { - name string - executor JobExecutor - config *JobConfig - - Once *OnceJob - Ticker *TickerJob - Cron *CronJob - - trigger *triggerImpl - runs atomic.Uint64 - - result result.Result[[]byte] -} - var _ JobManager = (*Scheduler)(nil) var _ JobRegistry = (*Scheduler)(nil) @@ -42,45 +26,27 @@ type Scheduler struct { jobExecutors map[string]JobExecutor } -func regJobExecutor(jobExecutors map[string]JobExecutor, executor JobExecutor) (r result.Error) { - if executor == nil { - return result.Errorf("executor is nil") - } - - if executor.Name() == "" { - return result.Errorf("executor name is empty") - } - - if jobExecutors[executor.Name()] != nil { - return result.Errorf("[job executor] %s already exists", executor.Name()) - } - - jobExecutors[executor.Name()] = executor - return -} - -func (s *Scheduler) PatchJob(name string, config *JobConfig) result.Error { - //TODO implement me - panic("implement me") -} - func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { - task := jobTask{Once: spec.Once, Ticker: spec.Ticker, Cron: spec.Cron, name: spec.Name} + task := jobTask{ + spec: &spec, + jobKey: parseJobKey(spec.Name), + status: StatusRunning, + } defer func() { logFn := func(e *zerolog.Event) { - e.Str("name", task.name) + e.Str("name", task.spec.Name) if task.executor != nil { e.Str("executor", task.executor.Name()) } - if task.config != nil { - e.Any("config", task.config) + if task.spec.Config != nil { + e.Any("config", task.spec.Config) } - e.Any("once", task.Once) - e.Any("ticker", task.Ticker) - e.Any("cron", task.Cron) + e.Any("once", task.spec.Once) + e.Any("ticker", task.spec.Ticker) + e.Any("cron", task.spec.Cron) } if r.IsErr() { s.log.Err(r.GetErr()).Func(logFn).Msg("failed to register scheduler job") @@ -118,12 +84,12 @@ func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { return } - config := initConfig(name, s.configMap[name], spec.Config). + config := initAndMergeConfig(name, s.configMap[name], spec.Config). InspectErr(func(err error) { s.log.Err(err).Msgf("failed to init schedule job(%s) config", name) }). Inspect(func(config *JobConfig) { - task.config = config + task.spec.Config = config }). UnwrapErr(&r) if r.IsErr() { @@ -157,34 +123,103 @@ func (s *Scheduler) CreateJob(spec JobSpec) (r result.Error) { return s.createJob(spec, nil) } -func (s *Scheduler) PauseJob(name string) result.Error { - //TODO implement me - panic("implement me") +func (s *Scheduler) getJob(name string) (r result.Result[*jobTask]) { + if s.jobs[name] == nil { + return r.WithErrorf("job %s not exists", name) + } + return r.WithValue(s.jobs[name]) } -func (s *Scheduler) ResumeJob(name string) result.Error { - //TODO implement me - panic("implement me") +func (s *Scheduler) PatchJob(name string, config *JobConfig) (r result.Error) { + job := s.getJob(name).UnwrapErr(&r) + if r.IsErr() { + return + } + + initAndMergeConfig(name, job.spec.Config, config). + InspectErr(func(err error) { + s.log.Err(err).Msgf("failed to patch schedule job(%s) config", name) + }). + Inspect(func(config *JobConfig) { + job.spec.Config = config + }). + CatchErr(&r) + + return } -func (s *Scheduler) DeleteJob(name string) result.Error { - //TODO implement me - panic("implement me") +func (s *Scheduler) PauseJob(name string) (r result.Error) { + job := s.getJob(name).UnwrapErr(&r) + if r.IsErr() { + return + } + + job.status = StatusStop + return result.ErrOf(s.scheduler.PauseJob(job.jobKey)). + InspectErr(func(err error) { + log.Err(err).Msgf("failed to pause schedule job(%s)", name) + }) } -func (s *Scheduler) ReloadJob(name string) result.Error { - //TODO implement me - panic("implement me") +func (s *Scheduler) ResumeJob(name string) (r result.Error) { + job := s.getJob(name).UnwrapErr(&r) + if r.IsErr() { + return + } + + job.status = StatusRunning + return result.ErrOf(s.scheduler.ResumeJob(job.jobKey)). + InspectErr(func(err error) { + log.Err(err).Msgf("failed to resume schedule job(%s)", name) + }) } -func (s *Scheduler) ListJobs() []Job { - //TODO implement me - panic("implement me") +func (s *Scheduler) DeleteJob(name string) (r result.Error) { + job := s.getJob(name).UnwrapErr(&r) + if r.IsErr() { + return + } + + delete(s.jobs, name) + return result.ErrOf(s.scheduler.DeleteJob(job.jobKey)). + InspectErr(func(err error) { + log.Err(err).Msgf("failed to delete schedule job(%s)", name) + }) } -func (s *Scheduler) GetJob(name string) Job { - //TODO implement me - panic("implement me") +func (s *Scheduler) ReloadJob(name string) (r result.Error) { + job := s.getJob(name).UnwrapErr(&r) + if r.IsErr() { + return + } + + jobOpt := job.spec.Config.ToJobDetailOptions() + jobDetail := quartz.NewJobDetailWithOptions( + &namedJob{s: s, name: name, task: job, log: s.log}, + job.jobKey, + jobOpt, + ) + if result.CatchErr(&r, s.scheduler.ScheduleJob(jobDetail, job.trigger)) { + return + } + return +} + +func (s *Scheduler) ListJobs() []*Job { + var jobs []*Job + for _, job := range s.jobs { + jobs = append(jobs, job.ToJob()) + } + return jobs +} + +func (s *Scheduler) GetJob(name string) (r result.Result[*Job]) { + job := s.getJob(name).UnwrapErr(&r) + if r.IsErr() { + return + } + + return r.WithValue(job.ToJob()) } func (s *Scheduler) String() string { diff --git a/core/scheduler/util.go b/core/scheduler/util.go new file mode 100644 index 000000000..228ba35c6 --- /dev/null +++ b/core/scheduler/util.go @@ -0,0 +1,54 @@ +package scheduler + +import ( + "strings" + "time" + + "github.com/pubgo/funk/v2/result" + "github.com/reugn/go-quartz/quartz" +) + +func regJobExecutor(jobExecutors map[string]JobExecutor, executor JobExecutor) (r result.Error) { + if executor == nil { + return result.Errorf("executor is nil") + } + + if executor.Name() == "" { + return result.Errorf("executor name is empty") + } + + if jobExecutors[executor.Name()] != nil { + return result.Errorf("[job executor] %s already exists", executor.Name()) + } + + jobExecutors[executor.Name()] = executor + return +} + +func getTrigger(j JobSpec, location *time.Location) (r result.Result[*triggerImpl]) { + if j.Once != nil { + return r.WithValue(newTrigger(quartz.NewRunOnceTrigger(j.Once.Delay))) + } + + if j.Cron != nil { + trigger, err := quartz.NewCronTriggerWithLoc(j.Cron.Expr, location) + if err != nil { + return r.WithErrorf("cron-expr:%s, err:%s", j.Cron.Expr, err.Error()) + } + return r.WithValue(newTrigger(trigger)) + } + + if j.Ticker != nil { + return r.WithValue(newTrigger(quartz.NewSimpleTrigger(j.Ticker.Dur))) + } + + return r.WithErrorf("please init Once, Cron or Ticker") +} + +func parseJobKey(name string) *quartz.JobKey { + keys := strings.SplitN(name, quartz.Sep, 2) + if len(keys) == 1 { + return quartz.NewJobKey(keys[0]) + } + return quartz.NewJobKeyWithGroup(keys[0], keys[1]) +} diff --git a/go.mod b/go.mod index e43c5777b..8f4255156 100644 --- a/go.mod +++ b/go.mod @@ -55,7 +55,7 @@ require ( github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.65.0 github.com/pubgo/dix v0.3.21 - github.com/pubgo/funk v0.5.69-alpha.6 + github.com/pubgo/funk v0.5.69-alpha.7 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.6.0 github.com/rs/zerolog v1.34.0 @@ -173,6 +173,7 @@ require ( github.com/hashicorp/go-version v1.7.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hexops/gotextdiff v1.0.3 // indirect + github.com/huandu/go-clone v1.5.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/invopop/yaml v0.3.1 // indirect github.com/jgautheron/goconst v1.7.1 // indirect diff --git a/go.sum b/go.sum index f9d811bb8..4fb8fff66 100644 --- a/go.sum +++ b/go.sum @@ -316,6 +316,10 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= +github.com/huandu/go-clone v1.5.1 h1:1wlwYRlHZo4HspdOM0YQ6O7Y7bjtxTrrt+4jnDeejVo= +github.com/huandu/go-clone v1.5.1/go.mod h1:ReGivhG6op3GYr+UY3lS6mxjKp7MIGTknuU5TbTVaXE= github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= @@ -502,8 +506,8 @@ github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7D github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/pubgo/dix v0.3.21 h1:jtriLYT6srKrxv0KRwic1no0d9ZTMtLx6r3JJxQ5Jvw= github.com/pubgo/dix v0.3.21/go.mod h1:5qHJ7ycvBVw1AUjgYMEsobzx1tggiRs+spgzd4Jglb4= -github.com/pubgo/funk v0.5.69-alpha.6 h1:deXmNq7UA6sA4kY6y8pQ27+LM8evaPZZCmBIQPhN4Xs= -github.com/pubgo/funk v0.5.69-alpha.6/go.mod h1:mWqaZftfwVoZk/qhLqb/S3iCa1LR7QKIMh3HsABCIjo= +github.com/pubgo/funk v0.5.69-alpha.7 h1:9lggOw054fXB6o4bzTDmTpWZKb3uLwIl45nnKBioTw0= +github.com/pubgo/funk v0.5.69-alpha.7/go.mod h1:mWqaZftfwVoZk/qhLqb/S3iCa1LR7QKIMh3HsABCIjo= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/pubgo/protobuild v0.0.21 h1:QSwh92QxsD6Mv7kQlowzE7fxtcOm1eMWmgADsD803Js= From 2fbe0a10b066a042e7b5297e00e7b1baaa764b65 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 20 Aug 2025 22:26:51 +0800 Subject: [PATCH 099/142] fix: barry quick fix, 2025-08-20 22:26:51 --- cmds/grpcservercmd/cmd.go | 17 +++++++++++++---- cmds/httpservercmd/cmd.go | 16 ++++++++++++++-- cmds/schedulercmd/cmd.go | 11 +++++++++-- cmds/taskcmd/cmd.go | 16 ++++++++++++++-- servers/grpcs/server.go | 13 +++---------- servers/https/server.go | 12 +++--------- servers/tasks/server.go | 19 ++++--------------- 7 files changed, 60 insertions(+), 44 deletions(-) diff --git a/cmds/grpcservercmd/cmd.go b/cmds/grpcservercmd/cmd.go index 9abc46665..34d7d9f1a 100644 --- a/cmds/grpcservercmd/cmd.go +++ b/cmds/grpcservercmd/cmd.go @@ -4,9 +4,11 @@ import ( "context" "github.com/pubgo/dix" + "github.com/pubgo/funk/assert" "github.com/pubgo/funk/version" "github.com/urfave/cli/v3" + "github.com/pubgo/lava/core/lifecycle" "github.com/pubgo/lava/core/supervisor" "github.com/pubgo/lava/pkg/cmdutil" "github.com/pubgo/lava/servers/grpcs" @@ -17,11 +19,18 @@ func New(di *dix.Dix) *cli.Command { Name: "grpc", Usage: cmdutil.UsageDesc("grpc service %s(%s)", version.Project(), version.Version()), Action: func(ctx context.Context, command *cli.Command) error { - dix.Provide(di, grpcs.New) - m := dix.Inject(di, new(struct { - Manager *supervisor.Manager + di.Provide(grpcs.New) + params := dix.Inject(di, new(struct { + LC lifecycle.Getter + Services []supervisor.Service })) - return m.Manager.Run() + + manager := supervisor.Default(params.LC) + for _, svc := range params.Services { + assert.Exit(manager.Add(svc)) + } + + return manager.Run() }, } } diff --git a/cmds/httpservercmd/cmd.go b/cmds/httpservercmd/cmd.go index 0ae92e239..b6e335de7 100644 --- a/cmds/httpservercmd/cmd.go +++ b/cmds/httpservercmd/cmd.go @@ -4,9 +4,12 @@ import ( "context" "github.com/pubgo/dix" + "github.com/pubgo/funk/assert" "github.com/pubgo/funk/version" "github.com/urfave/cli/v3" + "github.com/pubgo/lava/core/lifecycle" + "github.com/pubgo/lava/core/supervisor" "github.com/pubgo/lava/pkg/cmdutil" "github.com/pubgo/lava/servers/https" ) @@ -16,8 +19,17 @@ func New(di *dix.Dix) *cli.Command { Name: "http", Usage: cmdutil.UsageDesc("%s http service", version.Project()), Action: func(ctx context.Context, command *cli.Command) error { - params := dix.Inject(di, https.Params{}) - manager := https.New(params) + di.Provide(https.New) + params := dix.Inject(di, new(struct { + LC lifecycle.Getter + Services []supervisor.Service + })) + + manager := supervisor.Default(params.LC) + for _, svc := range params.Services { + assert.Exit(manager.Add(svc)) + } + return manager.Run() }, } diff --git a/cmds/schedulercmd/cmd.go b/cmds/schedulercmd/cmd.go index 7f2b711d4..d0a461c3d 100644 --- a/cmds/schedulercmd/cmd.go +++ b/cmds/schedulercmd/cmd.go @@ -4,6 +4,7 @@ import ( "context" "github.com/pubgo/dix" + "github.com/pubgo/funk/assert" "github.com/pubgo/funk/version" "github.com/urfave/cli/v3" @@ -20,10 +21,16 @@ func New(di *dix.Dix) *cli.Command { Action: func(ctx context.Context, command *cli.Command) error { di.Provide(scheduler.NewService) params := dix.Inject(di, new(struct { - LC lifecycle.Getter + LC lifecycle.Getter + Services []supervisor.Service })) - return supervisor.Default(params.LC).Run() + manager := supervisor.Default(params.LC) + for _, svc := range params.Services { + assert.Exit(manager.Add(svc)) + } + + return manager.Run() }, } } diff --git a/cmds/taskcmd/cmd.go b/cmds/taskcmd/cmd.go index 94a3e6a50..3ea57ff3f 100644 --- a/cmds/taskcmd/cmd.go +++ b/cmds/taskcmd/cmd.go @@ -4,9 +4,12 @@ import ( "context" "github.com/pubgo/dix" + "github.com/pubgo/funk/assert" "github.com/pubgo/funk/version" "github.com/urfave/cli/v3" + "github.com/pubgo/lava/core/lifecycle" + "github.com/pubgo/lava/core/supervisor" "github.com/pubgo/lava/pkg/cmdutil" "github.com/pubgo/lava/servers/tasks" ) @@ -16,8 +19,17 @@ func New(di *dix.Dix) *cli.Command { Name: "task", Usage: cmdutil.UsageDesc("async task service %s(%s)", version.Project(), version.Version()), Action: func(ctx context.Context, command *cli.Command) error { - params := dix.Inject(di, tasks.Params{}) - manager := tasks.New(params) + di.Provide(tasks.New) + params := dix.Inject(di, new(struct { + LC lifecycle.Getter + Services []supervisor.Service + })) + + manager := supervisor.Default(params.LC) + for _, svc := range params.Services { + assert.Exit(manager.Add(svc)) + } + return manager.Run() }, } diff --git a/servers/grpcs/server.go b/servers/grpcs/server.go index e3cc824ba..0327b2511 100644 --- a/servers/grpcs/server.go +++ b/servers/grpcs/server.go @@ -45,8 +45,6 @@ import ( ) type Params struct { - Services []supervisor.Service - GrpcRouters []lava.GrpcRouter HttpRouters []lava.HttpRouter GrpcHttpRouters []lava.GrpcHttpRouter @@ -60,9 +58,9 @@ type Params struct { Gw []*gateway.Mux } -func New(params Params) *supervisor.Manager { return newService(params) } +func New(params Params) supervisor.Service { return newService(params) } -func newService(params Params) *supervisor.Manager { +func newService(params Params) supervisor.Service { s := &serviceImpl{cc: new(inprocgrpc.Channel)} s.init( params.GrpcRouters, @@ -78,12 +76,7 @@ func newService(params Params) *supervisor.Manager { params.Gw, ) - manager := supervisor.Default() - assert.Exit(manager.Add(supervisor.NewService("grpc-server", s.Serve))) - for _, srv := range params.Services { - assert.Exit(manager.Add(srv)) - } - return manager + return supervisor.NewService("grpc-server", s.Serve) } type serviceImpl struct { diff --git a/servers/https/server.go b/servers/https/server.go index 2c230190e..0d8349ad9 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -35,7 +35,6 @@ import ( ) type Params struct { - Services []supervisor.Service Handlers []lava.HttpRouter Middlewares []lava.Middleware GetLifecycle lifecycle.Getter @@ -46,9 +45,9 @@ type Params struct { Docs []*opendoc.Swagger } -func New(params Params) *supervisor.Manager { return newService(params) } +func New(params Params) supervisor.Service { return newService(params) } -func newService(params Params) *supervisor.Manager { +func newService(params Params) supervisor.Service { s := &serviceImpl{} s.init( params.Handlers, @@ -61,12 +60,7 @@ func newService(params Params) *supervisor.Manager { params.Docs, ) - manager := supervisor.Default() - assert.Exit(manager.Add(supervisor.NewService("http-server", s.Serve))) - for _, srv := range params.Services { - assert.Exit(manager.Add(srv)) - } - return manager + return supervisor.NewService("http-server", s.Serve) } type serviceImpl struct { diff --git a/servers/tasks/server.go b/servers/tasks/server.go index 51f7a8999..16c020a5e 100644 --- a/servers/tasks/server.go +++ b/servers/tasks/server.go @@ -16,31 +16,20 @@ import ( "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/running" "github.com/pubgo/lava/core/debug" - "github.com/pubgo/lava/core/lifecycle" "github.com/pubgo/lava/core/supervisor" "github.com/pubgo/lava/internal/logutil" "google.golang.org/grpc/codes" ) type Params struct { - Services []supervisor.Service - Log log.Logger - Conf []*Config - LC lifecycle.Getter + Log log.Logger + Conf []*Config } -func New(params Params) *supervisor.Manager { - assert.If(len(params.Services) == 0, "services is nil") - +func New(params Params) supervisor.Service { s := &Server{} s.init(params.Log, params.Conf) - - manager := supervisor.Default(params.LC) - assert.Exit(manager.Add(supervisor.NewService("task", s.Serve))) - for _, srv := range params.Services { - assert.Exit(manager.Add(srv)) - } - return manager + return supervisor.NewService("tasks", s.Serve) } type Server struct { From 5d072a6ef42c9dc503ae6d8a702414dd0eda1df1 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 20 Aug 2025 22:34:15 +0800 Subject: [PATCH 100/142] fix: barry quick fix, 2025-08-20 22:34:15 --- .../{ => gatewayutils}/query_params.go | 9 +- pkg/gateway/gatewayutils/trie.go | 174 ++++++++++++++++++ pkg/gateway/gatewayutils/utils.go | 10 + pkg/gateway/stream_http.go | 4 +- 4 files changed, 190 insertions(+), 7 deletions(-) rename pkg/gateway/{ => gatewayutils}/query_params.go (98%) create mode 100644 pkg/gateway/gatewayutils/trie.go create mode 100644 pkg/gateway/gatewayutils/utils.go diff --git a/pkg/gateway/query_params.go b/pkg/gateway/gatewayutils/query_params.go similarity index 98% rename from pkg/gateway/query_params.go rename to pkg/gateway/gatewayutils/query_params.go index fcfd049cb..0355c9ce9 100644 --- a/pkg/gateway/query_params.go +++ b/pkg/gateway/gatewayutils/query_params.go @@ -1,4 +1,4 @@ -package gateway +package gatewayutils import ( "bytes" @@ -11,7 +11,6 @@ import ( "strings" "time" - "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" "github.com/pubgo/funk/errors" "google.golang.org/grpc/grpclog" "google.golang.org/protobuf/encoding/protojson" @@ -32,12 +31,12 @@ var currentQueryParser QueryParameterParser = &DefaultQueryParser{} // QueryParameterParser defines interface for all query parameter parsers type QueryParameterParser interface { - Parse(msg proto.Message, values url.Values, filter *utilities.DoubleArray) error + Parse(msg proto.Message, values url.Values, filter *DoubleArray) error } // PopulateQueryParameters parses query parameters // into "msg" using current query parser -func PopulateQueryParameters(msg proto.Message, values url.Values, filter *utilities.DoubleArray) error { +func PopulateQueryParameters(msg proto.Message, values url.Values, filter *DoubleArray) error { return errors.WrapCaller(currentQueryParser.Parse(msg, values, filter)) } @@ -49,7 +48,7 @@ type DefaultQueryParser struct{} // Parse populates "values" into "msg". // A value is ignored if its key starts with one of the elements in "filter". -func (*DefaultQueryParser) Parse(msg proto.Message, values url.Values, filter *utilities.DoubleArray) error { +func (*DefaultQueryParser) Parse(msg proto.Message, values url.Values, filter *DoubleArray) error { for key, v := range values { if len(v) == 0 { delete(values, key) diff --git a/pkg/gateway/gatewayutils/trie.go b/pkg/gateway/gatewayutils/trie.go new file mode 100644 index 000000000..7bbfbd16c --- /dev/null +++ b/pkg/gateway/gatewayutils/trie.go @@ -0,0 +1,174 @@ +package gatewayutils + +import ( + "sort" +) + +// DoubleArray is a Double Array implementation of trie on sequences of strings. +type DoubleArray struct { + // Encoding keeps an encoding from string to int + Encoding map[string]int + // Base is the base array of Double Array + Base []int + // Check is the check array of Double Array + Check []int +} + +// NewDoubleArray builds a DoubleArray from a set of sequences of strings. +func NewDoubleArray(seqs [][]string) *DoubleArray { + da := &DoubleArray{Encoding: make(map[string]int)} + if len(seqs) == 0 { + return da + } + + encoded := registerTokens(da, seqs) + sort.Sort(byLex(encoded)) + + root := node{row: -1, col: -1, left: 0, right: len(encoded)} + addSeqs(da, encoded, 0, root) + + for i := len(da.Base); i > 0; i-- { + if da.Check[i-1] != 0 { + da.Base = da.Base[:i] + da.Check = da.Check[:i] + break + } + } + return da +} + +func registerTokens(da *DoubleArray, seqs [][]string) [][]int { + var result [][]int + for _, seq := range seqs { + encoded := make([]int, 0, len(seq)) + for _, token := range seq { + if _, ok := da.Encoding[token]; !ok { + da.Encoding[token] = len(da.Encoding) + } + encoded = append(encoded, da.Encoding[token]) + } + result = append(result, encoded) + } + for i := range result { + result[i] = append(result[i], len(da.Encoding)) + } + return result +} + +type node struct { + row, col int + left, right int +} + +func (n node) value(seqs [][]int) int { + return seqs[n.row][n.col] +} + +func (n node) children(seqs [][]int) []*node { + var result []*node + lastVal := int(-1) + last := new(node) + for i := n.left; i < n.right; i++ { + if lastVal == seqs[i][n.col+1] { + continue + } + last.right = i + last = &node{ + row: i, + col: n.col + 1, + left: i, + } + result = append(result, last) + } + last.right = n.right + return result +} + +func addSeqs(da *DoubleArray, seqs [][]int, pos int, n node) { + ensureSize(da, pos) + + children := n.children(seqs) + var i int + for i = 1; ; i++ { + ok := func() bool { + for _, child := range children { + code := child.value(seqs) + j := i + code + ensureSize(da, j) + if da.Check[j] != 0 { + return false + } + } + return true + }() + if ok { + break + } + } + da.Base[pos] = i + for _, child := range children { + code := child.value(seqs) + j := i + code + da.Check[j] = pos + 1 + } + terminator := len(da.Encoding) + for _, child := range children { + code := child.value(seqs) + if code == terminator { + continue + } + j := i + code + addSeqs(da, seqs, j, *child) + } +} + +func ensureSize(da *DoubleArray, i int) { + for i >= len(da.Base) { + da.Base = append(da.Base, make([]int, len(da.Base)+1)...) + da.Check = append(da.Check, make([]int, len(da.Check)+1)...) + } +} + +type byLex [][]int + +func (l byLex) Len() int { return len(l) } +func (l byLex) Swap(i, j int) { l[i], l[j] = l[j], l[i] } +func (l byLex) Less(i, j int) bool { + si := l[i] + sj := l[j] + var k int + for k = 0; k < len(si) && k < len(sj); k++ { + if si[k] < sj[k] { + return true + } + if si[k] > sj[k] { + return false + } + } + return k < len(sj) +} + +// HasCommonPrefix determines if any sequence in the DoubleArray is a prefix of the given sequence. +func (da *DoubleArray) HasCommonPrefix(seq []string) bool { + if len(da.Base) == 0 { + return false + } + + var i int + for _, t := range seq { + code, ok := da.Encoding[t] + if !ok { + break + } + j := da.Base[i] + code + if len(da.Check) <= j || da.Check[j] != i+1 { + break + } + i = j + } + j := da.Base[i] + len(da.Encoding) + if len(da.Check) <= j || da.Check[j] != i+1 { + return false + } + return true +} diff --git a/pkg/gateway/gatewayutils/utils.go b/pkg/gateway/gatewayutils/utils.go new file mode 100644 index 000000000..9cc63a449 --- /dev/null +++ b/pkg/gateway/gatewayutils/utils.go @@ -0,0 +1,10 @@ +package gatewayutils + +import "strconv" + +func quote(raw []byte) []byte { + if n := len(raw); n > 0 && (raw[0] != '"' || raw[n-1] != '"') { + raw = strconv.AppendQuote(raw[:0], string(raw)) + } + return raw +} diff --git a/pkg/gateway/stream_http.go b/pkg/gateway/stream_http.go index e30abcbbb..64bf67576 100644 --- a/pkg/gateway/stream_http.go +++ b/pkg/gateway/stream_http.go @@ -8,9 +8,9 @@ import ( "net/url" "github.com/gofiber/fiber/v2" - "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" "github.com/pubgo/funk/errors" "github.com/pubgo/funk/generic" + "github.com/pubgo/lava/pkg/gateway/gatewayutils" "github.com/pubgo/lava/pkg/gateway/routertree" "google.golang.org/grpc" "google.golang.org/grpc/metadata" @@ -152,7 +152,7 @@ func (s *streamHTTP) RecvMsg(m interface{}) error { } if len(s.params) > 0 { - if err := PopulateQueryParameters(args, s.params, utilities.NewDoubleArray(nil)); err != nil { + if err := gatewayutils.PopulateQueryParameters(args, s.params, gatewayutils.NewDoubleArray(nil)); err != nil { return errors.Wrapf(err, "failed to set query params, params=%v", s.params) } } From a993dffebc5a484c80e2740963f320ee488284ac Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 21 Aug 2025 10:56:25 +0800 Subject: [PATCH 101/142] fix: barry@feat/supervisor, 2025-08-21 10:56:25 --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 8f4255156..d7f14c181 100644 --- a/go.mod +++ b/go.mod @@ -49,7 +49,6 @@ require ( github.com/golangci/golangci-lint v1.61.0 github.com/google/gops v0.3.28 github.com/gorilla/websocket v1.5.3 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 github.com/maragudk/gomponents v0.22.0 github.com/maruel/panicparse/v2 v2.5.0 @@ -170,6 +169,7 @@ require ( github.com/gostaticanalysis/comment v1.4.2 // indirect github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect github.com/gostaticanalysis/nilerr v0.1.1 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hexops/gotextdiff v1.0.3 // indirect From 5674963e3eb372f0c5f5fb869938d2cc792b92d1 Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 21 Aug 2025 11:29:16 +0800 Subject: [PATCH 102/142] fix: barry@feat/supervisor, 2025-08-21 11:29:16 --- tools/_doc.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/_doc.go b/tools/_doc.go index 596c8c265..a8c7b9686 100644 --- a/tools/_doc.go +++ b/tools/_doc.go @@ -29,3 +29,6 @@ package tools // CPU feature identification for Go // https://github.com/klauspost/cpuid + +// Run command periodically and expose latest STDOUT as HTTP endpoint +// https://github.com/nikolaydubina/watchhttp/tree/master From 2b2ea9537535a790b795f3e6261f04c7125ad878 Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 21 Aug 2025 12:44:56 +0800 Subject: [PATCH 103/142] fix: barry@feat/supervisor, 2025-08-21 12:44:56 --- tools/_doc.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/_doc.go b/tools/_doc.go index a8c7b9686..16c5d3e26 100644 --- a/tools/_doc.go +++ b/tools/_doc.go @@ -32,3 +32,5 @@ package tools // Run command periodically and expose latest STDOUT as HTTP endpoint // https://github.com/nikolaydubina/watchhttp/tree/master +// https://github.com/nikolaydubina/htmljson +// https://github.com/nikolaydubina/treemap/tree/main From 325131c495e1b1f2532cca0ee845612bcb5c669f Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 21 Aug 2025 23:10:22 +0800 Subject: [PATCH 104/142] fix: barry quick fix, 2025-08-21 23:10:22 --- README.md | 9 +++ core/lavabuilder/builder.go | 3 +- core/scheduler/aaa.go | 2 +- core/supervisor/manager.go | 6 +- core/supervisor/service.go | 15 +++-- go.mod | 2 +- go.sum | 4 +- internal/configs/components/app.yaml | 4 ++ internal/configs/components/cache.yaml | 2 + internal/configs/components/grpc_server.yaml | 11 ++++ internal/configs/components/logger.yaml | 3 + internal/configs/components/metric.yaml | 3 + internal/configs/scheduler.yaml | 8 +++ internal/examples/scheduler/main.go | 34 +++++++++++ internal/examples/scheduler/taskfile.yml | 26 +++++++++ taskfile.yml | 59 ++++++++++++++++++++ 16 files changed, 180 insertions(+), 11 deletions(-) create mode 100644 internal/configs/components/app.yaml create mode 100644 internal/configs/components/cache.yaml create mode 100644 internal/configs/components/grpc_server.yaml create mode 100644 internal/configs/components/logger.yaml create mode 100644 internal/configs/components/metric.yaml create mode 100644 internal/configs/scheduler.yaml create mode 100644 internal/examples/scheduler/main.go create mode 100644 internal/examples/scheduler/taskfile.yml create mode 100644 taskfile.yml diff --git a/README.md b/README.md index 4d899216e..068d275da 100644 --- a/README.md +++ b/README.md @@ -25,3 +25,12 @@ 11. 统一protobuf定义grpc和http服务, 便于生成swagger和sdk, 方便第三方调用 12. 专注于业务开发,把额外的组件抽象成一个独立的服务 + + +## install + +```shell +brew install go-task/tap/go-task +brew install go-task +eval "$(task --completion zsh)" +``` diff --git a/core/lavabuilder/builder.go b/core/lavabuilder/builder.go index 48ffd982c..eace7b8bf 100644 --- a/core/lavabuilder/builder.go +++ b/core/lavabuilder/builder.go @@ -30,7 +30,7 @@ import ( "github.com/pubgo/lava/pkg/cmdutil" _ "github.com/pubgo/lava/core/debug/debug" - _ "github.com/pubgo/lava/core/debug/gops" + //_ "github.com/pubgo/lava/core/debug/gops" _ "github.com/pubgo/lava/core/debug/pprof" _ "github.com/pubgo/lava/core/debug/process" _ "github.com/pubgo/lava/core/debug/statsviz" @@ -77,7 +77,6 @@ func New(opts ...dix.Option) *dix.Dix { func Run(di *dix.Dix) { defer recovery.Exit() - dix.Provide(di, versioncmd.New) dix.Provide(di, versioncmd.New) dix.Provide(di, healthcmd.New) dix.Provide(di, depcmd.New) diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index 2b09c37fc..37f8630b8 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -13,7 +13,7 @@ import ( "go.uber.org/atomic" ) -var schedulerLog = stdLog.New(os.Stdout, "scheduler", stdLog.LstdFlags|stdLog.Lmsgprefix|stdLog.Lshortfile) +var schedulerLog = stdLog.New(os.Stdout, "scheduler", stdLog.LstdFlags|stdLog.Lmsgprefix|stdLog.Llongfile) type JobExecutor interface { Name() string diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go index c445c5d4b..4707efbfb 100644 --- a/core/supervisor/manager.go +++ b/core/supervisor/manager.go @@ -149,7 +149,11 @@ func (m *Manager) start() error { }) async.GoDelay(func() error { - assert.Exit(m.supervisor.Serve(ctx)) + err := m.supervisor.Serve(ctx) + if errors.Is(err, context.Canceled) { + return nil + } + assert.Exit(err) return nil }, time.Second*2) diff --git a/core/supervisor/service.go b/core/supervisor/service.go index 61125c1e6..ca9e579d7 100644 --- a/core/supervisor/service.go +++ b/core/supervisor/service.go @@ -32,7 +32,7 @@ func (s *serviceImpl) Metrics() *expvar.Map { func (s *serviceImpl) initMetric() *serviceImpl { metric := new(expvar.Map).Init() - metric.Set(s.name, s) + metric.Set(s.name, vars.Any(s.String())) metric.Set(s.name+".error", vars.Value(func() interface{} { if s.err == nil { return nil @@ -62,16 +62,23 @@ func (s *serviceImpl) Serve(ctx context.Context) (gErr error) { if gErr != nil { s.err = gErr } - s.metric.Set("error", vars.Any(s.err)) + + if s.err != nil { + s.metric.Set("error", vars.Any(s.err)) + } + s.metric.Set("start_time", vars.Any(now.UTC().String())) s.metric.Set("online_duration", vars.Any(time.Since(now).String())) - log.Info(ctx).Msgf("stop service %s", s.name) + log.Info(ctx). + Str("service", s.name). + RawJSON("metric", []byte(s.metric.String())). + Msg("stop service") }() defer recovery.Err(&gErr) s.err = nil s.metric.Add("restart", 1) - log.Info(ctx).Msgf("start service %s", s.name) + log.Info(ctx).Str("service", s.name).Msg("start service") err := s.fn(ctx) if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { return fmt.Errorf("non-context error, service=%s meta=%s err=%w", s.name, s.metric.String(), err) diff --git a/go.mod b/go.mod index d7f14c181..dab5fcab7 100644 --- a/go.mod +++ b/go.mod @@ -54,7 +54,7 @@ require ( github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.65.0 github.com/pubgo/dix v0.3.21 - github.com/pubgo/funk v0.5.69-alpha.7 + github.com/pubgo/funk v0.5.69-alpha.9 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.6.0 github.com/rs/zerolog v1.34.0 diff --git a/go.sum b/go.sum index 4fb8fff66..7280580e5 100644 --- a/go.sum +++ b/go.sum @@ -506,8 +506,8 @@ github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7D github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/pubgo/dix v0.3.21 h1:jtriLYT6srKrxv0KRwic1no0d9ZTMtLx6r3JJxQ5Jvw= github.com/pubgo/dix v0.3.21/go.mod h1:5qHJ7ycvBVw1AUjgYMEsobzx1tggiRs+spgzd4Jglb4= -github.com/pubgo/funk v0.5.69-alpha.7 h1:9lggOw054fXB6o4bzTDmTpWZKb3uLwIl45nnKBioTw0= -github.com/pubgo/funk v0.5.69-alpha.7/go.mod h1:mWqaZftfwVoZk/qhLqb/S3iCa1LR7QKIMh3HsABCIjo= +github.com/pubgo/funk v0.5.69-alpha.9 h1:nmnlbz0owbrbblVVAFNzlHVVXZfIq3d93qQCy34eXX0= +github.com/pubgo/funk v0.5.69-alpha.9/go.mod h1:mWqaZftfwVoZk/qhLqb/S3iCa1LR7QKIMh3HsABCIjo= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/pubgo/protobuild v0.0.21 h1:QSwh92QxsD6Mv7kQlowzE7fxtcOm1eMWmgADsD803Js= diff --git a/internal/configs/components/app.yaml b/internal/configs/components/app.yaml new file mode 100644 index 000000000..1c5be3d41 --- /dev/null +++ b/internal/configs/components/app.yaml @@ -0,0 +1,4 @@ +app: + env: ${ENV:-"dev"} +go_pool: + worker_size: 100 diff --git a/internal/configs/components/cache.yaml b/internal/configs/components/cache.yaml new file mode 100644 index 000000000..53c0482a3 --- /dev/null +++ b/internal/configs/components/cache.yaml @@ -0,0 +1,2 @@ +cache: + default: "memory" diff --git a/internal/configs/components/grpc_server.yaml b/internal/configs/components/grpc_server.yaml new file mode 100644 index 000000000..c38ce4c54 --- /dev/null +++ b/internal/configs/components/grpc_server.yaml @@ -0,0 +1,11 @@ +grpc_server: + base_url: /welogin + enable_print_routes: true + enable_cors: ${GRPC_ENABLE_CORS:-false} + enable_ping_pong: true + ping_pong_time: 40 + + # 256k + ws_read_limit: 262144 +# grpc_port: 8000 +# http_port: 8001 diff --git a/internal/configs/components/logger.yaml b/internal/configs/components/logger.yaml new file mode 100644 index 000000000..bb4e3154d --- /dev/null +++ b/internal/configs/components/logger.yaml @@ -0,0 +1,3 @@ +logger: + level: ${LOG_LEVEL:-"debug"} + as_json: ${LOG_AS_JSON:-false} diff --git a/internal/configs/components/metric.yaml b/internal/configs/components/metric.yaml new file mode 100644 index 000000000..964bfba1f --- /dev/null +++ b/internal/configs/components/metric.yaml @@ -0,0 +1,3 @@ +metric: + driver: "prometheus" + interval: 5s diff --git a/internal/configs/scheduler.yaml b/internal/configs/scheduler.yaml new file mode 100644 index 000000000..e62322fb6 --- /dev/null +++ b/internal/configs/scheduler.yaml @@ -0,0 +1,8 @@ +resources: + - components + +patch_resources: + - .local.yaml + +patch_envs: + - envs/envs.yaml diff --git a/internal/examples/scheduler/main.go b/internal/examples/scheduler/main.go new file mode 100644 index 000000000..724a0ce2c --- /dev/null +++ b/internal/examples/scheduler/main.go @@ -0,0 +1,34 @@ +package main + +import ( + "github.com/pubgo/dix/dixinternal" + "github.com/pubgo/funk/cmds/configcmd" + "github.com/pubgo/funk/cmds/envcmd" + "github.com/pubgo/funk/config" + "github.com/pubgo/funk/log" + "github.com/pubgo/funk/recovery" + "github.com/pubgo/lava/core/lavabuilder" + "github.com/pubgo/lava/core/logging" + "github.com/pubgo/lava/core/metrics" + "github.com/rs/zerolog" +) + +type Config struct { + metrics.MetricConfigLoader `yaml:",inline"` + logging.LogConfigLoader `yaml:",inline"` +} + +func main() { + defer recovery.Exit() + + dixinternal.SetLog(func(logger log.Logger) log.Logger { + return logger.WithLevel(zerolog.InfoLevel) + }) + + builder := lavabuilder.New() + builder.Provide(config.Load[Config]) + builder.Provide(envcmd.New) + builder.Provide(configcmd.New[Config]) + + lavabuilder.Run(builder) +} diff --git a/internal/examples/scheduler/taskfile.yml b/internal/examples/scheduler/taskfile.yml new file mode 100644 index 000000000..455e2afbf --- /dev/null +++ b/internal/examples/scheduler/taskfile.yml @@ -0,0 +1,26 @@ +# https://taskfile.dev + +version: '3' + +vars: + SchedulerRelease: "v0.1.0" + SchedulerProject: "scheduler" + +tasks: + info: + cmds: + - echo "{{.SchedulerRelease}}" "{{.SchedulerProject}}" + + default: + cmds: + - task scheduler:info + + build: + cmds: +# - go build -v -x -race -ldflags="-w" -o ./bin/scheduler ./internal/examples/scheduler/main.go + - go build -race -ldflags="-w" -o ./bin/scheduler ./internal/examples/scheduler/main.go + - ls -alh ./bin + run: + cmds: + - task scheduler:build + - ./bin/scheduler scheduler -c ./internal/configs/scheduler.yaml diff --git a/taskfile.yml b/taskfile.yml new file mode 100644 index 000000000..f5fbf1f2a --- /dev/null +++ b/taskfile.yml @@ -0,0 +1,59 @@ +# https://taskfile.dev + +version: '3' + +dotenv: [ '.env' ] +vars: + Project: "lava" + Base: "github.com/pubgo/funk" + VERSION: + sh: "git tag --sort=committerdate | tail -n 1" + BUILD_TIME: + sh: 'date "+%F %T"' + GIT_COMMIT: + sh: "git rev-list -1 HEAD" + BRANCH_NAME: + sh: "git branch ch --show-current" + GIT_VERSION: + sh: "git describe --always --abbrev=7 --dirty" + +includes: + scheduler: ./internal/examples/scheduler + +tasks: + info: + cmds: + - echo "Project {{.Project}}" + - echo "VERSION {{.VERSION}}" + - echo "GIT_VERSION {{.GIT_VERSION}}" + silent: true + + tools: + cmds: + - go install github.com/cortesi/modd/cmd/modd@latest + - go install mvdan.cc/sh/v3/cmd/shfmt@latest + - go install mvdan.cc/sh/v3/cmd/gosh@latest + - go install github.com/DarthSim/overmind/v2@latest + - go install github.com/a-h/templ/cmd/templ@latest + - go install golang.org/x/tools/cmd/goimports@latest + + generate: + cmds: + - go generate ./internal/... + + proto:fmt: + cmds: + - protobuild format + + proto:gen: + cmds: + - protobuild vendor + - protobuild gen + + proto:lint: + cmds: + - protobuild lint + + vet: + cmds: + - go vet ./pkg/... ./internal/... From 126eaa172849dad9e9fe2fbc197a86f75c1f013f Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 22 Aug 2025 18:34:04 +0800 Subject: [PATCH 105/142] fix: barry@feat/supervisor, 2025-08-22 18:34:04 --- .gitignore | 2 +- Makefile | 49 ------------- cmds/schedulercmd/cmd.go | 2 + core/debug/debug/debug.go | 3 +- core/debug/version/version.go | 6 +- core/scheduler/aaa.go | 4 +- core/scheduler/builder.go | 7 +- core/scheduler/config.go | 2 +- core/scheduler/job.go | 26 +++---- core/scheduler/scheduler.go | 4 +- core/supervisor/service.go | 2 +- go.mod | 2 +- go.sum | 4 +- internal/configs/components/http_server.yaml | 7 ++ internal/examples/scheduler/main.go | 40 ++++++++++- internal/examples/scheduler/taskfile.yml | 2 +- .../middleware_accesslog/middleware.go | 4 -- servers/https/config.go | 4 ++ servers/https/server.go | 68 +++---------------- taskfile.yml | 13 +++- 20 files changed, 108 insertions(+), 143 deletions(-) delete mode 100644 Makefile create mode 100644 internal/configs/components/http_server.yaml diff --git a/.gitignore b/.gitignore index 82d9ddbdd..a2111e00c 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,4 @@ pkg/example/services/logs logs bin /example/bin -.proto \ No newline at end of file +.proto diff --git a/Makefile b/Makefile deleted file mode 100644 index 4045331e4..000000000 --- a/Makefile +++ /dev/null @@ -1,49 +0,0 @@ -WORKDIR=`pwd` -Project=lava -Base=github.com/pubgo/funk -Version=$(shell git tag --sort=committerdate | tail -n 1) -BuildTime=$(shell date "+%F %T") -CommitID=$(shell git rev-parse --short=8 HEAD) -GOPATH=$(shell go env GOPATH ) - -LDFLAGS=-ldflags " \ --X '${Base}/version.buildTime=${BuildTime}' \ --X '${Base}/version.commitID=${CommitID}' \ --X '${Base}/version.version=${Version:-"v0.0.1-dev"}' \ --X '${Base}/version.project=${Project}' \ -" - -.PHONY: test -test: - @go test -short -race -v ./... -cover - -.PHONY: cover -cover: - gocov test -tags "kcp quic" ./... | gocov-html > cover.html - open cover.html - -.PHONY: vet -vet: - @go vet ./... - -.PHONY: generate -generate: - @go generate ./... - -.PHONY: deps -deps: - # https://github.com/protocolbuffers/protobuf - @go install -v github.com/tinylib/msgp - @go install -v github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2 - -.PHONY: protobuf -protobuf: - protobuild vendor - protobuild gen - -.PHONY: lint -lint: - golangci-lint run --verbose ./... - -vet: - go vet ./... diff --git a/cmds/schedulercmd/cmd.go b/cmds/schedulercmd/cmd.go index d0a461c3d..168efe4fb 100644 --- a/cmds/schedulercmd/cmd.go +++ b/cmds/schedulercmd/cmd.go @@ -6,6 +6,7 @@ import ( "github.com/pubgo/dix" "github.com/pubgo/funk/assert" "github.com/pubgo/funk/version" + "github.com/pubgo/lava/servers/https" "github.com/urfave/cli/v3" "github.com/pubgo/lava/core/lifecycle" @@ -20,6 +21,7 @@ func New(di *dix.Dix) *cli.Command { Usage: cmdutil.UsageDesc("crontab scheduler service %s(%s)", version.Project(), version.Version()), Action: func(ctx context.Context, command *cli.Command) error { di.Provide(scheduler.NewService) + di.Provide(https.New) params := dix.Inject(di, new(struct { LC lifecycle.Getter Services []supervisor.Service diff --git a/core/debug/debug/debug.go b/core/debug/debug/debug.go index ef7b07209..f597cd288 100644 --- a/core/debug/debug/debug.go +++ b/core/debug/debug/debug.go @@ -18,7 +18,8 @@ func init() { func initDebug() { debug.Get("/", func(ctx *fiber.Ctx) error { pathMap := make(map[string]interface{}) - stack := debug.App().Stack() + + stack := ctx.App().Stack() for m := range stack { for r := range stack[m] { route := stack[m][r] diff --git a/core/debug/version/version.go b/core/debug/version/version.go index e8c7ce5ab..ceaab917c 100644 --- a/core/debug/version/version.go +++ b/core/debug/version/version.go @@ -14,9 +14,9 @@ import ( ) func init() { - debug.Get("/env", adaptor.HTTPHandlerFunc(envHandle)) - debug.Get("/version", adaptor.HTTPHandlerFunc(versionHandle)) - debug.Get("/dep", adaptor.HTTPHandlerFunc(depHandle)) + debug.Get("env", adaptor.HTTPHandlerFunc(envHandle)) + debug.Get("version", adaptor.HTTPHandlerFunc(versionHandle)) + debug.Get("dep", adaptor.HTTPHandlerFunc(depHandle)) } func envHandle(writer http.ResponseWriter, request *http.Request) { diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index 37f8630b8..8d14849c5 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -126,6 +126,6 @@ type JobMetadata struct { Replace bool Location *time.Location - PreRunTime int64 - ExecTime int64 + NextExecTime int64 + ExecTime int64 } diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index 0be90bd8d..655a559d4 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -5,6 +5,7 @@ import ( "github.com/pubgo/funk/log" "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/vars" qlog "github.com/reugn/go-quartz/logger" "github.com/reugn/go-quartz/quartz" @@ -49,7 +50,7 @@ func New(m lifecycle.Lifecycle, logger log.Logger, metric metrics.Metric, config return } - scheduler := result.Wrap(quartz.NewStdScheduler(quartz.WithLogger(qlog.NewSimpleLogger(schedulerLog, qlog.LevelDebug)))). + scheduler := result.Wrap(quartz.NewStdScheduler(quartz.WithLogger(qlog.NewSimpleLogger(schedulerLog, qlog.LevelInfo)))). InspectErr(func(err error) { log.Err(err).Msg("failed to create scheduler") }). @@ -89,5 +90,9 @@ func New(m lifecycle.Lifecycle, logger log.Logger, metric metrics.Metric, config quart.start() m.BeforeStop(lifecycle.WrapNoCtxErr(quart.stop)) + vars.Register(Name, func() interface{} { + return quart.ListJobs() + }) + return quart, nil } diff --git a/core/scheduler/config.go b/core/scheduler/config.go index 3e37aa3ce..c47a574a0 100644 --- a/core/scheduler/config.go +++ b/core/scheduler/config.go @@ -33,7 +33,7 @@ func defaultConfig(name string) *JobConfig { Disabled: lo.ToPtr(false), Timeout: lo.ToPtr(time.Second * 10), RetryInterval: lo.ToPtr(time.Second), - MaxRetries: lo.ToPtr(0), + MaxRetries: lo.ToPtr(3), Replace: lo.ToPtr(false), Location: lo.ToPtr(time.UTC.String()), location: time.UTC, diff --git a/core/scheduler/job.go b/core/scheduler/job.go index e78380740..c51f69c3f 100644 --- a/core/scheduler/job.go +++ b/core/scheduler/job.go @@ -15,25 +15,25 @@ import ( ) type namedJob struct { - s *Scheduler - name string - log log.Logger + s *Scheduler + log log.Logger task *jobTask } -func (t *namedJob) Description() string { return t.name } +func (t *namedJob) Description() string { return t.task.spec.Name } func (t *namedJob) Execute(ctx context.Context) (gErr error) { start := time.Now() + name := t.task.spec.Name defer func() { cost := float64(time.Since(start).Milliseconds()) - t.s.metric.Tagged(metrics.Tags{"job_name": t.name}).Gauge("job_cost_ms").Update(cost) + t.s.metric.Tagged(metrics.Tags{"job_name": name}).Gauge("job_cost_ms").Update(cost) logger := generic.Ternary(generic.IsNil(gErr), t.log.Info(), t.log.Err(gErr)) logger.Func(func(e *zerolog.Event) { e.Float32("job_cost_ms", float32(cost)) - e.Str("job_name", t.name) + e.Str("job_name", name) e.Uint64("runs", t.task.runs.Load()) e.Msg("exec scheduler job") }) @@ -48,19 +48,21 @@ func (t *namedJob) Execute(ctx context.Context) (gErr error) { RetryInterval: lo.FromPtr(config.RetryInterval), Timeout: lo.FromPtr(config.Timeout), Location: config.location, - PreRunTime: t.task.trigger.prev, - ExecTime: t.task.trigger.next, + ExecTime: t.task.trigger.prev, + NextExecTime: t.task.trigger.next, } + fmt.Println(name, t.task.trigger.prev, time.Now().Unix()) + if t.task.trigger.err != nil { - return fmt.Errorf("schedule job(%s) error: %w", t.name, t.task.trigger.err) + return fmt.Errorf("schedule job(%s) error: %w", name, t.task.trigger.err) } return try.Try(func() error { ctx, cancel := context.WithTimeout(ctx, lo.FromPtr(config.Timeout)) defer cancel() - t.task.result = t.task.executor.Exec(ctx, t.name, &metadata) + t.task.result = t.task.executor.Exec(ctx, name, &metadata) return t.task.result.GetErr() }) } @@ -79,9 +81,9 @@ type triggerImpl struct { } func (t *triggerImpl) NextFireTime(prev int64) (next int64, err error) { - t.prev = prev + t.prev = prev / 1000_000_000 - defer func() { t.next, t.err = next, err }() + defer func() { t.next, t.err = next/1000_000_000, err }() return t.trigger.NextFireTime(prev) } diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index 92e5e516c..3edd4f031 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -109,7 +109,7 @@ func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { } jobOpt := config.ToJobDetailOptions() - job := &namedJob{s: s, name: name, task: &task, log: s.log} + job := &namedJob{s: s, task: &task, log: s.log} jobDetail := quartz.NewJobDetailWithOptions(job, parseJobKey(name), jobOpt) if result.CatchErr(&r, s.scheduler.ScheduleJob(jobDetail, trigger)) { return @@ -195,7 +195,7 @@ func (s *Scheduler) ReloadJob(name string) (r result.Error) { jobOpt := job.spec.Config.ToJobDetailOptions() jobDetail := quartz.NewJobDetailWithOptions( - &namedJob{s: s, name: name, task: job, log: s.log}, + &namedJob{s: s, task: job, log: s.log}, job.jobKey, jobOpt, ) diff --git a/core/supervisor/service.go b/core/supervisor/service.go index ca9e579d7..ebd9b6497 100644 --- a/core/supervisor/service.go +++ b/core/supervisor/service.go @@ -71,7 +71,7 @@ func (s *serviceImpl) Serve(ctx context.Context) (gErr error) { s.metric.Set("online_duration", vars.Any(time.Since(now).String())) log.Info(ctx). Str("service", s.name). - RawJSON("metric", []byte(s.metric.String())). + Str("metric", s.metric.String()). Msg("stop service") }() defer recovery.Err(&gErr) diff --git a/go.mod b/go.mod index dab5fcab7..6b61ee045 100644 --- a/go.mod +++ b/go.mod @@ -54,7 +54,7 @@ require ( github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.65.0 github.com/pubgo/dix v0.3.21 - github.com/pubgo/funk v0.5.69-alpha.9 + github.com/pubgo/funk v0.5.69-alpha.10 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.6.0 github.com/rs/zerolog v1.34.0 diff --git a/go.sum b/go.sum index 7280580e5..70a54eb35 100644 --- a/go.sum +++ b/go.sum @@ -506,8 +506,8 @@ github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7D github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/pubgo/dix v0.3.21 h1:jtriLYT6srKrxv0KRwic1no0d9ZTMtLx6r3JJxQ5Jvw= github.com/pubgo/dix v0.3.21/go.mod h1:5qHJ7ycvBVw1AUjgYMEsobzx1tggiRs+spgzd4Jglb4= -github.com/pubgo/funk v0.5.69-alpha.9 h1:nmnlbz0owbrbblVVAFNzlHVVXZfIq3d93qQCy34eXX0= -github.com/pubgo/funk v0.5.69-alpha.9/go.mod h1:mWqaZftfwVoZk/qhLqb/S3iCa1LR7QKIMh3HsABCIjo= +github.com/pubgo/funk v0.5.69-alpha.10 h1:4KH2IeyH2t9ufRqGxm0sUY+MuEIaD3y497/9aWKNl6k= +github.com/pubgo/funk v0.5.69-alpha.10/go.mod h1:mWqaZftfwVoZk/qhLqb/S3iCa1LR7QKIMh3HsABCIjo= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/pubgo/protobuild v0.0.21 h1:QSwh92QxsD6Mv7kQlowzE7fxtcOm1eMWmgADsD803Js= diff --git a/internal/configs/components/http_server.yaml b/internal/configs/components/http_server.yaml new file mode 100644 index 000000000..b0e31ac35 --- /dev/null +++ b/internal/configs/components/http_server.yaml @@ -0,0 +1,7 @@ +http_server: + base_url: /scheduler + enable_cors: ${GRPC_ENABLE_CORS:-false} + enable_ping_pong: true + ping_pong_time: 40 + enable_print_router: true +# http_port: 8001 diff --git a/internal/examples/scheduler/main.go b/internal/examples/scheduler/main.go index 724a0ce2c..6f6adc345 100644 --- a/internal/examples/scheduler/main.go +++ b/internal/examples/scheduler/main.go @@ -1,21 +1,54 @@ package main import ( + "context" + "fmt" + "time" + "github.com/pubgo/dix/dixinternal" "github.com/pubgo/funk/cmds/configcmd" "github.com/pubgo/funk/cmds/envcmd" "github.com/pubgo/funk/config" "github.com/pubgo/funk/log" "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/core/lavabuilder" "github.com/pubgo/lava/core/logging" "github.com/pubgo/lava/core/metrics" + "github.com/pubgo/lava/core/scheduler" + "github.com/pubgo/lava/servers/https" "github.com/rs/zerolog" ) type Config struct { - metrics.MetricConfigLoader `yaml:",inline"` - logging.LogConfigLoader `yaml:",inline"` + metrics.MetricConfigLoader `yaml:",inline"` + logging.LogConfigLoader `yaml:",inline"` + https.HttpServerConfigLoader `yaml:",inline"` +} + +var _ scheduler.JobRegister = (*schedulerExample)(nil) + +type schedulerExample struct { +} + +func (s schedulerExample) RegisterSchedulerJob(reg scheduler.JobRegistry) { + reg.Once("once_task", time.Second*12, func(ctx context.Context, name string, metadata *scheduler.JobMetadata) result.Result[[]byte] { + fmt.Printf("exec once task: %s: %#v\n", name, metadata) + time.Sleep(time.Second * 5) + return result.OK([]byte("once")) + }) + + reg.Every("every_task", time.Second*5, func(ctx context.Context, name string, metadata *scheduler.JobMetadata) result.Result[[]byte] { + fmt.Printf("exec every task: %s: %#v\n", name, metadata) + time.Sleep(time.Second * 1) + return result.OK([]byte("every")) + }) + + reg.Cron("cron_task", "*/7 * * * * *", func(ctx context.Context, name string, metadata *scheduler.JobMetadata) result.Result[[]byte] { + fmt.Printf("exec cron task: %s: %#v\n", name, metadata) + time.Sleep(time.Second * 2) + return result.OK([]byte("cron")) + }) } func main() { @@ -29,6 +62,9 @@ func main() { builder.Provide(config.Load[Config]) builder.Provide(envcmd.New) builder.Provide(configcmd.New[Config]) + builder.Provide(func() scheduler.JobRegister { + return &schedulerExample{} + }) lavabuilder.Run(builder) } diff --git a/internal/examples/scheduler/taskfile.yml b/internal/examples/scheduler/taskfile.yml index 455e2afbf..e72e834bc 100644 --- a/internal/examples/scheduler/taskfile.yml +++ b/internal/examples/scheduler/taskfile.yml @@ -18,7 +18,7 @@ tasks: build: cmds: # - go build -v -x -race -ldflags="-w" -o ./bin/scheduler ./internal/examples/scheduler/main.go - - go build -race -ldflags="-w" -o ./bin/scheduler ./internal/examples/scheduler/main.go + - go build -o ./bin/scheduler ./internal/examples/scheduler/main.go - ls -alh ./bin run: cmds: diff --git a/internal/middlewares/middleware_accesslog/middleware.go b/internal/middlewares/middleware_accesslog/middleware.go index 828c368d4..ce93d52db 100644 --- a/internal/middlewares/middleware_accesslog/middleware.go +++ b/internal/middlewares/middleware_accesslog/middleware.go @@ -152,10 +152,6 @@ func (l LogMiddleware) Middleware(next lava.HandlerFunc) lava.HandlerFunc { func handleLogOption(header *lava.RequestHeader) *logOption { data := header.PeekAll("X-Log-Option") - if len(data) == 0 { - return nil - } - val := make(map[string]bool, len(data)) for i := range data { val[convert.B2S(data[i])] = true diff --git a/servers/https/config.go b/servers/https/config.go index ab42765ab..07bda48a0 100644 --- a/servers/https/config.go +++ b/servers/https/config.go @@ -23,3 +23,7 @@ func DefaultCfg() Config { BaseUrl: version.Project(), } } + +type HttpServerConfigLoader struct { + HttpServer *Config `yaml:"http_server"` +} diff --git a/servers/https/server.go b/servers/https/server.go index 0d8349ad9..c6d28443f 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -17,7 +17,6 @@ import ( "github.com/pubgo/funk/log" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/running" - "github.com/pubgo/funk/stack" "github.com/pubgo/funk/version" "github.com/pubgo/opendoc/opendoc" "google.golang.org/grpc/codes" @@ -35,14 +34,12 @@ import ( ) type Params struct { - Handlers []lava.HttpRouter - Middlewares []lava.Middleware - GetLifecycle lifecycle.Getter - Lifecycle lifecycle.Lifecycle - M metrics.Metric - Log log.Logger - Cfg *Config - Docs []*opendoc.Swagger + Handlers []lava.HttpRouter + Middlewares []lava.Middleware + M metrics.Metric + Log log.Logger + Cfg *Config + Docs []*opendoc.Swagger } func New(params Params) supervisor.Service { return newService(params) } @@ -52,8 +49,6 @@ func newService(params Params) supervisor.Service { s.init( params.Handlers, params.Middlewares, - params.GetLifecycle, - params.Lifecycle, params.M, params.Log, params.Cfg, @@ -83,8 +78,6 @@ func (s *serviceImpl) Serve(ctx context.Context) error { func (s *serviceImpl) init( handlers []lava.HttpRouter, middlewares []lava.Middleware, - getLifecycle lifecycle.Getter, - lifecycle lifecycle.Lifecycle, m metrics.Metric, log log.Logger, cfg *Config, @@ -96,12 +89,10 @@ func (s *serviceImpl) init( log = log.WithName("http-server") - s.lc = getLifecycle s.log = log s.httpServer = fiber.New(fiber.Config{ EnableIPValidation: true, - ETag: true, ErrorHandler: func(ctx *fiber.Ctx, err error) error { if err == nil { return nil @@ -124,7 +115,6 @@ func (s *serviceImpl) init( AllowOriginsFunc: func(origin string) bool { return true }, - AllowOrigins: "*", AllowMethods: strings.Join([]string{ fiber.MethodGet, fiber.MethodPost, @@ -134,10 +124,10 @@ func (s *serviceImpl) init( fiber.MethodHead, fiber.MethodOptions, }, ","), - AllowHeaders: "", + //AllowHeaders: "", AllowCredentials: true, - ExposeHeaders: "", - MaxAge: 0, + //ExposeHeaders: "", + MaxAge: 0, })) defaultMiddlewares := []lava.Middleware{ @@ -161,10 +151,6 @@ func (s *serviceImpl) init( //} h.Router(g) - - if m, ok := h.(lava.Close); ok { - lifecycle.BeforeStop(m.Close) - } } s.httpServer.Mount("/debug", debug.App()) @@ -186,17 +172,8 @@ func (s *serviceImpl) init( func (s *serviceImpl) start(ctx context.Context) { defer recovery.Exit() - logutil.OkOrFailed(s.log, "service before-start", func() error { - defer recovery.Exit() - for _, run := range s.lc.GetBeforeStarts() { - s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) - assert.Exit(run.Exec(ctx)) - } - return nil - }) httpLn := assert.Must1(net.Listen("tcp", fmt.Sprintf(":%d", running.HttpPort))) - logutil.OkOrFailed(s.log, "service start", func() error { async.GoDelay(func() error { s.log.Info().Msg("[http-server] Server Starting") @@ -213,38 +190,11 @@ func (s *serviceImpl) start(ctx context.Context) { }) return nil }) - - logutil.OkOrFailed(s.log, "service after-start", func() error { - defer recovery.Exit() - for _, run := range s.lc.GetAfterStarts() { - s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) - assert.Exit(run.Exec(ctx)) - } - return nil - }) } func (s *serviceImpl) stop(ctx context.Context) { defer recovery.DebugPrint() - logutil.OkOrFailed(s.log, "service before-stop", func() error { - for _, run := range s.lc.GetBeforeStops() { - logutil.LogOrErr(s.log, fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), func() error { - return run.Exec(ctx) - }) - } - return nil - }) - logutil.LogOrErr(s.log, "[http-server] Shutdown", func() error { return s.httpServer.ShutdownWithTimeout(time.Second * 5) }) - - logutil.OkOrFailed(s.log, "service after-stop", func() error { - for _, run := range s.lc.GetAfterStops() { - logutil.LogOrErr(s.log, fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), func() error { - return run.Exec(ctx) - }) - } - return nil - }) } diff --git a/taskfile.yml b/taskfile.yml index f5fbf1f2a..07ea55e9c 100644 --- a/taskfile.yml +++ b/taskfile.yml @@ -11,7 +11,7 @@ vars: BUILD_TIME: sh: 'date "+%F %T"' GIT_COMMIT: - sh: "git rev-list -1 HEAD" + sh: "git rev-parse --short=8 HEAD" BRANCH_NAME: sh: "git branch ch --show-current" GIT_VERSION: @@ -21,6 +21,11 @@ includes: scheduler: ./internal/examples/scheduler tasks: + default: + desc: "default task" + cmds: + - task -a + info: cmds: - echo "Project {{.Project}}" @@ -57,3 +62,9 @@ tasks: vet: cmds: - go vet ./pkg/... ./internal/... + test: + cmds: + - go test -short -race -v ./... -cover + lint: + cmds: + - golangci-lint run --verbose ./... From dd32757b0a87406903dd1f59286cad48b72407dd Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 22 Aug 2025 20:35:43 +0800 Subject: [PATCH 106/142] fix: barry quick fix, 2025-08-22 20:35:42 --- core/scheduler/aaa.go | 3 +++ core/scheduler/job.go | 5 +++++ core/scheduler/scheduler.go | 3 +++ core/supervisor/service.go | 2 +- 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index 8d14849c5..ccae0e2ad 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -2,6 +2,7 @@ package scheduler import ( "context" + "expvar" stdLog "log" "os" "time" @@ -96,6 +97,8 @@ type jobTask struct { jobKey *quartz.JobKey status Status + metric *expvar.Map + result result.Result[[]byte] } diff --git a/core/scheduler/job.go b/core/scheduler/job.go index c51f69c3f..c58632084 100644 --- a/core/scheduler/job.go +++ b/core/scheduler/job.go @@ -3,6 +3,7 @@ package scheduler import ( "context" "fmt" + "github.com/pubgo/funk/vars" "time" "github.com/pubgo/funk/generic" @@ -29,6 +30,8 @@ func (t *namedJob) Execute(ctx context.Context) (gErr error) { defer func() { cost := float64(time.Since(start).Milliseconds()) t.s.metric.Tagged(metrics.Tags{"job_name": name}).Gauge("job_cost_ms").Update(cost) + t.task.metric.Set("job_cost_ms", vars.Any(cost)) + t.task.metric.Set("runs", vars.Any(t.task.runs.Load())) logger := generic.Ternary(generic.IsNil(gErr), t.log.Info(), t.log.Err(gErr)) logger.Func(func(e *zerolog.Event) { @@ -52,6 +55,8 @@ func (t *namedJob) Execute(ctx context.Context) (gErr error) { NextExecTime: t.task.trigger.next, } + t.task.metric.Set("metadata", vars.Any(metadata)) + fmt.Println(name, t.task.trigger.prev, time.Now().Unix()) if t.task.trigger.err != nil { diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index 3edd4f031..817d19937 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -7,6 +7,7 @@ import ( "github.com/pubgo/funk/log" "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/vars" "github.com/pubgo/lava/core/metrics" "github.com/reugn/go-quartz/quartz" "github.com/rs/zerolog" @@ -65,6 +66,8 @@ func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { return result.Errorf("job %s already exists", name) } + task.metric = vars.Map(fmt.Sprintf("scheduler-%s", name)) + result.WrapFn(func() (JobExecutor, error) { executor := s.jobExecutors[spec.Executor] if executor == nil { diff --git a/core/supervisor/service.go b/core/supervisor/service.go index ebd9b6497..10260813b 100644 --- a/core/supervisor/service.go +++ b/core/supervisor/service.go @@ -31,7 +31,7 @@ func (s *serviceImpl) Metrics() *expvar.Map { } func (s *serviceImpl) initMetric() *serviceImpl { - metric := new(expvar.Map).Init() + metric := vars.Map(fmt.Sprintf("supervisor-%s", s.name)) metric.Set(s.name, vars.Any(s.String())) metric.Set(s.name+".error", vars.Value(func() interface{} { if s.err == nil { From 384c1134efe19ecc0758e397c3da54673a840fc5 Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 22 Aug 2025 20:39:07 +0800 Subject: [PATCH 107/142] fix: barry quick fix, 2025-08-22 20:39:07 --- core/supervisor/manager.go | 3 +-- core/supervisor/service.go | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go index 4707efbfb..b6b3e3470 100644 --- a/core/supervisor/manager.go +++ b/core/supervisor/manager.go @@ -3,7 +3,6 @@ package supervisor import ( "context" "fmt" - "time" "github.com/pubgo/funk/assert" "github.com/pubgo/funk/async" @@ -155,7 +154,7 @@ func (m *Manager) start() error { } assert.Exit(err) return nil - }, time.Second*2) + }) logutil.OkOrFailed(m.logger, "service after-start", func() error { defer recovery.Exit() diff --git a/core/supervisor/service.go b/core/supervisor/service.go index 10260813b..2f4eb86b2 100644 --- a/core/supervisor/service.go +++ b/core/supervisor/service.go @@ -4,6 +4,7 @@ import ( "context" "expvar" "fmt" + "strconv" "time" "github.com/pubgo/funk/errors" @@ -32,7 +33,7 @@ func (s *serviceImpl) Metrics() *expvar.Map { func (s *serviceImpl) initMetric() *serviceImpl { metric := vars.Map(fmt.Sprintf("supervisor-%s", s.name)) - metric.Set(s.name, vars.Any(s.String())) + metric.Set(s.name, vars.Any(strconv.Quote(s.String()))) metric.Set(s.name+".error", vars.Value(func() interface{} { if s.err == nil { return nil From 2f23e75fa5dc2c61b1f0201c88f768ca2a4cf059 Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 22 Aug 2025 21:31:07 +0800 Subject: [PATCH 108/142] fix: barry quick fix, 2025-08-22 21:31:07 --- core/scheduler/aaa.go | 4 ++-- core/scheduler/job.go | 8 +++----- core/supervisor/service.go | 3 +-- go.mod | 2 +- go.sum | 4 ++-- servers/https/server.go | 20 ++++++++++++++++++-- 6 files changed, 27 insertions(+), 14 deletions(-) diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index ccae0e2ad..6013a53e9 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -14,7 +14,7 @@ import ( "go.uber.org/atomic" ) -var schedulerLog = stdLog.New(os.Stdout, "scheduler", stdLog.LstdFlags|stdLog.Lmsgprefix|stdLog.Llongfile) +var schedulerLog = stdLog.New(os.Stdout, "scheduler", stdLog.LstdFlags|stdLog.Lmsgprefix|stdLog.Lshortfile) type JobExecutor interface { Name() string @@ -127,7 +127,7 @@ type JobMetadata struct { MaxRetries int RetryInterval time.Duration Replace bool - Location *time.Location + Location string NextExecTime int64 ExecTime int64 diff --git a/core/scheduler/job.go b/core/scheduler/job.go index c58632084..77f477f9d 100644 --- a/core/scheduler/job.go +++ b/core/scheduler/job.go @@ -33,7 +33,7 @@ func (t *namedJob) Execute(ctx context.Context) (gErr error) { t.task.metric.Set("job_cost_ms", vars.Any(cost)) t.task.metric.Set("runs", vars.Any(t.task.runs.Load())) - logger := generic.Ternary(generic.IsNil(gErr), t.log.Info(), t.log.Err(gErr)) + logger := generic.Ternary(gErr == nil, t.log.Info(), t.log.Err(gErr)) logger.Func(func(e *zerolog.Event) { e.Float32("job_cost_ms", float32(cost)) e.Str("job_name", name) @@ -50,17 +50,15 @@ func (t *namedJob) Execute(ctx context.Context) (gErr error) { MaxRetries: lo.FromPtr(config.MaxRetries), RetryInterval: lo.FromPtr(config.RetryInterval), Timeout: lo.FromPtr(config.Timeout), - Location: config.location, + Location: config.location.String(), ExecTime: t.task.trigger.prev, NextExecTime: t.task.trigger.next, } t.task.metric.Set("metadata", vars.Any(metadata)) - fmt.Println(name, t.task.trigger.prev, time.Now().Unix()) - if t.task.trigger.err != nil { - return fmt.Errorf("schedule job(%s) error: %w", name, t.task.trigger.err) + return fmt.Errorf("schedule job(%s) trigger error: %w", name, t.task.trigger.err) } return try.Try(func() error { diff --git a/core/supervisor/service.go b/core/supervisor/service.go index 2f4eb86b2..10260813b 100644 --- a/core/supervisor/service.go +++ b/core/supervisor/service.go @@ -4,7 +4,6 @@ import ( "context" "expvar" "fmt" - "strconv" "time" "github.com/pubgo/funk/errors" @@ -33,7 +32,7 @@ func (s *serviceImpl) Metrics() *expvar.Map { func (s *serviceImpl) initMetric() *serviceImpl { metric := vars.Map(fmt.Sprintf("supervisor-%s", s.name)) - metric.Set(s.name, vars.Any(strconv.Quote(s.String()))) + metric.Set(s.name, vars.Any(s.String())) metric.Set(s.name+".error", vars.Value(func() interface{} { if s.err == nil { return nil diff --git a/go.mod b/go.mod index 6b61ee045..ce8e5b2a9 100644 --- a/go.mod +++ b/go.mod @@ -54,7 +54,7 @@ require ( github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.65.0 github.com/pubgo/dix v0.3.21 - github.com/pubgo/funk v0.5.69-alpha.10 + github.com/pubgo/funk v0.5.69-alpha.11 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.6.0 github.com/rs/zerolog v1.34.0 diff --git a/go.sum b/go.sum index 70a54eb35..c78c8122a 100644 --- a/go.sum +++ b/go.sum @@ -506,8 +506,8 @@ github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7D github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/pubgo/dix v0.3.21 h1:jtriLYT6srKrxv0KRwic1no0d9ZTMtLx6r3JJxQ5Jvw= github.com/pubgo/dix v0.3.21/go.mod h1:5qHJ7ycvBVw1AUjgYMEsobzx1tggiRs+spgzd4Jglb4= -github.com/pubgo/funk v0.5.69-alpha.10 h1:4KH2IeyH2t9ufRqGxm0sUY+MuEIaD3y497/9aWKNl6k= -github.com/pubgo/funk v0.5.69-alpha.10/go.mod h1:mWqaZftfwVoZk/qhLqb/S3iCa1LR7QKIMh3HsABCIjo= +github.com/pubgo/funk v0.5.69-alpha.11 h1:4LjzocKHu2zYjC0B2sNgtb/7kSZy1s3y1hd3BbN0FHM= +github.com/pubgo/funk v0.5.69-alpha.11/go.mod h1:mWqaZftfwVoZk/qhLqb/S3iCa1LR7QKIMh3HsABCIjo= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/pubgo/protobuild v0.0.21 h1:QSwh92QxsD6Mv7kQlowzE7fxtcOm1eMWmgADsD803Js= diff --git a/servers/https/server.go b/servers/https/server.go index c6d28443f..02937c6dc 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "github.com/pubgo/funk/proto/errorpb" "net" "net/http" "strings" @@ -98,11 +99,26 @@ func (s *serviceImpl) init( return nil } - errPb := errutil.ParseError(err) + var errPb *errorpb.Error + var fiberErr *fiber.Error + if errors.As(err, &fiberErr) && fiberErr != nil { + errPb = &errorpb.Error{ + Code: &errorpb.ErrCode{ + Name: "lava.error", + StatusCode: errorpb.Code(errutil.Http2GrpcCode(int32(fiberErr.Code))), + Code: int32(fiberErr.Code), + Message: fiberErr.Message, + }, + Trace: &errorpb.ErrTrace{}, + } + } else { + errPb = errutil.ParseError(err) + } + if errPb == nil || errPb.Code.Code == 0 { return nil } - + errPb.Trace.Operation = ctx.Route().Path code := errutil.GrpcCodeToHTTP(codes.Code(errPb.Code.Code)) ctx.Set(fiber.HeaderContentType, fiber.MIMEApplicationJSON) From f7fed88594b0afdece80e3d0cfd7fe9a1a2e456e Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 22 Aug 2025 21:32:04 +0800 Subject: [PATCH 109/142] fix: barry quick fix, 2025-08-22 21:32:04 --- servers/https/server.go | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/servers/https/server.go b/servers/https/server.go index 02937c6dc..175e23847 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -4,23 +4,21 @@ import ( "context" "errors" "fmt" - "github.com/pubgo/funk/proto/errorpb" - "net" - "net/http" - "strings" - "time" - "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cors" "github.com/pubgo/funk/assert" "github.com/pubgo/funk/async" "github.com/pubgo/funk/errors/errutil" "github.com/pubgo/funk/log" + "github.com/pubgo/funk/proto/errorpb" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/running" "github.com/pubgo/funk/version" "github.com/pubgo/opendoc/opendoc" "google.golang.org/grpc/codes" + "net" + "net/http" + "strings" "github.com/pubgo/lava/core/debug" "github.com/pubgo/lava/core/lifecycle" @@ -118,7 +116,7 @@ func (s *serviceImpl) init( if errPb == nil || errPb.Code.Code == 0 { return nil } - + errPb.Trace.Operation = ctx.Route().Path code := errutil.GrpcCodeToHTTP(codes.Code(errPb.Code.Code)) ctx.Set(fiber.HeaderContentType, fiber.MIMEApplicationJSON) @@ -211,6 +209,6 @@ func (s *serviceImpl) start(ctx context.Context) { func (s *serviceImpl) stop(ctx context.Context) { defer recovery.DebugPrint() logutil.LogOrErr(s.log, "[http-server] Shutdown", func() error { - return s.httpServer.ShutdownWithTimeout(time.Second * 5) + return s.httpServer.ShutdownWithContext(ctx) }) } From 9b4d2873d9369a5e194d75ce3ce7288c13158970 Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 22 Aug 2025 22:03:46 +0800 Subject: [PATCH 110/142] fix: barry quick fix, 2025-08-22 22:03:46 --- core/debug/statsviz/main.go | 15 ++++++++++--- go.mod | 2 +- go.sum | 4 ++-- pkg/netutil/util.go | 12 ++++++++++- servers/https/server.go | 42 ++++++++++++++++++++++++++++--------- 5 files changed, 58 insertions(+), 17 deletions(-) diff --git a/core/debug/statsviz/main.go b/core/debug/statsviz/main.go index 05dbf315e..e200b3d66 100644 --- a/core/debug/statsviz/main.go +++ b/core/debug/statsviz/main.go @@ -5,6 +5,7 @@ import ( "github.com/arl/statsviz" "github.com/gofiber/fiber/v2" + "github.com/pubgo/funk" "github.com/pubgo/funk/assert" "github.com/pubgo/lava/core/debug" "github.com/pubgo/lava/pkg/httputil" @@ -13,18 +14,26 @@ import ( // github.com/go-echarts/statsview func init() { - srv := assert.Exit1(statsviz.NewServer(statsviz.Root("/statsviz"))) + srv := assert.Exit1(statsviz.NewServer(statsviz.Root("/debug/statsviz"))) debug.Route("/statsviz", func(router fiber.Router) { router.Use(func(ctx *fiber.Ctx) error { path := string(ctx.Request().URI().Path()) - pathList := strings.Split(path, "/") - if strings.Trim(pathList[len(pathList)-1], "/") == "ws" { + lastPath := strings.TrimSpace(funk.Last(strings.Split(strings.Trim(path, "/"), "/"))) + + if lastPath == "ws" { return httputil.HTTPHandler(srv.Ws())(ctx) } + if lastPath == "statsviz" { + return httputil.HTTPHandler(srv.Index())(ctx) + } + return ctx.Next() }) + router.Get("", func(ctx *fiber.Ctx) error { + return httputil.HTTPHandler(srv.Index())(ctx) + }) router.Get("/", func(ctx *fiber.Ctx) error { return httputil.HTTPHandler(srv.Index())(ctx) }) diff --git a/go.mod b/go.mod index ce8e5b2a9..8c5277a8b 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( require ( github.com/alecthomas/participle/v2 v2.1.4 - github.com/arl/statsviz v0.6.0 + github.com/arl/statsviz v0.7.1 github.com/ecordell/optgen v0.0.9 github.com/fasthttp/websocket v1.5.12 github.com/felixge/fgprof v0.9.5 diff --git a/go.sum b/go.sum index c78c8122a..25c15b07e 100644 --- a/go.sum +++ b/go.sum @@ -50,8 +50,8 @@ github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQ github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= -github.com/arl/statsviz v0.6.0 h1:jbW1QJkEYQkufd//4NDYRSNBpwJNrdzPahF7ZmoGdyE= -github.com/arl/statsviz v0.6.0/go.mod h1:0toboo+YGSUXDaS4g1D5TVS4dXs7S7YYT5J/qnW2h8s= +github.com/arl/statsviz v0.7.1 h1:W32VBGV/YBTMg3sBsr1Ix1bJzrykZHWNZS7quqtDqYc= +github.com/arl/statsviz v0.7.1/go.mod h1:uFJZYUcGDeFpo/Mb9nLkq/83YUYaib2IccejOm+y1t0= github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8gerOIVIY= github.com/ashanbrown/forbidigo v1.6.0/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= diff --git a/pkg/netutil/util.go b/pkg/netutil/util.go index dc3f2c62e..87670111f 100644 --- a/pkg/netutil/util.go +++ b/pkg/netutil/util.go @@ -1,6 +1,7 @@ package netutil import ( + "context" "errors" "fmt" "io" @@ -173,9 +174,18 @@ func getIP(r *http.Request) (string, error) { if err != nil { return "", err } + netIP = net.ParseIP(ip) if netIP != nil { return ip, nil } - return "", fmt.Errorf("No valid ip found") + + return "", fmt.Errorf("no valid ip found: %s", r.RemoteAddr) +} + +func IsErrServerClosed(err error) bool { + return err == nil || + errors.Is(err, http.ErrServerClosed) || + errors.Is(err, net.ErrClosed) || + errors.Is(err, context.Canceled) } diff --git a/servers/https/server.go b/servers/https/server.go index 175e23847..be0f2a312 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -4,6 +4,9 @@ import ( "context" "errors" "fmt" + "net" + "strings" + "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cors" "github.com/pubgo/funk/assert" @@ -13,12 +16,11 @@ import ( "github.com/pubgo/funk/proto/errorpb" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/running" + "github.com/pubgo/funk/vars" "github.com/pubgo/funk/version" "github.com/pubgo/opendoc/opendoc" + "github.com/rs/xid" "google.golang.org/grpc/codes" - "net" - "net/http" - "strings" "github.com/pubgo/lava/core/debug" "github.com/pubgo/lava/core/lifecycle" @@ -30,6 +32,7 @@ import ( "github.com/pubgo/lava/internal/middlewares/middleware_recovery" "github.com/pubgo/lava/internal/middlewares/middleware_serviceinfo" "github.com/pubgo/lava/lava" + "github.com/pubgo/lava/pkg/netutil" ) type Params struct { @@ -118,7 +121,12 @@ func (s *serviceImpl) init( } errPb.Trace.Operation = ctx.Route().Path - code := errutil.GrpcCodeToHTTP(codes.Code(errPb.Code.Code)) + + code := int(errPb.Code.Code) + if errPb.Code.Code > 1000 { + code = errutil.GrpcCodeToHTTP(codes.Code(errPb.Code.Code)) + } + ctx.Set(fiber.HeaderContentType, fiber.MIMEApplicationJSON) return ctx.Status(code).JSON(errPb) }, @@ -172,6 +180,10 @@ func (s *serviceImpl) init( // 网关初始化 if cfg.EnablePrintRouter { + vars.Register(fmt.Sprintf("%s-http-server-router-%s", version.Project(), xid.New()), func() interface{} { + return s.httpServer.Stack() + }) + for _, stacks := range s.httpServer.Stack() { for _, route := range stacks { s.log.Info(). @@ -193,12 +205,13 @@ func (s *serviceImpl) start(ctx context.Context) { s.log.Info().Msg("[http-server] Server Starting") logutil.LogOrErr(s.log, "[http-server] Server Stop", func() error { defer recovery.Exit() - if err := s.httpServer.Listener(httpLn); err != nil && - !errors.Is(err, http.ErrServerClosed) && - !errors.Is(err, net.ErrClosed) { - return err + + err := s.httpServer.Listener(httpLn) + if netutil.IsErrServerClosed(err) { + return nil } - return nil + + return err }) return nil }) @@ -209,6 +222,15 @@ func (s *serviceImpl) start(ctx context.Context) { func (s *serviceImpl) stop(ctx context.Context) { defer recovery.DebugPrint() logutil.LogOrErr(s.log, "[http-server] Shutdown", func() error { - return s.httpServer.ShutdownWithContext(ctx) + err := s.httpServer.ShutdownWithContext(ctx) + if err == nil { + return nil + } + + if netutil.IsErrServerClosed(err) { + return nil + } + + return err }) } From 14cb8f44a42e7bbb803461d0f1c46c5dfc7dced7 Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 25 Aug 2025 16:09:15 +0800 Subject: [PATCH 111/142] fix: barry@feat/supervisor, 2025-08-25 16:09:15 --- core/supervisor/service.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/supervisor/service.go b/core/supervisor/service.go index 10260813b..777260ece 100644 --- a/core/supervisor/service.go +++ b/core/supervisor/service.go @@ -6,10 +6,12 @@ import ( "fmt" "time" + "github.com/gofiber/fiber/v2" "github.com/pubgo/funk/errors" "github.com/pubgo/funk/log" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/vars" + "github.com/pubgo/lava/core/debug" ) func NewService(name string, fn func(ctx context.Context) error) Service { @@ -41,6 +43,14 @@ func (s *serviceImpl) initMetric() *serviceImpl { })) metric.Add("restart", 0) s.metric = metric + + debug.Route("/supervisor", func(router fiber.Router) { + router.Get("services", func(ctx *fiber.Ctx) error { + + return nil + }) + }) + return s } From 47c1069223fcb782c727d1dc70a2762cc173a6d3 Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 25 Aug 2025 21:23:37 +0800 Subject: [PATCH 112/142] fix: barry quick fix, 2025-08-25 21:23:37 --- core/supervisor/aaa.go | 12 ++++++-- core/supervisor/manager.go | 19 +++++++++++- core/supervisor/service.go | 61 +++++++++++++++----------------------- servers/https/server.go | 17 +++++------ 4 files changed, 59 insertions(+), 50 deletions(-) diff --git a/core/supervisor/aaa.go b/core/supervisor/aaa.go index 03146401e..de7d52493 100644 --- a/core/supervisor/aaa.go +++ b/core/supervisor/aaa.go @@ -2,19 +2,27 @@ package supervisor import ( "context" - "expvar" + "time" "github.com/thejerf/suture/v4" ) type Supervisor = suture.Supervisor +type ServiceMetric struct { + Name string + Error string + Restart uint32 + StartTime time.Time + OnlineDuration time.Duration +} + type Service interface { Name() string Error() error String() string Serve(ctx context.Context) error - Metrics() *expvar.Map + Metrics() *ServiceMetric } type serviceFn func(ctx context.Context) error diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go index b6b3e3470..d5525ae11 100644 --- a/core/supervisor/manager.go +++ b/core/supervisor/manager.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/gofiber/fiber/v2" "github.com/pubgo/funk/assert" "github.com/pubgo/funk/async" "github.com/pubgo/funk/errors" @@ -14,6 +15,7 @@ import ( "github.com/pubgo/funk/stack" "github.com/thejerf/suture/v4" + "github.com/pubgo/lava/core/debug" "github.com/pubgo/lava/core/lifecycle" "github.com/pubgo/lava/core/signal" "github.com/pubgo/lava/internal/logutil" @@ -30,7 +32,7 @@ func Default(lc lifecycle.Getter) *Manager { func NewManager(name string, lc lifecycle.Getter) *Manager { ctx, cancel := context.WithCancel(context.Background()) - return &Manager{ + m := &Manager{ cancel: cancel, ctx: ctx, lc: lc, @@ -38,6 +40,7 @@ func NewManager(name string, lc lifecycle.Getter) *Manager { services: make(map[string]*serviceWrapper), logger: log.GetLogger(name), } + return m.init() } type Manager struct { @@ -49,6 +52,20 @@ type Manager struct { cancel context.CancelFunc } +func (m *Manager) init() *Manager { + debug.Route("/supervisor", func(router fiber.Router) { + router.Get("services", func(ctx *fiber.Ctx) error { + var services []*ServiceMetric + for _, srv := range m.services { + services = append(services, srv.service.Metrics()) + } + return ctx.JSON(services) + }) + }) + + return m +} + func (m *Manager) Has(name string) bool { _, ok := m.services[name] return ok diff --git a/core/supervisor/service.go b/core/supervisor/service.go index 777260ece..578001c08 100644 --- a/core/supervisor/service.go +++ b/core/supervisor/service.go @@ -2,20 +2,24 @@ package supervisor import ( "context" - "expvar" "fmt" "time" - "github.com/gofiber/fiber/v2" "github.com/pubgo/funk/errors" "github.com/pubgo/funk/log" "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/vars" - "github.com/pubgo/lava/core/debug" + "go.uber.org/atomic" ) +type serviceMetric struct { + Error atomic.String + Restart atomic.Uint32 + StartTime atomic.Time + OnlineDuration atomic.Duration +} + func NewService(name string, fn func(ctx context.Context) error) Service { - return (&serviceImpl{name: name, fn: fn}).initMetric() + return &serviceImpl{name: name, fn: fn, metric: &serviceMetric{}} } var _ Service = &serviceImpl{} @@ -25,33 +29,18 @@ type serviceImpl struct { err error fn func(ctx context.Context) error - metric *expvar.Map + metric *serviceMetric } -func (s *serviceImpl) Metrics() *expvar.Map { - return s.metric -} - -func (s *serviceImpl) initMetric() *serviceImpl { - metric := vars.Map(fmt.Sprintf("supervisor-%s", s.name)) - metric.Set(s.name, vars.Any(s.String())) - metric.Set(s.name+".error", vars.Value(func() interface{} { - if s.err == nil { - return nil - } - return s.err.Error() - })) - metric.Add("restart", 0) - s.metric = metric - - debug.Route("/supervisor", func(router fiber.Router) { - router.Get("services", func(ctx *fiber.Ctx) error { - - return nil - }) - }) - - return s +func (s *serviceImpl) Metrics() *ServiceMetric { + metric := s.metric + return &ServiceMetric{ + Name: s.name, + Error: metric.Error.Load(), + Restart: metric.Restart.Load(), + StartTime: metric.StartTime.Load(), + OnlineDuration: time.Since(metric.StartTime.Load()).Truncate(time.Millisecond), + } } func (s *serviceImpl) Error() error { @@ -67,31 +56,29 @@ func (s *serviceImpl) String() string { } func (s *serviceImpl) Serve(ctx context.Context) (gErr error) { - now := time.Now() + s.metric.StartTime.Store(time.Now()) defer func() { if gErr != nil { s.err = gErr } if s.err != nil { - s.metric.Set("error", vars.Any(s.err)) + s.metric.Error.Store(s.err.Error()) } - s.metric.Set("start_time", vars.Any(now.UTC().String())) - s.metric.Set("online_duration", vars.Any(time.Since(now).String())) log.Info(ctx). Str("service", s.name). - Str("metric", s.metric.String()). + Any("metrics", s.Metrics()). Msg("stop service") }() defer recovery.Err(&gErr) s.err = nil - s.metric.Add("restart", 1) + s.metric.Restart.Add(1) log.Info(ctx).Str("service", s.name).Msg("start service") err := s.fn(ctx) if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { - return fmt.Errorf("non-context error, service=%s meta=%s err=%w", s.name, s.metric.String(), err) + return fmt.Errorf("non-context error, service=%s meta=%v err=%w", s.name, s.Metrics(), err) } return err } diff --git a/servers/https/server.go b/servers/https/server.go index be0f2a312..02112a047 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -202,18 +202,15 @@ func (s *serviceImpl) start(ctx context.Context) { httpLn := assert.Must1(net.Listen("tcp", fmt.Sprintf(":%d", running.HttpPort))) logutil.OkOrFailed(s.log, "service start", func() error { async.GoDelay(func() error { - s.log.Info().Msg("[http-server] Server Starting") - logutil.LogOrErr(s.log, "[http-server] Server Stop", func() error { - defer recovery.Exit() + defer recovery.Exit() - err := s.httpServer.Listener(httpLn) - if netutil.IsErrServerClosed(err) { - return nil - } + s.log.Info().Msg("[http-server] Server Starting") + err := s.httpServer.Listener(httpLn) + if netutil.IsErrServerClosed(err) { + return nil + } - return err - }) - return nil + return err }) return nil }) From 003576daa3c8988aa414f58253bbb46c93fb924c Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 25 Aug 2025 22:47:45 +0800 Subject: [PATCH 113/142] fix: barry quick fix, 2025-08-25 22:47:45 --- core/scheduler/aaa.go | 5 +---- core/scheduler/job.go | 5 ----- core/scheduler/scheduler.go | 3 --- 3 files changed, 1 insertion(+), 12 deletions(-) diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index 6013a53e9..0b3c73185 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -2,7 +2,6 @@ package scheduler import ( "context" - "expvar" stdLog "log" "os" "time" @@ -96,9 +95,7 @@ type jobTask struct { runs atomic.Uint64 jobKey *quartz.JobKey status Status - - metric *expvar.Map - + result result.Result[[]byte] } diff --git a/core/scheduler/job.go b/core/scheduler/job.go index 77f477f9d..d8345632c 100644 --- a/core/scheduler/job.go +++ b/core/scheduler/job.go @@ -3,7 +3,6 @@ package scheduler import ( "context" "fmt" - "github.com/pubgo/funk/vars" "time" "github.com/pubgo/funk/generic" @@ -30,8 +29,6 @@ func (t *namedJob) Execute(ctx context.Context) (gErr error) { defer func() { cost := float64(time.Since(start).Milliseconds()) t.s.metric.Tagged(metrics.Tags{"job_name": name}).Gauge("job_cost_ms").Update(cost) - t.task.metric.Set("job_cost_ms", vars.Any(cost)) - t.task.metric.Set("runs", vars.Any(t.task.runs.Load())) logger := generic.Ternary(gErr == nil, t.log.Info(), t.log.Err(gErr)) logger.Func(func(e *zerolog.Event) { @@ -55,8 +52,6 @@ func (t *namedJob) Execute(ctx context.Context) (gErr error) { NextExecTime: t.task.trigger.next, } - t.task.metric.Set("metadata", vars.Any(metadata)) - if t.task.trigger.err != nil { return fmt.Errorf("schedule job(%s) trigger error: %w", name, t.task.trigger.err) } diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index 817d19937..3edd4f031 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -7,7 +7,6 @@ import ( "github.com/pubgo/funk/log" "github.com/pubgo/funk/v2/result" - "github.com/pubgo/funk/vars" "github.com/pubgo/lava/core/metrics" "github.com/reugn/go-quartz/quartz" "github.com/rs/zerolog" @@ -66,8 +65,6 @@ func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { return result.Errorf("job %s already exists", name) } - task.metric = vars.Map(fmt.Sprintf("scheduler-%s", name)) - result.WrapFn(func() (JobExecutor, error) { executor := s.jobExecutors[spec.Executor] if executor == nil { From 7266e84f3a1ed8aaf7f48801523e0ccb164f4631 Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 26 Aug 2025 21:44:50 +0800 Subject: [PATCH 114/142] fix: barry quick fix, 2025-08-26 21:44:50 --- core/scheduler/builder.go | 42 +++++++++++++++-------------- core/scheduler/config.go | 14 +++++----- core/scheduler/scheduler.go | 28 +++++++++---------- core/scheduler/util.go | 11 ++++---- go.mod | 2 +- go.sum | 4 +-- internal/examples/scheduler/main.go | 2 +- 7 files changed, 53 insertions(+), 50 deletions(-) diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index 655a559d4..23bb657ad 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -41,32 +41,34 @@ func NewService(params Params) (supervisor.Service, error) { } func New(m lifecycle.Lifecycle, logger log.Logger, metric metrics.Metric, configs []*Config, routers []JobRegister, executors []JobExecutor) (_ *Scheduler, gErr error) { - configMap := createConfig(configs). - InspectErr(func(err error) { - log.Err(err).Any("configs", configs).Msg("failed to create config") - }). - Unwrap(&gErr) - if gErr != nil { + configMap := createConfig(configs) + configMap.InspectErr(func(err error) { + log.Err(err).Any("configs", configs).Msg("failed to create config") + }) + if configMap.Catch(&gErr) { return } - scheduler := result.Wrap(quartz.NewStdScheduler(quartz.WithLogger(qlog.NewSimpleLogger(schedulerLog, qlog.LevelInfo)))). - InspectErr(func(err error) { - log.Err(err).Msg("failed to create scheduler") - }). - Unwrap(&gErr) - if gErr != nil { + scheduler := result.WrapFn(func() (quartz.Scheduler, error) { + return quartz.NewStdScheduler( + quartz.WithLogger(qlog.NewSimpleLogger(schedulerLog, qlog.LevelInfo)), + quartz.WithJobMetadata(), + ) + }) + scheduler.InspectErr(func(err error) { + log.Err(err).Msg("failed to create scheduler") + }) + if scheduler.Catch(&gErr) { return } jobExecutors := make(map[string]JobExecutor) for _, executor := range executors { - regJobExecutor(jobExecutors, executor). - InspectErr(func(err error) { - log.Err(err).Msg("failed to register job executor") - }). - Catch(&gErr) - if gErr != nil { + regRes := regJobExecutor(jobExecutors, executor) + regRes.InspectErr(func(err error) { + log.Err(err).Msg("failed to register job executor") + }) + if regRes.Catch(&gErr) { return } } @@ -74,8 +76,8 @@ func New(m lifecycle.Lifecycle, logger log.Logger, metric metrics.Metric, config ctx, cancel := context.WithCancel(context.Background()) quart := &Scheduler{ metric: metric, - configMap: configMap, - scheduler: scheduler, + configMap: configMap.Must(), + scheduler: scheduler.Must(), log: logger.WithName(Name), ctx: ctx, cancel: cancel, diff --git a/core/scheduler/config.go b/core/scheduler/config.go index c47a574a0..7d923877d 100644 --- a/core/scheduler/config.go +++ b/core/scheduler/config.go @@ -71,12 +71,14 @@ func initAndMergeConfig(name string, jobConfigs ...*JobConfig) (r result.Result[ cfg.Location = jobConfig.Location } - cfg.location = result.Wrap(time.LoadLocation(lo.FromPtr(cfg.Location))). - InspectErr(func(err error) { - log.Err(err).Msgf("failed to parse time location:%s", lo.FromPtr(cfg.Location)) - }). - UnwrapErr(&r) - if r.IsErr() { + locationRes := result.Wrap(time.LoadLocation(lo.FromPtr(cfg.Location))) + locationRes.InspectErr(func(err error) { + log.Err(err).Msgf("failed to parse time location:%s", lo.FromPtr(cfg.Location)) + }) + locationRes.Inspect(func(location *time.Location) { + cfg.location = location + }) + if locationRes.CatchErr(&r) { return } } diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index 3edd4f031..51ecad61d 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -57,30 +57,29 @@ func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { defer result.RecoveryErr(&r) if spec.Name == "" { - return result.Errorf("job name is empty") + return r.WithErrorf("job name is empty") } name := spec.Name if s.jobs[name] != nil { - return result.Errorf("job %s already exists", name) + return r.WithErrorf("job %s already exists", name) } - result.WrapFn(func() (JobExecutor, error) { + executorRes := result.WrapFn(func() (JobExecutor, error) { executor := s.jobExecutors[spec.Executor] if executor == nil { executor = fn } if executor == nil { - return nil, fmt.Errorf("schedule job(%s) executor is nil", name) + return nil, fmt.Errorf("schedule job executor is nil, name:%s", name) } return executor, nil - }). - Inspect(func(executor JobExecutor) { - task.executor = executor - }). - UnwrapErr(&r) - if r.IsErr() { + }) + executorRes.Inspect(func(executor JobExecutor) { + task.executor = executor + }) + if executorRes.CatchErr(&r) { return } @@ -96,22 +95,21 @@ func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { return } - trigger := getTrigger(spec, config.location). + triggerRes := getTrigger(spec, config.location). InspectErr(func(err error) { log.Err(err).Msgf("failed to get schedule job(%s) trigger", name) }). Inspect(func(trigger *triggerImpl) { task.trigger = trigger - }). - UnwrapErr(&r) - if r.IsErr() { + }) + if triggerRes.CatchErr(&r) { return } jobOpt := config.ToJobDetailOptions() job := &namedJob{s: s, task: &task, log: s.log} jobDetail := quartz.NewJobDetailWithOptions(job, parseJobKey(name), jobOpt) - if result.CatchErr(&r, s.scheduler.ScheduleJob(jobDetail, trigger)) { + if result.CatchErr(&r, s.scheduler.ScheduleJob(jobDetail, task.trigger)) { return } diff --git a/core/scheduler/util.go b/core/scheduler/util.go index 228ba35c6..e2078a062 100644 --- a/core/scheduler/util.go +++ b/core/scheduler/util.go @@ -3,22 +3,22 @@ package scheduler import ( "strings" "time" - + "github.com/pubgo/funk/v2/result" "github.com/reugn/go-quartz/quartz" ) func regJobExecutor(jobExecutors map[string]JobExecutor, executor JobExecutor) (r result.Error) { if executor == nil { - return result.Errorf("executor is nil") + return r.WithErrorf("executor is nil") } if executor.Name() == "" { - return result.Errorf("executor name is empty") + return r.WithErrorf("executor name is empty") } if jobExecutors[executor.Name()] != nil { - return result.Errorf("[job executor] %s already exists", executor.Name()) + return r.WithErrorf("[job executor] %s already exists", executor.Name()) } jobExecutors[executor.Name()] = executor @@ -35,6 +35,7 @@ func getTrigger(j JobSpec, location *time.Location) (r result.Result[*triggerImp if err != nil { return r.WithErrorf("cron-expr:%s, err:%s", j.Cron.Expr, err.Error()) } + return r.WithValue(newTrigger(trigger)) } @@ -42,7 +43,7 @@ func getTrigger(j JobSpec, location *time.Location) (r result.Result[*triggerImp return r.WithValue(newTrigger(quartz.NewSimpleTrigger(j.Ticker.Dur))) } - return r.WithErrorf("please init Once, Cron or Ticker") + return r.WithErrorf("please init spec.Once, spec.Cron or spec.Ticker, spec:%#v", j) } func parseJobKey(name string) *quartz.JobKey { diff --git a/go.mod b/go.mod index 8c5277a8b..a05f12039 100644 --- a/go.mod +++ b/go.mod @@ -54,7 +54,7 @@ require ( github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.65.0 github.com/pubgo/dix v0.3.21 - github.com/pubgo/funk v0.5.69-alpha.11 + github.com/pubgo/funk v0.5.69-alpha.12 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.6.0 github.com/rs/zerolog v1.34.0 diff --git a/go.sum b/go.sum index 25c15b07e..4467b5016 100644 --- a/go.sum +++ b/go.sum @@ -506,8 +506,8 @@ github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7D github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/pubgo/dix v0.3.21 h1:jtriLYT6srKrxv0KRwic1no0d9ZTMtLx6r3JJxQ5Jvw= github.com/pubgo/dix v0.3.21/go.mod h1:5qHJ7ycvBVw1AUjgYMEsobzx1tggiRs+spgzd4Jglb4= -github.com/pubgo/funk v0.5.69-alpha.11 h1:4LjzocKHu2zYjC0B2sNgtb/7kSZy1s3y1hd3BbN0FHM= -github.com/pubgo/funk v0.5.69-alpha.11/go.mod h1:mWqaZftfwVoZk/qhLqb/S3iCa1LR7QKIMh3HsABCIjo= +github.com/pubgo/funk v0.5.69-alpha.12 h1:McVMxwFIWp6FNWq605Th02VKdyFR398eEYp1S1DWFj8= +github.com/pubgo/funk v0.5.69-alpha.12/go.mod h1:mWqaZftfwVoZk/qhLqb/S3iCa1LR7QKIMh3HsABCIjo= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/pubgo/protobuild v0.0.21 h1:QSwh92QxsD6Mv7kQlowzE7fxtcOm1eMWmgADsD803Js= diff --git a/internal/examples/scheduler/main.go b/internal/examples/scheduler/main.go index 6f6adc345..a0f8dd8bb 100644 --- a/internal/examples/scheduler/main.go +++ b/internal/examples/scheduler/main.go @@ -32,7 +32,7 @@ type schedulerExample struct { } func (s schedulerExample) RegisterSchedulerJob(reg scheduler.JobRegistry) { - reg.Once("once_task", time.Second*12, func(ctx context.Context, name string, metadata *scheduler.JobMetadata) result.Result[[]byte] { + reg.Once("once_task", time.Second*10, func(ctx context.Context, name string, metadata *scheduler.JobMetadata) result.Result[[]byte] { fmt.Printf("exec once task: %s: %#v\n", name, metadata) time.Sleep(time.Second * 5) return result.OK([]byte("once")) From 04106178e2803c5e34e80c5a253d55bd3f2e8204 Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 26 Aug 2025 22:31:40 +0800 Subject: [PATCH 115/142] fix: barry quick fix, 2025-08-26 22:31:40 --- core/scheduler/job.go | 16 +++++++++++++--- go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/core/scheduler/job.go b/core/scheduler/job.go index d8345632c..7eab59459 100644 --- a/core/scheduler/job.go +++ b/core/scheduler/job.go @@ -2,6 +2,7 @@ package scheduler import ( "context" + "errors" "fmt" "time" @@ -53,7 +54,9 @@ func (t *namedJob) Execute(ctx context.Context) (gErr error) { } if t.task.trigger.err != nil { - return fmt.Errorf("schedule job(%s) trigger error: %w", name, t.task.trigger.err) + if !(t.task.spec.Once != nil && errors.Is(t.task.trigger.err, quartz.ErrTriggerExpired)) { + return fmt.Errorf("schedule job(%s) trigger error: %w", name, t.task.trigger.err) + } } return try.Try(func() error { @@ -79,9 +82,16 @@ type triggerImpl struct { } func (t *triggerImpl) NextFireTime(prev int64) (next int64, err error) { - t.prev = prev / 1000_000_000 + defer func() { + t.err = err + if err != nil { + return + } + + t.prev = prev / 1000_000_000 + t.next = next / 1000_000_000 + }() - defer func() { t.next, t.err = next/1000_000_000, err }() return t.trigger.NextFireTime(prev) } diff --git a/go.mod b/go.mod index a05f12039..7c1ba38be 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/olekukonko/tablewriter v1.0.8 github.com/pkg/errors v0.9.1 github.com/pubgo/opendoc v0.0.5 - github.com/reugn/go-quartz v0.15.0 + github.com/reugn/go-quartz v0.15.1 github.com/vmihailenco/msgpack/v5 v5.4.1 go.opentelemetry.io/otel v1.37.0 go.opentelemetry.io/otel/metric v1.37.0 diff --git a/go.sum b/go.sum index 4467b5016..93df81995 100644 --- a/go.sum +++ b/go.sum @@ -522,8 +522,8 @@ github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= -github.com/reugn/go-quartz v0.15.0 h1:Zv4+p5jBIBDtnGK6HC08ecSSWuOYPngeLivApqBiwjc= -github.com/reugn/go-quartz v0.15.0/go.mod h1:00DVnBKq2Fxag/HlR9mGXjmHNlMFQ1n/LNM+Fn0jUaE= +github.com/reugn/go-quartz v0.15.1 h1:8hMtC+ERa9G5tiL9fiuBpPreId+Tu1Xt2pkXVeTZAy0= +github.com/reugn/go-quartz v0.15.1/go.mod h1:00DVnBKq2Fxag/HlR9mGXjmHNlMFQ1n/LNM+Fn0jUaE= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= From b60aed5c1f91b89e4f4ce4cfaa032c17be269d63 Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 26 Aug 2025 23:40:26 +0800 Subject: [PATCH 116/142] fix: barry quick fix, 2025-08-26 23:40:26 --- cmds/schedulercmd/cmd.go | 6 +- core/scheduler/builder.go | 15 +++- core/scheduler/schedulerpages/debug.go | 19 +++++ core/scheduler/schedulerpages/html.go | 102 +++++++++++++++++++++++++ go.mod | 2 + go.sum | 6 ++ 6 files changed, 146 insertions(+), 4 deletions(-) create mode 100644 core/scheduler/schedulerpages/debug.go create mode 100644 core/scheduler/schedulerpages/html.go diff --git a/cmds/schedulercmd/cmd.go b/cmds/schedulercmd/cmd.go index 168efe4fb..95894bf31 100644 --- a/cmds/schedulercmd/cmd.go +++ b/cmds/schedulercmd/cmd.go @@ -6,13 +6,14 @@ import ( "github.com/pubgo/dix" "github.com/pubgo/funk/assert" "github.com/pubgo/funk/version" - "github.com/pubgo/lava/servers/https" "github.com/urfave/cli/v3" "github.com/pubgo/lava/core/lifecycle" "github.com/pubgo/lava/core/scheduler" + "github.com/pubgo/lava/core/scheduler/schedulerpages" "github.com/pubgo/lava/core/supervisor" "github.com/pubgo/lava/pkg/cmdutil" + "github.com/pubgo/lava/servers/https" ) func New(di *dix.Dix) *cli.Command { @@ -25,8 +26,11 @@ func New(di *dix.Dix) *cli.Command { params := dix.Inject(di, new(struct { LC lifecycle.Getter Services []supervisor.Service + Manager scheduler.JobManager })) + schedulerpages.Init(params.Manager) + manager := supervisor.Default(params.LC) for _, svc := range params.Services { assert.Exit(manager.Add(svc)) diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index 23bb657ad..90a7d9204 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -25,7 +25,12 @@ type Params struct { Executors []JobExecutor } -func NewService(params Params) (supervisor.Service, error) { +type ResponseParams struct { + Service supervisor.Service + Manager JobManager +} + +func NewService(params Params) (ResponseParams, error) { s, err := New( params.M, params.Log, @@ -35,9 +40,13 @@ func NewService(params Params) (supervisor.Service, error) { params.Executors, ) if err != nil { - return nil, err + return ResponseParams{}, err } - return supervisor.NewService(Name, s.Serve), err + + return ResponseParams{ + Service: supervisor.NewService(Name, s.Serve), + Manager: s, + }, nil } func New(m lifecycle.Lifecycle, logger log.Logger, metric metrics.Metric, configs []*Config, routers []JobRegister, executors []JobExecutor) (_ *Scheduler, gErr error) { diff --git a/core/scheduler/schedulerpages/debug.go b/core/scheduler/schedulerpages/debug.go new file mode 100644 index 000000000..9c2d6e47a --- /dev/null +++ b/core/scheduler/schedulerpages/debug.go @@ -0,0 +1,19 @@ +package schedulerpages + +import ( + "time" + + "github.com/gofiber/fiber/v2" + "github.com/pubgo/lava/core/debug" + "github.com/pubgo/lava/core/scheduler" +) + +func Init(scheduler scheduler.JobManager) { + debug.Route("/scheduler", func(router fiber.Router) { + router.Get("list", func(ctx *fiber.Ctx) error { + scheduler.ListJobs() + ctx.Response().Header.SetContentType(fiber.MIMETextHTMLCharsetUTF8) + return Page(time.Now()).Render(ctx) + }) + }) +} diff --git a/core/scheduler/schedulerpages/html.go b/core/scheduler/schedulerpages/html.go new file mode 100644 index 000000000..c796183ab --- /dev/null +++ b/core/scheduler/schedulerpages/html.go @@ -0,0 +1,102 @@ +package schedulerpages + +import ( + "errors" + "log" + "net/http" + "time" + + "github.com/pubgo/lava/core/scheduler" + . "maragu.dev/gomponents" + . "maragu.dev/gomponents/components" + . "maragu.dev/gomponents/html" + . "maragu.dev/gomponents/http" + + hx "maragu.dev/gomponents-htmx" + hxhttp "maragu.dev/gomponents-htmx/http" +) + +func ListSchedulers(schedulers []*scheduler.Job) Node { + return Div( + Class("overflow-x-auto"), + Table( + Class("table"), + THead( + Tr( + Th(), + Th(Text("Name")), + Th(Text("Job")), + Th(Text("Favorite Color")), + ), + ), + TBody( + Tr( + Th(Text("1")), + Th(Text("Cy Ganderton")), + Th(Text("Quality Control Specialist")), + Th(Text("Blue")), + ), + ), + ), + ) +} + +func start() error { + now := time.Now() + mux := http.NewServeMux() + mux.HandleFunc("/", Adapt(func(w http.ResponseWriter, r *http.Request) (Node, error) { + if r.Method == http.MethodPost && hxhttp.IsBoosted(r.Header) { + now = time.Now() + + hxhttp.SetPushURL(w.Header(), "/?time="+now.Format(timeOnly)) + + return partial(now), nil + } + return Page(now), nil + })) + + log.Println("Starting on http://localhost:8080") + if err := http.ListenAndServe("localhost:8080", mux); err != nil && !errors.Is(err, http.ErrServerClosed) { + return err + } + return nil +} + +const timeOnly = "15:04:05" + +func Page(now time.Time) Node { + return HTML5(HTML5Props{ + Title: now.Format(timeOnly), + + Head: []Node{ + Link(Href("https://cdn.jsdelivr.net/npm/daisyui@5"), Rel("stylesheet"), Type("text/css")), + Script(Src("https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4")), + Script(Src("https://cdn.tailwindcss.com?plugins=forms,typography")), + Script(Src("https://unpkg.com/htmx.org")), + }, + + Body: []Node{ + Div(Class("max-w-7xl mx-auto p-4 prose lg:prose-lg xl:prose-xl"), + H1(Text(`gomponents + HTMX`)), + + P(Textf(`Time at last full page refresh was %v.`, now.Format(timeOnly))), + + partial(now), + + Form(Method("post"), Action("/"), + hx.Boost("true"), hx.Target("#partial"), hx.Swap("outerHTML"), + + Button(Type("submit"), Text(`Update time`), + Class("rounded-md border border-transparent bg-orange-600 px-4 py-2 text-sm font-medium text-white shadow-sm hover:bg-orange-700 focus:outline-none focus:ring-2 focus:ring-orange-500 focus:ring-offset-2"), + ), + ), + ), + + ListSchedulers(nil), + }, + }) +} + +func partial(now time.Time) Node { + return P(ID("partial"), Textf(`Time was last updated at %v.`, now.Format(timeOnly))) +} diff --git a/go.mod b/go.mod index 7c1ba38be..f2ed9d7ae 100644 --- a/go.mod +++ b/go.mod @@ -78,6 +78,8 @@ require ( golang.org/x/vuln v1.1.3 google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 gopkg.in/yaml.v3 v3.0.1 + maragu.dev/gomponents v1.2.0 + maragu.dev/gomponents-htmx v0.6.1 ) require ( diff --git a/go.sum b/go.sum index 93df81995..8b25e9821 100644 --- a/go.sum +++ b/go.sum @@ -917,6 +917,12 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.5.1 h1:4bH5o3b5ZULQ4UrBmP+63W9r7qIkqJClEA9ko5YKx+I= honnef.co/go/tools v0.5.1/go.mod h1:e9irvo83WDG9/irijV44wr3tbhcFeRnfpVlRqVwpzMs= +maragu.dev/gomponents v1.2.0 h1:H7/N5htz1GCnhu0HB1GasluWeU2rJZOYztVEyN61iTc= +maragu.dev/gomponents v1.2.0/go.mod h1:oEDahza2gZoXDoDHhw8jBNgH+3UR5ni7Ur648HORydM= +maragu.dev/gomponents-htmx v0.6.1 h1:vXXOkvqEDKYxSwD1UwqmVp12YwFSuM6u8lsRn7Evyng= +maragu.dev/gomponents-htmx v0.6.1/go.mod h1:51nXX+dTGff3usM7AJvbeOcQjzjpSycod+60CYeEP/M= +maragu.dev/is v0.2.0 h1:poeuVEA5GG3vrDpGmzo2KjWtIMZmqUyvGnOB0/pemig= +maragu.dev/is v0.2.0/go.mod h1:bviaM5S0fBshCw7wuumFGTju/izopZ/Yvq4g7Klc7y8= mvdan.cc/gofumpt v0.7.0 h1:bg91ttqXmi9y2xawvkuMXyvAA/1ZGJqYAEGjXuP0JXU= mvdan.cc/gofumpt v0.7.0/go.mod h1:txVFJy/Sc/mvaycET54pV8SW8gWxTlUuGHVEcncmNUo= mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f h1:lMpcwN6GxNbWtbpI1+xzFLSW8XzX0u72NttUGVFjO3U= From 1b3c91418d04c491ded385af5b1793dc844193c7 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 27 Aug 2025 14:41:01 +0800 Subject: [PATCH 117/142] fix: barry@feat/supervisor, 2025-08-27 14:41:01 --- clients/grpcc/aaa.go | 2 +- clients/grpcc/client.go | 6 +- clients/grpcc/grpccconfig/config.go | 2 +- .../grpcc/grpccresolver/discoverybuilder.go | 8 +-- clients/grpcc/middleware.go | 10 ++-- clients/grpcc/request.go | 2 +- clients/grpcc/response.go | 2 +- clients/grpcc/util.go | 8 +-- clients/resty/client.go | 12 ++-- clients/resty/jar.go | 2 +- clients/resty/middleware.go | 2 +- clients/resty/util.go | 4 +- cmds/depcmd/cmd.go | 2 +- cmds/grpcservercmd/cmd.go | 8 +-- cmds/healthcmd/cmd.go | 4 +- cmds/httpservercmd/cmd.go | 8 +-- cmds/schedulercmd/cmd.go | 12 ++-- cmds/taskcmd/cmd.go | 8 +-- cmds/versioncmd/cmd.go | 2 +- core/annotation/openapi.go | 2 +- core/debug/debug/debug.go | 2 +- core/debug/debug/mux.go | 2 +- core/debug/healthy/debug.go | 4 +- core/debug/panicparse/panicparse.go | 2 +- core/debug/pprof/pprof.go | 2 +- core/debug/process/process.go | 2 +- core/debug/statsviz/main.go | 4 +- core/debug/trace/trace.go | 2 +- core/debug/vars/debug.go | 2 +- core/debug/version/version.go | 2 +- core/debug/zpags/debug.go | 2 +- core/discovery/aaa.go | 4 +- core/discovery/noop.go | 2 +- core/encoding/bytes/bytes.go | 2 +- core/encoding/json/codec.go | 2 +- core/encoding/msgpack/codec.go | 2 +- core/encoding/protobuf/codec.go | 2 +- core/encoding/protojson/codec.go | 2 +- core/lavabuilder/builder.go | 60 +++++++++---------- core/lavacontexts/context.go | 4 +- core/lifecycle/lifecyclebuilder/builder.go | 2 +- core/logging/logbuilder/builder.go | 4 +- core/logging/logext/grpclog/log.go | 2 +- core/logging/logext/stdlog/log.go | 2 +- core/metrics/drivers/prometheus/reporter.go | 4 +- core/metrics/metricbuilder/builder.go | 4 +- core/metrics/metricbuilder/vars.go | 2 +- core/pidfile/pidfilebuilder/builder.go | 4 +- core/registry/aaa.go | 2 +- core/registry/builder.go | 8 +-- core/registry/drivers/mdns/mdns.go | 4 +- core/registry/options.go | 2 +- core/scheduler/builder.go | 6 +- core/scheduler/job.go | 2 +- core/scheduler/scheduler.go | 2 +- core/scheduler/schedulerpages/debug.go | 4 +- core/scheduler/schedulerpages/html.go | 2 +- core/supervisor/manager.go | 8 +-- core/tracing/telemetry.go | 2 +- core/tracing/tracingbuilder/telemetry.go | 2 +- go.mod | 2 +- internal/examples/scheduler/main.go | 10 ++-- .../middleware_accesslog/middleware.go | 6 +- .../middleware_metric/middleware.go | 4 +- .../middleware_recovery/middleware.go | 2 +- .../middleware_serviceinfo/middleware.go | 10 ++-- pkg/gateway/aaa.go | 2 +- pkg/gateway/mux.go | 6 +- pkg/gateway/stream_http.go | 4 +- pkg/gateway/stream_proxy.go | 2 +- pkg/gateway/util.go | 4 +- pkg/gateway/wrapper.go | 2 +- pkg/grpcbuilder/config.go | 2 +- pkg/wsproxy/websocket_proxy.go | 2 +- servers/grpcs/codec.go | 2 +- servers/grpcs/config.go | 2 +- servers/grpcs/inner_server.go | 18 +++--- servers/grpcs/middleware.go | 10 ++-- servers/grpcs/request.go | 2 +- servers/grpcs/response.go | 2 +- servers/grpcs/server.go | 30 +++++----- servers/https/config.go | 2 +- servers/https/middleware.go | 2 +- servers/https/request.go | 2 +- servers/https/response.go | 2 +- servers/https/server.go | 22 +++---- servers/tasks/server.go | 6 +- 87 files changed, 220 insertions(+), 220 deletions(-) diff --git a/clients/grpcc/aaa.go b/clients/grpcc/aaa.go index 89f306fa9..7ffb1dd6e 100644 --- a/clients/grpcc/aaa.go +++ b/clients/grpcc/aaa.go @@ -3,7 +3,7 @@ package grpcc import ( "context" - "github.com/pubgo/lava/clients/grpcc/grpccconfig" + "github.com/pubgo/lava/v2/clients/grpcc/grpccconfig" "google.golang.org/grpc" ) diff --git a/clients/grpcc/client.go b/clients/grpcc/client.go index 571827aab..636212687 100644 --- a/clients/grpcc/client.go +++ b/clients/grpcc/client.go @@ -11,9 +11,9 @@ import ( "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/v2/result" "github.com/pubgo/funk/vars" - "github.com/pubgo/lava/clients/grpcc/grpccconfig" - "github.com/pubgo/lava/core/metrics" - "github.com/pubgo/lava/lava" + "github.com/pubgo/lava/v2/clients/grpcc/grpccconfig" + "github.com/pubgo/lava/v2/core/metrics" + "github.com/pubgo/lava/v2/lava" "google.golang.org/grpc" "google.golang.org/grpc/health/grpc_health_v1" "google.golang.org/grpc/resolver" diff --git a/clients/grpcc/grpccconfig/config.go b/clients/grpcc/grpccconfig/config.go index bf6d89c5d..e926e7b79 100644 --- a/clients/grpcc/grpccconfig/config.go +++ b/clients/grpcc/grpccconfig/config.go @@ -3,7 +3,7 @@ package grpccconfig import ( "time" - "github.com/pubgo/lava/clients/grpcc/grpccresolver" + "github.com/pubgo/lava/v2/clients/grpcc/grpccresolver" "google.golang.org/grpc" "google.golang.org/grpc/resolver" ) diff --git a/clients/grpcc/grpccresolver/discoverybuilder.go b/clients/grpcc/grpccresolver/discoverybuilder.go index 4f30fb7b3..a7b178452 100644 --- a/clients/grpcc/grpccresolver/discoverybuilder.go +++ b/clients/grpcc/grpccresolver/discoverybuilder.go @@ -14,10 +14,10 @@ import ( "github.com/pubgo/funk/try" "google.golang.org/grpc/resolver" - "github.com/pubgo/lava/core/discovery" - "github.com/pubgo/lava/core/service" - "github.com/pubgo/lava/internal/logutil" - "github.com/pubgo/lava/pkg/proto/lavapbv1" + "github.com/pubgo/lava/v2/core/discovery" + "github.com/pubgo/lava/v2/core/service" + "github.com/pubgo/lava/v2/internal/logutil" + "github.com/pubgo/lava/v2/pkg/proto/lavapbv1" ) func NewDiscoveryBuilder(disco discovery.Discovery) resolver.Builder { diff --git a/clients/grpcc/middleware.go b/clients/grpcc/middleware.go index 8a72581c2..9c8adecfd 100644 --- a/clients/grpcc/middleware.go +++ b/clients/grpcc/middleware.go @@ -8,11 +8,11 @@ import ( "github.com/pubgo/funk/convert" "github.com/pubgo/funk/errors" "github.com/pubgo/funk/strutil" - "github.com/pubgo/lava/clients/grpcc/grpccconfig" - "github.com/pubgo/lava/core/lavacontexts" - "github.com/pubgo/lava/lava" - "github.com/pubgo/lava/pkg/grpcutil" - "github.com/pubgo/lava/pkg/httputil" + "github.com/pubgo/lava/v2/clients/grpcc/grpccconfig" + "github.com/pubgo/lava/v2/core/lavacontexts" + "github.com/pubgo/lava/v2/lava" + "github.com/pubgo/lava/v2/pkg/grpcutil" + "github.com/pubgo/lava/v2/pkg/httputil" "github.com/rs/xid" "github.com/valyala/fasthttp" "google.golang.org/grpc" diff --git a/clients/grpcc/request.go b/clients/grpcc/request.go index 8b73d31da..01e9680eb 100644 --- a/clients/grpcc/request.go +++ b/clients/grpcc/request.go @@ -3,7 +3,7 @@ package grpcc import ( "google.golang.org/grpc" - "github.com/pubgo/lava/lava" + "github.com/pubgo/lava/v2/lava" ) var _ lava.Request = (*request)(nil) diff --git a/clients/grpcc/response.go b/clients/grpcc/response.go index fe30c2d3b..73986d8cc 100644 --- a/clients/grpcc/response.go +++ b/clients/grpcc/response.go @@ -3,7 +3,7 @@ package grpcc import ( "google.golang.org/grpc" - "github.com/pubgo/lava/lava" + "github.com/pubgo/lava/v2/lava" ) var _ lava.Response = (*response)(nil) diff --git a/clients/grpcc/util.go b/clients/grpcc/util.go index 31c4e2cfb..e05a14deb 100644 --- a/clients/grpcc/util.go +++ b/clients/grpcc/util.go @@ -6,10 +6,10 @@ import ( "github.com/pubgo/funk/errors" "github.com/pubgo/funk/log" "github.com/pubgo/funk/v2/result" - "github.com/pubgo/lava/clients/grpcc/grpccconfig" - "github.com/pubgo/lava/clients/grpcc/grpccresolver" - "github.com/pubgo/lava/core/logging/logkey" - "github.com/pubgo/lava/lava" + "github.com/pubgo/lava/v2/clients/grpcc/grpccconfig" + "github.com/pubgo/lava/v2/clients/grpcc/grpccresolver" + "github.com/pubgo/lava/v2/core/logging/logkey" + "github.com/pubgo/lava/v2/lava" "github.com/rs/zerolog" "google.golang.org/grpc" ) diff --git a/clients/resty/client.go b/clients/resty/client.go index adaa5d548..1cdef61dd 100644 --- a/clients/resty/client.go +++ b/clients/resty/client.go @@ -13,12 +13,12 @@ import ( "github.com/pubgo/funk/v2/result" "github.com/valyala/fasthttp" - "github.com/pubgo/lava/core/metrics" - "github.com/pubgo/lava/internal/middlewares/middleware_accesslog" - "github.com/pubgo/lava/internal/middlewares/middleware_metric" - "github.com/pubgo/lava/internal/middlewares/middleware_recovery" - "github.com/pubgo/lava/internal/middlewares/middleware_serviceinfo" - "github.com/pubgo/lava/lava" + "github.com/pubgo/lava/v2/core/metrics" + "github.com/pubgo/lava/v2/internal/middlewares/middleware_accesslog" + "github.com/pubgo/lava/v2/internal/middlewares/middleware_metric" + "github.com/pubgo/lava/v2/internal/middlewares/middleware_recovery" + "github.com/pubgo/lava/v2/internal/middlewares/middleware_serviceinfo" + "github.com/pubgo/lava/v2/lava" ) type Params struct { diff --git a/clients/resty/jar.go b/clients/resty/jar.go index c3d6c421a..fa2743973 100644 --- a/clients/resty/jar.go +++ b/clients/resty/jar.go @@ -11,7 +11,7 @@ import ( "github.com/pubgo/funk/log" "github.com/valyala/fasthttp" - "github.com/pubgo/lava/lava" + "github.com/pubgo/lava/v2/lava" ) func NewJar(log log.Logger) *Jar { diff --git a/clients/resty/middleware.go b/clients/resty/middleware.go index 69fefa30d..3d63afcea 100644 --- a/clients/resty/middleware.go +++ b/clients/resty/middleware.go @@ -7,7 +7,7 @@ import ( "github.com/pubgo/funk/convert" "github.com/valyala/fasthttp" - "github.com/pubgo/lava/lava" + "github.com/pubgo/lava/v2/lava" ) var _ lava.Request = (*requestImpl)(nil) diff --git a/clients/resty/util.go b/clients/resty/util.go index 5c098666e..7565a2bbc 100644 --- a/clients/resty/util.go +++ b/clients/resty/util.go @@ -20,8 +20,8 @@ import ( "github.com/valyala/fasttemplate" "golang.org/x/net/http/httpguts" - "github.com/pubgo/lava/lava" - "github.com/pubgo/lava/pkg/httputil" + "github.com/pubgo/lava/v2/lava" + "github.com/pubgo/lava/v2/pkg/httputil" ) func do(cfg *Config) lava.HandlerFunc { diff --git a/cmds/depcmd/cmd.go b/cmds/depcmd/cmd.go index e6c66ab89..5b1c695d5 100644 --- a/cmds/depcmd/cmd.go +++ b/cmds/depcmd/cmd.go @@ -14,7 +14,7 @@ import ( "github.com/pubgo/funk/version" cli "github.com/urfave/cli/v3" - "github.com/pubgo/lava/pkg/cmdutil" + "github.com/pubgo/lava/v2/pkg/cmdutil" ) func New(di *dix.Dix) *cli.Command { diff --git a/cmds/grpcservercmd/cmd.go b/cmds/grpcservercmd/cmd.go index 34d7d9f1a..797e4b86f 100644 --- a/cmds/grpcservercmd/cmd.go +++ b/cmds/grpcservercmd/cmd.go @@ -8,10 +8,10 @@ import ( "github.com/pubgo/funk/version" "github.com/urfave/cli/v3" - "github.com/pubgo/lava/core/lifecycle" - "github.com/pubgo/lava/core/supervisor" - "github.com/pubgo/lava/pkg/cmdutil" - "github.com/pubgo/lava/servers/grpcs" + "github.com/pubgo/lava/v2/core/lifecycle" + "github.com/pubgo/lava/v2/core/supervisor" + "github.com/pubgo/lava/v2/pkg/cmdutil" + "github.com/pubgo/lava/v2/servers/grpcs" ) func New(di *dix.Dix) *cli.Command { diff --git a/cmds/healthcmd/cmd.go b/cmds/healthcmd/cmd.go index 5e364d898..fcd4698f8 100644 --- a/cmds/healthcmd/cmd.go +++ b/cmds/healthcmd/cmd.go @@ -12,8 +12,8 @@ import ( "github.com/pubgo/funk/version" "github.com/urfave/cli/v3" - "github.com/pubgo/lava/pkg/cmdutil" - "github.com/pubgo/lava/pkg/netutil" + "github.com/pubgo/lava/v2/pkg/cmdutil" + "github.com/pubgo/lava/v2/pkg/netutil" ) func New() *cli.Command { diff --git a/cmds/httpservercmd/cmd.go b/cmds/httpservercmd/cmd.go index b6e335de7..a22240443 100644 --- a/cmds/httpservercmd/cmd.go +++ b/cmds/httpservercmd/cmd.go @@ -8,10 +8,10 @@ import ( "github.com/pubgo/funk/version" "github.com/urfave/cli/v3" - "github.com/pubgo/lava/core/lifecycle" - "github.com/pubgo/lava/core/supervisor" - "github.com/pubgo/lava/pkg/cmdutil" - "github.com/pubgo/lava/servers/https" + "github.com/pubgo/lava/v2/core/lifecycle" + "github.com/pubgo/lava/v2/core/supervisor" + "github.com/pubgo/lava/v2/pkg/cmdutil" + "github.com/pubgo/lava/v2/servers/https" ) func New(di *dix.Dix) *cli.Command { diff --git a/cmds/schedulercmd/cmd.go b/cmds/schedulercmd/cmd.go index 95894bf31..6e5d20f87 100644 --- a/cmds/schedulercmd/cmd.go +++ b/cmds/schedulercmd/cmd.go @@ -8,12 +8,12 @@ import ( "github.com/pubgo/funk/version" "github.com/urfave/cli/v3" - "github.com/pubgo/lava/core/lifecycle" - "github.com/pubgo/lava/core/scheduler" - "github.com/pubgo/lava/core/scheduler/schedulerpages" - "github.com/pubgo/lava/core/supervisor" - "github.com/pubgo/lava/pkg/cmdutil" - "github.com/pubgo/lava/servers/https" + "github.com/pubgo/lava/v2/core/lifecycle" + "github.com/pubgo/lava/v2/core/scheduler" + "github.com/pubgo/lava/v2/core/scheduler/schedulerpages" + "github.com/pubgo/lava/v2/core/supervisor" + "github.com/pubgo/lava/v2/pkg/cmdutil" + "github.com/pubgo/lava/v2/servers/https" ) func New(di *dix.Dix) *cli.Command { diff --git a/cmds/taskcmd/cmd.go b/cmds/taskcmd/cmd.go index 3ea57ff3f..4b98dccd8 100644 --- a/cmds/taskcmd/cmd.go +++ b/cmds/taskcmd/cmd.go @@ -8,10 +8,10 @@ import ( "github.com/pubgo/funk/version" "github.com/urfave/cli/v3" - "github.com/pubgo/lava/core/lifecycle" - "github.com/pubgo/lava/core/supervisor" - "github.com/pubgo/lava/pkg/cmdutil" - "github.com/pubgo/lava/servers/tasks" + "github.com/pubgo/lava/v2/core/lifecycle" + "github.com/pubgo/lava/v2/core/supervisor" + "github.com/pubgo/lava/v2/pkg/cmdutil" + "github.com/pubgo/lava/v2/servers/tasks" ) func New(di *dix.Dix) *cli.Command { diff --git a/cmds/versioncmd/cmd.go b/cmds/versioncmd/cmd.go index 37f08cc46..cd9623154 100644 --- a/cmds/versioncmd/cmd.go +++ b/cmds/versioncmd/cmd.go @@ -7,7 +7,7 @@ import ( "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/running" "github.com/pubgo/funk/version" - "github.com/pubgo/lava/pkg/cmdutil" + "github.com/pubgo/lava/v2/pkg/cmdutil" "github.com/urfave/cli/v3" ) diff --git a/core/annotation/openapi.go b/core/annotation/openapi.go index 1a39bc78a..0fbb75d1e 100644 --- a/core/annotation/openapi.go +++ b/core/annotation/openapi.go @@ -1,6 +1,6 @@ package annotation -import "github.com/pubgo/lava/lava" +import "github.com/pubgo/lava/v2/lava" var _ lava.Annotation = (*Openapi)(nil) diff --git a/core/debug/debug/debug.go b/core/debug/debug/debug.go index f597cd288..5e42a6e9e 100644 --- a/core/debug/debug/debug.go +++ b/core/debug/debug/debug.go @@ -8,7 +8,7 @@ import ( g "github.com/maragudk/gomponents" c "github.com/maragudk/gomponents/components" h "github.com/maragudk/gomponents/html" - "github.com/pubgo/lava/core/debug" + "github.com/pubgo/lava/v2/core/debug" ) func init() { diff --git a/core/debug/debug/mux.go b/core/debug/debug/mux.go index 4fac20b15..395ec2689 100644 --- a/core/debug/debug/mux.go +++ b/core/debug/debug/mux.go @@ -15,7 +15,7 @@ import ( "github.com/pubgo/funk/result" "github.com/pubgo/funk/running" "github.com/pubgo/funk/strutil" - "github.com/pubgo/lava/core/debug" + "github.com/pubgo/lava/v2/core/debug" "github.com/valyala/fasthttp" "gopkg.in/yaml.v3" ) diff --git a/core/debug/healthy/debug.go b/core/debug/healthy/debug.go index 8f5ca51d5..40d6b4132 100644 --- a/core/debug/healthy/debug.go +++ b/core/debug/healthy/debug.go @@ -7,8 +7,8 @@ import ( jjson "github.com/goccy/go-json" "github.com/gofiber/fiber/v2" "github.com/pubgo/funk/try" - "github.com/pubgo/lava/core/debug" - "github.com/pubgo/lava/core/healthy" + "github.com/pubgo/lava/v2/core/debug" + "github.com/pubgo/lava/v2/core/healthy" ) func init() { diff --git a/core/debug/panicparse/panicparse.go b/core/debug/panicparse/panicparse.go index a81e672ab..ef83efcac 100644 --- a/core/debug/panicparse/panicparse.go +++ b/core/debug/panicparse/panicparse.go @@ -2,7 +2,7 @@ package panicparse import ( "github.com/maruel/panicparse/v2/stack/webstack" - "github.com/pubgo/lava/core/debug" + "github.com/pubgo/lava/v2/core/debug" ) func init() { diff --git a/core/debug/pprof/pprof.go b/core/debug/pprof/pprof.go index 03c6b1e12..709ef18c0 100644 --- a/core/debug/pprof/pprof.go +++ b/core/debug/pprof/pprof.go @@ -7,7 +7,7 @@ import ( "github.com/felixge/fgprof" "github.com/gofiber/fiber/v2" - "github.com/pubgo/lava/core/debug" + "github.com/pubgo/lava/v2/core/debug" ) func init() { diff --git a/core/debug/process/process.go b/core/debug/process/process.go index c282a716a..7d2ed6ad5 100644 --- a/core/debug/process/process.go +++ b/core/debug/process/process.go @@ -9,7 +9,7 @@ import ( "github.com/pubgo/funk/generic" "github.com/pubgo/funk/result" - "github.com/pubgo/lava/core/debug" + "github.com/pubgo/lava/v2/core/debug" ) func init() { diff --git a/core/debug/statsviz/main.go b/core/debug/statsviz/main.go index e200b3d66..894954eb4 100644 --- a/core/debug/statsviz/main.go +++ b/core/debug/statsviz/main.go @@ -7,8 +7,8 @@ import ( "github.com/gofiber/fiber/v2" "github.com/pubgo/funk" "github.com/pubgo/funk/assert" - "github.com/pubgo/lava/core/debug" - "github.com/pubgo/lava/pkg/httputil" + "github.com/pubgo/lava/v2/core/debug" + "github.com/pubgo/lava/v2/pkg/httputil" ) // github.com/go-echarts/statsview diff --git a/core/debug/trace/trace.go b/core/debug/trace/trace.go index e94a6cd27..8c02555f0 100644 --- a/core/debug/trace/trace.go +++ b/core/debug/trace/trace.go @@ -4,7 +4,7 @@ import ( "github.com/gofiber/adaptor/v2" "golang.org/x/net/trace" - "github.com/pubgo/lava/core/debug" + "github.com/pubgo/lava/v2/core/debug" ) func init() { diff --git a/core/debug/vars/debug.go b/core/debug/vars/debug.go index 6fa6320b2..643dac129 100644 --- a/core/debug/vars/debug.go +++ b/core/debug/vars/debug.go @@ -10,7 +10,7 @@ import ( h "github.com/maragudk/gomponents/html" "github.com/pubgo/funk/recovery" - "github.com/pubgo/lava/core/debug" + "github.com/pubgo/lava/v2/core/debug" ) func init() { diff --git a/core/debug/version/version.go b/core/debug/version/version.go index ceaab917c..5be284e3e 100644 --- a/core/debug/version/version.go +++ b/core/debug/version/version.go @@ -10,7 +10,7 @@ import ( "github.com/pubgo/funk/assert" "github.com/pubgo/funk/running" - "github.com/pubgo/lava/core/debug" + "github.com/pubgo/lava/v2/core/debug" ) func init() { diff --git a/core/debug/zpags/debug.go b/core/debug/zpags/debug.go index e3cc52812..9c003c33c 100644 --- a/core/debug/zpags/debug.go +++ b/core/debug/zpags/debug.go @@ -2,7 +2,7 @@ package zpags import ( "github.com/gofiber/adaptor/v2" - "github.com/pubgo/lava/core/debug" + "github.com/pubgo/lava/v2/core/debug" "go.opentelemetry.io/contrib/zpages" ) diff --git a/core/discovery/aaa.go b/core/discovery/aaa.go index a5af79378..ccf35fcb1 100644 --- a/core/discovery/aaa.go +++ b/core/discovery/aaa.go @@ -5,8 +5,8 @@ import ( "time" "github.com/pubgo/funk/v2/result" - "github.com/pubgo/lava/core/service" - "github.com/pubgo/lava/pkg/proto/lavapbv1" + "github.com/pubgo/lava/v2/core/service" + "github.com/pubgo/lava/v2/pkg/proto/lavapbv1" ) type ( diff --git a/core/discovery/noop.go b/core/discovery/noop.go index 51774d320..a0dbf8c71 100644 --- a/core/discovery/noop.go +++ b/core/discovery/noop.go @@ -5,7 +5,7 @@ import ( "github.com/pubgo/funk/v2/result" - "github.com/pubgo/lava/core/service" + "github.com/pubgo/lava/v2/core/service" ) func NewNoopDiscovery() Discovery { diff --git a/core/encoding/bytes/bytes.go b/core/encoding/bytes/bytes.go index a7bb2aefa..eb3f482ed 100644 --- a/core/encoding/bytes/bytes.go +++ b/core/encoding/bytes/bytes.go @@ -3,7 +3,7 @@ package bytes import ( "fmt" - "github.com/pubgo/lava/core/encoding" + "github.com/pubgo/lava/v2/core/encoding" ) func init() { diff --git a/core/encoding/json/codec.go b/core/encoding/json/codec.go index 7854340fd..ab6e8092f 100644 --- a/core/encoding/json/codec.go +++ b/core/encoding/json/codec.go @@ -2,7 +2,7 @@ package json import ( json "github.com/json-iterator/go" - "github.com/pubgo/lava/core/encoding" + "github.com/pubgo/lava/v2/core/encoding" ) var ( diff --git a/core/encoding/msgpack/codec.go b/core/encoding/msgpack/codec.go index 9b2fd4ab2..ddc05ad54 100644 --- a/core/encoding/msgpack/codec.go +++ b/core/encoding/msgpack/codec.go @@ -1,7 +1,7 @@ package msgpack import ( - "github.com/pubgo/lava/core/encoding" + "github.com/pubgo/lava/v2/core/encoding" msgpack "github.com/vmihailenco/msgpack/v5" ) diff --git a/core/encoding/protobuf/codec.go b/core/encoding/protobuf/codec.go index 3193a1f45..ad444ffd5 100644 --- a/core/encoding/protobuf/codec.go +++ b/core/encoding/protobuf/codec.go @@ -3,7 +3,7 @@ package protobuf import ( "fmt" - "github.com/pubgo/lava/core/encoding" + "github.com/pubgo/lava/v2/core/encoding" "google.golang.org/protobuf/proto" pb "google.golang.org/protobuf/proto" diff --git a/core/encoding/protojson/codec.go b/core/encoding/protojson/codec.go index 5560332f5..3be84fd62 100644 --- a/core/encoding/protojson/codec.go +++ b/core/encoding/protojson/codec.go @@ -4,7 +4,7 @@ import ( "bytes" "encoding/json" - "github.com/pubgo/lava/core/encoding" + "github.com/pubgo/lava/v2/core/encoding" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" diff --git a/core/lavabuilder/builder.go b/core/lavabuilder/builder.go index eace7b8bf..5ad03162d 100644 --- a/core/lavabuilder/builder.go +++ b/core/lavabuilder/builder.go @@ -11,43 +11,43 @@ import ( "github.com/pubgo/funk/version" cli "github.com/urfave/cli/v3" - "github.com/pubgo/lava/clients/grpcc/grpccresolver" - "github.com/pubgo/lava/cmds/depcmd" - "github.com/pubgo/lava/cmds/grpcservercmd" - "github.com/pubgo/lava/cmds/healthcmd" - "github.com/pubgo/lava/cmds/httpservercmd" - "github.com/pubgo/lava/cmds/schedulercmd" - "github.com/pubgo/lava/cmds/versioncmd" - "github.com/pubgo/lava/core/discovery" - "github.com/pubgo/lava/core/flags" - "github.com/pubgo/lava/core/lifecycle/lifecyclebuilder" - "github.com/pubgo/lava/core/logging/logbuilder" - "github.com/pubgo/lava/core/metrics/metricbuilder" - "github.com/pubgo/lava/core/scheduler" - "github.com/pubgo/lava/core/signal" - "github.com/pubgo/lava/internal/middlewares/middleware_accesslog" - "github.com/pubgo/lava/internal/middlewares/middleware_metric" - "github.com/pubgo/lava/pkg/cmdutil" + "github.com/pubgo/lava/v2/clients/grpcc/grpccresolver" + "github.com/pubgo/lava/v2/cmds/depcmd" + "github.com/pubgo/lava/v2/cmds/grpcservercmd" + "github.com/pubgo/lava/v2/cmds/healthcmd" + "github.com/pubgo/lava/v2/cmds/httpservercmd" + "github.com/pubgo/lava/v2/cmds/schedulercmd" + "github.com/pubgo/lava/v2/cmds/versioncmd" + "github.com/pubgo/lava/v2/core/discovery" + "github.com/pubgo/lava/v2/core/flags" + "github.com/pubgo/lava/v2/core/lifecycle/lifecyclebuilder" + "github.com/pubgo/lava/v2/core/logging/logbuilder" + "github.com/pubgo/lava/v2/core/metrics/metricbuilder" + "github.com/pubgo/lava/v2/core/scheduler" + "github.com/pubgo/lava/v2/core/signal" + "github.com/pubgo/lava/v2/internal/middlewares/middleware_accesslog" + "github.com/pubgo/lava/v2/internal/middlewares/middleware_metric" + "github.com/pubgo/lava/v2/pkg/cmdutil" - _ "github.com/pubgo/lava/core/debug/debug" - //_ "github.com/pubgo/lava/core/debug/gops" - _ "github.com/pubgo/lava/core/debug/pprof" - _ "github.com/pubgo/lava/core/debug/process" - _ "github.com/pubgo/lava/core/debug/statsviz" - _ "github.com/pubgo/lava/core/debug/trace" - _ "github.com/pubgo/lava/core/debug/vars" - _ "github.com/pubgo/lava/core/debug/version" + _ "github.com/pubgo/lava/v2/core/debug/debug" + //_ "github.com/pubgo/lava/v2/core/debug/gops" + _ "github.com/pubgo/lava/v2/core/debug/pprof" + _ "github.com/pubgo/lava/v2/core/debug/process" + _ "github.com/pubgo/lava/v2/core/debug/statsviz" + _ "github.com/pubgo/lava/v2/core/debug/trace" + _ "github.com/pubgo/lava/v2/core/debug/vars" + _ "github.com/pubgo/lava/v2/core/debug/version" // metric - _ "github.com/pubgo/lava/core/metrics/drivers/prometheus" + _ "github.com/pubgo/lava/v2/core/metrics/drivers/prometheus" // encoding - _ "github.com/pubgo/lava/core/encoding/protobuf" - _ "github.com/pubgo/lava/core/encoding/protojson" + _ "github.com/pubgo/lava/v2/core/encoding/protobuf" + _ "github.com/pubgo/lava/v2/core/encoding/protojson" // logging - _ "github.com/pubgo/lava/core/logging/logext/grpclog" - _ "github.com/pubgo/lava/core/logging/logext/stdlog" + _ "github.com/pubgo/lava/v2/core/logging/logext/grpclog" + _ "github.com/pubgo/lava/v2/core/logging/logext/stdlog" _ "go.uber.org/automaxprocs" ) diff --git a/core/lavacontexts/context.go b/core/lavacontexts/context.go index 2a5b443d8..e7abfa3c4 100644 --- a/core/lavacontexts/context.go +++ b/core/lavacontexts/context.go @@ -3,8 +3,8 @@ package lavacontexts import ( "context" - "github.com/pubgo/lava/lava" - "github.com/pubgo/lava/pkg/proto/lavapbv1" + "github.com/pubgo/lava/v2/lava" + "github.com/pubgo/lava/v2/pkg/proto/lavapbv1" "github.com/rs/xid" ) diff --git a/core/lifecycle/lifecyclebuilder/builder.go b/core/lifecycle/lifecyclebuilder/builder.go index 2222a2a3d..2c75cbe53 100644 --- a/core/lifecycle/lifecyclebuilder/builder.go +++ b/core/lifecycle/lifecyclebuilder/builder.go @@ -1,6 +1,6 @@ package lifecyclebuilder -import "github.com/pubgo/lava/core/lifecycle" +import "github.com/pubgo/lava/v2/core/lifecycle" type Provider struct { Setter lifecycle.Lifecycle diff --git a/core/logging/logbuilder/builder.go b/core/logging/logbuilder/builder.go index 6fa4fdc17..8b389dbb2 100644 --- a/core/logging/logbuilder/builder.go +++ b/core/logging/logbuilder/builder.go @@ -10,8 +10,8 @@ import ( "github.com/pubgo/funk/result" "github.com/pubgo/funk/running" "github.com/pubgo/funk/stack" - "github.com/pubgo/lava/core/logging" - "github.com/pubgo/lava/core/logging/logkey" + "github.com/pubgo/lava/v2/core/logging" + "github.com/pubgo/lava/v2/core/logging/logkey" "github.com/rs/zerolog" ) diff --git a/core/logging/logext/grpclog/log.go b/core/logging/logext/grpclog/log.go index 99d2496c9..589687c4c 100644 --- a/core/logging/logext/grpclog/log.go +++ b/core/logging/logext/grpclog/log.go @@ -7,7 +7,7 @@ import ( "github.com/rs/zerolog" "google.golang.org/grpc/grpclog" - "github.com/pubgo/lava/core/logging" + "github.com/pubgo/lava/v2/core/logging" ) const ( diff --git a/core/logging/logext/stdlog/log.go b/core/logging/logext/stdlog/log.go index 3660ffef6..76d9ccf8e 100644 --- a/core/logging/logext/stdlog/log.go +++ b/core/logging/logext/stdlog/log.go @@ -7,7 +7,7 @@ import ( "github.com/pubgo/funk/convert" logger "github.com/pubgo/funk/log" - "github.com/pubgo/lava/core/logging" + "github.com/pubgo/lava/v2/core/logging" ) var evt = logger.NewEvent().Str("ext", "std") diff --git a/core/metrics/drivers/prometheus/reporter.go b/core/metrics/drivers/prometheus/reporter.go index d3ab55c8c..d1fe55b0b 100644 --- a/core/metrics/drivers/prometheus/reporter.go +++ b/core/metrics/drivers/prometheus/reporter.go @@ -7,8 +7,8 @@ import ( tally "github.com/uber-go/tally/v4" "github.com/uber-go/tally/v4/prometheus" - "github.com/pubgo/lava/core/debug" - "github.com/pubgo/lava/core/metrics" + "github.com/pubgo/lava/v2/core/debug" + "github.com/pubgo/lava/v2/core/metrics" ) const ( diff --git a/core/metrics/metricbuilder/builder.go b/core/metrics/metricbuilder/builder.go index 9b7f7168d..0c6dc54d6 100644 --- a/core/metrics/metricbuilder/builder.go +++ b/core/metrics/metricbuilder/builder.go @@ -11,8 +11,8 @@ import ( lo "github.com/samber/lo" "github.com/uber-go/tally/v4" - "github.com/pubgo/lava/core/lifecycle" - "github.com/pubgo/lava/core/metrics" + "github.com/pubgo/lava/v2/core/lifecycle" + "github.com/pubgo/lava/v2/core/metrics" ) func New(m lifecycle.Lifecycle, cfg *metrics.Config, log log.Logger) metrics.Metric { diff --git a/core/metrics/metricbuilder/vars.go b/core/metrics/metricbuilder/vars.go index c9ab8ae02..f9e98bb13 100644 --- a/core/metrics/metricbuilder/vars.go +++ b/core/metrics/metricbuilder/vars.go @@ -3,7 +3,7 @@ package metricbuilder import ( "github.com/pubgo/funk/typex" "github.com/pubgo/funk/vars" - "github.com/pubgo/lava/core/metrics" + "github.com/pubgo/lava/v2/core/metrics" "github.com/uber-go/tally/v4" ) diff --git a/core/pidfile/pidfilebuilder/builder.go b/core/pidfile/pidfilebuilder/builder.go index 46937aeb7..29456667c 100644 --- a/core/pidfile/pidfilebuilder/builder.go +++ b/core/pidfile/pidfilebuilder/builder.go @@ -7,8 +7,8 @@ import ( "github.com/pubgo/funk/config" "github.com/pubgo/funk/pathutil" - "github.com/pubgo/lava/core/lifecycle" - "github.com/pubgo/lava/core/pidfile" + "github.com/pubgo/lava/v2/core/lifecycle" + "github.com/pubgo/lava/v2/core/pidfile" ) func New() lifecycle.Handler { diff --git a/core/registry/aaa.go b/core/registry/aaa.go index 3f8f3ba7d..4ffe2a995 100644 --- a/core/registry/aaa.go +++ b/core/registry/aaa.go @@ -4,7 +4,7 @@ package registry import ( "context" - "github.com/pubgo/lava/core/service" + "github.com/pubgo/lava/v2/core/service" ) // Registry The registry provides an interface for service discovery diff --git a/core/registry/builder.go b/core/registry/builder.go index 2d242f418..9717299c4 100644 --- a/core/registry/builder.go +++ b/core/registry/builder.go @@ -14,10 +14,10 @@ import ( "github.com/pubgo/funk/running" "github.com/pubgo/funk/version" - "github.com/pubgo/lava/core/lifecycle" - "github.com/pubgo/lava/core/service" - "github.com/pubgo/lava/internal/logutil" - "github.com/pubgo/lava/pkg/netutil" + "github.com/pubgo/lava/v2/core/lifecycle" + "github.com/pubgo/lava/v2/core/service" + "github.com/pubgo/lava/v2/internal/logutil" + "github.com/pubgo/lava/v2/pkg/netutil" ) func New(c *Config, lifecycle lifecycle.Lifecycle, regs map[string]Registry) { diff --git a/core/registry/drivers/mdns/mdns.go b/core/registry/drivers/mdns/mdns.go index 1233938bb..cefb89626 100644 --- a/core/registry/drivers/mdns/mdns.go +++ b/core/registry/drivers/mdns/mdns.go @@ -12,8 +12,8 @@ import ( "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/typex" - "github.com/pubgo/lava/core/registry" - "github.com/pubgo/lava/core/service" + "github.com/pubgo/lava/v2/core/registry" + "github.com/pubgo/lava/v2/core/service" ) const ( diff --git a/core/registry/options.go b/core/registry/options.go index f345ea505..464a3e7fb 100644 --- a/core/registry/options.go +++ b/core/registry/options.go @@ -5,7 +5,7 @@ import ( "crypto/tls" "time" - "github.com/pubgo/lava/core/service" + "github.com/pubgo/lava/v2/core/service" ) func TTL(dur time.Duration) RegOpt { diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index 90a7d9204..81c66e3c5 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -9,9 +9,9 @@ import ( qlog "github.com/reugn/go-quartz/logger" "github.com/reugn/go-quartz/quartz" - "github.com/pubgo/lava/core/lifecycle" - "github.com/pubgo/lava/core/metrics" - "github.com/pubgo/lava/core/supervisor" + "github.com/pubgo/lava/v2/core/lifecycle" + "github.com/pubgo/lava/v2/core/metrics" + "github.com/pubgo/lava/v2/core/supervisor" ) const Name = "scheduler" diff --git a/core/scheduler/job.go b/core/scheduler/job.go index 7eab59459..cdf167185 100644 --- a/core/scheduler/job.go +++ b/core/scheduler/job.go @@ -9,7 +9,7 @@ import ( "github.com/pubgo/funk/generic" "github.com/pubgo/funk/log" "github.com/pubgo/funk/try" - "github.com/pubgo/lava/core/metrics" + "github.com/pubgo/lava/v2/core/metrics" "github.com/reugn/go-quartz/quartz" "github.com/rs/zerolog" "github.com/samber/lo" diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index 51ecad61d..82d25e853 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -7,7 +7,7 @@ import ( "github.com/pubgo/funk/log" "github.com/pubgo/funk/v2/result" - "github.com/pubgo/lava/core/metrics" + "github.com/pubgo/lava/v2/core/metrics" "github.com/reugn/go-quartz/quartz" "github.com/rs/zerolog" ) diff --git a/core/scheduler/schedulerpages/debug.go b/core/scheduler/schedulerpages/debug.go index 9c2d6e47a..6a04e5191 100644 --- a/core/scheduler/schedulerpages/debug.go +++ b/core/scheduler/schedulerpages/debug.go @@ -4,8 +4,8 @@ import ( "time" "github.com/gofiber/fiber/v2" - "github.com/pubgo/lava/core/debug" - "github.com/pubgo/lava/core/scheduler" + "github.com/pubgo/lava/v2/core/debug" + "github.com/pubgo/lava/v2/core/scheduler" ) func Init(scheduler scheduler.JobManager) { diff --git a/core/scheduler/schedulerpages/html.go b/core/scheduler/schedulerpages/html.go index c796183ab..b67765e3e 100644 --- a/core/scheduler/schedulerpages/html.go +++ b/core/scheduler/schedulerpages/html.go @@ -6,7 +6,7 @@ import ( "net/http" "time" - "github.com/pubgo/lava/core/scheduler" + "github.com/pubgo/lava/v2/core/scheduler" . "maragu.dev/gomponents" . "maragu.dev/gomponents/components" . "maragu.dev/gomponents/html" diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go index d5525ae11..d24d39163 100644 --- a/core/supervisor/manager.go +++ b/core/supervisor/manager.go @@ -15,10 +15,10 @@ import ( "github.com/pubgo/funk/stack" "github.com/thejerf/suture/v4" - "github.com/pubgo/lava/core/debug" - "github.com/pubgo/lava/core/lifecycle" - "github.com/pubgo/lava/core/signal" - "github.com/pubgo/lava/internal/logutil" + "github.com/pubgo/lava/v2/core/debug" + "github.com/pubgo/lava/v2/core/lifecycle" + "github.com/pubgo/lava/v2/core/signal" + "github.com/pubgo/lava/v2/internal/logutil" ) type serviceWrapper struct { diff --git a/core/tracing/telemetry.go b/core/tracing/telemetry.go index eefb2b5b7..82558d73c 100644 --- a/core/tracing/telemetry.go +++ b/core/tracing/telemetry.go @@ -29,7 +29,7 @@ import ( oteltrace "go.opentelemetry.io/otel/trace" "google.golang.org/grpc/encoding/gzip" - "github.com/pubgo/lava/core/lifecycle" + "github.com/pubgo/lava/v2/core/lifecycle" ) var logs = log.GetLogger("tracing") diff --git a/core/tracing/tracingbuilder/telemetry.go b/core/tracing/tracingbuilder/telemetry.go index 0435b0061..9b59360e3 100644 --- a/core/tracing/tracingbuilder/telemetry.go +++ b/core/tracing/tracingbuilder/telemetry.go @@ -11,7 +11,7 @@ import ( "github.com/pubgo/funk/assert" "github.com/pubgo/funk/log" "github.com/pubgo/funk/version" - "github.com/pubgo/lava/core/lifecycle" + "github.com/pubgo/lava/v2/core/lifecycle" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" "go.opentelemetry.io/otel/exporters/otlp/otlptrace" diff --git a/go.mod b/go.mod index f2ed9d7ae..ce9938e3b 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/pubgo/lava +module github.com/pubgo/lava/v2 go 1.24 diff --git a/internal/examples/scheduler/main.go b/internal/examples/scheduler/main.go index a0f8dd8bb..12366e615 100644 --- a/internal/examples/scheduler/main.go +++ b/internal/examples/scheduler/main.go @@ -12,11 +12,11 @@ import ( "github.com/pubgo/funk/log" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/v2/result" - "github.com/pubgo/lava/core/lavabuilder" - "github.com/pubgo/lava/core/logging" - "github.com/pubgo/lava/core/metrics" - "github.com/pubgo/lava/core/scheduler" - "github.com/pubgo/lava/servers/https" + "github.com/pubgo/lava/v2/core/lavabuilder" + "github.com/pubgo/lava/v2/core/logging" + "github.com/pubgo/lava/v2/core/metrics" + "github.com/pubgo/lava/v2/core/scheduler" + "github.com/pubgo/lava/v2/servers/https" "github.com/rs/zerolog" ) diff --git a/internal/middlewares/middleware_accesslog/middleware.go b/internal/middlewares/middleware_accesslog/middleware.go index ce93d52db..a97a71d14 100644 --- a/internal/middlewares/middleware_accesslog/middleware.go +++ b/internal/middlewares/middleware_accesslog/middleware.go @@ -12,9 +12,9 @@ import ( "github.com/pubgo/funk/log" "github.com/pubgo/funk/proto/errorpb" "github.com/pubgo/funk/version" - "github.com/pubgo/lava/core/lavacontexts" - "github.com/pubgo/lava/lava" - "github.com/pubgo/lava/pkg/grpcutil" + "github.com/pubgo/lava/v2/core/lavacontexts" + "github.com/pubgo/lava/v2/lava" + "github.com/pubgo/lava/v2/pkg/grpcutil" "github.com/rs/zerolog" "google.golang.org/grpc/codes" ) diff --git a/internal/middlewares/middleware_metric/middleware.go b/internal/middlewares/middleware_metric/middleware.go index feab56ec1..1f4d437ff 100644 --- a/internal/middlewares/middleware_metric/middleware.go +++ b/internal/middlewares/middleware_metric/middleware.go @@ -8,8 +8,8 @@ import ( "github.com/pubgo/funk/generic" "github.com/uber-go/tally/v4" - "github.com/pubgo/lava/core/metrics" - "github.com/pubgo/lava/lava" + "github.com/pubgo/lava/v2/core/metrics" + "github.com/pubgo/lava/v2/lava" ) // grpc metric diff --git a/internal/middlewares/middleware_recovery/middleware.go b/internal/middlewares/middleware_recovery/middleware.go index 9ed3c2e00..0440d1dfa 100644 --- a/internal/middlewares/middleware_recovery/middleware.go +++ b/internal/middlewares/middleware_recovery/middleware.go @@ -6,7 +6,7 @@ import ( "github.com/pubgo/funk/errors" - "github.com/pubgo/lava/lava" + "github.com/pubgo/lava/v2/lava" ) func New() lava.Middleware { diff --git a/internal/middlewares/middleware_serviceinfo/middleware.go b/internal/middlewares/middleware_serviceinfo/middleware.go index 28d8e4dcf..ecdd24ab4 100644 --- a/internal/middlewares/middleware_serviceinfo/middleware.go +++ b/internal/middlewares/middleware_serviceinfo/middleware.go @@ -7,11 +7,11 @@ import ( "github.com/pubgo/funk/running" "github.com/pubgo/funk/strutil" "github.com/pubgo/funk/version" - "github.com/pubgo/lava/core/lavacontexts" - "github.com/pubgo/lava/lava" - "github.com/pubgo/lava/pkg/grpcutil" - "github.com/pubgo/lava/pkg/httputil" - "github.com/pubgo/lava/pkg/proto/lavapbv1" + "github.com/pubgo/lava/v2/core/lavacontexts" + "github.com/pubgo/lava/v2/lava" + "github.com/pubgo/lava/v2/pkg/grpcutil" + "github.com/pubgo/lava/v2/pkg/httputil" + "github.com/pubgo/lava/v2/pkg/proto/lavapbv1" "github.com/rs/xid" ) diff --git a/pkg/gateway/aaa.go b/pkg/gateway/aaa.go index 81fe69442..0a5c59606 100644 --- a/pkg/gateway/aaa.go +++ b/pkg/gateway/aaa.go @@ -6,7 +6,7 @@ import ( "net/http" "github.com/gofiber/fiber/v2" - "github.com/pubgo/lava/pkg/gateway/routertree" + "github.com/pubgo/lava/v2/pkg/gateway/routertree" "google.golang.org/grpc" "google.golang.org/grpc/encoding" "google.golang.org/protobuf/proto" diff --git a/pkg/gateway/mux.go b/pkg/gateway/mux.go index 4a66029fc..42e705669 100644 --- a/pkg/gateway/mux.go +++ b/pkg/gateway/mux.go @@ -20,9 +20,9 @@ import ( "github.com/pubgo/funk/log" "github.com/pubgo/funk/result" "github.com/pubgo/funk/version" - "github.com/pubgo/lava/lava" - "github.com/pubgo/lava/pkg/gateway/routertree" - "github.com/pubgo/lava/pkg/httputil" + "github.com/pubgo/lava/v2/lava" + "github.com/pubgo/lava/v2/pkg/gateway/routertree" + "github.com/pubgo/lava/v2/pkg/httputil" "github.com/samber/lo" "google.golang.org/grpc" "google.golang.org/grpc/metadata" diff --git a/pkg/gateway/stream_http.go b/pkg/gateway/stream_http.go index 64bf67576..c868e35e0 100644 --- a/pkg/gateway/stream_http.go +++ b/pkg/gateway/stream_http.go @@ -10,8 +10,8 @@ import ( "github.com/gofiber/fiber/v2" "github.com/pubgo/funk/errors" "github.com/pubgo/funk/generic" - "github.com/pubgo/lava/pkg/gateway/gatewayutils" - "github.com/pubgo/lava/pkg/gateway/routertree" + "github.com/pubgo/lava/v2/pkg/gateway/gatewayutils" + "github.com/pubgo/lava/v2/pkg/gateway/routertree" "google.golang.org/grpc" "google.golang.org/grpc/metadata" "google.golang.org/protobuf/encoding/protojson" diff --git a/pkg/gateway/stream_proxy.go b/pkg/gateway/stream_proxy.go index a7b2e45f2..688867e74 100644 --- a/pkg/gateway/stream_proxy.go +++ b/pkg/gateway/stream_proxy.go @@ -8,7 +8,7 @@ import ( "io" "github.com/pubgo/funk/errors" - "github.com/pubgo/lava/internal/logutil" + "github.com/pubgo/lava/v2/internal/logutil" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" diff --git a/pkg/gateway/util.go b/pkg/gateway/util.go index b3e9d947b..dbc559f3f 100644 --- a/pkg/gateway/util.go +++ b/pkg/gateway/util.go @@ -11,8 +11,8 @@ import ( "github.com/pubgo/funk/assert" "github.com/pubgo/funk/errors" - "github.com/pubgo/lava/pkg/gateway/routertree" - "github.com/pubgo/lava/pkg/proto/lavapbv1" + "github.com/pubgo/lava/v2/pkg/gateway/routertree" + "github.com/pubgo/lava/v2/pkg/proto/lavapbv1" "google.golang.org/genproto/googleapis/api/annotations" "google.golang.org/grpc/metadata" "google.golang.org/protobuf/proto" diff --git a/pkg/gateway/wrapper.go b/pkg/gateway/wrapper.go index 5901cfa0a..062e8e114 100644 --- a/pkg/gateway/wrapper.go +++ b/pkg/gateway/wrapper.go @@ -4,7 +4,7 @@ import ( "context" "github.com/pubgo/funk/errors" - "github.com/pubgo/lava/pkg/proto/lavapbv1" + "github.com/pubgo/lava/v2/pkg/proto/lavapbv1" "google.golang.org/grpc" "google.golang.org/protobuf/reflect/protoreflect" ) diff --git a/pkg/grpcbuilder/config.go b/pkg/grpcbuilder/config.go index 18746b79b..cf4053f19 100644 --- a/pkg/grpcbuilder/config.go +++ b/pkg/grpcbuilder/config.go @@ -4,7 +4,7 @@ import ( "time" "github.com/pubgo/funk/v2/result" - "github.com/pubgo/lava/pkg/grpcutil" + "github.com/pubgo/lava/v2/pkg/grpcutil" "google.golang.org/grpc" "google.golang.org/grpc/keepalive" ) diff --git a/pkg/wsproxy/websocket_proxy.go b/pkg/wsproxy/websocket_proxy.go index 95476b0e6..182233280 100644 --- a/pkg/wsproxy/websocket_proxy.go +++ b/pkg/wsproxy/websocket_proxy.go @@ -13,7 +13,7 @@ import ( "github.com/gorilla/websocket" "github.com/pubgo/funk/log" - "github.com/pubgo/lava/internal/logutil" + "github.com/pubgo/lava/v2/internal/logutil" "golang.org/x/net/context" ) diff --git a/servers/grpcs/codec.go b/servers/grpcs/codec.go index 6372cb805..9f3af5c54 100644 --- a/servers/grpcs/codec.go +++ b/servers/grpcs/codec.go @@ -3,7 +3,7 @@ package grpcs import ( "google.golang.org/grpc/encoding" - codec "github.com/pubgo/lava/core/encoding" + codec "github.com/pubgo/lava/v2/core/encoding" ) func init() { diff --git a/servers/grpcs/config.go b/servers/grpcs/config.go index 4f090fe68..1351feabe 100644 --- a/servers/grpcs/config.go +++ b/servers/grpcs/config.go @@ -2,7 +2,7 @@ package grpcs import ( "github.com/pubgo/funk/version" - "github.com/pubgo/lava/pkg/grpcbuilder" + "github.com/pubgo/lava/v2/pkg/grpcbuilder" ) const ( diff --git a/servers/grpcs/inner_server.go b/servers/grpcs/inner_server.go index 09c762bdf..7375e78bd 100644 --- a/servers/grpcs/inner_server.go +++ b/servers/grpcs/inner_server.go @@ -8,15 +8,15 @@ import ( "github.com/pubgo/funk/assert" "github.com/pubgo/funk/errors" "github.com/pubgo/funk/log" - "github.com/pubgo/lava/clients/grpcc" - "github.com/pubgo/lava/clients/grpcc/grpccconfig" - "github.com/pubgo/lava/core/metrics" - "github.com/pubgo/lava/internal/middlewares/middleware_accesslog" - "github.com/pubgo/lava/internal/middlewares/middleware_metric" - "github.com/pubgo/lava/internal/middlewares/middleware_recovery" - "github.com/pubgo/lava/internal/middlewares/middleware_serviceinfo" - "github.com/pubgo/lava/lava" - "github.com/pubgo/lava/pkg/gateway" + "github.com/pubgo/lava/v2/clients/grpcc" + "github.com/pubgo/lava/v2/clients/grpcc/grpccconfig" + "github.com/pubgo/lava/v2/core/metrics" + "github.com/pubgo/lava/v2/internal/middlewares/middleware_accesslog" + "github.com/pubgo/lava/v2/internal/middlewares/middleware_metric" + "github.com/pubgo/lava/v2/internal/middlewares/middleware_recovery" + "github.com/pubgo/lava/v2/internal/middlewares/middleware_serviceinfo" + "github.com/pubgo/lava/v2/lava" + "github.com/pubgo/lava/v2/pkg/gateway" "google.golang.org/grpc" "google.golang.org/grpc/metadata" "google.golang.org/protobuf/reflect/protoreflect" diff --git a/servers/grpcs/middleware.go b/servers/grpcs/middleware.go index 01050e377..baba1dc56 100644 --- a/servers/grpcs/middleware.go +++ b/servers/grpcs/middleware.go @@ -13,11 +13,11 @@ import ( "github.com/pubgo/funk/proto/errorpb" "github.com/pubgo/funk/strutil" "github.com/pubgo/funk/version" - "github.com/pubgo/lava/core/lavacontexts" - "github.com/pubgo/lava/lava" - "github.com/pubgo/lava/pkg/grpcutil" - "github.com/pubgo/lava/pkg/httputil" - "github.com/pubgo/lava/pkg/proto/lavapbv1" + "github.com/pubgo/lava/v2/core/lavacontexts" + "github.com/pubgo/lava/v2/lava" + "github.com/pubgo/lava/v2/pkg/grpcutil" + "github.com/pubgo/lava/v2/pkg/httputil" + "github.com/pubgo/lava/v2/pkg/proto/lavapbv1" "github.com/rs/xid" "github.com/valyala/fasthttp" "google.golang.org/grpc" diff --git a/servers/grpcs/request.go b/servers/grpcs/request.go index 272a3a0ee..fcfa1e344 100644 --- a/servers/grpcs/request.go +++ b/servers/grpcs/request.go @@ -5,7 +5,7 @@ import ( "strings" "github.com/gofiber/fiber/v2" - "github.com/pubgo/lava/lava" + "github.com/pubgo/lava/v2/lava" "google.golang.org/grpc" ) diff --git a/servers/grpcs/response.go b/servers/grpcs/response.go index a19297d68..bd31fc0d5 100644 --- a/servers/grpcs/response.go +++ b/servers/grpcs/response.go @@ -2,7 +2,7 @@ package grpcs import ( "github.com/gofiber/fiber/v2" - "github.com/pubgo/lava/lava" + "github.com/pubgo/lava/v2/lava" "google.golang.org/grpc" ) diff --git a/servers/grpcs/server.go b/servers/grpcs/server.go index 0327b2511..3f283c660 100644 --- a/servers/grpcs/server.go +++ b/servers/grpcs/server.go @@ -27,21 +27,21 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/codes" - "github.com/pubgo/lava/clients/grpcc" - "github.com/pubgo/lava/clients/grpcc/grpccconfig" - "github.com/pubgo/lava/core/debug" - "github.com/pubgo/lava/core/lifecycle" - "github.com/pubgo/lava/core/metrics" - "github.com/pubgo/lava/core/supervisor" - "github.com/pubgo/lava/internal/consts" - "github.com/pubgo/lava/internal/logutil" - "github.com/pubgo/lava/internal/middlewares/middleware_accesslog" - "github.com/pubgo/lava/internal/middlewares/middleware_metric" - "github.com/pubgo/lava/internal/middlewares/middleware_recovery" - "github.com/pubgo/lava/internal/middlewares/middleware_serviceinfo" - "github.com/pubgo/lava/lava" - "github.com/pubgo/lava/pkg/gateway" - "github.com/pubgo/lava/pkg/httputil" + "github.com/pubgo/lava/v2/clients/grpcc" + "github.com/pubgo/lava/v2/clients/grpcc/grpccconfig" + "github.com/pubgo/lava/v2/core/debug" + "github.com/pubgo/lava/v2/core/lifecycle" + "github.com/pubgo/lava/v2/core/metrics" + "github.com/pubgo/lava/v2/core/supervisor" + "github.com/pubgo/lava/v2/internal/consts" + "github.com/pubgo/lava/v2/internal/logutil" + "github.com/pubgo/lava/v2/internal/middlewares/middleware_accesslog" + "github.com/pubgo/lava/v2/internal/middlewares/middleware_metric" + "github.com/pubgo/lava/v2/internal/middlewares/middleware_recovery" + "github.com/pubgo/lava/v2/internal/middlewares/middleware_serviceinfo" + "github.com/pubgo/lava/v2/lava" + "github.com/pubgo/lava/v2/pkg/gateway" + "github.com/pubgo/lava/v2/pkg/httputil" ) type Params struct { diff --git a/servers/https/config.go b/servers/https/config.go index 07bda48a0..cc0a694d1 100644 --- a/servers/https/config.go +++ b/servers/https/config.go @@ -2,7 +2,7 @@ package https import ( "github.com/pubgo/funk/version" - "github.com/pubgo/lava/pkg/fiberbuilder" + "github.com/pubgo/lava/v2/pkg/fiberbuilder" ) // DefaultMaxBodyBytes is the maximum allowed size of a request body in bytes. diff --git a/servers/https/middleware.go b/servers/https/middleware.go index f357393ae..27baeb753 100644 --- a/servers/https/middleware.go +++ b/servers/https/middleware.go @@ -4,7 +4,7 @@ import ( "context" "github.com/gofiber/fiber/v2" - "github.com/pubgo/lava/lava" + "github.com/pubgo/lava/v2/lava" ) func init() { diff --git a/servers/https/request.go b/servers/https/request.go index b1c5042ba..7c7b65a66 100644 --- a/servers/https/request.go +++ b/servers/https/request.go @@ -3,7 +3,7 @@ package https import ( "github.com/gofiber/fiber/v2" - "github.com/pubgo/lava/lava" + "github.com/pubgo/lava/v2/lava" ) var _ lava.Request = (*httpRequest)(nil) diff --git a/servers/https/response.go b/servers/https/response.go index a32edee0d..2cf624d8d 100644 --- a/servers/https/response.go +++ b/servers/https/response.go @@ -3,7 +3,7 @@ package https import ( "github.com/gofiber/fiber/v2" - "github.com/pubgo/lava/lava" + "github.com/pubgo/lava/v2/lava" ) var _ lava.Response = (*httpResponse)(nil) diff --git a/servers/https/server.go b/servers/https/server.go index 02112a047..b0682b523 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -22,17 +22,17 @@ import ( "github.com/rs/xid" "google.golang.org/grpc/codes" - "github.com/pubgo/lava/core/debug" - "github.com/pubgo/lava/core/lifecycle" - "github.com/pubgo/lava/core/metrics" - "github.com/pubgo/lava/core/supervisor" - "github.com/pubgo/lava/internal/logutil" - "github.com/pubgo/lava/internal/middlewares/middleware_accesslog" - "github.com/pubgo/lava/internal/middlewares/middleware_metric" - "github.com/pubgo/lava/internal/middlewares/middleware_recovery" - "github.com/pubgo/lava/internal/middlewares/middleware_serviceinfo" - "github.com/pubgo/lava/lava" - "github.com/pubgo/lava/pkg/netutil" + "github.com/pubgo/lava/v2/core/debug" + "github.com/pubgo/lava/v2/core/lifecycle" + "github.com/pubgo/lava/v2/core/metrics" + "github.com/pubgo/lava/v2/core/supervisor" + "github.com/pubgo/lava/v2/internal/logutil" + "github.com/pubgo/lava/v2/internal/middlewares/middleware_accesslog" + "github.com/pubgo/lava/v2/internal/middlewares/middleware_metric" + "github.com/pubgo/lava/v2/internal/middlewares/middleware_recovery" + "github.com/pubgo/lava/v2/internal/middlewares/middleware_serviceinfo" + "github.com/pubgo/lava/v2/lava" + "github.com/pubgo/lava/v2/pkg/netutil" ) type Params struct { diff --git a/servers/tasks/server.go b/servers/tasks/server.go index 16c020a5e..e822429de 100644 --- a/servers/tasks/server.go +++ b/servers/tasks/server.go @@ -15,9 +15,9 @@ import ( "github.com/pubgo/funk/log" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/running" - "github.com/pubgo/lava/core/debug" - "github.com/pubgo/lava/core/supervisor" - "github.com/pubgo/lava/internal/logutil" + "github.com/pubgo/lava/v2/core/debug" + "github.com/pubgo/lava/v2/core/supervisor" + "github.com/pubgo/lava/v2/internal/logutil" "google.golang.org/grpc/codes" ) From 4908a76535e015cf49d08d569f9a0da38cc0f4d8 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 27 Aug 2025 21:10:18 +0800 Subject: [PATCH 118/142] fix: barry quick fix, 2025-08-27 21:10:18 --- cmds/schedulercmd/cmd.go | 4 +- .../debug.go | 5 +- core/scheduler/schedulerdebug/html.go | 130 ++++++++++++++++++ core/scheduler/schedulerpages/html.go | 102 -------------- 4 files changed, 134 insertions(+), 107 deletions(-) rename core/scheduler/{schedulerpages => schedulerdebug}/debug.go (80%) create mode 100644 core/scheduler/schedulerdebug/html.go delete mode 100644 core/scheduler/schedulerpages/html.go diff --git a/cmds/schedulercmd/cmd.go b/cmds/schedulercmd/cmd.go index 95894bf31..462ae44b6 100644 --- a/cmds/schedulercmd/cmd.go +++ b/cmds/schedulercmd/cmd.go @@ -10,7 +10,7 @@ import ( "github.com/pubgo/lava/core/lifecycle" "github.com/pubgo/lava/core/scheduler" - "github.com/pubgo/lava/core/scheduler/schedulerpages" + "github.com/pubgo/lava/core/scheduler/schedulerdebug" "github.com/pubgo/lava/core/supervisor" "github.com/pubgo/lava/pkg/cmdutil" "github.com/pubgo/lava/servers/https" @@ -29,7 +29,7 @@ func New(di *dix.Dix) *cli.Command { Manager scheduler.JobManager })) - schedulerpages.Init(params.Manager) + schedulerdebug.Init(params.Manager) manager := supervisor.Default(params.LC) for _, svc := range params.Services { diff --git a/core/scheduler/schedulerpages/debug.go b/core/scheduler/schedulerdebug/debug.go similarity index 80% rename from core/scheduler/schedulerpages/debug.go rename to core/scheduler/schedulerdebug/debug.go index 9c2d6e47a..27306b440 100644 --- a/core/scheduler/schedulerpages/debug.go +++ b/core/scheduler/schedulerdebug/debug.go @@ -1,4 +1,4 @@ -package schedulerpages +package schedulerdebug import ( "time" @@ -11,9 +11,8 @@ import ( func Init(scheduler scheduler.JobManager) { debug.Route("/scheduler", func(router fiber.Router) { router.Get("list", func(ctx *fiber.Ctx) error { - scheduler.ListJobs() ctx.Response().Header.SetContentType(fiber.MIMETextHTMLCharsetUTF8) - return Page(time.Now()).Render(ctx) + return Page(time.Now(), scheduler.ListJobs()).Render(ctx) }) }) } diff --git a/core/scheduler/schedulerdebug/html.go b/core/scheduler/schedulerdebug/html.go new file mode 100644 index 000000000..24a393c2e --- /dev/null +++ b/core/scheduler/schedulerdebug/html.go @@ -0,0 +1,130 @@ +package schedulerdebug + +import ( + "encoding/hex" + "encoding/json" + "fmt" + "io" + "time" + + "github.com/pubgo/lava/core/scheduler" + "github.com/samber/lo" + . "maragu.dev/gomponents" + _ "maragu.dev/gomponents/components" + . "maragu.dev/gomponents/html" +) + +type NodeFn func() Node + +func (f NodeFn) Render(w io.Writer) error { + return f().Render(w) +} + +func ListSchedulers(schedulers []*scheduler.Job) Node { + return Div( + Class("overflow-x-auto"), + Table( + Class("table"), + THead( + Tr( + Th(Text("Name")), + Th(Text("Status")), + Th(Text("PreRun")), + Th(Text("ExecTime")), + Th(Text("Error")), + Th(Text("Result")), + Th(Text("RunCount")), + Th(Text("Spec")), + ), + ), + TBody( + Map(schedulers, func(s *scheduler.Job) Node { + return Tr( + Th(Text(s.Spec.Name)), + Th(Text(string(s.Status))), + Th(Textf("%v", s.PreExecTime)), + Th(Textf("%v", s.ExecTime)), + Th(NodeFn(func() Node { + if s.Error != nil { + return Text(s.Error.Error()) + } else { + return Text("null") + } + })), + Th(Text(string(s.Result))), + Th(Textf("%v", s.Runs)), + Th(NodeFn(func() Node { + modeId := fmt.Sprintf(hex.EncodeToString([]byte(s.Spec.Name))) + return Group{ + Script(Rawf(`function model%s(params) {document.getElementById('%s').showModal()}`, modeId, modeId)), + Button( + Class("btn"), + Attr("onclick", fmt.Sprintf("model%s()", modeId)), + Text("open modal"), + ), + Dialog( + ID(modeId), + Class("modal"), + Div( + Class("modal-box"), + H3( + Class("text-lg font-bold"), + Text("Hello!"), + ), + P( + Class("py-4"), + Textf("%s", lo.Must(json.MarshalIndent(s.Spec, " ", " "))), + ), + Div( + Class("modal-action"), + Form( + Method("dialog"), + Button( + Class("btn"), + Text("Close"), + ), + ), + ), + ), + ), + } + })), + ) + }), + ), + ), + ) +} + +const timeOnly = "15:04:05" + +func Page(now time.Time, schedulers []*scheduler.Job) Node { + return Doctype( + HTML( + Head( + Meta(Charset("utf-8")), + Meta(Name("viewport"), Content("width=device-width, initial-scale=1")), + //Meta(Attr("http-equiv", "refresh"), Attr("content", "5")), + TitleEl(Text("scheduler")), + Group{ + Link(Href("https://cdn.jsdelivr.net/npm/daisyui@5"), Rel("stylesheet"), Type("text/css")), + Script(Src("https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4")), + Script(Src("https://cdn.tailwindcss.com?plugins=forms,typography")), + Script(Src("https://unpkg.com/htmx.org")), + }, + ), + Body(Group{ + Div( + H1(Text(`Scheduler Table`)), + partial(now), + ), + + ListSchedulers(schedulers), + }), + ), + ) +} + +func partial(now time.Time) Node { + return P(ID("partial"), Textf(`Time was last updated at %v.`, now.Format(timeOnly))) +} diff --git a/core/scheduler/schedulerpages/html.go b/core/scheduler/schedulerpages/html.go deleted file mode 100644 index c796183ab..000000000 --- a/core/scheduler/schedulerpages/html.go +++ /dev/null @@ -1,102 +0,0 @@ -package schedulerpages - -import ( - "errors" - "log" - "net/http" - "time" - - "github.com/pubgo/lava/core/scheduler" - . "maragu.dev/gomponents" - . "maragu.dev/gomponents/components" - . "maragu.dev/gomponents/html" - . "maragu.dev/gomponents/http" - - hx "maragu.dev/gomponents-htmx" - hxhttp "maragu.dev/gomponents-htmx/http" -) - -func ListSchedulers(schedulers []*scheduler.Job) Node { - return Div( - Class("overflow-x-auto"), - Table( - Class("table"), - THead( - Tr( - Th(), - Th(Text("Name")), - Th(Text("Job")), - Th(Text("Favorite Color")), - ), - ), - TBody( - Tr( - Th(Text("1")), - Th(Text("Cy Ganderton")), - Th(Text("Quality Control Specialist")), - Th(Text("Blue")), - ), - ), - ), - ) -} - -func start() error { - now := time.Now() - mux := http.NewServeMux() - mux.HandleFunc("/", Adapt(func(w http.ResponseWriter, r *http.Request) (Node, error) { - if r.Method == http.MethodPost && hxhttp.IsBoosted(r.Header) { - now = time.Now() - - hxhttp.SetPushURL(w.Header(), "/?time="+now.Format(timeOnly)) - - return partial(now), nil - } - return Page(now), nil - })) - - log.Println("Starting on http://localhost:8080") - if err := http.ListenAndServe("localhost:8080", mux); err != nil && !errors.Is(err, http.ErrServerClosed) { - return err - } - return nil -} - -const timeOnly = "15:04:05" - -func Page(now time.Time) Node { - return HTML5(HTML5Props{ - Title: now.Format(timeOnly), - - Head: []Node{ - Link(Href("https://cdn.jsdelivr.net/npm/daisyui@5"), Rel("stylesheet"), Type("text/css")), - Script(Src("https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4")), - Script(Src("https://cdn.tailwindcss.com?plugins=forms,typography")), - Script(Src("https://unpkg.com/htmx.org")), - }, - - Body: []Node{ - Div(Class("max-w-7xl mx-auto p-4 prose lg:prose-lg xl:prose-xl"), - H1(Text(`gomponents + HTMX`)), - - P(Textf(`Time at last full page refresh was %v.`, now.Format(timeOnly))), - - partial(now), - - Form(Method("post"), Action("/"), - hx.Boost("true"), hx.Target("#partial"), hx.Swap("outerHTML"), - - Button(Type("submit"), Text(`Update time`), - Class("rounded-md border border-transparent bg-orange-600 px-4 py-2 text-sm font-medium text-white shadow-sm hover:bg-orange-700 focus:outline-none focus:ring-2 focus:ring-orange-500 focus:ring-offset-2"), - ), - ), - ), - - ListSchedulers(nil), - }, - }) -} - -func partial(now time.Time) Node { - return P(ID("partial"), Textf(`Time was last updated at %v.`, now.Format(timeOnly))) -} From d7447035d83c4b2d53eea68932aaed5ccef9dc9d Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 27 Aug 2025 21:24:09 +0800 Subject: [PATCH 119/142] fix: barry quick fix, 2025-08-27 21:24:09 --- core/scheduler/schedulerpages/html.go | 102 -------------------------- 1 file changed, 102 deletions(-) delete mode 100644 core/scheduler/schedulerpages/html.go diff --git a/core/scheduler/schedulerpages/html.go b/core/scheduler/schedulerpages/html.go deleted file mode 100644 index b67765e3e..000000000 --- a/core/scheduler/schedulerpages/html.go +++ /dev/null @@ -1,102 +0,0 @@ -package schedulerpages - -import ( - "errors" - "log" - "net/http" - "time" - - "github.com/pubgo/lava/v2/core/scheduler" - . "maragu.dev/gomponents" - . "maragu.dev/gomponents/components" - . "maragu.dev/gomponents/html" - . "maragu.dev/gomponents/http" - - hx "maragu.dev/gomponents-htmx" - hxhttp "maragu.dev/gomponents-htmx/http" -) - -func ListSchedulers(schedulers []*scheduler.Job) Node { - return Div( - Class("overflow-x-auto"), - Table( - Class("table"), - THead( - Tr( - Th(), - Th(Text("Name")), - Th(Text("Job")), - Th(Text("Favorite Color")), - ), - ), - TBody( - Tr( - Th(Text("1")), - Th(Text("Cy Ganderton")), - Th(Text("Quality Control Specialist")), - Th(Text("Blue")), - ), - ), - ), - ) -} - -func start() error { - now := time.Now() - mux := http.NewServeMux() - mux.HandleFunc("/", Adapt(func(w http.ResponseWriter, r *http.Request) (Node, error) { - if r.Method == http.MethodPost && hxhttp.IsBoosted(r.Header) { - now = time.Now() - - hxhttp.SetPushURL(w.Header(), "/?time="+now.Format(timeOnly)) - - return partial(now), nil - } - return Page(now), nil - })) - - log.Println("Starting on http://localhost:8080") - if err := http.ListenAndServe("localhost:8080", mux); err != nil && !errors.Is(err, http.ErrServerClosed) { - return err - } - return nil -} - -const timeOnly = "15:04:05" - -func Page(now time.Time) Node { - return HTML5(HTML5Props{ - Title: now.Format(timeOnly), - - Head: []Node{ - Link(Href("https://cdn.jsdelivr.net/npm/daisyui@5"), Rel("stylesheet"), Type("text/css")), - Script(Src("https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4")), - Script(Src("https://cdn.tailwindcss.com?plugins=forms,typography")), - Script(Src("https://unpkg.com/htmx.org")), - }, - - Body: []Node{ - Div(Class("max-w-7xl mx-auto p-4 prose lg:prose-lg xl:prose-xl"), - H1(Text(`gomponents + HTMX`)), - - P(Textf(`Time at last full page refresh was %v.`, now.Format(timeOnly))), - - partial(now), - - Form(Method("post"), Action("/"), - hx.Boost("true"), hx.Target("#partial"), hx.Swap("outerHTML"), - - Button(Type("submit"), Text(`Update time`), - Class("rounded-md border border-transparent bg-orange-600 px-4 py-2 text-sm font-medium text-white shadow-sm hover:bg-orange-700 focus:outline-none focus:ring-2 focus:ring-orange-500 focus:ring-offset-2"), - ), - ), - ), - - ListSchedulers(nil), - }, - }) -} - -func partial(now time.Time) Node { - return P(ID("partial"), Textf(`Time was last updated at %v.`, now.Format(timeOnly))) -} From 69a726ca122e25b16cdbcc26a5b925187bf67e65 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 27 Aug 2025 21:24:26 +0800 Subject: [PATCH 120/142] fix: barry quick fix, 2025-08-27 21:24:26 --- go.mod | 1 - go.sum | 4 ---- 2 files changed, 5 deletions(-) diff --git a/go.mod b/go.mod index ce9938e3b..3995aaaad 100644 --- a/go.mod +++ b/go.mod @@ -79,7 +79,6 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 gopkg.in/yaml.v3 v3.0.1 maragu.dev/gomponents v1.2.0 - maragu.dev/gomponents-htmx v0.6.1 ) require ( diff --git a/go.sum b/go.sum index 8b25e9821..538499aa2 100644 --- a/go.sum +++ b/go.sum @@ -919,10 +919,6 @@ honnef.co/go/tools v0.5.1 h1:4bH5o3b5ZULQ4UrBmP+63W9r7qIkqJClEA9ko5YKx+I= honnef.co/go/tools v0.5.1/go.mod h1:e9irvo83WDG9/irijV44wr3tbhcFeRnfpVlRqVwpzMs= maragu.dev/gomponents v1.2.0 h1:H7/N5htz1GCnhu0HB1GasluWeU2rJZOYztVEyN61iTc= maragu.dev/gomponents v1.2.0/go.mod h1:oEDahza2gZoXDoDHhw8jBNgH+3UR5ni7Ur648HORydM= -maragu.dev/gomponents-htmx v0.6.1 h1:vXXOkvqEDKYxSwD1UwqmVp12YwFSuM6u8lsRn7Evyng= -maragu.dev/gomponents-htmx v0.6.1/go.mod h1:51nXX+dTGff3usM7AJvbeOcQjzjpSycod+60CYeEP/M= -maragu.dev/is v0.2.0 h1:poeuVEA5GG3vrDpGmzo2KjWtIMZmqUyvGnOB0/pemig= -maragu.dev/is v0.2.0/go.mod h1:bviaM5S0fBshCw7wuumFGTju/izopZ/Yvq4g7Klc7y8= mvdan.cc/gofumpt v0.7.0 h1:bg91ttqXmi9y2xawvkuMXyvAA/1ZGJqYAEGjXuP0JXU= mvdan.cc/gofumpt v0.7.0/go.mod h1:txVFJy/Sc/mvaycET54pV8SW8gWxTlUuGHVEcncmNUo= mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f h1:lMpcwN6GxNbWtbpI1+xzFLSW8XzX0u72NttUGVFjO3U= From 05c3c218ea978aad83bd9a5dff7fd40a812a974d Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 27 Aug 2025 21:54:44 +0800 Subject: [PATCH 121/142] fix: barry quick fix, 2025-08-27 21:54:44 --- core/pidfile/pidfile.go | 56 ++++++++++++++++++-------- core/pidfile/pidfilebuilder/builder.go | 2 +- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/core/pidfile/pidfile.go b/core/pidfile/pidfile.go index 962e7f169..41ec5da1a 100644 --- a/core/pidfile/pidfile.go +++ b/core/pidfile/pidfile.go @@ -8,41 +8,65 @@ import ( "syscall" "github.com/pubgo/funk/config" - "github.com/pubgo/funk/result" + "github.com/pubgo/funk/log" + "github.com/pubgo/funk/pathutil" "github.com/pubgo/funk/running" + "github.com/pubgo/funk/v2/result" ) const Name = "pidfile" var PidPath = filepath.Join(config.GetConfigDir(), Name) -const pidPerm os.FileMode = 0o666 +const pidPerm os.FileMode = 0o644 -func GetPid() result.Result[int] { - f := GetPidF() - if f.IsErr() { - return result.Err[int](f.Err()) +func Get() (r result.Result[int]) { + pidPath := GetPath().UnwrapErr(&r) + if r.IsErr() { + return } - p, err := os.ReadFile(f.Unwrap()) + p, err := os.ReadFile(pidPath) if err != nil { - return result.Wrap(0, err) + return r.WithErrorf("failed to read pid file: %s", pidPath) } - return result.Wrap(strconv.Atoi(string(p))) + if len(p) == 0 { + return r.WithErrorf("pid file is empty") + } + + return result.Wrap(strconv.Atoi(string(p))). + InspectErr(func(err error) { + log.Err(err).Str("path", pidPath).Str("pid", string(p)).Msg("read pid file failed") + }) } -func GetPidF() result.Result[string] { +func GetPath() (r result.Result[string]) { filename := fmt.Sprintf("%s.pid", running.Project) - return result.OK(filepath.Join(PidPath, filename)) + pidPath := filepath.Join(PidPath, filename) + + if pathutil.IsNotExist(PidPath) { + createDirRes := result.ErrOf(os.MkdirAll(PidPath, os.ModePerm)).InspectErr(func(err error) { + log.Err(err).Str("dir", PidPath).Msg("create pid file dir failed") + }) + if createDirRes.CatchErr(&r) { + return + } + } + + return r.WithValue(pidPath) } -func SavePid() error { - f := GetPidF() - if f.IsErr() { - return f.Err() +func Save() (r result.Error) { + pidPath := GetPath().UnwrapErr(&r) + if r.IsErr() { + return } pid := syscall.Getpid() - return os.WriteFile(f.Unwrap(), []byte(strconv.Itoa(pid)), pidPerm) + + return result.ErrOf(os.WriteFile(pidPath, []byte(strconv.Itoa(pid)), pidPerm)). + InspectErr(func(err error) { + log.Err(err).Str("path", pidPath).Int("pid", pid).Msg("write pid file failed") + }) } diff --git a/core/pidfile/pidfilebuilder/builder.go b/core/pidfile/pidfilebuilder/builder.go index 29456667c..17764fd6f 100644 --- a/core/pidfile/pidfilebuilder/builder.go +++ b/core/pidfile/pidfilebuilder/builder.go @@ -17,6 +17,6 @@ func New() lifecycle.Handler { _ = pathutil.IsNotExistMkDir(pidfile.PidPath) - lc.AfterStart(func(ctx context.Context) error { return pidfile.SavePid() }) + lc.AfterStart(func(ctx context.Context) error { return pidfile.Save().GetErr() }) } } From c0464ad15fd15ce16af845fa270792a1eb18c1b4 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 27 Aug 2025 22:13:35 +0800 Subject: [PATCH 122/142] fix: barry quick fix, 2025-08-27 22:13:35 --- core/scheduler/schedulerdebug/debug.go | 123 +++++++++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git a/core/scheduler/schedulerdebug/debug.go b/core/scheduler/schedulerdebug/debug.go index 023527bf0..a92ed8b94 100644 --- a/core/scheduler/schedulerdebug/debug.go +++ b/core/scheduler/schedulerdebug/debug.go @@ -14,5 +14,128 @@ func Init(scheduler scheduler.JobManager) { ctx.Response().Header.SetContentType(fiber.MIMETextHTMLCharsetUTF8) return Page(time.Now(), scheduler.ListJobs()).Render(ctx) }) + + router.Get("/get", func(ctx *fiber.Ctx) error { + var dd = ` + + + + + 基础菜单 - Layui + + + + + + +
+
    +
  • + +
  • +
  • + +
  • +
  • +
  • +
    + menu group +
    +
      +
    • +
      menu item 3-1
      +
    • +
    • +
      menu group 2
      +
        +
      • +
        menu item 3-2-1
        +
      • +
      • menu item 3-2-2
      • +
      +
    • +
    • menu item 3-3
    • +
    +
  • +
  • +
  • menu item 4 1
  • +
  • menu item 5
  • +
  • menu item 6
  • +
  • +
    + menu item 7 Children + +
    +
    +
      +
    • +
      + menu item 7-1 + +
      +
      +
        +
      • menu item 7-2-1
      • +
      • menu item 7-2-2
      • +
      • menu item 7-2-3
      • +
      • menu item 7-2-4
      • +
      +
      +
    • +
    • menu item 7-2
    • +
    • menu item 7-3
    • +
    +
    +
  • +
  • menu item 8
  • +
  • +
  • +
    menu group 9
    +
      +
    • menu item 9-1
    • +
    • +
      + menu item 9-2 + +
      +
      +
        +
      • menu item 9-2-1
      • +
      • menu item 9-2-2
      • +
      • menu item 9-2-3
      • +
      +
      +
    • +
    • menu item 9-31
    • +
    +
  • +
  • +
  • menu item 10
  • +
+
+ + + + +` + ctx.Response().Header.SetContentType(fiber.MIMETextHTMLCharsetUTF8) + _, err := ctx.WriteString(dd) + return err + }) }) } From 113b35ac9002b8c1efc8b8b507476eff7858a7a2 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 27 Aug 2025 22:33:59 +0800 Subject: [PATCH 123/142] fix: barry quick fix, 2025-08-27 22:33:59 --- servers/grpcs/server.go | 138 ++++++++++++++-------------------------- servers/https/server.go | 2 + 2 files changed, 49 insertions(+), 91 deletions(-) diff --git a/servers/grpcs/server.go b/servers/grpcs/server.go index 3f283c660..de6581194 100644 --- a/servers/grpcs/server.go +++ b/servers/grpcs/server.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "net" - "net/http" "net/url" "strings" @@ -18,6 +17,7 @@ import ( "github.com/pubgo/funk/errors/errutil" "github.com/pubgo/funk/generic" "github.com/pubgo/funk/log" + "github.com/pubgo/funk/proto/errorpb" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/running" "github.com/pubgo/funk/stack" @@ -30,10 +30,8 @@ import ( "github.com/pubgo/lava/v2/clients/grpcc" "github.com/pubgo/lava/v2/clients/grpcc/grpccconfig" "github.com/pubgo/lava/v2/core/debug" - "github.com/pubgo/lava/v2/core/lifecycle" "github.com/pubgo/lava/v2/core/metrics" "github.com/pubgo/lava/v2/core/supervisor" - "github.com/pubgo/lava/v2/internal/consts" "github.com/pubgo/lava/v2/internal/logutil" "github.com/pubgo/lava/v2/internal/middlewares/middleware_accesslog" "github.com/pubgo/lava/v2/internal/middlewares/middleware_metric" @@ -42,6 +40,7 @@ import ( "github.com/pubgo/lava/v2/lava" "github.com/pubgo/lava/v2/pkg/gateway" "github.com/pubgo/lava/v2/pkg/httputil" + "github.com/pubgo/lava/v2/pkg/netutil" ) type Params struct { @@ -50,8 +49,6 @@ type Params struct { GrpcHttpRouters []lava.GrpcHttpRouter GrpcProxy []lava.GrpcProxy DixMiddlewares []lava.Middleware - GetLifecycle lifecycle.Getter - Lifecycle lifecycle.Lifecycle Metric metrics.Metric Log log.Logger Conf *Config @@ -68,8 +65,6 @@ func newService(params Params) supervisor.Service { params.GrpcHttpRouters, params.GrpcProxy, params.DixMiddlewares, - params.GetLifecycle, - params.Lifecycle, params.Metric, params.Log, params.Conf, @@ -80,7 +75,6 @@ func newService(params Params) supervisor.Service { } type serviceImpl struct { - lc lifecycle.Getter httpServer *fiber.App grpcServer *grpc.Server log log.Logger @@ -110,8 +104,6 @@ func (s *serviceImpl) init( grpcHttpRouters []lava.GrpcHttpRouter, grpcProxy []lava.GrpcProxy, dixMiddlewares []lava.Middleware, - getLifecycle lifecycle.Getter, - lifecycle lifecycle.Lifecycle, metric metrics.Metric, log log.Logger, conf *Config, @@ -130,8 +122,6 @@ func (s *serviceImpl) init( conf.BaseUrl = "/" + version.Project() } - s.lc = getLifecycle - conf = config.MergeR(defaultCfg(), conf).Unwrap() conf.BaseUrl = "/" + strings.Trim(conf.BaseUrl, "/") @@ -156,15 +146,35 @@ func (s *serviceImpl) init( return nil } - errPb := errutil.ParseError(err) + var errPb *errorpb.Error + var fiberErr *fiber.Error + if errors.As(err, &fiberErr) && fiberErr != nil { + errPb = &errorpb.Error{ + Code: &errorpb.ErrCode{ + Name: "lava.error", + StatusCode: errorpb.Code(errutil.Http2GrpcCode(int32(fiberErr.Code))), + Code: int32(fiberErr.Code), + Message: fiberErr.Message, + }, + Trace: &errorpb.ErrTrace{}, + } + } else { + errPb = errutil.ParseError(err) + } + if errPb == nil || errPb.Code.Code == 0 { return nil } errPb.Trace.Operation = ctx.Route().Path - code := errutil.GrpcCodeToHTTP(codes.Code(errPb.Code.StatusCode)) + + code := int(errPb.Code.Code) + if errPb.Code.Code > 1000 { + code = errutil.GrpcCodeToHTTP(codes.Code(errPb.Code.Code)) + } + ctx.Set(fiber.HeaderContentType, fiber.MIMEApplicationJSON) - return ctx.Status(code).JSON(errPb.Code) + return ctx.Status(code).JSON(errPb) }, }) @@ -216,10 +226,6 @@ func (s *serviceImpl) init( g := httpApp.Group(h.Prefix(), handlerHttpMiddle(append(globalMiddlewares, h.Middlewares()...))) h.Router(g) - if m, ok := h.(lava.Close); ok { - lifecycle.BeforeStop(m.Close) - } - if m, ok := h.(lava.Init); ok { s.initList = append(s.initList, m.Init) } @@ -238,10 +244,6 @@ func (s *serviceImpl) init( srvMidMap[desc.ServiceName] = append(srvMidMap[desc.ServiceName], globalMiddlewares...) srvMidMap[desc.ServiceName] = append(srvMidMap[desc.ServiceName], h.Middlewares()...) - if m, ok := h.(lava.Close); ok { - lifecycle.BeforeStop(m.Close) - } - if m, ok := h.(lava.Initializer); ok { s.initList = append(s.initList, m.Initialize) } @@ -261,10 +263,6 @@ func (s *serviceImpl) init( srvMidMap[desc.ServiceName] = append(srvMidMap[desc.ServiceName], globalMiddlewares...) srvMidMap[desc.ServiceName] = append(srvMidMap[desc.ServiceName], h.Middlewares()...) - if m, ok := h.(lava.Close); ok { - lifecycle.BeforeStop(m.Close) - } - if m, ok := h.(lava.Initializer); ok { s.initList = append(s.initList, m.Initialize) } @@ -341,14 +339,6 @@ func (s *serviceImpl) init( func (s *serviceImpl) start(ctx context.Context) (gErr error) { defer recovery.Exit() - logutil.OkOrFailed(s.log, "running before service starts", func() error { - for _, run := range s.lc.GetBeforeStarts() { - s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) - assert.Exit(run.Exec(ctx)) - } - return nil - }) - logutil.OkOrFailed(s.log, "init handler before service starts", func() error { defer recovery.Exit() for _, init := range s.initList { @@ -365,80 +355,46 @@ func (s *serviceImpl) start(ctx context.Context) (gErr error) { grpcLn := assert.Exit1(net.Listen("tcp", fmt.Sprintf(":%d", *s.conf.GrpcPort))) httpLn := assert.Exit1(net.Listen("tcp", fmt.Sprintf(":%d", *s.conf.HttpPort))) - logutil.OkOrFailed(s.log, "service starts", func() error { - // 启动grpc服务 - async.GoDelay(func() error { - s.log.Info().Msg("[grpc] Server Starting") - logutil.LogOrErr(s.log, "[grpc] Server Stop", func() error { - defer recovery.DebugPrint() - err := s.grpcServer.Serve(grpcLn) - if err == nil || errors.Is(err, http.ErrServerClosed) || errors.Is(err, net.ErrClosed) { - return nil - } - - return err - }) + // 启动grpc服务 + async.GoDelay(func() error { + s.log.Info().Msg("[grpc] Server Starting") + defer recovery.DebugPrint() + err := s.grpcServer.Serve(grpcLn) + if netutil.IsErrServerClosed(err) { return nil - }) - - // 启动grpc网关 - async.GoDelay(func() error { - s.log.Info().Msg("[http] Server Starting") - logutil.LogOrErr(s.log, "[http] Server Stop", func() error { - defer recovery.DebugPrint() - err := s.httpServer.Listener(httpLn) - if err == nil || errors.Is(err, http.ErrServerClosed) || errors.Is(err, net.ErrClosed) { - return nil - } + } - return err - }) - return nil - }) - return nil + return err }) - logutil.OkOrFailed(s.log, "running after service starts", func() error { - for _, run := range s.lc.GetAfterStarts() { - s.log.Info().Msgf("running %s", stack.CallerWithFunc(run.Exec)) - assert.Exit(run.Exec(ctx)) + // 启动grpc网关 + async.GoDelay(func() error { + s.log.Info().Msg("[http] Server Starting") + defer recovery.DebugPrint() + err := s.httpServer.Listener(httpLn) + if netutil.IsErrServerClosed(err) { + return nil } - return nil + + return err }) + return nil } func (s *serviceImpl) stop(ctx context.Context) { defer recovery.DebugPrint() - logutil.OkOrFailed(s.log, "running before service stops", func() error { - for _, run := range s.lc.GetBeforeStops() { - logutil.LogOrErr( - s.log, - fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), - func() error { return run.Exec(ctx) }, - ) - } - return nil - }) - logutil.LogOrErr(s.log, "[grpc] Server GracefulStop", func() error { s.grpcServer.GracefulStop() return nil }) logutil.LogOrErr(s.log, "[http] Server Shutdown", func() error { - return s.httpServer.ShutdownWithTimeout(consts.DefaultTimeout) - }) - - logutil.OkOrFailed(s.log, "running after service stops", func() error { - for _, run := range s.lc.GetAfterStops() { - logutil.LogOrErr( - s.log, - fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), - func() error { return run.Exec(ctx) }, - ) + err := s.httpServer.ShutdownWithContext(ctx) + if netutil.IsErrServerClosed(err) { + return nil } - return nil + return err }) } diff --git a/servers/https/server.go b/servers/https/server.go index b0682b523..30be71ab3 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -95,6 +95,8 @@ func (s *serviceImpl) init( s.httpServer = fiber.New(fiber.Config{ EnableIPValidation: true, + AppName: version.Project(), + BodyLimit: 500 * 1024 * 1024, ErrorHandler: func(ctx *fiber.Ctx, err error) error { if err == nil { return nil From f5518cda21f66621682b38081386683bee8c8856 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 27 Aug 2025 22:35:30 +0800 Subject: [PATCH 124/142] fix: barry quick fix, 2025-08-27 22:35:30 --- lava/service.go | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/lava/service.go b/lava/service.go index 3fcf82cc4..434c9a7c4 100644 --- a/lava/service.go +++ b/lava/service.go @@ -15,18 +15,6 @@ type Close interface { Close(ctx context.Context) error } -//type Server interface { -// fmt.Stringer -// -// // Serve starts the server, no async. -// Serve(ctx context.Context) error -//} - -//type Service interface { -// Start(ctx context.Context) error -// Stop(ctx context.Context) error -//} - // Listener provides an interface for starting and stopping the server. type Listener interface { Listen(context.Context, net.Listener) error From 9a16bb8373591069aed3fbfbc06ec4dad8b7453b Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 28 Aug 2025 11:03:34 +0800 Subject: [PATCH 125/142] fix: barry@feat/supervisor, 2025-08-28 11:03:34 --- taskfile.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/taskfile.yml b/taskfile.yml index 07ea55e9c..7ae57cda1 100644 --- a/taskfile.yml +++ b/taskfile.yml @@ -9,7 +9,7 @@ vars: VERSION: sh: "git tag --sort=committerdate | tail -n 1" BUILD_TIME: - sh: 'date "+%F %T"' + sh: "date -u '+%Y-%m-%d %I:%M:%S %Z'" GIT_COMMIT: sh: "git rev-parse --short=8 HEAD" BRANCH_NAME: From 243cdd63fc36f3459c1cac9d4df52330093e8d46 Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 28 Aug 2025 12:08:04 +0800 Subject: [PATCH 126/142] fix: barry@feat/supervisor, 2025-08-28 12:08:04 --- cmds/servecmd/cmd.go | 120 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 cmds/servecmd/cmd.go diff --git a/cmds/servecmd/cmd.go b/cmds/servecmd/cmd.go new file mode 100644 index 000000000..abd524fe1 --- /dev/null +++ b/cmds/servecmd/cmd.go @@ -0,0 +1,120 @@ +package servecmd + +import ( + "context" + "crypto/sha256" + "fmt" + "log" + "net/http" + "os" + "path" + "time" + + "github.com/pubgo/funk/recovery" + cli "github.com/urfave/cli/v3" +) + +// customFileServer wraps the standard FileServer to add custom headers and ETag support +type customFileServer struct { + root http.FileSystem + fs http.Handler +} + +func (s *customFileServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { + urlPath := path.Clean(r.URL.Path) + + // Handle special health check endpoints + if urlPath == "/healthz" || urlPath == "/ping" { + if urlPath == "/healthz" { + w.Write([]byte("OK")) + } else { + w.Write([]byte("pong")) + } + return + } + + // Check if the path exists and get file info + f, err := s.root.Open(urlPath) + if err != nil { + s.fs.ServeHTTP(w, r) + return + } + defer f.Close() + + fi, err := f.Stat() + if err != nil { + s.fs.ServeHTTP(w, r) + return + } + + // Generate ETag based on file size and modification time + etag := generateETag(fi) + w.Header().Set("ETag", etag) + + // Check if client sent If-None-Match header + if match := r.Header.Get("If-None-Match"); match != "" { + if match == etag { + // Resource not modified, return 304 + w.WriteHeader(http.StatusNotModified) + return + } + } + // Let the standard FileServer handle the rest + s.fs.ServeHTTP(w, r) +} + +// generateETag creates an ETag value based on file modification time and size +func generateETag(fi os.FileInfo) string { + modTime := fi.ModTime().UTC().Format(time.RFC3339Nano) + size := fi.Size() + hash := sha256.New() + fmt.Fprintf(hash, "%s-%d", modTime, size) + return fmt.Sprintf(`"%x"`, hash.Sum(nil)) +} + +func New() *cli.Command { + var ( + flagVerbose bool + ) + + return &cli.Command{ + Name: "serve", + Usage: "serve `pwd` via http at *:8080", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "verbose", + Usage: "verbose", + Local: true, + Value: flagVerbose, + Destination: &flagVerbose, + }, + }, + Action: func(ctx context.Context, command *cli.Command) error { + defer recovery.Exit() + + wd, err := os.Getwd() + if err != nil { + panic(err) + } + + port := "8080" + if p := os.Getenv("PORT"); p != "" { + port = p + } + fmt.Printf("http://localhost:%v/\n", port) + + fileSystem := http.Dir(wd) + fileServer := http.FileServer(fileSystem) + var handler http.Handler = &customFileServer{root: fileSystem, fs: fileServer} + + if flagVerbose { + h := handler + handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + log.Printf("%s %s", r.Method, r.URL.Path) + h.ServeHTTP(w, r) + }) + } + panic(http.ListenAndServe(fmt.Sprintf(":%v", port), handler)) + }, + } +} From 36d464f5bf08bdaf7b7ff1a3f7e912560ff29640 Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 1 Sep 2025 11:47:46 +0800 Subject: [PATCH 127/142] fix: barry@feat/supervisor, 2025-09-01 11:47:46 --- go.mod | 1 + go.sum | 2 ++ internal/examples/xz/main.go | 40 ++++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 internal/examples/xz/main.go diff --git a/go.mod b/go.mod index 3995aaaad..856de65fa 100644 --- a/go.mod +++ b/go.mod @@ -62,6 +62,7 @@ require ( github.com/stretchr/testify v1.10.0 github.com/thejerf/suture/v4 v4.0.6 github.com/uber-go/tally/v4 v4.1.17 + github.com/ulikunitz/xz v0.5.15 github.com/urfave/cli/v3 v3.4.1 github.com/valyala/fasthttp v1.63.0 github.com/valyala/fasttemplate v1.2.2 diff --git a/go.sum b/go.sum index 538499aa2..d9cf7e9d8 100644 --- a/go.sum +++ b/go.sum @@ -632,6 +632,8 @@ github.com/uber-go/tally/v4 v4.1.17 h1:C+U4BKtVDXTszuzU+WH8JVQvRVnaVKxzZrROFyDrv github.com/uber-go/tally/v4 v4.1.17/go.mod h1:ZdpiHRGSa3z4NIAc1VlEH4SiknR885fOIF08xmS0gaU= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= +github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ultraware/funlen v0.1.0 h1:BuqclbkY6pO+cvxoq7OsktIXZpgBSkYTQtmwhAK81vI= github.com/ultraware/funlen v0.1.0/go.mod h1:XJqmOQja6DpxarLj6Jj1U7JuoS8PvL4nEqDaQhy22p4= github.com/ultraware/whitespace v0.1.1 h1:bTPOGejYFulW3PkcrqkeQwOd6NKOOXvmGD9bo/Gk8VQ= diff --git a/internal/examples/xz/main.go b/internal/examples/xz/main.go new file mode 100644 index 000000000..ff1e54fa8 --- /dev/null +++ b/internal/examples/xz/main.go @@ -0,0 +1,40 @@ +// Copyright 2014-2022 Ulrich Kunitz. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "bytes" + "fmt" + "io" + "log" + "os" + + "github.com/ulikunitz/xz" +) + +func main() { + const text = "The quick brown fox jumps over the lazy dog.\n" + var buf bytes.Buffer + // compress text + w, err := xz.NewWriter(&buf) + if err != nil { + log.Fatalf("xz.NewWriter error %s", err) + } + if _, err := io.WriteString(w, text); err != nil { + log.Fatalf("WriteString error %s", err) + } + if err := w.Close(); err != nil { + log.Fatalf("w.Close error %s", err) + } + fmt.Println(buf.String()) + // decompress buffer and write output to stdout + r, err := xz.NewReader(&buf) + if err != nil { + log.Fatalf("NewReader error %s", err) + } + if _, err = io.Copy(os.Stdout, r); err != nil { + log.Fatalf("io.Copy error %s", err) + } +} From 6af11b259416db29ee3b24c6b584b6026cef34c7 Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 1 Sep 2025 21:52:50 +0800 Subject: [PATCH 128/142] fix: barry quick fix, 2025-09-01 21:52:50 --- servers/grpcs/inner_server.go | 137 ---------------------------------- servers/grpcs/middleware.go | 19 ++--- servers/sses/config.go | 1 - 3 files changed, 10 insertions(+), 147 deletions(-) delete mode 100644 servers/grpcs/inner_server.go delete mode 100644 servers/sses/config.go diff --git a/servers/grpcs/inner_server.go b/servers/grpcs/inner_server.go deleted file mode 100644 index 7375e78bd..000000000 --- a/servers/grpcs/inner_server.go +++ /dev/null @@ -1,137 +0,0 @@ -package grpcs - -import ( - "context" - "fmt" - - "github.com/fullstorydev/grpchan/inprocgrpc" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/lava/v2/clients/grpcc" - "github.com/pubgo/lava/v2/clients/grpcc/grpccconfig" - "github.com/pubgo/lava/v2/core/metrics" - "github.com/pubgo/lava/v2/internal/middlewares/middleware_accesslog" - "github.com/pubgo/lava/v2/internal/middlewares/middleware_metric" - "github.com/pubgo/lava/v2/internal/middlewares/middleware_recovery" - "github.com/pubgo/lava/v2/internal/middlewares/middleware_serviceinfo" - "github.com/pubgo/lava/v2/lava" - "github.com/pubgo/lava/v2/pkg/gateway" - "google.golang.org/grpc" - "google.golang.org/grpc/metadata" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" -) - -// NewInner grpc 服务内部通信 -func NewInner(handlers []lava.GrpcRouter, grpcProxy []lava.GrpcProxy, dixMiddlewares []lava.Middleware, metric metrics.Metric, log log.Logger) *lava.InnerServer { - middlewares := lava.Middlewares{ - middleware_serviceinfo.New(), - middleware_metric.New(metric), - middleware_accesslog.New(log), - middleware_recovery.New(), - } - middlewares = append(middlewares, dixMiddlewares...) - - cc := new(inprocgrpc.Channel) - srvMidMap := make(map[string][]lava.Middleware) - for _, h := range handlers { - desc := h.ServiceDesc() - assert.If(desc == nil, "desc is nil") - - srvMidMap[desc.ServiceName] = append(srvMidMap[desc.ServiceName], middlewares...) - srvMidMap[desc.ServiceName] = append(srvMidMap[desc.ServiceName], h.Middlewares()...) - cc.RegisterService(h.ServiceDesc(), h) - } - - for _, h := range grpcProxy { - desc := h.ServiceDesc() - assert.If(desc == nil, "desc is nil") - - srvMidMap[desc.ServiceName] = append(srvMidMap[desc.ServiceName], middlewares...) - srvMidMap[desc.ServiceName] = append(srvMidMap[desc.ServiceName], h.Middlewares()...) - - cli := grpcc.New( - &grpccconfig.Cfg{ - Service: &grpccconfig.ServiceCfg{ - Name: h.Proxy().Name, - Addr: h.Proxy().Addr, - Scheme: h.Proxy().Resolver, - }, - }, - grpcc.Params{ - Log: log, - Metric: metric, - }, - h.Middlewares()..., - ) - - for i := range desc.Methods { - var fullPath = fmt.Sprintf("/%s/%s", desc.ServiceName, desc.Methods[i].MethodName) - inT, outT := getMthType(desc.ServiceName, desc.Methods[i].MethodName) - desc.Methods[i].Handler = grpcMethodHandlerWrapper(cli, fullPath, inT, outT) - } - - for i := range desc.Streams { - inT, outT := getMthType(desc.ServiceName, desc.Methods[i].MethodName) - desc.Streams[i].Handler = grpcMethodStreamWrapper(cli, inT, outT) - } - cc.RegisterService(h.ServiceDesc(), h) - } - - cc = cc.WithServerUnaryInterceptor(handlerUnaryMiddle(srvMidMap)) - cc = cc.WithServerStreamInterceptor(handlerStreamMiddle(srvMidMap)) - return &lava.InnerServer{ClientConnInterface: cc} -} - -func grpcMethodHandlerWrapper(cli grpc.ClientConnInterface, fullPath string, inType, outType protoreflect.MessageType) gateway.GrpcMethodHandler { - return func(srv any, ctx context.Context, dec func(any) error, interceptor grpc.UnaryServerInterceptor) (any, error) { - var in = inType.New().Interface() - if err := dec(in); err != nil { - return nil, errors.WrapCaller(err) - } - - var h = func(ctx context.Context, req any) (any, error) { - var out = outType.New().Interface() - var header metadata.MD - var trailer metadata.MD - err := cli.Invoke(ctx, fullPath, req, out, append([]grpc.CallOption{}, grpc.Header(&header), grpc.Trailer(&trailer))...) - if err != nil { - return nil, errors.WrapCaller(err) - } - return out, nil - } - - // 获取 server header 并转换成 client header - if interceptor == nil { - return h(ctx, in) - } - - return interceptor(ctx, in, &grpc.UnaryServerInfo{FullMethod: fullPath}, h) - } -} - -func getMthType(srvName string, mthName string) (protoreflect.MessageType, protoreflect.MessageType) { - d := assert.Must1(protoregistry.GlobalFiles.FindDescriptorByName(protoreflect.FullName(srvName))) - - sd, ok := d.(protoreflect.ServiceDescriptor) - if !ok { - assert.Must(errors.Format("invalid httpPathRule descriptor %T", d)) - } - - findMethodDesc := func(methodName string) protoreflect.MethodDescriptor { - md := sd.Methods().ByName(protoreflect.Name(methodName)) - assert.If(md == nil, "missing protobuf descriptor for %v", methodName) - return md - } - - mthDesc := findMethodDesc(mthName) - - inputType := assert.Must1(protoregistry.GlobalTypes.FindMessageByName(mthDesc.Input().FullName())) - outputType := assert.Must1(protoregistry.GlobalTypes.FindMessageByName(mthDesc.Output().FullName())) - return inputType, outputType -} - -func grpcMethodStreamWrapper(cli grpc.ClientConnInterface, inType, outType protoreflect.MessageType) gateway.GrpcStreamHandler { - return gateway.TransparentHandler(cli, inType, outType) -} diff --git a/servers/grpcs/middleware.go b/servers/grpcs/middleware.go index baba1dc56..e9b48c3b7 100644 --- a/servers/grpcs/middleware.go +++ b/servers/grpcs/middleware.go @@ -13,16 +13,17 @@ import ( "github.com/pubgo/funk/proto/errorpb" "github.com/pubgo/funk/strutil" "github.com/pubgo/funk/version" - "github.com/pubgo/lava/v2/core/lavacontexts" - "github.com/pubgo/lava/v2/lava" - "github.com/pubgo/lava/v2/pkg/grpcutil" - "github.com/pubgo/lava/v2/pkg/httputil" - "github.com/pubgo/lava/v2/pkg/proto/lavapbv1" "github.com/rs/xid" "github.com/valyala/fasthttp" "google.golang.org/grpc" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" + + "github.com/pubgo/lava/v2/core/lavacontexts" + "github.com/pubgo/lava/v2/lava" + "github.com/pubgo/lava/v2/pkg/grpcutil" + "github.com/pubgo/lava/v2/pkg/httputil" + "github.com/pubgo/lava/v2/pkg/proto/lavapbv1" ) func handlerUnaryMiddle(middlewares map[string][]lava.Middleware) grpc.UnaryServerInterceptor { @@ -117,9 +118,9 @@ func handlerUnaryMiddle(middlewares map[string][]lava.Middleware) grpc.UnaryServ reqMetadata.Set(httputil.HeaderXRequestID, reqId) reqMetadata.Set(httputil.HeaderXRequestVersion, version.Version()) reqMetadata.Set(httputil.HeaderXRequestOperation, info.FullMethod) - rpcReq.rspHeader.VisitAll(func(key, value []byte) { + for key, value := range rpcReq.rspHeader.All() { reqMetadata.Set(convert.BtoS(key), convert.BtoS(value)) - }) + } if err := grpc.SetHeader(ctx, reqMetadata); err != nil { log.Err(err, ctx).Msg("grpc send trailer failed") @@ -273,9 +274,9 @@ func handlerStreamMiddle(middlewares map[string][]lava.Middleware) grpc.StreamSe h := rsp.Header() md = make(metadata.MD) - h.VisitAll(func(key, value []byte) { + for key, value := range h.All() { md.Append(convert.BtoS(key), convert.BtoS(value)) - }) + } return grpc.SetTrailer(ctx, md) } } diff --git a/servers/sses/config.go b/servers/sses/config.go deleted file mode 100644 index b87fd291f..000000000 --- a/servers/sses/config.go +++ /dev/null @@ -1 +0,0 @@ -package sses From 097141248085b1112232ee8213d0083714c0d474 Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 2 Sep 2025 23:43:43 +0800 Subject: [PATCH 129/142] fix: barry quick fix, 2025-09-02 23:43:43 --- go.mod | 4 +- go.sum | 4 +- internal/configs/components/http_server.yaml | 3 - pkg/fiberbuilder/config.go | 144 ++++++++++++++----- pkg/httputil/util.go | 121 +++++++++++++++- servers/grpcs/config.go | 23 +-- servers/grpcs/server.go | 95 ++---------- servers/https/config.go | 22 +-- servers/https/server.go | 130 +++-------------- servers/tasks/config.go | 8 +- servers/tasks/server.go | 77 ++++------ 11 files changed, 322 insertions(+), 309 deletions(-) diff --git a/go.mod b/go.mod index 856de65fa..55562ce10 100644 --- a/go.mod +++ b/go.mod @@ -36,6 +36,7 @@ require ( ) require ( + dario.cat/mergo v1.0.2 github.com/alecthomas/participle/v2 v2.1.4 github.com/arl/statsviz v0.7.1 github.com/ecordell/optgen v0.0.9 @@ -54,7 +55,7 @@ require ( github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.65.0 github.com/pubgo/dix v0.3.21 - github.com/pubgo/funk v0.5.69-alpha.12 + github.com/pubgo/funk v0.5.69-alpha.14 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.6.0 github.com/rs/zerolog v1.34.0 @@ -85,7 +86,6 @@ require ( require ( 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect 4d63.com/gochecknoglobals v0.2.1 // indirect - dario.cat/mergo v1.0.2 // indirect github.com/4meepo/tagalign v1.3.4 // indirect github.com/Abirdcfly/dupword v0.1.1 // indirect github.com/Antonboom/errname v0.1.13 // indirect diff --git a/go.sum b/go.sum index d9cf7e9d8..27ecb7cbe 100644 --- a/go.sum +++ b/go.sum @@ -506,8 +506,8 @@ github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7D github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/pubgo/dix v0.3.21 h1:jtriLYT6srKrxv0KRwic1no0d9ZTMtLx6r3JJxQ5Jvw= github.com/pubgo/dix v0.3.21/go.mod h1:5qHJ7ycvBVw1AUjgYMEsobzx1tggiRs+spgzd4Jglb4= -github.com/pubgo/funk v0.5.69-alpha.12 h1:McVMxwFIWp6FNWq605Th02VKdyFR398eEYp1S1DWFj8= -github.com/pubgo/funk v0.5.69-alpha.12/go.mod h1:mWqaZftfwVoZk/qhLqb/S3iCa1LR7QKIMh3HsABCIjo= +github.com/pubgo/funk v0.5.69-alpha.14 h1:Y6H11YYJ4gKTaEsPfs/zOWvlLVj17POr5I5A0pPVpd8= +github.com/pubgo/funk v0.5.69-alpha.14/go.mod h1:mWqaZftfwVoZk/qhLqb/S3iCa1LR7QKIMh3HsABCIjo= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/pubgo/protobuild v0.0.21 h1:QSwh92QxsD6Mv7kQlowzE7fxtcOm1eMWmgADsD803Js= diff --git a/internal/configs/components/http_server.yaml b/internal/configs/components/http_server.yaml index b0e31ac35..c7ed96dbc 100644 --- a/internal/configs/components/http_server.yaml +++ b/internal/configs/components/http_server.yaml @@ -1,7 +1,4 @@ http_server: base_url: /scheduler - enable_cors: ${GRPC_ENABLE_CORS:-false} - enable_ping_pong: true - ping_pong_time: 40 enable_print_router: true # http_port: 8001 diff --git a/pkg/fiberbuilder/config.go b/pkg/fiberbuilder/config.go index 063adbfbd..8807f764b 100644 --- a/pkg/fiberbuilder/config.go +++ b/pkg/fiberbuilder/config.go @@ -1,46 +1,126 @@ package fiberbuilder import ( + "github.com/samber/lo" + "log/slog" "time" + "dario.cat/mergo" "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/merge" "github.com/pubgo/funk/v2/result" ) type Config struct { - Prefork bool `yaml:"prefork"` - ServerHeader string `yaml:"server_header"` - StrictRouting bool `yaml:"strict_routing"` - CaseSensitive bool `yaml:"case_sensitive"` - Immutable bool `yaml:"immutable"` - UnescapePath bool `yaml:"unescape_path"` - ETag bool `yaml:"etag"` - BodyLimit int `yaml:"body_limit"` - Concurrency int `yaml:"concurrency"` - Templates struct { - Dir string `yaml:"dir"` - Ext string `yaml:"ext"` - } `yaml:"templates"` - ReadTimeout time.Duration `yaml:"read_timeout"` - WriteTimeout time.Duration `yaml:"write_timeout"` - IdleTimeout time.Duration `yaml:"idle_timeout"` - ReadBufferSize int `yaml:"read_buffer_size"` - WriteBufferSize int `yaml:"write_buffer_size"` - CompressedFileSuffix string `yaml:"compressed_file_suffix"` - ProxyHeader string `yaml:"proxy_header"` - GETOnly bool `yaml:"get_only"` - DisableKeepalive bool `yaml:"disable_keepalive"` - DisableDefaultDate bool `yaml:"disable_default_date"` - DisableDefaultContentType bool `yaml:"disable_default_content_type"` - DisableHeaderNormalizing bool `yaml:"disable_header_normalizing"` - DisableStartupMessage bool `yaml:"disable_startup_message"` - ReduceMemoryUsage bool `yaml:"reduce_memory_usage"` + Prefork bool `yaml:"-"` + ServerHeader string `yaml:"-"` + CaseSensitive bool `yaml:"-"` + Immutable bool `yaml:"-"` + UnescapePath bool `yaml:"-"` + ProxyHeader string `yaml:"-"` + GETOnly bool `yaml:"-"` + DisableKeepalive bool `yaml:"-"` + DisableDefaultDate bool `yaml:"-"` + DisableDefaultContentType bool `yaml:"-"` + ErrorHandler fiber.ErrorHandler `yaml:"-" json:"-"` + BodyLimit int `yaml:"-"` + Concurrency int `yaml:"-"` + + // StreamRequestBody enables request body streaming, + // and calls the handler sooner when given body is + // larger then the current limit. + StreamRequestBody bool `yaml:"stream_request_body"` + + // Will not pre parse Multipart Form data if set to true. + // + // This option is useful for servers that desire to treat + // multipart form data as a binary blob, or choose when to parse the data. + // + // Server pre parses multipart form data by default. + DisablePreParseMultipartForm bool `yaml:"disable_pre_parse_multipart_form"` + + // Aggressively reduces memory usage at the cost of higher CPU usage + // if set to true. + // + // Try enabling this option only if the server consumes too much memory + // serving mostly idle keep-alive connections. This may reduce memory + // usage by more than 50%. + // + // Default: false + ReduceMemoryUsage bool `yaml:"reduce_memory_usage"` + + // If set to true, c.IP() and c.IPs() will validate IP addresses before returning them. + // Also, c.IP() will return only the first valid IP rather than just the raw header + // WARNING: this has a performance cost associated with it. + // + // Default: false + EnableIPValidation bool `yaml:"enable_ip_validation"` + + // If set to true, will print all routes with their method, path and handler. + // Default: false + EnablePrintRoutes bool `yaml:"enable_print_routes"` + + // EnableSplittingOnParsers splits the query/body/header parameters by comma when it's true. + // For example, you can use it to parse multiple values from a query parameter like this: + // /api?foo=bar,baz == foo[]=bar&foo[]=baz + // + // Optional. Default: false + EnableSplittingOnParsers bool `yaml:"enable_splitting_on_parsers"` + + ETag bool `yaml:"etag"` + ReadTimeout time.Duration `yaml:"read_timeout"` + WriteTimeout time.Duration `yaml:"write_timeout"` + IdleTimeout time.Duration `yaml:"idle_timeout"` + ReadBufferSize int `yaml:"read_buffer_size"` + WriteBufferSize int `yaml:"write_buffer_size"` + CompressedFileSuffix string `yaml:"compressed_file_suffix"` + DisableHeaderNormalizing bool `yaml:"disable_header_normalizing"` + DisableStartupMessage bool `yaml:"disable_startup_message"` } -func (t *Config) Build() (r result.Result[*fiber.App]) { +func (t *Config) ToCfg() fiber.Config { + return fiber.Config{ + Prefork: t.Prefork, + ServerHeader: t.ServerHeader, + CaseSensitive: t.CaseSensitive, + Immutable: t.Immutable, + UnescapePath: t.UnescapePath, + ProxyHeader: t.ProxyHeader, + GETOnly: t.GETOnly, + DisableKeepalive: t.DisableKeepalive, + DisableDefaultDate: t.DisableDefaultDate, + DisableDefaultContentType: t.DisableDefaultContentType, + ErrorHandler: t.ErrorHandler, + BodyLimit: t.BodyLimit, + Concurrency: t.Concurrency, + StreamRequestBody: t.StreamRequestBody, + DisablePreParseMultipartForm: t.DisablePreParseMultipartForm, + ReduceMemoryUsage: t.ReduceMemoryUsage, + EnableIPValidation: t.EnableIPValidation, + EnablePrintRoutes: t.EnablePrintRoutes, + EnableSplittingOnParsers: t.EnableSplittingOnParsers, + ETag: t.ETag, + ReadTimeout: t.ReadTimeout, + WriteTimeout: t.WriteTimeout, + IdleTimeout: t.IdleTimeout, + ReadBufferSize: t.ReadBufferSize, + WriteBufferSize: t.WriteBufferSize, + CompressedFileSuffix: t.CompressedFileSuffix, + DisableHeaderNormalizing: t.DisableHeaderNormalizing, + DisableStartupMessage: t.DisableStartupMessage, + } +} + +func (t *Config) Build() (r result.Result[fiber.Config]) { + if t == nil { + return r.WithValue(fiber.New().Config()) + } + defer result.RecoveryErr(&r) - fc := merge.Struct(generic.Ptr(fiber.New().Config()), &t).Unwrap() - return r.WithValue(fiber.New(*fc)) + cfg := fiber.New().Config() + err := mergo.Merge(&cfg, lo.ToPtr(t.ToCfg()), mergo.WithOverride, mergo.WithAppendSlice) + if err != nil { + slog.Error("failed to merge config", "err", err, "source", t, "target", cfg) + return r.WithErrorf("failed to merge config, err:%v", err) + } + return r.WithValue(cfg) } diff --git a/pkg/httputil/util.go b/pkg/httputil/util.go index d7ef807a1..dab884381 100644 --- a/pkg/httputil/util.go +++ b/pkg/httputil/util.go @@ -1,11 +1,68 @@ package httputil import ( + "log/slog" "strings" - + + "dario.cat/mergo" + "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/middleware/cors" + "github.com/pubgo/funk" + "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/errors/errutil" + "github.com/pubgo/funk/proto/errorpb" + "github.com/pubgo/funk/running" + "github.com/pubgo/funk/version" + "github.com/pubgo/lava/v2/pkg/fiberbuilder" + "github.com/samber/lo" "github.com/valyala/fasthttp" + "google.golang.org/grpc/codes" ) +type Config struct { + Http *fiberbuilder.Config `yaml:"http"` + EnablePrintRouter bool `yaml:"enable_print_router"` + BaseUrl string `yaml:"base_url"` + HttpPort *int `yaml:"http_port"` +} + +func DefaultCfg(config ...*Config) Config { + cfg := Config{ + Http: &fiberbuilder.Config{ + ServerHeader: "lava", + EnableIPValidation: true, + ETag: true, + ErrorHandler: ErrHandler, + BodyLimit: 1024 * 1024 * 500, + }, + EnablePrintRouter: true, + BaseUrl: version.Project(), + HttpPort: lo.ToPtr(running.HttpPort), + } + + for _, t := range config { + if t == nil { + continue + } + + err := mergo.Merge(&cfg, t, mergo.WithOverride, mergo.WithAppendSlice) + if err != nil { + slog.Error("failed to merge config to default config", "err", err, "source", t, "target", cfg) + panic(err) + } + } + + cfg.Http.EnablePrintRoutes = cfg.EnablePrintRouter + cfg.BaseUrl = funk.DoFunc(func() string { + baseUrl := cfg.BaseUrl + if baseUrl == "" { + baseUrl = "/" + version.Project() + } + return "/" + strings.Trim(baseUrl, "/") + }) + return cfg +} + func IsWebsocket(h *fasthttp.RequestHeader) bool { if strings.Contains(strings.ToLower(string(h.Peek("Connection"))), "upgrade") && strings.EqualFold(string(h.Peek("Upgrade")), "websocket") { @@ -13,3 +70,65 @@ func IsWebsocket(h *fasthttp.RequestHeader) bool { } return false } + +func ErrHandler(ctx *fiber.Ctx, err error) error { + if err == nil { + return nil + } + + var errPb *errorpb.Error + var fiberErr *fiber.Error + if errors.As(err, &fiberErr) && fiberErr != nil { + errPb = &errorpb.Error{ + Code: &errorpb.ErrCode{ + Name: "lava.error", + StatusCode: errorpb.Code(errutil.Http2GrpcCode(int32(fiberErr.Code))), + Code: int32(fiberErr.Code), + Message: fiberErr.Message, + Details: errors.MustTagsToAny( + &errorpb.Tag{Key: "path", Value: ctx.Route().Path}, + &errorpb.Tag{Key: "version", Value: running.Version}, + &errorpb.Tag{Key: "instance", Value: running.InstanceID}, + ), + }, + Trace: &errorpb.ErrTrace{}, + } + } else { + errPb = errutil.ParseError(err) + } + + if errPb == nil || errPb.Code.Code == 0 { + return nil + } + + errPb.Trace.Operation = ctx.Route().Path + + code := int(errPb.Code.Code) + if errPb.Code.Code > 1000 { + code = errutil.GrpcCodeToHTTP(codes.Code(errPb.Code.Code)) + } + + ctx.Set(fiber.HeaderContentType, fiber.MIMEApplicationJSON) + return ctx.Status(code).JSON(errPb) +} + +func Cors() fiber.Handler { + return cors.New(cors.Config{ + AllowOriginsFunc: func(origin string) bool { + return true + }, + AllowMethods: strings.Join([]string{ + fiber.MethodGet, + fiber.MethodPost, + fiber.MethodPut, + fiber.MethodDelete, + fiber.MethodPatch, + fiber.MethodHead, + fiber.MethodOptions, + }, ","), + //AllowHeaders: "", + AllowCredentials: true, + //ExposeHeaders: "", + MaxAge: 0, + }) +} diff --git a/servers/grpcs/config.go b/servers/grpcs/config.go index 1351feabe..4b7dcc3ce 100644 --- a/servers/grpcs/config.go +++ b/servers/grpcs/config.go @@ -1,7 +1,10 @@ package grpcs import ( - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/generic" + "github.com/pubgo/funk/running" + + "github.com/pubgo/lava/v2/pkg/fiberbuilder" "github.com/pubgo/lava/v2/pkg/grpcbuilder" ) @@ -14,19 +17,17 @@ type GrpcServerConfigLoader struct { } type Config struct { - EnablePrintRoutes bool `yaml:"enable_print_routes"` - BaseUrl string `yaml:"base_url"` - GrpcConfig *grpcbuilder.Config `yaml:"grpc_config"` - EnableCors bool `yaml:"enable_cors"` - - GrpcPort *int `yaml:"grpc_port"` - HttpPort *int `yaml:"http_port"` + Http *fiberbuilder.Config `yaml:"http"` + HttpPort *int `yaml:"http_port"` + GrpcConfig *grpcbuilder.Config `yaml:"grpc"` + GrpcPort *int `yaml:"grpc_port"` + EnablePrintRouter bool `yaml:"enable_print_router"` + BaseUrl string `yaml:"base_url"` } func defaultCfg() *Config { return &Config{ - EnablePrintRoutes: true, - BaseUrl: version.Project(), - GrpcConfig: grpcbuilder.GetDefaultCfg(), + GrpcConfig: grpcbuilder.GetDefaultCfg(), + GrpcPort: generic.Ptr(running.GrpcPort), } } diff --git a/servers/grpcs/server.go b/servers/grpcs/server.go index de6581194..53a642e80 100644 --- a/servers/grpcs/server.go +++ b/servers/grpcs/server.go @@ -2,7 +2,6 @@ package grpcs import ( "context" - "errors" "fmt" "net" "net/url" @@ -10,22 +9,16 @@ import ( "github.com/fullstorydev/grpchan/inprocgrpc" "github.com/gofiber/fiber/v2" - "github.com/gofiber/fiber/v2/middleware/cors" "github.com/pubgo/funk/assert" "github.com/pubgo/funk/async" "github.com/pubgo/funk/config" - "github.com/pubgo/funk/errors/errutil" - "github.com/pubgo/funk/generic" "github.com/pubgo/funk/log" - "github.com/pubgo/funk/proto/errorpb" "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/running" "github.com/pubgo/funk/stack" "github.com/pubgo/funk/vars" "github.com/pubgo/funk/version" "github.com/rs/xid" "google.golang.org/grpc" - "google.golang.org/grpc/codes" "github.com/pubgo/lava/v2/clients/grpcc" "github.com/pubgo/lava/v2/clients/grpcc/grpccconfig" @@ -109,21 +102,17 @@ func (s *serviceImpl) init( conf *Config, gw []*gateway.Mux, ) { - s.conf = conf - if conf.HttpPort == nil { - conf.HttpPort = generic.Ptr(running.HttpPort) - } - - if conf.GrpcPort == nil { - conf.GrpcPort = generic.Ptr(running.GrpcPort) - } - - if conf.BaseUrl == "" { - conf.BaseUrl = "/" + version.Project() - } + cfg := httputil.DefaultCfg(&httputil.Config{ + BaseUrl: conf.BaseUrl, + EnablePrintRouter: conf.EnablePrintRouter, + Http: conf.Http, + HttpPort: conf.HttpPort, + }) + conf.BaseUrl = cfg.BaseUrl + conf.HttpPort = cfg.HttpPort + conf.Http = cfg.Http - conf = config.MergeR(defaultCfg(), conf).Unwrap() - conf.BaseUrl = "/" + strings.Trim(conf.BaseUrl, "/") + s.conf = config.MergeR(defaultCfg(), conf).Unwrap() globalMiddlewares := lava.Middlewares{ middleware_serviceinfo.New(), @@ -136,68 +125,8 @@ func (s *serviceImpl) init( log = log.WithName("grpc-server") s.log = log - httpServer := fiber.New(fiber.Config{ - EnableIPValidation: true, - EnablePrintRoutes: conf.EnablePrintRoutes, - AppName: version.Project(), - BodyLimit: 500 * 1024 * 1024, - ErrorHandler: func(ctx *fiber.Ctx, err error) error { - if err == nil { - return nil - } - - var errPb *errorpb.Error - var fiberErr *fiber.Error - if errors.As(err, &fiberErr) && fiberErr != nil { - errPb = &errorpb.Error{ - Code: &errorpb.ErrCode{ - Name: "lava.error", - StatusCode: errorpb.Code(errutil.Http2GrpcCode(int32(fiberErr.Code))), - Code: int32(fiberErr.Code), - Message: fiberErr.Message, - }, - Trace: &errorpb.ErrTrace{}, - } - } else { - errPb = errutil.ParseError(err) - } - - if errPb == nil || errPb.Code.Code == 0 { - return nil - } - - errPb.Trace.Operation = ctx.Route().Path - - code := int(errPb.Code.Code) - if errPb.Code.Code > 1000 { - code = errutil.GrpcCodeToHTTP(codes.Code(errPb.Code.Code)) - } - - ctx.Set(fiber.HeaderContentType, fiber.MIMEApplicationJSON) - return ctx.Status(code).JSON(errPb) - }, - }) - - if conf.EnableCors { - httpServer.Use(cors.New(cors.Config{ - AllowOriginsFunc: func(origin string) bool { - return true - }, - AllowMethods: strings.Join([]string{ - fiber.MethodGet, - fiber.MethodPost, - fiber.MethodPut, - fiber.MethodDelete, - fiber.MethodPatch, - fiber.MethodHead, - fiber.MethodOptions, - }, ","), - //AllowHeaders: "", - AllowCredentials: true, - //ExposeHeaders: "", - MaxAge: 0, - })) - } + httpServer := fiber.New(conf.Http.Build().Must()) + httpServer.Use(httputil.Cors()) httpApp := fiber.New() diff --git a/servers/https/config.go b/servers/https/config.go index cc0a694d1..1f562f2fb 100644 --- a/servers/https/config.go +++ b/servers/https/config.go @@ -1,28 +1,10 @@ package https import ( - "github.com/pubgo/funk/version" - "github.com/pubgo/lava/v2/pkg/fiberbuilder" + "github.com/pubgo/lava/v2/pkg/httputil" ) -// DefaultMaxBodyBytes is the maximum allowed size of a request body in bytes. -const DefaultMaxBodyBytes = 256 * 1024 - -type Config struct { - Http *fiberbuilder.Config `yaml:"http"` - Ws *fiberbuilder.WsCfg `yaml:"ws"` - EnablePrintRouter bool `yaml:"enable_print_router"` - BaseUrl string `yaml:"base_url"` -} - -func DefaultCfg() Config { - return Config{ - Http: &fiberbuilder.Config{}, - Ws: &fiberbuilder.WsCfg{}, - EnablePrintRouter: true, - BaseUrl: version.Project(), - } -} +type Config = httputil.Config type HttpServerConfigLoader struct { HttpServer *Config `yaml:"http_server"` diff --git a/servers/https/server.go b/servers/https/server.go index 30be71ab3..2921d7eb0 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -2,25 +2,18 @@ package https import ( "context" - "errors" "fmt" - "net" - "strings" "github.com/gofiber/fiber/v2" - "github.com/gofiber/fiber/v2/middleware/cors" - "github.com/pubgo/funk/assert" "github.com/pubgo/funk/async" - "github.com/pubgo/funk/errors/errutil" "github.com/pubgo/funk/log" - "github.com/pubgo/funk/proto/errorpb" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/running" "github.com/pubgo/funk/vars" "github.com/pubgo/funk/version" "github.com/pubgo/opendoc/opendoc" "github.com/rs/xid" - "google.golang.org/grpc/codes" + "github.com/samber/lo" "github.com/pubgo/lava/v2/core/debug" "github.com/pubgo/lava/v2/core/lifecycle" @@ -32,6 +25,7 @@ import ( "github.com/pubgo/lava/v2/internal/middlewares/middleware_recovery" "github.com/pubgo/lava/v2/internal/middlewares/middleware_serviceinfo" "github.com/pubgo/lava/v2/lava" + "github.com/pubgo/lava/v2/pkg/httputil" "github.com/pubgo/lava/v2/pkg/netutil" ) @@ -57,7 +51,7 @@ func newService(params Params) supervisor.Service { params.Docs, ) - return supervisor.NewService("http-server", s.Serve) + return supervisor.NewService(s.String(), s.Serve) } type serviceImpl struct { @@ -85,74 +79,13 @@ func (s *serviceImpl) init( cfg *Config, docs []*opendoc.Swagger, ) { - if cfg.BaseUrl == "" { - cfg.BaseUrl = "/" + version.Project() - } + cfg = lo.ToPtr(httputil.DefaultCfg(cfg)) - log = log.WithName("http-server") - - s.log = log - - s.httpServer = fiber.New(fiber.Config{ - EnableIPValidation: true, - AppName: version.Project(), - BodyLimit: 500 * 1024 * 1024, - ErrorHandler: func(ctx *fiber.Ctx, err error) error { - if err == nil { - return nil - } - - var errPb *errorpb.Error - var fiberErr *fiber.Error - if errors.As(err, &fiberErr) && fiberErr != nil { - errPb = &errorpb.Error{ - Code: &errorpb.ErrCode{ - Name: "lava.error", - StatusCode: errorpb.Code(errutil.Http2GrpcCode(int32(fiberErr.Code))), - Code: int32(fiberErr.Code), - Message: fiberErr.Message, - }, - Trace: &errorpb.ErrTrace{}, - } - } else { - errPb = errutil.ParseError(err) - } - - if errPb == nil || errPb.Code.Code == 0 { - return nil - } - - errPb.Trace.Operation = ctx.Route().Path - - code := int(errPb.Code.Code) - if errPb.Code.Code > 1000 { - code = errutil.GrpcCodeToHTTP(codes.Code(errPb.Code.Code)) - } - - ctx.Set(fiber.HeaderContentType, fiber.MIMEApplicationJSON) - return ctx.Status(code).JSON(errPb) - }, - }) + vars.RegisterValue(s.String()+"_config_"+xid.New().String(), cfg) - app := fiber.New() - app.Use(cors.New(cors.Config{ - AllowOriginsFunc: func(origin string) bool { - return true - }, - AllowMethods: strings.Join([]string{ - fiber.MethodGet, - fiber.MethodPost, - fiber.MethodPut, - fiber.MethodDelete, - fiber.MethodPatch, - fiber.MethodHead, - fiber.MethodOptions, - }, ","), - //AllowHeaders: "", - AllowCredentials: true, - //ExposeHeaders: "", - MaxAge: 0, - })) + s.log = log.WithName(s.String()) + s.httpServer = fiber.New(cfg.Http.Build().Must()) + s.httpServer.Use(httputil.Cors()) defaultMiddlewares := []lava.Middleware{ middleware_serviceinfo.New(), @@ -160,10 +93,10 @@ func (s *serviceImpl) init( middleware_accesslog.New(log), middleware_recovery.New(), } - app.Use(handlerHttpMiddle(append(defaultMiddlewares, middlewares...))) + s.httpServer.Use(handlerHttpMiddle(append(defaultMiddlewares, middlewares...))) for _, h := range handlers { - g := app.Group("", handlerHttpMiddle(h.Middlewares())) + g := s.httpServer.Group("", handlerHttpMiddle(h.Middlewares())) //for _, an := range h.Annotation() { // switch a := an.(type) { @@ -178,43 +111,26 @@ func (s *serviceImpl) init( } s.httpServer.Mount("/debug", debug.App()) - s.httpServer.Mount(cfg.BaseUrl, app) - - // 网关初始化 - if cfg.EnablePrintRouter { - vars.Register(fmt.Sprintf("%s-http-server-router-%s", version.Project(), xid.New()), func() interface{} { - return s.httpServer.Stack() - }) - - for _, stacks := range s.httpServer.Stack() { - for _, route := range stacks { - s.log.Info(). - Str("name", route.Name). - Str("path", route.Path). - Str("method", route.Method). - Msg("service route") - } - } - } + + vars.Register(fmt.Sprintf("%s-http-server-router-%s", version.Project(), xid.New()), func() interface{} { + return s.httpServer.Stack() + }) } func (s *serviceImpl) start(ctx context.Context) { defer recovery.Exit() - httpLn := assert.Must1(net.Listen("tcp", fmt.Sprintf(":%d", running.HttpPort))) - logutil.OkOrFailed(s.log, "service start", func() error { - async.GoDelay(func() error { - defer recovery.Exit() + addr := fmt.Sprintf(":%d", running.HttpPort) + async.GoDelay(func() error { + defer recovery.Exit() - s.log.Info().Msg("[http-server] Server Starting") - err := s.httpServer.Listener(httpLn) - if netutil.IsErrServerClosed(err) { - return nil - } + s.log.Info().Msg("[http-server] Server Starting") + err := s.httpServer.Listen(addr) + if netutil.IsErrServerClosed(err) { + return nil + } - return err - }) - return nil + return err }) } diff --git a/servers/tasks/config.go b/servers/tasks/config.go index 27cc8bec1..b7a8c7bb8 100644 --- a/servers/tasks/config.go +++ b/servers/tasks/config.go @@ -1,5 +1,9 @@ package tasks -type Config struct { - HttpPort *int `yaml:"http_port"` +import "github.com/pubgo/lava/v2/pkg/httputil" + +type Config = httputil.Config + +type HttpServerConfigLoader struct { + HttpServer *Config `yaml:"http_server"` } diff --git a/servers/tasks/server.go b/servers/tasks/server.go index e822429de..8d5404aec 100644 --- a/servers/tasks/server.go +++ b/servers/tasks/server.go @@ -3,22 +3,20 @@ package tasks import ( "context" "fmt" - "net" - "net/http" - "time" + "github.com/pubgo/funk/async" "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/errors/errutil" "github.com/pubgo/funk/generic" "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/running" + "github.com/pubgo/funk/vars" + "github.com/rs/xid" + "github.com/samber/lo" + "github.com/pubgo/lava/v2/core/debug" "github.com/pubgo/lava/v2/core/supervisor" "github.com/pubgo/lava/v2/internal/logutil" - "google.golang.org/grpc/codes" + "github.com/pubgo/lava/v2/pkg/httputil" + "github.com/pubgo/lava/v2/pkg/netutil" ) type Params struct { @@ -29,7 +27,7 @@ type Params struct { func New(params Params) supervisor.Service { s := &Server{} s.init(params.Log, params.Conf) - return supervisor.NewService("tasks", s.Serve) + return supervisor.NewService(s.String(), s.Serve) } type Server struct { @@ -38,23 +36,29 @@ type Server struct { conf *Config } +func (s *Server) String() string { + return "tasks" +} + func (s *Server) Serve(ctx context.Context) error { defer func() { - logutil.LogOrErr(s.log, "[http-debug-server] Shutdown", func() error { - return s.httpServer.ShutdownWithTimeout(time.Second * 5) + logutil.LogOrErr(s.log, "[http-server] Shutdown", func() error { + err := s.httpServer.ShutdownWithContext(ctx) + if netutil.IsErrServerClosed(err) { + return nil + } + return err }) }() - httpLn := assert.Exit1(net.Listen("tcp", fmt.Sprintf(":%d", generic.FromPtr(s.conf.HttpPort)))) - s.log.Info().Msg("[http-debug-server] Server Starting") - logutil.LogOrErr(s.log, "[http-debug-server] Server Stop", func() error { - defer recovery.Exit() - if err := s.httpServer.Listener(httpLn); err != nil && - !errors.Is(err, http.ErrServerClosed) && - !errors.Is(err, net.ErrClosed) { - return err + addr := fmt.Sprintf(":%d", generic.FromPtr(s.conf.HttpPort)) + s.log.Info().Msg("[http-server] Server Starting") + async.GoDelay(func() error { + err := s.httpServer.Listen(addr) + if netutil.IsErrServerClosed(err) { + return nil } - return nil + return err }) <-ctx.Done() @@ -62,32 +66,13 @@ func (s *Server) Serve(ctx context.Context) error { } func (s *Server) init(log log.Logger, conf []*Config) { - s.log = log.WithName("tasks") + s.log = log.WithName(s.String()) + s.conf = lo.ToPtr(httputil.DefaultCfg(conf...)) - if len(conf) > 0 { - s.conf = conf[0] - } else { - s.conf = &Config{HttpPort: generic.Ptr(running.HttpPort)} - } - - s.httpServer = fiber.New(fiber.Config{ - EnableIPValidation: true, - ETag: true, - ErrorHandler: func(ctx *fiber.Ctx, err error) error { - if err == nil { - return nil - } - - errPb := errutil.ParseError(err) - if errPb == nil || errPb.Code.Code == 0 { - return nil - } - errPb.Trace.Operation = ctx.Route().Path - code := errutil.GrpcCodeToHTTP(codes.Code(errPb.Code.Code)) - ctx.Set(fiber.HeaderContentType, fiber.MIMEApplicationJSON) - return ctx.Status(code).JSON(errPb) - }, - }) + vars.RegisterValue(s.String()+"_config_"+xid.New().String(), s.conf) + cfg := s.conf.Http.Build().Must() + s.httpServer = fiber.New(cfg) + s.httpServer.Use(httputil.Cors()) s.httpServer.Mount("/debug", debug.App()) } From f81d8a7cda4cceca53723f266357a5b950b8bd0e Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 3 Sep 2025 21:45:24 +0800 Subject: [PATCH 130/142] fix: barry quick fix, 2025-09-03 21:45:24 --- cmds/taskcmd/cmd.go | 36 --------- core/logging/slog/log.go | 70 ++++++++++++++++++ core/logging/slog/z_log_test.go | 21 ++++++ go.mod | 1 + go.sum | 2 + internal/configs/components/grpc_server.yaml | 5 +- servers/tasks/config.go | 9 --- servers/tasks/server.go | 78 -------------------- 8 files changed, 95 insertions(+), 127 deletions(-) delete mode 100644 cmds/taskcmd/cmd.go create mode 100644 core/logging/slog/log.go create mode 100644 core/logging/slog/z_log_test.go delete mode 100644 servers/tasks/config.go delete mode 100644 servers/tasks/server.go diff --git a/cmds/taskcmd/cmd.go b/cmds/taskcmd/cmd.go deleted file mode 100644 index 4b98dccd8..000000000 --- a/cmds/taskcmd/cmd.go +++ /dev/null @@ -1,36 +0,0 @@ -package grpcservercmd - -import ( - "context" - - "github.com/pubgo/dix" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/version" - "github.com/urfave/cli/v3" - - "github.com/pubgo/lava/v2/core/lifecycle" - "github.com/pubgo/lava/v2/core/supervisor" - "github.com/pubgo/lava/v2/pkg/cmdutil" - "github.com/pubgo/lava/v2/servers/tasks" -) - -func New(di *dix.Dix) *cli.Command { - return &cli.Command{ - Name: "task", - Usage: cmdutil.UsageDesc("async task service %s(%s)", version.Project(), version.Version()), - Action: func(ctx context.Context, command *cli.Command) error { - di.Provide(tasks.New) - params := dix.Inject(di, new(struct { - LC lifecycle.Getter - Services []supervisor.Service - })) - - manager := supervisor.Default(params.LC) - for _, svc := range params.Services { - assert.Exit(manager.Add(svc)) - } - - return manager.Run() - }, - } -} diff --git a/core/logging/slog/log.go b/core/logging/slog/log.go new file mode 100644 index 000000000..e721b2668 --- /dev/null +++ b/core/logging/slog/log.go @@ -0,0 +1,70 @@ +package slog + +import ( + "context" + "log/slog" + + "github.com/pubgo/funk/log" + "github.com/pubgo/lava/v2/core/logging" + "github.com/rs/zerolog" + slogcommon "github.com/samber/slog-common" +) + +var logLevels = map[slog.Level]zerolog.Level{ + slog.LevelDebug: zerolog.DebugLevel, + slog.LevelInfo: zerolog.InfoLevel, + slog.LevelWarn: zerolog.WarnLevel, + slog.LevelError: zerolog.ErrorLevel, +} + +func init() { + logging.Register("slog", SetLogger) +} + +func SetLogger(logger log.Logger) { + slog.SetDefault(slog.New(&std{l: logger})) +} + +var _ slog.Handler = (*std)(nil) + +type std struct { + l log.Logger +} + +func (s *std) Enabled(ctx context.Context, level slog.Level) bool { + return true +} + +func (s *std) Handle(ctx context.Context, r slog.Record) error { + logger := s.l.WithCallerSkip(3).WithLevel(logLevels[r.Level]) + event := logger.Info(ctx) + switch r.Level { + case slog.LevelDebug: + event = logger.Debug(ctx) + case slog.LevelInfo: + case slog.LevelWarn: + event = logger.Warn(ctx) + case slog.LevelError: + event = logger.Error(ctx) + } + + if !r.Time.IsZero() { + event.Time(zerolog.TimestampFieldName, r.Time) + } + + r.Attrs(func(attr slog.Attr) bool { + event.Any(attr.Key, attr.Value.Any()) + return true + }) + + event.Msg(r.Message) + return nil +} + +func (s *std) WithAttrs(attrs []slog.Attr) slog.Handler { + return &std{l: s.l.WithFields(slogcommon.AttrsToMap(attrs...))} +} + +func (s *std) WithGroup(name string) slog.Handler { + return &std{l: s.l.WithName(name)} +} diff --git a/core/logging/slog/z_log_test.go b/core/logging/slog/z_log_test.go new file mode 100644 index 000000000..380328a5c --- /dev/null +++ b/core/logging/slog/z_log_test.go @@ -0,0 +1,21 @@ +package slog + +import ( + "log/slog" + "testing" + + "github.com/pubgo/funk/log" +) + +func TestName(t *testing.T) { + SetLogger(log.GetLogger("testing")) + + slog.Info("hello") + slog.With(slog.String("name", "abc")).Info("hello") + slog.With(slog.String("name", "abc")).Info("hello", "data-map", map[string]any{ + "abc": 1, + "hello": map[string]any{ + "world": 2, + }, + }) +} diff --git a/go.mod b/go.mod index 55562ce10..06434c2d7 100644 --- a/go.mod +++ b/go.mod @@ -60,6 +60,7 @@ require ( github.com/rs/xid v1.6.0 github.com/rs/zerolog v1.34.0 github.com/samber/lo v1.51.0 + github.com/samber/slog-common v0.19.0 github.com/stretchr/testify v1.10.0 github.com/thejerf/suture/v4 v4.0.6 github.com/uber-go/tally/v4 v4.1.17 diff --git a/go.sum b/go.sum index 27ecb7cbe..67046d432 100644 --- a/go.sum +++ b/go.sum @@ -541,6 +541,8 @@ github.com/ryanrolds/sqlclosecheck v0.5.1 h1:dibWW826u0P8jNLsLN+En7+RqWWTYrjCB9f github.com/ryanrolds/sqlclosecheck v0.5.1/go.mod h1:2g3dUjoS6AL4huFdv6wn55WpLIDjY7ZgUR4J8HOO/XQ= github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI= github.com/samber/lo v1.51.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= +github.com/samber/slog-common v0.19.0 h1:fNcZb8B2uOLooeYwFpAlKjkQTUafdjfqKcwcC89G9YI= +github.com/samber/slog-common v0.19.0/go.mod h1:dTz+YOU76aH007YUU0DffsXNsGFQRQllPQh9XyNoA3M= github.com/sanposhiho/wastedassign/v2 v2.0.7 h1:J+6nrY4VW+gC9xFzUc+XjPD3g3wF3je/NsJFwFK7Uxc= github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= diff --git a/internal/configs/components/grpc_server.yaml b/internal/configs/components/grpc_server.yaml index c38ce4c54..62a55b903 100644 --- a/internal/configs/components/grpc_server.yaml +++ b/internal/configs/components/grpc_server.yaml @@ -1,9 +1,6 @@ grpc_server: base_url: /welogin - enable_print_routes: true - enable_cors: ${GRPC_ENABLE_CORS:-false} - enable_ping_pong: true - ping_pong_time: 40 + enable_print_router: true # 256k ws_read_limit: 262144 diff --git a/servers/tasks/config.go b/servers/tasks/config.go deleted file mode 100644 index b7a8c7bb8..000000000 --- a/servers/tasks/config.go +++ /dev/null @@ -1,9 +0,0 @@ -package tasks - -import "github.com/pubgo/lava/v2/pkg/httputil" - -type Config = httputil.Config - -type HttpServerConfigLoader struct { - HttpServer *Config `yaml:"http_server"` -} diff --git a/servers/tasks/server.go b/servers/tasks/server.go deleted file mode 100644 index 8d5404aec..000000000 --- a/servers/tasks/server.go +++ /dev/null @@ -1,78 +0,0 @@ -package tasks - -import ( - "context" - "fmt" - "github.com/pubgo/funk/async" - - "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/vars" - "github.com/rs/xid" - "github.com/samber/lo" - - "github.com/pubgo/lava/v2/core/debug" - "github.com/pubgo/lava/v2/core/supervisor" - "github.com/pubgo/lava/v2/internal/logutil" - "github.com/pubgo/lava/v2/pkg/httputil" - "github.com/pubgo/lava/v2/pkg/netutil" -) - -type Params struct { - Log log.Logger - Conf []*Config -} - -func New(params Params) supervisor.Service { - s := &Server{} - s.init(params.Log, params.Conf) - return supervisor.NewService(s.String(), s.Serve) -} - -type Server struct { - log log.Logger - httpServer *fiber.App - conf *Config -} - -func (s *Server) String() string { - return "tasks" -} - -func (s *Server) Serve(ctx context.Context) error { - defer func() { - logutil.LogOrErr(s.log, "[http-server] Shutdown", func() error { - err := s.httpServer.ShutdownWithContext(ctx) - if netutil.IsErrServerClosed(err) { - return nil - } - return err - }) - }() - - addr := fmt.Sprintf(":%d", generic.FromPtr(s.conf.HttpPort)) - s.log.Info().Msg("[http-server] Server Starting") - async.GoDelay(func() error { - err := s.httpServer.Listen(addr) - if netutil.IsErrServerClosed(err) { - return nil - } - return err - }) - - <-ctx.Done() - return nil -} - -func (s *Server) init(log log.Logger, conf []*Config) { - s.log = log.WithName(s.String()) - s.conf = lo.ToPtr(httputil.DefaultCfg(conf...)) - - vars.RegisterValue(s.String()+"_config_"+xid.New().String(), s.conf) - - cfg := s.conf.Http.Build().Must() - s.httpServer = fiber.New(cfg) - s.httpServer.Use(httputil.Cors()) - s.httpServer.Mount("/debug", debug.App()) -} From e6f3fc6a1e6e52c49d8577b9f2cc50d050ea4d7f Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 3 Sep 2025 21:47:59 +0800 Subject: [PATCH 131/142] fix: barry quick fix, 2025-09-03 21:47:59 --- core/logging/{ => logext}/slog/log.go | 0 core/logging/{ => logext}/slog/z_log_test.go | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename core/logging/{ => logext}/slog/log.go (100%) rename core/logging/{ => logext}/slog/z_log_test.go (100%) diff --git a/core/logging/slog/log.go b/core/logging/logext/slog/log.go similarity index 100% rename from core/logging/slog/log.go rename to core/logging/logext/slog/log.go diff --git a/core/logging/slog/z_log_test.go b/core/logging/logext/slog/z_log_test.go similarity index 100% rename from core/logging/slog/z_log_test.go rename to core/logging/logext/slog/z_log_test.go From 3f6d04821a64e5ac6b580993ce605c40f50b9541 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 3 Sep 2025 22:00:13 +0800 Subject: [PATCH 132/142] fix: barry quick fix, 2025-09-03 22:00:13 --- core/metrics/metricbuilder/vars.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/metrics/metricbuilder/vars.go b/core/metrics/metricbuilder/vars.go index f9e98bb13..eec0b7f92 100644 --- a/core/metrics/metricbuilder/vars.go +++ b/core/metrics/metricbuilder/vars.go @@ -8,7 +8,7 @@ import ( ) func registerVars(m metrics.Metric) { - vars.Register(metrics.Name+"_capabilities", func() interface{} { + vars.Register(vars.UniqueName(metrics.Name, "capabilities"), func() interface{} { c := m.Capabilities() return typex.Ctx{ "reporting": c.Reporting(), @@ -16,7 +16,7 @@ func registerVars(m metrics.Metric) { } }) - vars.Register(metrics.Name+"_snapshot", func() interface{} { + vars.Register(vars.UniqueName(metrics.Name, "snapshot"), func() interface{} { if c, ok := m.(tally.TestScope); ok { // TODO 数据序列化处理 return c.Snapshot() From afffc2b8ed43c33ff19f160bff18ef6db69b0ab3 Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 4 Sep 2025 22:14:58 +0800 Subject: [PATCH 133/142] fix: barry quick fix, 2025-09-04 22:14:58 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 06434c2d7..0a9195064 100644 --- a/go.mod +++ b/go.mod @@ -55,7 +55,7 @@ require ( github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.65.0 github.com/pubgo/dix v0.3.21 - github.com/pubgo/funk v0.5.69-alpha.14 + github.com/pubgo/funk v0.5.69-alpha.15 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.6.0 github.com/rs/zerolog v1.34.0 diff --git a/go.sum b/go.sum index 67046d432..7f714b8d6 100644 --- a/go.sum +++ b/go.sum @@ -506,8 +506,8 @@ github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7D github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/pubgo/dix v0.3.21 h1:jtriLYT6srKrxv0KRwic1no0d9ZTMtLx6r3JJxQ5Jvw= github.com/pubgo/dix v0.3.21/go.mod h1:5qHJ7ycvBVw1AUjgYMEsobzx1tggiRs+spgzd4Jglb4= -github.com/pubgo/funk v0.5.69-alpha.14 h1:Y6H11YYJ4gKTaEsPfs/zOWvlLVj17POr5I5A0pPVpd8= -github.com/pubgo/funk v0.5.69-alpha.14/go.mod h1:mWqaZftfwVoZk/qhLqb/S3iCa1LR7QKIMh3HsABCIjo= +github.com/pubgo/funk v0.5.69-alpha.15 h1:ezN43R9fex4n23DuHq6XP5ZwaKWB5jDzeMqhgV+xd9Y= +github.com/pubgo/funk v0.5.69-alpha.15/go.mod h1:mWqaZftfwVoZk/qhLqb/S3iCa1LR7QKIMh3HsABCIjo= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/pubgo/protobuild v0.0.21 h1:QSwh92QxsD6Mv7kQlowzE7fxtcOm1eMWmgADsD803Js= From 75d8577752a99aee8c4dd6f90af12101082fc212 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 6 Sep 2025 19:50:53 +0800 Subject: [PATCH 134/142] fix: barry quick fix, 2025-09-06 19:50:53 --- core/debug/debug/mux.go | 2 +- core/lavabuilder/builder.go | 1 + core/logging/logbuilder/builder.go | 16 ++++----- core/logging/logext/slog/log.go | 3 +- core/scheduler/builder.go | 54 +++++++++++++----------------- go.mod | 3 +- go.sum | 6 ++-- 7 files changed, 38 insertions(+), 47 deletions(-) diff --git a/core/debug/debug/mux.go b/core/debug/debug/mux.go index 395ec2689..99ecdb8c1 100644 --- a/core/debug/debug/mux.go +++ b/core/debug/debug/mux.go @@ -26,7 +26,7 @@ var ( ) func init() { - log.Info().Str("password", running.InstanceID).Msg("debug password") + log.Info().Str("password", passwd).Msg("debug password") debug.App().Use(func(c *fiber.Ctx) (gErr error) { defer recovery.Recovery(func(err error) { err = errors.WrapTag(err, diff --git a/core/lavabuilder/builder.go b/core/lavabuilder/builder.go index 5ad03162d..9d0b74111 100644 --- a/core/lavabuilder/builder.go +++ b/core/lavabuilder/builder.go @@ -47,6 +47,7 @@ import ( // logging _ "github.com/pubgo/lava/v2/core/logging/logext/grpclog" + _ "github.com/pubgo/lava/v2/core/logging/logext/slog" _ "github.com/pubgo/lava/v2/core/logging/logext/stdlog" _ "go.uber.org/automaxprocs" diff --git a/core/logging/logbuilder/builder.go b/core/logging/logbuilder/builder.go index 8b389dbb2..dd2ba4214 100644 --- a/core/logging/logbuilder/builder.go +++ b/core/logging/logbuilder/builder.go @@ -6,26 +6,24 @@ import ( "time" "github.com/pubgo/funk/log" + "github.com/pubgo/funk/pretty" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/result" "github.com/pubgo/funk/running" - "github.com/pubgo/funk/stack" + "github.com/rs/zerolog" + "github.com/pubgo/lava/v2/core/logging" "github.com/pubgo/lava/v2/core/logging/logkey" - "github.com/rs/zerolog" ) var GlobalHook zerolog.Hook -func init() { - zerolog.CallerMarshalFunc = func(pc uintptr, file string, line int) string { - return stack.Stack(pc).Short() - } -} - // New logger func New(cfg *logging.Config, hooks []zerolog.Hook) log.Logger { - defer recovery.Exit() + defer recovery.Exit(func(err error) error { + pretty.Println(cfg) + return err + }) level := zerolog.DebugLevel if cfg.Level != "" { diff --git a/core/logging/logext/slog/log.go b/core/logging/logext/slog/log.go index e721b2668..70fbab7b7 100644 --- a/core/logging/logext/slog/log.go +++ b/core/logging/logext/slog/log.go @@ -10,6 +10,7 @@ import ( slogcommon "github.com/samber/slog-common" ) +var evt = log.NewEvent().Str("ext", "slog") var logLevels = map[slog.Level]zerolog.Level{ slog.LevelDebug: zerolog.DebugLevel, slog.LevelInfo: zerolog.InfoLevel, @@ -22,7 +23,7 @@ func init() { } func SetLogger(logger log.Logger) { - slog.SetDefault(slog.New(&std{l: logger})) + slog.SetDefault(slog.New(&std{l: logger.WithEvent(evt)})) } var _ slog.Handler = (*std)(nil) diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index 81c66e3c5..8a3fd56fa 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -2,12 +2,15 @@ package scheduler import ( "context" + "log/slog" "github.com/pubgo/funk/log" + "github.com/pubgo/funk/log/logfields" "github.com/pubgo/funk/v2/result" "github.com/pubgo/funk/vars" qlog "github.com/reugn/go-quartz/logger" "github.com/reugn/go-quartz/quartz" + "github.com/rs/zerolog" "github.com/pubgo/lava/v2/core/lifecycle" "github.com/pubgo/lava/v2/core/metrics" @@ -50,43 +53,34 @@ func NewService(params Params) (ResponseParams, error) { } func New(m lifecycle.Lifecycle, logger log.Logger, metric metrics.Metric, configs []*Config, routers []JobRegister, executors []JobExecutor) (_ *Scheduler, gErr error) { - configMap := createConfig(configs) - configMap.InspectErr(func(err error) { - log.Err(err).Any("configs", configs).Msg("failed to create config") - }) - if configMap.Catch(&gErr) { - return - } + defer result.Recovery(&gErr) + configMap := createConfig(configs). + Log(func(e *zerolog.Event) { + e.Any("configs", configs) + e.Any(logfields.Msg, "failed to create config") + }). + Must() - scheduler := result.WrapFn(func() (quartz.Scheduler, error) { - return quartz.NewStdScheduler( - quartz.WithLogger(qlog.NewSimpleLogger(schedulerLog, qlog.LevelInfo)), - quartz.WithJobMetadata(), - ) - }) - scheduler.InspectErr(func(err error) { - log.Err(err).Msg("failed to create scheduler") - }) - if scheduler.Catch(&gErr) { - return - } + ctx, cancel := context.WithCancel(context.Background()) + + slogLogger := qlog.NewSlogLogger(ctx, slog.With(slog.String(logfields.Module, Name))) + scheduler := result.Wrap(quartz.NewStdScheduler(quartz.WithLogger(slogLogger), quartz.WithJobMetadata())). + Log(func(e *zerolog.Event) { + e.Str(logfields.Msg, "failed to create scheduler") + }). + Must() jobExecutors := make(map[string]JobExecutor) for _, executor := range executors { - regRes := regJobExecutor(jobExecutors, executor) - regRes.InspectErr(func(err error) { - log.Err(err).Msg("failed to register job executor") - }) - if regRes.Catch(&gErr) { - return - } + regJobExecutor(jobExecutors, executor).Log(func(e *zerolog.Event) { + e.Str(logfields.Msg, "failed to register job executor") + }).Must() } - ctx, cancel := context.WithCancel(context.Background()) quart := &Scheduler{ metric: metric, - configMap: configMap.Must(), - scheduler: scheduler.Must(), + configMap: configMap, + scheduler: scheduler, log: logger.WithName(Name), ctx: ctx, cancel: cancel, @@ -101,7 +95,7 @@ func New(m lifecycle.Lifecycle, logger log.Logger, metric metrics.Metric, config quart.start() m.BeforeStop(lifecycle.WrapNoCtxErr(quart.stop)) - vars.Register(Name, func() interface{} { + vars.Register(vars.UniqueName(Name), func() interface{} { return quart.ListJobs() }) diff --git a/go.mod b/go.mod index 0a9195064..209e6fe6e 100644 --- a/go.mod +++ b/go.mod @@ -55,7 +55,7 @@ require ( github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.65.0 github.com/pubgo/dix v0.3.21 - github.com/pubgo/funk v0.5.69-alpha.15 + github.com/pubgo/funk v0.5.69-alpha.18 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.6.0 github.com/rs/zerolog v1.34.0 @@ -231,7 +231,6 @@ require ( github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect - github.com/phuslu/goid v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/polyfloyd/go-errorlint v1.6.0 // indirect github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 // indirect diff --git a/go.sum b/go.sum index 7f714b8d6..ee7e66c05 100644 --- a/go.sum +++ b/go.sum @@ -479,8 +479,6 @@ github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNH github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= -github.com/phuslu/goid v1.0.2 h1:NfPgJ5gJoAhQYCSp6DTbnPvHQYjPBjTyFiBeNu3jvMw= -github.com/phuslu/goid v1.0.2/go.mod h1:txc2fUIdrdnn+v9Vq+QpiPQ3dnrXEchjoVDgic+r+L0= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -506,8 +504,8 @@ github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7D github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/pubgo/dix v0.3.21 h1:jtriLYT6srKrxv0KRwic1no0d9ZTMtLx6r3JJxQ5Jvw= github.com/pubgo/dix v0.3.21/go.mod h1:5qHJ7ycvBVw1AUjgYMEsobzx1tggiRs+spgzd4Jglb4= -github.com/pubgo/funk v0.5.69-alpha.15 h1:ezN43R9fex4n23DuHq6XP5ZwaKWB5jDzeMqhgV+xd9Y= -github.com/pubgo/funk v0.5.69-alpha.15/go.mod h1:mWqaZftfwVoZk/qhLqb/S3iCa1LR7QKIMh3HsABCIjo= +github.com/pubgo/funk v0.5.69-alpha.18 h1:jZnB7e3FXupsF1dJxV06IU3DwZBYpw2byXB8HX1+uyY= +github.com/pubgo/funk v0.5.69-alpha.18/go.mod h1:mWqaZftfwVoZk/qhLqb/S3iCa1LR7QKIMh3HsABCIjo= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/pubgo/protobuild v0.0.21 h1:QSwh92QxsD6Mv7kQlowzE7fxtcOm1eMWmgADsD803Js= From 1ae2b86a20733e72ec5bb00d4a56ea7c2352f06b Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 6 Sep 2025 22:19:19 +0800 Subject: [PATCH 135/142] fix: barry quick fix, 2025-09-06 22:19:19 --- cmds/schedulercmd/cmd.go | 3 +- core/lavabuilder/builder.go | 6 -- core/logging/config.go | 1 + core/logging/logbuilder/builder.go | 42 ++++++++++++-- core/logging/logext/gologr/log.go | 2 +- core/logging/logext/grpclog/log.go | 7 +-- core/logging/logext/slog/log.go | 57 +------------------ core/logging/logext/stdlog/log.go | 4 +- core/scheduler/aaa.go | 6 +- core/scheduler/builder.go | 19 ------- core/scheduler/schedulerbuilder/builder.go | 30 ++++++++++ go.mod | 6 +- go.sum | 4 +- internal/configs/components/logger.yaml | 2 + .../middleware_recovery/middleware.go | 7 +-- pkg/httputil/header.go | 55 ++---------------- servers/https/httprouter/router.go | 4 +- servers/https/request.go | 2 +- servers/https/server.go | 30 +++------- 19 files changed, 103 insertions(+), 184 deletions(-) create mode 100644 core/scheduler/schedulerbuilder/builder.go diff --git a/cmds/schedulercmd/cmd.go b/cmds/schedulercmd/cmd.go index 58af1b6cb..4427c235a 100644 --- a/cmds/schedulercmd/cmd.go +++ b/cmds/schedulercmd/cmd.go @@ -10,6 +10,7 @@ import ( "github.com/pubgo/lava/v2/core/lifecycle" "github.com/pubgo/lava/v2/core/scheduler" + "github.com/pubgo/lava/v2/core/scheduler/schedulerbuilder" "github.com/pubgo/lava/v2/core/scheduler/schedulerdebug" "github.com/pubgo/lava/v2/core/supervisor" "github.com/pubgo/lava/v2/pkg/cmdutil" @@ -21,7 +22,7 @@ func New(di *dix.Dix) *cli.Command { Name: "scheduler", Usage: cmdutil.UsageDesc("crontab scheduler service %s(%s)", version.Project(), version.Version()), Action: func(ctx context.Context, command *cli.Command) error { - di.Provide(scheduler.NewService) + di.Provide(schedulerbuilder.NewService) di.Provide(https.New) params := dix.Inject(di, new(struct { LC lifecycle.Getter diff --git a/core/lavabuilder/builder.go b/core/lavabuilder/builder.go index 9d0b74111..6777c6d5f 100644 --- a/core/lavabuilder/builder.go +++ b/core/lavabuilder/builder.go @@ -23,10 +23,7 @@ import ( "github.com/pubgo/lava/v2/core/lifecycle/lifecyclebuilder" "github.com/pubgo/lava/v2/core/logging/logbuilder" "github.com/pubgo/lava/v2/core/metrics/metricbuilder" - "github.com/pubgo/lava/v2/core/scheduler" "github.com/pubgo/lava/v2/core/signal" - "github.com/pubgo/lava/v2/internal/middlewares/middleware_accesslog" - "github.com/pubgo/lava/v2/internal/middlewares/middleware_metric" "github.com/pubgo/lava/v2/pkg/cmdutil" _ "github.com/pubgo/lava/v2/core/debug/debug" @@ -58,13 +55,10 @@ var defaultProviders = []any{ grpccresolver.NewDiscoveryBuilder, discovery.NewNoopDiscovery, - middleware_accesslog.New, - middleware_metric.New, logbuilder.New, metricbuilder.New, lifecyclebuilder.New, - scheduler.New, } func New(opts ...dix.Option) *dix.Dix { diff --git a/core/logging/config.go b/core/logging/config.go index b5dd4a6c1..7ad69e4e8 100644 --- a/core/logging/config.go +++ b/core/logging/config.go @@ -8,4 +8,5 @@ type Config struct { Level string `yaml:"level"` AsJson bool `yaml:"as_json"` DisableLoggers []string `yaml:"disable_loggers"` + Filters []string `yaml:"filters"` } diff --git a/core/logging/logbuilder/builder.go b/core/logging/logbuilder/builder.go index dd2ba4214..d12a525eb 100644 --- a/core/logging/logbuilder/builder.go +++ b/core/logging/logbuilder/builder.go @@ -1,16 +1,23 @@ package logbuilder import ( + "context" "io" "os" + "strings" "time" + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/vm" + "github.com/pubgo/funk/assert" "github.com/pubgo/funk/log" + "github.com/pubgo/funk/log/logfields" "github.com/pubgo/funk/pretty" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/result" "github.com/pubgo/funk/running" "github.com/rs/zerolog" + "github.com/samber/lo" "github.com/pubgo/lava/v2/core/logging" "github.com/pubgo/lava/v2/core/logging/logkey" @@ -56,14 +63,30 @@ func New(cfg *logging.Config, hooks []zerolog.Hook) log.Logger { ee = ee.Str(logkey.Namespace, running.Namespace) } - logger = ee.Logger() - log.SetLogger(&logger) + filters := lo.Filter(cfg.Filters, func(item string, index int) bool { return strings.TrimSpace(item) != "" }) + if len(filters) > 0 { + expCode := strings.Join(filters, " && ") + log.Info().Str(logfields.Msg, "log filter expr").Msg(expCode) - gl := log.New(&logger) + exp := exprFilter(expCode) + log.SetEnableChecker(func(ctx context.Context, lvl log.Level, name, message string, fields log.Map) bool { + envData := map[string]any{"level": lvl.String(), "msg": message, "name": name, "fields": fields} + output, err := expr.Run(exp, envData) + if err != nil { + log.Err(err).Str("expr", expCode).Msg("failed to run log filter expr") + } + return err == nil && output.(bool) + }) + } + + log.SetLogger(lo.ToPtr(ee.Logger())) + + gl := log.GetLogger("ext") for _, ext := range logging.List() { ext(gl) } - return gl + + return log.GetLogger() } type writer struct { @@ -79,3 +102,14 @@ func (w writer) Write(p []byte) (n int, err error) { return } + +func exprFilter(code string) *vm.Program { + env := map[string]interface{}{"level": "", "name": "", "msg": "", "fields": log.Map{}} + + program, err := expr.Compile(code, expr.Env(env)) + if err != nil { + log.Err(err).Str("expr", code).Msg("failed to compile log filter expr") + assert.Exit(err, code) + } + return program +} diff --git a/core/logging/logext/gologr/log.go b/core/logging/logext/gologr/log.go index 8b2a94adb..395194340 100644 --- a/core/logging/logext/gologr/log.go +++ b/core/logging/logext/gologr/log.go @@ -26,7 +26,7 @@ var ( ) func NewSink(l log.Logger) *LogSink { - return &LogSink{l: l} + return &LogSink{l: l.WithName("logr")} } func (ls *LogSink) Init(ri logr.RuntimeInfo) { diff --git a/core/logging/logext/grpclog/log.go b/core/logging/logext/grpclog/log.go index 589687c4c..cc969e61f 100644 --- a/core/logging/logext/grpclog/log.go +++ b/core/logging/logext/grpclog/log.go @@ -32,16 +32,15 @@ func grpcComponentName(args interface{}) func(e *zerolog.Event) { } } -var evt = log.NewEvent().Str("ext", "grpc") - func init() { logging.Register("grpcLog", SetLogger) } func SetLogger(logger log.Logger) { + logger = logger.WithName("grpc").WithCallerSkip(2) grpclog.SetLoggerV2(&loggerWrapper{ - log: logger.WithEvent(evt).WithCallerSkip(2), - depthLog: logger.WithEvent(evt).WithCallerSkip(2), + log: logger, + depthLog: logger, }) } diff --git a/core/logging/logext/slog/log.go b/core/logging/logext/slog/log.go index 70fbab7b7..1a1cb818a 100644 --- a/core/logging/logext/slog/log.go +++ b/core/logging/logext/slog/log.go @@ -1,71 +1,16 @@ package slog import ( - "context" "log/slog" "github.com/pubgo/funk/log" "github.com/pubgo/lava/v2/core/logging" - "github.com/rs/zerolog" - slogcommon "github.com/samber/slog-common" ) -var evt = log.NewEvent().Str("ext", "slog") -var logLevels = map[slog.Level]zerolog.Level{ - slog.LevelDebug: zerolog.DebugLevel, - slog.LevelInfo: zerolog.InfoLevel, - slog.LevelWarn: zerolog.WarnLevel, - slog.LevelError: zerolog.ErrorLevel, -} - func init() { logging.Register("slog", SetLogger) } func SetLogger(logger log.Logger) { - slog.SetDefault(slog.New(&std{l: logger.WithEvent(evt)})) -} - -var _ slog.Handler = (*std)(nil) - -type std struct { - l log.Logger -} - -func (s *std) Enabled(ctx context.Context, level slog.Level) bool { - return true -} - -func (s *std) Handle(ctx context.Context, r slog.Record) error { - logger := s.l.WithCallerSkip(3).WithLevel(logLevels[r.Level]) - event := logger.Info(ctx) - switch r.Level { - case slog.LevelDebug: - event = logger.Debug(ctx) - case slog.LevelInfo: - case slog.LevelWarn: - event = logger.Warn(ctx) - case slog.LevelError: - event = logger.Error(ctx) - } - - if !r.Time.IsZero() { - event.Time(zerolog.TimestampFieldName, r.Time) - } - - r.Attrs(func(attr slog.Attr) bool { - event.Any(attr.Key, attr.Value.Any()) - return true - }) - - event.Msg(r.Message) - return nil -} - -func (s *std) WithAttrs(attrs []slog.Attr) slog.Handler { - return &std{l: s.l.WithFields(slogcommon.AttrsToMap(attrs...))} -} - -func (s *std) WithGroup(name string) slog.Handler { - return &std{l: s.l.WithName(name)} + slog.SetDefault(slog.New(log.NewSlog(logger.WithName("slog")))) } diff --git a/core/logging/logext/stdlog/log.go b/core/logging/logext/stdlog/log.go index 76d9ccf8e..475175562 100644 --- a/core/logging/logext/stdlog/log.go +++ b/core/logging/logext/stdlog/log.go @@ -10,8 +10,6 @@ import ( "github.com/pubgo/lava/v2/core/logging" ) -var evt = logger.NewEvent().Str("ext", "std") - func init() { logging.Register("stdLog", SetLogger) } @@ -21,7 +19,7 @@ func SetLogger(logger logger.Logger) { stdLog := log.Default() // 接管系统默认log - *stdLog = *log.New(&std{l: logger.WithEvent(evt).WithCallerSkip(3)}, "", 0) + *stdLog = *log.New(&std{l: logger.WithName("std").WithCallerSkip(3)}, "", 0) } var _ io.Writer = (*std)(nil) diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index 0b3c73185..0144a5237 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -2,8 +2,6 @@ package scheduler import ( "context" - stdLog "log" - "os" "time" "github.com/pubgo/funk/clone" @@ -13,8 +11,6 @@ import ( "go.uber.org/atomic" ) -var schedulerLog = stdLog.New(os.Stdout, "scheduler", stdLog.LstdFlags|stdLog.Lmsgprefix|stdLog.Lshortfile) - type JobExecutor interface { Name() string Exec(ctx context.Context, name string, metadata *JobMetadata) result.Result[[]byte] @@ -95,7 +91,7 @@ type jobTask struct { runs atomic.Uint64 jobKey *quartz.JobKey status Status - + result result.Result[[]byte] } diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index 8a3fd56fa..b2a17ef4b 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -33,25 +33,6 @@ type ResponseParams struct { Manager JobManager } -func NewService(params Params) (ResponseParams, error) { - s, err := New( - params.M, - params.Log, - params.Metric, - params.Configs, - params.Routers, - params.Executors, - ) - if err != nil { - return ResponseParams{}, err - } - - return ResponseParams{ - Service: supervisor.NewService(Name, s.Serve), - Manager: s, - }, nil -} - func New(m lifecycle.Lifecycle, logger log.Logger, metric metrics.Metric, configs []*Config, routers []JobRegister, executors []JobExecutor) (_ *Scheduler, gErr error) { defer result.Recovery(&gErr) configMap := createConfig(configs). diff --git a/core/scheduler/schedulerbuilder/builder.go b/core/scheduler/schedulerbuilder/builder.go new file mode 100644 index 000000000..66a368225 --- /dev/null +++ b/core/scheduler/schedulerbuilder/builder.go @@ -0,0 +1,30 @@ +package schedulerbuilder + +import ( + "github.com/pubgo/lava/v2/core/scheduler" + "github.com/pubgo/lava/v2/core/supervisor" +) + +type ResponseParams struct { + Service supervisor.Service + Manager scheduler.JobManager +} + +func NewService(params scheduler.Params) (ResponseParams, error) { + s, err := scheduler.New( + params.M, + params.Log, + params.Metric, + params.Configs, + params.Routers, + params.Executors, + ) + if err != nil { + return ResponseParams{}, err + } + + return ResponseParams{ + Service: supervisor.NewService(scheduler.Name, s.Serve), + Manager: s, + }, nil +} diff --git a/go.mod b/go.mod index 209e6fe6e..702daed0f 100644 --- a/go.mod +++ b/go.mod @@ -40,6 +40,7 @@ require ( github.com/alecthomas/participle/v2 v2.1.4 github.com/arl/statsviz v0.7.1 github.com/ecordell/optgen v0.0.9 + github.com/expr-lang/expr v1.17.5 github.com/fasthttp/websocket v1.5.12 github.com/felixge/fgprof v0.9.5 github.com/fullstorydev/grpchan v1.1.1 @@ -55,12 +56,11 @@ require ( github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.65.0 github.com/pubgo/dix v0.3.21 - github.com/pubgo/funk v0.5.69-alpha.18 + github.com/pubgo/funk v0.5.69-alpha.19 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.6.0 github.com/rs/zerolog v1.34.0 github.com/samber/lo v1.51.0 - github.com/samber/slog-common v0.19.0 github.com/stretchr/testify v1.10.0 github.com/thejerf/suture/v4 v4.0.6 github.com/uber-go/tally/v4 v4.1.17 @@ -130,7 +130,6 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/denis-tingaikin/go-header v0.5.0 // indirect github.com/ettle/strcase v0.2.0 // indirect - github.com/expr-lang/expr v1.17.5 // indirect github.com/fatih/color v1.18.0 // indirect github.com/fatih/structtag v1.2.0 // indirect github.com/firefart/nonamedreturns v1.0.5 // indirect @@ -245,6 +244,7 @@ require ( github.com/rogpeppe/go-internal v1.14.1 // indirect github.com/ryancurrah/gomodguard v1.3.5 // indirect github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect + github.com/samber/slog-common v0.19.0 // indirect github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect github.com/sashamelentyev/interfacebloat v1.1.0 // indirect diff --git a/go.sum b/go.sum index ee7e66c05..60cae647e 100644 --- a/go.sum +++ b/go.sum @@ -504,8 +504,8 @@ github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7D github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/pubgo/dix v0.3.21 h1:jtriLYT6srKrxv0KRwic1no0d9ZTMtLx6r3JJxQ5Jvw= github.com/pubgo/dix v0.3.21/go.mod h1:5qHJ7ycvBVw1AUjgYMEsobzx1tggiRs+spgzd4Jglb4= -github.com/pubgo/funk v0.5.69-alpha.18 h1:jZnB7e3FXupsF1dJxV06IU3DwZBYpw2byXB8HX1+uyY= -github.com/pubgo/funk v0.5.69-alpha.18/go.mod h1:mWqaZftfwVoZk/qhLqb/S3iCa1LR7QKIMh3HsABCIjo= +github.com/pubgo/funk v0.5.69-alpha.19 h1:yyGzMzlbPsBlLY+XQlY3mUVLGMii4IlQyE5YYe1+yMk= +github.com/pubgo/funk v0.5.69-alpha.19/go.mod h1:SZGEVvRPkPo2HQ9TTQS/HfXpQVM+oVDHw3i4pj1/6y0= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/pubgo/protobuild v0.0.21 h1:QSwh92QxsD6Mv7kQlowzE7fxtcOm1eMWmgADsD803Js= diff --git a/internal/configs/components/logger.yaml b/internal/configs/components/logger.yaml index bb4e3154d..60acd39ab 100644 --- a/internal/configs/components/logger.yaml +++ b/internal/configs/components/logger.yaml @@ -1,3 +1,5 @@ logger: level: ${LOG_LEVEL:-"debug"} as_json: ${LOG_AS_JSON:-false} + filters: + - level not in ["debug"] diff --git a/internal/middlewares/middleware_recovery/middleware.go b/internal/middlewares/middleware_recovery/middleware.go index 0440d1dfa..9618ef3d0 100644 --- a/internal/middlewares/middleware_recovery/middleware.go +++ b/internal/middlewares/middleware_recovery/middleware.go @@ -2,10 +2,8 @@ package middleware_recovery import ( "context" - "runtime/debug" "github.com/pubgo/funk/errors" - "github.com/pubgo/lava/v2/lava" ) @@ -15,10 +13,7 @@ func New() lava.Middleware { Next: func(next lava.HandlerFunc) lava.HandlerFunc { return func(ctx context.Context, req lava.Request) (rsp lava.Response, gErr error) { defer func() { - if err := errors.Parse(recover()); err != nil { - debug.PrintStack() - gErr = errors.WrapStack(err) - } + gErr = errors.WrapStack(errors.Parse(recover())) }() return next(ctx, req) diff --git a/pkg/httputil/header.go b/pkg/httputil/header.go index 5af8f005b..58b86896f 100644 --- a/pkg/httputil/header.go +++ b/pkg/httputil/header.go @@ -1,40 +1,17 @@ package httputil +import "github.com/gofiber/fiber/v2" + // HTTP Headers were copied from net/http. const ( - HeaderAuthorization = "Authorization" - HeaderProxyAuthenticate = "Proxy-Authenticate" - HeaderProxyAuthorization = "Proxy-Authorization" - HeaderWWWAuthenticate = "WWW-Authenticate" - HeaderAge = "Age" - HeaderCacheControl = "Cache-Control" - HeaderClearSiteData = "Clear-Site-Data" - HeaderExpires = "Expires" - HeaderPragma = "Pragma" - HeaderWarning = "Warning" - HeaderAcceptCH = "Accept-CH" - HeaderAcceptCHLifetime = "Accept-CH-Lifetime" - HeaderContentDPR = "Content-DPR" - HeaderDPR = "DPR" - HeaderEarlyData = "Early-Data" - HeaderSaveData = "Save-Data" - HeaderViewportWidth = "Viewport-Width" - HeaderWidth = "Width" - HeaderETag = "ETag" - HeaderIfMatch = "If-Match" - HeaderIfModifiedSince = "If-Modified-Since" - HeaderIfNoneMatch = "If-None-Match" - HeaderIfUnmodifiedSince = "If-Unmodified-Since" - HeaderLastModified = "Last-Modified" - HeaderVary = "Vary" - HeaderConnection = "Connection" - HeaderKeepAlive = "Keep-Alive" + HeaderAuthorization = fiber.HeaderAuthorization + HeaderConnection = fiber.HeaderConnection + HeaderKeepAlive = fiber.HeaderKeepAlive HeaderAccept = "Accept" HeaderAcceptCharset = "Accept-Charset" HeaderAcceptEncoding = "Accept-Encoding" HeaderAcceptLanguage = "Accept-Language" HeaderCookie = "Cookie" - HeaderExpect = "Expect" HeaderMaxForwards = "Max-Forwards" HeaderSetCookie = "Set-Cookie" HeaderAccessControlAllowCredentials = "Access-Control-Allow-Credentials" @@ -47,9 +24,6 @@ const ( HeaderAccessControlRequestMethod = "Access-Control-Request-Method" HeaderOrigin = "Origin" HeaderTimingAllowOrigin = "Timing-Allow-Origin" - HeaderXPermittedCrossDomainPolicies = "X-Permitted-Cross-Domain-Policies" - HeaderDNT = "DNT" - HeaderTk = "Tk" HeaderContentDisposition = "Content-Disposition" HeaderContentEncoding = "Content-Encoding" HeaderContentLanguage = "Content-Language" @@ -57,7 +31,6 @@ const ( HeaderContentLocation = "Content-Location" HeaderContentType = "Content-Type" HeaderForwarded = "Forwarded" - HeaderVia = "Via" HeaderXForwardedFor = "X-Forwarded-For" HeaderXForwardedHost = "X-Forwarded-Host" HeaderXForwardedProto = "X-Forwarded-Proto" @@ -79,10 +52,7 @@ const ( HeaderContentSecurityPolicy = "Content-Security-Policy" HeaderContentSecurityPolicyReportOnly = "Content-Security-Policy-Report-Only" HeaderCrossOriginResourcePolicy = "Cross-Origin-Resource-Policy" - HeaderExpectCT = "Expect-CT" HeaderFeaturePolicy = "Feature-Policy" - HeaderPublicKeyPins = "Public-Key-Pins" - HeaderPublicKeyPinsReportOnly = "Public-Key-Pins-Report-Only" HeaderStrictTransportSecurity = "Strict-Transport-Security" HeaderUpgradeInsecureRequests = "Upgrade-Insecure-Requests" HeaderXContentTypeOptions = "X-Content-Type-Options" @@ -91,11 +61,6 @@ const ( HeaderXPoweredBy = "X-Powered-By" HeaderXXSSProtection = "X-XSS-Protection" HeaderLastEventID = "Last-Event-ID" - HeaderNEL = "NEL" - HeaderPingFrom = "Ping-From" - HeaderPingTo = "Ping-To" - HeaderReportTo = "Report-To" - HeaderTE = "TE" HeaderTrailer = "Trailer" HeaderTransferEncoding = "Transfer-Encoding" HeaderSecWebSocketAccept = "Sec-WebSocket-Accept" @@ -106,27 +71,19 @@ const ( HeaderAcceptPatch = "Accept-Patch" HeaderAcceptPushPolicy = "Accept-Push-Policy" HeaderAcceptSignature = "Accept-Signature" - HeaderAltSvc = "Alt-Svc" HeaderDate = "Date" - HeaderIndex = "index" HeaderLargeAllocation = "Large-Allocation" HeaderLink = "Link" HeaderPushPolicy = "Push-Policy" HeaderRetryAfter = "Backoff-After" HeaderServerTiming = "Server-Timing" HeaderSignature = "Signature" - HeaderSignedHeaders = "Signed-Headers" - HeaderSourceMap = "SourceMap" - HeaderUpgrade = "Upgrade" - HeaderXDNSPrefetchControl = "X-DNS-Prefetch-Control" - HeaderXPingback = "X-Pingback" - HeaderXRequestID = "X-Request-ID" + HeaderXRequestID = fiber.HeaderXRequestID HeaderXRequestProject = "X-Request-Project" HeaderXRequestVersion = "X-Request-Version" HeaderXRequestOperation = "X-Request-Operation" HeaderAuthAct = "X-Request-Auth-Act" HeaderXRequestedWith = "X-Requested-With" - HeaderXRobotsTag = "X-Robots-Tag" HeaderXUACompatible = "X-UA-Compatible" HeaderVersion = "X-Api-Version" HeaderTrace = "X-Api-Trace" diff --git a/servers/https/httprouter/router.go b/servers/https/httprouter/router.go index 6fc458d1e..252f42d27 100644 --- a/servers/https/httprouter/router.go +++ b/servers/https/httprouter/router.go @@ -17,11 +17,11 @@ func WrapHandler[Req, Rsp any](handle func(ctx *fiber.Ctx, req *Req) (rsp *Rsp, var req Req if err := ctx.ParamsParser(&req); err != nil { - return fmt.Errorf("failed to parse params, err:%w", err) + return fmt.Errorf("failed to parse params, params:%v err:%w", ctx.AllParams(), err) } if err := ctx.QueryParser(&req); err != nil { - return fmt.Errorf("failed to parse query, err:%w", err) + return fmt.Errorf("failed to parse query, query:%v err:%w", ctx.Queries(), err) } if err := ctx.ReqHeaderParser(&req); err != nil { diff --git a/servers/https/request.go b/servers/https/request.go index 7c7b65a66..f416a58f2 100644 --- a/servers/https/request.go +++ b/servers/https/request.go @@ -22,6 +22,6 @@ func (r *httpRequest) ContentType() string { return string(r.ctx.Request().Header.ContentType()) } -func (r *httpRequest) Service() string { return r.ctx.OriginalURL() } +func (r *httpRequest) Service() string { return r.ctx.Route().Path } func (r *httpRequest) Endpoint() string { return string(r.ctx.Request().RequestURI()) } func (r *httpRequest) Stream() bool { return false } diff --git a/servers/https/server.go b/servers/https/server.go index 2921d7eb0..27cbf86f2 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -42,14 +42,7 @@ func New(params Params) supervisor.Service { return newService(params) } func newService(params Params) supervisor.Service { s := &serviceImpl{} - s.init( - params.Handlers, - params.Middlewares, - params.M, - params.Log, - params.Cfg, - params.Docs, - ) + s.init(params) return supervisor.NewService(s.String(), s.Serve) } @@ -71,31 +64,24 @@ func (s *serviceImpl) Serve(ctx context.Context) error { return nil } -func (s *serviceImpl) init( - handlers []lava.HttpRouter, - middlewares []lava.Middleware, - m metrics.Metric, - log log.Logger, - cfg *Config, - docs []*opendoc.Swagger, -) { - cfg = lo.ToPtr(httputil.DefaultCfg(cfg)) +func (s *serviceImpl) init(params Params) { + cfg := lo.ToPtr(httputil.DefaultCfg(params.Cfg)) vars.RegisterValue(s.String()+"_config_"+xid.New().String(), cfg) - s.log = log.WithName(s.String()) + s.log = params.Log.WithName(s.String()) s.httpServer = fiber.New(cfg.Http.Build().Must()) s.httpServer.Use(httputil.Cors()) defaultMiddlewares := []lava.Middleware{ middleware_serviceinfo.New(), - middleware_metric.New(m), - middleware_accesslog.New(log), + middleware_metric.New(params.M), + middleware_accesslog.New(s.log), middleware_recovery.New(), } - s.httpServer.Use(handlerHttpMiddle(append(defaultMiddlewares, middlewares...))) + s.httpServer.Use(handlerHttpMiddle(append(defaultMiddlewares, params.Middlewares...))) - for _, h := range handlers { + for _, h := range params.Handlers { g := s.httpServer.Group("", handlerHttpMiddle(h.Middlewares())) //for _, an := range h.Annotation() { From 5893d53be3e0a8d09b20a30dda1ca5c352b972a1 Mon Sep 17 00:00:00 2001 From: barry Date: Sun, 7 Sep 2025 11:51:51 +0800 Subject: [PATCH 136/142] fix: barry quick fix, 2025-09-07 11:51:51 --- go.mod | 22 ++++----- go.sum | 48 +++++++++++--------- internal/configs/components/cache.yaml | 2 - internal/configs/components/grpc_server.yaml | 2 +- internal/examples/scheduler/main.go | 7 --- 5 files changed, 38 insertions(+), 43 deletions(-) delete mode 100644 internal/configs/components/cache.yaml diff --git a/go.mod b/go.mod index 702daed0f..885ad3f11 100644 --- a/go.mod +++ b/go.mod @@ -20,10 +20,10 @@ require ( go.opentelemetry.io/otel/trace v1.37.0 go.uber.org/atomic v1.11.0 go.uber.org/automaxprocs v1.6.0 - golang.org/x/crypto v0.39.0 // indirect - golang.org/x/mod v0.25.0 // indirect - golang.org/x/net v0.41.0 - golang.org/x/sys v0.33.0 // indirect + golang.org/x/crypto v0.40.0 // indirect + golang.org/x/mod v0.26.0 // indirect + golang.org/x/net v0.42.0 + golang.org/x/sys v0.34.0 // indirect google.golang.org/grpc v1.73.0 google.golang.org/protobuf v1.36.6 ) @@ -55,7 +55,7 @@ require ( github.com/maragudk/gomponents v0.22.0 github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.65.0 - github.com/pubgo/dix v0.3.21 + github.com/pubgo/dix v0.3.22 github.com/pubgo/funk v0.5.69-alpha.19 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.6.0 @@ -77,7 +77,7 @@ require ( go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0 go.opentelemetry.io/otel/sdk v1.37.0 go.opentelemetry.io/otel/sdk/metric v1.37.0 - golang.org/x/tools v0.34.0 + golang.org/x/tools v0.35.0 golang.org/x/vuln v1.1.3 google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 gopkg.in/yaml.v3 v3.0.1 @@ -289,12 +289,12 @@ require ( go.opentelemetry.io/proto/otlp v1.7.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect + golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc // indirect golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f // indirect - golang.org/x/sync v0.15.0 // indirect - golang.org/x/telemetry v0.0.0-20240522233618-39ace7a40ae7 // indirect - golang.org/x/text v0.26.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/telemetry v0.0.0-20250710130107-8d8967aff50b // indirect + golang.org/x/text v0.27.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect honnef.co/go/tools v0.5.1 // indirect diff --git a/go.sum b/go.sum index 60cae647e..fa142208c 100644 --- a/go.sum +++ b/go.sum @@ -502,8 +502,8 @@ github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2 github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= -github.com/pubgo/dix v0.3.21 h1:jtriLYT6srKrxv0KRwic1no0d9ZTMtLx6r3JJxQ5Jvw= -github.com/pubgo/dix v0.3.21/go.mod h1:5qHJ7ycvBVw1AUjgYMEsobzx1tggiRs+spgzd4Jglb4= +github.com/pubgo/dix v0.3.22 h1:vhF+BN5TiWocS/RcwJ5Z0vpjWuqUVR5C5JJQ5VzvcuA= +github.com/pubgo/dix v0.3.22/go.mod h1:0MBvh8gFJpR/NZuSQOq6d2bsHKI+71dmFfceZowYIbE= github.com/pubgo/funk v0.5.69-alpha.19 h1:yyGzMzlbPsBlLY+XQlY3mUVLGMii4IlQyE5YYe1+yMk= github.com/pubgo/funk v0.5.69-alpha.19/go.mod h1:SZGEVvRPkPo2HQ9TTQS/HfXpQVM+oVDHw3i4pj1/6y0= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= @@ -724,11 +724,11 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= -golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= -golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= +golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc h1:TS73t7x3KarrNd5qAipmspBDS1rkMcgVG/fS1aRb4Rc= +golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f h1:phY1HzDcf18Aq9A8KkmRtY9WvOFIxN8wgfvy6Zm1DV8= @@ -748,8 +748,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= +golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -769,8 +769,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= -golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= +golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -781,8 +781,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -812,10 +812,10 @@ golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/telemetry v0.0.0-20240522233618-39ace7a40ae7 h1:FemxDzfMUcK2f3YY4H+05K9CDzbSVr2+q/JKN45pey0= -golang.org/x/telemetry v0.0.0-20240522233618-39ace7a40ae7/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/telemetry v0.0.0-20250710130107-8d8967aff50b h1:DU+gwOBXU+6bO0sEyO7o/NeMlxZxCZEvI7v+J4a1zRQ= +golang.org/x/telemetry v0.0.0-20250710130107-8d8967aff50b/go.mod h1:4ZwOYna0/zsOKwuR5X/m0QFOJpSZvAxFfkQT+Erd9D4= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -830,8 +830,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -861,8 +861,12 @@ golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= -golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= +golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +golang.org/x/tools/go/expect v0.1.0-deprecated h1:jY2C5HGYR5lqex3gEniOQL0r7Dq5+VGVgY1nudX5lXY= +golang.org/x/tools/go/expect v0.1.0-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= +golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= +golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated/go.mod h1:RVAQXBGNv1ib0J382/DPCRS/BPnsGebyM1Gj5VSDpG8= golang.org/x/vuln v1.1.3 h1:NPGnvPOTgnjBc9HTaUx+nj+EaUYxl5SJOWqaDYGaFYw= golang.org/x/vuln v1.1.3/go.mod h1:7Le6Fadm5FOqE9C926BCD0g12NWyhg7cxV4BwcPFuNY= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -877,8 +881,8 @@ google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY= google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= diff --git a/internal/configs/components/cache.yaml b/internal/configs/components/cache.yaml deleted file mode 100644 index 53c0482a3..000000000 --- a/internal/configs/components/cache.yaml +++ /dev/null @@ -1,2 +0,0 @@ -cache: - default: "memory" diff --git a/internal/configs/components/grpc_server.yaml b/internal/configs/components/grpc_server.yaml index 62a55b903..2023be14c 100644 --- a/internal/configs/components/grpc_server.yaml +++ b/internal/configs/components/grpc_server.yaml @@ -3,6 +3,6 @@ grpc_server: enable_print_router: true # 256k - ws_read_limit: 262144 +# ws_read_limit: 262144 # grpc_port: 8000 # http_port: 8001 diff --git a/internal/examples/scheduler/main.go b/internal/examples/scheduler/main.go index 12366e615..fd026e8d3 100644 --- a/internal/examples/scheduler/main.go +++ b/internal/examples/scheduler/main.go @@ -5,11 +5,9 @@ import ( "fmt" "time" - "github.com/pubgo/dix/dixinternal" "github.com/pubgo/funk/cmds/configcmd" "github.com/pubgo/funk/cmds/envcmd" "github.com/pubgo/funk/config" - "github.com/pubgo/funk/log" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/v2/core/lavabuilder" @@ -17,7 +15,6 @@ import ( "github.com/pubgo/lava/v2/core/metrics" "github.com/pubgo/lava/v2/core/scheduler" "github.com/pubgo/lava/v2/servers/https" - "github.com/rs/zerolog" ) type Config struct { @@ -54,10 +51,6 @@ func (s schedulerExample) RegisterSchedulerJob(reg scheduler.JobRegistry) { func main() { defer recovery.Exit() - dixinternal.SetLog(func(logger log.Logger) log.Logger { - return logger.WithLevel(zerolog.InfoLevel) - }) - builder := lavabuilder.New() builder.Provide(config.Load[Config]) builder.Provide(envcmd.New) From 111191a3cd3f047d26385cbc9ea771cd63327676 Mon Sep 17 00:00:00 2001 From: barry Date: Sun, 7 Sep 2025 14:19:11 +0800 Subject: [PATCH 137/142] fix: barry quick fix, 2025-09-07 14:19:11 --- core/scheduler/schedulercronexpr/expr.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 core/scheduler/schedulercronexpr/expr.go diff --git a/core/scheduler/schedulercronexpr/expr.go b/core/scheduler/schedulercronexpr/expr.go new file mode 100644 index 000000000..979744181 --- /dev/null +++ b/core/scheduler/schedulercronexpr/expr.go @@ -0,0 +1,22 @@ +package schedulercronexpr + +// 一些常用的crontab表达式 +const ( + EveryMinute = "* * * * *" //每分钟的开始第0秒 + EveryFiveMinute = "*/5 * * * *" //每5分钟的开始第0秒 + EveryTenMinute = "*/10 * * * *" //每10分钟的开始第0秒 + EveryFifteenMinute = "*/15 * * * *" //每15分钟的开始第0秒 + EveryTwentyMinute = "*/20 * * * *" //每20分钟的开始第0秒 + EveryThirtyMinute = "*/30 * * * *" //每30分钟的开始第0秒 + EveryFortyFiveMinute = "*/45 * * * *" //每45分钟的开始第0秒 + FirstDayOfMonth = "0 0 1 * *" //每月的第一天的0点0分 + LastDayOfMonth = "0 0 L * *" //每月的最后一天的0点0分 + FirstDayOfWeek = "0 0 * * 1" //每周的第一天(周一)的0点0分 + LastDayOfWeek = "0 0 * * 6" //每周的最后一天(周天)的0点0分 + DailyAtTenAM = "0 10 * * *" //每天上午10点 + DailyAtTwentyPM = "0 20 * * *" //每天晚上20点 + TenClockAtWeekday = "0 10 * * MON-FRI" //每个工作日(周一~周五)的上午10点0分 + TenClockAtWeekend = "0 10 * * SAT,SUN" //每个周末(周六和周日)的上午10点0分 + HourlyBetween9And17ClockAtWeekday = "0 9-17 * * MON-FRI" //每个工作日(周一~周五)的上午9点0分到下午5点0分每小时一次 + HalfHourlyBetween9And17ClockAtWeekday = "*/30 9-17 * * MON-FRI" //每个工作日(周一~周五)的上午9点0分到下午5点0分每半时一次 +) From 4faded12bbdb06f8ca5771b7aafdfbb9166d2903 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 13 Sep 2025 13:31:45 +0800 Subject: [PATCH 138/142] chore: quick update feat/supervisor at 2025-09-13 21:05:06 --- .golangci.yaml | 19 +- .version | 1 + clients/grpcc/client.go | 2 +- clients/grpcc/middleware.go | 4 +- clients/resty/jar.go | 4 +- cmds/depcmd/cmd.go | 7 +- cmds/grpcservercmd/cmd.go | 2 +- cmds/httpservercmd/cmd.go | 2 +- cmds/schedulercmd/cmd.go | 2 +- cmds/servecmd/cmd.go | 120 ------------- cmds/servefilecmd/cmd.go | 52 ++++++ core/encoding/protobuf/codec.go | 17 +- core/lavabuilder/builder.go | 4 +- core/metrics/drivers/prometheus/reporter.go | 2 - core/scheduler/builder.go | 8 +- core/scheduler/job.go | 2 +- core/scheduler/schedulerdebug/html.go | 6 +- core/signal/signal.go | 62 ------- core/signals/signal.go | 40 +++++ core/supervisor/aaa.go | 4 +- core/supervisor/manager.go | 29 ++-- core/supervisor/service.go | 8 +- core/tracing/config.go | 2 +- core/tracing/telemetry.go | 3 +- core/tracing/tracingbuilder/config.go | 4 +- core/tracing/tracingbuilder/telemetry.go | 50 +++--- go.mod | 2 +- go.sum | 4 +- internal/examples/fileserve/main.go | 16 ++ .../middleware_serviceinfo/middleware.go | 3 +- pkg/fiberbuilder/config.go | 2 +- pkg/gateway/gatewayutils/query_params.go | 3 +- pkg/gateway/{status_code.go => grpccodes.go} | 0 .../{transport_stream.go => stream.go} | 0 .../{stream_grpc.go => stream.grpc.go} | 0 .../{stream_grpcweb.go => stream.grpcweb.go} | 0 .../{stream_http.go => stream.http.go} | 0 ...tream_inprocess.go => stream.inprocess.go} | 0 .../{stream_proxy.go => stream.proxy.go} | 0 ...tream_websocket.go => stream.websocket.go} | 0 pkg/gateway/util.go | 4 +- pkg/httputil/fiber.go | 4 +- pkg/httputil/util.go | 5 +- pkg/{fiberbuilder => wsbuilder}/websocket.go | 164 +++++++++--------- pkg/{wsutil => wsbuilder}/ws.go | 2 +- servers/grpcs/server.go | 2 +- servers/https/server.go | 2 +- 47 files changed, 304 insertions(+), 365 deletions(-) create mode 100644 .version delete mode 100644 cmds/servecmd/cmd.go create mode 100644 cmds/servefilecmd/cmd.go delete mode 100644 core/signal/signal.go create mode 100644 core/signals/signal.go create mode 100644 internal/examples/fileserve/main.go rename pkg/gateway/{status_code.go => grpccodes.go} (100%) rename pkg/gateway/{transport_stream.go => stream.go} (100%) rename pkg/gateway/{stream_grpc.go => stream.grpc.go} (100%) rename pkg/gateway/{stream_grpcweb.go => stream.grpcweb.go} (100%) rename pkg/gateway/{stream_http.go => stream.http.go} (100%) rename pkg/gateway/{stream_inprocess.go => stream.inprocess.go} (100%) rename pkg/gateway/{stream_proxy.go => stream.proxy.go} (100%) rename pkg/gateway/{stream_websocket.go => stream.websocket.go} (100%) rename pkg/{fiberbuilder => wsbuilder}/websocket.go (63%) rename pkg/{wsutil => wsbuilder}/ws.go (99%) diff --git a/.golangci.yaml b/.golangci.yaml index 81dae61de..02eab9fbc 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -2,21 +2,38 @@ version: "2" linters: default: none enable: + - errcheck - govet + - staticcheck exclusions: presets: - comments - common-false-positives - legacy - std-error-handling + rules: + - linters: + - dupl + - errcheck + - gocyclo + - gosec + path: _test\.go + - linters: + - forbidigo + path-except: _test\.go paths: - - vendor + - .*_test\.go$ + - examples/ - third_party$ - builtin$ - examples$ formatters: + enable: + - goimports exclusions: paths: + - .*_test\.go$ + - examples/ - third_party$ - builtin$ - examples$ diff --git a/.version b/.version new file mode 100644 index 000000000..6eaf89433 --- /dev/null +++ b/.version @@ -0,0 +1 @@ +v2.0.0 \ No newline at end of file diff --git a/clients/grpcc/client.go b/clients/grpcc/client.go index 636212687..08aa2d7df 100644 --- a/clients/grpcc/client.go +++ b/clients/grpcc/client.go @@ -35,7 +35,7 @@ func New(cfg *grpccconfig.Cfg, p Params, middlewares ...lava.Middleware) Client middlewares: middlewares, } - vars.RegisterValue(fmt.Sprintf("%s-grpc-client-config", cfg.Service.Name), cfg) + vars.Register(fmt.Sprintf("%s-grpc-client-config", cfg.Service.Name), func() any { return cfg }) return c } diff --git a/clients/grpcc/middleware.go b/clients/grpcc/middleware.go index 9c8adecfd..e62a6cf8a 100644 --- a/clients/grpcc/middleware.go +++ b/clients/grpcc/middleware.go @@ -29,9 +29,9 @@ func md2Head(md metadata.MD, header interface{ Add(key, value string) }) { } func head2md(header *lava.RequestHeader, md metadata.MD) { - header.VisitAll(func(key, value []byte) { + for key, value := range header.All() { md.Append(convert.BtoS(key), convert.BtoS(value)) - }) + } } func unaryInterceptor(middlewares []lava.Middleware) grpc.UnaryClientInterceptor { diff --git a/clients/resty/jar.go b/clients/resty/jar.go index fa2743973..e5a1677c1 100644 --- a/clients/resty/jar.go +++ b/clients/resty/jar.go @@ -41,14 +41,14 @@ func (j *Jar) Middleware(next lava.HandlerFunc) lava.HandlerFunc { return nil, err } - rsp.Header().VisitAllCookie(func(key, value []byte) { + for _, value := range rsp.Header().All() { acquireCookie := fasthttp.AcquireCookie() if err := acquireCookie.ParseBytes(value); err != nil { j.log.Err(err, ctx).Msg("failed to parse cookie") } else { j.cookies[string(acquireCookie.Key())] = acquireCookie } - }) + } return rsp, err } diff --git a/cmds/depcmd/cmd.go b/cmds/depcmd/cmd.go index 5b1c695d5..103c3cf92 100644 --- a/cmds/depcmd/cmd.go +++ b/cmds/depcmd/cmd.go @@ -8,6 +8,7 @@ import ( "github.com/olekukonko/tablewriter" "github.com/pubgo/dix" + "github.com/pubgo/funk/assert" "github.com/pubgo/funk/pretty" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/running" @@ -46,12 +47,12 @@ func New(di *dix.Dix) *cli.Command { case "table", "tb", "t": table := tablewriter.NewWriter(os.Stdout) table.Header([]string{"path", "Version", "Replace"}) - table.Append([]string{info.Main.Path, version.Version(), replace(info.Main.Replace)}) + assert.Must(table.Append([]string{info.Main.Path, version.Version(), replace(info.Main.Replace)})) for _, dep := range info.Deps { - table.Append([]string{dep.Path, dep.Version, replace(dep.Replace)}) + assert.Must(table.Append([]string{dep.Path, dep.Version, replace(dep.Replace)})) } - table.Render() + assert.Must(table.Render()) case "di": fmt.Println(di.Graph().Objects) fmt.Println(di.Graph().Providers) diff --git a/cmds/grpcservercmd/cmd.go b/cmds/grpcservercmd/cmd.go index 797e4b86f..1a81333f9 100644 --- a/cmds/grpcservercmd/cmd.go +++ b/cmds/grpcservercmd/cmd.go @@ -30,7 +30,7 @@ func New(di *dix.Dix) *cli.Command { assert.Exit(manager.Add(svc)) } - return manager.Run() + return manager.Run(ctx) }, } } diff --git a/cmds/httpservercmd/cmd.go b/cmds/httpservercmd/cmd.go index a22240443..c70febf18 100644 --- a/cmds/httpservercmd/cmd.go +++ b/cmds/httpservercmd/cmd.go @@ -30,7 +30,7 @@ func New(di *dix.Dix) *cli.Command { assert.Exit(manager.Add(svc)) } - return manager.Run() + return manager.Run(ctx) }, } } diff --git a/cmds/schedulercmd/cmd.go b/cmds/schedulercmd/cmd.go index 4427c235a..85c4768f1 100644 --- a/cmds/schedulercmd/cmd.go +++ b/cmds/schedulercmd/cmd.go @@ -37,7 +37,7 @@ func New(di *dix.Dix) *cli.Command { assert.Exit(manager.Add(svc)) } - return manager.Run() + return manager.Run(ctx) }, } } diff --git a/cmds/servecmd/cmd.go b/cmds/servecmd/cmd.go deleted file mode 100644 index abd524fe1..000000000 --- a/cmds/servecmd/cmd.go +++ /dev/null @@ -1,120 +0,0 @@ -package servecmd - -import ( - "context" - "crypto/sha256" - "fmt" - "log" - "net/http" - "os" - "path" - "time" - - "github.com/pubgo/funk/recovery" - cli "github.com/urfave/cli/v3" -) - -// customFileServer wraps the standard FileServer to add custom headers and ETag support -type customFileServer struct { - root http.FileSystem - fs http.Handler -} - -func (s *customFileServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { - urlPath := path.Clean(r.URL.Path) - - // Handle special health check endpoints - if urlPath == "/healthz" || urlPath == "/ping" { - if urlPath == "/healthz" { - w.Write([]byte("OK")) - } else { - w.Write([]byte("pong")) - } - return - } - - // Check if the path exists and get file info - f, err := s.root.Open(urlPath) - if err != nil { - s.fs.ServeHTTP(w, r) - return - } - defer f.Close() - - fi, err := f.Stat() - if err != nil { - s.fs.ServeHTTP(w, r) - return - } - - // Generate ETag based on file size and modification time - etag := generateETag(fi) - w.Header().Set("ETag", etag) - - // Check if client sent If-None-Match header - if match := r.Header.Get("If-None-Match"); match != "" { - if match == etag { - // Resource not modified, return 304 - w.WriteHeader(http.StatusNotModified) - return - } - } - // Let the standard FileServer handle the rest - s.fs.ServeHTTP(w, r) -} - -// generateETag creates an ETag value based on file modification time and size -func generateETag(fi os.FileInfo) string { - modTime := fi.ModTime().UTC().Format(time.RFC3339Nano) - size := fi.Size() - hash := sha256.New() - fmt.Fprintf(hash, "%s-%d", modTime, size) - return fmt.Sprintf(`"%x"`, hash.Sum(nil)) -} - -func New() *cli.Command { - var ( - flagVerbose bool - ) - - return &cli.Command{ - Name: "serve", - Usage: "serve `pwd` via http at *:8080", - Flags: []cli.Flag{ - &cli.BoolFlag{ - Name: "verbose", - Usage: "verbose", - Local: true, - Value: flagVerbose, - Destination: &flagVerbose, - }, - }, - Action: func(ctx context.Context, command *cli.Command) error { - defer recovery.Exit() - - wd, err := os.Getwd() - if err != nil { - panic(err) - } - - port := "8080" - if p := os.Getenv("PORT"); p != "" { - port = p - } - fmt.Printf("http://localhost:%v/\n", port) - - fileSystem := http.Dir(wd) - fileServer := http.FileServer(fileSystem) - var handler http.Handler = &customFileServer{root: fileSystem, fs: fileServer} - - if flagVerbose { - h := handler - handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - log.Printf("%s %s", r.Method, r.URL.Path) - h.ServeHTTP(w, r) - }) - } - panic(http.ListenAndServe(fmt.Sprintf(":%v", port), handler)) - }, - } -} diff --git a/cmds/servefilecmd/cmd.go b/cmds/servefilecmd/cmd.go new file mode 100644 index 000000000..ff78fa248 --- /dev/null +++ b/cmds/servefilecmd/cmd.go @@ -0,0 +1,52 @@ +package servefilecmd + +import ( + "context" + "fmt" + "os" + + "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/log" + "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/running" + "github.com/pubgo/funk/v2/result" + cli "github.com/urfave/cli/v3" + "github.com/valyala/fasthttp" +) + +func New() *cli.Command { + return &cli.Command{ + Name: "servefile", + Usage: "serve `pwd` via http at *:8080", + Flags: []cli.Flag{}, + Action: func(ctx context.Context, command *cli.Command) error { + defer recovery.Exit() + + wd := result.Wrap(os.Getwd()).Must() + + port := running.HttpPort + log.Info().Msgf("file dir: %s", wd) + log.Info().Msgf("http://localhost:%v", port) + + fs := &fasthttp.FS{ + Root: wd, + IndexNames: []string{"index.html"}, + GenerateIndexPages: true, + Compress: false, + AcceptByteRange: true, + //PathRewrite: fasthttp.NewVHostPathRewriter(0), + } + + s := &fasthttp.Server{ + Handler: fs.NewRequestHandler(), + Logger: log.NewStd(log.GetLogger("servefile")), + } + go func() { + assert.Must(s.ListenAndServe(fmt.Sprintf(":%v", port))) + }() + + <-ctx.Done() + return s.ShutdownWithContext(ctx) + }, + } +} diff --git a/core/encoding/protobuf/codec.go b/core/encoding/protobuf/codec.go index ad444ffd5..85291f33e 100644 --- a/core/encoding/protobuf/codec.go +++ b/core/encoding/protobuf/codec.go @@ -6,7 +6,6 @@ import ( "github.com/pubgo/lava/v2/core/encoding" "google.golang.org/protobuf/proto" - pb "google.golang.org/protobuf/proto" ) var Name = "proto" @@ -23,8 +22,8 @@ func (c protobufCodec) Marshal(v interface{}) ([]byte, error) { return proto.Marshal(m) } - if m, ok := v.(pb.Message); ok { - return pb.Marshal(m) + if m, ok := v.(proto.Message); ok { + return proto.Marshal(m) } return nil, fmt.Errorf("%T is not a proto.Marshaler", v) @@ -35,8 +34,8 @@ func (c protobufCodec) Unmarshal(data []byte, v interface{}) error { return proto.Unmarshal(data, m) } - if m, ok := v.(pb.Message); ok { - return pb.Unmarshal(data, m) + if m, ok := v.(proto.Message); ok { + return proto.Unmarshal(data, m) } return fmt.Errorf("%T is not a proto.Unmarshaler", v) @@ -52,8 +51,8 @@ func (c protobufCodec) Encode(i interface{}) ([]byte, error) { return proto.Marshal(m) } - if m, ok := i.(pb.Message); ok { - return pb.Marshal(m) + if m, ok := i.(proto.Message); ok { + return proto.Marshal(m) } return nil, fmt.Errorf("%T is not a proto.Marshaler", i) @@ -65,8 +64,8 @@ func (c protobufCodec) Decode(data []byte, i interface{}) error { return proto.Unmarshal(data, m) } - if m, ok := i.(pb.Message); ok { - return pb.Unmarshal(data, m) + if m, ok := i.(proto.Message); ok { + return proto.Unmarshal(data, m) } return fmt.Errorf("%T is not a proto.Unmarshaler", i) diff --git a/core/lavabuilder/builder.go b/core/lavabuilder/builder.go index 6777c6d5f..d3df53e48 100644 --- a/core/lavabuilder/builder.go +++ b/core/lavabuilder/builder.go @@ -23,7 +23,7 @@ import ( "github.com/pubgo/lava/v2/core/lifecycle/lifecyclebuilder" "github.com/pubgo/lava/v2/core/logging/logbuilder" "github.com/pubgo/lava/v2/core/metrics/metricbuilder" - "github.com/pubgo/lava/v2/core/signal" + "github.com/pubgo/lava/v2/core/signals" "github.com/pubgo/lava/v2/pkg/cmdutil" _ "github.com/pubgo/lava/v2/core/debug/debug" @@ -91,6 +91,6 @@ func Run(di *dix.Dix) { } sort.Sort(cli.FlagsByName(app.Flags)) - assert.Must(app.Run(signal.Context(), os.Args)) + assert.Must(app.Run(signals.Context(), os.Args)) }) } diff --git a/core/metrics/drivers/prometheus/reporter.go b/core/metrics/drivers/prometheus/reporter.go index d1fe55b0b..8ecaa648b 100644 --- a/core/metrics/drivers/prometheus/reporter.go +++ b/core/metrics/drivers/prometheus/reporter.go @@ -1,7 +1,6 @@ package prometheus import ( - "github.com/prometheus/common/model" "github.com/pubgo/funk/assert" "github.com/pubgo/funk/log" tally "github.com/uber-go/tally/v4" @@ -28,7 +27,6 @@ func New(conf *metrics.Config, log log.Logger) *tally.ScopeOptions { opts := tally.ScopeOptions{} opts.Separator = prometheus.DefaultSeparator //opts.SanitizeOptions = &prometheus.DefaultSanitizerOpts - model.NameValidationScheme = model.UTF8Validation proCfg := &prometheus.Configuration{TimerType: "histogram"} diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index b2a17ef4b..621741df3 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -73,12 +73,10 @@ func New(m lifecycle.Lifecycle, logger log.Logger, metric metrics.Metric, config r.RegisterSchedulerJob(quart) } - quart.start() - m.BeforeStop(lifecycle.WrapNoCtxErr(quart.stop)) + m.AfterStart(func(ctx context.Context) error { return lifecycle.WrapNoCtxErr(quart.start)(ctx) }) + m.BeforeStop(func(ctx context.Context) error { return lifecycle.WrapNoCtxErr(quart.stop)(ctx) }) - vars.Register(vars.UniqueName(Name), func() interface{} { - return quart.ListJobs() - }) + vars.Register(vars.UniqueName(Name), func() any { return quart.ListJobs() }) return quart, nil } diff --git a/core/scheduler/job.go b/core/scheduler/job.go index cdf167185..3e1412b6e 100644 --- a/core/scheduler/job.go +++ b/core/scheduler/job.go @@ -54,7 +54,7 @@ func (t *namedJob) Execute(ctx context.Context) (gErr error) { } if t.task.trigger.err != nil { - if !(t.task.spec.Once != nil && errors.Is(t.task.trigger.err, quartz.ErrTriggerExpired)) { + if !errors.Is(t.task.trigger.err, quartz.ErrTriggerExpired) || t.task.spec.Once == nil { return fmt.Errorf("schedule job(%s) trigger error: %w", name, t.task.trigger.err) } } diff --git a/core/scheduler/schedulerdebug/html.go b/core/scheduler/schedulerdebug/html.go index 2391868b3..c9be21927 100644 --- a/core/scheduler/schedulerdebug/html.go +++ b/core/scheduler/schedulerdebug/html.go @@ -9,9 +9,9 @@ import ( "github.com/pubgo/lava/v2/core/scheduler" "github.com/samber/lo" - . "maragu.dev/gomponents" + . "maragu.dev/gomponents" //nolint _ "maragu.dev/gomponents/components" - . "maragu.dev/gomponents/html" + . "maragu.dev/gomponents/html" //nolint ) type NodeFn func() Node @@ -54,7 +54,7 @@ func ListSchedulers(schedulers []*scheduler.Job) Node { Th(Text(string(s.Result))), Th(Textf("%v", s.Runs)), Th(NodeFn(func() Node { - modeId := fmt.Sprintf(hex.EncodeToString([]byte(s.Spec.Name))) + modeId := hex.EncodeToString([]byte(s.Spec.Name)) return Group{ Script(Rawf(`function model%s(params) {document.getElementById('%s').showModal()}`, modeId, modeId)), Button( diff --git a/core/signal/signal.go b/core/signal/signal.go deleted file mode 100644 index daa6dbdab..000000000 --- a/core/signal/signal.go +++ /dev/null @@ -1,62 +0,0 @@ -package signal - -import ( - "context" - "os" - "os/signal" - "syscall" - - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/try" - "github.com/samber/lo" -) - -const Name = "signal" - -var logger = log.GetLogger(Name) - -var signals = []os.Signal{syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP, syscall.SIGUSR1} - -func getCh() chan os.Signal { - ch := make(chan os.Signal, 1) - signal.Notify(ch, signals...) - return ch -} - -func Wait() { - sig := <-getCh() - logger.Info().Str("signal", sig.String()).Msg("signal trigger notify") -} - -func Context() context.Context { - ctx, cancel := context.WithCancel(context.Background()) - ch := getCh() - go func() { <-ch; cancel() }() - return ctx -} - -func WaitRestart(start func() error, close func() error, restart func() error) error { - err := start() - if err != nil { - return err - } - - sigChan := getCh() - for sig := range sigChan { - logger.Info().Str("signal", sig.String()).Msg("signal trigger notify") - switch sig { - case syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT: - logger.Info().Str("signal", sig.String()).Msg("stop trigger") - return try.Try(close) - case syscall.SIGHUP, syscall.SIGUSR1: - logger.Info().Str("signal", sig.String()).Msg("restart trigger") - err := try.Try(restart) - if err != nil { - logger.Err(err).Msg("supervisor service restart failed") - } - continue - } - logger.Error().Msgf("unknown signal: %s, should in signals(%v)", sig, lo.Map(signals, func(s os.Signal, _ int) string { return s.String() })) - } - return nil -} diff --git a/core/signals/signal.go b/core/signals/signal.go new file mode 100644 index 000000000..17d16f526 --- /dev/null +++ b/core/signals/signal.go @@ -0,0 +1,40 @@ +package signals + +import ( + "context" + "os" + "os/signal" + "syscall" + + "github.com/pubgo/funk/log" +) + +const Name = "signals" + +var logger = log.GetLogger(Name) + +// Inspired by +// https://github.com/kubernetes-sigs/controller-runtime/blob/8499b67e316a03b260c73f92d0380de8cd2e97a1/pkg/manager/signals/signal.go#L25 +var onlyOneSignalHandler = make(chan struct{}) + +// var signals = []os.Signal{syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP, syscall.SIGUSR1} +var shutdownSignals = []os.Signal{syscall.SIGTERM, syscall.SIGQUIT, os.Interrupt, os.Kill} + +func Context() context.Context { + close(onlyOneSignalHandler) + + ctx, cancel := context.WithCancel(context.Background()) + ch := make(chan os.Signal, 2) + signal.Notify(ch, shutdownSignals...) + go func() { + sig := <-ch + logger.Info().Str("signal", sig.String()).Msg("cancelling context, received signal") + cancel() + sig = <-ch + logger.Info().Str("signal", sig.String()).Msg("os exit, received twice signal") + os.Exit(1) + + }() + + return ctx +} diff --git a/core/supervisor/aaa.go b/core/supervisor/aaa.go index de7d52493..760de73c9 100644 --- a/core/supervisor/aaa.go +++ b/core/supervisor/aaa.go @@ -9,7 +9,7 @@ import ( type Supervisor = suture.Supervisor -type ServiceMetric struct { +type Metric struct { Name string Error string Restart uint32 @@ -22,7 +22,7 @@ type Service interface { Error() error String() string Serve(ctx context.Context) error - Metrics() *ServiceMetric + Metric() *Metric } type serviceFn func(ctx context.Context) error diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go index d24d39163..b29a632e5 100644 --- a/core/supervisor/manager.go +++ b/core/supervisor/manager.go @@ -17,7 +17,6 @@ import ( "github.com/pubgo/lava/v2/core/debug" "github.com/pubgo/lava/v2/core/lifecycle" - "github.com/pubgo/lava/v2/core/signal" "github.com/pubgo/lava/v2/internal/logutil" ) @@ -31,10 +30,7 @@ func Default(lc lifecycle.Getter) *Manager { } func NewManager(name string, lc lifecycle.Getter) *Manager { - ctx, cancel := context.WithCancel(context.Background()) m := &Manager{ - cancel: cancel, - ctx: ctx, lc: lc, supervisor: suture.New(name, SpecWithInfoLogger()), services: make(map[string]*serviceWrapper), @@ -48,16 +44,14 @@ type Manager struct { logger log.Logger supervisor *Supervisor services map[string]*serviceWrapper - ctx context.Context - cancel context.CancelFunc } func (m *Manager) init() *Manager { debug.Route("/supervisor", func(router fiber.Router) { router.Get("services", func(ctx *fiber.Ctx) error { - var services []*ServiceMetric + var services []*Metric for _, srv := range m.services { - services = append(services, srv.service.Metrics()) + services = append(services, srv.service.Metric()) } return ctx.JSON(services) }) @@ -152,8 +146,7 @@ func (m *Manager) Services() []Service { return services } -func (m *Manager) start() error { - ctx := m.ctx +func (m *Manager) start(ctx context.Context) error { defer recovery.Exit() logutil.OkOrFailed(m.logger, "service before-start", func() error { defer recovery.Exit() @@ -185,10 +178,9 @@ func (m *Manager) start() error { return nil } -func (m *Manager) stop() error { +func (m *Manager) stop(ctx context.Context) error { defer recovery.DebugPrint() - ctx := m.ctx logutil.OkOrFailed(m.logger, "service before-stop", func() error { for _, run := range m.lc.GetBeforeStops() { logutil.LogOrErr(m.logger, fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), func() error { @@ -198,8 +190,6 @@ func (m *Manager) stop() error { return nil }) - m.cancel() - unstoppedServices, _ := m.supervisor.UnstoppedServiceReport() if len(unstoppedServices) > 0 { for _, service := range unstoppedServices { @@ -220,8 +210,15 @@ func (m *Manager) stop() error { return nil } -func (m *Manager) Run() error { - return signal.WaitRestart(m.start, m.stop, m.RestartServices) +func (m *Manager) Run(ctx context.Context) error { + err := m.start(ctx) + if err != nil { + return err + } + + <-ctx.Done() + + return m.stop(ctx) } func (m *Manager) Serve(ctx context.Context) error { diff --git a/core/supervisor/service.go b/core/supervisor/service.go index 578001c08..4b8afc21a 100644 --- a/core/supervisor/service.go +++ b/core/supervisor/service.go @@ -32,9 +32,9 @@ type serviceImpl struct { metric *serviceMetric } -func (s *serviceImpl) Metrics() *ServiceMetric { +func (s *serviceImpl) Metric() *Metric { metric := s.metric - return &ServiceMetric{ + return &Metric{ Name: s.name, Error: metric.Error.Load(), Restart: metric.Restart.Load(), @@ -68,7 +68,7 @@ func (s *serviceImpl) Serve(ctx context.Context) (gErr error) { log.Info(ctx). Str("service", s.name). - Any("metrics", s.Metrics()). + Any("metrics", s.Metric()). Msg("stop service") }() defer recovery.Err(&gErr) @@ -78,7 +78,7 @@ func (s *serviceImpl) Serve(ctx context.Context) (gErr error) { log.Info(ctx).Str("service", s.name).Msg("start service") err := s.fn(ctx) if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { - return fmt.Errorf("non-context error, service=%s meta=%v err=%w", s.name, s.Metrics(), err) + return fmt.Errorf("non-context error, service=%s meta=%v err=%w", s.name, s.Metric(), err) } return err } diff --git a/core/tracing/config.go b/core/tracing/config.go index 7d943217a..f681c0f1a 100644 --- a/core/tracing/config.go +++ b/core/tracing/config.go @@ -40,7 +40,7 @@ type Config struct { prettyPrint bool bspOptions []sdktrace.BatchSpanProcessorOption - // Metrics options + // Metric options metricsEnabled bool metricOptions []metric.Option diff --git a/core/tracing/telemetry.go b/core/tracing/telemetry.go index 82558d73c..ba677e757 100644 --- a/core/tracing/telemetry.go +++ b/core/tracing/telemetry.go @@ -21,7 +21,6 @@ import ( "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" otelmetric "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/propagation" - "go.opentelemetry.io/otel/sdk/metric" sdkmetric "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" @@ -212,7 +211,7 @@ func GetTraceId(ctx context.Context) string { return oteltrace.SpanContextFromContext(ctx).TraceID().String() } -func initMetricExporter(config *Config) (metric.Exporter, error) { +func initMetricExporter(config *Config) (sdkmetric.Exporter, error) { if config.metricExporter.ExporterEndpoint == DefaultStdout { encoder := json.NewEncoder(os.Stdout) return stdoutmetric.New(stdoutmetric.WithEncoder(encoder)) diff --git a/core/tracing/tracingbuilder/config.go b/core/tracing/tracingbuilder/config.go index 0ba57715a..5d5dda310 100644 --- a/core/tracing/tracingbuilder/config.go +++ b/core/tracing/tracingbuilder/config.go @@ -51,7 +51,7 @@ type Config struct { prettyPrint bool bspOptions []sdktrace.BatchSpanProcessorOption - // Metrics options + // Metric options metricsEnabled bool metricOptions []metric.Option @@ -69,7 +69,7 @@ type ServiceInfo struct { Version string } -// OTLP contains specific configuration used by the OpenTelemetry Metrics exporter. +// OTLP contains specific configuration used by the OpenTelemetry Metric exporter. type OTLP struct { GRPC *OtelGRPC `description:"gRPC configuration for the OpenTelemetry collector." json:"grpc,omitempty" toml:"grpc,omitempty" yaml:"grpc,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` HTTP *OtelHTTP `description:"HTTP configuration for the OpenTelemetry collector." json:"http,omitempty" toml:"http,omitempty" yaml:"http,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` diff --git a/core/tracing/tracingbuilder/telemetry.go b/core/tracing/tracingbuilder/telemetry.go index 9b59360e3..171c21374 100644 --- a/core/tracing/tracingbuilder/telemetry.go +++ b/core/tracing/tracingbuilder/telemetry.go @@ -2,14 +2,15 @@ package tracingbuilder import ( "context" + "encoding/json" "errors" "fmt" "os" "time" - "github.com/goccy/go-json" - "github.com/pubgo/funk/assert" "github.com/pubgo/funk/log" + "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/result" "github.com/pubgo/funk/version" "github.com/pubgo/lava/v2/core/lifecycle" "go.opentelemetry.io/otel" @@ -21,7 +22,6 @@ import ( "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" otelmetric "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/propagation" - "go.opentelemetry.io/otel/sdk/metric" sdkmetric "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" @@ -43,6 +43,7 @@ type Params struct { } func New(params Params) Provider { + defer recovery.Exit() config := &Config{ traceExporter: &Exporter{}, metricExporter: &Exporter{}, @@ -55,8 +56,8 @@ func New(params Params) Provider { sampleRatio: 1, } - tracerProvider := NewTracerProvider(config) - meterProvider := NewMeterProvider(config) + tracerProvider := NewTracerProvider(config).Must() + meterProvider := NewMeterProvider(config).Must() propagator := propagation.NewCompositeTextMapPropagator( propagation.TraceContext{}, propagation.Baggage{}, @@ -90,14 +91,15 @@ func New(params Params) Provider { } // merge config resource with default resource -func mergeResource(config *Config) *resource.Resource { - res := assert.Must1(resource.New(context.Background(), +func mergeResource(config *Config) (r result.Result[*resource.Resource]) { + defer result.RecoveryErr(&r) + res := result.Wrap(resource.New(context.Background(), resource.WithFromEnv(), resource.WithTelemetrySDK(), resource.WithOSType(), resource.WithProcessCommandArgs(), - )) - res = assert.Must1(resource.Merge(resource.Default(), res)) + )).Must() + res = result.Wrap(resource.Merge(resource.Default(), res)).Must() hostname, _ := os.Hostname() defaultResource := resource.NewWithAttributes( @@ -109,15 +111,16 @@ func mergeResource(config *Config) *resource.Resource { semconv.ProcessPIDKey.Int(os.Getpid()), semconv.ProcessCommandKey.String(os.Args[0]), ) - res = assert.Must1(resource.Merge(resource.Default(), defaultResource)) + res = result.Wrap(resource.Merge(defaultResource, res)).Log().Must() - return res + return r.WithValue(res) } -func NewTracerProvider(config *Config) *sdktrace.TracerProvider { - res := mergeResource(config) +func NewTracerProvider(config *Config) (r result.Result[*sdktrace.TracerProvider]) { + defer result.RecoveryErr(&r) + res := mergeResource(config).Log().Must() - traceExporter := assert.Must1(newGrpcTracerExporter(config)) + traceExporter := result.Wrap(newGrpcTracerExporter(config)).Log().Must() sampler := sdktrace.ParentBased(sdktrace.AlwaysSample()) if config.sampleRatio < 1 && config.sampleRatio >= 0 { sampler = sdktrace.ParentBased(sdktrace.TraceIDRatioBased(config.sampleRatio)) @@ -143,7 +146,7 @@ func NewTracerProvider(config *Config) *sdktrace.TracerProvider { }), ) - return traceProvider + return r.WithValue(traceProvider) } func newGrpcTracerExporter(config *Config) (sdktrace.SpanExporter, error) { @@ -168,7 +171,7 @@ func newGrpcTracerExporter(config *Config) (sdktrace.SpanExporter, error) { ) } -func newGrpcMetricExporter(config *Config) (metric.Exporter, error) { +func newGrpcMetricExporter(config *Config) (sdkmetric.Exporter, error) { if config.metricExporter.ExporterEndpoint == DefaultStdout { encoder := json.NewEncoder(os.Stdout) return stdoutmetric.New(stdoutmetric.WithEncoder(encoder)) @@ -190,17 +193,18 @@ func newGrpcMetricExporter(config *Config) (metric.Exporter, error) { return nil, fmt.Errorf("metric exporter endpoint is nil, no exporter is inited") } -func NewMeterProvider(config *Config) *sdkmetric.MeterProvider { - reader := metric.NewPeriodicReader(assert.Must1(newGrpcMetricExporter(config))) - readerOpt := sdkmetric.WithReader(reader) +func NewMeterProvider(config *Config) (r result.Result[*sdkmetric.MeterProvider]) { + defer result.RecoveryErr(&r) + //reader := metric.NewPeriodicReader(assert.Must1(newGrpcMetricExporter(config))) + //readerOpt := sdkmetric.WithReader(reader) - exporter := assert.Must1(otelprom.New()) - readerOpt = sdkmetric.WithReader(exporter) + exporter := result.Wrap(otelprom.New()).Must() + readerOpt := sdkmetric.WithReader(exporter) - res := mergeResource(config) + res := mergeResource(config).Must() provider := sdkmetric.NewMeterProvider( readerOpt, sdkmetric.WithResource(res), ) - return provider + return r.WithValue(provider) } diff --git a/go.mod b/go.mod index 885ad3f11..2ad1fda5e 100644 --- a/go.mod +++ b/go.mod @@ -56,7 +56,7 @@ require ( github.com/maruel/panicparse/v2 v2.5.0 github.com/prometheus/common v0.65.0 github.com/pubgo/dix v0.3.22 - github.com/pubgo/funk v0.5.69-alpha.19 + github.com/pubgo/funk v0.5.69-alpha.25 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.6.0 github.com/rs/zerolog v1.34.0 diff --git a/go.sum b/go.sum index fa142208c..ae7f62b68 100644 --- a/go.sum +++ b/go.sum @@ -504,8 +504,8 @@ github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7D github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/pubgo/dix v0.3.22 h1:vhF+BN5TiWocS/RcwJ5Z0vpjWuqUVR5C5JJQ5VzvcuA= github.com/pubgo/dix v0.3.22/go.mod h1:0MBvh8gFJpR/NZuSQOq6d2bsHKI+71dmFfceZowYIbE= -github.com/pubgo/funk v0.5.69-alpha.19 h1:yyGzMzlbPsBlLY+XQlY3mUVLGMii4IlQyE5YYe1+yMk= -github.com/pubgo/funk v0.5.69-alpha.19/go.mod h1:SZGEVvRPkPo2HQ9TTQS/HfXpQVM+oVDHw3i4pj1/6y0= +github.com/pubgo/funk v0.5.69-alpha.25 h1:qyfz7fUygS31VtNzG9M31TDmASETgOJiX77786pWgTw= +github.com/pubgo/funk v0.5.69-alpha.25/go.mod h1:dBFx3ZnM6IML9tqK23ROTB9xX0Q27dLXUxAoSuh5mMI= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/pubgo/protobuild v0.0.21 h1:QSwh92QxsD6Mv7kQlowzE7fxtcOm1eMWmgADsD803Js= diff --git a/internal/examples/fileserve/main.go b/internal/examples/fileserve/main.go new file mode 100644 index 000000000..9812d3431 --- /dev/null +++ b/internal/examples/fileserve/main.go @@ -0,0 +1,16 @@ +package main + +import ( + "github.com/pubgo/funk/recovery" + "github.com/pubgo/lava/v2/cmds/servefilecmd" + "github.com/pubgo/lava/v2/core/lavabuilder" +) + +func main() { + defer recovery.Exit() + + builder := lavabuilder.New() + builder.Provide(servefilecmd.New) + + lavabuilder.Run(builder) +} diff --git a/internal/middlewares/middleware_serviceinfo/middleware.go b/internal/middlewares/middleware_serviceinfo/middleware.go index ecdd24ab4..051d780f3 100644 --- a/internal/middlewares/middleware_serviceinfo/middleware.go +++ b/internal/middlewares/middleware_serviceinfo/middleware.go @@ -7,12 +7,13 @@ import ( "github.com/pubgo/funk/running" "github.com/pubgo/funk/strutil" "github.com/pubgo/funk/version" + "github.com/rs/xid" + "github.com/pubgo/lava/v2/core/lavacontexts" "github.com/pubgo/lava/v2/lava" "github.com/pubgo/lava/v2/pkg/grpcutil" "github.com/pubgo/lava/v2/pkg/httputil" "github.com/pubgo/lava/v2/pkg/proto/lavapbv1" - "github.com/rs/xid" ) func New() lava.Middleware { diff --git a/pkg/fiberbuilder/config.go b/pkg/fiberbuilder/config.go index 8807f764b..c85d3334b 100644 --- a/pkg/fiberbuilder/config.go +++ b/pkg/fiberbuilder/config.go @@ -1,13 +1,13 @@ package fiberbuilder import ( - "github.com/samber/lo" "log/slog" "time" "dario.cat/mergo" "github.com/gofiber/fiber/v2" "github.com/pubgo/funk/v2/result" + "github.com/samber/lo" ) type Config struct { diff --git a/pkg/gateway/gatewayutils/query_params.go b/pkg/gateway/gatewayutils/query_params.go index 0355c9ce9..e642d4185 100644 --- a/pkg/gateway/gatewayutils/query_params.go +++ b/pkg/gateway/gatewayutils/query_params.go @@ -18,7 +18,6 @@ import ( "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" "google.golang.org/protobuf/types/known/durationpb" - "google.golang.org/protobuf/types/known/fieldmaskpb" fieldmask "google.golang.org/protobuf/types/known/fieldmaskpb" "google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/timestamppb" @@ -518,7 +517,7 @@ func parseParam(fds []protoreflect.FieldDescriptor, raw []byte) (param, error) { } return param{fds: fds, val: protoreflect.ValueOfMessage(msg.ProtoReflect())}, nil case "FieldMask": - var msg fieldmaskpb.FieldMask + var msg fieldmask.FieldMask if err := protojson.Unmarshal(quote(raw), &msg); err != nil { return param{}, errors.WrapCaller(err) } diff --git a/pkg/gateway/status_code.go b/pkg/gateway/grpccodes.go similarity index 100% rename from pkg/gateway/status_code.go rename to pkg/gateway/grpccodes.go diff --git a/pkg/gateway/transport_stream.go b/pkg/gateway/stream.go similarity index 100% rename from pkg/gateway/transport_stream.go rename to pkg/gateway/stream.go diff --git a/pkg/gateway/stream_grpc.go b/pkg/gateway/stream.grpc.go similarity index 100% rename from pkg/gateway/stream_grpc.go rename to pkg/gateway/stream.grpc.go diff --git a/pkg/gateway/stream_grpcweb.go b/pkg/gateway/stream.grpcweb.go similarity index 100% rename from pkg/gateway/stream_grpcweb.go rename to pkg/gateway/stream.grpcweb.go diff --git a/pkg/gateway/stream_http.go b/pkg/gateway/stream.http.go similarity index 100% rename from pkg/gateway/stream_http.go rename to pkg/gateway/stream.http.go diff --git a/pkg/gateway/stream_inprocess.go b/pkg/gateway/stream.inprocess.go similarity index 100% rename from pkg/gateway/stream_inprocess.go rename to pkg/gateway/stream.inprocess.go diff --git a/pkg/gateway/stream_proxy.go b/pkg/gateway/stream.proxy.go similarity index 100% rename from pkg/gateway/stream_proxy.go rename to pkg/gateway/stream.proxy.go diff --git a/pkg/gateway/stream_websocket.go b/pkg/gateway/stream.websocket.go similarity index 100% rename from pkg/gateway/stream_websocket.go rename to pkg/gateway/stream.websocket.go diff --git a/pkg/gateway/util.go b/pkg/gateway/util.go index dbc559f3f..8be6b4929 100644 --- a/pkg/gateway/util.go +++ b/pkg/gateway/util.go @@ -245,7 +245,7 @@ func resolvePathToDescriptors(msg protoreflect.MessageDescriptor, path string) ( for i, part := range parts { field := fields.ByName(protoreflect.Name(part)) if field == nil { - return nil, errors.Format("in field HttpPath %q: element %q does not correspond to any field of type %s", + return nil, errors.Errorf("in field HttpPath %q: element %q does not correspond to any field of type %s", path, part, msg.FullName()) } @@ -255,7 +255,7 @@ func resolvePathToDescriptors(msg protoreflect.MessageDescriptor, path string) ( } if field.Cardinality() == protoreflect.Repeated { - return nil, errors.Format("in field HttpPath %q: field %q of type %s should not be a list or map", path, part, msg.FullName()) + return nil, errors.Errorf("in field HttpPath %q: field %q of type %s should not be a list or map", path, part, msg.FullName()) } msg = field.Message() diff --git a/pkg/httputil/fiber.go b/pkg/httputil/fiber.go index 381cc57b9..0b31939fe 100644 --- a/pkg/httputil/fiber.go +++ b/pkg/httputil/fiber.go @@ -196,9 +196,9 @@ func handlerFunc(h fasthttp.RequestHandler) http.HandlerFunc { h(&ctx) // Convert fasthttp Ctx > net/http - ctx.Response.Header.VisitAll(func(k, v []byte) { + for k, v := range ctx.Response.Header.All() { w.Header().Add(string(k), string(v)) - }) + } w.WriteHeader(ctx.Response.StatusCode()) _, _ = w.Write(ctx.Response.Body()) } diff --git a/pkg/httputil/util.go b/pkg/httputil/util.go index dab884381..ab67510ac 100644 --- a/pkg/httputil/util.go +++ b/pkg/httputil/util.go @@ -3,7 +3,7 @@ package httputil import ( "log/slog" "strings" - + "dario.cat/mergo" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cors" @@ -13,10 +13,11 @@ import ( "github.com/pubgo/funk/proto/errorpb" "github.com/pubgo/funk/running" "github.com/pubgo/funk/version" - "github.com/pubgo/lava/v2/pkg/fiberbuilder" "github.com/samber/lo" "github.com/valyala/fasthttp" "google.golang.org/grpc/codes" + + "github.com/pubgo/lava/v2/pkg/fiberbuilder" ) type Config struct { diff --git a/pkg/fiberbuilder/websocket.go b/pkg/wsbuilder/websocket.go similarity index 63% rename from pkg/fiberbuilder/websocket.go rename to pkg/wsbuilder/websocket.go index a5956499d..f02cd7c1e 100644 --- a/pkg/fiberbuilder/websocket.go +++ b/pkg/wsbuilder/websocket.go @@ -1,8 +1,6 @@ -package fiberbuilder +package wsbuilder import ( - "errors" - "io" "sync" "time" @@ -90,14 +88,14 @@ func NewWs(handler func(*fiber.Ctx, *Conn), config ...WsCfg) fiber.Handler { } // queries - c.Context().QueryArgs().VisitAll(func(key, value []byte) { + for key, value := range c.Context().QueryArgs().All() { conn.queries[string(key)] = string(value) - }) + } // cookies - c.Context().Request.Header.VisitAllCookie(func(key, value []byte) { + for key, value := range c.Context().Request.Header.All() { conn.cookies[string(key)] = string(value) - }) + } if err := upgrader.Upgrade(c.Context(), func(fconn *websocket.Conn) { conn.Conn = fconn @@ -185,79 +183,79 @@ func (conn *Conn) Cookies(key string, defaultValue ...string) string { // Constants are taken from https://github.com/fasthttp/websocket/blob/master/conn.go#L43 // Close codes defined in RFC 6455, section 11.7. -const ( - CloseNormalClosure = 1000 - CloseGoingAway = 1001 - CloseProtocolError = 1002 - CloseUnsupportedData = 1003 - CloseNoStatusReceived = 1005 - CloseAbnormalClosure = 1006 - CloseInvalidFramePayloadData = 1007 - ClosePolicyViolation = 1008 - CloseMessageTooBig = 1009 - CloseMandatoryExtension = 1010 - CloseInternalServerErr = 1011 - CloseServiceRestart = 1012 - CloseTryAgainLater = 1013 - CloseTLSHandshake = 1015 -) - -// The message types are defined in RFC 6455, section 11.8. -const ( - // TextMessage denotes a text data message. The text message payload is - // interpreted as UTF-8 encoded text data. - TextMessage = 1 - - // BinaryMessage denotes a binary data message. - BinaryMessage = 2 - - // CloseMessage denotes a close control message. The optional message - // payload contains a numeric code and text. Use the FormatCloseMessage - // function to format a close message payload. - CloseMessage = 8 - - // PingMessage denotes a ping control message. The optional message payload - // is UTF-8 encoded text. - PingMessage = 9 - - // PongMessage denotes a pong control message. The optional message payload - // is UTF-8 encoded text. - PongMessage = 10 -) - -var ( - ErrBadHandshake = errors.New("websocket: bad handshake") - ErrCloseSent = errors.New("websocket: close sent") - ErrReadLimit = errors.New("websocket: read limit exceeded") -) - -// FormatCloseMessage formats closeCode and text as a WebSocket close message. -// An empty message is returned for code CloseNoStatusReceived. -func FormatCloseMessage(closeCode int, text string) []byte { - return websocket.FormatCloseMessage(closeCode, text) -} - -// IsCloseError returns boolean indicating whether the error is a *CloseError -// with one of the specified codes. -func IsCloseError(err error, codes ...int) bool { - return websocket.IsCloseError(err, codes...) -} - -// IsUnexpectedCloseError returns boolean indicating whether the error is a -// *CloseError with a code not in the list of expected codes. -func IsUnexpectedCloseError(err error, expectedCodes ...int) bool { - return websocket.IsUnexpectedCloseError(err, expectedCodes...) -} - -// IsWebSocketUpgrade returns true if the client requested upgrade to the -// WebSocket protocol. -func IsWebSocketUpgrade(c *fiber.Ctx) bool { - return websocket.FastHTTPIsWebSocketUpgrade(c.Context()) -} - -// JoinMessages concatenates received messages to create a single io.Reader. -// The string term is appended to each message. The returned reader does not -// support concurrent calls to the Read method. -func JoinMessages(c *websocket.Conn, term string) io.Reader { - return websocket.JoinMessages(c, term) -} +//const ( +// CloseNormalClosure = 1000 +// CloseGoingAway = 1001 +// CloseProtocolError = 1002 +// CloseUnsupportedData = 1003 +// CloseNoStatusReceived = 1005 +// CloseAbnormalClosure = 1006 +// CloseInvalidFramePayloadData = 1007 +// ClosePolicyViolation = 1008 +// CloseMessageTooBig = 1009 +// CloseMandatoryExtension = 1010 +// CloseInternalServerErr = 1011 +// CloseServiceRestart = 1012 +// CloseTryAgainLater = 1013 +// CloseTLSHandshake = 1015 +//) +// +//// The message types are defined in RFC 6455, section 11.8. +//const ( +// // TextMessage denotes a text data message. The text message payload is +// // interpreted as UTF-8 encoded text data. +// TextMessage = 1 +// +// // BinaryMessage denotes a binary data message. +// BinaryMessage = 2 +// +// // CloseMessage denotes a close control message. The optional message +// // payload contains a numeric code and text. Use the FormatCloseMessage +// // function to format a close message payload. +// CloseMessage = 8 +// +// // PingMessage denotes a ping control message. The optional message payload +// // is UTF-8 encoded text. +// PingMessage = 9 +// +// // PongMessage denotes a pong control message. The optional message payload +// // is UTF-8 encoded text. +// PongMessage = 10 +//) +// +//var ( +// ErrBadHandshake = errors.New("websocket: bad handshake") +// ErrCloseSent = errors.New("websocket: close sent") +// ErrReadLimit = errors.New("websocket: read limit exceeded") +//) +// +//// FormatCloseMessage formats closeCode and text as a WebSocket close message. +//// An empty message is returned for code CloseNoStatusReceived. +//func FormatCloseMessage(closeCode int, text string) []byte { +// return websocket.FormatCloseMessage(closeCode, text) +//} +// +//// IsCloseError returns boolean indicating whether the error is a *CloseError +//// with one of the specified codes. +//func IsCloseError(err error, codes ...int) bool { +// return websocket.IsCloseError(err, codes...) +//} +// +//// IsUnexpectedCloseError returns boolean indicating whether the error is a +//// *CloseError with a code not in the list of expected codes. +//func IsUnexpectedCloseError(err error, expectedCodes ...int) bool { +// return websocket.IsUnexpectedCloseError(err, expectedCodes...) +//} +// +//// IsWebSocketUpgrade returns true if the client requested upgrade to the +//// WebSocket protocol. +//func IsWebSocketUpgrade(c *fiber.Ctx) bool { +// return websocket.FastHTTPIsWebSocketUpgrade(c.Context()) +//} +// +//// JoinMessages concatenates received messages to create a single io.Reader. +//// The string term is appended to each message. The returned reader does not +//// support concurrent calls to the Read method. +//func JoinMessages(c *websocket.Conn, term string) io.Reader { +// return websocket.JoinMessages(c, term) +//} diff --git a/pkg/wsutil/ws.go b/pkg/wsbuilder/ws.go similarity index 99% rename from pkg/wsutil/ws.go rename to pkg/wsbuilder/ws.go index 70ebba759..a608005e0 100644 --- a/pkg/wsutil/ws.go +++ b/pkg/wsbuilder/ws.go @@ -1,4 +1,4 @@ -package wsutil +package wsbuilder import ( "errors" diff --git a/servers/grpcs/server.go b/servers/grpcs/server.go index 53a642e80..5b1dfd75c 100644 --- a/servers/grpcs/server.go +++ b/servers/grpcs/server.go @@ -253,7 +253,7 @@ func (s *serviceImpl) init( s.httpServer = httpServer s.grpcServer = grpcServer - vars.RegisterValue(fmt.Sprintf("%s-grpc-server-config-%s", version.Project(), xid.New()), &conf) + vars.Register(fmt.Sprintf("%s-grpc-server-config-%s", version.Project(), xid.New()), func() any { return conf }) vars.Register(fmt.Sprintf("%s-grpc-server-router-%s", version.Project(), xid.New()), func() interface{} { return mux.GetRouteMethods() }) diff --git a/servers/https/server.go b/servers/https/server.go index 27cbf86f2..6532cdc69 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -67,7 +67,7 @@ func (s *serviceImpl) Serve(ctx context.Context) error { func (s *serviceImpl) init(params Params) { cfg := lo.ToPtr(httputil.DefaultCfg(params.Cfg)) - vars.RegisterValue(s.String()+"_config_"+xid.New().String(), cfg) + vars.Register(s.String()+"_config_"+xid.New().String(), func() any { return cfg }) s.log = params.Log.WithName(s.String()) s.httpServer = fiber.New(cfg.Http.Build().Must()) From 5bcfc37e256e74df13bc664e6f2ebbb76c0875c4 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 13 Sep 2025 13:31:45 +0800 Subject: [PATCH 139/142] chore: quick update feat/supervisor at 2025-09-16 18:16:27 --- .golangci.yaml | 19 +- .version | 1 + clients/grpcc/client.go | 4 +- clients/grpcc/middleware.go | 4 +- clients/resty/jar.go | 4 +- cmds/depcmd/cmd.go | 7 +- cmds/grpcservercmd/cmd.go | 2 +- cmds/httpservercmd/cmd.go | 2 +- cmds/schedulercmd/cmd.go | 2 +- cmds/servecmd/cmd.go | 120 ------------- cmds/servefilecmd/cmd.go | 52 ++++++ core/encoding/protobuf/codec.go | 17 +- core/lavabuilder/builder.go | 4 +- core/metrics/drivers/prometheus/reporter.go | 2 - core/scheduler/builder.go | 30 ++-- core/scheduler/config.go | 34 ++-- core/scheduler/job.go | 2 +- core/scheduler/scheduler.go | 15 +- core/scheduler/schedulerdebug/html.go | 6 +- core/signal/signal.go | 62 ------- core/signals/signal.go | 40 +++++ core/supervisor/aaa.go | 4 +- core/supervisor/manager.go | 29 ++-- core/supervisor/service.go | 8 +- core/tracing/config.go | 2 +- core/tracing/telemetry.go | 3 +- core/tracing/tracingbuilder/config.go | 4 +- core/tracing/tracingbuilder/telemetry.go | 50 +++--- go.mod | 6 +- go.sum | 8 +- internal/examples/fileserve/main.go | 16 ++ .../middleware_serviceinfo/middleware.go | 3 +- pkg/fiberbuilder/config.go | 4 +- pkg/gateway/gatewayutils/query_params.go | 3 +- pkg/gateway/{status_code.go => grpccodes.go} | 0 .../{transport_stream.go => stream.go} | 0 .../{stream_grpc.go => stream.grpc.go} | 0 .../{stream_grpcweb.go => stream.grpcweb.go} | 0 .../{stream_http.go => stream.http.go} | 0 ...tream_inprocess.go => stream.inprocess.go} | 0 .../{stream_proxy.go => stream.proxy.go} | 0 ...tream_websocket.go => stream.websocket.go} | 0 pkg/gateway/util.go | 4 +- pkg/grpcbuilder/config.go | 2 +- pkg/httputil/fiber.go | 4 +- pkg/httputil/util.go | 5 +- pkg/{fiberbuilder => wsbuilder}/websocket.go | 164 +++++++++--------- pkg/{wsutil => wsbuilder}/ws.go | 2 +- servers/grpcs/server.go | 2 +- servers/https/server.go | 2 +- 50 files changed, 345 insertions(+), 409 deletions(-) create mode 100644 .version delete mode 100644 cmds/servecmd/cmd.go create mode 100644 cmds/servefilecmd/cmd.go delete mode 100644 core/signal/signal.go create mode 100644 core/signals/signal.go create mode 100644 internal/examples/fileserve/main.go rename pkg/gateway/{status_code.go => grpccodes.go} (100%) rename pkg/gateway/{transport_stream.go => stream.go} (100%) rename pkg/gateway/{stream_grpc.go => stream.grpc.go} (100%) rename pkg/gateway/{stream_grpcweb.go => stream.grpcweb.go} (100%) rename pkg/gateway/{stream_http.go => stream.http.go} (100%) rename pkg/gateway/{stream_inprocess.go => stream.inprocess.go} (100%) rename pkg/gateway/{stream_proxy.go => stream.proxy.go} (100%) rename pkg/gateway/{stream_websocket.go => stream.websocket.go} (100%) rename pkg/{fiberbuilder => wsbuilder}/websocket.go (63%) rename pkg/{wsutil => wsbuilder}/ws.go (99%) diff --git a/.golangci.yaml b/.golangci.yaml index 81dae61de..02eab9fbc 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -2,21 +2,38 @@ version: "2" linters: default: none enable: + - errcheck - govet + - staticcheck exclusions: presets: - comments - common-false-positives - legacy - std-error-handling + rules: + - linters: + - dupl + - errcheck + - gocyclo + - gosec + path: _test\.go + - linters: + - forbidigo + path-except: _test\.go paths: - - vendor + - .*_test\.go$ + - examples/ - third_party$ - builtin$ - examples$ formatters: + enable: + - goimports exclusions: paths: + - .*_test\.go$ + - examples/ - third_party$ - builtin$ - examples$ diff --git a/.version b/.version new file mode 100644 index 000000000..6eaf89433 --- /dev/null +++ b/.version @@ -0,0 +1 @@ +v2.0.0 \ No newline at end of file diff --git a/clients/grpcc/client.go b/clients/grpcc/client.go index 636212687..7d741b111 100644 --- a/clients/grpcc/client.go +++ b/clients/grpcc/client.go @@ -35,7 +35,7 @@ func New(cfg *grpccconfig.Cfg, p Params, middlewares ...lava.Middleware) Client middlewares: middlewares, } - vars.RegisterValue(fmt.Sprintf("%s-grpc-client-config", cfg.Service.Name), cfg) + vars.Register(fmt.Sprintf("%s-grpc-client-config", cfg.Service.Name), func() any { return cfg }) return c } @@ -82,7 +82,7 @@ func (t *clientImpl) NewStream(ctx context.Context, desc *grpc.StreamDesc, metho // Get new grpc client func (t *clientImpl) Get() (r result.Result[grpc.ClientConnInterface]) { - defer result.RecoveryErr(&r) + defer result.Recovery(&r) if t.conn != nil { return r.WithValue(t.conn) diff --git a/clients/grpcc/middleware.go b/clients/grpcc/middleware.go index 9c8adecfd..e62a6cf8a 100644 --- a/clients/grpcc/middleware.go +++ b/clients/grpcc/middleware.go @@ -29,9 +29,9 @@ func md2Head(md metadata.MD, header interface{ Add(key, value string) }) { } func head2md(header *lava.RequestHeader, md metadata.MD) { - header.VisitAll(func(key, value []byte) { + for key, value := range header.All() { md.Append(convert.BtoS(key), convert.BtoS(value)) - }) + } } func unaryInterceptor(middlewares []lava.Middleware) grpc.UnaryClientInterceptor { diff --git a/clients/resty/jar.go b/clients/resty/jar.go index fa2743973..e5a1677c1 100644 --- a/clients/resty/jar.go +++ b/clients/resty/jar.go @@ -41,14 +41,14 @@ func (j *Jar) Middleware(next lava.HandlerFunc) lava.HandlerFunc { return nil, err } - rsp.Header().VisitAllCookie(func(key, value []byte) { + for _, value := range rsp.Header().All() { acquireCookie := fasthttp.AcquireCookie() if err := acquireCookie.ParseBytes(value); err != nil { j.log.Err(err, ctx).Msg("failed to parse cookie") } else { j.cookies[string(acquireCookie.Key())] = acquireCookie } - }) + } return rsp, err } diff --git a/cmds/depcmd/cmd.go b/cmds/depcmd/cmd.go index 5b1c695d5..103c3cf92 100644 --- a/cmds/depcmd/cmd.go +++ b/cmds/depcmd/cmd.go @@ -8,6 +8,7 @@ import ( "github.com/olekukonko/tablewriter" "github.com/pubgo/dix" + "github.com/pubgo/funk/assert" "github.com/pubgo/funk/pretty" "github.com/pubgo/funk/recovery" "github.com/pubgo/funk/running" @@ -46,12 +47,12 @@ func New(di *dix.Dix) *cli.Command { case "table", "tb", "t": table := tablewriter.NewWriter(os.Stdout) table.Header([]string{"path", "Version", "Replace"}) - table.Append([]string{info.Main.Path, version.Version(), replace(info.Main.Replace)}) + assert.Must(table.Append([]string{info.Main.Path, version.Version(), replace(info.Main.Replace)})) for _, dep := range info.Deps { - table.Append([]string{dep.Path, dep.Version, replace(dep.Replace)}) + assert.Must(table.Append([]string{dep.Path, dep.Version, replace(dep.Replace)})) } - table.Render() + assert.Must(table.Render()) case "di": fmt.Println(di.Graph().Objects) fmt.Println(di.Graph().Providers) diff --git a/cmds/grpcservercmd/cmd.go b/cmds/grpcservercmd/cmd.go index 797e4b86f..1a81333f9 100644 --- a/cmds/grpcservercmd/cmd.go +++ b/cmds/grpcservercmd/cmd.go @@ -30,7 +30,7 @@ func New(di *dix.Dix) *cli.Command { assert.Exit(manager.Add(svc)) } - return manager.Run() + return manager.Run(ctx) }, } } diff --git a/cmds/httpservercmd/cmd.go b/cmds/httpservercmd/cmd.go index a22240443..c70febf18 100644 --- a/cmds/httpservercmd/cmd.go +++ b/cmds/httpservercmd/cmd.go @@ -30,7 +30,7 @@ func New(di *dix.Dix) *cli.Command { assert.Exit(manager.Add(svc)) } - return manager.Run() + return manager.Run(ctx) }, } } diff --git a/cmds/schedulercmd/cmd.go b/cmds/schedulercmd/cmd.go index 4427c235a..85c4768f1 100644 --- a/cmds/schedulercmd/cmd.go +++ b/cmds/schedulercmd/cmd.go @@ -37,7 +37,7 @@ func New(di *dix.Dix) *cli.Command { assert.Exit(manager.Add(svc)) } - return manager.Run() + return manager.Run(ctx) }, } } diff --git a/cmds/servecmd/cmd.go b/cmds/servecmd/cmd.go deleted file mode 100644 index abd524fe1..000000000 --- a/cmds/servecmd/cmd.go +++ /dev/null @@ -1,120 +0,0 @@ -package servecmd - -import ( - "context" - "crypto/sha256" - "fmt" - "log" - "net/http" - "os" - "path" - "time" - - "github.com/pubgo/funk/recovery" - cli "github.com/urfave/cli/v3" -) - -// customFileServer wraps the standard FileServer to add custom headers and ETag support -type customFileServer struct { - root http.FileSystem - fs http.Handler -} - -func (s *customFileServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { - urlPath := path.Clean(r.URL.Path) - - // Handle special health check endpoints - if urlPath == "/healthz" || urlPath == "/ping" { - if urlPath == "/healthz" { - w.Write([]byte("OK")) - } else { - w.Write([]byte("pong")) - } - return - } - - // Check if the path exists and get file info - f, err := s.root.Open(urlPath) - if err != nil { - s.fs.ServeHTTP(w, r) - return - } - defer f.Close() - - fi, err := f.Stat() - if err != nil { - s.fs.ServeHTTP(w, r) - return - } - - // Generate ETag based on file size and modification time - etag := generateETag(fi) - w.Header().Set("ETag", etag) - - // Check if client sent If-None-Match header - if match := r.Header.Get("If-None-Match"); match != "" { - if match == etag { - // Resource not modified, return 304 - w.WriteHeader(http.StatusNotModified) - return - } - } - // Let the standard FileServer handle the rest - s.fs.ServeHTTP(w, r) -} - -// generateETag creates an ETag value based on file modification time and size -func generateETag(fi os.FileInfo) string { - modTime := fi.ModTime().UTC().Format(time.RFC3339Nano) - size := fi.Size() - hash := sha256.New() - fmt.Fprintf(hash, "%s-%d", modTime, size) - return fmt.Sprintf(`"%x"`, hash.Sum(nil)) -} - -func New() *cli.Command { - var ( - flagVerbose bool - ) - - return &cli.Command{ - Name: "serve", - Usage: "serve `pwd` via http at *:8080", - Flags: []cli.Flag{ - &cli.BoolFlag{ - Name: "verbose", - Usage: "verbose", - Local: true, - Value: flagVerbose, - Destination: &flagVerbose, - }, - }, - Action: func(ctx context.Context, command *cli.Command) error { - defer recovery.Exit() - - wd, err := os.Getwd() - if err != nil { - panic(err) - } - - port := "8080" - if p := os.Getenv("PORT"); p != "" { - port = p - } - fmt.Printf("http://localhost:%v/\n", port) - - fileSystem := http.Dir(wd) - fileServer := http.FileServer(fileSystem) - var handler http.Handler = &customFileServer{root: fileSystem, fs: fileServer} - - if flagVerbose { - h := handler - handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - log.Printf("%s %s", r.Method, r.URL.Path) - h.ServeHTTP(w, r) - }) - } - panic(http.ListenAndServe(fmt.Sprintf(":%v", port), handler)) - }, - } -} diff --git a/cmds/servefilecmd/cmd.go b/cmds/servefilecmd/cmd.go new file mode 100644 index 000000000..ff78fa248 --- /dev/null +++ b/cmds/servefilecmd/cmd.go @@ -0,0 +1,52 @@ +package servefilecmd + +import ( + "context" + "fmt" + "os" + + "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/log" + "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/running" + "github.com/pubgo/funk/v2/result" + cli "github.com/urfave/cli/v3" + "github.com/valyala/fasthttp" +) + +func New() *cli.Command { + return &cli.Command{ + Name: "servefile", + Usage: "serve `pwd` via http at *:8080", + Flags: []cli.Flag{}, + Action: func(ctx context.Context, command *cli.Command) error { + defer recovery.Exit() + + wd := result.Wrap(os.Getwd()).Must() + + port := running.HttpPort + log.Info().Msgf("file dir: %s", wd) + log.Info().Msgf("http://localhost:%v", port) + + fs := &fasthttp.FS{ + Root: wd, + IndexNames: []string{"index.html"}, + GenerateIndexPages: true, + Compress: false, + AcceptByteRange: true, + //PathRewrite: fasthttp.NewVHostPathRewriter(0), + } + + s := &fasthttp.Server{ + Handler: fs.NewRequestHandler(), + Logger: log.NewStd(log.GetLogger("servefile")), + } + go func() { + assert.Must(s.ListenAndServe(fmt.Sprintf(":%v", port))) + }() + + <-ctx.Done() + return s.ShutdownWithContext(ctx) + }, + } +} diff --git a/core/encoding/protobuf/codec.go b/core/encoding/protobuf/codec.go index ad444ffd5..85291f33e 100644 --- a/core/encoding/protobuf/codec.go +++ b/core/encoding/protobuf/codec.go @@ -6,7 +6,6 @@ import ( "github.com/pubgo/lava/v2/core/encoding" "google.golang.org/protobuf/proto" - pb "google.golang.org/protobuf/proto" ) var Name = "proto" @@ -23,8 +22,8 @@ func (c protobufCodec) Marshal(v interface{}) ([]byte, error) { return proto.Marshal(m) } - if m, ok := v.(pb.Message); ok { - return pb.Marshal(m) + if m, ok := v.(proto.Message); ok { + return proto.Marshal(m) } return nil, fmt.Errorf("%T is not a proto.Marshaler", v) @@ -35,8 +34,8 @@ func (c protobufCodec) Unmarshal(data []byte, v interface{}) error { return proto.Unmarshal(data, m) } - if m, ok := v.(pb.Message); ok { - return pb.Unmarshal(data, m) + if m, ok := v.(proto.Message); ok { + return proto.Unmarshal(data, m) } return fmt.Errorf("%T is not a proto.Unmarshaler", v) @@ -52,8 +51,8 @@ func (c protobufCodec) Encode(i interface{}) ([]byte, error) { return proto.Marshal(m) } - if m, ok := i.(pb.Message); ok { - return pb.Marshal(m) + if m, ok := i.(proto.Message); ok { + return proto.Marshal(m) } return nil, fmt.Errorf("%T is not a proto.Marshaler", i) @@ -65,8 +64,8 @@ func (c protobufCodec) Decode(data []byte, i interface{}) error { return proto.Unmarshal(data, m) } - if m, ok := i.(pb.Message); ok { - return pb.Unmarshal(data, m) + if m, ok := i.(proto.Message); ok { + return proto.Unmarshal(data, m) } return fmt.Errorf("%T is not a proto.Unmarshaler", i) diff --git a/core/lavabuilder/builder.go b/core/lavabuilder/builder.go index 6777c6d5f..d3df53e48 100644 --- a/core/lavabuilder/builder.go +++ b/core/lavabuilder/builder.go @@ -23,7 +23,7 @@ import ( "github.com/pubgo/lava/v2/core/lifecycle/lifecyclebuilder" "github.com/pubgo/lava/v2/core/logging/logbuilder" "github.com/pubgo/lava/v2/core/metrics/metricbuilder" - "github.com/pubgo/lava/v2/core/signal" + "github.com/pubgo/lava/v2/core/signals" "github.com/pubgo/lava/v2/pkg/cmdutil" _ "github.com/pubgo/lava/v2/core/debug/debug" @@ -91,6 +91,6 @@ func Run(di *dix.Dix) { } sort.Sort(cli.FlagsByName(app.Flags)) - assert.Must(app.Run(signal.Context(), os.Args)) + assert.Must(app.Run(signals.Context(), os.Args)) }) } diff --git a/core/metrics/drivers/prometheus/reporter.go b/core/metrics/drivers/prometheus/reporter.go index d1fe55b0b..8ecaa648b 100644 --- a/core/metrics/drivers/prometheus/reporter.go +++ b/core/metrics/drivers/prometheus/reporter.go @@ -1,7 +1,6 @@ package prometheus import ( - "github.com/prometheus/common/model" "github.com/pubgo/funk/assert" "github.com/pubgo/funk/log" tally "github.com/uber-go/tally/v4" @@ -28,7 +27,6 @@ func New(conf *metrics.Config, log log.Logger) *tally.ScopeOptions { opts := tally.ScopeOptions{} opts.Separator = prometheus.DefaultSeparator //opts.SanitizeOptions = &prometheus.DefaultSanitizerOpts - model.NameValidationScheme = model.UTF8Validation proCfg := &prometheus.Configuration{TimerType: "histogram"} diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index b2a17ef4b..3e4db46db 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -34,28 +34,26 @@ type ResponseParams struct { } func New(m lifecycle.Lifecycle, logger log.Logger, metric metrics.Metric, configs []*Config, routers []JobRegister, executors []JobExecutor) (_ *Scheduler, gErr error) { - defer result.Recovery(&gErr) - configMap := createConfig(configs). - Log(func(e *zerolog.Event) { - e.Any("configs", configs) - e.Any(logfields.Msg, "failed to create config") - }). - Must() + defer result.RecoveryErr(&gErr) + + configMap := result.Wrap(createConfig(configs)).Must(func(e *zerolog.Event) { + e.Any("configs", configs) + e.Any(logfields.Msg, "failed to create config") + }) ctx, cancel := context.WithCancel(context.Background()) slogLogger := qlog.NewSlogLogger(ctx, slog.With(slog.String(logfields.Module, Name))) scheduler := result.Wrap(quartz.NewStdScheduler(quartz.WithLogger(slogLogger), quartz.WithJobMetadata())). - Log(func(e *zerolog.Event) { + Must(func(e *zerolog.Event) { e.Str(logfields.Msg, "failed to create scheduler") - }). - Must() + }) jobExecutors := make(map[string]JobExecutor) for _, executor := range executors { - regJobExecutor(jobExecutors, executor).Log(func(e *zerolog.Event) { + regJobExecutor(jobExecutors, executor).Must(func(e *zerolog.Event) { e.Str(logfields.Msg, "failed to register job executor") - }).Must() + }) } quart := &Scheduler{ @@ -73,12 +71,10 @@ func New(m lifecycle.Lifecycle, logger log.Logger, metric metrics.Metric, config r.RegisterSchedulerJob(quart) } - quart.start() - m.BeforeStop(lifecycle.WrapNoCtxErr(quart.stop)) + m.AfterStart(func(ctx context.Context) error { return lifecycle.WrapNoCtxErr(quart.start)(ctx) }) + m.BeforeStop(func(ctx context.Context) error { return lifecycle.WrapNoCtxErr(quart.stop)(ctx) }) - vars.Register(vars.UniqueName(Name), func() interface{} { - return quart.ListJobs() - }) + vars.Register(vars.UniqueName(Name), func() any { return quart.ListJobs() }) return quart, nil } diff --git a/core/scheduler/config.go b/core/scheduler/config.go index 7d923877d..f53b22d6b 100644 --- a/core/scheduler/config.go +++ b/core/scheduler/config.go @@ -1,30 +1,33 @@ package scheduler import ( + "fmt" "time" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/log/logfields" "github.com/pubgo/funk/v2/result" "github.com/reugn/go-quartz/quartz" + "github.com/rs/zerolog" "github.com/samber/lo" ) -func createConfig(configs []*Config) (r result.Result[map[string]*JobConfig]) { +func createConfig(configs []*Config) (map[string]*JobConfig, error) { configMap := make(map[string]*JobConfig) if len(configs) == 0 || configs[0] == nil { - return r.WithValue(configMap) + return configMap, nil } for _, config := range configs[0].JobConfigs { if config.Name == "" { - return r.WithErrorf("schedule job name is empty") + return nil, errors.Errorf("schedule job name is empty") } if _, ok := configMap[config.Name]; ok { - return r.WithErrorf("schedule job(%s) exists", config.Name) + return nil, errors.Errorf("schedule job(%s) exists", config.Name) } } - return r.WithValue(configMap) + return configMap, nil } func defaultConfig(name string) *JobConfig { @@ -40,7 +43,8 @@ func defaultConfig(name string) *JobConfig { } } -func initAndMergeConfig(name string, jobConfigs ...*JobConfig) (r result.Result[*JobConfig]) { +func initAndMergeConfig(name string, jobConfigs ...*JobConfig) (_ *JobConfig, gErr error) { + defer result.RecoveryErr(&gErr) cfg := defaultConfig(name) for _, jobConfig := range jobConfigs { if jobConfig == nil { @@ -71,19 +75,13 @@ func initAndMergeConfig(name string, jobConfigs ...*JobConfig) (r result.Result[ cfg.Location = jobConfig.Location } - locationRes := result.Wrap(time.LoadLocation(lo.FromPtr(cfg.Location))) - locationRes.InspectErr(func(err error) { - log.Err(err).Msgf("failed to parse time location:%s", lo.FromPtr(cfg.Location)) - }) - locationRes.Inspect(func(location *time.Location) { - cfg.location = location - }) - if locationRes.CatchErr(&r) { - return - } + cfg.location = result.Wrap(time.LoadLocation(lo.FromPtr(cfg.Location))). + Must(func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf("failed to parse time location:%s", lo.FromPtr(cfg.Location))) + }) } - return r.WithValue(cfg) + return cfg, nil } type JobConfig struct { diff --git a/core/scheduler/job.go b/core/scheduler/job.go index cdf167185..3e1412b6e 100644 --- a/core/scheduler/job.go +++ b/core/scheduler/job.go @@ -54,7 +54,7 @@ func (t *namedJob) Execute(ctx context.Context) (gErr error) { } if t.task.trigger.err != nil { - if !(t.task.spec.Once != nil && errors.Is(t.task.trigger.err, quartz.ErrTriggerExpired)) { + if !errors.Is(t.task.trigger.err, quartz.ErrTriggerExpired) || t.task.spec.Once == nil { return fmt.Errorf("schedule job(%s) trigger error: %w", name, t.task.trigger.err) } } diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index 82d25e853..4bd0fd2d6 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -6,6 +6,7 @@ import ( "time" "github.com/pubgo/funk/log" + "github.com/pubgo/funk/log/logfields" "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/v2/core/metrics" "github.com/reugn/go-quartz/quartz" @@ -54,7 +55,7 @@ func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { s.log.Info().Func(logFn).Msg("register scheduler job ok") } }() - defer result.RecoveryErr(&r) + defer result.Recovery(&r) if spec.Name == "" { return r.WithErrorf("job name is empty") @@ -83,9 +84,9 @@ func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { return } - config := initAndMergeConfig(name, s.configMap[name], spec.Config). - InspectErr(func(err error) { - s.log.Err(err).Msgf("failed to init schedule job(%s) config", name) + config := result.Wrap(initAndMergeConfig(name, s.configMap[name], spec.Config)). + Log(func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf("failed to init schedule job(%s) config", name)) }). Inspect(func(config *JobConfig) { task.spec.Config = config @@ -134,9 +135,9 @@ func (s *Scheduler) PatchJob(name string, config *JobConfig) (r result.Error) { return } - initAndMergeConfig(name, job.spec.Config, config). - InspectErr(func(err error) { - s.log.Err(err).Msgf("failed to patch schedule job(%s) config", name) + result.Wrap(initAndMergeConfig(name, job.spec.Config, config)). + Log(func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf("failed to patch schedule job(%s) config", name)) }). Inspect(func(config *JobConfig) { job.spec.Config = config diff --git a/core/scheduler/schedulerdebug/html.go b/core/scheduler/schedulerdebug/html.go index 2391868b3..c9be21927 100644 --- a/core/scheduler/schedulerdebug/html.go +++ b/core/scheduler/schedulerdebug/html.go @@ -9,9 +9,9 @@ import ( "github.com/pubgo/lava/v2/core/scheduler" "github.com/samber/lo" - . "maragu.dev/gomponents" + . "maragu.dev/gomponents" //nolint _ "maragu.dev/gomponents/components" - . "maragu.dev/gomponents/html" + . "maragu.dev/gomponents/html" //nolint ) type NodeFn func() Node @@ -54,7 +54,7 @@ func ListSchedulers(schedulers []*scheduler.Job) Node { Th(Text(string(s.Result))), Th(Textf("%v", s.Runs)), Th(NodeFn(func() Node { - modeId := fmt.Sprintf(hex.EncodeToString([]byte(s.Spec.Name))) + modeId := hex.EncodeToString([]byte(s.Spec.Name)) return Group{ Script(Rawf(`function model%s(params) {document.getElementById('%s').showModal()}`, modeId, modeId)), Button( diff --git a/core/signal/signal.go b/core/signal/signal.go deleted file mode 100644 index daa6dbdab..000000000 --- a/core/signal/signal.go +++ /dev/null @@ -1,62 +0,0 @@ -package signal - -import ( - "context" - "os" - "os/signal" - "syscall" - - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/try" - "github.com/samber/lo" -) - -const Name = "signal" - -var logger = log.GetLogger(Name) - -var signals = []os.Signal{syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP, syscall.SIGUSR1} - -func getCh() chan os.Signal { - ch := make(chan os.Signal, 1) - signal.Notify(ch, signals...) - return ch -} - -func Wait() { - sig := <-getCh() - logger.Info().Str("signal", sig.String()).Msg("signal trigger notify") -} - -func Context() context.Context { - ctx, cancel := context.WithCancel(context.Background()) - ch := getCh() - go func() { <-ch; cancel() }() - return ctx -} - -func WaitRestart(start func() error, close func() error, restart func() error) error { - err := start() - if err != nil { - return err - } - - sigChan := getCh() - for sig := range sigChan { - logger.Info().Str("signal", sig.String()).Msg("signal trigger notify") - switch sig { - case syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT: - logger.Info().Str("signal", sig.String()).Msg("stop trigger") - return try.Try(close) - case syscall.SIGHUP, syscall.SIGUSR1: - logger.Info().Str("signal", sig.String()).Msg("restart trigger") - err := try.Try(restart) - if err != nil { - logger.Err(err).Msg("supervisor service restart failed") - } - continue - } - logger.Error().Msgf("unknown signal: %s, should in signals(%v)", sig, lo.Map(signals, func(s os.Signal, _ int) string { return s.String() })) - } - return nil -} diff --git a/core/signals/signal.go b/core/signals/signal.go new file mode 100644 index 000000000..17d16f526 --- /dev/null +++ b/core/signals/signal.go @@ -0,0 +1,40 @@ +package signals + +import ( + "context" + "os" + "os/signal" + "syscall" + + "github.com/pubgo/funk/log" +) + +const Name = "signals" + +var logger = log.GetLogger(Name) + +// Inspired by +// https://github.com/kubernetes-sigs/controller-runtime/blob/8499b67e316a03b260c73f92d0380de8cd2e97a1/pkg/manager/signals/signal.go#L25 +var onlyOneSignalHandler = make(chan struct{}) + +// var signals = []os.Signal{syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP, syscall.SIGUSR1} +var shutdownSignals = []os.Signal{syscall.SIGTERM, syscall.SIGQUIT, os.Interrupt, os.Kill} + +func Context() context.Context { + close(onlyOneSignalHandler) + + ctx, cancel := context.WithCancel(context.Background()) + ch := make(chan os.Signal, 2) + signal.Notify(ch, shutdownSignals...) + go func() { + sig := <-ch + logger.Info().Str("signal", sig.String()).Msg("cancelling context, received signal") + cancel() + sig = <-ch + logger.Info().Str("signal", sig.String()).Msg("os exit, received twice signal") + os.Exit(1) + + }() + + return ctx +} diff --git a/core/supervisor/aaa.go b/core/supervisor/aaa.go index de7d52493..760de73c9 100644 --- a/core/supervisor/aaa.go +++ b/core/supervisor/aaa.go @@ -9,7 +9,7 @@ import ( type Supervisor = suture.Supervisor -type ServiceMetric struct { +type Metric struct { Name string Error string Restart uint32 @@ -22,7 +22,7 @@ type Service interface { Error() error String() string Serve(ctx context.Context) error - Metrics() *ServiceMetric + Metric() *Metric } type serviceFn func(ctx context.Context) error diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go index d24d39163..b29a632e5 100644 --- a/core/supervisor/manager.go +++ b/core/supervisor/manager.go @@ -17,7 +17,6 @@ import ( "github.com/pubgo/lava/v2/core/debug" "github.com/pubgo/lava/v2/core/lifecycle" - "github.com/pubgo/lava/v2/core/signal" "github.com/pubgo/lava/v2/internal/logutil" ) @@ -31,10 +30,7 @@ func Default(lc lifecycle.Getter) *Manager { } func NewManager(name string, lc lifecycle.Getter) *Manager { - ctx, cancel := context.WithCancel(context.Background()) m := &Manager{ - cancel: cancel, - ctx: ctx, lc: lc, supervisor: suture.New(name, SpecWithInfoLogger()), services: make(map[string]*serviceWrapper), @@ -48,16 +44,14 @@ type Manager struct { logger log.Logger supervisor *Supervisor services map[string]*serviceWrapper - ctx context.Context - cancel context.CancelFunc } func (m *Manager) init() *Manager { debug.Route("/supervisor", func(router fiber.Router) { router.Get("services", func(ctx *fiber.Ctx) error { - var services []*ServiceMetric + var services []*Metric for _, srv := range m.services { - services = append(services, srv.service.Metrics()) + services = append(services, srv.service.Metric()) } return ctx.JSON(services) }) @@ -152,8 +146,7 @@ func (m *Manager) Services() []Service { return services } -func (m *Manager) start() error { - ctx := m.ctx +func (m *Manager) start(ctx context.Context) error { defer recovery.Exit() logutil.OkOrFailed(m.logger, "service before-start", func() error { defer recovery.Exit() @@ -185,10 +178,9 @@ func (m *Manager) start() error { return nil } -func (m *Manager) stop() error { +func (m *Manager) stop(ctx context.Context) error { defer recovery.DebugPrint() - ctx := m.ctx logutil.OkOrFailed(m.logger, "service before-stop", func() error { for _, run := range m.lc.GetBeforeStops() { logutil.LogOrErr(m.logger, fmt.Sprintf("running %s", stack.CallerWithFunc(run.Exec)), func() error { @@ -198,8 +190,6 @@ func (m *Manager) stop() error { return nil }) - m.cancel() - unstoppedServices, _ := m.supervisor.UnstoppedServiceReport() if len(unstoppedServices) > 0 { for _, service := range unstoppedServices { @@ -220,8 +210,15 @@ func (m *Manager) stop() error { return nil } -func (m *Manager) Run() error { - return signal.WaitRestart(m.start, m.stop, m.RestartServices) +func (m *Manager) Run(ctx context.Context) error { + err := m.start(ctx) + if err != nil { + return err + } + + <-ctx.Done() + + return m.stop(ctx) } func (m *Manager) Serve(ctx context.Context) error { diff --git a/core/supervisor/service.go b/core/supervisor/service.go index 578001c08..4b8afc21a 100644 --- a/core/supervisor/service.go +++ b/core/supervisor/service.go @@ -32,9 +32,9 @@ type serviceImpl struct { metric *serviceMetric } -func (s *serviceImpl) Metrics() *ServiceMetric { +func (s *serviceImpl) Metric() *Metric { metric := s.metric - return &ServiceMetric{ + return &Metric{ Name: s.name, Error: metric.Error.Load(), Restart: metric.Restart.Load(), @@ -68,7 +68,7 @@ func (s *serviceImpl) Serve(ctx context.Context) (gErr error) { log.Info(ctx). Str("service", s.name). - Any("metrics", s.Metrics()). + Any("metrics", s.Metric()). Msg("stop service") }() defer recovery.Err(&gErr) @@ -78,7 +78,7 @@ func (s *serviceImpl) Serve(ctx context.Context) (gErr error) { log.Info(ctx).Str("service", s.name).Msg("start service") err := s.fn(ctx) if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { - return fmt.Errorf("non-context error, service=%s meta=%v err=%w", s.name, s.Metrics(), err) + return fmt.Errorf("non-context error, service=%s meta=%v err=%w", s.name, s.Metric(), err) } return err } diff --git a/core/tracing/config.go b/core/tracing/config.go index 7d943217a..f681c0f1a 100644 --- a/core/tracing/config.go +++ b/core/tracing/config.go @@ -40,7 +40,7 @@ type Config struct { prettyPrint bool bspOptions []sdktrace.BatchSpanProcessorOption - // Metrics options + // Metric options metricsEnabled bool metricOptions []metric.Option diff --git a/core/tracing/telemetry.go b/core/tracing/telemetry.go index 82558d73c..ba677e757 100644 --- a/core/tracing/telemetry.go +++ b/core/tracing/telemetry.go @@ -21,7 +21,6 @@ import ( "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" otelmetric "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/propagation" - "go.opentelemetry.io/otel/sdk/metric" sdkmetric "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" @@ -212,7 +211,7 @@ func GetTraceId(ctx context.Context) string { return oteltrace.SpanContextFromContext(ctx).TraceID().String() } -func initMetricExporter(config *Config) (metric.Exporter, error) { +func initMetricExporter(config *Config) (sdkmetric.Exporter, error) { if config.metricExporter.ExporterEndpoint == DefaultStdout { encoder := json.NewEncoder(os.Stdout) return stdoutmetric.New(stdoutmetric.WithEncoder(encoder)) diff --git a/core/tracing/tracingbuilder/config.go b/core/tracing/tracingbuilder/config.go index 0ba57715a..5d5dda310 100644 --- a/core/tracing/tracingbuilder/config.go +++ b/core/tracing/tracingbuilder/config.go @@ -51,7 +51,7 @@ type Config struct { prettyPrint bool bspOptions []sdktrace.BatchSpanProcessorOption - // Metrics options + // Metric options metricsEnabled bool metricOptions []metric.Option @@ -69,7 +69,7 @@ type ServiceInfo struct { Version string } -// OTLP contains specific configuration used by the OpenTelemetry Metrics exporter. +// OTLP contains specific configuration used by the OpenTelemetry Metric exporter. type OTLP struct { GRPC *OtelGRPC `description:"gRPC configuration for the OpenTelemetry collector." json:"grpc,omitempty" toml:"grpc,omitempty" yaml:"grpc,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` HTTP *OtelHTTP `description:"HTTP configuration for the OpenTelemetry collector." json:"http,omitempty" toml:"http,omitempty" yaml:"http,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` diff --git a/core/tracing/tracingbuilder/telemetry.go b/core/tracing/tracingbuilder/telemetry.go index 9b59360e3..171c21374 100644 --- a/core/tracing/tracingbuilder/telemetry.go +++ b/core/tracing/tracingbuilder/telemetry.go @@ -2,14 +2,15 @@ package tracingbuilder import ( "context" + "encoding/json" "errors" "fmt" "os" "time" - "github.com/goccy/go-json" - "github.com/pubgo/funk/assert" "github.com/pubgo/funk/log" + "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/result" "github.com/pubgo/funk/version" "github.com/pubgo/lava/v2/core/lifecycle" "go.opentelemetry.io/otel" @@ -21,7 +22,6 @@ import ( "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" otelmetric "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/propagation" - "go.opentelemetry.io/otel/sdk/metric" sdkmetric "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" @@ -43,6 +43,7 @@ type Params struct { } func New(params Params) Provider { + defer recovery.Exit() config := &Config{ traceExporter: &Exporter{}, metricExporter: &Exporter{}, @@ -55,8 +56,8 @@ func New(params Params) Provider { sampleRatio: 1, } - tracerProvider := NewTracerProvider(config) - meterProvider := NewMeterProvider(config) + tracerProvider := NewTracerProvider(config).Must() + meterProvider := NewMeterProvider(config).Must() propagator := propagation.NewCompositeTextMapPropagator( propagation.TraceContext{}, propagation.Baggage{}, @@ -90,14 +91,15 @@ func New(params Params) Provider { } // merge config resource with default resource -func mergeResource(config *Config) *resource.Resource { - res := assert.Must1(resource.New(context.Background(), +func mergeResource(config *Config) (r result.Result[*resource.Resource]) { + defer result.RecoveryErr(&r) + res := result.Wrap(resource.New(context.Background(), resource.WithFromEnv(), resource.WithTelemetrySDK(), resource.WithOSType(), resource.WithProcessCommandArgs(), - )) - res = assert.Must1(resource.Merge(resource.Default(), res)) + )).Must() + res = result.Wrap(resource.Merge(resource.Default(), res)).Must() hostname, _ := os.Hostname() defaultResource := resource.NewWithAttributes( @@ -109,15 +111,16 @@ func mergeResource(config *Config) *resource.Resource { semconv.ProcessPIDKey.Int(os.Getpid()), semconv.ProcessCommandKey.String(os.Args[0]), ) - res = assert.Must1(resource.Merge(resource.Default(), defaultResource)) + res = result.Wrap(resource.Merge(defaultResource, res)).Log().Must() - return res + return r.WithValue(res) } -func NewTracerProvider(config *Config) *sdktrace.TracerProvider { - res := mergeResource(config) +func NewTracerProvider(config *Config) (r result.Result[*sdktrace.TracerProvider]) { + defer result.RecoveryErr(&r) + res := mergeResource(config).Log().Must() - traceExporter := assert.Must1(newGrpcTracerExporter(config)) + traceExporter := result.Wrap(newGrpcTracerExporter(config)).Log().Must() sampler := sdktrace.ParentBased(sdktrace.AlwaysSample()) if config.sampleRatio < 1 && config.sampleRatio >= 0 { sampler = sdktrace.ParentBased(sdktrace.TraceIDRatioBased(config.sampleRatio)) @@ -143,7 +146,7 @@ func NewTracerProvider(config *Config) *sdktrace.TracerProvider { }), ) - return traceProvider + return r.WithValue(traceProvider) } func newGrpcTracerExporter(config *Config) (sdktrace.SpanExporter, error) { @@ -168,7 +171,7 @@ func newGrpcTracerExporter(config *Config) (sdktrace.SpanExporter, error) { ) } -func newGrpcMetricExporter(config *Config) (metric.Exporter, error) { +func newGrpcMetricExporter(config *Config) (sdkmetric.Exporter, error) { if config.metricExporter.ExporterEndpoint == DefaultStdout { encoder := json.NewEncoder(os.Stdout) return stdoutmetric.New(stdoutmetric.WithEncoder(encoder)) @@ -190,17 +193,18 @@ func newGrpcMetricExporter(config *Config) (metric.Exporter, error) { return nil, fmt.Errorf("metric exporter endpoint is nil, no exporter is inited") } -func NewMeterProvider(config *Config) *sdkmetric.MeterProvider { - reader := metric.NewPeriodicReader(assert.Must1(newGrpcMetricExporter(config))) - readerOpt := sdkmetric.WithReader(reader) +func NewMeterProvider(config *Config) (r result.Result[*sdkmetric.MeterProvider]) { + defer result.RecoveryErr(&r) + //reader := metric.NewPeriodicReader(assert.Must1(newGrpcMetricExporter(config))) + //readerOpt := sdkmetric.WithReader(reader) - exporter := assert.Must1(otelprom.New()) - readerOpt = sdkmetric.WithReader(exporter) + exporter := result.Wrap(otelprom.New()).Must() + readerOpt := sdkmetric.WithReader(exporter) - res := mergeResource(config) + res := mergeResource(config).Must() provider := sdkmetric.NewMeterProvider( readerOpt, sdkmetric.WithResource(res), ) - return provider + return r.WithValue(provider) } diff --git a/go.mod b/go.mod index 885ad3f11..61b817a3f 100644 --- a/go.mod +++ b/go.mod @@ -54,9 +54,8 @@ require ( github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 github.com/maragudk/gomponents v0.22.0 github.com/maruel/panicparse/v2 v2.5.0 - github.com/prometheus/common v0.65.0 - github.com/pubgo/dix v0.3.22 - github.com/pubgo/funk v0.5.69-alpha.19 + github.com/pubgo/dix v0.3.22-alpha.1 + github.com/pubgo/funk v0.5.69-alpha.28 github.com/pubgo/protobuild v0.0.21 github.com/rs/xid v1.6.0 github.com/rs/zerolog v1.34.0 @@ -234,6 +233,7 @@ require ( github.com/polyfloyd/go-errorlint v1.6.0 // indirect github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 // indirect github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.65.0 // indirect github.com/prometheus/procfs v0.17.0 // indirect github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 // indirect github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect diff --git a/go.sum b/go.sum index fa142208c..218e7aa9c 100644 --- a/go.sum +++ b/go.sum @@ -502,10 +502,10 @@ github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2 github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= -github.com/pubgo/dix v0.3.22 h1:vhF+BN5TiWocS/RcwJ5Z0vpjWuqUVR5C5JJQ5VzvcuA= -github.com/pubgo/dix v0.3.22/go.mod h1:0MBvh8gFJpR/NZuSQOq6d2bsHKI+71dmFfceZowYIbE= -github.com/pubgo/funk v0.5.69-alpha.19 h1:yyGzMzlbPsBlLY+XQlY3mUVLGMii4IlQyE5YYe1+yMk= -github.com/pubgo/funk v0.5.69-alpha.19/go.mod h1:SZGEVvRPkPo2HQ9TTQS/HfXpQVM+oVDHw3i4pj1/6y0= +github.com/pubgo/dix v0.3.22-alpha.1 h1:Jt7l9OeyGmAHXjgaJoSxDIT4UMhuzN6VmcjX5n7B1kA= +github.com/pubgo/dix v0.3.22-alpha.1/go.mod h1:0Cf6eLpIlePrUAlEv4d3Zm3jEkGJKpNN6T2diU1yiAg= +github.com/pubgo/funk v0.5.69-alpha.28 h1:GgPBrSyQsIiwmhLVbvE0sXoSheiNbu9yfsvQ2+aQA+o= +github.com/pubgo/funk v0.5.69-alpha.28/go.mod h1:dBFx3ZnM6IML9tqK23ROTB9xX0Q27dLXUxAoSuh5mMI= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/pubgo/protobuild v0.0.21 h1:QSwh92QxsD6Mv7kQlowzE7fxtcOm1eMWmgADsD803Js= diff --git a/internal/examples/fileserve/main.go b/internal/examples/fileserve/main.go new file mode 100644 index 000000000..9812d3431 --- /dev/null +++ b/internal/examples/fileserve/main.go @@ -0,0 +1,16 @@ +package main + +import ( + "github.com/pubgo/funk/recovery" + "github.com/pubgo/lava/v2/cmds/servefilecmd" + "github.com/pubgo/lava/v2/core/lavabuilder" +) + +func main() { + defer recovery.Exit() + + builder := lavabuilder.New() + builder.Provide(servefilecmd.New) + + lavabuilder.Run(builder) +} diff --git a/internal/middlewares/middleware_serviceinfo/middleware.go b/internal/middlewares/middleware_serviceinfo/middleware.go index ecdd24ab4..051d780f3 100644 --- a/internal/middlewares/middleware_serviceinfo/middleware.go +++ b/internal/middlewares/middleware_serviceinfo/middleware.go @@ -7,12 +7,13 @@ import ( "github.com/pubgo/funk/running" "github.com/pubgo/funk/strutil" "github.com/pubgo/funk/version" + "github.com/rs/xid" + "github.com/pubgo/lava/v2/core/lavacontexts" "github.com/pubgo/lava/v2/lava" "github.com/pubgo/lava/v2/pkg/grpcutil" "github.com/pubgo/lava/v2/pkg/httputil" "github.com/pubgo/lava/v2/pkg/proto/lavapbv1" - "github.com/rs/xid" ) func New() lava.Middleware { diff --git a/pkg/fiberbuilder/config.go b/pkg/fiberbuilder/config.go index 8807f764b..b7fbc8c7d 100644 --- a/pkg/fiberbuilder/config.go +++ b/pkg/fiberbuilder/config.go @@ -1,13 +1,13 @@ package fiberbuilder import ( - "github.com/samber/lo" "log/slog" "time" "dario.cat/mergo" "github.com/gofiber/fiber/v2" "github.com/pubgo/funk/v2/result" + "github.com/samber/lo" ) type Config struct { @@ -115,7 +115,7 @@ func (t *Config) Build() (r result.Result[fiber.Config]) { return r.WithValue(fiber.New().Config()) } - defer result.RecoveryErr(&r) + defer result.Recovery(&r) cfg := fiber.New().Config() err := mergo.Merge(&cfg, lo.ToPtr(t.ToCfg()), mergo.WithOverride, mergo.WithAppendSlice) if err != nil { diff --git a/pkg/gateway/gatewayutils/query_params.go b/pkg/gateway/gatewayutils/query_params.go index 0355c9ce9..e642d4185 100644 --- a/pkg/gateway/gatewayutils/query_params.go +++ b/pkg/gateway/gatewayutils/query_params.go @@ -18,7 +18,6 @@ import ( "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" "google.golang.org/protobuf/types/known/durationpb" - "google.golang.org/protobuf/types/known/fieldmaskpb" fieldmask "google.golang.org/protobuf/types/known/fieldmaskpb" "google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/timestamppb" @@ -518,7 +517,7 @@ func parseParam(fds []protoreflect.FieldDescriptor, raw []byte) (param, error) { } return param{fds: fds, val: protoreflect.ValueOfMessage(msg.ProtoReflect())}, nil case "FieldMask": - var msg fieldmaskpb.FieldMask + var msg fieldmask.FieldMask if err := protojson.Unmarshal(quote(raw), &msg); err != nil { return param{}, errors.WrapCaller(err) } diff --git a/pkg/gateway/status_code.go b/pkg/gateway/grpccodes.go similarity index 100% rename from pkg/gateway/status_code.go rename to pkg/gateway/grpccodes.go diff --git a/pkg/gateway/transport_stream.go b/pkg/gateway/stream.go similarity index 100% rename from pkg/gateway/transport_stream.go rename to pkg/gateway/stream.go diff --git a/pkg/gateway/stream_grpc.go b/pkg/gateway/stream.grpc.go similarity index 100% rename from pkg/gateway/stream_grpc.go rename to pkg/gateway/stream.grpc.go diff --git a/pkg/gateway/stream_grpcweb.go b/pkg/gateway/stream.grpcweb.go similarity index 100% rename from pkg/gateway/stream_grpcweb.go rename to pkg/gateway/stream.grpcweb.go diff --git a/pkg/gateway/stream_http.go b/pkg/gateway/stream.http.go similarity index 100% rename from pkg/gateway/stream_http.go rename to pkg/gateway/stream.http.go diff --git a/pkg/gateway/stream_inprocess.go b/pkg/gateway/stream.inprocess.go similarity index 100% rename from pkg/gateway/stream_inprocess.go rename to pkg/gateway/stream.inprocess.go diff --git a/pkg/gateway/stream_proxy.go b/pkg/gateway/stream.proxy.go similarity index 100% rename from pkg/gateway/stream_proxy.go rename to pkg/gateway/stream.proxy.go diff --git a/pkg/gateway/stream_websocket.go b/pkg/gateway/stream.websocket.go similarity index 100% rename from pkg/gateway/stream_websocket.go rename to pkg/gateway/stream.websocket.go diff --git a/pkg/gateway/util.go b/pkg/gateway/util.go index dbc559f3f..8be6b4929 100644 --- a/pkg/gateway/util.go +++ b/pkg/gateway/util.go @@ -245,7 +245,7 @@ func resolvePathToDescriptors(msg protoreflect.MessageDescriptor, path string) ( for i, part := range parts { field := fields.ByName(protoreflect.Name(part)) if field == nil { - return nil, errors.Format("in field HttpPath %q: element %q does not correspond to any field of type %s", + return nil, errors.Errorf("in field HttpPath %q: element %q does not correspond to any field of type %s", path, part, msg.FullName()) } @@ -255,7 +255,7 @@ func resolvePathToDescriptors(msg protoreflect.MessageDescriptor, path string) ( } if field.Cardinality() == protoreflect.Repeated { - return nil, errors.Format("in field HttpPath %q: field %q of type %s should not be a list or map", path, part, msg.FullName()) + return nil, errors.Errorf("in field HttpPath %q: field %q of type %s should not be a list or map", path, part, msg.FullName()) } msg = field.Message() diff --git a/pkg/grpcbuilder/config.go b/pkg/grpcbuilder/config.go index cf4053f19..73d7cfcb4 100644 --- a/pkg/grpcbuilder/config.go +++ b/pkg/grpcbuilder/config.go @@ -61,7 +61,7 @@ type Config struct { } func (t *Config) Build(opts ...grpc.ServerOption) (r result.Result[*grpc.Server]) { - defer result.RecoveryErr(&r) + defer result.Recovery(&r) if t.KeepalivePolicy != nil { opts = append(opts, t.KeepalivePolicy.ToOpts()) diff --git a/pkg/httputil/fiber.go b/pkg/httputil/fiber.go index 381cc57b9..0b31939fe 100644 --- a/pkg/httputil/fiber.go +++ b/pkg/httputil/fiber.go @@ -196,9 +196,9 @@ func handlerFunc(h fasthttp.RequestHandler) http.HandlerFunc { h(&ctx) // Convert fasthttp Ctx > net/http - ctx.Response.Header.VisitAll(func(k, v []byte) { + for k, v := range ctx.Response.Header.All() { w.Header().Add(string(k), string(v)) - }) + } w.WriteHeader(ctx.Response.StatusCode()) _, _ = w.Write(ctx.Response.Body()) } diff --git a/pkg/httputil/util.go b/pkg/httputil/util.go index dab884381..ab67510ac 100644 --- a/pkg/httputil/util.go +++ b/pkg/httputil/util.go @@ -3,7 +3,7 @@ package httputil import ( "log/slog" "strings" - + "dario.cat/mergo" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cors" @@ -13,10 +13,11 @@ import ( "github.com/pubgo/funk/proto/errorpb" "github.com/pubgo/funk/running" "github.com/pubgo/funk/version" - "github.com/pubgo/lava/v2/pkg/fiberbuilder" "github.com/samber/lo" "github.com/valyala/fasthttp" "google.golang.org/grpc/codes" + + "github.com/pubgo/lava/v2/pkg/fiberbuilder" ) type Config struct { diff --git a/pkg/fiberbuilder/websocket.go b/pkg/wsbuilder/websocket.go similarity index 63% rename from pkg/fiberbuilder/websocket.go rename to pkg/wsbuilder/websocket.go index a5956499d..f02cd7c1e 100644 --- a/pkg/fiberbuilder/websocket.go +++ b/pkg/wsbuilder/websocket.go @@ -1,8 +1,6 @@ -package fiberbuilder +package wsbuilder import ( - "errors" - "io" "sync" "time" @@ -90,14 +88,14 @@ func NewWs(handler func(*fiber.Ctx, *Conn), config ...WsCfg) fiber.Handler { } // queries - c.Context().QueryArgs().VisitAll(func(key, value []byte) { + for key, value := range c.Context().QueryArgs().All() { conn.queries[string(key)] = string(value) - }) + } // cookies - c.Context().Request.Header.VisitAllCookie(func(key, value []byte) { + for key, value := range c.Context().Request.Header.All() { conn.cookies[string(key)] = string(value) - }) + } if err := upgrader.Upgrade(c.Context(), func(fconn *websocket.Conn) { conn.Conn = fconn @@ -185,79 +183,79 @@ func (conn *Conn) Cookies(key string, defaultValue ...string) string { // Constants are taken from https://github.com/fasthttp/websocket/blob/master/conn.go#L43 // Close codes defined in RFC 6455, section 11.7. -const ( - CloseNormalClosure = 1000 - CloseGoingAway = 1001 - CloseProtocolError = 1002 - CloseUnsupportedData = 1003 - CloseNoStatusReceived = 1005 - CloseAbnormalClosure = 1006 - CloseInvalidFramePayloadData = 1007 - ClosePolicyViolation = 1008 - CloseMessageTooBig = 1009 - CloseMandatoryExtension = 1010 - CloseInternalServerErr = 1011 - CloseServiceRestart = 1012 - CloseTryAgainLater = 1013 - CloseTLSHandshake = 1015 -) - -// The message types are defined in RFC 6455, section 11.8. -const ( - // TextMessage denotes a text data message. The text message payload is - // interpreted as UTF-8 encoded text data. - TextMessage = 1 - - // BinaryMessage denotes a binary data message. - BinaryMessage = 2 - - // CloseMessage denotes a close control message. The optional message - // payload contains a numeric code and text. Use the FormatCloseMessage - // function to format a close message payload. - CloseMessage = 8 - - // PingMessage denotes a ping control message. The optional message payload - // is UTF-8 encoded text. - PingMessage = 9 - - // PongMessage denotes a pong control message. The optional message payload - // is UTF-8 encoded text. - PongMessage = 10 -) - -var ( - ErrBadHandshake = errors.New("websocket: bad handshake") - ErrCloseSent = errors.New("websocket: close sent") - ErrReadLimit = errors.New("websocket: read limit exceeded") -) - -// FormatCloseMessage formats closeCode and text as a WebSocket close message. -// An empty message is returned for code CloseNoStatusReceived. -func FormatCloseMessage(closeCode int, text string) []byte { - return websocket.FormatCloseMessage(closeCode, text) -} - -// IsCloseError returns boolean indicating whether the error is a *CloseError -// with one of the specified codes. -func IsCloseError(err error, codes ...int) bool { - return websocket.IsCloseError(err, codes...) -} - -// IsUnexpectedCloseError returns boolean indicating whether the error is a -// *CloseError with a code not in the list of expected codes. -func IsUnexpectedCloseError(err error, expectedCodes ...int) bool { - return websocket.IsUnexpectedCloseError(err, expectedCodes...) -} - -// IsWebSocketUpgrade returns true if the client requested upgrade to the -// WebSocket protocol. -func IsWebSocketUpgrade(c *fiber.Ctx) bool { - return websocket.FastHTTPIsWebSocketUpgrade(c.Context()) -} - -// JoinMessages concatenates received messages to create a single io.Reader. -// The string term is appended to each message. The returned reader does not -// support concurrent calls to the Read method. -func JoinMessages(c *websocket.Conn, term string) io.Reader { - return websocket.JoinMessages(c, term) -} +//const ( +// CloseNormalClosure = 1000 +// CloseGoingAway = 1001 +// CloseProtocolError = 1002 +// CloseUnsupportedData = 1003 +// CloseNoStatusReceived = 1005 +// CloseAbnormalClosure = 1006 +// CloseInvalidFramePayloadData = 1007 +// ClosePolicyViolation = 1008 +// CloseMessageTooBig = 1009 +// CloseMandatoryExtension = 1010 +// CloseInternalServerErr = 1011 +// CloseServiceRestart = 1012 +// CloseTryAgainLater = 1013 +// CloseTLSHandshake = 1015 +//) +// +//// The message types are defined in RFC 6455, section 11.8. +//const ( +// // TextMessage denotes a text data message. The text message payload is +// // interpreted as UTF-8 encoded text data. +// TextMessage = 1 +// +// // BinaryMessage denotes a binary data message. +// BinaryMessage = 2 +// +// // CloseMessage denotes a close control message. The optional message +// // payload contains a numeric code and text. Use the FormatCloseMessage +// // function to format a close message payload. +// CloseMessage = 8 +// +// // PingMessage denotes a ping control message. The optional message payload +// // is UTF-8 encoded text. +// PingMessage = 9 +// +// // PongMessage denotes a pong control message. The optional message payload +// // is UTF-8 encoded text. +// PongMessage = 10 +//) +// +//var ( +// ErrBadHandshake = errors.New("websocket: bad handshake") +// ErrCloseSent = errors.New("websocket: close sent") +// ErrReadLimit = errors.New("websocket: read limit exceeded") +//) +// +//// FormatCloseMessage formats closeCode and text as a WebSocket close message. +//// An empty message is returned for code CloseNoStatusReceived. +//func FormatCloseMessage(closeCode int, text string) []byte { +// return websocket.FormatCloseMessage(closeCode, text) +//} +// +//// IsCloseError returns boolean indicating whether the error is a *CloseError +//// with one of the specified codes. +//func IsCloseError(err error, codes ...int) bool { +// return websocket.IsCloseError(err, codes...) +//} +// +//// IsUnexpectedCloseError returns boolean indicating whether the error is a +//// *CloseError with a code not in the list of expected codes. +//func IsUnexpectedCloseError(err error, expectedCodes ...int) bool { +// return websocket.IsUnexpectedCloseError(err, expectedCodes...) +//} +// +//// IsWebSocketUpgrade returns true if the client requested upgrade to the +//// WebSocket protocol. +//func IsWebSocketUpgrade(c *fiber.Ctx) bool { +// return websocket.FastHTTPIsWebSocketUpgrade(c.Context()) +//} +// +//// JoinMessages concatenates received messages to create a single io.Reader. +//// The string term is appended to each message. The returned reader does not +//// support concurrent calls to the Read method. +//func JoinMessages(c *websocket.Conn, term string) io.Reader { +// return websocket.JoinMessages(c, term) +//} diff --git a/pkg/wsutil/ws.go b/pkg/wsbuilder/ws.go similarity index 99% rename from pkg/wsutil/ws.go rename to pkg/wsbuilder/ws.go index 70ebba759..a608005e0 100644 --- a/pkg/wsutil/ws.go +++ b/pkg/wsbuilder/ws.go @@ -1,4 +1,4 @@ -package wsutil +package wsbuilder import ( "errors" diff --git a/servers/grpcs/server.go b/servers/grpcs/server.go index 53a642e80..5b1dfd75c 100644 --- a/servers/grpcs/server.go +++ b/servers/grpcs/server.go @@ -253,7 +253,7 @@ func (s *serviceImpl) init( s.httpServer = httpServer s.grpcServer = grpcServer - vars.RegisterValue(fmt.Sprintf("%s-grpc-server-config-%s", version.Project(), xid.New()), &conf) + vars.Register(fmt.Sprintf("%s-grpc-server-config-%s", version.Project(), xid.New()), func() any { return conf }) vars.Register(fmt.Sprintf("%s-grpc-server-router-%s", version.Project(), xid.New()), func() interface{} { return mux.GetRouteMethods() }) diff --git a/servers/https/server.go b/servers/https/server.go index 27cbf86f2..6532cdc69 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -67,7 +67,7 @@ func (s *serviceImpl) Serve(ctx context.Context) error { func (s *serviceImpl) init(params Params) { cfg := lo.ToPtr(httputil.DefaultCfg(params.Cfg)) - vars.RegisterValue(s.String()+"_config_"+xid.New().String(), cfg) + vars.Register(s.String()+"_config_"+xid.New().String(), func() any { return cfg }) s.log = params.Log.WithName(s.String()) s.httpServer = fiber.New(cfg.Http.Build().Must()) From 968d6c9988bcd1115101052ebea9b02c462c60c1 Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 16 Sep 2025 21:22:53 +0800 Subject: [PATCH 140/142] chore: quick update feat/supervisor at 2025-09-26 16:18:03 --- clients/grpcc/client.go | 2 +- .../grpcc/grpccresolver/discoverybuilder.go | 5 ++-- clients/grpcc/util.go | 2 +- clients/resty/client.go | 6 +---- core/debug/gops/_.go | 3 +++ core/pidfile/pidfile.go | 18 ++++++++------ core/scheduler/builder.go | 9 +++---- core/scheduler/scheduler.go | 24 +++++++++---------- core/supervisor/manager.go | 6 ++--- core/tracing/telemetry.go | 3 ++- core/tracing/tracingbuilder/telemetry.go | 6 ++--- go.mod | 4 ++-- go.sum | 8 +++---- 13 files changed, 51 insertions(+), 45 deletions(-) create mode 100644 core/debug/gops/_.go diff --git a/clients/grpcc/client.go b/clients/grpcc/client.go index 7d741b111..6ccb7d917 100644 --- a/clients/grpcc/client.go +++ b/clients/grpcc/client.go @@ -96,7 +96,7 @@ func (t *clientImpl) Get() (r result.Result[grpc.ClientConnInterface]) { return r.WithValue(t.conn) } - conn := createConn(t.cfg, t.log, t.middlewares).UnwrapErr(&r) + conn := createConn(t.cfg, t.log, t.middlewares).Unwrap(&r) if r.IsErr() { return } diff --git a/clients/grpcc/grpccresolver/discoverybuilder.go b/clients/grpcc/grpccresolver/discoverybuilder.go index a7b178452..75c1fcc1f 100644 --- a/clients/grpcc/grpccresolver/discoverybuilder.go +++ b/clients/grpcc/grpccresolver/discoverybuilder.go @@ -99,7 +99,8 @@ func (d *discoveryBuilder) Build(target resolver.Target, cc resolver.ClientConn, services := d.disco.GetService(context.Background(), srv). MapErr(func(err error) error { return errors.Wrapf(err, "failed to GetService, srv=%s", srv) - }).Unwrap(&gErr) + }). + UnwrapErr(&gErr) // 启动后,更新服务地址 d.updateService(services...) @@ -113,7 +114,7 @@ func (d *discoveryBuilder) Build(target resolver.Target, cc resolver.ClientConn, w := d.disco.Watch(context.Background(), srv). MapErr(func(err error) error { return errors.Wrapf(err, "target.Endpoint: %s", srv) - }).Unwrap(&gErr) + }).UnwrapErr(&gErr) return &baseResolver{ serviceName: srv, diff --git a/clients/grpcc/util.go b/clients/grpcc/util.go index e05a14deb..9963a3271 100644 --- a/clients/grpcc/util.go +++ b/clients/grpcc/util.go @@ -61,7 +61,7 @@ func createConn(cfg *grpccconfig.Cfg, log log.Logger, mm []lava.Middleware) (r r MapErr(func(err error) error { return errors.Wrapf(err, "failed to dial grpc server, target=%s", addr) }). - UnwrapErr(&r) + Unwrap(&r) if r.IsErr() { return } diff --git a/clients/resty/client.go b/clients/resty/client.go index 1cdef61dd..d397fd333 100644 --- a/clients/resty/client.go +++ b/clients/resty/client.go @@ -7,7 +7,6 @@ import ( "github.com/pubgo/funk/assert" "github.com/pubgo/funk/config" - "github.com/pubgo/funk/errors" "github.com/pubgo/funk/log" "github.com/pubgo/funk/retry" "github.com/pubgo/funk/v2/result" @@ -69,10 +68,7 @@ type Client struct { } func (c *Client) Do(ctx context.Context, req *Request) (r result.Result[*fasthttp.Response]) { - defer result.RecoveryErr(&r, func(err error) error { - errors.Debug(err) - return err - }) + defer result.Recovery(&r) reqErr := doRequest(c, req) if reqErr.IsErr() { diff --git a/core/debug/gops/_.go b/core/debug/gops/_.go new file mode 100644 index 000000000..16086fbe5 --- /dev/null +++ b/core/debug/gops/_.go @@ -0,0 +1,3 @@ +package gops + +//_ https://github.com/openziti/agent/blob/main/client.go diff --git a/core/pidfile/pidfile.go b/core/pidfile/pidfile.go index 41ec5da1a..fd99fd27f 100644 --- a/core/pidfile/pidfile.go +++ b/core/pidfile/pidfile.go @@ -9,9 +9,11 @@ import ( "github.com/pubgo/funk/config" "github.com/pubgo/funk/log" + "github.com/pubgo/funk/log/logfields" "github.com/pubgo/funk/pathutil" "github.com/pubgo/funk/running" "github.com/pubgo/funk/v2/result" + "github.com/rs/zerolog" ) const Name = "pidfile" @@ -21,7 +23,7 @@ var PidPath = filepath.Join(config.GetConfigDir(), Name) const pidPerm os.FileMode = 0o644 func Get() (r result.Result[int]) { - pidPath := GetPath().UnwrapErr(&r) + pidPath := GetPath().Unwrap(&r) if r.IsErr() { return } @@ -46,10 +48,10 @@ func GetPath() (r result.Result[string]) { pidPath := filepath.Join(PidPath, filename) if pathutil.IsNotExist(PidPath) { - createDirRes := result.ErrOf(os.MkdirAll(PidPath, os.ModePerm)).InspectErr(func(err error) { - log.Err(err).Str("dir", PidPath).Msg("create pid file dir failed") + createDirRes := result.ErrOf(os.MkdirAll(PidPath, os.ModePerm)).Log(func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf("create pid file dir(%s) failed", PidPath)) }) - if createDirRes.CatchErr(&r) { + if createDirRes.Catch(&r) { return } } @@ -58,7 +60,7 @@ func GetPath() (r result.Result[string]) { } func Save() (r result.Error) { - pidPath := GetPath().UnwrapErr(&r) + pidPath := GetPath().Unwrap(&r) if r.IsErr() { return } @@ -66,7 +68,9 @@ func Save() (r result.Error) { pid := syscall.Getpid() return result.ErrOf(os.WriteFile(pidPath, []byte(strconv.Itoa(pid)), pidPerm)). - InspectErr(func(err error) { - log.Err(err).Str("path", pidPath).Int("pid", pid).Msg("write pid file failed") + Log(func(e *zerolog.Event) { + e.Str("path", pidPath) + e.Int("pid", pid) + e.Str(logfields.Msg, "write pid file failed") }) } diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index 3e4db46db..3697dbcb1 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -36,10 +36,11 @@ type ResponseParams struct { func New(m lifecycle.Lifecycle, logger log.Logger, metric metrics.Metric, configs []*Config, routers []JobRegister, executors []JobExecutor) (_ *Scheduler, gErr error) { defer result.RecoveryErr(&gErr) - configMap := result.Wrap(createConfig(configs)).Must(func(e *zerolog.Event) { - e.Any("configs", configs) - e.Any(logfields.Msg, "failed to create config") - }) + configMap := result.Wrap(createConfig(configs)). + Must(func(e *zerolog.Event) { + e.Any("configs", configs) + e.Any(logfields.Msg, "failed to create config") + }) ctx, cancel := context.WithCancel(context.Background()) diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index 4bd0fd2d6..51c319333 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -80,7 +80,7 @@ func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { executorRes.Inspect(func(executor JobExecutor) { task.executor = executor }) - if executorRes.CatchErr(&r) { + if executorRes.Catch(&r) { return } @@ -91,7 +91,7 @@ func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { Inspect(func(config *JobConfig) { task.spec.Config = config }). - UnwrapErr(&r) + Unwrap(&r) if r.IsErr() { return } @@ -103,14 +103,14 @@ func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { Inspect(func(trigger *triggerImpl) { task.trigger = trigger }) - if triggerRes.CatchErr(&r) { + if triggerRes.Catch(&r) { return } jobOpt := config.ToJobDetailOptions() job := &namedJob{s: s, task: &task, log: s.log} jobDetail := quartz.NewJobDetailWithOptions(job, parseJobKey(name), jobOpt) - if result.CatchErr(&r, s.scheduler.ScheduleJob(jobDetail, task.trigger)) { + if result.Catch(&r, s.scheduler.ScheduleJob(jobDetail, task.trigger)) { return } @@ -130,7 +130,7 @@ func (s *Scheduler) getJob(name string) (r result.Result[*jobTask]) { } func (s *Scheduler) PatchJob(name string, config *JobConfig) (r result.Error) { - job := s.getJob(name).UnwrapErr(&r) + job := s.getJob(name).Unwrap(&r) if r.IsErr() { return } @@ -142,13 +142,13 @@ func (s *Scheduler) PatchJob(name string, config *JobConfig) (r result.Error) { Inspect(func(config *JobConfig) { job.spec.Config = config }). - CatchErr(&r) + Catch(&r) return } func (s *Scheduler) PauseJob(name string) (r result.Error) { - job := s.getJob(name).UnwrapErr(&r) + job := s.getJob(name).Unwrap(&r) if r.IsErr() { return } @@ -161,7 +161,7 @@ func (s *Scheduler) PauseJob(name string) (r result.Error) { } func (s *Scheduler) ResumeJob(name string) (r result.Error) { - job := s.getJob(name).UnwrapErr(&r) + job := s.getJob(name).Unwrap(&r) if r.IsErr() { return } @@ -174,7 +174,7 @@ func (s *Scheduler) ResumeJob(name string) (r result.Error) { } func (s *Scheduler) DeleteJob(name string) (r result.Error) { - job := s.getJob(name).UnwrapErr(&r) + job := s.getJob(name).Unwrap(&r) if r.IsErr() { return } @@ -187,7 +187,7 @@ func (s *Scheduler) DeleteJob(name string) (r result.Error) { } func (s *Scheduler) ReloadJob(name string) (r result.Error) { - job := s.getJob(name).UnwrapErr(&r) + job := s.getJob(name).Unwrap(&r) if r.IsErr() { return } @@ -198,7 +198,7 @@ func (s *Scheduler) ReloadJob(name string) (r result.Error) { job.jobKey, jobOpt, ) - if result.CatchErr(&r, s.scheduler.ScheduleJob(jobDetail, job.trigger)) { + if result.Catch(&r, s.scheduler.ScheduleJob(jobDetail, job.trigger)) { return } return @@ -213,7 +213,7 @@ func (s *Scheduler) ListJobs() []*Job { } func (s *Scheduler) GetJob(name string) (r result.Result[*Job]) { - job := s.getJob(name).UnwrapErr(&r) + job := s.getJob(name).Unwrap(&r) if r.IsErr() { return } diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go index 5eb58508d..adf1c33c8 100644 --- a/core/supervisor/manager.go +++ b/core/supervisor/manager.go @@ -98,7 +98,7 @@ func (m *Manager) Delete(name string) error { func (m *Manager) RemoveServices() (gErr error) { for name, srv := range m.services { - if result.Catch(&gErr, m.supervisor.Remove(srv.token)) { + if result.CatchErr(&gErr, m.supervisor.Remove(srv.token)) { return errors.Wrapf(gErr, "failed to remove service, name=%s", name) } m.logger.Info().Str("name", name).Msg("removing service from supervisor") @@ -110,7 +110,7 @@ func (m *Manager) RemoveServices() (gErr error) { func (m *Manager) RestartServices() (gErr error) { for name, srv := range m.services { - if result.Catch(&gErr, m.supervisor.Remove(srv.token)) { + if result.CatchErr(&gErr, m.supervisor.Remove(srv.token)) { return errors.Wrapf(gErr, "failed to remove service, name=%s", name) } @@ -128,7 +128,7 @@ func (m *Manager) RestartService(name string) (gErr error) { return nil } - if result.Catch(&gErr, m.supervisor.Remove(srv.token)) { + if result.CatchErr(&gErr, m.supervisor.Remove(srv.token)) { return errors.Wrapf(gErr, "failed to remove service, name=%s", name) } diff --git a/core/tracing/telemetry.go b/core/tracing/telemetry.go index 68df9a038..c75104cc6 100644 --- a/core/tracing/telemetry.go +++ b/core/tracing/telemetry.go @@ -10,6 +10,7 @@ import ( "github.com/pubgo/funk/assert" "github.com/pubgo/funk/log" "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/result" "github.com/pubgo/funk/version" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" @@ -165,7 +166,7 @@ func initTracerExporter(config *Config) (sdktrace.SpanExporter, error) { func NewPrometheusMeterProvider(config *Config, opts ...otelprom.Option) (_ *sdkmetric.MeterProvider, gErr error) { exporter, err := otelprom.New(opts...) - if errcheck.Check(&gErr, err) { + if result.CatchErr(&gErr, err) { return } diff --git a/core/tracing/tracingbuilder/telemetry.go b/core/tracing/tracingbuilder/telemetry.go index 171c21374..c4ef28bfa 100644 --- a/core/tracing/tracingbuilder/telemetry.go +++ b/core/tracing/tracingbuilder/telemetry.go @@ -92,7 +92,7 @@ func New(params Params) Provider { // merge config resource with default resource func mergeResource(config *Config) (r result.Result[*resource.Resource]) { - defer result.RecoveryErr(&r) + defer result.Recovery(&r) res := result.Wrap(resource.New(context.Background(), resource.WithFromEnv(), resource.WithTelemetrySDK(), @@ -117,7 +117,7 @@ func mergeResource(config *Config) (r result.Result[*resource.Resource]) { } func NewTracerProvider(config *Config) (r result.Result[*sdktrace.TracerProvider]) { - defer result.RecoveryErr(&r) + defer result.Recovery(&r) res := mergeResource(config).Log().Must() traceExporter := result.Wrap(newGrpcTracerExporter(config)).Log().Must() @@ -194,7 +194,7 @@ func newGrpcMetricExporter(config *Config) (sdkmetric.Exporter, error) { } func NewMeterProvider(config *Config) (r result.Result[*sdkmetric.MeterProvider]) { - defer result.RecoveryErr(&r) + defer result.Recovery(&r) //reader := metric.NewPeriodicReader(assert.Must1(newGrpcMetricExporter(config))) //readerOpt := sdkmetric.WithReader(reader) diff --git a/go.mod b/go.mod index a09c63451..d76e37928 100644 --- a/go.mod +++ b/go.mod @@ -54,8 +54,8 @@ require ( github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 github.com/maragudk/gomponents v0.22.0 github.com/maruel/panicparse/v2 v2.5.0 - github.com/pubgo/dix v0.3.23-alpha.2 - github.com/pubgo/funk v0.5.69-alpha.30 + github.com/pubgo/dix v0.3.23-alpha.3 + github.com/pubgo/funk v0.5.69-alpha.32 github.com/rs/xid v1.6.0 github.com/rs/zerolog v1.34.0 github.com/samber/lo v1.51.0 diff --git a/go.sum b/go.sum index 99f2e4c72..57bdef075 100644 --- a/go.sum +++ b/go.sum @@ -502,10 +502,10 @@ github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2 github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= -github.com/pubgo/dix v0.3.23-alpha.2 h1:wzxsB3F1EB6jeGybPH+rZi23Bq3PIb0/qQJLpeFcBhA= -github.com/pubgo/dix v0.3.23-alpha.2/go.mod h1:PF1loTKWhqQtcMc1MbROeT+HrRiIZA7U37sKOdqNmmo= -github.com/pubgo/funk v0.5.69-alpha.30 h1:LVxONor6BqVkeXsBOrpu6QdkaoUH09yJdglZ8VX++n4= -github.com/pubgo/funk v0.5.69-alpha.30/go.mod h1:dBFx3ZnM6IML9tqK23ROTB9xX0Q27dLXUxAoSuh5mMI= +github.com/pubgo/dix v0.3.23-alpha.3 h1:LcelZ4oP+HY7e5SFyH5tezDI4zNbUgM6kwA/bcCoP2g= +github.com/pubgo/dix v0.3.23-alpha.3/go.mod h1:i5OCqZ7/VZPMDqPv3TCm3C6yf8dezdZHWwg85UwwslQ= +github.com/pubgo/funk v0.5.69-alpha.32 h1:fcPNN+qyu3bMyOlxv/7qd3ls0eEyTOPp1ZySy8TKx7c= +github.com/pubgo/funk v0.5.69-alpha.32/go.mod h1:dBFx3ZnM6IML9tqK23ROTB9xX0Q27dLXUxAoSuh5mMI= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 h1:+Wl/0aFp0hpuHM3H//KMft64WQ1yX9LdJY64Qm/gFCo= From d49518666bb643aced775db0ece28ab9a78f282c Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 16 Sep 2025 21:22:53 +0800 Subject: [PATCH 141/142] chore: quick update feat/supervisor at 2025-09-27 10:17:46 --- clients/grpcc/client.go | 14 ++++---- clients/grpcc/grpcclb/p2c/p2c.go | 2 +- clients/grpcc/grpccresolver/directbuilder.go | 6 ++-- .../grpcc/grpccresolver/discoverybuilder.go | 19 ++++++----- clients/grpcc/grpccresolver/resolver.go | 2 +- clients/grpcc/middleware.go | 6 ++-- clients/grpcc/util.go | 6 ++-- clients/resty/client.go | 14 +++----- clients/resty/config.go | 2 +- clients/resty/jar.go | 2 +- clients/resty/middleware.go | 2 +- clients/resty/request.go | 2 +- clients/resty/util.go | 6 ++-- cmds/depcmd/cmd.go | 12 +++---- cmds/gencmd/main.go | 2 +- cmds/grpcservercmd/cmd.go | 6 ++-- cmds/healthcmd/cmd.go | 6 ++-- cmds/httpservercmd/cmd.go | 6 ++-- cmds/schedulercmd/cmd.go | 6 ++-- cmds/servefilecmd/cmd.go | 8 ++--- cmds/versioncmd/cmd.go | 6 ++-- core/debug/debug/mux.go | 20 +++++------ core/debug/gops/debug.go | 2 +- core/debug/healthy/debug.go | 2 +- core/debug/process/process.go | 10 +++--- core/debug/statsviz/main.go | 4 +-- core/debug/vars/debug.go | 2 +- core/debug/version/version.go | 4 +-- core/discovery/config.go | 6 ++-- core/encoding/encoding.go | 6 ++-- core/encoding/vars.go | 2 +- core/flags/default.go | 24 ++++++-------- core/healthy/factory.go | 4 +-- core/healthy/vars.go | 4 +-- core/lavabuilder/builder.go | 10 +++--- core/logging/factory.go | 6 ++-- core/logging/logbuilder/builder.go | 16 ++++----- core/logging/logext/gologr/log.go | 2 +- core/logging/logext/gologr/log_test.go | 2 +- core/logging/logext/grpclog/log.go | 2 +- core/logging/logext/grpclog/log_test.go | 2 +- core/logging/logext/slog/log.go | 2 +- core/logging/logext/slog/z_log_test.go | 2 +- core/logging/logext/stdlog/log.go | 4 +-- core/logging/logext/stdlog/log_test.go | 2 +- core/metrics/aaa.go | 2 +- core/metrics/config.go | 2 +- core/metrics/drivers/prometheus/reporter.go | 4 +-- core/metrics/factory.go | 4 +-- core/metrics/metricbuilder/builder.go | 12 +++---- core/metrics/metricbuilder/vars.go | 4 +-- core/pidfile/pidfile.go | 26 ++++++++------- core/pidfile/pidfilebuilder/builder.go | 4 +-- core/registry/builder.go | 12 +++---- core/registry/config.go | 4 +-- core/registry/drivers/mdns/mdns.go | 12 +++---- core/rpcmeta/registry.go | 2 +- core/scheduler/aaa.go | 4 +-- core/scheduler/builder.go | 15 +++++---- core/scheduler/config.go | 4 +-- core/scheduler/job.go | 6 ++-- core/scheduler/scheduler.go | 28 ++++++++-------- core/signals/signal.go | 2 +- core/supervisor/errs.go | 2 +- core/supervisor/manager.go | 20 +++++------ core/supervisor/service.go | 6 ++-- core/supervisor/spec.go | 2 +- core/tracing/telemetry.go | 11 ++++--- core/tracing/tracingbuilder/config.go | 2 +- core/tracing/tracingbuilder/telemetry.go | 12 +++---- go.mod | 15 ++------- go.sum | 33 +++---------------- internal/examples/fileserve/main.go | 2 +- internal/examples/scheduler/main.go | 8 ++--- internal/examples/scheduler/taskfile.yml | 2 +- internal/logutil/util.go | 6 ++-- .../middleware_accesslog/middleware.go | 12 +++---- .../middleware_metric/middleware.go | 2 +- .../middleware_recovery/middleware.go | 2 +- .../middleware_serviceinfo/middleware.go | 8 ++--- pkg/fasttemplate/template.go | 6 ++-- pkg/gateway/gatewayutils/query_params.go | 2 +- pkg/gateway/grpccodes.go | 2 +- pkg/gateway/mux.go | 14 ++++---- pkg/gateway/routertree/parser.go | 4 +-- pkg/gateway/routertree/parser_test.go | 2 +- pkg/gateway/routertree/router.go | 4 +-- pkg/gateway/routertree/router_test.go | 2 +- pkg/gateway/stream.go | 2 +- pkg/gateway/stream.http.go | 4 +-- pkg/gateway/stream.proxy.go | 2 +- pkg/gateway/util.go | 4 +-- pkg/gateway/wrapper.go | 2 +- pkg/grpcutil/util.go | 2 +- pkg/httputil/util.go | 12 +++---- pkg/netutil/conn.go | 4 +-- pkg/netutil/util.go | 2 +- pkg/wsproxy/websocket_proxy.go | 2 +- servers/grpcs/config.go | 4 +-- servers/grpcs/middleware.go | 12 +++---- servers/grpcs/server.go | 18 +++++----- servers/https/server.go | 17 +++++----- 102 files changed, 326 insertions(+), 364 deletions(-) diff --git a/clients/grpcc/client.go b/clients/grpcc/client.go index 7d741b111..5979b63b1 100644 --- a/clients/grpcc/client.go +++ b/clients/grpcc/client.go @@ -5,12 +5,12 @@ import ( "fmt" "sync" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" "github.com/pubgo/funk/v2/result" - "github.com/pubgo/funk/vars" + "github.com/pubgo/funk/v2/vars" "github.com/pubgo/lava/v2/clients/grpcc/grpccconfig" "github.com/pubgo/lava/v2/core/metrics" "github.com/pubgo/lava/v2/lava" @@ -26,7 +26,7 @@ type Params struct { } func New(cfg *grpccconfig.Cfg, p Params, middlewares ...lava.Middleware) Client { - cfg = config.MergeR(grpccconfig.DefaultCfg(), cfg).Unwrap() + cfg = config.MergeR(grpccconfig.DefaultCfg(), cfg).Must() cfg.Resolvers = p.Resolvers c := &clientImpl{ @@ -96,7 +96,7 @@ func (t *clientImpl) Get() (r result.Result[grpc.ClientConnInterface]) { return r.WithValue(t.conn) } - conn := createConn(t.cfg, t.log, t.middlewares).UnwrapErr(&r) + conn := createConn(t.cfg, t.log, t.middlewares).Unwrap(&r) if r.IsErr() { return } diff --git a/clients/grpcc/grpcclb/p2c/p2c.go b/clients/grpcc/grpcclb/p2c/p2c.go index 2a2440d0d..a503d74ca 100644 --- a/clients/grpcc/grpcclb/p2c/p2c.go +++ b/clients/grpcc/grpcclb/p2c/p2c.go @@ -1,7 +1,7 @@ package p2c import ( - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" "google.golang.org/grpc/balancer" "google.golang.org/grpc/balancer/base" ) diff --git a/clients/grpcc/grpccresolver/directbuilder.go b/clients/grpcc/grpccresolver/directbuilder.go index 40ed9fb38..29d8cdbf3 100644 --- a/clients/grpcc/grpccresolver/directbuilder.go +++ b/clients/grpcc/grpccresolver/directbuilder.go @@ -4,9 +4,9 @@ import ( "fmt" "strings" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" "google.golang.org/grpc/resolver" ) diff --git a/clients/grpcc/grpccresolver/discoverybuilder.go b/clients/grpcc/grpccresolver/discoverybuilder.go index a7b178452..31bc32352 100644 --- a/clients/grpcc/grpccresolver/discoverybuilder.go +++ b/clients/grpcc/grpccresolver/discoverybuilder.go @@ -5,13 +5,13 @@ import ( "strings" "sync" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/async" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/pretty" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/try" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/async" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/pretty" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/try" "google.golang.org/grpc/resolver" "github.com/pubgo/lava/v2/core/discovery" @@ -99,7 +99,8 @@ func (d *discoveryBuilder) Build(target resolver.Target, cc resolver.ClientConn, services := d.disco.GetService(context.Background(), srv). MapErr(func(err error) error { return errors.Wrapf(err, "failed to GetService, srv=%s", srv) - }).Unwrap(&gErr) + }). + UnwrapErr(&gErr) // 启动后,更新服务地址 d.updateService(services...) @@ -113,7 +114,7 @@ func (d *discoveryBuilder) Build(target resolver.Target, cc resolver.ClientConn, w := d.disco.Watch(context.Background(), srv). MapErr(func(err error) error { return errors.Wrapf(err, "target.Endpoint: %s", srv) - }).Unwrap(&gErr) + }).UnwrapErr(&gErr) return &baseResolver{ serviceName: srv, diff --git a/clients/grpcc/grpccresolver/resolver.go b/clients/grpcc/grpccresolver/resolver.go index d4d4c18ed..4b454dd61 100644 --- a/clients/grpcc/grpccresolver/resolver.go +++ b/clients/grpcc/grpccresolver/resolver.go @@ -3,7 +3,7 @@ package grpccresolver import ( "context" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "google.golang.org/grpc/resolver" ) diff --git a/clients/grpcc/middleware.go b/clients/grpcc/middleware.go index e62a6cf8a..1cdd776dd 100644 --- a/clients/grpcc/middleware.go +++ b/clients/grpcc/middleware.go @@ -5,9 +5,9 @@ import ( "strings" "time" - "github.com/pubgo/funk/convert" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/strutil" + "github.com/pubgo/funk/v2/convert" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/strutil" "github.com/pubgo/lava/v2/clients/grpcc/grpccconfig" "github.com/pubgo/lava/v2/core/lavacontexts" "github.com/pubgo/lava/v2/lava" diff --git a/clients/grpcc/util.go b/clients/grpcc/util.go index e05a14deb..020616701 100644 --- a/clients/grpcc/util.go +++ b/clients/grpcc/util.go @@ -3,8 +3,8 @@ package grpcc import ( "fmt" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/v2/clients/grpcc/grpccconfig" "github.com/pubgo/lava/v2/clients/grpcc/grpccresolver" @@ -61,7 +61,7 @@ func createConn(cfg *grpccconfig.Cfg, log log.Logger, mm []lava.Middleware) (r r MapErr(func(err error) error { return errors.Wrapf(err, "failed to dial grpc server, target=%s", addr) }). - UnwrapErr(&r) + Unwrap(&r) if r.IsErr() { return } diff --git a/clients/resty/client.go b/clients/resty/client.go index 1cdef61dd..9f831fc27 100644 --- a/clients/resty/client.go +++ b/clients/resty/client.go @@ -5,12 +5,11 @@ import ( "net/url" "sync" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/retry" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/log" "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/retry" "github.com/valyala/fasthttp" "github.com/pubgo/lava/v2/core/metrics" @@ -69,10 +68,7 @@ type Client struct { } func (c *Client) Do(ctx context.Context, req *Request) (r result.Result[*fasthttp.Response]) { - defer result.RecoveryErr(&r, func(err error) error { - errors.Debug(err) - return err - }) + defer result.Recovery(&r) reqErr := doRequest(c, req) if reqErr.IsErr() { diff --git a/clients/resty/config.go b/clients/resty/config.go index 2b818cef7..fb96ecf4b 100644 --- a/clients/resty/config.go +++ b/clients/resty/config.go @@ -5,7 +5,7 @@ import ( "net" "time" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/version" "github.com/valyala/fasthttp" "github.com/valyala/fasthttp/fasthttpproxy" "golang.org/x/net/http/httpproxy" diff --git a/clients/resty/jar.go b/clients/resty/jar.go index e5a1677c1..abd62c9bb 100644 --- a/clients/resty/jar.go +++ b/clients/resty/jar.go @@ -8,7 +8,7 @@ import ( "time" "github.com/goccy/go-json" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "github.com/valyala/fasthttp" "github.com/pubgo/lava/v2/lava" diff --git a/clients/resty/middleware.go b/clients/resty/middleware.go index 3d63afcea..27516586f 100644 --- a/clients/resty/middleware.go +++ b/clients/resty/middleware.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/gofiber/utils" - "github.com/pubgo/funk/convert" + "github.com/pubgo/funk/v2/convert" "github.com/valyala/fasthttp" "github.com/pubgo/lava/v2/lava" diff --git a/clients/resty/request.go b/clients/resty/request.go index 9c71c5470..934fc870b 100644 --- a/clients/resty/request.go +++ b/clients/resty/request.go @@ -5,7 +5,7 @@ import ( "net/url" "regexp" - "github.com/pubgo/funk/retry" + "github.com/pubgo/funk/v2/retry" "github.com/valyala/fasthttp" ) diff --git a/clients/resty/util.go b/clients/resty/util.go index 7565a2bbc..fdf871cff 100644 --- a/clients/resty/util.go +++ b/clients/resty/util.go @@ -12,9 +12,9 @@ import ( "strings" "github.com/goccy/go-json" - "github.com/pubgo/funk/convert" - "github.com/pubgo/funk/result" - "github.com/pubgo/funk/retry" + "github.com/pubgo/funk/v2/convert" + "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/retry" "github.com/valyala/bytebufferpool" "github.com/valyala/fasthttp" "github.com/valyala/fasttemplate" diff --git a/cmds/depcmd/cmd.go b/cmds/depcmd/cmd.go index 103c3cf92..8c348bb0c 100644 --- a/cmds/depcmd/cmd.go +++ b/cmds/depcmd/cmd.go @@ -7,12 +7,12 @@ import ( "runtime/debug" "github.com/olekukonko/tablewriter" - "github.com/pubgo/dix" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/pretty" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/version" + "github.com/pubgo/dix/v2" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/pretty" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/running" + "github.com/pubgo/funk/v2/version" cli "github.com/urfave/cli/v3" "github.com/pubgo/lava/v2/pkg/cmdutil" diff --git a/cmds/gencmd/main.go b/cmds/gencmd/main.go index 0128deecc..29e6c27e4 100644 --- a/cmds/gencmd/main.go +++ b/cmds/gencmd/main.go @@ -6,7 +6,7 @@ import ( "github.com/urfave/cli/v3" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/recovery" ) func New() *cli.Command { diff --git a/cmds/grpcservercmd/cmd.go b/cmds/grpcservercmd/cmd.go index 1a81333f9..82a31ed8c 100644 --- a/cmds/grpcservercmd/cmd.go +++ b/cmds/grpcservercmd/cmd.go @@ -3,9 +3,9 @@ package grpcservercmd import ( "context" - "github.com/pubgo/dix" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/version" + "github.com/pubgo/dix/v2" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/version" "github.com/urfave/cli/v3" "github.com/pubgo/lava/v2/core/lifecycle" diff --git a/cmds/healthcmd/cmd.go b/cmds/healthcmd/cmd.go index fcd4698f8..88bb2590c 100644 --- a/cmds/healthcmd/cmd.go +++ b/cmds/healthcmd/cmd.go @@ -7,9 +7,9 @@ import ( "net/http" "os" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/version" "github.com/urfave/cli/v3" "github.com/pubgo/lava/v2/pkg/cmdutil" diff --git a/cmds/httpservercmd/cmd.go b/cmds/httpservercmd/cmd.go index c70febf18..4d22437a0 100644 --- a/cmds/httpservercmd/cmd.go +++ b/cmds/httpservercmd/cmd.go @@ -3,9 +3,9 @@ package httpservercmd import ( "context" - "github.com/pubgo/dix" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/version" + "github.com/pubgo/dix/v2" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/version" "github.com/urfave/cli/v3" "github.com/pubgo/lava/v2/core/lifecycle" diff --git a/cmds/schedulercmd/cmd.go b/cmds/schedulercmd/cmd.go index 85c4768f1..5ad01b6bf 100644 --- a/cmds/schedulercmd/cmd.go +++ b/cmds/schedulercmd/cmd.go @@ -3,9 +3,9 @@ package schedulercmd import ( "context" - "github.com/pubgo/dix" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/version" + "github.com/pubgo/dix/v2" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/version" "github.com/urfave/cli/v3" "github.com/pubgo/lava/v2/core/lifecycle" diff --git a/cmds/servefilecmd/cmd.go b/cmds/servefilecmd/cmd.go index ff78fa248..fae45af41 100644 --- a/cmds/servefilecmd/cmd.go +++ b/cmds/servefilecmd/cmd.go @@ -5,11 +5,11 @@ import ( "fmt" "os" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/running" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/running" cli "github.com/urfave/cli/v3" "github.com/valyala/fasthttp" ) diff --git a/cmds/versioncmd/cmd.go b/cmds/versioncmd/cmd.go index cd9623154..bfa3b7ac9 100644 --- a/cmds/versioncmd/cmd.go +++ b/cmds/versioncmd/cmd.go @@ -4,9 +4,9 @@ import ( "context" "fmt" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/running" + "github.com/pubgo/funk/v2/version" "github.com/pubgo/lava/v2/pkg/cmdutil" "github.com/urfave/cli/v3" ) diff --git a/core/debug/debug/mux.go b/core/debug/debug/mux.go index 99ecdb8c1..76c2c3062 100644 --- a/core/debug/debug/mux.go +++ b/core/debug/debug/mux.go @@ -7,14 +7,14 @@ import ( "sync" "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/result" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/strutil" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/running" + "github.com/pubgo/funk/v2/strutil" "github.com/pubgo/lava/v2/core/debug" "github.com/valyala/fasthttp" "gopkg.in/yaml.v3" @@ -53,8 +53,8 @@ func init() { if host != "localhost" && host != "127.0.0.1" { if token != passwd { err := errors.New("token 不存在或者密码不对") - if ret := result.Of(c.WriteString(err.Error())); ret.IsErr() { - return errors.WrapCaller(ret.Err()) + if ret := result.Wrap(c.WriteString(err.Error())); ret.IsErr() { + return errors.WrapCaller(ret.GetErr()) } if err := c.SendStatus(http.StatusInternalServerError); err != nil { diff --git a/core/debug/gops/debug.go b/core/debug/gops/debug.go index 1b07f2bc8..40b97b515 100644 --- a/core/debug/gops/debug.go +++ b/core/debug/gops/debug.go @@ -2,7 +2,7 @@ package gops import ( "github.com/google/gops/agent" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" ) func init() { diff --git a/core/debug/healthy/debug.go b/core/debug/healthy/debug.go index 40d6b4132..32a29a827 100644 --- a/core/debug/healthy/debug.go +++ b/core/debug/healthy/debug.go @@ -6,7 +6,7 @@ import ( jjson "github.com/goccy/go-json" "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk/try" + "github.com/pubgo/funk/v2/try" "github.com/pubgo/lava/v2/core/debug" "github.com/pubgo/lava/v2/core/healthy" ) diff --git a/core/debug/process/process.go b/core/debug/process/process.go index 7d2ed6ad5..8f1be2227 100644 --- a/core/debug/process/process.go +++ b/core/debug/process/process.go @@ -5,9 +5,9 @@ import ( "github.com/gofiber/fiber/v2" ps "github.com/keybase/go-ps" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/result" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/v2/core/debug" ) @@ -27,7 +27,7 @@ func init() { "ppid": p.PPid(), "exec": p.Executable(), "path": result.Wrap(p.Path()), - "go_version": ret.Unwrap(), + "go_version": ret.Must(), } }) processes1 = generic.Filter(processes1, func(m map[string]any) bool { return m != nil }) @@ -41,7 +41,7 @@ func goVersion(path result.Result[string]) result.Result[string] { return path } - info, err := buildinfo.ReadFile(path.Unwrap()) + info, err := buildinfo.ReadFile(path.Must()) if err != nil { return result.Wrap("", err) } diff --git a/core/debug/statsviz/main.go b/core/debug/statsviz/main.go index 894954eb4..fae845af4 100644 --- a/core/debug/statsviz/main.go +++ b/core/debug/statsviz/main.go @@ -5,8 +5,8 @@ import ( "github.com/arl/statsviz" "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk" - "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/v2" + "github.com/pubgo/funk/v2/assert" "github.com/pubgo/lava/v2/core/debug" "github.com/pubgo/lava/v2/pkg/httputil" ) diff --git a/core/debug/vars/debug.go b/core/debug/vars/debug.go index 643dac129..b7666e33a 100644 --- a/core/debug/vars/debug.go +++ b/core/debug/vars/debug.go @@ -8,7 +8,7 @@ import ( g "github.com/maragudk/gomponents" c "github.com/maragudk/gomponents/components" h "github.com/maragudk/gomponents/html" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/recovery" "github.com/pubgo/lava/v2/core/debug" ) diff --git a/core/debug/version/version.go b/core/debug/version/version.go index 5be284e3e..b27d96e61 100644 --- a/core/debug/version/version.go +++ b/core/debug/version/version.go @@ -7,8 +7,8 @@ import ( json "github.com/goccy/go-json" "github.com/gofiber/adaptor/v2" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/running" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/running" "github.com/pubgo/lava/v2/core/debug" ) diff --git a/core/discovery/config.go b/core/discovery/config.go index 4d5efc5fa..3bcd56ffd 100644 --- a/core/discovery/config.go +++ b/core/discovery/config.go @@ -4,9 +4,9 @@ import ( "fmt" "time" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/errors" ) // https://github.com/go-eagle/eagle/blob/master/pkg/registry/registry.go diff --git a/core/encoding/encoding.go b/core/encoding/encoding.go index e855d3a55..df797e063 100644 --- a/core/encoding/encoding.go +++ b/core/encoding/encoding.go @@ -1,9 +1,9 @@ package encoding import ( - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/typex" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/typex" ) var data typex.Map[Codec] diff --git a/core/encoding/vars.go b/core/encoding/vars.go index 9b2731e27..aa7fe67ab 100644 --- a/core/encoding/vars.go +++ b/core/encoding/vars.go @@ -1,6 +1,6 @@ package encoding -import "github.com/pubgo/funk/vars" +import "github.com/pubgo/funk/v2/vars" func init() { vars.Register(Name, func() interface{} { return Keys() }) diff --git a/core/flags/default.go b/core/flags/default.go index 4034b7299..323f1787a 100644 --- a/core/flags/default.go +++ b/core/flags/default.go @@ -3,9 +3,9 @@ package flags import ( "context" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/env" - "github.com/pubgo/funk/running" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/env" + "github.com/pubgo/funk/v2/running" "github.com/urfave/cli/v3" ) @@ -13,8 +13,13 @@ func init() { var httpPortEnvs = []string{env.Key("server_http_port"), env.Key("service_http_port")} var grpcPortEnvs = []string{env.Key("server_grpc_port"), env.Key("service_grpc_port")} const conf = "config_path" - env.GetIntVal(&running.HttpPort, httpPortEnvs...) - env.GetIntVal(&running.GrpcPort, grpcPortEnvs...) + if port := env.GetInt(httpPortEnvs...); port > 0 { + running.HttpPort = port + } + + if port := env.GetInt(grpcPortEnvs...); port > 0 { + running.GrpcPort = port + } Register(&cli.IntFlag{ Name: "http-port", @@ -40,15 +45,6 @@ func init() { }, }) - Register(&cli.BoolFlag{ - Name: "debug", - Usage: "enable debug mode", - Local: true, - Value: running.IsDebug, - Destination: &running.IsDebug, - Sources: cli.EnvVars(env.Key("debug"), env.Key("enable_debug")), - }) - Register(&cli.StringFlag{ Name: "config", Aliases: []string{"c"}, diff --git a/core/healthy/factory.go b/core/healthy/factory.go index 4f71ae910..2b0d6afd7 100644 --- a/core/healthy/factory.go +++ b/core/healthy/factory.go @@ -1,8 +1,8 @@ package healthy import ( - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/typex" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/typex" ) const Name = "healthy" diff --git a/core/healthy/vars.go b/core/healthy/vars.go index 46f7df1ce..9644cd378 100644 --- a/core/healthy/vars.go +++ b/core/healthy/vars.go @@ -1,8 +1,8 @@ package healthy import ( - "github.com/pubgo/funk/stack" - "github.com/pubgo/funk/vars" + "github.com/pubgo/funk/v2/stack" + "github.com/pubgo/funk/v2/vars" ) func init() { diff --git a/core/lavabuilder/builder.go b/core/lavabuilder/builder.go index d3df53e48..09beefab1 100644 --- a/core/lavabuilder/builder.go +++ b/core/lavabuilder/builder.go @@ -4,11 +4,11 @@ import ( "os" "sort" - "github.com/pubgo/dix" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/version" + "github.com/pubgo/dix/v2" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/running" + "github.com/pubgo/funk/v2/version" cli "github.com/urfave/cli/v3" "github.com/pubgo/lava/v2/clients/grpcc/grpccresolver" diff --git a/core/logging/factory.go b/core/logging/factory.go index b234d0bdd..134740f3d 100644 --- a/core/logging/factory.go +++ b/core/logging/factory.go @@ -1,9 +1,9 @@ package logging import ( - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" ) type Factory func(log log.Logger) diff --git a/core/logging/logbuilder/builder.go b/core/logging/logbuilder/builder.go index d12a525eb..33b760378 100644 --- a/core/logging/logbuilder/builder.go +++ b/core/logging/logbuilder/builder.go @@ -9,13 +9,13 @@ import ( "github.com/expr-lang/expr" "github.com/expr-lang/expr/vm" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/log/logfields" - "github.com/pubgo/funk/pretty" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/result" - "github.com/pubgo/funk/running" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/log/logfields" + "github.com/pubgo/funk/v2/pretty" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/running" "github.com/rs/zerolog" "github.com/samber/lo" @@ -34,7 +34,7 @@ func New(cfg *logging.Config, hooks []zerolog.Hook) log.Logger { level := zerolog.DebugLevel if cfg.Level != "" { - level = result.Of(zerolog.ParseLevel(cfg.Level)).Expect("log level is invalid") + level = result.Wrap(zerolog.ParseLevel(cfg.Level)).Expect("log level is invalid") } zerolog.SetGlobalLevel(level) diff --git a/core/logging/logext/gologr/log.go b/core/logging/logext/gologr/log.go index 395194340..68f566c64 100644 --- a/core/logging/logext/gologr/log.go +++ b/core/logging/logext/gologr/log.go @@ -5,7 +5,7 @@ import ( "slices" "github.com/go-logr/logr" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "github.com/rs/zerolog" ) diff --git a/core/logging/logext/gologr/log_test.go b/core/logging/logext/gologr/log_test.go index 7366c0924..8a0fa8f94 100644 --- a/core/logging/logext/gologr/log_test.go +++ b/core/logging/logext/gologr/log_test.go @@ -6,7 +6,7 @@ import ( "testing" "github.com/go-logr/logr" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "github.com/stretchr/testify/assert" ) diff --git a/core/logging/logext/grpclog/log.go b/core/logging/logext/grpclog/log.go index cc969e61f..a569f5a6a 100644 --- a/core/logging/logext/grpclog/log.go +++ b/core/logging/logext/grpclog/log.go @@ -3,7 +3,7 @@ package grpclog import ( "fmt" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "github.com/rs/zerolog" "google.golang.org/grpc/grpclog" diff --git a/core/logging/logext/grpclog/log_test.go b/core/logging/logext/grpclog/log_test.go index df4670874..968abc777 100644 --- a/core/logging/logext/grpclog/log_test.go +++ b/core/logging/logext/grpclog/log_test.go @@ -3,7 +3,7 @@ package grpclog import ( "testing" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "google.golang.org/grpc/grpclog" ) diff --git a/core/logging/logext/slog/log.go b/core/logging/logext/slog/log.go index 1a1cb818a..3ebed3d4e 100644 --- a/core/logging/logext/slog/log.go +++ b/core/logging/logext/slog/log.go @@ -3,7 +3,7 @@ package slog import ( "log/slog" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "github.com/pubgo/lava/v2/core/logging" ) diff --git a/core/logging/logext/slog/z_log_test.go b/core/logging/logext/slog/z_log_test.go index 380328a5c..9efff7191 100644 --- a/core/logging/logext/slog/z_log_test.go +++ b/core/logging/logext/slog/z_log_test.go @@ -4,7 +4,7 @@ import ( "log/slog" "testing" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" ) func TestName(t *testing.T) { diff --git a/core/logging/logext/stdlog/log.go b/core/logging/logext/stdlog/log.go index 475175562..e3eaaf47f 100644 --- a/core/logging/logext/stdlog/log.go +++ b/core/logging/logext/stdlog/log.go @@ -5,8 +5,8 @@ import ( "io" "log" - "github.com/pubgo/funk/convert" - logger "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/convert" + logger "github.com/pubgo/funk/v2/log" "github.com/pubgo/lava/v2/core/logging" ) diff --git a/core/logging/logext/stdlog/log_test.go b/core/logging/logext/stdlog/log_test.go index 330253707..70f1568e6 100644 --- a/core/logging/logext/stdlog/log_test.go +++ b/core/logging/logext/stdlog/log_test.go @@ -4,7 +4,7 @@ import ( stdLog "log" "testing" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" ) func TestName(t *testing.T) { diff --git a/core/metrics/aaa.go b/core/metrics/aaa.go index e683f027f..a4cf0d68c 100644 --- a/core/metrics/aaa.go +++ b/core/metrics/aaa.go @@ -1,7 +1,7 @@ package metrics import ( - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" tally "github.com/uber-go/tally/v4" ) diff --git a/core/metrics/config.go b/core/metrics/config.go index 4b36fd3f7..1a38b0150 100644 --- a/core/metrics/config.go +++ b/core/metrics/config.go @@ -3,7 +3,7 @@ package metrics import ( "time" - "github.com/pubgo/funk/config" + "github.com/pubgo/funk/v2/config" ) var Name = "metric" diff --git a/core/metrics/drivers/prometheus/reporter.go b/core/metrics/drivers/prometheus/reporter.go index 8ecaa648b..3aade706f 100644 --- a/core/metrics/drivers/prometheus/reporter.go +++ b/core/metrics/drivers/prometheus/reporter.go @@ -1,8 +1,8 @@ package prometheus import ( - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/log" tally "github.com/uber-go/tally/v4" "github.com/uber-go/tally/v4/prometheus" diff --git a/core/metrics/factory.go b/core/metrics/factory.go index 0c23e15d3..3e303c6e9 100644 --- a/core/metrics/factory.go +++ b/core/metrics/factory.go @@ -1,8 +1,8 @@ package metrics import ( - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/recovery" ) var factories = make(map[string]Factory) diff --git a/core/metrics/metricbuilder/builder.go b/core/metrics/metricbuilder/builder.go index 0c6dc54d6..a8739280d 100644 --- a/core/metrics/metricbuilder/builder.go +++ b/core/metrics/metricbuilder/builder.go @@ -3,11 +3,11 @@ package metricbuilder import ( "context" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/merge" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/merge" + "github.com/pubgo/funk/v2/version" lo "github.com/samber/lo" "github.com/uber-go/tally/v4" @@ -16,7 +16,7 @@ import ( ) func New(m lifecycle.Lifecycle, cfg *metrics.Config, log log.Logger) metrics.Metric { - cfg = merge.Struct(generic.Ptr(metrics.DefaultCfg()), cfg).Unwrap() + cfg = merge.Struct(generic.Ptr(metrics.DefaultCfg()), cfg).Must() log = log.WithName(metrics.Name) diff --git a/core/metrics/metricbuilder/vars.go b/core/metrics/metricbuilder/vars.go index eec0b7f92..68a74e0e9 100644 --- a/core/metrics/metricbuilder/vars.go +++ b/core/metrics/metricbuilder/vars.go @@ -1,8 +1,8 @@ package metricbuilder import ( - "github.com/pubgo/funk/typex" - "github.com/pubgo/funk/vars" + "github.com/pubgo/funk/v2/typex" + "github.com/pubgo/funk/v2/vars" "github.com/pubgo/lava/v2/core/metrics" "github.com/uber-go/tally/v4" ) diff --git a/core/pidfile/pidfile.go b/core/pidfile/pidfile.go index 41ec5da1a..a92b169cc 100644 --- a/core/pidfile/pidfile.go +++ b/core/pidfile/pidfile.go @@ -7,11 +7,13 @@ import ( "strconv" "syscall" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/pathutil" - "github.com/pubgo/funk/running" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/log/logfields" + "github.com/pubgo/funk/v2/pathutil" "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/running" + "github.com/rs/zerolog" ) const Name = "pidfile" @@ -21,7 +23,7 @@ var PidPath = filepath.Join(config.GetConfigDir(), Name) const pidPerm os.FileMode = 0o644 func Get() (r result.Result[int]) { - pidPath := GetPath().UnwrapErr(&r) + pidPath := GetPath().Unwrap(&r) if r.IsErr() { return } @@ -46,10 +48,10 @@ func GetPath() (r result.Result[string]) { pidPath := filepath.Join(PidPath, filename) if pathutil.IsNotExist(PidPath) { - createDirRes := result.ErrOf(os.MkdirAll(PidPath, os.ModePerm)).InspectErr(func(err error) { - log.Err(err).Str("dir", PidPath).Msg("create pid file dir failed") + createDirRes := result.ErrOf(os.MkdirAll(PidPath, os.ModePerm)).Log(func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf("create pid file dir(%s) failed", PidPath)) }) - if createDirRes.CatchErr(&r) { + if createDirRes.Catch(&r) { return } } @@ -58,7 +60,7 @@ func GetPath() (r result.Result[string]) { } func Save() (r result.Error) { - pidPath := GetPath().UnwrapErr(&r) + pidPath := GetPath().Unwrap(&r) if r.IsErr() { return } @@ -66,7 +68,9 @@ func Save() (r result.Error) { pid := syscall.Getpid() return result.ErrOf(os.WriteFile(pidPath, []byte(strconv.Itoa(pid)), pidPerm)). - InspectErr(func(err error) { - log.Err(err).Str("path", pidPath).Int("pid", pid).Msg("write pid file failed") + Log(func(e *zerolog.Event) { + e.Str("path", pidPath) + e.Int("pid", pid) + e.Str(logfields.Msg, "write pid file failed") }) } diff --git a/core/pidfile/pidfilebuilder/builder.go b/core/pidfile/pidfilebuilder/builder.go index 17764fd6f..2b0c96f78 100644 --- a/core/pidfile/pidfilebuilder/builder.go +++ b/core/pidfile/pidfilebuilder/builder.go @@ -4,8 +4,8 @@ import ( "context" "path/filepath" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/pathutil" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/pathutil" "github.com/pubgo/lava/v2/core/lifecycle" "github.com/pubgo/lava/v2/core/pidfile" diff --git a/core/registry/builder.go b/core/registry/builder.go index 9717299c4..99f92f0d9 100644 --- a/core/registry/builder.go +++ b/core/registry/builder.go @@ -7,12 +7,12 @@ import ( "strings" "time" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/async" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/async" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/running" + "github.com/pubgo/funk/v2/version" "github.com/pubgo/lava/v2/core/lifecycle" "github.com/pubgo/lava/v2/core/service" diff --git a/core/registry/config.go b/core/registry/config.go index 69888992e..b5a880134 100644 --- a/core/registry/config.go +++ b/core/registry/config.go @@ -4,8 +4,8 @@ import ( "fmt" "time" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" ) // https://github.com/go-eagle/eagle/blob/master/pkg/registry/registry.go diff --git a/core/registry/drivers/mdns/mdns.go b/core/registry/drivers/mdns/mdns.go index cefb89626..daa591977 100644 --- a/core/registry/drivers/mdns/mdns.go +++ b/core/registry/drivers/mdns/mdns.go @@ -5,12 +5,12 @@ import ( "context" "github.com/grandcat/zeroconf" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/merge" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/typex" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/merge" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/typex" "github.com/pubgo/lava/v2/core/registry" "github.com/pubgo/lava/v2/core/service" diff --git a/core/rpcmeta/registry.go b/core/rpcmeta/registry.go index 8f849b175..918635f74 100644 --- a/core/rpcmeta/registry.go +++ b/core/rpcmeta/registry.go @@ -1,7 +1,7 @@ package rpcmeta import ( - "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/v2/assert" ) var rpcMetas = make(map[string]*RpcMeta) diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index 0144a5237..8a613ed38 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -4,9 +4,9 @@ import ( "context" "time" - "github.com/pubgo/funk/clone" - "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2/clone" "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/stack" "github.com/reugn/go-quartz/quartz" "go.uber.org/atomic" ) diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index 3e4db46db..daf37994d 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -4,10 +4,10 @@ import ( "context" "log/slog" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/log/logfields" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/log/logfields" "github.com/pubgo/funk/v2/result" - "github.com/pubgo/funk/vars" + "github.com/pubgo/funk/v2/vars" qlog "github.com/reugn/go-quartz/logger" "github.com/reugn/go-quartz/quartz" "github.com/rs/zerolog" @@ -36,10 +36,11 @@ type ResponseParams struct { func New(m lifecycle.Lifecycle, logger log.Logger, metric metrics.Metric, configs []*Config, routers []JobRegister, executors []JobExecutor) (_ *Scheduler, gErr error) { defer result.RecoveryErr(&gErr) - configMap := result.Wrap(createConfig(configs)).Must(func(e *zerolog.Event) { - e.Any("configs", configs) - e.Any(logfields.Msg, "failed to create config") - }) + configMap := result.Wrap(createConfig(configs)). + Must(func(e *zerolog.Event) { + e.Any("configs", configs) + e.Any(logfields.Msg, "failed to create config") + }) ctx, cancel := context.WithCancel(context.Background()) diff --git a/core/scheduler/config.go b/core/scheduler/config.go index f53b22d6b..de013b90f 100644 --- a/core/scheduler/config.go +++ b/core/scheduler/config.go @@ -4,8 +4,8 @@ import ( "fmt" "time" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log/logfields" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log/logfields" "github.com/pubgo/funk/v2/result" "github.com/reugn/go-quartz/quartz" "github.com/rs/zerolog" diff --git a/core/scheduler/job.go b/core/scheduler/job.go index 3e1412b6e..fcec938ab 100644 --- a/core/scheduler/job.go +++ b/core/scheduler/job.go @@ -6,9 +6,9 @@ import ( "fmt" "time" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/try" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/try" "github.com/pubgo/lava/v2/core/metrics" "github.com/reugn/go-quartz/quartz" "github.com/rs/zerolog" diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index 4bd0fd2d6..a6a256cef 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -5,8 +5,8 @@ import ( "fmt" "time" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/log/logfields" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/log/logfields" "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/v2/core/metrics" "github.com/reugn/go-quartz/quartz" @@ -80,7 +80,7 @@ func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { executorRes.Inspect(func(executor JobExecutor) { task.executor = executor }) - if executorRes.CatchErr(&r) { + if executorRes.Catch(&r) { return } @@ -91,7 +91,7 @@ func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { Inspect(func(config *JobConfig) { task.spec.Config = config }). - UnwrapErr(&r) + Unwrap(&r) if r.IsErr() { return } @@ -103,14 +103,14 @@ func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { Inspect(func(trigger *triggerImpl) { task.trigger = trigger }) - if triggerRes.CatchErr(&r) { + if triggerRes.Catch(&r) { return } jobOpt := config.ToJobDetailOptions() job := &namedJob{s: s, task: &task, log: s.log} jobDetail := quartz.NewJobDetailWithOptions(job, parseJobKey(name), jobOpt) - if result.CatchErr(&r, s.scheduler.ScheduleJob(jobDetail, task.trigger)) { + if result.Catch(&r, s.scheduler.ScheduleJob(jobDetail, task.trigger)) { return } @@ -130,7 +130,7 @@ func (s *Scheduler) getJob(name string) (r result.Result[*jobTask]) { } func (s *Scheduler) PatchJob(name string, config *JobConfig) (r result.Error) { - job := s.getJob(name).UnwrapErr(&r) + job := s.getJob(name).Unwrap(&r) if r.IsErr() { return } @@ -142,13 +142,13 @@ func (s *Scheduler) PatchJob(name string, config *JobConfig) (r result.Error) { Inspect(func(config *JobConfig) { job.spec.Config = config }). - CatchErr(&r) + Catch(&r) return } func (s *Scheduler) PauseJob(name string) (r result.Error) { - job := s.getJob(name).UnwrapErr(&r) + job := s.getJob(name).Unwrap(&r) if r.IsErr() { return } @@ -161,7 +161,7 @@ func (s *Scheduler) PauseJob(name string) (r result.Error) { } func (s *Scheduler) ResumeJob(name string) (r result.Error) { - job := s.getJob(name).UnwrapErr(&r) + job := s.getJob(name).Unwrap(&r) if r.IsErr() { return } @@ -174,7 +174,7 @@ func (s *Scheduler) ResumeJob(name string) (r result.Error) { } func (s *Scheduler) DeleteJob(name string) (r result.Error) { - job := s.getJob(name).UnwrapErr(&r) + job := s.getJob(name).Unwrap(&r) if r.IsErr() { return } @@ -187,7 +187,7 @@ func (s *Scheduler) DeleteJob(name string) (r result.Error) { } func (s *Scheduler) ReloadJob(name string) (r result.Error) { - job := s.getJob(name).UnwrapErr(&r) + job := s.getJob(name).Unwrap(&r) if r.IsErr() { return } @@ -198,7 +198,7 @@ func (s *Scheduler) ReloadJob(name string) (r result.Error) { job.jobKey, jobOpt, ) - if result.CatchErr(&r, s.scheduler.ScheduleJob(jobDetail, job.trigger)) { + if result.Catch(&r, s.scheduler.ScheduleJob(jobDetail, job.trigger)) { return } return @@ -213,7 +213,7 @@ func (s *Scheduler) ListJobs() []*Job { } func (s *Scheduler) GetJob(name string) (r result.Result[*Job]) { - job := s.getJob(name).UnwrapErr(&r) + job := s.getJob(name).Unwrap(&r) if r.IsErr() { return } diff --git a/core/signals/signal.go b/core/signals/signal.go index 17d16f526..8d0b5f3a4 100644 --- a/core/signals/signal.go +++ b/core/signals/signal.go @@ -6,7 +6,7 @@ import ( "os/signal" "syscall" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" ) const Name = "signals" diff --git a/core/supervisor/errs.go b/core/supervisor/errs.go index 23424652f..e7726f66f 100644 --- a/core/supervisor/errs.go +++ b/core/supervisor/errs.go @@ -1,7 +1,7 @@ package supervisor import ( - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" "github.com/thejerf/suture/v4" ) diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go index 5eb58508d..c50bc7b4d 100644 --- a/core/supervisor/manager.go +++ b/core/supervisor/manager.go @@ -5,14 +5,14 @@ import ( "fmt" "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/async" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/async" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/running" + "github.com/pubgo/funk/v2/stack" "github.com/thejerf/suture/v4" "github.com/pubgo/lava/v2/core/debug" @@ -98,7 +98,7 @@ func (m *Manager) Delete(name string) error { func (m *Manager) RemoveServices() (gErr error) { for name, srv := range m.services { - if result.Catch(&gErr, m.supervisor.Remove(srv.token)) { + if result.CatchErr(&gErr, m.supervisor.Remove(srv.token)) { return errors.Wrapf(gErr, "failed to remove service, name=%s", name) } m.logger.Info().Str("name", name).Msg("removing service from supervisor") @@ -110,7 +110,7 @@ func (m *Manager) RemoveServices() (gErr error) { func (m *Manager) RestartServices() (gErr error) { for name, srv := range m.services { - if result.Catch(&gErr, m.supervisor.Remove(srv.token)) { + if result.CatchErr(&gErr, m.supervisor.Remove(srv.token)) { return errors.Wrapf(gErr, "failed to remove service, name=%s", name) } @@ -128,7 +128,7 @@ func (m *Manager) RestartService(name string) (gErr error) { return nil } - if result.Catch(&gErr, m.supervisor.Remove(srv.token)) { + if result.CatchErr(&gErr, m.supervisor.Remove(srv.token)) { return errors.Wrapf(gErr, "failed to remove service, name=%s", name) } diff --git a/core/supervisor/service.go b/core/supervisor/service.go index 4b8afc21a..f4052d463 100644 --- a/core/supervisor/service.go +++ b/core/supervisor/service.go @@ -5,9 +5,9 @@ import ( "fmt" "time" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" "go.uber.org/atomic" ) diff --git a/core/supervisor/spec.go b/core/supervisor/spec.go index 813944cc8..b6f8b7156 100644 --- a/core/supervisor/spec.go +++ b/core/supervisor/spec.go @@ -4,7 +4,7 @@ import ( "log/slog" "time" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "github.com/thejerf/suture/v4" ) diff --git a/core/tracing/telemetry.go b/core/tracing/telemetry.go index 68df9a038..d025525d7 100644 --- a/core/tracing/telemetry.go +++ b/core/tracing/telemetry.go @@ -7,10 +7,11 @@ import ( "time" "github.com/goccy/go-json" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/version" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" "go.opentelemetry.io/otel/exporters/otlp/otlptrace" @@ -165,7 +166,7 @@ func initTracerExporter(config *Config) (sdktrace.SpanExporter, error) { func NewPrometheusMeterProvider(config *Config, opts ...otelprom.Option) (_ *sdkmetric.MeterProvider, gErr error) { exporter, err := otelprom.New(opts...) - if errcheck.Check(&gErr, err) { + if result.CatchErr(&gErr, err) { return } diff --git a/core/tracing/tracingbuilder/config.go b/core/tracing/tracingbuilder/config.go index 5d5dda310..fbada51c8 100644 --- a/core/tracing/tracingbuilder/config.go +++ b/core/tracing/tracingbuilder/config.go @@ -4,7 +4,7 @@ import ( "crypto/tls" "time" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/version" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/propagation" diff --git a/core/tracing/tracingbuilder/telemetry.go b/core/tracing/tracingbuilder/telemetry.go index 171c21374..fbb6596e7 100644 --- a/core/tracing/tracingbuilder/telemetry.go +++ b/core/tracing/tracingbuilder/telemetry.go @@ -8,10 +8,10 @@ import ( "os" "time" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" "github.com/pubgo/funk/v2/result" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/version" "github.com/pubgo/lava/v2/core/lifecycle" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" @@ -92,7 +92,7 @@ func New(params Params) Provider { // merge config resource with default resource func mergeResource(config *Config) (r result.Result[*resource.Resource]) { - defer result.RecoveryErr(&r) + defer result.Recovery(&r) res := result.Wrap(resource.New(context.Background(), resource.WithFromEnv(), resource.WithTelemetrySDK(), @@ -117,7 +117,7 @@ func mergeResource(config *Config) (r result.Result[*resource.Resource]) { } func NewTracerProvider(config *Config) (r result.Result[*sdktrace.TracerProvider]) { - defer result.RecoveryErr(&r) + defer result.Recovery(&r) res := mergeResource(config).Log().Must() traceExporter := result.Wrap(newGrpcTracerExporter(config)).Log().Must() @@ -194,7 +194,7 @@ func newGrpcMetricExporter(config *Config) (sdkmetric.Exporter, error) { } func NewMeterProvider(config *Config) (r result.Result[*sdkmetric.MeterProvider]) { - defer result.RecoveryErr(&r) + defer result.Recovery(&r) //reader := metric.NewPeriodicReader(assert.Must1(newGrpcMetricExporter(config))) //readerOpt := sdkmetric.WithReader(reader) diff --git a/go.mod b/go.mod index a09c63451..04404ec93 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,6 @@ require ( github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/olekukonko/tablewriter v1.0.8 github.com/pkg/errors v0.9.1 - github.com/pubgo/opendoc v0.0.5 github.com/reugn/go-quartz v0.15.1 github.com/vmihailenco/msgpack/v5 v5.4.1 go.opentelemetry.io/otel v1.37.0 @@ -54,8 +53,8 @@ require ( github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 github.com/maragudk/gomponents v0.22.0 github.com/maruel/panicparse/v2 v2.5.0 - github.com/pubgo/dix v0.3.23-alpha.2 - github.com/pubgo/funk v0.5.69-alpha.30 + github.com/pubgo/dix/v2 v2.0.0-alpha.1 + github.com/pubgo/funk/v2 v2.0.0-alpha.1 github.com/rs/xid v1.6.0 github.com/rs/zerolog v1.34.0 github.com/samber/lo v1.51.0 @@ -134,12 +133,9 @@ require ( github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect github.com/gabriel-vasile/mimetype v1.4.9 // indirect - github.com/getkin/kin-openapi v0.132.0 // indirect github.com/ghostiam/protogetter v0.3.6 // indirect github.com/go-critic/go-critic v0.11.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/jsonpointer v0.21.1 // indirect - github.com/go-openapi/swag v0.23.1 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-toolsmith/astcast v1.1.0 // indirect @@ -175,14 +171,12 @@ require ( github.com/hexops/gotextdiff v1.0.3 // indirect github.com/huandu/go-clone v1.5.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/invopop/yaml v0.3.1 // indirect github.com/jgautheron/goconst v1.7.1 // indirect github.com/jhump/protoreflect v1.17.0 // indirect github.com/jingyugao/rowserrcheck v1.1.1 // indirect github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect github.com/jjti/go-spancheck v0.6.2 // indirect github.com/joho/godotenv v1.5.1 // indirect - github.com/josharian/intern v1.0.0 // indirect github.com/julz/importas v0.1.0 // indirect github.com/k0kubun/pp/v3 v3.5.0 // indirect github.com/karamaru-alpha/copyloopvar v1.1.0 // indirect @@ -202,7 +196,6 @@ require ( github.com/lufeee/execinquery v1.2.1 // indirect github.com/macabu/inamedparam v0.1.3 // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mailru/easyjson v0.9.0 // indirect github.com/maratori/testableexamples v1.0.0 // indirect github.com/maratori/testpackage v1.1.1 // indirect github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect @@ -214,20 +207,16 @@ require ( github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/moricho/tparallel v0.3.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nakabonne/nestif v0.3.1 // indirect github.com/nishanths/exhaustive v0.12.0 // indirect github.com/nishanths/predeclared v0.2.2 // indirect github.com/nunnatsa/ginkgolinter v0.16.2 // indirect - github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect - github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect github.com/olekukonko/errors v1.1.0 // indirect github.com/olekukonko/ll v0.0.9 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.2.3 // indirect - github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/polyfloyd/go-errorlint v1.6.0 // indirect github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 // indirect diff --git a/go.sum b/go.sum index 99f2e4c72..67f5202d5 100644 --- a/go.sum +++ b/go.sum @@ -156,8 +156,6 @@ github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY= github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok= -github.com/getkin/kin-openapi v0.132.0 h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7MIRUwk= -github.com/getkin/kin-openapi v0.132.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58= github.com/ghostiam/protogetter v0.3.6 h1:R7qEWaSgFCsy20yYHNIJsU9ZOb8TziSRRxuAOTVKeOk= github.com/ghostiam/protogetter v0.3.6/go.mod h1:7lpeDnEJ1ZjL/YtyoN99ljO4z0pd3H0d18/t2dPBxHw= github.com/go-critic/go-critic v0.11.4 h1:O7kGOCx0NDIni4czrkRIXTnit0mkyKOCePh3My6OyEU= @@ -169,10 +167,6 @@ github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-openapi/jsonpointer v0.21.1 h1:whnzv/pNXtK2FbX/W9yJfRmE2gsmkfahjMKB0fZvcic= -github.com/go-openapi/jsonpointer v0.21.1/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk= -github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= -github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= @@ -186,8 +180,6 @@ github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZs github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= -github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s= @@ -323,8 +315,6 @@ github.com/huandu/go-clone v1.5.1/go.mod h1:ReGivhG6op3GYr+UY3lS6mxjKp7MIGTknuU5 github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso= -github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA= github.com/jgautheron/goconst v1.7.1 h1:VpdAG7Ca7yvvJk5n8dMwQhfEZJh95kl/Hl9S1OI5Jkk= github.com/jgautheron/goconst v1.7.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= @@ -343,7 +333,6 @@ github.com/jjti/go-spancheck v0.6.2 h1:iYtoxqPMzHUPp7St+5yA8+cONdyXD3ug6KK15n7Pk github.com/jjti/go-spancheck v0.6.2/go.mod h1:+X7lvIrR5ZdUTkxFYqzJ0abr8Sb5LOo80uOhWNqIrYA= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -399,8 +388,6 @@ github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3v github.com/mailgun/holster/v4 v4.21.0 h1:EH3fwKEGv56WA5gUwxjOTqZbeILY+oJ/VWEo1xku7t8= github.com/mailgun/holster/v4 v4.21.0/go.mod h1:G06Q741dj+zsH1WFrmoFvih3LtaocvBIoNtxITdWEtg= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= -github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/maragudk/gomponents v0.22.0 h1:0gNrSDC1nM6w0Vxj5wgGXqV8frDH9UVPE+dEyy4ApPQ= github.com/maragudk/gomponents v0.22.0/go.mod h1:nHkNnZL6ODgMBeJhrZjkMHVvNdoYsfmpKB2/hjdQ0Hg= github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= @@ -436,8 +423,6 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKHTI= github.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= @@ -450,10 +435,6 @@ github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= github.com/nunnatsa/ginkgolinter v0.16.2 h1:8iLqHIZvN4fTLDC0Ke9tbSZVcyVHoBs0HIbnVSxfHJk= github.com/nunnatsa/ginkgolinter v0.16.2/go.mod h1:4tWRinDN1FeJgU+iJANW/kz7xKN5nYRAOfJDQUS9dOQ= -github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 h1:G7ERwszslrBzRxj//JalHPu/3yz+De2J+4aLtSRlHiY= -github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037/go.mod h1:2bpvgLBZEtENV5scfDFEtB/5+1M4hkQhDQrccEJ/qGw= -github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 h1:bQx3WeLcUWy+RletIKwUIt4x3t8n2SxavmoclizMb8c= -github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o= github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5sM= github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y= github.com/olekukonko/ll v0.0.9 h1:Y+1YqDfVkqMWuEQMclsF9HUR5+a82+dxJuL1HHSRpxI= @@ -477,8 +458,6 @@ github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3v github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= -github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= -github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -502,12 +481,10 @@ github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2 github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= -github.com/pubgo/dix v0.3.23-alpha.2 h1:wzxsB3F1EB6jeGybPH+rZi23Bq3PIb0/qQJLpeFcBhA= -github.com/pubgo/dix v0.3.23-alpha.2/go.mod h1:PF1loTKWhqQtcMc1MbROeT+HrRiIZA7U37sKOdqNmmo= -github.com/pubgo/funk v0.5.69-alpha.30 h1:LVxONor6BqVkeXsBOrpu6QdkaoUH09yJdglZ8VX++n4= -github.com/pubgo/funk v0.5.69-alpha.30/go.mod h1:dBFx3ZnM6IML9tqK23ROTB9xX0Q27dLXUxAoSuh5mMI= -github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= -github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= +github.com/pubgo/dix/v2 v2.0.0-alpha.1 h1:ntBiy/stJS6hcPa2ad4biFTIIu9tEgA+MG/4wGZpMp0= +github.com/pubgo/dix/v2 v2.0.0-alpha.1/go.mod h1:SbbzhEkKl3pk6COyPTzgCDPXoammyHSB3HJs6SWrRY0= +github.com/pubgo/funk/v2 v2.0.0-alpha.1 h1:wJQkEW74wmf5A0kYuenMlvVMTk1DAppJFD6Doh9BI6E= +github.com/pubgo/funk/v2 v2.0.0-alpha.1/go.mod h1:5xv9L2ouP3/1Hd6X/wRs5pBraZ073a4J6DCjTVdLZ9s= github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 h1:+Wl/0aFp0hpuHM3H//KMft64WQ1yX9LdJY64Qm/gFCo= github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1/go.mod h1:GJLgqsLeo4qgavUoL8JeGFNS7qcisx3awV/w9eWTmNI= github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= @@ -628,8 +605,6 @@ github.com/twmb/murmur3 v1.1.8 h1:8Yt9taO/WN3l08xErzjeschgZU2QSrwm1kclYq+0aRg= github.com/twmb/murmur3 v1.1.8/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= github.com/uber-go/tally/v4 v4.1.17 h1:C+U4BKtVDXTszuzU+WH8JVQvRVnaVKxzZrROFyDrvS8= github.com/uber-go/tally/v4 v4.1.17/go.mod h1:ZdpiHRGSa3z4NIAc1VlEH4SiknR885fOIF08xmS0gaU= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ultraware/funlen v0.1.0 h1:BuqclbkY6pO+cvxoq7OsktIXZpgBSkYTQtmwhAK81vI= diff --git a/internal/examples/fileserve/main.go b/internal/examples/fileserve/main.go index 9812d3431..8027c929f 100644 --- a/internal/examples/fileserve/main.go +++ b/internal/examples/fileserve/main.go @@ -1,7 +1,7 @@ package main import ( - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/recovery" "github.com/pubgo/lava/v2/cmds/servefilecmd" "github.com/pubgo/lava/v2/core/lavabuilder" ) diff --git a/internal/examples/scheduler/main.go b/internal/examples/scheduler/main.go index fd026e8d3..6e4d64ec7 100644 --- a/internal/examples/scheduler/main.go +++ b/internal/examples/scheduler/main.go @@ -5,10 +5,10 @@ import ( "fmt" "time" - "github.com/pubgo/funk/cmds/configcmd" - "github.com/pubgo/funk/cmds/envcmd" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/cmds/configcmd" + "github.com/pubgo/funk/v2/cmds/envcmd" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/recovery" "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/v2/core/lavabuilder" "github.com/pubgo/lava/v2/core/logging" diff --git a/internal/examples/scheduler/taskfile.yml b/internal/examples/scheduler/taskfile.yml index e72e834bc..b536aba7a 100644 --- a/internal/examples/scheduler/taskfile.yml +++ b/internal/examples/scheduler/taskfile.yml @@ -13,7 +13,7 @@ tasks: default: cmds: - - task scheduler:info + - task -a | grep scheduler build: cmds: diff --git a/internal/logutil/util.go b/internal/logutil/util.go index 71d3df9db..4bb16e397 100644 --- a/internal/logutil/util.go +++ b/internal/logutil/util.go @@ -4,9 +4,9 @@ import ( "log/slog" "strings" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/try" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/try" ) func HandlerErr(err error) { diff --git a/internal/middlewares/middleware_accesslog/middleware.go b/internal/middlewares/middleware_accesslog/middleware.go index a97a71d14..721782faf 100644 --- a/internal/middlewares/middleware_accesslog/middleware.go +++ b/internal/middlewares/middleware_accesslog/middleware.go @@ -6,12 +6,12 @@ import ( "time" "github.com/gofiber/utils" - "github.com/pubgo/funk/convert" - "github.com/pubgo/funk/errors/errutil" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/proto/errorpb" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/convert" + "github.com/pubgo/funk/v2/errors/errutil" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/proto/errorpb" + "github.com/pubgo/funk/v2/version" "github.com/pubgo/lava/v2/core/lavacontexts" "github.com/pubgo/lava/v2/lava" "github.com/pubgo/lava/v2/pkg/grpcutil" diff --git a/internal/middlewares/middleware_metric/middleware.go b/internal/middlewares/middleware_metric/middleware.go index 1f4d437ff..ce4a9ab74 100644 --- a/internal/middlewares/middleware_metric/middleware.go +++ b/internal/middlewares/middleware_metric/middleware.go @@ -5,7 +5,7 @@ import ( "strings" "time" - "github.com/pubgo/funk/generic" + "github.com/pubgo/funk/v2/generic" "github.com/uber-go/tally/v4" "github.com/pubgo/lava/v2/core/metrics" diff --git a/internal/middlewares/middleware_recovery/middleware.go b/internal/middlewares/middleware_recovery/middleware.go index 9618ef3d0..e8e407858 100644 --- a/internal/middlewares/middleware_recovery/middleware.go +++ b/internal/middlewares/middleware_recovery/middleware.go @@ -3,7 +3,7 @@ package middleware_recovery import ( "context" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" "github.com/pubgo/lava/v2/lava" ) diff --git a/internal/middlewares/middleware_serviceinfo/middleware.go b/internal/middlewares/middleware_serviceinfo/middleware.go index 051d780f3..4e8742cce 100644 --- a/internal/middlewares/middleware_serviceinfo/middleware.go +++ b/internal/middlewares/middleware_serviceinfo/middleware.go @@ -3,10 +3,10 @@ package middleware_serviceinfo import ( "context" - "github.com/pubgo/funk/convert" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/strutil" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/convert" + "github.com/pubgo/funk/v2/running" + "github.com/pubgo/funk/v2/strutil" + "github.com/pubgo/funk/v2/version" "github.com/rs/xid" "github.com/pubgo/lava/v2/core/lavacontexts" diff --git a/pkg/fasttemplate/template.go b/pkg/fasttemplate/template.go index c4d271e30..dc37a43fd 100644 --- a/pkg/fasttemplate/template.go +++ b/pkg/fasttemplate/template.go @@ -5,10 +5,10 @@ import ( "fmt" "io" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" - "github.com/pubgo/funk/convert" + "github.com/pubgo/funk/v2/convert" "github.com/valyala/bytebufferpool" ) diff --git a/pkg/gateway/gatewayutils/query_params.go b/pkg/gateway/gatewayutils/query_params.go index e642d4185..639ded42e 100644 --- a/pkg/gateway/gatewayutils/query_params.go +++ b/pkg/gateway/gatewayutils/query_params.go @@ -11,7 +11,7 @@ import ( "strings" "time" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" "google.golang.org/grpc/grpclog" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" diff --git a/pkg/gateway/grpccodes.go b/pkg/gateway/grpccodes.go index 0d256fda0..383908b75 100644 --- a/pkg/gateway/grpccodes.go +++ b/pkg/gateway/grpccodes.go @@ -3,7 +3,7 @@ package gateway import ( "net/http" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "google.golang.org/grpc/codes" ) diff --git a/pkg/gateway/mux.go b/pkg/gateway/mux.go index 42e705669..6602339a7 100644 --- a/pkg/gateway/mux.go +++ b/pkg/gateway/mux.go @@ -14,12 +14,12 @@ import ( "github.com/fullstorydev/grpchan/inprocgrpc" "github.com/gofiber/adaptor/v2" "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/result" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/version" "github.com/pubgo/lava/v2/lava" "github.com/pubgo/lava/v2/pkg/gateway/routertree" "github.com/pubgo/lava/v2/pkg/httputil" @@ -148,7 +148,7 @@ func (m *Mux) MatchOperation(method string, path string) (r result.Result[*Match return r.WithErr(errors.Wrapf(err, "path not found, method=%s path=%s", method, path)) } - return r.WithVal(restTarget) + return r.WithValue(restTarget) } func (m *Mux) GetOperationByName(name string) *GrpcMethod { diff --git a/pkg/gateway/routertree/parser.go b/pkg/gateway/routertree/parser.go index 0d10e3116..c8d432bd5 100644 --- a/pkg/gateway/routertree/parser.go +++ b/pkg/gateway/routertree/parser.go @@ -5,8 +5,8 @@ import ( "github.com/alecthomas/participle/v2" "github.com/alecthomas/participle/v2/lexer" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/generic" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/generic" ) var ( diff --git a/pkg/gateway/routertree/parser_test.go b/pkg/gateway/routertree/parser_test.go index a371a0197..785330c22 100644 --- a/pkg/gateway/routertree/parser_test.go +++ b/pkg/gateway/routertree/parser_test.go @@ -3,7 +3,7 @@ package routertree import ( "testing" - "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/v2/assert" ) func TestName(t *testing.T) { diff --git a/pkg/gateway/routertree/router.go b/pkg/gateway/routertree/router.go index 007ed43aa..48d39ced1 100644 --- a/pkg/gateway/routertree/router.go +++ b/pkg/gateway/routertree/router.go @@ -4,8 +4,8 @@ import ( "fmt" "strings" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/generic" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/generic" ) var ( diff --git a/pkg/gateway/routertree/router_test.go b/pkg/gateway/routertree/router_test.go index fba32065f..c1bcdf93a 100644 --- a/pkg/gateway/routertree/router_test.go +++ b/pkg/gateway/routertree/router_test.go @@ -3,7 +3,7 @@ package routertree import ( "testing" - "github.com/pubgo/funk/pretty" + "github.com/pubgo/funk/v2/pretty" "github.com/stretchr/testify/assert" ) diff --git a/pkg/gateway/stream.go b/pkg/gateway/stream.go index 31b084f95..413c75dde 100644 --- a/pkg/gateway/stream.go +++ b/pkg/gateway/stream.go @@ -3,7 +3,7 @@ package gateway import ( "context" - "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/v2/assert" "google.golang.org/grpc" "google.golang.org/grpc/metadata" ) diff --git a/pkg/gateway/stream.http.go b/pkg/gateway/stream.http.go index c868e35e0..becc210ab 100644 --- a/pkg/gateway/stream.http.go +++ b/pkg/gateway/stream.http.go @@ -8,8 +8,8 @@ import ( "net/url" "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/generic" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/generic" "github.com/pubgo/lava/v2/pkg/gateway/gatewayutils" "github.com/pubgo/lava/v2/pkg/gateway/routertree" "google.golang.org/grpc" diff --git a/pkg/gateway/stream.proxy.go b/pkg/gateway/stream.proxy.go index 688867e74..9a5ad9263 100644 --- a/pkg/gateway/stream.proxy.go +++ b/pkg/gateway/stream.proxy.go @@ -7,7 +7,7 @@ import ( "context" "io" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" "github.com/pubgo/lava/v2/internal/logutil" "google.golang.org/grpc" "google.golang.org/grpc/codes" diff --git a/pkg/gateway/util.go b/pkg/gateway/util.go index 8be6b4929..33f34a9ea 100644 --- a/pkg/gateway/util.go +++ b/pkg/gateway/util.go @@ -9,8 +9,8 @@ import ( "strconv" "strings" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" "github.com/pubgo/lava/v2/pkg/gateway/routertree" "github.com/pubgo/lava/v2/pkg/proto/lavapbv1" "google.golang.org/genproto/googleapis/api/annotations" diff --git a/pkg/gateway/wrapper.go b/pkg/gateway/wrapper.go index 062e8e114..f31a4d7a4 100644 --- a/pkg/gateway/wrapper.go +++ b/pkg/gateway/wrapper.go @@ -3,7 +3,7 @@ package gateway import ( "context" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" "github.com/pubgo/lava/v2/pkg/proto/lavapbv1" "google.golang.org/grpc" "google.golang.org/protobuf/reflect/protoreflect" diff --git a/pkg/grpcutil/util.go b/pkg/grpcutil/util.go index 6f81ad5ae..2970ebcc7 100644 --- a/pkg/grpcutil/util.go +++ b/pkg/grpcutil/util.go @@ -6,7 +6,7 @@ import ( "net/http" "strings" - "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/v2/assert" "google.golang.org/grpc" "google.golang.org/grpc/admin" "google.golang.org/grpc/channelz/service" diff --git a/pkg/httputil/util.go b/pkg/httputil/util.go index ab67510ac..bf8607dd3 100644 --- a/pkg/httputil/util.go +++ b/pkg/httputil/util.go @@ -7,12 +7,12 @@ import ( "dario.cat/mergo" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cors" - "github.com/pubgo/funk" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/errors/errutil" - "github.com/pubgo/funk/proto/errorpb" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/errors/errutil" + "github.com/pubgo/funk/v2/proto/errorpb" + "github.com/pubgo/funk/v2/running" + "github.com/pubgo/funk/v2/version" "github.com/samber/lo" "github.com/valyala/fasthttp" "google.golang.org/grpc/codes" diff --git a/pkg/netutil/conn.go b/pkg/netutil/conn.go index 9e484b951..97501dc9f 100644 --- a/pkg/netutil/conn.go +++ b/pkg/netutil/conn.go @@ -9,8 +9,8 @@ import ( "strconv" "strings" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/recovery" ) type sockOpts struct { diff --git a/pkg/netutil/util.go b/pkg/netutil/util.go index 87670111f..d65d002b6 100644 --- a/pkg/netutil/util.go +++ b/pkg/netutil/util.go @@ -12,7 +12,7 @@ import ( "syscall" "time" - "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/v2/assert" ) var localIp = assert.Exit1(regexp.Compile(`\d+\.\d+\.\d+\.\d+`)) diff --git a/pkg/wsproxy/websocket_proxy.go b/pkg/wsproxy/websocket_proxy.go index 182233280..195d1d557 100644 --- a/pkg/wsproxy/websocket_proxy.go +++ b/pkg/wsproxy/websocket_proxy.go @@ -12,7 +12,7 @@ import ( "time" "github.com/gorilla/websocket" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "github.com/pubgo/lava/v2/internal/logutil" "golang.org/x/net/context" ) diff --git a/servers/grpcs/config.go b/servers/grpcs/config.go index 4b7dcc3ce..606f68df7 100644 --- a/servers/grpcs/config.go +++ b/servers/grpcs/config.go @@ -1,8 +1,8 @@ package grpcs import ( - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/running" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/running" "github.com/pubgo/lava/v2/pkg/fiberbuilder" "github.com/pubgo/lava/v2/pkg/grpcbuilder" diff --git a/servers/grpcs/middleware.go b/servers/grpcs/middleware.go index e9b48c3b7..fabd49980 100644 --- a/servers/grpcs/middleware.go +++ b/servers/grpcs/middleware.go @@ -7,12 +7,12 @@ import ( "github.com/gofiber/fiber/v2" grpcMiddle "github.com/grpc-ecosystem/go-grpc-middleware" - "github.com/pubgo/funk/convert" - "github.com/pubgo/funk/errors/errutil" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/proto/errorpb" - "github.com/pubgo/funk/strutil" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/convert" + "github.com/pubgo/funk/v2/errors/errutil" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/proto/errorpb" + "github.com/pubgo/funk/v2/strutil" + "github.com/pubgo/funk/v2/version" "github.com/rs/xid" "github.com/valyala/fasthttp" "google.golang.org/grpc" diff --git a/servers/grpcs/server.go b/servers/grpcs/server.go index 5b1dfd75c..dac33d6fb 100644 --- a/servers/grpcs/server.go +++ b/servers/grpcs/server.go @@ -9,14 +9,14 @@ import ( "github.com/fullstorydev/grpchan/inprocgrpc" "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/async" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/stack" - "github.com/pubgo/funk/vars" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/async" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/stack" + "github.com/pubgo/funk/v2/vars" + "github.com/pubgo/funk/v2/version" "github.com/rs/xid" "google.golang.org/grpc" @@ -112,7 +112,7 @@ func (s *serviceImpl) init( conf.HttpPort = cfg.HttpPort conf.Http = cfg.Http - s.conf = config.MergeR(defaultCfg(), conf).Unwrap() + s.conf = config.MergeR(defaultCfg(), conf).Must() globalMiddlewares := lava.Middlewares{ middleware_serviceinfo.New(), diff --git a/servers/https/server.go b/servers/https/server.go index 6532cdc69..700169fa1 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -3,15 +3,14 @@ package https import ( "context" "fmt" - "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk/async" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/vars" - "github.com/pubgo/funk/version" - "github.com/pubgo/opendoc/opendoc" + "github.com/pubgo/funk/v2/async" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/running" + "github.com/pubgo/funk/v2/vars" + "github.com/pubgo/funk/v2/version" + //"github.com/pubgo/opendoc/opendoc" "github.com/rs/xid" "github.com/samber/lo" @@ -35,7 +34,7 @@ type Params struct { M metrics.Metric Log log.Logger Cfg *Config - Docs []*opendoc.Swagger + //Docs []*opendoc.Swagger } func New(params Params) supervisor.Service { return newService(params) } From 1fa3b0256efc4e4d74f086eb214daa6fd711fdc2 Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 16 Sep 2025 21:22:53 +0800 Subject: [PATCH 142/142] chore: quick update feat/supervisor at 2025-10-17 12:02:15 --- clients/grpcc/client.go | 14 +- clients/grpcc/grpcclb/p2c/p2c.go | 2 +- clients/grpcc/grpccresolver/directbuilder.go | 6 +- .../grpcc/grpccresolver/discoverybuilder.go | 19 +-- clients/grpcc/grpccresolver/resolver.go | 2 +- clients/grpcc/middleware.go | 6 +- clients/grpcc/util.go | 6 +- clients/resty/client.go | 14 +- clients/resty/config.go | 2 +- clients/resty/jar.go | 2 +- clients/resty/middleware.go | 2 +- clients/resty/request.go | 2 +- clients/resty/util.go | 6 +- cmds/depcmd/cmd.go | 12 +- cmds/gencmd/main.go | 2 +- cmds/grpcservercmd/cmd.go | 6 +- cmds/healthcmd/cmd.go | 6 +- cmds/httpservercmd/cmd.go | 6 +- cmds/schedulercmd/cmd.go | 6 +- cmds/servefilecmd/cmd.go | 8 +- cmds/versioncmd/cmd.go | 6 +- core/debug/debug/mux.go | 21 +-- core/debug/gops/_.go | 3 + core/debug/gops/debug.go | 2 +- core/debug/healthy/debug.go | 2 +- core/debug/process/process.go | 13 +- core/debug/statsviz/main.go | 4 +- core/debug/vars/debug.go | 2 +- core/debug/version/version.go | 4 +- core/discovery/config.go | 6 +- core/encoding/encoding.go | 6 +- core/encoding/vars.go | 2 +- core/flags/default.go | 75 +---------- core/healthy/factory.go | 4 +- core/healthy/vars.go | 4 +- core/lavabuilder/builder.go | 10 +- core/logging/factory.go | 6 +- core/logging/logbuilder/builder.go | 20 +-- core/logging/logext/gologr/log.go | 2 +- core/logging/logext/gologr/log_test.go | 2 +- core/logging/logext/grpclog/log.go | 2 +- core/logging/logext/grpclog/log_test.go | 2 +- core/logging/logext/slog/log.go | 2 +- core/logging/logext/slog/z_log_test.go | 2 +- core/logging/logext/stdlog/log.go | 4 +- core/logging/logext/stdlog/log_test.go | 2 +- core/metrics/aaa.go | 2 +- core/metrics/config.go | 2 +- core/metrics/drivers/prometheus/reporter.go | 4 +- core/metrics/factory.go | 4 +- core/metrics/metricbuilder/builder.go | 12 +- core/metrics/metricbuilder/vars.go | 4 +- core/pidfile/pidfile.go | 26 ++-- core/pidfile/pidfilebuilder/builder.go | 4 +- core/registry/builder.go | 12 +- core/registry/config.go | 4 +- core/registry/drivers/mdns/mdns.go | 12 +- core/rpcmeta/registry.go | 2 +- core/scheduler/aaa.go | 4 +- core/scheduler/builder.go | 15 ++- core/scheduler/config.go | 4 +- core/scheduler/job.go | 6 +- core/scheduler/scheduler.go | 28 ++-- core/signals/signal.go | 2 +- core/supervisor/errs.go | 2 +- core/supervisor/manager.go | 22 +-- core/supervisor/service.go | 6 +- core/supervisor/spec.go | 2 +- core/tracing/telemetry.go | 11 +- core/tracing/tracingbuilder/config.go | 2 +- core/tracing/tracingbuilder/telemetry.go | 12 +- go.mod | 10 +- go.sum | 19 ++- internal/examples/fileserve/main.go | 2 +- internal/examples/scheduler/main.go | 8 +- internal/logutil/util.go | 6 +- .../middleware_accesslog/middleware.go | 51 ++----- .../middleware_metric/middleware.go | 2 +- .../middleware_recovery/middleware.go | 2 +- .../middleware_serviceinfo/middleware.go | 8 +- pkg/fasttemplate/template.go | 6 +- pkg/gateway/gatewayutils/query_params.go | 10 +- pkg/gateway/grpccodes.go | 2 +- pkg/gateway/mux.go | 18 +-- pkg/gateway/routertree/parser.go | 6 +- pkg/gateway/routertree/parser_test.go | 2 +- pkg/gateway/routertree/router.go | 6 +- pkg/gateway/routertree/router_test.go | 2 +- pkg/gateway/stream.go | 2 +- pkg/gateway/stream.http.go | 4 +- pkg/gateway/stream.proxy.go | 2 +- pkg/gateway/util.go | 8 +- pkg/gateway/wrapper.go | 2 +- pkg/grpcutil/util.go | 2 +- pkg/httputil/util.go | 49 +++---- pkg/netutil/conn.go | 4 +- pkg/netutil/util.go | 2 +- pkg/proto/lavapbv1/form_file.pb.go | 2 +- pkg/proto/lavapbv1/rpc.pb.go | 44 +++--- pkg/proto/lavapbv1/service.pb.go | 126 +++++++++++++++--- pkg/wsproxy/websocket_proxy.go | 2 +- protobuf.yaml | 12 +- servers/grpcs/config.go | 6 +- servers/grpcs/middleware.go | 63 +++------ servers/grpcs/server.go | 18 +-- servers/https/server.go | 12 +- taskfile.yml | 2 +- 107 files changed, 519 insertions(+), 544 deletions(-) create mode 100644 core/debug/gops/_.go diff --git a/clients/grpcc/client.go b/clients/grpcc/client.go index 7d741b111..5979b63b1 100644 --- a/clients/grpcc/client.go +++ b/clients/grpcc/client.go @@ -5,12 +5,12 @@ import ( "fmt" "sync" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" "github.com/pubgo/funk/v2/result" - "github.com/pubgo/funk/vars" + "github.com/pubgo/funk/v2/vars" "github.com/pubgo/lava/v2/clients/grpcc/grpccconfig" "github.com/pubgo/lava/v2/core/metrics" "github.com/pubgo/lava/v2/lava" @@ -26,7 +26,7 @@ type Params struct { } func New(cfg *grpccconfig.Cfg, p Params, middlewares ...lava.Middleware) Client { - cfg = config.MergeR(grpccconfig.DefaultCfg(), cfg).Unwrap() + cfg = config.MergeR(grpccconfig.DefaultCfg(), cfg).Must() cfg.Resolvers = p.Resolvers c := &clientImpl{ @@ -96,7 +96,7 @@ func (t *clientImpl) Get() (r result.Result[grpc.ClientConnInterface]) { return r.WithValue(t.conn) } - conn := createConn(t.cfg, t.log, t.middlewares).UnwrapErr(&r) + conn := createConn(t.cfg, t.log, t.middlewares).Unwrap(&r) if r.IsErr() { return } diff --git a/clients/grpcc/grpcclb/p2c/p2c.go b/clients/grpcc/grpcclb/p2c/p2c.go index 2a2440d0d..a503d74ca 100644 --- a/clients/grpcc/grpcclb/p2c/p2c.go +++ b/clients/grpcc/grpcclb/p2c/p2c.go @@ -1,7 +1,7 @@ package p2c import ( - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" "google.golang.org/grpc/balancer" "google.golang.org/grpc/balancer/base" ) diff --git a/clients/grpcc/grpccresolver/directbuilder.go b/clients/grpcc/grpccresolver/directbuilder.go index 40ed9fb38..29d8cdbf3 100644 --- a/clients/grpcc/grpccresolver/directbuilder.go +++ b/clients/grpcc/grpccresolver/directbuilder.go @@ -4,9 +4,9 @@ import ( "fmt" "strings" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" "google.golang.org/grpc/resolver" ) diff --git a/clients/grpcc/grpccresolver/discoverybuilder.go b/clients/grpcc/grpccresolver/discoverybuilder.go index a7b178452..31bc32352 100644 --- a/clients/grpcc/grpccresolver/discoverybuilder.go +++ b/clients/grpcc/grpccresolver/discoverybuilder.go @@ -5,13 +5,13 @@ import ( "strings" "sync" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/async" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/pretty" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/try" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/async" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/pretty" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/try" "google.golang.org/grpc/resolver" "github.com/pubgo/lava/v2/core/discovery" @@ -99,7 +99,8 @@ func (d *discoveryBuilder) Build(target resolver.Target, cc resolver.ClientConn, services := d.disco.GetService(context.Background(), srv). MapErr(func(err error) error { return errors.Wrapf(err, "failed to GetService, srv=%s", srv) - }).Unwrap(&gErr) + }). + UnwrapErr(&gErr) // 启动后,更新服务地址 d.updateService(services...) @@ -113,7 +114,7 @@ func (d *discoveryBuilder) Build(target resolver.Target, cc resolver.ClientConn, w := d.disco.Watch(context.Background(), srv). MapErr(func(err error) error { return errors.Wrapf(err, "target.Endpoint: %s", srv) - }).Unwrap(&gErr) + }).UnwrapErr(&gErr) return &baseResolver{ serviceName: srv, diff --git a/clients/grpcc/grpccresolver/resolver.go b/clients/grpcc/grpccresolver/resolver.go index d4d4c18ed..4b454dd61 100644 --- a/clients/grpcc/grpccresolver/resolver.go +++ b/clients/grpcc/grpccresolver/resolver.go @@ -3,7 +3,7 @@ package grpccresolver import ( "context" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "google.golang.org/grpc/resolver" ) diff --git a/clients/grpcc/middleware.go b/clients/grpcc/middleware.go index e62a6cf8a..1cdd776dd 100644 --- a/clients/grpcc/middleware.go +++ b/clients/grpcc/middleware.go @@ -5,9 +5,9 @@ import ( "strings" "time" - "github.com/pubgo/funk/convert" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/strutil" + "github.com/pubgo/funk/v2/convert" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/strutil" "github.com/pubgo/lava/v2/clients/grpcc/grpccconfig" "github.com/pubgo/lava/v2/core/lavacontexts" "github.com/pubgo/lava/v2/lava" diff --git a/clients/grpcc/util.go b/clients/grpcc/util.go index e05a14deb..020616701 100644 --- a/clients/grpcc/util.go +++ b/clients/grpcc/util.go @@ -3,8 +3,8 @@ package grpcc import ( "fmt" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/v2/clients/grpcc/grpccconfig" "github.com/pubgo/lava/v2/clients/grpcc/grpccresolver" @@ -61,7 +61,7 @@ func createConn(cfg *grpccconfig.Cfg, log log.Logger, mm []lava.Middleware) (r r MapErr(func(err error) error { return errors.Wrapf(err, "failed to dial grpc server, target=%s", addr) }). - UnwrapErr(&r) + Unwrap(&r) if r.IsErr() { return } diff --git a/clients/resty/client.go b/clients/resty/client.go index 1cdef61dd..9f831fc27 100644 --- a/clients/resty/client.go +++ b/clients/resty/client.go @@ -5,12 +5,11 @@ import ( "net/url" "sync" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/retry" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/log" "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/retry" "github.com/valyala/fasthttp" "github.com/pubgo/lava/v2/core/metrics" @@ -69,10 +68,7 @@ type Client struct { } func (c *Client) Do(ctx context.Context, req *Request) (r result.Result[*fasthttp.Response]) { - defer result.RecoveryErr(&r, func(err error) error { - errors.Debug(err) - return err - }) + defer result.Recovery(&r) reqErr := doRequest(c, req) if reqErr.IsErr() { diff --git a/clients/resty/config.go b/clients/resty/config.go index 2b818cef7..4a9a7e63f 100644 --- a/clients/resty/config.go +++ b/clients/resty/config.go @@ -5,7 +5,7 @@ import ( "net" "time" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/buildinfo/version" "github.com/valyala/fasthttp" "github.com/valyala/fasthttp/fasthttpproxy" "golang.org/x/net/http/httpproxy" diff --git a/clients/resty/jar.go b/clients/resty/jar.go index e5a1677c1..abd62c9bb 100644 --- a/clients/resty/jar.go +++ b/clients/resty/jar.go @@ -8,7 +8,7 @@ import ( "time" "github.com/goccy/go-json" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "github.com/valyala/fasthttp" "github.com/pubgo/lava/v2/lava" diff --git a/clients/resty/middleware.go b/clients/resty/middleware.go index 3d63afcea..27516586f 100644 --- a/clients/resty/middleware.go +++ b/clients/resty/middleware.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/gofiber/utils" - "github.com/pubgo/funk/convert" + "github.com/pubgo/funk/v2/convert" "github.com/valyala/fasthttp" "github.com/pubgo/lava/v2/lava" diff --git a/clients/resty/request.go b/clients/resty/request.go index 9c71c5470..934fc870b 100644 --- a/clients/resty/request.go +++ b/clients/resty/request.go @@ -5,7 +5,7 @@ import ( "net/url" "regexp" - "github.com/pubgo/funk/retry" + "github.com/pubgo/funk/v2/retry" "github.com/valyala/fasthttp" ) diff --git a/clients/resty/util.go b/clients/resty/util.go index 7565a2bbc..fdf871cff 100644 --- a/clients/resty/util.go +++ b/clients/resty/util.go @@ -12,9 +12,9 @@ import ( "strings" "github.com/goccy/go-json" - "github.com/pubgo/funk/convert" - "github.com/pubgo/funk/result" - "github.com/pubgo/funk/retry" + "github.com/pubgo/funk/v2/convert" + "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/retry" "github.com/valyala/bytebufferpool" "github.com/valyala/fasthttp" "github.com/valyala/fasttemplate" diff --git a/cmds/depcmd/cmd.go b/cmds/depcmd/cmd.go index 103c3cf92..5b289bbed 100644 --- a/cmds/depcmd/cmd.go +++ b/cmds/depcmd/cmd.go @@ -7,12 +7,12 @@ import ( "runtime/debug" "github.com/olekukonko/tablewriter" - "github.com/pubgo/dix" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/pretty" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/version" + "github.com/pubgo/dix/v2" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/buildinfo/version" + "github.com/pubgo/funk/v2/pretty" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/running" cli "github.com/urfave/cli/v3" "github.com/pubgo/lava/v2/pkg/cmdutil" diff --git a/cmds/gencmd/main.go b/cmds/gencmd/main.go index 0128deecc..29e6c27e4 100644 --- a/cmds/gencmd/main.go +++ b/cmds/gencmd/main.go @@ -6,7 +6,7 @@ import ( "github.com/urfave/cli/v3" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/recovery" ) func New() *cli.Command { diff --git a/cmds/grpcservercmd/cmd.go b/cmds/grpcservercmd/cmd.go index 1a81333f9..b28f5ad37 100644 --- a/cmds/grpcservercmd/cmd.go +++ b/cmds/grpcservercmd/cmd.go @@ -3,9 +3,9 @@ package grpcservercmd import ( "context" - "github.com/pubgo/dix" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/version" + "github.com/pubgo/dix/v2" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/buildinfo/version" "github.com/urfave/cli/v3" "github.com/pubgo/lava/v2/core/lifecycle" diff --git a/cmds/healthcmd/cmd.go b/cmds/healthcmd/cmd.go index fcd4698f8..d97949b85 100644 --- a/cmds/healthcmd/cmd.go +++ b/cmds/healthcmd/cmd.go @@ -7,9 +7,9 @@ import ( "net/http" "os" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/buildinfo/version" + "github.com/pubgo/funk/v2/recovery" "github.com/urfave/cli/v3" "github.com/pubgo/lava/v2/pkg/cmdutil" diff --git a/cmds/httpservercmd/cmd.go b/cmds/httpservercmd/cmd.go index c70febf18..4e61a0943 100644 --- a/cmds/httpservercmd/cmd.go +++ b/cmds/httpservercmd/cmd.go @@ -3,9 +3,9 @@ package httpservercmd import ( "context" - "github.com/pubgo/dix" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/version" + "github.com/pubgo/dix/v2" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/buildinfo/version" "github.com/urfave/cli/v3" "github.com/pubgo/lava/v2/core/lifecycle" diff --git a/cmds/schedulercmd/cmd.go b/cmds/schedulercmd/cmd.go index 85c4768f1..37de4d802 100644 --- a/cmds/schedulercmd/cmd.go +++ b/cmds/schedulercmd/cmd.go @@ -3,9 +3,9 @@ package schedulercmd import ( "context" - "github.com/pubgo/dix" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/version" + "github.com/pubgo/dix/v2" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/buildinfo/version" "github.com/urfave/cli/v3" "github.com/pubgo/lava/v2/core/lifecycle" diff --git a/cmds/servefilecmd/cmd.go b/cmds/servefilecmd/cmd.go index ff78fa248..fae45af41 100644 --- a/cmds/servefilecmd/cmd.go +++ b/cmds/servefilecmd/cmd.go @@ -5,11 +5,11 @@ import ( "fmt" "os" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/running" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/running" cli "github.com/urfave/cli/v3" "github.com/valyala/fasthttp" ) diff --git a/cmds/versioncmd/cmd.go b/cmds/versioncmd/cmd.go index cd9623154..a607f2a70 100644 --- a/cmds/versioncmd/cmd.go +++ b/cmds/versioncmd/cmd.go @@ -4,9 +4,9 @@ import ( "context" "fmt" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/buildinfo/version" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/running" "github.com/pubgo/lava/v2/pkg/cmdutil" "github.com/urfave/cli/v3" ) diff --git a/core/debug/debug/mux.go b/core/debug/debug/mux.go index 99ecdb8c1..5ec169134 100644 --- a/core/debug/debug/mux.go +++ b/core/debug/debug/mux.go @@ -7,15 +7,16 @@ import ( "sync" "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/result" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/strutil" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/running" + "github.com/pubgo/funk/v2/strutil" "github.com/pubgo/lava/v2/core/debug" + "github.com/samber/lo" "github.com/valyala/fasthttp" "gopkg.in/yaml.v3" ) @@ -53,8 +54,8 @@ func init() { if host != "localhost" && host != "127.0.0.1" { if token != passwd { err := errors.New("token 不存在或者密码不对") - if ret := result.Of(c.WriteString(err.Error())); ret.IsErr() { - return errors.WrapCaller(ret.Err()) + if result.CatchErr(&gErr, lo.T2(c.WriteString(err.Error())).B) { + return } if err := c.SendStatus(http.StatusInternalServerError); err != nil { diff --git a/core/debug/gops/_.go b/core/debug/gops/_.go new file mode 100644 index 000000000..16086fbe5 --- /dev/null +++ b/core/debug/gops/_.go @@ -0,0 +1,3 @@ +package gops + +//_ https://github.com/openziti/agent/blob/main/client.go diff --git a/core/debug/gops/debug.go b/core/debug/gops/debug.go index 1b07f2bc8..40b97b515 100644 --- a/core/debug/gops/debug.go +++ b/core/debug/gops/debug.go @@ -2,7 +2,7 @@ package gops import ( "github.com/google/gops/agent" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" ) func init() { diff --git a/core/debug/healthy/debug.go b/core/debug/healthy/debug.go index 40d6b4132..32a29a827 100644 --- a/core/debug/healthy/debug.go +++ b/core/debug/healthy/debug.go @@ -6,7 +6,7 @@ import ( jjson "github.com/goccy/go-json" "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk/try" + "github.com/pubgo/funk/v2/try" "github.com/pubgo/lava/v2/core/debug" "github.com/pubgo/lava/v2/core/healthy" ) diff --git a/core/debug/process/process.go b/core/debug/process/process.go index 7d2ed6ad5..e7463c9d1 100644 --- a/core/debug/process/process.go +++ b/core/debug/process/process.go @@ -5,15 +5,16 @@ import ( "github.com/gofiber/fiber/v2" ps "github.com/keybase/go-ps" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/result" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/v2/core/debug" ) func init() { - debug.Get("/process", func(ctx *fiber.Ctx) error { + debug.Get("/process", func(ctx *fiber.Ctx) (gErr error) { + defer result.RecoveryErr(&gErr) processes := assert.Must1(ps.Processes()) processes1 := generic.Map(processes, func(i int) map[string]any { p := processes[i] @@ -27,7 +28,7 @@ func init() { "ppid": p.PPid(), "exec": p.Executable(), "path": result.Wrap(p.Path()), - "go_version": ret.Unwrap(), + "go_version": ret.Must(), } }) processes1 = generic.Filter(processes1, func(m map[string]any) bool { return m != nil }) @@ -41,7 +42,7 @@ func goVersion(path result.Result[string]) result.Result[string] { return path } - info, err := buildinfo.ReadFile(path.Unwrap()) + info, err := buildinfo.ReadFile(path.Must()) if err != nil { return result.Wrap("", err) } diff --git a/core/debug/statsviz/main.go b/core/debug/statsviz/main.go index 894954eb4..fae845af4 100644 --- a/core/debug/statsviz/main.go +++ b/core/debug/statsviz/main.go @@ -5,8 +5,8 @@ import ( "github.com/arl/statsviz" "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk" - "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/v2" + "github.com/pubgo/funk/v2/assert" "github.com/pubgo/lava/v2/core/debug" "github.com/pubgo/lava/v2/pkg/httputil" ) diff --git a/core/debug/vars/debug.go b/core/debug/vars/debug.go index 643dac129..b7666e33a 100644 --- a/core/debug/vars/debug.go +++ b/core/debug/vars/debug.go @@ -8,7 +8,7 @@ import ( g "github.com/maragudk/gomponents" c "github.com/maragudk/gomponents/components" h "github.com/maragudk/gomponents/html" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/recovery" "github.com/pubgo/lava/v2/core/debug" ) diff --git a/core/debug/version/version.go b/core/debug/version/version.go index 5be284e3e..b27d96e61 100644 --- a/core/debug/version/version.go +++ b/core/debug/version/version.go @@ -7,8 +7,8 @@ import ( json "github.com/goccy/go-json" "github.com/gofiber/adaptor/v2" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/running" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/running" "github.com/pubgo/lava/v2/core/debug" ) diff --git a/core/discovery/config.go b/core/discovery/config.go index 4d5efc5fa..3bcd56ffd 100644 --- a/core/discovery/config.go +++ b/core/discovery/config.go @@ -4,9 +4,9 @@ import ( "fmt" "time" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/errors" ) // https://github.com/go-eagle/eagle/blob/master/pkg/registry/registry.go diff --git a/core/encoding/encoding.go b/core/encoding/encoding.go index e855d3a55..df797e063 100644 --- a/core/encoding/encoding.go +++ b/core/encoding/encoding.go @@ -1,9 +1,9 @@ package encoding import ( - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/typex" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/typex" ) var data typex.Map[Codec] diff --git a/core/encoding/vars.go b/core/encoding/vars.go index 9b2731e27..aa7fe67ab 100644 --- a/core/encoding/vars.go +++ b/core/encoding/vars.go @@ -1,6 +1,6 @@ package encoding -import "github.com/pubgo/funk/vars" +import "github.com/pubgo/funk/v2/vars" func init() { vars.Register(Name, func() interface{} { return Keys() }) diff --git a/core/flags/default.go b/core/flags/default.go index 4034b7299..cf61cb446 100644 --- a/core/flags/default.go +++ b/core/flags/default.go @@ -1,76 +1,13 @@ package flags import ( - "context" - - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/env" - "github.com/pubgo/funk/running" - "github.com/urfave/cli/v3" + "github.com/pubgo/funk/v2/running" ) func init() { - var httpPortEnvs = []string{env.Key("server_http_port"), env.Key("service_http_port")} - var grpcPortEnvs = []string{env.Key("server_grpc_port"), env.Key("service_grpc_port")} - const conf = "config_path" - env.GetIntVal(&running.HttpPort, httpPortEnvs...) - env.GetIntVal(&running.GrpcPort, grpcPortEnvs...) - - Register(&cli.IntFlag{ - Name: "http-port", - Usage: "service http port", - Local: true, - Value: running.HttpPort, - Sources: cli.EnvVars(httpPortEnvs...), - Action: func(ctx context.Context, command *cli.Command, i int) error { - running.HttpPort = i - return nil - }, - }) - - Register(&cli.IntFlag{ - Name: "grpc-port", - Usage: "service grpc port", - Local: true, - Value: running.GrpcPort, - Sources: cli.EnvVars(grpcPortEnvs...), - Action: func(ctx context.Context, command *cli.Command, i int) error { - running.GrpcPort = i - return nil - }, - }) - - Register(&cli.BoolFlag{ - Name: "debug", - Usage: "enable debug mode", - Local: true, - Value: running.IsDebug, - Destination: &running.IsDebug, - Sources: cli.EnvVars(env.Key("debug"), env.Key("enable_debug")), - }) - - Register(&cli.StringFlag{ - Name: "config", - Aliases: []string{"c"}, - Usage: "config path", - Value: config.GetConfigPath(), - Local: true, - Sources: cli.EnvVars(env.Key(conf)), - Action: func(ctx context.Context, command *cli.Command, s string) error { - config.SetConfigPath(s) - return nil - }, - }) - - Register(&cli.StringFlag{ - Name: "env", - Usage: "runtime env", - Value: running.Env, - Local: true, - Sources: cli.EnvVars(env.Key("env"), env.Key("app_env")), - Action: func(ctx context.Context, command *cli.Command, s string) error { - running.Env = s - return nil - }, - }) + Register(&running.DebugFlag) + Register(&running.EnvFlag) + Register(&running.ConfFlag) + Register(&running.GrpcPortFlag) + Register(&running.HttpPortFlag) } diff --git a/core/healthy/factory.go b/core/healthy/factory.go index 4f71ae910..2b0d6afd7 100644 --- a/core/healthy/factory.go +++ b/core/healthy/factory.go @@ -1,8 +1,8 @@ package healthy import ( - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/typex" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/typex" ) const Name = "healthy" diff --git a/core/healthy/vars.go b/core/healthy/vars.go index 46f7df1ce..9644cd378 100644 --- a/core/healthy/vars.go +++ b/core/healthy/vars.go @@ -1,8 +1,8 @@ package healthy import ( - "github.com/pubgo/funk/stack" - "github.com/pubgo/funk/vars" + "github.com/pubgo/funk/v2/stack" + "github.com/pubgo/funk/v2/vars" ) func init() { diff --git a/core/lavabuilder/builder.go b/core/lavabuilder/builder.go index d3df53e48..cbd2d2f16 100644 --- a/core/lavabuilder/builder.go +++ b/core/lavabuilder/builder.go @@ -4,11 +4,11 @@ import ( "os" "sort" - "github.com/pubgo/dix" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/version" + "github.com/pubgo/dix/v2" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/buildinfo/version" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/running" cli "github.com/urfave/cli/v3" "github.com/pubgo/lava/v2/clients/grpcc/grpccresolver" diff --git a/core/logging/factory.go b/core/logging/factory.go index b234d0bdd..134740f3d 100644 --- a/core/logging/factory.go +++ b/core/logging/factory.go @@ -1,9 +1,9 @@ package logging import ( - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" ) type Factory func(log log.Logger) diff --git a/core/logging/logbuilder/builder.go b/core/logging/logbuilder/builder.go index d12a525eb..36090606e 100644 --- a/core/logging/logbuilder/builder.go +++ b/core/logging/logbuilder/builder.go @@ -9,13 +9,13 @@ import ( "github.com/expr-lang/expr" "github.com/expr-lang/expr/vm" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/log/logfields" - "github.com/pubgo/funk/pretty" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/result" - "github.com/pubgo/funk/running" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/log/logfields" + "github.com/pubgo/funk/v2/pretty" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/running" "github.com/rs/zerolog" "github.com/samber/lo" @@ -34,7 +34,7 @@ func New(cfg *logging.Config, hooks []zerolog.Hook) log.Logger { level := zerolog.DebugLevel if cfg.Level != "" { - level = result.Of(zerolog.ParseLevel(cfg.Level)).Expect("log level is invalid") + level = result.Wrap(zerolog.ParseLevel(cfg.Level)).Expect("log level is invalid") } zerolog.SetGlobalLevel(level) @@ -56,8 +56,8 @@ func New(cfg *logging.Config, hooks []zerolog.Hook) log.Logger { // 全局log设置 ee := logger.With(). Str(logkey.Hostname, running.Hostname). - Str(logkey.Project, running.Project). - Str(logkey.Version, running.Version) + Str(logkey.Project, running.Project()). + Str(logkey.Version, running.Version()) if running.Namespace != "" { ee = ee.Str(logkey.Namespace, running.Namespace) diff --git a/core/logging/logext/gologr/log.go b/core/logging/logext/gologr/log.go index 395194340..68f566c64 100644 --- a/core/logging/logext/gologr/log.go +++ b/core/logging/logext/gologr/log.go @@ -5,7 +5,7 @@ import ( "slices" "github.com/go-logr/logr" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "github.com/rs/zerolog" ) diff --git a/core/logging/logext/gologr/log_test.go b/core/logging/logext/gologr/log_test.go index 7366c0924..8a0fa8f94 100644 --- a/core/logging/logext/gologr/log_test.go +++ b/core/logging/logext/gologr/log_test.go @@ -6,7 +6,7 @@ import ( "testing" "github.com/go-logr/logr" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "github.com/stretchr/testify/assert" ) diff --git a/core/logging/logext/grpclog/log.go b/core/logging/logext/grpclog/log.go index cc969e61f..a569f5a6a 100644 --- a/core/logging/logext/grpclog/log.go +++ b/core/logging/logext/grpclog/log.go @@ -3,7 +3,7 @@ package grpclog import ( "fmt" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "github.com/rs/zerolog" "google.golang.org/grpc/grpclog" diff --git a/core/logging/logext/grpclog/log_test.go b/core/logging/logext/grpclog/log_test.go index df4670874..968abc777 100644 --- a/core/logging/logext/grpclog/log_test.go +++ b/core/logging/logext/grpclog/log_test.go @@ -3,7 +3,7 @@ package grpclog import ( "testing" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "google.golang.org/grpc/grpclog" ) diff --git a/core/logging/logext/slog/log.go b/core/logging/logext/slog/log.go index 1a1cb818a..3ebed3d4e 100644 --- a/core/logging/logext/slog/log.go +++ b/core/logging/logext/slog/log.go @@ -3,7 +3,7 @@ package slog import ( "log/slog" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "github.com/pubgo/lava/v2/core/logging" ) diff --git a/core/logging/logext/slog/z_log_test.go b/core/logging/logext/slog/z_log_test.go index 380328a5c..9efff7191 100644 --- a/core/logging/logext/slog/z_log_test.go +++ b/core/logging/logext/slog/z_log_test.go @@ -4,7 +4,7 @@ import ( "log/slog" "testing" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" ) func TestName(t *testing.T) { diff --git a/core/logging/logext/stdlog/log.go b/core/logging/logext/stdlog/log.go index 475175562..e3eaaf47f 100644 --- a/core/logging/logext/stdlog/log.go +++ b/core/logging/logext/stdlog/log.go @@ -5,8 +5,8 @@ import ( "io" "log" - "github.com/pubgo/funk/convert" - logger "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/convert" + logger "github.com/pubgo/funk/v2/log" "github.com/pubgo/lava/v2/core/logging" ) diff --git a/core/logging/logext/stdlog/log_test.go b/core/logging/logext/stdlog/log_test.go index 330253707..70f1568e6 100644 --- a/core/logging/logext/stdlog/log_test.go +++ b/core/logging/logext/stdlog/log_test.go @@ -4,7 +4,7 @@ import ( stdLog "log" "testing" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" ) func TestName(t *testing.T) { diff --git a/core/metrics/aaa.go b/core/metrics/aaa.go index e683f027f..a4cf0d68c 100644 --- a/core/metrics/aaa.go +++ b/core/metrics/aaa.go @@ -1,7 +1,7 @@ package metrics import ( - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" tally "github.com/uber-go/tally/v4" ) diff --git a/core/metrics/config.go b/core/metrics/config.go index 4b36fd3f7..1a38b0150 100644 --- a/core/metrics/config.go +++ b/core/metrics/config.go @@ -3,7 +3,7 @@ package metrics import ( "time" - "github.com/pubgo/funk/config" + "github.com/pubgo/funk/v2/config" ) var Name = "metric" diff --git a/core/metrics/drivers/prometheus/reporter.go b/core/metrics/drivers/prometheus/reporter.go index 8ecaa648b..3aade706f 100644 --- a/core/metrics/drivers/prometheus/reporter.go +++ b/core/metrics/drivers/prometheus/reporter.go @@ -1,8 +1,8 @@ package prometheus import ( - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/log" tally "github.com/uber-go/tally/v4" "github.com/uber-go/tally/v4/prometheus" diff --git a/core/metrics/factory.go b/core/metrics/factory.go index 0c23e15d3..3e303c6e9 100644 --- a/core/metrics/factory.go +++ b/core/metrics/factory.go @@ -1,8 +1,8 @@ package metrics import ( - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/recovery" ) var factories = make(map[string]Factory) diff --git a/core/metrics/metricbuilder/builder.go b/core/metrics/metricbuilder/builder.go index 0c6dc54d6..63f7f3419 100644 --- a/core/metrics/metricbuilder/builder.go +++ b/core/metrics/metricbuilder/builder.go @@ -3,11 +3,11 @@ package metricbuilder import ( "context" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/merge" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/buildinfo/version" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/merge" lo "github.com/samber/lo" "github.com/uber-go/tally/v4" @@ -16,7 +16,7 @@ import ( ) func New(m lifecycle.Lifecycle, cfg *metrics.Config, log log.Logger) metrics.Metric { - cfg = merge.Struct(generic.Ptr(metrics.DefaultCfg()), cfg).Unwrap() + cfg = merge.Struct(generic.Ptr(metrics.DefaultCfg()), cfg).Must() log = log.WithName(metrics.Name) diff --git a/core/metrics/metricbuilder/vars.go b/core/metrics/metricbuilder/vars.go index eec0b7f92..68a74e0e9 100644 --- a/core/metrics/metricbuilder/vars.go +++ b/core/metrics/metricbuilder/vars.go @@ -1,8 +1,8 @@ package metricbuilder import ( - "github.com/pubgo/funk/typex" - "github.com/pubgo/funk/vars" + "github.com/pubgo/funk/v2/typex" + "github.com/pubgo/funk/v2/vars" "github.com/pubgo/lava/v2/core/metrics" "github.com/uber-go/tally/v4" ) diff --git a/core/pidfile/pidfile.go b/core/pidfile/pidfile.go index 41ec5da1a..a92b169cc 100644 --- a/core/pidfile/pidfile.go +++ b/core/pidfile/pidfile.go @@ -7,11 +7,13 @@ import ( "strconv" "syscall" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/pathutil" - "github.com/pubgo/funk/running" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/log/logfields" + "github.com/pubgo/funk/v2/pathutil" "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/running" + "github.com/rs/zerolog" ) const Name = "pidfile" @@ -21,7 +23,7 @@ var PidPath = filepath.Join(config.GetConfigDir(), Name) const pidPerm os.FileMode = 0o644 func Get() (r result.Result[int]) { - pidPath := GetPath().UnwrapErr(&r) + pidPath := GetPath().Unwrap(&r) if r.IsErr() { return } @@ -46,10 +48,10 @@ func GetPath() (r result.Result[string]) { pidPath := filepath.Join(PidPath, filename) if pathutil.IsNotExist(PidPath) { - createDirRes := result.ErrOf(os.MkdirAll(PidPath, os.ModePerm)).InspectErr(func(err error) { - log.Err(err).Str("dir", PidPath).Msg("create pid file dir failed") + createDirRes := result.ErrOf(os.MkdirAll(PidPath, os.ModePerm)).Log(func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf("create pid file dir(%s) failed", PidPath)) }) - if createDirRes.CatchErr(&r) { + if createDirRes.Catch(&r) { return } } @@ -58,7 +60,7 @@ func GetPath() (r result.Result[string]) { } func Save() (r result.Error) { - pidPath := GetPath().UnwrapErr(&r) + pidPath := GetPath().Unwrap(&r) if r.IsErr() { return } @@ -66,7 +68,9 @@ func Save() (r result.Error) { pid := syscall.Getpid() return result.ErrOf(os.WriteFile(pidPath, []byte(strconv.Itoa(pid)), pidPerm)). - InspectErr(func(err error) { - log.Err(err).Str("path", pidPath).Int("pid", pid).Msg("write pid file failed") + Log(func(e *zerolog.Event) { + e.Str("path", pidPath) + e.Int("pid", pid) + e.Str(logfields.Msg, "write pid file failed") }) } diff --git a/core/pidfile/pidfilebuilder/builder.go b/core/pidfile/pidfilebuilder/builder.go index 17764fd6f..2b0c96f78 100644 --- a/core/pidfile/pidfilebuilder/builder.go +++ b/core/pidfile/pidfilebuilder/builder.go @@ -4,8 +4,8 @@ import ( "context" "path/filepath" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/pathutil" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/pathutil" "github.com/pubgo/lava/v2/core/lifecycle" "github.com/pubgo/lava/v2/core/pidfile" diff --git a/core/registry/builder.go b/core/registry/builder.go index 9717299c4..91086120d 100644 --- a/core/registry/builder.go +++ b/core/registry/builder.go @@ -7,12 +7,12 @@ import ( "strings" "time" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/async" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/async" + "github.com/pubgo/funk/v2/buildinfo/version" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/running" "github.com/pubgo/lava/v2/core/lifecycle" "github.com/pubgo/lava/v2/core/service" diff --git a/core/registry/config.go b/core/registry/config.go index 69888992e..b5a880134 100644 --- a/core/registry/config.go +++ b/core/registry/config.go @@ -4,8 +4,8 @@ import ( "fmt" "time" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" ) // https://github.com/go-eagle/eagle/blob/master/pkg/registry/registry.go diff --git a/core/registry/drivers/mdns/mdns.go b/core/registry/drivers/mdns/mdns.go index cefb89626..daa591977 100644 --- a/core/registry/drivers/mdns/mdns.go +++ b/core/registry/drivers/mdns/mdns.go @@ -5,12 +5,12 @@ import ( "context" "github.com/grandcat/zeroconf" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/merge" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/typex" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/merge" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/typex" "github.com/pubgo/lava/v2/core/registry" "github.com/pubgo/lava/v2/core/service" diff --git a/core/rpcmeta/registry.go b/core/rpcmeta/registry.go index 8f849b175..918635f74 100644 --- a/core/rpcmeta/registry.go +++ b/core/rpcmeta/registry.go @@ -1,7 +1,7 @@ package rpcmeta import ( - "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/v2/assert" ) var rpcMetas = make(map[string]*RpcMeta) diff --git a/core/scheduler/aaa.go b/core/scheduler/aaa.go index 0144a5237..8a613ed38 100644 --- a/core/scheduler/aaa.go +++ b/core/scheduler/aaa.go @@ -4,9 +4,9 @@ import ( "context" "time" - "github.com/pubgo/funk/clone" - "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2/clone" "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/stack" "github.com/reugn/go-quartz/quartz" "go.uber.org/atomic" ) diff --git a/core/scheduler/builder.go b/core/scheduler/builder.go index 3e4db46db..daf37994d 100644 --- a/core/scheduler/builder.go +++ b/core/scheduler/builder.go @@ -4,10 +4,10 @@ import ( "context" "log/slog" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/log/logfields" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/log/logfields" "github.com/pubgo/funk/v2/result" - "github.com/pubgo/funk/vars" + "github.com/pubgo/funk/v2/vars" qlog "github.com/reugn/go-quartz/logger" "github.com/reugn/go-quartz/quartz" "github.com/rs/zerolog" @@ -36,10 +36,11 @@ type ResponseParams struct { func New(m lifecycle.Lifecycle, logger log.Logger, metric metrics.Metric, configs []*Config, routers []JobRegister, executors []JobExecutor) (_ *Scheduler, gErr error) { defer result.RecoveryErr(&gErr) - configMap := result.Wrap(createConfig(configs)).Must(func(e *zerolog.Event) { - e.Any("configs", configs) - e.Any(logfields.Msg, "failed to create config") - }) + configMap := result.Wrap(createConfig(configs)). + Must(func(e *zerolog.Event) { + e.Any("configs", configs) + e.Any(logfields.Msg, "failed to create config") + }) ctx, cancel := context.WithCancel(context.Background()) diff --git a/core/scheduler/config.go b/core/scheduler/config.go index f53b22d6b..de013b90f 100644 --- a/core/scheduler/config.go +++ b/core/scheduler/config.go @@ -4,8 +4,8 @@ import ( "fmt" "time" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log/logfields" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log/logfields" "github.com/pubgo/funk/v2/result" "github.com/reugn/go-quartz/quartz" "github.com/rs/zerolog" diff --git a/core/scheduler/job.go b/core/scheduler/job.go index 3e1412b6e..fcec938ab 100644 --- a/core/scheduler/job.go +++ b/core/scheduler/job.go @@ -6,9 +6,9 @@ import ( "fmt" "time" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/try" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/try" "github.com/pubgo/lava/v2/core/metrics" "github.com/reugn/go-quartz/quartz" "github.com/rs/zerolog" diff --git a/core/scheduler/scheduler.go b/core/scheduler/scheduler.go index 4bd0fd2d6..a6a256cef 100644 --- a/core/scheduler/scheduler.go +++ b/core/scheduler/scheduler.go @@ -5,8 +5,8 @@ import ( "fmt" "time" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/log/logfields" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/log/logfields" "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/v2/core/metrics" "github.com/reugn/go-quartz/quartz" @@ -80,7 +80,7 @@ func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { executorRes.Inspect(func(executor JobExecutor) { task.executor = executor }) - if executorRes.CatchErr(&r) { + if executorRes.Catch(&r) { return } @@ -91,7 +91,7 @@ func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { Inspect(func(config *JobConfig) { task.spec.Config = config }). - UnwrapErr(&r) + Unwrap(&r) if r.IsErr() { return } @@ -103,14 +103,14 @@ func (s *Scheduler) createJob(spec JobSpec, fn JobFunc) (r result.Error) { Inspect(func(trigger *triggerImpl) { task.trigger = trigger }) - if triggerRes.CatchErr(&r) { + if triggerRes.Catch(&r) { return } jobOpt := config.ToJobDetailOptions() job := &namedJob{s: s, task: &task, log: s.log} jobDetail := quartz.NewJobDetailWithOptions(job, parseJobKey(name), jobOpt) - if result.CatchErr(&r, s.scheduler.ScheduleJob(jobDetail, task.trigger)) { + if result.Catch(&r, s.scheduler.ScheduleJob(jobDetail, task.trigger)) { return } @@ -130,7 +130,7 @@ func (s *Scheduler) getJob(name string) (r result.Result[*jobTask]) { } func (s *Scheduler) PatchJob(name string, config *JobConfig) (r result.Error) { - job := s.getJob(name).UnwrapErr(&r) + job := s.getJob(name).Unwrap(&r) if r.IsErr() { return } @@ -142,13 +142,13 @@ func (s *Scheduler) PatchJob(name string, config *JobConfig) (r result.Error) { Inspect(func(config *JobConfig) { job.spec.Config = config }). - CatchErr(&r) + Catch(&r) return } func (s *Scheduler) PauseJob(name string) (r result.Error) { - job := s.getJob(name).UnwrapErr(&r) + job := s.getJob(name).Unwrap(&r) if r.IsErr() { return } @@ -161,7 +161,7 @@ func (s *Scheduler) PauseJob(name string) (r result.Error) { } func (s *Scheduler) ResumeJob(name string) (r result.Error) { - job := s.getJob(name).UnwrapErr(&r) + job := s.getJob(name).Unwrap(&r) if r.IsErr() { return } @@ -174,7 +174,7 @@ func (s *Scheduler) ResumeJob(name string) (r result.Error) { } func (s *Scheduler) DeleteJob(name string) (r result.Error) { - job := s.getJob(name).UnwrapErr(&r) + job := s.getJob(name).Unwrap(&r) if r.IsErr() { return } @@ -187,7 +187,7 @@ func (s *Scheduler) DeleteJob(name string) (r result.Error) { } func (s *Scheduler) ReloadJob(name string) (r result.Error) { - job := s.getJob(name).UnwrapErr(&r) + job := s.getJob(name).Unwrap(&r) if r.IsErr() { return } @@ -198,7 +198,7 @@ func (s *Scheduler) ReloadJob(name string) (r result.Error) { job.jobKey, jobOpt, ) - if result.CatchErr(&r, s.scheduler.ScheduleJob(jobDetail, job.trigger)) { + if result.Catch(&r, s.scheduler.ScheduleJob(jobDetail, job.trigger)) { return } return @@ -213,7 +213,7 @@ func (s *Scheduler) ListJobs() []*Job { } func (s *Scheduler) GetJob(name string) (r result.Result[*Job]) { - job := s.getJob(name).UnwrapErr(&r) + job := s.getJob(name).Unwrap(&r) if r.IsErr() { return } diff --git a/core/signals/signal.go b/core/signals/signal.go index 17d16f526..8d0b5f3a4 100644 --- a/core/signals/signal.go +++ b/core/signals/signal.go @@ -6,7 +6,7 @@ import ( "os/signal" "syscall" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" ) const Name = "signals" diff --git a/core/supervisor/errs.go b/core/supervisor/errs.go index 23424652f..e7726f66f 100644 --- a/core/supervisor/errs.go +++ b/core/supervisor/errs.go @@ -1,7 +1,7 @@ package supervisor import ( - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" "github.com/thejerf/suture/v4" ) diff --git a/core/supervisor/manager.go b/core/supervisor/manager.go index 5eb58508d..a1f57915f 100644 --- a/core/supervisor/manager.go +++ b/core/supervisor/manager.go @@ -5,14 +5,14 @@ import ( "fmt" "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/async" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/async" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/running" + "github.com/pubgo/funk/v2/stack" "github.com/thejerf/suture/v4" "github.com/pubgo/lava/v2/core/debug" @@ -26,7 +26,7 @@ type serviceWrapper struct { } func Default(lc lifecycle.Getter) *Manager { - return NewManager(running.Project, lc) + return NewManager(running.Project(), lc) } func NewManager(name string, lc lifecycle.Getter) *Manager { @@ -98,7 +98,7 @@ func (m *Manager) Delete(name string) error { func (m *Manager) RemoveServices() (gErr error) { for name, srv := range m.services { - if result.Catch(&gErr, m.supervisor.Remove(srv.token)) { + if result.CatchErr(&gErr, m.supervisor.Remove(srv.token)) { return errors.Wrapf(gErr, "failed to remove service, name=%s", name) } m.logger.Info().Str("name", name).Msg("removing service from supervisor") @@ -110,7 +110,7 @@ func (m *Manager) RemoveServices() (gErr error) { func (m *Manager) RestartServices() (gErr error) { for name, srv := range m.services { - if result.Catch(&gErr, m.supervisor.Remove(srv.token)) { + if result.CatchErr(&gErr, m.supervisor.Remove(srv.token)) { return errors.Wrapf(gErr, "failed to remove service, name=%s", name) } @@ -128,7 +128,7 @@ func (m *Manager) RestartService(name string) (gErr error) { return nil } - if result.Catch(&gErr, m.supervisor.Remove(srv.token)) { + if result.CatchErr(&gErr, m.supervisor.Remove(srv.token)) { return errors.Wrapf(gErr, "failed to remove service, name=%s", name) } diff --git a/core/supervisor/service.go b/core/supervisor/service.go index 4b8afc21a..f4052d463 100644 --- a/core/supervisor/service.go +++ b/core/supervisor/service.go @@ -5,9 +5,9 @@ import ( "fmt" "time" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" "go.uber.org/atomic" ) diff --git a/core/supervisor/spec.go b/core/supervisor/spec.go index 813944cc8..b6f8b7156 100644 --- a/core/supervisor/spec.go +++ b/core/supervisor/spec.go @@ -4,7 +4,7 @@ import ( "log/slog" "time" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "github.com/thejerf/suture/v4" ) diff --git a/core/tracing/telemetry.go b/core/tracing/telemetry.go index 68df9a038..0c4878556 100644 --- a/core/tracing/telemetry.go +++ b/core/tracing/telemetry.go @@ -7,10 +7,11 @@ import ( "time" "github.com/goccy/go-json" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/buildinfo/version" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/result" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" "go.opentelemetry.io/otel/exporters/otlp/otlptrace" @@ -165,7 +166,7 @@ func initTracerExporter(config *Config) (sdktrace.SpanExporter, error) { func NewPrometheusMeterProvider(config *Config, opts ...otelprom.Option) (_ *sdkmetric.MeterProvider, gErr error) { exporter, err := otelprom.New(opts...) - if errcheck.Check(&gErr, err) { + if result.CatchErr(&gErr, err) { return } diff --git a/core/tracing/tracingbuilder/config.go b/core/tracing/tracingbuilder/config.go index 5d5dda310..e9c0c0beb 100644 --- a/core/tracing/tracingbuilder/config.go +++ b/core/tracing/tracingbuilder/config.go @@ -4,7 +4,7 @@ import ( "crypto/tls" "time" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/buildinfo/version" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/propagation" diff --git a/core/tracing/tracingbuilder/telemetry.go b/core/tracing/tracingbuilder/telemetry.go index 171c21374..6c17e7397 100644 --- a/core/tracing/tracingbuilder/telemetry.go +++ b/core/tracing/tracingbuilder/telemetry.go @@ -8,10 +8,10 @@ import ( "os" "time" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/buildinfo/version" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" "github.com/pubgo/funk/v2/result" - "github.com/pubgo/funk/version" "github.com/pubgo/lava/v2/core/lifecycle" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" @@ -92,7 +92,7 @@ func New(params Params) Provider { // merge config resource with default resource func mergeResource(config *Config) (r result.Result[*resource.Resource]) { - defer result.RecoveryErr(&r) + defer result.Recovery(&r) res := result.Wrap(resource.New(context.Background(), resource.WithFromEnv(), resource.WithTelemetrySDK(), @@ -117,7 +117,7 @@ func mergeResource(config *Config) (r result.Result[*resource.Resource]) { } func NewTracerProvider(config *Config) (r result.Result[*sdktrace.TracerProvider]) { - defer result.RecoveryErr(&r) + defer result.Recovery(&r) res := mergeResource(config).Log().Must() traceExporter := result.Wrap(newGrpcTracerExporter(config)).Log().Must() @@ -194,7 +194,7 @@ func newGrpcMetricExporter(config *Config) (sdkmetric.Exporter, error) { } func NewMeterProvider(config *Config) (r result.Result[*sdkmetric.MeterProvider]) { - defer result.RecoveryErr(&r) + defer result.Recovery(&r) //reader := metric.NewPeriodicReader(assert.Must1(newGrpcMetricExporter(config))) //readerOpt := sdkmetric.WithReader(reader) diff --git a/go.mod b/go.mod index a09c63451..14822aaf5 100644 --- a/go.mod +++ b/go.mod @@ -54,8 +54,8 @@ require ( github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 github.com/maragudk/gomponents v0.22.0 github.com/maruel/panicparse/v2 v2.5.0 - github.com/pubgo/dix v0.3.23-alpha.2 - github.com/pubgo/funk v0.5.69-alpha.30 + github.com/pubgo/dix/v2 v2.0.0-alpha.3 + github.com/pubgo/funk/v2 v2.0.0-alpha.10 github.com/rs/xid v1.6.0 github.com/rs/zerolog v1.34.0 github.com/samber/lo v1.51.0 @@ -98,6 +98,7 @@ require ( github.com/OpenPeeDeeP/depguard/v2 v2.2.0 // indirect github.com/a8m/envsubst v1.4.3 // indirect github.com/alecthomas/go-check-sumtype v0.1.4 // indirect + github.com/alecthomas/repr v0.4.0 // indirect github.com/alexkohler/nakedret/v2 v2.0.4 // indirect github.com/alexkohler/prealloc v1.0.0 // indirect github.com/alingse/asasalint v0.0.11 // indirect @@ -228,12 +229,14 @@ require ( github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect + github.com/phuslu/goid v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/polyfloyd/go-errorlint v1.6.0 // indirect github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.65.0 // indirect github.com/prometheus/procfs v0.17.0 // indirect + github.com/pubgo/funk v0.5.41 // indirect github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 // indirect github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect github.com/quasilyte/gogrep v0.5.0 // indirect @@ -287,12 +290,13 @@ require ( go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/proto/otlp v1.7.0 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.24.0 // indirect + go.uber.org/zap v1.27.0 // indirect golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc // indirect golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f // indirect golang.org/x/sync v0.16.0 // indirect golang.org/x/telemetry v0.0.0-20250710130107-8d8967aff50b // indirect golang.org/x/text v0.27.0 // indirect + golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 99f2e4c72..057148d4e 100644 --- a/go.sum +++ b/go.sum @@ -56,7 +56,6 @@ github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8ger github.com/ashanbrown/forbidigo v1.6.0/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -479,6 +478,8 @@ github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNH github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= +github.com/phuslu/goid v1.0.0 h1:Cgcvd/R54UO1fCtyt+iKXAi+yZQ/KWlAm6MmZNizCLM= +github.com/phuslu/goid v1.0.0/go.mod h1:txc2fUIdrdnn+v9Vq+QpiPQ3dnrXEchjoVDgic+r+L0= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -502,10 +503,12 @@ github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2 github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= -github.com/pubgo/dix v0.3.23-alpha.2 h1:wzxsB3F1EB6jeGybPH+rZi23Bq3PIb0/qQJLpeFcBhA= -github.com/pubgo/dix v0.3.23-alpha.2/go.mod h1:PF1loTKWhqQtcMc1MbROeT+HrRiIZA7U37sKOdqNmmo= -github.com/pubgo/funk v0.5.69-alpha.30 h1:LVxONor6BqVkeXsBOrpu6QdkaoUH09yJdglZ8VX++n4= -github.com/pubgo/funk v0.5.69-alpha.30/go.mod h1:dBFx3ZnM6IML9tqK23ROTB9xX0Q27dLXUxAoSuh5mMI= +github.com/pubgo/dix/v2 v2.0.0-alpha.3 h1:tvu/AubmngkDYjf4SUEUN5UWbBa4yviqBBU5zy8LLhY= +github.com/pubgo/dix/v2 v2.0.0-alpha.3/go.mod h1:8hSX7CW+Y2dKkoKp4SAHbotUXD86Mtr3FTxBn7gyZSw= +github.com/pubgo/funk v0.5.41 h1:vcDD6SWsz6g9CoD/whMIDgcfnGBfvCoZa6OTJ9iB9Tk= +github.com/pubgo/funk v0.5.41/go.mod h1:gKCw72+MK7xPiUGY1Z/bdGJMrSfVi87r0x/7d1GtKU4= +github.com/pubgo/funk/v2 v2.0.0-alpha.10 h1:LoHIPTg/i1KpRwOH+Xgt0LdIYKbMF44lUcyBvw0/1z8= +github.com/pubgo/funk/v2 v2.0.0-alpha.10/go.mod h1:oH13zhMcZ1GJ+Y/Qlx5r9Lpu8jdTDRnOqFCiwAig+Wc= github.com/pubgo/opendoc v0.0.5 h1:aM6xkBQ0XMSq8OWytl5JhTMBUv8L+aYQFXd2z9eNkZE= github.com/pubgo/opendoc v0.0.5/go.mod h1:uO//pJZTJNFEKGuGWrv51/of0EoyxO1il4MuoC3Enp0= github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 h1:+Wl/0aFp0hpuHM3H//KMft64WQ1yX9LdJY64Qm/gFCo= @@ -715,8 +718,8 @@ go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9i 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.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -871,6 +874,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= diff --git a/internal/examples/fileserve/main.go b/internal/examples/fileserve/main.go index 9812d3431..8027c929f 100644 --- a/internal/examples/fileserve/main.go +++ b/internal/examples/fileserve/main.go @@ -1,7 +1,7 @@ package main import ( - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/recovery" "github.com/pubgo/lava/v2/cmds/servefilecmd" "github.com/pubgo/lava/v2/core/lavabuilder" ) diff --git a/internal/examples/scheduler/main.go b/internal/examples/scheduler/main.go index fd026e8d3..6e4d64ec7 100644 --- a/internal/examples/scheduler/main.go +++ b/internal/examples/scheduler/main.go @@ -5,10 +5,10 @@ import ( "fmt" "time" - "github.com/pubgo/funk/cmds/configcmd" - "github.com/pubgo/funk/cmds/envcmd" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/cmds/configcmd" + "github.com/pubgo/funk/v2/cmds/envcmd" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/recovery" "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/v2/core/lavabuilder" "github.com/pubgo/lava/v2/core/logging" diff --git a/internal/logutil/util.go b/internal/logutil/util.go index 71d3df9db..4bb16e397 100644 --- a/internal/logutil/util.go +++ b/internal/logutil/util.go @@ -4,9 +4,9 @@ import ( "log/slog" "strings" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/try" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/try" ) func HandlerErr(err error) { diff --git a/internal/middlewares/middleware_accesslog/middleware.go b/internal/middlewares/middleware_accesslog/middleware.go index a97a71d14..912d18f79 100644 --- a/internal/middlewares/middleware_accesslog/middleware.go +++ b/internal/middlewares/middleware_accesslog/middleware.go @@ -6,12 +6,11 @@ import ( "time" "github.com/gofiber/utils" - "github.com/pubgo/funk/convert" - "github.com/pubgo/funk/errors/errutil" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/proto/errorpb" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/buildinfo/version" + "github.com/pubgo/funk/v2/convert" + "github.com/pubgo/funk/v2/errors/errutil" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/proto/errorpb" "github.com/pubgo/lava/v2/core/lavacontexts" "github.com/pubgo/lava/v2/lava" "github.com/pubgo/lava/v2/pkg/grpcutil" @@ -66,7 +65,7 @@ func (l LogMiddleware) Middleware(next lava.HandlerFunc) lava.HandlerFunc { // 错误和panic处理 defer func() { - if !generic.IsNil(gErr) { + if gErr != nil { evt.Stringer("req_header", req.Header()) logOpts := handleLogOption(req.Header()) if logOpts.EnableAll() { @@ -92,7 +91,7 @@ func (l LogMiddleware) Middleware(next lava.HandlerFunc) lava.HandlerFunc { // 记录错误日志 var e *zerolog.Event - if generic.IsNil(gErr) { + if gErr == nil { // Record requests with a timeout of 200 milliseconds //if latency > time.Millisecond*200 && !req.Stream() { // e = l.logger.Err(errTimeout).Func(log.WithEvent(evt)) @@ -104,39 +103,17 @@ func (l LogMiddleware) Middleware(next lava.HandlerFunc) lava.HandlerFunc { e = l.logger.Err(gErr).Func(log.WithEvent(evt)) pb := errutil.ParseError(gErr) - { - if pb.Trace == nil { - pb.Trace = new(errorpb.ErrTrace) - } - pb.Trace.Operation = req.Operation() - pb.Trace.Service = req.Service() - pb.Trace.Version = version.Version() + if pb.Message == "" { + pb.Message = gErr.Error() } - { - if pb.Msg != nil { - pb.Msg = new(errorpb.ErrMsg) - } - pb.Msg.Msg = gErr.Error() - pb.Msg.Detail = fmt.Sprintf("%#v", gErr) - if pb.Msg.Tags == nil { - pb.Msg.Tags = make(map[string]string) - } + if pb.StatusCode == errorpb.Code_OK { + log.Warn(ctx).Any("code", pb.Code).Msg("grpc response error with status code is 0") } - { - if pb.Code.Message == "" { - pb.Code.Message = gErr.Error() - } - - if pb.Code.StatusCode == errorpb.Code_OK { - log.Warn(ctx).Any("code", pb.Code).Msg("grpc response error with status code is 0") - } - - if pb.Code.Code == 0 { - pb.Code.Code = int32(errutil.GrpcCodeToHTTP(codes.Code(pb.Code.StatusCode))) - pb.Code.StatusCode = errorpb.Code_Internal - } + if pb.Code == 0 { + pb.Code = int32(errutil.GrpcCodeToHTTP(codes.Code(pb.StatusCode))) + pb.StatusCode = errorpb.Code_Internal } gErr = errutil.ConvertErr2Status(pb).Err() diff --git a/internal/middlewares/middleware_metric/middleware.go b/internal/middlewares/middleware_metric/middleware.go index 1f4d437ff..ce4a9ab74 100644 --- a/internal/middlewares/middleware_metric/middleware.go +++ b/internal/middlewares/middleware_metric/middleware.go @@ -5,7 +5,7 @@ import ( "strings" "time" - "github.com/pubgo/funk/generic" + "github.com/pubgo/funk/v2/generic" "github.com/uber-go/tally/v4" "github.com/pubgo/lava/v2/core/metrics" diff --git a/internal/middlewares/middleware_recovery/middleware.go b/internal/middlewares/middleware_recovery/middleware.go index 9618ef3d0..e8e407858 100644 --- a/internal/middlewares/middleware_recovery/middleware.go +++ b/internal/middlewares/middleware_recovery/middleware.go @@ -3,7 +3,7 @@ package middleware_recovery import ( "context" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" "github.com/pubgo/lava/v2/lava" ) diff --git a/internal/middlewares/middleware_serviceinfo/middleware.go b/internal/middlewares/middleware_serviceinfo/middleware.go index 051d780f3..187a58a94 100644 --- a/internal/middlewares/middleware_serviceinfo/middleware.go +++ b/internal/middlewares/middleware_serviceinfo/middleware.go @@ -3,10 +3,10 @@ package middleware_serviceinfo import ( "context" - "github.com/pubgo/funk/convert" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/strutil" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/buildinfo/version" + "github.com/pubgo/funk/v2/convert" + "github.com/pubgo/funk/v2/running" + "github.com/pubgo/funk/v2/strutil" "github.com/rs/xid" "github.com/pubgo/lava/v2/core/lavacontexts" diff --git a/pkg/fasttemplate/template.go b/pkg/fasttemplate/template.go index c4d271e30..dc37a43fd 100644 --- a/pkg/fasttemplate/template.go +++ b/pkg/fasttemplate/template.go @@ -5,10 +5,10 @@ import ( "fmt" "io" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" - "github.com/pubgo/funk/convert" + "github.com/pubgo/funk/v2/convert" "github.com/valyala/bytebufferpool" ) diff --git a/pkg/gateway/gatewayutils/query_params.go b/pkg/gateway/gatewayutils/query_params.go index e642d4185..2a5d3d4e1 100644 --- a/pkg/gateway/gatewayutils/query_params.go +++ b/pkg/gateway/gatewayutils/query_params.go @@ -11,7 +11,7 @@ import ( "strings" "time" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" "google.golang.org/grpc/grpclog" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" @@ -346,7 +346,7 @@ func parseMessage(msgDescriptor protoreflect.MessageDescriptor, value string) (p } msg = &v default: - return protoreflect.Value{}, errors.Format("unsupported message type: %q", string(msgDescriptor.FullName())) + return protoreflect.Value{}, errors.Errorf("unsupported message type: %q", string(msgDescriptor.FullName())) } return protoreflect.ValueOfMessage(msg.ProtoReflect()), nil @@ -440,7 +440,7 @@ func parseParam(fds []protoreflect.FieldDescriptor, raw []byte) (param, error) { enumVal := fd.Enum().Values().ByName(protoreflect.Name(s)) if enumVal == nil { - return param{}, errors.Format("unexpected enum %s", raw) + return param{}, errors.Errorf("unexpected enum %s", raw) } return param{fds: fds, val: protoreflect.ValueOfEnum(enumVal.Number())}, nil @@ -524,10 +524,10 @@ func parseParam(fds []protoreflect.FieldDescriptor, raw []byte) (param, error) { return param{fds: fds, val: protoreflect.ValueOfMessage(msg.ProtoReflect())}, nil } } - return param{}, errors.Format("unexpected message type %s", name) + return param{}, errors.Errorf("unexpected message type %s", name) default: - return param{}, errors.Format("unknown param type %s", kind) + return param{}, errors.Errorf("unknown param type %s", kind) } } diff --git a/pkg/gateway/grpccodes.go b/pkg/gateway/grpccodes.go index 0d256fda0..383908b75 100644 --- a/pkg/gateway/grpccodes.go +++ b/pkg/gateway/grpccodes.go @@ -3,7 +3,7 @@ package gateway import ( "net/http" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "google.golang.org/grpc/codes" ) diff --git a/pkg/gateway/mux.go b/pkg/gateway/mux.go index 42e705669..09e552f5b 100644 --- a/pkg/gateway/mux.go +++ b/pkg/gateway/mux.go @@ -14,12 +14,12 @@ import ( "github.com/fullstorydev/grpchan/inprocgrpc" "github.com/gofiber/adaptor/v2" "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/result" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/buildinfo/version" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/result" "github.com/pubgo/lava/v2/lava" "github.com/pubgo/lava/v2/pkg/gateway/routertree" "github.com/pubgo/lava/v2/pkg/httputil" @@ -148,7 +148,7 @@ func (m *Mux) MatchOperation(method string, path string) (r result.Result[*Match return r.WithErr(errors.Wrapf(err, "path not found, method=%s path=%s", method, path)) } - return r.WithVal(restTarget) + return r.WithValue(restTarget) } func (m *Mux) GetOperationByName(name string) *GrpcMethod { @@ -186,7 +186,7 @@ func (m *Mux) Handler(ctx *fiber.Ctx) error { mth := m.opts.handlers[matchOperation.Operation] if mth == nil { - return errors.Format("grpc method not found, method=%s", matchOperation.Operation) + return errors.Errorf("grpc method not found, method=%s", matchOperation.Operation) } md := metadata.MD{} @@ -376,7 +376,7 @@ func (m *Mux) registerService(gsd *grpc.ServiceDesc, ss interface{}, cli grpc.Cl sd, ok := d.(protoreflect.ServiceDescriptor) if !ok { - return errors.Format("invalid httpPathRule descriptor %T", d) + return errors.Errorf("invalid httpPathRule descriptor %T", d) } srv := &serviceWrapper{ diff --git a/pkg/gateway/routertree/parser.go b/pkg/gateway/routertree/parser.go index 0d10e3116..6b2603b16 100644 --- a/pkg/gateway/routertree/parser.go +++ b/pkg/gateway/routertree/parser.go @@ -5,8 +5,8 @@ import ( "github.com/alecthomas/participle/v2" "github.com/alecthomas/participle/v2/lexer" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/generic" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/generic" ) var ( @@ -59,7 +59,7 @@ func (r routePath) Match(urls []string, verb string) ([]PathFieldVar, error) { continue } - return nil, errors.Format("path(%s) not match", path) + return nil, errors.Errorf("path(%s) not match", path) } var vv []PathFieldVar diff --git a/pkg/gateway/routertree/parser_test.go b/pkg/gateway/routertree/parser_test.go index a371a0197..785330c22 100644 --- a/pkg/gateway/routertree/parser_test.go +++ b/pkg/gateway/routertree/parser_test.go @@ -3,7 +3,7 @@ package routertree import ( "testing" - "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/v2/assert" ) func TestName(t *testing.T) { diff --git a/pkg/gateway/routertree/router.go b/pkg/gateway/routertree/router.go index 007ed43aa..34eaace0a 100644 --- a/pkg/gateway/routertree/router.go +++ b/pkg/gateway/routertree/router.go @@ -4,8 +4,8 @@ import ( "fmt" "strings" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/generic" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/generic" ) var ( @@ -69,7 +69,7 @@ func (r *RouteTree) Add(method string, path string, operation string, extras map node := parseToRoute(rule) if len(node.Paths) == 0 { - return errors.Format("node path is empty: %s", errMsg()) + return errors.Errorf("node path is empty: %s", errMsg()) } nodeMap := r.nodeMap diff --git a/pkg/gateway/routertree/router_test.go b/pkg/gateway/routertree/router_test.go index fba32065f..c1bcdf93a 100644 --- a/pkg/gateway/routertree/router_test.go +++ b/pkg/gateway/routertree/router_test.go @@ -3,7 +3,7 @@ package routertree import ( "testing" - "github.com/pubgo/funk/pretty" + "github.com/pubgo/funk/v2/pretty" "github.com/stretchr/testify/assert" ) diff --git a/pkg/gateway/stream.go b/pkg/gateway/stream.go index 31b084f95..413c75dde 100644 --- a/pkg/gateway/stream.go +++ b/pkg/gateway/stream.go @@ -3,7 +3,7 @@ package gateway import ( "context" - "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/v2/assert" "google.golang.org/grpc" "google.golang.org/grpc/metadata" ) diff --git a/pkg/gateway/stream.http.go b/pkg/gateway/stream.http.go index c868e35e0..becc210ab 100644 --- a/pkg/gateway/stream.http.go +++ b/pkg/gateway/stream.http.go @@ -8,8 +8,8 @@ import ( "net/url" "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/generic" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/generic" "github.com/pubgo/lava/v2/pkg/gateway/gatewayutils" "github.com/pubgo/lava/v2/pkg/gateway/routertree" "google.golang.org/grpc" diff --git a/pkg/gateway/stream.proxy.go b/pkg/gateway/stream.proxy.go index 688867e74..9a5ad9263 100644 --- a/pkg/gateway/stream.proxy.go +++ b/pkg/gateway/stream.proxy.go @@ -7,7 +7,7 @@ import ( "context" "io" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" "github.com/pubgo/lava/v2/internal/logutil" "google.golang.org/grpc" "google.golang.org/grpc/codes" diff --git a/pkg/gateway/util.go b/pkg/gateway/util.go index 8be6b4929..a1bd4586e 100644 --- a/pkg/gateway/util.go +++ b/pkg/gateway/util.go @@ -9,8 +9,8 @@ import ( "strconv" "strings" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" "github.com/pubgo/lava/v2/pkg/gateway/routertree" "github.com/pubgo/lava/v2/pkg/proto/lavapbv1" "google.golang.org/genproto/googleapis/api/annotations" @@ -190,7 +190,7 @@ func handlerHttpRoute(httpRule *annotations.HttpRule, cb func(mth string, path s case *annotations.HttpRule_Custom: method, template = pattern.Custom.GetKind(), pattern.Custom.GetPath() default: - return errors.Format("invalid type of pattern for HTTP httpRule: %T", pattern) + return errors.Errorf("invalid type of pattern for HTTP httpRule: %T", pattern) } if method == "" { @@ -223,7 +223,7 @@ func handlerHttpRoute(httpRule *annotations.HttpRule, cb func(mth string, path s } if err := handlerHttpRoute(rule, cb); err != nil { - return errors.Format("failed to add REST route (add binding #%d): %v", i+1, err) + return errors.Errorf("failed to add REST route (add binding #%d): %v", i+1, err) } } diff --git a/pkg/gateway/wrapper.go b/pkg/gateway/wrapper.go index 062e8e114..f31a4d7a4 100644 --- a/pkg/gateway/wrapper.go +++ b/pkg/gateway/wrapper.go @@ -3,7 +3,7 @@ package gateway import ( "context" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" "github.com/pubgo/lava/v2/pkg/proto/lavapbv1" "google.golang.org/grpc" "google.golang.org/protobuf/reflect/protoreflect" diff --git a/pkg/grpcutil/util.go b/pkg/grpcutil/util.go index 6f81ad5ae..2970ebcc7 100644 --- a/pkg/grpcutil/util.go +++ b/pkg/grpcutil/util.go @@ -6,7 +6,7 @@ import ( "net/http" "strings" - "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/v2/assert" "google.golang.org/grpc" "google.golang.org/grpc/admin" "google.golang.org/grpc/channelz/service" diff --git a/pkg/httputil/util.go b/pkg/httputil/util.go index ab67510ac..5a58c50ee 100644 --- a/pkg/httputil/util.go +++ b/pkg/httputil/util.go @@ -7,12 +7,12 @@ import ( "dario.cat/mergo" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cors" - "github.com/pubgo/funk" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/errors/errutil" - "github.com/pubgo/funk/proto/errorpb" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2" + "github.com/pubgo/funk/v2/buildinfo/version" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/errors/errutil" + "github.com/pubgo/funk/v2/proto/errorpb" + "github.com/pubgo/funk/v2/running" "github.com/samber/lo" "github.com/valyala/fasthttp" "google.golang.org/grpc/codes" @@ -38,7 +38,7 @@ func DefaultCfg(config ...*Config) Config { }, EnablePrintRouter: true, BaseUrl: version.Project(), - HttpPort: lo.ToPtr(running.HttpPort), + HttpPort: lo.ToPtr(running.HttpPort()), } for _, t := range config { @@ -77,38 +77,29 @@ func ErrHandler(ctx *fiber.Ctx, err error) error { return nil } - var errPb *errorpb.Error + var errPb *errorpb.ErrCode var fiberErr *fiber.Error if errors.As(err, &fiberErr) && fiberErr != nil { - errPb = &errorpb.Error{ - Code: &errorpb.ErrCode{ - Name: "lava.error", - StatusCode: errorpb.Code(errutil.Http2GrpcCode(int32(fiberErr.Code))), - Code: int32(fiberErr.Code), - Message: fiberErr.Message, - Details: errors.MustTagsToAny( - &errorpb.Tag{Key: "path", Value: ctx.Route().Path}, - &errorpb.Tag{Key: "version", Value: running.Version}, - &errorpb.Tag{Key: "instance", Value: running.InstanceID}, - ), - }, - Trace: &errorpb.ErrTrace{}, + errPb = &errorpb.ErrCode{ + Name: "lava.error", + StatusCode: errorpb.Code(errutil.Http2GrpcCode(int32(fiberErr.Code))), + Code: int32(fiberErr.Code), + Message: fiberErr.Message, + Details: errors.MustTagsToAny( + &errorpb.Tag{Key: "path", Value: ctx.Route().Path}, + &errorpb.Tag{Key: "version", Value: running.Version()}, + &errorpb.Tag{Key: "instance", Value: running.InstanceID}, + ), } } else { errPb = errutil.ParseError(err) } - if errPb == nil || errPb.Code.Code == 0 { + if errPb == nil || errPb.StatusCode == 0 { return nil } - errPb.Trace.Operation = ctx.Route().Path - - code := int(errPb.Code.Code) - if errPb.Code.Code > 1000 { - code = errutil.GrpcCodeToHTTP(codes.Code(errPb.Code.Code)) - } - + code := errutil.GrpcCodeToHTTP(codes.Code(errPb.StatusCode)) ctx.Set(fiber.HeaderContentType, fiber.MIMEApplicationJSON) return ctx.Status(code).JSON(errPb) } diff --git a/pkg/netutil/conn.go b/pkg/netutil/conn.go index 9e484b951..97501dc9f 100644 --- a/pkg/netutil/conn.go +++ b/pkg/netutil/conn.go @@ -9,8 +9,8 @@ import ( "strconv" "strings" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/recovery" ) type sockOpts struct { diff --git a/pkg/netutil/util.go b/pkg/netutil/util.go index 87670111f..d65d002b6 100644 --- a/pkg/netutil/util.go +++ b/pkg/netutil/util.go @@ -12,7 +12,7 @@ import ( "syscall" "time" - "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/v2/assert" ) var localIp = assert.Exit1(regexp.Compile(`\d+\.\d+\.\d+\.\d+`)) diff --git a/pkg/proto/lavapbv1/form_file.pb.go b/pkg/proto/lavapbv1/form_file.pb.go index b4a3be475..4a6496a6c 100644 --- a/pkg/proto/lavapbv1/form_file.pb.go +++ b/pkg/proto/lavapbv1/form_file.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v5.28.2 +// protoc v6.32.1 // source: lava/form_file.proto package lavapbv1 diff --git a/pkg/proto/lavapbv1/rpc.pb.go b/pkg/proto/lavapbv1/rpc.pb.go index a212f63d8..0e213ec8f 100644 --- a/pkg/proto/lavapbv1/rpc.pb.go +++ b/pkg/proto/lavapbv1/rpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v5.28.2 +// protoc v6.32.1 // source: lava/rpc.proto package lavapbv1 @@ -32,8 +32,6 @@ type RpcMeta struct { Version *string `protobuf:"bytes,2,opt,name=version,proto3,oneof" json:"version,omitempty"` // rpc tags Tags map[string]string `protobuf:"bytes,3,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // grpc method name - Method *string `protobuf:"bytes,4,opt,name=method,proto3,oneof" json:"method,omitempty"` } func (x *RpcMeta) Reset() { @@ -87,13 +85,6 @@ func (x *RpcMeta) GetTags() map[string]string { return nil } -func (x *RpcMeta) GetMethod() string { - if x != nil && x.Method != nil { - return *x.Method - } - return "" -} - var file_lava_rpc_proto_extTypes = []protoimpl.ExtensionInfo{ { ExtendedType: (*descriptorpb.MethodOptions)(nil), @@ -117,30 +108,27 @@ var file_lava_rpc_proto_rawDesc = []byte{ 0x0a, 0x0e, 0x6c, 0x61, 0x76, 0x61, 0x2f, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x6c, 0x61, 0x76, 0x61, 0x2e, 0x72, 0x70, 0x63, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xda, 0x01, 0x0a, + 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb2, 0x01, 0x0a, 0x07, 0x52, 0x70, 0x63, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x61, 0x76, 0x61, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x70, 0x63, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x67, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1b, 0x0a, 0x06, - 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, - 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x09, - 0x0a, 0x07, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x4d, 0x0a, 0x07, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x8d, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6c, - 0x61, 0x76, 0x61, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x70, 0x63, 0x4d, 0x65, 0x74, 0x61, 0x52, - 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x6c, 0x61, 0x76, - 0x61, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6c, 0x61, 0x76, 0x61, - 0x70, 0x62, 0x76, 0x31, 0x3b, 0x6c, 0x61, 0x76, 0x61, 0x70, 0x62, 0x76, 0x31, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0x37, 0x0a, 0x09, + 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x3a, 0x4d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x8d, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6c, 0x61, 0x76, 0x61, 0x2e, 0x72, 0x70, 0x63, 0x2e, + 0x52, 0x70, 0x63, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, + 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x6c, 0x61, 0x76, 0x61, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2f, 0x6c, 0x61, 0x76, 0x61, 0x70, 0x62, 0x76, 0x31, 0x3b, 0x6c, 0x61, 0x76, + 0x61, 0x70, 0x62, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/proto/lavapbv1/service.pb.go b/pkg/proto/lavapbv1/service.pb.go index 2cb6e83b7..8aa322ecc 100644 --- a/pkg/proto/lavapbv1/service.pb.go +++ b/pkg/proto/lavapbv1/service.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v5.28.2 +// protoc v6.32.1 // source: lava/service.proto package lavapbv1 @@ -9,6 +9,8 @@ package lavapbv1 import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + _ "google.golang.org/protobuf/types/known/structpb" + _ "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" sync "sync" ) @@ -97,23 +99,100 @@ func (x *ServiceInfo) GetIp() string { return "" } +type HttpResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Body string `protobuf:"bytes,1,opt,name=body,proto3" json:"body,omitempty"` + StatusCode int32 `protobuf:"varint,2,opt,name=status_code,json=statusCode,proto3" json:"status_code,omitempty"` + Headers map[string]string `protobuf:"bytes,3,rep,name=headers,proto3" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *HttpResponse) Reset() { + *x = HttpResponse{} + mi := &file_lava_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HttpResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HttpResponse) ProtoMessage() {} + +func (x *HttpResponse) ProtoReflect() protoreflect.Message { + mi := &file_lava_service_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HttpResponse.ProtoReflect.Descriptor instead. +func (*HttpResponse) Descriptor() ([]byte, []int) { + return file_lava_service_proto_rawDescGZIP(), []int{1} +} + +func (x *HttpResponse) GetBody() string { + if x != nil { + return x.Body + } + return "" +} + +func (x *HttpResponse) GetStatusCode() int32 { + if x != nil { + return x.StatusCode + } + return 0 +} + +func (x *HttpResponse) GetHeaders() map[string]string { + if x != nil { + return x.Headers + } + return nil +} + var File_lava_service_proto protoreflect.FileDescriptor var file_lava_service_proto_rawDesc = []byte{ 0x0a, 0x12, 0x6c, 0x61, 0x76, 0x61, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x6c, 0x61, 0x76, 0x61, 0x2e, 0x76, 0x31, 0x22, 0x7b, 0x0a, - 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1a, - 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x6c, - 0x61, 0x76, 0x61, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6c, 0x61, - 0x76, 0x61, 0x70, 0x62, 0x76, 0x31, 0x3b, 0x6c, 0x61, 0x76, 0x61, 0x70, 0x62, 0x76, 0x31, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x6c, 0x61, 0x76, 0x61, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, + 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x7b, 0x0a, 0x0b, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, + 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x22, 0xbd, 0x01, 0x0a, 0x0c, 0x48, 0x74, 0x74, + 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1f, 0x0a, + 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x3c, + 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x6c, 0x61, 0x76, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x6c, 0x61, 0x76, + 0x61, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6c, 0x61, 0x76, 0x61, + 0x70, 0x62, 0x76, 0x31, 0x3b, 0x6c, 0x61, 0x76, 0x61, 0x70, 0x62, 0x76, 0x31, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -128,16 +207,19 @@ func file_lava_service_proto_rawDescGZIP() []byte { return file_lava_service_proto_rawDescData } -var file_lava_service_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_lava_service_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_lava_service_proto_goTypes = []any{ - (*ServiceInfo)(nil), // 0: lava.v1.ServiceInfo + (*ServiceInfo)(nil), // 0: lava.v1.ServiceInfo + (*HttpResponse)(nil), // 1: lava.v1.HttpResponse + nil, // 2: lava.v1.HttpResponse.HeadersEntry } var file_lava_service_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name + 2, // 0: lava.v1.HttpResponse.headers:type_name -> lava.v1.HttpResponse.HeadersEntry + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name } func init() { file_lava_service_proto_init() } @@ -151,7 +233,7 @@ func file_lava_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_lava_service_proto_rawDesc, NumEnums: 0, - NumMessages: 1, + NumMessages: 3, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/wsproxy/websocket_proxy.go b/pkg/wsproxy/websocket_proxy.go index 182233280..195d1d557 100644 --- a/pkg/wsproxy/websocket_proxy.go +++ b/pkg/wsproxy/websocket_proxy.go @@ -12,7 +12,7 @@ import ( "time" "github.com/gorilla/websocket" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "github.com/pubgo/lava/v2/internal/logutil" "golang.org/x/net/context" ) diff --git a/protobuf.yaml b/protobuf.yaml index 53ecf6327..51be4907c 100644 --- a/protobuf.yaml +++ b/protobuf.yaml @@ -1,4 +1,4 @@ -checksum: 2cb52bc4143a48e6062590082a7310ff425eff96 +checksum: 2289c850daf0adfce56728905ff0af84177c1c92 vendor: .proto base: out: ./pkg @@ -15,13 +15,17 @@ deps: version: v0.0.0-20220224004616-3c171936039b - name: google/protobuf url: /usr/local/include/google/protobuf + optional: true + - name: google/protobuf + url: /opt/homebrew/include/google/protobuf + optional: true - name: errorpb - url: github.com/pubgo/funk + url: github.com/pubgo/funk/v2 path: /proto/errorpb - version: v0.5.56 + version: v2.0.0-alpha.10 plugins: - name: go - - name: go-errors + - name: go-errors2 - name: go-grpc opt: - require_unimplemented_servers=false diff --git a/servers/grpcs/config.go b/servers/grpcs/config.go index 4b7dcc3ce..71b5919fe 100644 --- a/servers/grpcs/config.go +++ b/servers/grpcs/config.go @@ -1,8 +1,8 @@ package grpcs import ( - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/running" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/running" "github.com/pubgo/lava/v2/pkg/fiberbuilder" "github.com/pubgo/lava/v2/pkg/grpcbuilder" @@ -28,6 +28,6 @@ type Config struct { func defaultCfg() *Config { return &Config{ GrpcConfig: grpcbuilder.GetDefaultCfg(), - GrpcPort: generic.Ptr(running.GrpcPort), + GrpcPort: generic.Ptr(running.GrpcPort()), } } diff --git a/servers/grpcs/middleware.go b/servers/grpcs/middleware.go index e9b48c3b7..4703b9a56 100644 --- a/servers/grpcs/middleware.go +++ b/servers/grpcs/middleware.go @@ -2,20 +2,21 @@ package grpcs import ( "context" - "fmt" "time" "github.com/gofiber/fiber/v2" grpcMiddle "github.com/grpc-ecosystem/go-grpc-middleware" - "github.com/pubgo/funk/convert" - "github.com/pubgo/funk/errors/errutil" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/proto/errorpb" - "github.com/pubgo/funk/strutil" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/buildinfo/version" + "github.com/pubgo/funk/v2/convert" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/errors/errutil" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/proto/errorpb" + "github.com/pubgo/funk/v2/strutil" "github.com/rs/xid" "github.com/valyala/fasthttp" "google.golang.org/grpc" + "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" @@ -137,30 +138,17 @@ func handlerUnaryMiddle(middlewares map[string][]lava.Middleware) grpc.UnaryServ rsp, err := lava.Chain(middlewares[srvName]...).Middleware(unaryWrapper)(ctx, rpcReq) if err != nil { pb := errutil.ParseError(err) - if pb.Trace == nil { - pb.Trace = new(errorpb.ErrTrace) - } - pb.Trace.Operation = rpcReq.Operation() - pb.Trace.Service = rpcReq.Service() - pb.Trace.Version = version.Version() - - if pb.Msg != nil { - pb.Msg = new(errorpb.ErrMsg) - } - pb.Msg.Msg = err.Error() - pb.Msg.Detail = fmt.Sprintf("%#v", err) - if pb.Msg.Tags == nil { - pb.Msg.Tags = make(map[string]string) - } - pb.Msg.Tags["reqHeader"] = string(rpcReq.Header().Header()) + pb.Details = append(pb.Details, errors.MustTagsToAny( + &errorpb.Tag{Key: "reqHeader", Value: string(rpcReq.Header().Header())}, + )...) - if pb.Code.Message == "" { - pb.Code.Message = err.Error() + if pb.Message == "" { + pb.Message = err.Error() } - if pb.Code.Code == 0 { - pb.Code.StatusCode = errorpb.Code_Internal - pb.Code.Code = int32(errorpb.Code_Internal) + if pb.Code == 0 { + pb.StatusCode = errorpb.Code_Internal + pb.Code = int32(errutil.GrpcCodeToHTTP(codes.Code(errorpb.Code_Internal))) } return nil, errutil.ConvertErr2Status(pb).Err() @@ -251,22 +239,13 @@ func handlerStreamMiddle(middlewares map[string][]lava.Middleware) grpc.StreamSe rsp, err := lava.Chain(middlewares[srvName]...).Middleware(streamWrapper)(ctx, rpcReq) if err != nil { pb := errutil.ParseError(err) - pb.Trace.Operation = rpcReq.Operation() - pb.Trace.Service = rpcReq.Service() - pb.Trace.Version = version.Version() - pb.Msg.Msg = err.Error() - pb.Msg.Detail = fmt.Sprintf("%v", err) - if pb.Msg.Tags == nil { - pb.Msg.Tags = make(map[string]string) - } - - if pb.Code.Message == "" { - pb.Code.Message = err.Error() + if pb.Message == "" { + pb.Message = err.Error() } - if pb.Code.Code == 0 { - pb.Code.Code = int32(errorpb.Code_Internal) - pb.Code.StatusCode = errorpb.Code_Internal + if pb.Code == 0 { + pb.StatusCode = errorpb.Code_Internal + pb.Code = int32(errutil.GrpcCodeToHTTP(codes.Code(errorpb.Code_Internal))) } return errutil.ConvertErr2Status(pb).Err() diff --git a/servers/grpcs/server.go b/servers/grpcs/server.go index 5b1dfd75c..b252f50b8 100644 --- a/servers/grpcs/server.go +++ b/servers/grpcs/server.go @@ -9,14 +9,14 @@ import ( "github.com/fullstorydev/grpchan/inprocgrpc" "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/async" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/stack" - "github.com/pubgo/funk/vars" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/async" + "github.com/pubgo/funk/v2/buildinfo/version" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/stack" + "github.com/pubgo/funk/v2/vars" "github.com/rs/xid" "google.golang.org/grpc" @@ -112,7 +112,7 @@ func (s *serviceImpl) init( conf.HttpPort = cfg.HttpPort conf.Http = cfg.Http - s.conf = config.MergeR(defaultCfg(), conf).Unwrap() + s.conf = config.MergeR(defaultCfg(), conf).Must() globalMiddlewares := lava.Middlewares{ middleware_serviceinfo.New(), diff --git a/servers/https/server.go b/servers/https/server.go index 6532cdc69..fe96ed2a1 100644 --- a/servers/https/server.go +++ b/servers/https/server.go @@ -5,12 +5,12 @@ import ( "fmt" "github.com/gofiber/fiber/v2" - "github.com/pubgo/funk/async" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/vars" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/async" + "github.com/pubgo/funk/v2/buildinfo/version" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/running" + "github.com/pubgo/funk/v2/vars" "github.com/pubgo/opendoc/opendoc" "github.com/rs/xid" "github.com/samber/lo" diff --git a/taskfile.yml b/taskfile.yml index 7ae57cda1..5f700e39f 100644 --- a/taskfile.yml +++ b/taskfile.yml @@ -5,7 +5,7 @@ version: '3' dotenv: [ '.env' ] vars: Project: "lava" - Base: "github.com/pubgo/funk" + Base: "github.com/pubgo/funk/v2" VERSION: sh: "git tag --sort=committerdate | tail -n 1" BUILD_TIME: