feat(api-server): add container loadtest observability
This commit is contained in:
@@ -37,13 +37,25 @@ pub async fn limit_concurrent_requests(
|
||||
|
||||
fn acquire_http_request_permit(
|
||||
permit_pool: Arc<HttpRequestPermitPool>,
|
||||
) -> Result<OwnedSemaphorePermit, TryAcquireError> {
|
||||
permit_pool.try_acquire_owned()
|
||||
) -> Result<HttpRequestPermitGuard, TryAcquireError> {
|
||||
match permit_pool.clone().try_acquire_owned() {
|
||||
Ok(permit) => {
|
||||
crate::telemetry::update_http_request_permits_available(permit_pool.available_permits());
|
||||
Ok(HttpRequestPermitGuard {
|
||||
permit: Some(permit),
|
||||
permit_pool,
|
||||
})
|
||||
}
|
||||
Err(error) => {
|
||||
crate::telemetry::update_http_request_permits_available(permit_pool.available_permits());
|
||||
Err(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn hold_permit_until_response_body_dropped(
|
||||
response: Response,
|
||||
permit: OwnedSemaphorePermit,
|
||||
permit: HttpRequestPermitGuard,
|
||||
) -> Response {
|
||||
response.map(|body| {
|
||||
Body::new(body.map_frame(move |frame| {
|
||||
@@ -53,6 +65,18 @@ fn hold_permit_until_response_body_dropped(
|
||||
})
|
||||
}
|
||||
|
||||
struct HttpRequestPermitGuard {
|
||||
permit: Option<OwnedSemaphorePermit>,
|
||||
permit_pool: Arc<HttpRequestPermitPool>,
|
||||
}
|
||||
|
||||
impl Drop for HttpRequestPermitGuard {
|
||||
fn drop(&mut self) {
|
||||
drop(self.permit.take());
|
||||
crate::telemetry::update_http_request_permits_available(self.permit_pool.available_permits());
|
||||
}
|
||||
}
|
||||
|
||||
fn reject_overloaded_request(request: &Request<Body>) -> Response {
|
||||
let request_context = request.extensions().get::<RequestContext>().cloned();
|
||||
let mut response = AppError::from_status(StatusCode::TOO_MANY_REQUESTS)
|
||||
|
||||
Reference in New Issue
Block a user