Skip to main content

Shadow

Struct Shadow 

Source
pub struct Shadow {
    pub sample_rate: f64,
    pub max_usd_per_day: f64,
}
Expand description

Shadow scoring settings for a route (ADR 0009 D2).

Observe mode records what traffic looked like; it never runs the ladder, so it cannot answer the one question it exists for — what would Firstpass have served, and what would it have cost? Shadow answers that by scoring a sample of observed requests off the hot path.

It makes real model calls, so there is deliberately no default-on sample rate and a hard daily ceiling is required. A measurement that quietly runs up a bill is worse than no measurement.

Fields§

§sample_rate: f64

Fraction of observed requests scored counterfactually, in [0, 1].

§max_usd_per_day: f64

Hard ceiling on shadow spend per UTC day, in USD. Shadow stops when exhausted, and the fact that it stopped is recorded — silently degrading a measurement is its own bug.

Implementations§

Source§

impl Shadow

Source

pub fn validate(&self) -> Result<(), String>

Whether this shadow config is coherent.

§Errors

If sample_rate is outside [0, 1] or max_usd_per_day is negative or non-finite.

Source

pub fn sampled(&self, salt: &str, key_value: &str) -> bool

Whether this request is in the shadow sample.

Uses the same salted bucketing as rollout, under its own domain tag, so shadow sampling is deterministic and — critically — independent of the rollout arm. If the two shared a hash, the shadow sample would be a biased subset of one arm and the projection it produces would not describe the traffic an operator is about to enforce on.

Trait Implementations§

Source§

impl Clone for Shadow

Source§

fn clone(&self) -> Shadow

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for Shadow

Source§

impl Debug for Shadow

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Shadow

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl PartialEq for Shadow

Source§

fn eq(&self, other: &Shadow) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for Shadow

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.