mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-05-21 21:11:24 +08:00
Merge branch 'main' into feature/error-request-logging
This commit is contained in:
@@ -69,11 +69,7 @@ impl Database {
|
||||
}
|
||||
|
||||
/// 添加供应商到故障转移队列末尾
|
||||
pub fn add_to_failover_queue(
|
||||
&self,
|
||||
app_type: &str,
|
||||
provider_id: &str,
|
||||
) -> Result<(), AppError> {
|
||||
pub fn add_to_failover_queue(&self, app_type: &str, provider_id: &str) -> Result<(), AppError> {
|
||||
let conn = lock_conn!(self.conn);
|
||||
|
||||
// 获取当前最大 queue_order
|
||||
@@ -199,11 +195,8 @@ impl Database {
|
||||
pub fn clear_failover_queue(&self, app_type: &str) -> Result<(), AppError> {
|
||||
let conn = lock_conn!(self.conn);
|
||||
|
||||
conn.execute(
|
||||
"DELETE FROM failover_queue WHERE app_type = ?1",
|
||||
[app_type],
|
||||
)
|
||||
.map_err(|e| AppError::Database(e.to_string()))?;
|
||||
conn.execute("DELETE FROM failover_queue WHERE app_type = ?1", [app_type])
|
||||
.map_err(|e| AppError::Database(e.to_string()))?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -333,9 +333,7 @@ pub fn run() {
|
||||
let app_state = AppState::new(db);
|
||||
|
||||
// 设置 AppHandle 用于代理故障转移时的 UI 更新
|
||||
app_state
|
||||
.proxy_service
|
||||
.set_app_handle(app.handle().clone());
|
||||
app_state.proxy_service.set_app_handle(app.handle().clone());
|
||||
|
||||
// ============================================================
|
||||
// 按表独立判断的导入逻辑(各类数据独立检查,互不影响)
|
||||
|
||||
@@ -238,9 +238,7 @@ impl CircuitBreaker {
|
||||
self.half_open_requests.fetch_sub(1, Ordering::SeqCst);
|
||||
|
||||
// HalfOpen 状态下失败,立即转为 Open
|
||||
log::warn!(
|
||||
"Circuit breaker HalfOpen probe failed, transitioning to Open"
|
||||
);
|
||||
log::warn!("Circuit breaker HalfOpen probe failed, transitioning to Open");
|
||||
drop(config);
|
||||
self.transition_to_open().await;
|
||||
}
|
||||
|
||||
@@ -54,9 +54,7 @@ impl FailoverSwitchManager {
|
||||
{
|
||||
let mut pending = self.pending_switches.write().await;
|
||||
if pending.contains(&switch_key) {
|
||||
log::debug!(
|
||||
"[Failover] 切换已在进行中,跳过: {app_type} -> {provider_id}"
|
||||
);
|
||||
log::debug!("[Failover] 切换已在进行中,跳过: {app_type} -> {provider_id}");
|
||||
return Ok(false);
|
||||
}
|
||||
pending.insert(switch_key.clone());
|
||||
@@ -83,9 +81,7 @@ impl FailoverSwitchManager {
|
||||
provider_id: &str,
|
||||
provider_name: &str,
|
||||
) -> Result<bool, AppError> {
|
||||
log::info!(
|
||||
"[Failover] 开始切换供应商: {app_type} -> {provider_name} ({provider_id})"
|
||||
);
|
||||
log::info!("[Failover] 开始切换供应商: {app_type} -> {provider_name} ({provider_id})");
|
||||
|
||||
// 1. 更新数据库 is_current
|
||||
self.db.set_current_provider(app_type, provider_id)?;
|
||||
@@ -131,9 +127,7 @@ impl FailoverSwitchManager {
|
||||
}
|
||||
}
|
||||
|
||||
log::info!(
|
||||
"[Failover] 供应商切换完成: {app_type} -> {provider_name} ({provider_id})"
|
||||
);
|
||||
log::info!("[Failover] 供应商切换完成: {app_type} -> {provider_name} ({provider_id})");
|
||||
|
||||
Ok(true)
|
||||
}
|
||||
|
||||
@@ -330,9 +330,8 @@ impl RequestForwarder {
|
||||
status.failed_requests += 1;
|
||||
status.last_error = Some("所有供应商暂时不可用(熔断器限制)".to_string());
|
||||
if status.total_requests > 0 {
|
||||
status.success_rate = (status.success_requests as f32
|
||||
/ status.total_requests as f32)
|
||||
* 100.0;
|
||||
status.success_rate =
|
||||
(status.success_requests as f32 / status.total_requests as f32) * 100.0;
|
||||
}
|
||||
}
|
||||
return Err(ProxyError::NoAvailableProvider);
|
||||
|
||||
@@ -14,9 +14,7 @@ use super::{
|
||||
},
|
||||
handler_context::RequestContext,
|
||||
providers::{get_adapter, streaming::create_anthropic_sse_stream, transform},
|
||||
response_processor::{
|
||||
create_logged_passthrough_stream, process_response, SseUsageCollector,
|
||||
},
|
||||
response_processor::{create_logged_passthrough_stream, process_response, SseUsageCollector},
|
||||
server::ProxyState,
|
||||
types::*,
|
||||
usage::parser::TokenUsage,
|
||||
@@ -63,8 +61,7 @@ pub async fn handle_messages(
|
||||
headers: axum::http::HeaderMap,
|
||||
Json(body): Json<Value>,
|
||||
) -> Result<axum::response::Response, ProxyError> {
|
||||
let ctx =
|
||||
RequestContext::new(&state, &body, AppType::Claude, "Claude", "claude").await?;
|
||||
let ctx = RequestContext::new(&state, &body, AppType::Claude, "Claude", "claude").await?;
|
||||
|
||||
// 检查是否需要格式转换(OpenRouter 等中转服务)
|
||||
let adapter = get_adapter(&AppType::Claude);
|
||||
@@ -426,7 +423,12 @@ pub async fn handle_gemini(
|
||||
// 使用量记录(保留用于 Claude 转换逻辑)
|
||||
// ============================================================================
|
||||
|
||||
fn log_forward_error(state: &ProxyState, ctx: &RequestContext, is_streaming: bool, error: &ProxyError) {
|
||||
fn log_forward_error(
|
||||
state: &ProxyState,
|
||||
ctx: &RequestContext,
|
||||
is_streaming: bool,
|
||||
error: &ProxyError,
|
||||
) {
|
||||
use super::usage::logger::UsageLogger;
|
||||
|
||||
let logger = UsageLogger::new(&state.db);
|
||||
|
||||
@@ -510,9 +510,7 @@ impl ProxyService {
|
||||
.set_current_provider(app_type_enum.as_str(), provider_id)
|
||||
.map_err(|e| format!("更新当前供应商失败: {e}"))?;
|
||||
|
||||
log::info!(
|
||||
"代理模式:已切换 {app_type} 的目标供应商为 {provider_id}"
|
||||
);
|
||||
log::info!("代理模式:已切换 {app_type} 的目标供应商为 {provider_id}");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -716,9 +714,7 @@ impl ProxyService {
|
||||
server
|
||||
.reset_provider_circuit_breaker(provider_id, app_type)
|
||||
.await;
|
||||
log::info!(
|
||||
"已重置 Provider {provider_id} (app: {app_type}) 的熔断器"
|
||||
);
|
||||
log::info!("已重置 Provider {provider_id} (app: {app_type}) 的熔断器");
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -61,10 +61,7 @@ impl SpeedtestService {
|
||||
}
|
||||
|
||||
if valid_targets.is_empty() {
|
||||
return Ok(results
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.collect::<Vec<_>>());
|
||||
return Ok(results.into_iter().flatten().collect::<Vec<_>>());
|
||||
}
|
||||
|
||||
let timeout = Self::sanitize_timeout(timeout_secs);
|
||||
|
||||
Reference in New Issue
Block a user