This commit is contained in:
2025-11-17 15:39:44 +08:00
parent abfa51f12e
commit 1ddda89499
46 changed files with 2185 additions and 751 deletions

View File

@@ -8,6 +8,7 @@ import (
"github.com/gofiber/fiber/v3"
"github.com/sirupsen/logrus"
"github.com/any-hub/any-hub/internal/hubmodule"
"github.com/any-hub/any-hub/internal/logging"
"github.com/any-hub/any-hub/internal/server"
)
@@ -37,39 +38,48 @@ func RegisterModuleHandler(key string, handler server.ProxyHandler) {
// Handle 实现 server.ProxyHandler根据 route.ModuleKey 选择 handler。
func (f *Forwarder) Handle(c fiber.Ctx, route *server.HubRoute) error {
requestID := server.RequestID(c)
handler := f.lookup(route)
if handler == nil {
return f.respondMissingHandler(c, route)
return f.respondMissingHandler(c, route, requestID)
}
return f.invokeHandler(c, route, handler)
return f.invokeHandler(c, route, handler, requestID)
}
func (f *Forwarder) respondMissingHandler(c fiber.Ctx, route *server.HubRoute) error {
f.logModuleError(route, "module_handler_missing", nil)
func (f *Forwarder) respondMissingHandler(c fiber.Ctx, route *server.HubRoute, requestID string) error {
f.logModuleError(route, "module_handler_missing", nil, requestID)
setRequestIDHeader(c, requestID)
return c.Status(fiber.StatusInternalServerError).
JSON(fiber.Map{"error": "module_handler_missing"})
}
func (f *Forwarder) invokeHandler(c fiber.Ctx, route *server.HubRoute, handler server.ProxyHandler) (err error) {
func (f *Forwarder) invokeHandler(c fiber.Ctx, route *server.HubRoute, handler server.ProxyHandler, requestID string) (err error) {
defer func() {
if r := recover(); r != nil {
err = f.respondHandlerPanic(c, route, r)
err = f.respondHandlerPanic(c, route, r, requestID)
}
}()
return handler.Handle(c, route)
}
func (f *Forwarder) respondHandlerPanic(c fiber.Ctx, route *server.HubRoute, recovered interface{}) error {
f.logModuleError(route, "module_handler_panic", fmt.Errorf("panic: %v", recovered))
func (f *Forwarder) respondHandlerPanic(c fiber.Ctx, route *server.HubRoute, recovered interface{}, requestID string) error {
f.logModuleError(route, "module_handler_panic", fmt.Errorf("panic: %v", recovered), requestID)
setRequestIDHeader(c, requestID)
return c.Status(fiber.StatusInternalServerError).
JSON(fiber.Map{"error": "module_handler_panic"})
}
func (f *Forwarder) logModuleError(route *server.HubRoute, code string, err error) {
func setRequestIDHeader(c fiber.Ctx, requestID string) {
if requestID != "" {
c.Set("X-Request-ID", requestID)
}
}
func (f *Forwarder) logModuleError(route *server.HubRoute, code string, err error, requestID string) {
if f.logger == nil {
return
}
fields := f.routeFields(route)
fields := f.routeFields(route, requestID)
fields["action"] = "proxy"
fields["error"] = code
if err != nil {
@@ -105,7 +115,7 @@ func normalizeModuleKey(key string) string {
return strings.ToLower(strings.TrimSpace(key))
}
func (f *Forwarder) routeFields(route *server.HubRoute) logrus.Fields {
func (f *Forwarder) routeFields(route *server.HubRoute, requestID string) logrus.Fields {
if route == nil {
return logrus.Fields{
"hub": "",
@@ -117,7 +127,7 @@ func (f *Forwarder) routeFields(route *server.HubRoute) logrus.Fields {
}
}
return logging.RequestFields(
fields := logging.RequestFields(
route.Config.Name,
route.Config.Domain,
route.Config.Type,
@@ -125,5 +135,10 @@ func (f *Forwarder) routeFields(route *server.HubRoute) logrus.Fields {
route.ModuleKey,
string(route.RolloutFlag),
false,
route.ModuleKey == hubmodule.DefaultModuleKey(),
)
if requestID != "" {
fields["request_id"] = requestID
}
return fields
}