feat: 完善服务监控与下游重投

This commit is contained in:
hectorzhao
2026-08-14 17:21:29 +08:00
parent d30d9ea4d0
commit 1ef4380422
50 changed files with 1279 additions and 82 deletions
+41 -1
View File
@@ -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,