Commit d10fc762 by feitianbubu Committed by GitHub

fix(task): attribute async task usage log to the initiating node (#5684)

Async task usage logs (LogQuotaData node dimension) were recorded
under whichever node happened to poll the task to completion, not the
node that submitted it. For token/adaptor-billed video tasks the
pre-deduction is often 0, so the entire quota landed on the last
polling node.

Snapshot common.NodeName into TaskPrivateData at submit time and use
it when writing the settlement consume log; fall back to the current
node when empty so existing tasks stay compatible.
parent c0e42bfb
...@@ -583,6 +583,7 @@ func RelayTask(c *gin.Context) { ...@@ -583,6 +583,7 @@ func RelayTask(c *gin.Context) {
task.PrivateData.BillingSource = relayInfo.BillingSource task.PrivateData.BillingSource = relayInfo.BillingSource
task.PrivateData.SubscriptionId = relayInfo.SubscriptionId task.PrivateData.SubscriptionId = relayInfo.SubscriptionId
task.PrivateData.TokenId = relayInfo.TokenId task.PrivateData.TokenId = relayInfo.TokenId
task.PrivateData.NodeName = common.NodeName
task.PrivateData.BillingContext = &model.TaskBillingContext{ task.PrivateData.BillingContext = &model.TaskBillingContext{
ModelPrice: relayInfo.PriceData.ModelPrice, ModelPrice: relayInfo.PriceData.ModelPrice,
GroupRatio: relayInfo.PriceData.GroupRatioInfo.GroupRatio, GroupRatio: relayInfo.PriceData.GroupRatioInfo.GroupRatio,
......
...@@ -390,6 +390,7 @@ type RecordTaskBillingLogParams struct { ...@@ -390,6 +390,7 @@ type RecordTaskBillingLogParams struct {
TokenId int TokenId int
Group string Group string
Other map[string]interface{} Other map[string]interface{}
NodeName string // 任务发起节点;为空时回退当前节点
} }
func RecordTaskBillingLog(params RecordTaskBillingLogParams) { func RecordTaskBillingLog(params RecordTaskBillingLogParams) {
...@@ -423,6 +424,10 @@ func RecordTaskBillingLog(params RecordTaskBillingLogParams) { ...@@ -423,6 +424,10 @@ func RecordTaskBillingLog(params RecordTaskBillingLogParams) {
common.SysLog("failed to record task billing log: " + err.Error()) common.SysLog("failed to record task billing log: " + err.Error())
} }
if params.LogType == LogTypeConsume && common.DataExportEnabled { if params.LogType == LogTypeConsume && common.DataExportEnabled {
nodeName := params.NodeName
if nodeName == "" {
nodeName = common.NodeName
}
gopool.Go(func() { gopool.Go(func() {
LogQuotaData(QuotaDataLogParams{ LogQuotaData(QuotaDataLogParams{
UserID: params.UserId, UserID: params.UserId,
...@@ -433,7 +438,7 @@ func RecordTaskBillingLog(params RecordTaskBillingLogParams) { ...@@ -433,7 +438,7 @@ func RecordTaskBillingLog(params RecordTaskBillingLogParams) {
UseGroup: params.Group, UseGroup: params.Group,
TokenID: params.TokenId, TokenID: params.TokenId,
ChannelID: params.ChannelId, ChannelID: params.ChannelId,
NodeName: common.NodeName, NodeName: nodeName,
}) })
}) })
} }
......
...@@ -104,6 +104,7 @@ type TaskPrivateData struct { ...@@ -104,6 +104,7 @@ type TaskPrivateData struct {
BillingSource string `json:"billing_source,omitempty"` // "wallet" 或 "subscription" BillingSource string `json:"billing_source,omitempty"` // "wallet" 或 "subscription"
SubscriptionId int `json:"subscription_id,omitempty"` // 订阅 ID,用于订阅退款 SubscriptionId int `json:"subscription_id,omitempty"` // 订阅 ID,用于订阅退款
TokenId int `json:"token_id,omitempty"` // 令牌 ID,用于令牌额度退款 TokenId int `json:"token_id,omitempty"` // 令牌 ID,用于令牌额度退款
NodeName string `json:"node_name,omitempty"` // 发起任务的节点名,轮询结算阶段据此归属日志而非最后查询节点
BillingContext *TaskBillingContext `json:"billing_context,omitempty"` // 计费参数快照(用于轮询阶段重新计算) BillingContext *TaskBillingContext `json:"billing_context,omitempty"` // 计费参数快照(用于轮询阶段重新计算)
} }
......
...@@ -241,6 +241,7 @@ func RecalculateTaskQuota(ctx context.Context, task *model.Task, actualQuota int ...@@ -241,6 +241,7 @@ func RecalculateTaskQuota(ctx context.Context, task *model.Task, actualQuota int
TokenId: task.PrivateData.TokenId, TokenId: task.PrivateData.TokenId,
Group: task.Group, Group: task.Group,
Other: other, Other: other,
NodeName: task.PrivateData.NodeName,
}) })
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment