Update public backend API surface
Private source commit: ba3f7ce2b6d9
This commit is contained in:
parent
784463622c
commit
26fdcb9d84
34 changed files with 5473 additions and 72 deletions
|
|
@ -65,6 +65,16 @@ pub struct ArtifactRelayUsage {
|
|||
pub egress_bytes: u64,
|
||||
pub abandoned_or_failed_bytes: u64,
|
||||
pub reserved_bytes: u64,
|
||||
pub lifetime_ingress_bytes: u64,
|
||||
pub lifetime_egress_bytes: u64,
|
||||
pub lifetime_abandoned_or_failed_bytes: u64,
|
||||
pub completed_transfers: u64,
|
||||
pub failed_transfers: u64,
|
||||
pub cancelled_transfers: u64,
|
||||
pub expired_transfers: u64,
|
||||
pub tracked_scopes: usize,
|
||||
pub max_active_global: usize,
|
||||
pub max_tracked_scopes: usize,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
|
||||
|
|
@ -77,6 +87,20 @@ pub struct ArtifactRelayDurableState {
|
|||
pub ingress_used: u64,
|
||||
pub egress_used: u64,
|
||||
pub abandoned_or_failed_used: u64,
|
||||
#[serde(default)]
|
||||
pub lifetime_ingress_bytes: u64,
|
||||
#[serde(default)]
|
||||
pub lifetime_egress_bytes: u64,
|
||||
#[serde(default)]
|
||||
pub lifetime_abandoned_or_failed_bytes: u64,
|
||||
#[serde(default)]
|
||||
pub completed_transfers: u64,
|
||||
#[serde(default)]
|
||||
pub failed_transfers: u64,
|
||||
#[serde(default)]
|
||||
pub cancelled_transfers: u64,
|
||||
#[serde(default)]
|
||||
pub expired_transfers: u64,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
||||
|
|
@ -145,6 +169,13 @@ pub(super) struct ArtifactRelayLedger {
|
|||
ingress_used: u64,
|
||||
egress_used: u64,
|
||||
abandoned_or_failed_used: u64,
|
||||
lifetime_ingress_bytes: u64,
|
||||
lifetime_egress_bytes: u64,
|
||||
lifetime_abandoned_or_failed_bytes: u64,
|
||||
completed_transfers: u64,
|
||||
failed_transfers: u64,
|
||||
cancelled_transfers: u64,
|
||||
expired_transfers: u64,
|
||||
}
|
||||
|
||||
impl Default for ArtifactRelayLedger {
|
||||
|
|
@ -165,6 +196,13 @@ impl ArtifactRelayLedger {
|
|||
ingress_used: 0,
|
||||
egress_used: 0,
|
||||
abandoned_or_failed_used: 0,
|
||||
lifetime_ingress_bytes: 0,
|
||||
lifetime_egress_bytes: 0,
|
||||
lifetime_abandoned_or_failed_bytes: 0,
|
||||
completed_transfers: 0,
|
||||
failed_transfers: 0,
|
||||
cancelled_transfers: 0,
|
||||
expired_transfers: 0,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -218,6 +256,13 @@ impl ArtifactRelayLedger {
|
|||
ingress_used: state.ingress_used,
|
||||
egress_used: state.egress_used,
|
||||
abandoned_or_failed_used: state.abandoned_or_failed_used,
|
||||
lifetime_ingress_bytes: state.lifetime_ingress_bytes,
|
||||
lifetime_egress_bytes: state.lifetime_egress_bytes,
|
||||
lifetime_abandoned_or_failed_bytes: state.lifetime_abandoned_or_failed_bytes,
|
||||
completed_transfers: state.completed_transfers,
|
||||
failed_transfers: state.failed_transfers,
|
||||
cancelled_transfers: state.cancelled_transfers,
|
||||
expired_transfers: state.expired_transfers,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -260,6 +305,13 @@ impl ArtifactRelayLedger {
|
|||
ingress_used: self.ingress_used,
|
||||
egress_used: self.egress_used,
|
||||
abandoned_or_failed_used: self.abandoned_or_failed_used,
|
||||
lifetime_ingress_bytes: self.lifetime_ingress_bytes,
|
||||
lifetime_egress_bytes: self.lifetime_egress_bytes,
|
||||
lifetime_abandoned_or_failed_bytes: self.lifetime_abandoned_or_failed_bytes,
|
||||
completed_transfers: self.completed_transfers,
|
||||
failed_transfers: self.failed_transfers,
|
||||
cancelled_transfers: self.cancelled_transfers,
|
||||
expired_transfers: self.expired_transfers,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -491,9 +543,11 @@ impl ArtifactRelayLedger {
|
|||
if ingress {
|
||||
reservation.ingress_bytes = reservation.ingress_bytes.saturating_add(bytes);
|
||||
self.ingress_used = self.ingress_used.saturating_add(bytes);
|
||||
self.lifetime_ingress_bytes = self.lifetime_ingress_bytes.saturating_add(bytes);
|
||||
} else {
|
||||
reservation.egress_bytes = reservation.egress_bytes.saturating_add(bytes);
|
||||
self.egress_used = self.egress_used.saturating_add(bytes);
|
||||
self.lifetime_egress_bytes = self.lifetime_egress_bytes.saturating_add(bytes);
|
||||
}
|
||||
let project_key = (
|
||||
reservation.scope.tenant.clone(),
|
||||
|
|
@ -554,10 +608,29 @@ impl ArtifactRelayLedger {
|
|||
pub(super) fn finish(&mut self, key: &str, reason: RelayFinishReason) {
|
||||
if let Some(reservation) = self.reservations.remove(key) {
|
||||
if reason != RelayFinishReason::Completed {
|
||||
let abandoned_or_failed_bytes = reservation
|
||||
.ingress_bytes
|
||||
.saturating_add(reservation.egress_bytes);
|
||||
self.abandoned_or_failed_used = self
|
||||
.abandoned_or_failed_used
|
||||
.saturating_add(reservation.ingress_bytes)
|
||||
.saturating_add(reservation.egress_bytes);
|
||||
.saturating_add(abandoned_or_failed_bytes);
|
||||
self.lifetime_abandoned_or_failed_bytes = self
|
||||
.lifetime_abandoned_or_failed_bytes
|
||||
.saturating_add(abandoned_or_failed_bytes);
|
||||
}
|
||||
match reason {
|
||||
RelayFinishReason::Completed => {
|
||||
self.completed_transfers = self.completed_transfers.saturating_add(1);
|
||||
}
|
||||
RelayFinishReason::Failed => {
|
||||
self.failed_transfers = self.failed_transfers.saturating_add(1);
|
||||
}
|
||||
RelayFinishReason::Cancelled => {
|
||||
self.cancelled_transfers = self.cancelled_transfers.saturating_add(1);
|
||||
}
|
||||
RelayFinishReason::Expired => {
|
||||
self.expired_transfers = self.expired_transfers.saturating_add(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -580,6 +653,18 @@ impl ArtifactRelayLedger {
|
|||
ingress_bytes: self.ingress_used,
|
||||
egress_bytes: self.egress_used,
|
||||
abandoned_or_failed_bytes: self.abandoned_or_failed_used,
|
||||
lifetime_ingress_bytes: self.lifetime_ingress_bytes,
|
||||
lifetime_egress_bytes: self.lifetime_egress_bytes,
|
||||
lifetime_abandoned_or_failed_bytes: self.lifetime_abandoned_or_failed_bytes,
|
||||
completed_transfers: self.completed_transfers,
|
||||
failed_transfers: self.failed_transfers,
|
||||
cancelled_transfers: self.cancelled_transfers,
|
||||
expired_transfers: self.expired_transfers,
|
||||
tracked_scopes: self.project_used.len()
|
||||
+ self.tenant_used.len()
|
||||
+ self.account_used.len(),
|
||||
max_active_global: self.configuration.max_active_global,
|
||||
max_tracked_scopes: self.configuration.max_tracked_scopes,
|
||||
reserved_bytes: self
|
||||
.reservations
|
||||
.values()
|
||||
|
|
@ -588,3 +673,68 @@ impl ArtifactRelayLedger {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn lifetime_metrics_survive_period_rollover_and_durable_round_trip() {
|
||||
let mut ledger = ArtifactRelayLedger::new(ArtifactRelayConfiguration::unlimited());
|
||||
ledger
|
||||
.reserve(
|
||||
"transfer".to_owned(),
|
||||
TenantId::from("tenant"),
|
||||
ProjectId::from("project"),
|
||||
UserId::from("user"),
|
||||
16,
|
||||
16,
|
||||
100,
|
||||
1,
|
||||
)
|
||||
.unwrap();
|
||||
ledger.charge_ingress("transfer", 24, 1).unwrap();
|
||||
ledger.charge_egress("transfer", 24, 1).unwrap();
|
||||
ledger.finish("transfer", RelayFinishReason::Completed);
|
||||
|
||||
let usage = ledger.usage();
|
||||
assert_eq!(usage.lifetime_ingress_bytes, 24);
|
||||
assert_eq!(usage.lifetime_egress_bytes, 24);
|
||||
assert_eq!(usage.completed_transfers, 1);
|
||||
|
||||
ledger.prepare_period(u64::MAX);
|
||||
let usage = ledger.usage();
|
||||
assert_eq!(usage.ingress_bytes, 0);
|
||||
assert_eq!(usage.egress_bytes, 0);
|
||||
assert_eq!(usage.lifetime_ingress_bytes, 24);
|
||||
assert_eq!(usage.lifetime_egress_bytes, 24);
|
||||
|
||||
let restored = ArtifactRelayLedger::from_durable(
|
||||
ArtifactRelayConfiguration::unlimited(),
|
||||
ledger.durable_state(),
|
||||
);
|
||||
let usage = restored.usage();
|
||||
assert_eq!(usage.lifetime_ingress_bytes, 24);
|
||||
assert_eq!(usage.lifetime_egress_bytes, 24);
|
||||
assert_eq!(usage.completed_transfers, 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn older_durable_relay_state_defaults_new_metrics() {
|
||||
let state: ArtifactRelayDurableState = serde_json::from_value(serde_json::json!({
|
||||
"reservations": {},
|
||||
"period": 1,
|
||||
"project_used": [],
|
||||
"tenant_used": [],
|
||||
"account_used": [],
|
||||
"ingress_used": 3,
|
||||
"egress_used": 4,
|
||||
"abandoned_or_failed_used": 2
|
||||
}))
|
||||
.unwrap();
|
||||
|
||||
assert_eq!(state.lifetime_ingress_bytes, 0);
|
||||
assert_eq!(state.lifetime_egress_bytes, 0);
|
||||
assert_eq!(state.completed_transfers, 0);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue