mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 01:10:23 +08:00
feat(data): 废弃 usage 表 HTTP/结算列,迁移至 settlement_snapshots 与 http_audits
- 新增迁移 20260413030000:标记 billing_status、finalized_at、request_headers 等列为 DEPRECATED - 更新 baseline_v2.sql 同步废弃注释,BASELINE_V2_CUTOFF_VERSION 升至 20260413030000 - usage/sql.rs:inline body 阈值归零,强制所有 body 走 blob 存储;upsert 时清空 legacy header/output_price 列 - 查询层优先读 usage_settlement_snapshots 的 billing_status、finalized_at、output_price_per_1m - runtime.rs:stale usage 处理同步写入 usage_settlement_snapshots;SELECT FOR UPDATE 改为 FOR UPDATE OF usage - 前端:PerformanceAnalysis 页面重构为实时面板,新增 prometheus 工具函数与 monitoring API
This commit is contained in:
@@ -184,16 +184,18 @@ WHERE ledgers.billing_date = $1
|
||||
"#;
|
||||
const SELECT_STALE_PENDING_USAGE_BATCH_SQL: &str = r#"
|
||||
SELECT
|
||||
id,
|
||||
request_id,
|
||||
status,
|
||||
billing_status
|
||||
usage.id,
|
||||
usage.request_id,
|
||||
usage.status,
|
||||
COALESCE(usage_settlement_snapshots.billing_status, usage.billing_status) AS billing_status
|
||||
FROM usage
|
||||
WHERE status = ANY($1)
|
||||
AND created_at < $2
|
||||
ORDER BY created_at ASC, id ASC
|
||||
LEFT JOIN usage_settlement_snapshots
|
||||
ON usage_settlement_snapshots.request_id = usage.request_id
|
||||
WHERE usage.status = ANY($1)
|
||||
AND usage.created_at < $2
|
||||
ORDER BY usage.created_at ASC, usage.id ASC
|
||||
LIMIT $3
|
||||
FOR UPDATE SKIP LOCKED
|
||||
FOR UPDATE OF usage SKIP LOCKED
|
||||
"#;
|
||||
const SELECT_COMPLETED_PENDING_REQUEST_IDS_SQL: &str = r#"
|
||||
SELECT DISTINCT request_id
|
||||
@@ -222,17 +224,35 @@ SET status = 'failed',
|
||||
WHERE id = $1
|
||||
"#;
|
||||
const UPDATE_FAILED_VOID_STALE_USAGE_SQL: &str = r#"
|
||||
UPDATE usage
|
||||
SET status = 'failed',
|
||||
status_code = 504,
|
||||
error_message = $2,
|
||||
billing_status = 'void',
|
||||
finalized_at = $3,
|
||||
total_cost_usd = 0,
|
||||
request_cost_usd = 0,
|
||||
actual_total_cost_usd = 0,
|
||||
actual_request_cost_usd = 0
|
||||
WHERE id = $1
|
||||
WITH updated_usage AS (
|
||||
UPDATE usage
|
||||
SET status = 'failed',
|
||||
status_code = 504,
|
||||
error_message = $2,
|
||||
billing_status = 'void',
|
||||
finalized_at = $3,
|
||||
total_cost_usd = 0,
|
||||
request_cost_usd = 0,
|
||||
actual_total_cost_usd = 0,
|
||||
actual_request_cost_usd = 0
|
||||
WHERE id = $1
|
||||
RETURNING request_id
|
||||
)
|
||||
INSERT INTO usage_settlement_snapshots (
|
||||
request_id,
|
||||
billing_status,
|
||||
finalized_at
|
||||
)
|
||||
SELECT request_id, 'void', $3
|
||||
FROM updated_usage
|
||||
ON CONFLICT (request_id)
|
||||
DO UPDATE SET
|
||||
billing_status = EXCLUDED.billing_status,
|
||||
finalized_at = COALESCE(
|
||||
usage_settlement_snapshots.finalized_at,
|
||||
EXCLUDED.finalized_at
|
||||
),
|
||||
updated_at = NOW()
|
||||
"#;
|
||||
const UPDATE_RECOVERED_STREAMING_CANDIDATES_SQL: &str = r#"
|
||||
UPDATE request_candidates
|
||||
|
||||
@@ -29,7 +29,8 @@ use super::{
|
||||
usage_cleanup_window, wallet_daily_usage_aggregation_target, AppState, DbMaintenanceRunSummary,
|
||||
FailedPendingUsageRow, GatewayDataState, ProxyUpgradeRolloutProbeConfig, StalePendingUsageRow,
|
||||
UsageCleanupSettings, DELETE_STALE_WALLET_DAILY_USAGE_LEDGERS_SQL,
|
||||
SELECT_WALLET_DAILY_USAGE_AGGREGATION_ROWS_SQL, USAGE_CLEANUP_HOUR, USAGE_CLEANUP_MINUTE,
|
||||
SELECT_STALE_PENDING_USAGE_BATCH_SQL, SELECT_WALLET_DAILY_USAGE_AGGREGATION_ROWS_SQL,
|
||||
UPDATE_FAILED_VOID_STALE_USAGE_SQL, USAGE_CLEANUP_HOUR, USAGE_CLEANUP_MINUTE,
|
||||
WALLET_DAILY_USAGE_AGGREGATION_HOUR, WALLET_DAILY_USAGE_AGGREGATION_MINUTE,
|
||||
};
|
||||
|
||||
@@ -90,6 +91,15 @@ fn wallet_daily_usage_queries_use_settlement_snapshots_for_wallet_identity() {
|
||||
.contains("usage_settlement_snapshots.wallet_id = ledgers.wallet_id"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pending_cleanup_queries_use_settlement_snapshots_for_billing_authority() {
|
||||
assert!(SELECT_STALE_PENDING_USAGE_BATCH_SQL.contains("LEFT JOIN usage_settlement_snapshots"));
|
||||
assert!(SELECT_STALE_PENDING_USAGE_BATCH_SQL
|
||||
.contains("COALESCE(usage_settlement_snapshots.billing_status, usage.billing_status)"));
|
||||
assert!(UPDATE_FAILED_VOID_STALE_USAGE_SQL.contains("INSERT INTO usage_settlement_snapshots"));
|
||||
assert!(UPDATE_FAILED_VOID_STALE_USAGE_SQL.contains("billing_status = EXCLUDED.billing_status"));
|
||||
}
|
||||
|
||||
fn sample_connected_proxy_node(
|
||||
node_id: &str,
|
||||
heartbeat_interval: i32,
|
||||
|
||||
Reference in New Issue
Block a user