наблюдаемость: завершить базовый контур Community
Добавить структурированные журналы, метрики, трассировку и безопасный канал критических ошибок. Усилить границы рантайма, тесты, проверку зависимостей и сценарии развёртывания.
This commit is contained in:
@@ -4,7 +4,7 @@ use axum::{
|
||||
http::{HeaderMap, HeaderValue, StatusCode, header::RETRY_AFTER},
|
||||
response::{IntoResponse, Response},
|
||||
};
|
||||
use crank_runtime::RateLimitRejection;
|
||||
use crank_runtime::RateLimitCheckError;
|
||||
use serde_json::{Value, json};
|
||||
|
||||
use crate::{
|
||||
@@ -14,19 +14,11 @@ use crate::{
|
||||
transport::{ResponseMode, session_id_from_headers, transport_response},
|
||||
};
|
||||
|
||||
pub(super) async fn enforce_post_rate_limit(
|
||||
state: &Arc<AppState>,
|
||||
path: &AgentRoutePath,
|
||||
headers: &HeaderMap,
|
||||
) -> Result<(), RateLimitRejection> {
|
||||
enforce_transport_rate_limit(state, path, headers).await
|
||||
}
|
||||
|
||||
pub(super) async fn enforce_transport_rate_limit(
|
||||
state: &Arc<AppState>,
|
||||
path: &AgentRoutePath,
|
||||
headers: &HeaderMap,
|
||||
) -> Result<(), RateLimitRejection> {
|
||||
) -> Result<(), RateLimitCheckError> {
|
||||
let key = rate_limit_key(path, headers);
|
||||
state.api_rate_limiter.check(&key).await
|
||||
}
|
||||
@@ -35,8 +27,25 @@ pub(super) fn rate_limited_jsonrpc_response(
|
||||
message: &Value,
|
||||
response_mode: ResponseMode,
|
||||
protocol_version: &str,
|
||||
rejection: RateLimitRejection,
|
||||
error: RateLimitCheckError,
|
||||
) -> Response {
|
||||
let RateLimitCheckError::Rejected(rejection) = error else {
|
||||
return transport_response(
|
||||
StatusCode::SERVICE_UNAVAILABLE,
|
||||
json!({
|
||||
"jsonrpc": "2.0",
|
||||
"id": request_id(message),
|
||||
"error": {
|
||||
"code": -32603,
|
||||
"message": "rate limit service unavailable",
|
||||
"data": { "code": "rate_limit_unavailable" }
|
||||
}
|
||||
}),
|
||||
response_mode,
|
||||
None,
|
||||
Some(protocol_version),
|
||||
);
|
||||
};
|
||||
let payload = json!({
|
||||
"jsonrpc": "2.0",
|
||||
"id": request_id(message),
|
||||
@@ -61,10 +70,15 @@ pub(super) fn rate_limited_jsonrpc_response(
|
||||
response
|
||||
}
|
||||
|
||||
pub(super) fn rate_limited_status_response(rejection: RateLimitRejection) -> Response {
|
||||
let mut response = StatusCode::TOO_MANY_REQUESTS.into_response();
|
||||
attach_retry_after_header(&mut response, rejection.retry_after_ms);
|
||||
response
|
||||
pub(super) fn rate_limited_status_response(error: RateLimitCheckError) -> Response {
|
||||
match error {
|
||||
RateLimitCheckError::Rejected(rejection) => {
|
||||
let mut response = StatusCode::TOO_MANY_REQUESTS.into_response();
|
||||
attach_retry_after_header(&mut response, rejection.retry_after_ms);
|
||||
response
|
||||
}
|
||||
RateLimitCheckError::StoreUnavailable => StatusCode::SERVICE_UNAVAILABLE.into_response(),
|
||||
}
|
||||
}
|
||||
|
||||
fn rate_limit_key(path: &AgentRoutePath, headers: &HeaderMap) -> String {
|
||||
|
||||
Reference in New Issue
Block a user