feat: 完善服务监控与下游重投
This commit is contained in:
@@ -5,13 +5,19 @@ import (
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"cmpp-platform/gateway/internal/control"
|
||||
"cmpp-platform/gateway/internal/health"
|
||||
"cmpp-platform/gateway/internal/inbound"
|
||||
platformmetrics "cmpp-platform/gateway/internal/metrics"
|
||||
"cmpp-platform/gateway/internal/ratelimit"
|
||||
"cmpp-platform/gateway/internal/submitworker"
|
||||
"cmpp-platform/gateway/internal/upstream"
|
||||
|
||||
"github.com/redis/go-redis/v9"
|
||||
)
|
||||
|
||||
func main() {
|
||||
@@ -25,6 +31,7 @@ func main() {
|
||||
}
|
||||
apiBaseURL := os.Getenv("API_BASE_URL")
|
||||
upstreamManager := &upstream.Manager{APIBaseURL: apiBaseURL}
|
||||
var worker *submitworker.Worker
|
||||
channelLimiter, err := ratelimit.New(os.Getenv("REDIS_URL"))
|
||||
if err != nil {
|
||||
log.Fatalf("gateway channel rate limiter init failed: %v", err)
|
||||
@@ -53,7 +60,7 @@ func main() {
|
||||
}()
|
||||
|
||||
if os.Getenv("GATEWAY_SUBMIT_WORKER_DISABLED") != "true" {
|
||||
worker, err := submitworker.New(os.Getenv("REDIS_URL"), upstreamManager)
|
||||
worker, err = submitworker.New(os.Getenv("REDIS_URL"), upstreamManager)
|
||||
if err != nil {
|
||||
log.Printf("gateway submit worker init failed: %v", err)
|
||||
} else {
|
||||
@@ -72,6 +79,39 @@ func main() {
|
||||
|
||||
mux := http.NewServeMux()
|
||||
mux.Handle("/health", health.Handler())
|
||||
mux.Handle("/metrics", platformmetrics.Handler(func(ctx context.Context) platformmetrics.Snapshot {
|
||||
desired, connected := upstreamManager.ConnectionCounts()
|
||||
snapshot := platformmetrics.Snapshot{
|
||||
UpstreamDesired: desired, UpstreamConnected: connected,
|
||||
DownstreamConnected: inbound.ActiveConnectionCount(), SubmitWorkerUp: worker != nil,
|
||||
}
|
||||
if worker == nil || worker.Redis == nil {
|
||||
return snapshot
|
||||
}
|
||||
pending, err := worker.Redis.XPending(ctx, worker.Stream, worker.Group).Result()
|
||||
if err != nil {
|
||||
return snapshot
|
||||
}
|
||||
snapshot.QueueAvailable = true
|
||||
snapshot.QueuePending = pending.Count
|
||||
groups, err := worker.Redis.XInfoGroups(ctx, worker.Stream).Result()
|
||||
if err == nil {
|
||||
for _, group := range groups {
|
||||
if group.Name == worker.Group {
|
||||
snapshot.QueueLag = group.Lag
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
entries, err := worker.Redis.XPendingExt(ctx, &redis.XPendingExtArgs{Stream: worker.Stream, Group: worker.Group, Start: "-", End: "+", Count: 1}).Result()
|
||||
if err == nil && len(entries) > 0 {
|
||||
milliseconds, parseErr := strconv.ParseInt(strings.SplitN(entries[0].ID, "-", 2)[0], 10, 64)
|
||||
if parseErr == nil {
|
||||
snapshot.QueueOldestAgeSeconds = max(0, time.Since(time.UnixMilli(milliseconds)).Seconds())
|
||||
}
|
||||
}
|
||||
return snapshot
|
||||
}))
|
||||
control.Register(mux, control.Server{
|
||||
APIBaseURL: apiBaseURL,
|
||||
Upstream: upstreamManager,
|
||||
|
||||
Reference in New Issue
Block a user