pub struct ServiceSplit {
pub targets: Vec<SplitTarget>,
pub canary_analysis: Option<CanaryAnalysis>,
}Expand description
Weighted traffic split across upstreams (DW-040,
services[].split): canary releases and blue-green switches at the
SERVICE level — each target is a full upstream (its own endpoints,
protocol, health, and balancer), so a canary pool is isolated from
the stable one by construction. The pick is a deterministic
weighted hash (see Service::split): ratios hold statistically
per request and exactly per session when sticky affinity is on.
Fields§
§targets: Vec<SplitTarget>The weighted targets. Validation enforces 2..=8 entries (one
target is what services[].upstream expresses), existing
upstream names, no duplicates, and a positive total weight (a
total of 0 would route nowhere; individual zeros are the
parked side of a blue-green pair).
canary_analysis: Option<CanaryAnalysis>Auto-canary analysis (DW-091): when set, a background controller compares the canary (second target) vs the baseline (first target) on error rate or latency and adjusts the split weights automatically. Only valid when the split has exactly 2 targets (baseline + canary). Weight changes are transient (Generation swap) and revert on config reload.
Trait Implementations§
Source§impl Clone for ServiceSplit
impl Clone for ServiceSplit
Source§fn clone(&self) -> ServiceSplit
fn clone(&self) -> ServiceSplit
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ServiceSplit
impl Debug for ServiceSplit
Source§impl<'de> Deserialize<'de> for ServiceSplit
impl<'de> Deserialize<'de> for ServiceSplit
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl JsonSchema for ServiceSplit
impl JsonSchema for ServiceSplit
Source§fn schema_id() -> Cow<'static, str>
fn schema_id() -> Cow<'static, str>
Source§fn json_schema(generator: &mut SchemaGenerator) -> Schema
fn json_schema(generator: &mut SchemaGenerator) -> Schema
Source§fn inline_schema() -> bool
fn inline_schema() -> bool
$ref keyword. Read moreSource§impl PartialEq for ServiceSplit
impl PartialEq for ServiceSplit
Source§impl Serialize for ServiceSplit
impl Serialize for ServiceSplit
impl StructuralPartialEq for ServiceSplit
Auto Trait Implementations§
impl Freeze for ServiceSplit
impl RefUnwindSafe for ServiceSplit
impl Send for ServiceSplit
impl Sync for ServiceSplit
impl Unpin for ServiceSplit
impl UnwindSafe for ServiceSplit
Blanket Implementations§
§impl<T> AnyExt for T
impl<T> AnyExt for T
§fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
T behind reference§fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
T behind mutable reference§fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
T behind Rc pointer§fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
T behind Arc pointer§fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
T behind Box pointer§fn downcast_move<T>(this: Self) -> Option<T>
fn downcast_move<T>(this: Self) -> Option<T>
Self to T,
useful only in generic context as a workaround for specializationSource§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
fn coerce_rc_to(self: Rc<X>) -> Rc<T>
fn coerce_box_to(self: Box<X>) -> Box<T>
fn coerce_ref_to(&self) -> &T
fn coerce_mut_to(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more