Skip to content

Commit db9021f

Browse files
committed
feat(ops): propagate endpoint/request-type context in handlers; add UpstreamURL to upstream error events
1 parent a2418c6 commit db9021f

7 files changed

Lines changed: 23 additions & 0 deletions

File tree

backend/internal/handler/gateway_handler.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ func (h *GatewayHandler) Messages(c *gin.Context) {
178178
c.Request = c.Request.WithContext(service.WithThinkingEnabled(c.Request.Context(), parsedReq.ThinkingEnabled, h.metadataBridgeEnabled()))
179179

180180
setOpsRequestContext(c, reqModel, reqStream, body)
181+
setOpsEndpointContext(c, "", int16(service.RequestTypeFromLegacy(reqStream, false)))
181182

182183
// 验证 model 必填
183184
if reqModel == "" {
@@ -1396,6 +1397,7 @@ func (h *GatewayHandler) CountTokens(c *gin.Context) {
13961397
}
13971398

13981399
setOpsRequestContext(c, parsedReq.Model, parsedReq.Stream, body)
1400+
setOpsEndpointContext(c, "", int16(service.RequestTypeFromLegacy(parsedReq.Stream, false)))
13991401

14001402
// 获取订阅信息(可能为nil)
14011403
subscription, _ := middleware2.GetSubscriptionFromContext(c)

backend/internal/handler/gemini_v1beta_handler.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ func (h *GatewayHandler) GeminiV1BetaModels(c *gin.Context) {
182182
}
183183

184184
setOpsRequestContext(c, modelName, stream, body)
185+
setOpsEndpointContext(c, "", int16(service.RequestTypeFromLegacy(stream, false)))
185186

186187
// Get subscription (may be nil)
187188
subscription, _ := middleware.GetSubscriptionFromContext(c)

backend/internal/handler/openai_chat_completions.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ func (h *OpenAIGatewayHandler) ChatCompletions(c *gin.Context) {
7777
reqLog = reqLog.With(zap.String("model", reqModel), zap.Bool("stream", reqStream))
7878

7979
setOpsRequestContext(c, reqModel, reqStream, body)
80+
setOpsEndpointContext(c, "", int16(service.RequestTypeFromLegacy(reqStream, false)))
8081

8182
if h.errorPassthroughService != nil {
8283
service.BindErrorPassthroughService(c, h.errorPassthroughService)

backend/internal/handler/openai_gateway_handler.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ func (h *OpenAIGatewayHandler) Responses(c *gin.Context) {
183183
}
184184

185185
setOpsRequestContext(c, reqModel, reqStream, body)
186+
setOpsEndpointContext(c, "", int16(service.RequestTypeFromLegacy(reqStream, false)))
186187

187188
// 提前校验 function_call_output 是否具备可关联上下文,避免上游 400。
188189
if !h.validateFunctionCallOutputRequest(c, body, reqLog) {
@@ -545,6 +546,7 @@ func (h *OpenAIGatewayHandler) Messages(c *gin.Context) {
545546
reqLog = reqLog.With(zap.String("model", reqModel), zap.Bool("stream", reqStream))
546547

547548
setOpsRequestContext(c, reqModel, reqStream, body)
549+
setOpsEndpointContext(c, "", int16(service.RequestTypeFromLegacy(reqStream, false)))
548550

549551
// 绑定错误透传服务,允许 service 层在非 failover 错误场景复用规则。
550552
if h.errorPassthroughService != nil {
@@ -1096,6 +1098,7 @@ func (h *OpenAIGatewayHandler) ResponsesWebSocket(c *gin.Context) {
10961098
zap.String("previous_response_id_kind", previousResponseIDKind),
10971099
)
10981100
setOpsRequestContext(c, reqModel, true, firstMessage)
1101+
setOpsEndpointContext(c, "", int16(service.RequestTypeWSV2))
10991102

11001103
var currentUserRelease func()
11011104
var currentAccountRelease func()

backend/internal/handler/sora_gateway_handler.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ func (h *SoraGatewayHandler) ChatCompletions(c *gin.Context) {
159159
}
160160

161161
setOpsRequestContext(c, reqModel, clientStream, body)
162+
setOpsEndpointContext(c, "", int16(service.RequestTypeFromLegacy(clientStream, false)))
162163

163164
platform := ""
164165
if forced, ok := middleware2.GetForcePlatformFromContext(c); ok {

backend/internal/service/antigravity_gateway_service.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,7 @@ urlFallbackLoop:
643643
AccountID: p.account.ID,
644644
AccountName: p.account.Name,
645645
UpstreamStatusCode: 0,
646+
UpstreamURL: safeUpstreamURL(upstreamReq.URL.String()),
646647
Kind: "request_error",
647648
Message: safeErr,
648649
})
@@ -720,6 +721,7 @@ urlFallbackLoop:
720721
AccountName: p.account.Name,
721722
UpstreamStatusCode: resp.StatusCode,
722723
UpstreamRequestID: resp.Header.Get("x-request-id"),
724+
UpstreamURL: safeUpstreamURL(upstreamReq.URL.String()),
723725
Kind: "retry",
724726
Message: upstreamMsg,
725727
Detail: getUpstreamDetail(respBody),
@@ -754,6 +756,7 @@ urlFallbackLoop:
754756
AccountName: p.account.Name,
755757
UpstreamStatusCode: resp.StatusCode,
756758
UpstreamRequestID: resp.Header.Get("x-request-id"),
759+
UpstreamURL: safeUpstreamURL(upstreamReq.URL.String()),
757760
Kind: "retry",
758761
Message: upstreamMsg,
759762
Detail: getUpstreamDetail(respBody),

backend/internal/service/gateway_service.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4148,6 +4148,7 @@ func (s *GatewayService) Forward(ctx context.Context, c *gin.Context, account *A
41484148
AccountID: account.ID,
41494149
AccountName: account.Name,
41504150
UpstreamStatusCode: 0,
4151+
UpstreamURL: safeUpstreamURL(upstreamReq.URL.String()),
41514152
Kind: "request_error",
41524153
Message: safeErr,
41534154
})
@@ -4174,6 +4175,7 @@ func (s *GatewayService) Forward(ctx context.Context, c *gin.Context, account *A
41744175
AccountName: account.Name,
41754176
UpstreamStatusCode: resp.StatusCode,
41764177
UpstreamRequestID: resp.Header.Get("x-request-id"),
4178+
UpstreamURL: safeUpstreamURL(upstreamReq.URL.String()),
41774179
Kind: "signature_error",
41784180
Message: extractUpstreamErrorMessage(respBody),
41794181
Detail: func() string {
@@ -4228,6 +4230,7 @@ func (s *GatewayService) Forward(ctx context.Context, c *gin.Context, account *A
42284230
AccountName: account.Name,
42294231
UpstreamStatusCode: retryResp.StatusCode,
42304232
UpstreamRequestID: retryResp.Header.Get("x-request-id"),
4233+
UpstreamURL: safeUpstreamURL(retryReq.URL.String()),
42314234
Kind: "signature_retry_thinking",
42324235
Message: extractUpstreamErrorMessage(retryRespBody),
42334236
Detail: func() string {
@@ -4258,6 +4261,7 @@ func (s *GatewayService) Forward(ctx context.Context, c *gin.Context, account *A
42584261
AccountID: account.ID,
42594262
AccountName: account.Name,
42604263
UpstreamStatusCode: 0,
4264+
UpstreamURL: safeUpstreamURL(retryReq2.URL.String()),
42614265
Kind: "signature_retry_tools_request_error",
42624266
Message: sanitizeUpstreamErrorMessage(retryErr2.Error()),
42634267
})
@@ -4297,6 +4301,7 @@ func (s *GatewayService) Forward(ctx context.Context, c *gin.Context, account *A
42974301
AccountName: account.Name,
42984302
UpstreamStatusCode: resp.StatusCode,
42994303
UpstreamRequestID: resp.Header.Get("x-request-id"),
4304+
UpstreamURL: safeUpstreamURL(upstreamReq.URL.String()),
43004305
Kind: "budget_constraint_error",
43014306
Message: errMsg,
43024307
Detail: func() string {
@@ -4358,6 +4363,7 @@ func (s *GatewayService) Forward(ctx context.Context, c *gin.Context, account *A
43584363
AccountName: account.Name,
43594364
UpstreamStatusCode: resp.StatusCode,
43604365
UpstreamRequestID: resp.Header.Get("x-request-id"),
4366+
UpstreamURL: safeUpstreamURL(upstreamReq.URL.String()),
43614367
Kind: "retry",
43624368
Message: extractUpstreamErrorMessage(respBody),
43634369
Detail: func() string {
@@ -4628,6 +4634,7 @@ func (s *GatewayService) forwardAnthropicAPIKeyPassthroughWithInput(
46284634
AccountID: account.ID,
46294635
AccountName: account.Name,
46304636
UpstreamStatusCode: 0,
4637+
UpstreamURL: safeUpstreamURL(upstreamReq.URL.String()),
46314638
Passthrough: true,
46324639
Kind: "request_error",
46334640
Message: safeErr,
@@ -4667,6 +4674,7 @@ func (s *GatewayService) forwardAnthropicAPIKeyPassthroughWithInput(
46674674
AccountName: account.Name,
46684675
UpstreamStatusCode: resp.StatusCode,
46694676
UpstreamRequestID: resp.Header.Get("x-request-id"),
4677+
UpstreamURL: safeUpstreamURL(upstreamReq.URL.String()),
46704678
Passthrough: true,
46714679
Kind: "retry",
46724680
Message: extractUpstreamErrorMessage(respBody),
@@ -5344,6 +5352,7 @@ func (s *GatewayService) executeBedrockUpstream(
53445352
AccountID: account.ID,
53455353
AccountName: account.Name,
53465354
UpstreamStatusCode: 0,
5355+
UpstreamURL: safeUpstreamURL(upstreamReq.URL.String()),
53475356
Kind: "request_error",
53485357
Message: safeErr,
53495358
})
@@ -5380,6 +5389,7 @@ func (s *GatewayService) executeBedrockUpstream(
53805389
AccountID: account.ID,
53815390
AccountName: account.Name,
53825391
UpstreamStatusCode: resp.StatusCode,
5392+
UpstreamURL: safeUpstreamURL(upstreamReq.URL.String()),
53835393
Kind: "retry",
53845394
Message: extractUpstreamErrorMessage(respBody),
53855395
Detail: func() string {
@@ -8064,6 +8074,7 @@ func (s *GatewayService) forwardCountTokensAnthropicAPIKeyPassthrough(ctx contex
80648074
AccountID: account.ID,
80658075
AccountName: account.Name,
80668076
UpstreamStatusCode: 0,
8077+
UpstreamURL: safeUpstreamURL(upstreamReq.URL.String()),
80678078
Passthrough: true,
80688079
Kind: "request_error",
80698080
Message: sanitizeUpstreamErrorMessage(err.Error()),
@@ -8119,6 +8130,7 @@ func (s *GatewayService) forwardCountTokensAnthropicAPIKeyPassthrough(ctx contex
81198130
AccountName: account.Name,
81208131
UpstreamStatusCode: resp.StatusCode,
81218132
UpstreamRequestID: resp.Header.Get("x-request-id"),
8133+
UpstreamURL: safeUpstreamURL(upstreamReq.URL.String()),
81228134
Passthrough: true,
81238135
Kind: "http_error",
81248136
Message: upstreamMsg,

0 commit comments

Comments
 (0)