[model-gateway] extract circuit breaker state struct (#15098)

This commit is contained in:
fzyzcjy
2025-12-14 15:40:23 -08:00
committed by GitHub
parent bab20a849e
commit 5ca962ce7f
2 changed files with 25 additions and 27 deletions
+20 -10
View File
@@ -53,6 +53,24 @@ impl std::fmt::Display for CircuitState {
} }
} }
impl CircuitState {
pub fn as_str(&self) -> &'static str {
match self {
CircuitState::Closed => "closed",
CircuitState::Open => "open",
CircuitState::HalfOpen => "half_open",
}
}
pub fn to_int(&self) -> u8 {
match self {
CircuitState::Closed => 0u8,
CircuitState::Open => 1u8,
CircuitState::HalfOpen => 2u8,
}
}
}
/// Circuit breaker implementation /// Circuit breaker implementation
#[derive(Debug)] #[derive(Debug)]
pub struct CircuitBreaker { pub struct CircuitBreaker {
@@ -196,16 +214,8 @@ impl CircuitBreaker {
} }
} }
let from = match old_state { let from = old_state.as_str();
CircuitState::Closed => "closed", let to = new_state.as_str();
CircuitState::Open => "open",
CircuitState::HalfOpen => "half_open",
};
let to = match new_state {
CircuitState::Closed => "closed",
CircuitState::Open => "open",
CircuitState::HalfOpen => "half_open",
};
info!("Circuit breaker state transition: {} -> {}", from, to); info!("Circuit breaker state transition: {} -> {}", from, to);
} }
} }
+5 -17
View File
@@ -16,7 +16,7 @@ use super::{
CircuitBreaker, Endpoint, ModelCard, ModelType, ProviderType, WorkerError, WorkerResult, CircuitBreaker, Endpoint, ModelCard, ModelType, ProviderType, WorkerError, WorkerResult,
}; };
use crate::{ use crate::{
core::{BasicWorkerBuilder, CircuitState, DPAwareWorkerBuilder}, core::{BasicWorkerBuilder, DPAwareWorkerBuilder},
observability::metrics::RouterMetrics, observability::metrics::RouterMetrics,
protocols::worker_spec::WorkerInfo, protocols::worker_spec::WorkerInfo,
routers::grpc::client::GrpcClient, routers::grpc::client::GrpcClient,
@@ -137,24 +137,12 @@ pub trait Worker: Send + Sync + fmt::Debug {
let after = self.circuit_breaker().state(); let after = self.circuit_breaker().state();
if before != after { if before != after {
let from = match before { let from = before.as_str();
CircuitState::Closed => "closed", let to = after.as_str();
CircuitState::Open => "open",
CircuitState::HalfOpen => "half_open",
};
let to = match after {
CircuitState::Closed => "closed",
CircuitState::Open => "open",
CircuitState::HalfOpen => "half_open",
};
RouterMetrics::record_cb_state_transition(self.url(), from, to); RouterMetrics::record_cb_state_transition(self.url(), from, to);
} }
let state_code = match self.circuit_breaker().state() { let state_code = self.circuit_breaker().state().to_int();
CircuitState::Closed => 0u8,
CircuitState::Open => 1u8,
CircuitState::HalfOpen => 2u8,
};
RouterMetrics::set_cb_state(self.url(), state_code); RouterMetrics::set_cb_state(self.url(), state_code);
// Update consecutive failures/successes gauges // Update consecutive failures/successes gauges
@@ -1180,7 +1168,7 @@ mod tests {
use std::{thread, time::Duration}; use std::{thread, time::Duration};
use super::*; use super::*;
use crate::core::CircuitBreakerConfig; use crate::core::{CircuitBreakerConfig, CircuitState};
#[test] #[test]
fn test_worker_type_display() { fn test_worker_type_display() {