修复 usage 详情 body 引用解包

This commit is contained in:
MMEXA
2026-07-10 00:23:31 +08:00
parent d2ea437c1c
commit f07eb25cfc
4 changed files with 166 additions and 9 deletions
@@ -10461,6 +10461,27 @@ fn prepare_usage_body_storage(value: Option<&Value>) -> Result<UsageBodyStorage,
})
}
fn usage_body_capture_state_for_storage(
incoming_state: Option<UsageBodyCaptureState>,
storage: &UsageBodyStorage,
body_ref: Option<&str>,
) -> Option<UsageBodyCaptureState> {
if matches!(
incoming_state,
Some(
UsageBodyCaptureState::Disabled
| UsageBodyCaptureState::Unavailable
| UsageBodyCaptureState::None
)
) {
return incoming_state;
}
if storage.has_detached_blob() || body_ref.is_some() {
return Some(UsageBodyCaptureState::Reference);
}
incoming_state
}
fn json_bind_text(value: Option<&Value>) -> Result<Option<String>, DataLayerError> {
value
.map(|value| {
@@ -10515,10 +10536,26 @@ fn prepare_usage_upsert_context(
),
};
let http_audit_states = UsageHttpAuditStates {
request_body_state: usage.request_body_state,
provider_request_body_state: usage.provider_request_body_state,
response_body_state: usage.response_body_state,
client_response_body_state: usage.client_response_body_state,
request_body_state: usage_body_capture_state_for_storage(
usage.request_body_state,
&request_body_storage,
http_audit_refs.request_body_ref.as_deref(),
),
provider_request_body_state: usage_body_capture_state_for_storage(
usage.provider_request_body_state,
&provider_request_body_storage,
http_audit_refs.provider_request_body_ref.as_deref(),
),
response_body_state: usage_body_capture_state_for_storage(
usage.response_body_state,
&response_body_storage,
http_audit_refs.response_body_ref.as_deref(),
),
client_response_body_state: usage_body_capture_state_for_storage(
usage.client_response_body_state,
&client_response_body_storage,
http_audit_refs.client_response_body_ref.as_deref(),
),
};
let request_metadata_value = prepare_request_metadata_for_body_storage(
usage.request_metadata.clone(),
@@ -6,15 +6,16 @@ use super::{
attach_usage_routing_snapshot_metadata, attach_usage_settlement_pricing_snapshot_metadata,
inflate_usage_json_value, prepare_request_metadata_for_body_storage,
prepare_usage_body_storage, resolved_read_usage_body_ref, resolved_write_usage_body_ref,
split_dashboard_daily_aggregate_range, split_dashboard_hourly_aggregate_range, usage_body_ref,
usage_http_audit_body_refs, usage_http_audit_capture_mode, usage_routing_snapshot_from_usage,
split_dashboard_daily_aggregate_range, split_dashboard_hourly_aggregate_range,
usage_body_capture_state_for_storage, usage_body_ref, usage_http_audit_body_refs,
usage_http_audit_capture_mode, usage_routing_snapshot_from_usage,
usage_settlement_pricing_snapshot_from_usage, AggregateRangeSplit, SqlxUsageReadRepository,
UsageHttpAuditRefs, UsageRoutingSnapshot, UsageSettlementPricingSnapshot,
MAX_INLINE_USAGE_BODY_BYTES,
};
use crate::driver::postgres::{PostgresPoolConfig, PostgresPoolFactory};
use crate::repository::usage::UpsertUsageRecord;
use aether_data_contracts::repository::usage::UsageBodyField;
use aether_data_contracts::repository::usage::{UsageBodyCaptureState, UsageBodyField};
#[tokio::test]
async fn repository_constructs_from_lazy_pool() {
@@ -1039,6 +1040,45 @@ fn prepare_usage_body_storage_compresses_large_payloads() {
);
}
#[test]
fn usage_body_capture_state_for_storage_marks_detached_bodies_as_reference() {
let payload = json!({"message": "hello"});
let storage = prepare_usage_body_storage(Some(&payload)).expect("storage should serialize");
assert!(storage.has_detached_blob());
assert_eq!(
usage_body_capture_state_for_storage(Some(UsageBodyCaptureState::Inline), &storage, None,),
Some(UsageBodyCaptureState::Reference)
);
assert_eq!(
usage_body_capture_state_for_storage(None, &storage, None),
Some(UsageBodyCaptureState::Reference)
);
}
#[test]
fn usage_body_capture_state_for_storage_preserves_unavailable_states() {
let payload = json!({"message": "hello"});
let storage = prepare_usage_body_storage(Some(&payload)).expect("storage should serialize");
assert_eq!(
usage_body_capture_state_for_storage(
Some(UsageBodyCaptureState::Disabled),
&storage,
Some("usage://request/req-1/request_body"),
),
Some(UsageBodyCaptureState::Disabled)
);
assert_eq!(
usage_body_capture_state_for_storage(
Some(UsageBodyCaptureState::Unavailable),
&storage,
Some("usage://request/req-1/request_body"),
),
Some(UsageBodyCaptureState::Unavailable)
);
}
#[test]
fn prepare_request_metadata_for_body_storage_strips_body_ref_compatibility_keys() {
let detached = prepare_usage_body_storage(Some(&json!({