use crate::observatory::view::Observation;
use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum CostSampleState {
Disabled,
Unavailable,
Fresh,
Stale,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum CostMetricKind {
Gauge,
Counter { window_id: u64, saturated: bool },
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct CostMetricView {
pub name: String,
#[serde(deserialize_with = "Option::deserialize")]
pub canister_id: Option<String>,
pub value: String,
pub unit: String,
pub observed_at_ns: u64,
pub measurement: CostMetricKind,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct CostSamplesView {
pub state: CostSampleState,
#[serde(deserialize_with = "Option::deserialize")]
pub sampled_at_ns: Option<u64>,
pub stale_after_ns: u64,
pub truncated: bool,
pub rows: Vec<CostMetricView>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct CostWindowView {
pub canister_version: u64,
#[serde(deserialize_with = "Option::deserialize")]
pub heap_started_at_ns: Option<u64>,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum CostEvidenceLimitation {
SingleSnapshot,
SourceWindowChanged,
SourceWindowUnavailable,
TimerRegistrationResetUnobservable,
TransferCoverageIncomplete,
UnattributedExecutionMessageStorage,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct RoleCostEvidenceView {
pub balance: Observation<CostSamplesView>,
pub funding_and_callbacks: Observation<CostSamplesView>,
pub timer_instructions: Observation<CostSamplesView>,
pub window: Observation<CostWindowView>,
pub limitations: Vec<CostEvidenceLimitation>,
}