EndpointHealth

Struct EndpointHealth 

Source
pub struct EndpointHealth { /* private fields */ }
Expand description

Per-endpoint passive health tracker. All pick-path reads are atomic; only the observation window takes a lock (report path). Share via Arc from the balancer state; carried across rebuilds for unchanged address:port.

Implementations§

Source§

impl EndpointHealth

Source

pub fn new() -> Self

Fresh tracker: healthy, empty window.

Source

pub fn with_events(sink: EndpointEvents) -> Self

Fresh tracker with ejection/recovery events (DW-044); see the module docs.

Source

pub fn acquire(&self, params: &HealthParams, now: u64) -> bool

Whether a pick may use this endpoint at now (Unix-epoch ms); consumes one probe slot when the endpoint is half-open. Lock-free.

Side effects: an expired ejection transitions to half-open here (the first pick after eject_ms re-arms the probe budget) — the transition therefore happens lazily on traffic rather than on a timer.

Source

pub fn is_candidate(&self, params: &HealthParams, now: u64) -> bool

Whether a pick MAY consider this endpoint at now (Unix-epoch ms) — non-consuming. The balancer’s candidate filter calls this for every endpoint; the endpoint actually SELECTED then consumes a half-open probe slot via EndpointHealth::consume_probe. Consuming only at selection keeps a half-open attempt from deadlocking: probe slots are never burned by picks that go elsewhere. Side effect: an expired ejection transitions to half-open here (the first traffic after eject_ms re-arms the probe budget) — the transition happens lazily on traffic rather than on a timer.

Source

pub fn consume_probe(&self)

Consume one half-open probe slot for a pick that SELECTED this endpoint. Best-effort: if a concurrent pick took the last slot, this pick still proceeds (one extra request beyond the probe budget may reach a recovering endpoint; the next report re-synchronizes the tracker).

Source

pub fn is_available(&self, now: u64) -> bool

Whether the endpoint is currently available WITHOUT consuming a probe (observability; not the pick path).

Source

pub fn ejections(&self) -> u64

Total times this tracker has ejected an endpoint (observability).

Source

pub fn state_label(&self, now: u64) -> &'static str

Human state label for observability surfaces (admin /health, DW-022): healthy, ejected, or half_open. An ejection whose window has expired but not yet transitioned reports half_open (the next pick arms the probe budget), mirroring Self::is_available’s view of expiry.

Source

pub fn report(&self, params: &HealthParams, now: u64, is_failure: bool)

Report one observation for this endpoint at now (Unix-epoch ms): is_failure = transport error or HTTP status >= 500 (see the module docs for the 1xx-4xx policy). Applies the ejection rules against params.

Source

pub fn report_probe(&self, params: &HealthParams, now: u64, is_failure: bool)

Report one ACTIVE (synthetic probe) observation at now (Unix-epoch ms). Runs the same state machine as EndpointHealth::report — the shared consecutive-failure streak and every ejection/recovery transition — but the observation NEVER enters the rolling failure-ratio window: that window is real traffic only, so probes cannot contaminate the passive ratios (the ratio rule also stays disabled by the caller’s parameters as a second line of defense).

Source

pub fn recovered_at_ms(&self) -> u64

REL-06 (#217): the Unix-epoch ms when the endpoint last recovered from ejection, or 0 if it was never ejected (or the ramp is disabled). Used by the load balancer to compute the recovery ramp weight multiplier.

Trait Implementations§

Source§

impl Debug for EndpointHealth

Source§

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

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

impl Default for EndpointHealth

Source§

fn default() -> EndpointHealth

Returns the “default value” for a type. Read more

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
§

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

§

fn downcast_ref<T>(this: &Self) -> Option<&T>
where T: Any,

Attempts to downcast this to T behind reference
§

fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>
where T: Any,

Attempts to downcast this to T behind mutable reference
§

fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>
where T: Any,

Attempts to downcast this to T behind Rc pointer
§

fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>
where T: Any,

Attempts to downcast this to T behind Arc pointer
§

fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>
where T: Any,

Attempts to downcast this to T behind Box pointer
§

fn downcast_move<T>(this: Self) -> Option<T>
where T: Any, Self: Sized,

Attempts to downcast owned Self to T, useful only in generic context as a workaround for specialization
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
§

impl<T, X> CoerceTo<T> for X
where 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

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> ServiceExt for T

§

fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>
where Self: Sized,

Apply a transformation to the response body. Read more
§

fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>
where Self: Sized,

High level tracing that classifies responses using HTTP status codes. Read more
§

fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>
where Self: Sized,

High level tracing that classifies responses using gRPC headers. 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.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,