Skip to content

Commit 06e502e

Browse files
apollo_monitoring_endpoint: add route to set log level (#10184)
* apollo_infra: add set_log_level function * apollo_monitoring_endpoint: add route to set log level
1 parent b9fb46f commit 06e502e

File tree

3 files changed

+52
-2
lines changed

3 files changed

+52
-2
lines changed

crates/apollo_monitoring_endpoint/src/monitoring_endpoint.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
use std::net::SocketAddr;
22

33
use apollo_infra::component_definitions::ComponentStarter;
4+
use apollo_infra::trace_util::{configure_tracing, set_log_level};
45
use apollo_infra_utils::type_name::short_type_name;
56
use apollo_l1_provider_types::{L1ProviderSnapshot, SharedL1ProviderClient};
67
use apollo_mempool_types::communication::SharedMempoolClient;
78
use apollo_mempool_types::mempool_types::MempoolSnapshot;
89
use apollo_metrics::metrics::COLLECT_SEQUENCER_PROFILING_METRICS;
910
use apollo_monitoring_endpoint_config::config::MonitoringEndpointConfig;
11+
use axum::extract::Path;
1012
use axum::http::StatusCode;
1113
use axum::response::{IntoResponse, Response};
12-
use axum::routing::get;
14+
use axum::routing::{get, post};
1315
use axum::{async_trait, Json, Router, Server};
1416
use hyper::Error;
1517
use metrics_exporter_prometheus::{PrometheusBuilder, PrometheusHandle};
18+
use tracing::level_filters::LevelFilter;
1619
use tracing::{error, info, instrument};
1720

1821
use crate::tokio_metrics::setup_tokio_metrics;
@@ -28,6 +31,7 @@ pub(crate) const VERSION: &str = "nodeVersion";
2831
pub(crate) const METRICS: &str = "metrics";
2932
pub(crate) const MEMPOOL_SNAPSHOT: &str = "mempoolSnapshot";
3033
pub(crate) const L1_PROVIDER_SNAPSHOT: &str = "l1ProviderSnapshot";
34+
pub(crate) const SET_LOG_LEVEL: &str = "setLogLevel";
3135

3236
pub const HISTOGRAM_BUCKETS: &[f64] =
3337
&[0.001, 0.0025, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0, 25.0, 50.0];
@@ -122,6 +126,10 @@ impl MonitoringEndpoint {
122126
format!("/{MONITORING_PREFIX}/{L1_PROVIDER_SNAPSHOT}").as_str(),
123127
get(move || get_l1_provider_snapshot(l1_provider_client)),
124128
)
129+
.route(
130+
format!("/{MONITORING_PREFIX}/{SET_LOG_LEVEL}/:crate/:level").as_str(),
131+
post(set_log_level_endpoint),
132+
)
125133
}
126134
}
127135

@@ -211,3 +219,12 @@ async fn get_l1_provider_snapshot(
211219
None => Err(StatusCode::METHOD_NOT_ALLOWED),
212220
}
213221
}
222+
223+
async fn set_log_level_endpoint(
224+
Path((crate_name, level)): Path<(String, String)>,
225+
) -> Result<StatusCode, StatusCode> {
226+
let level_filter = level.parse::<LevelFilter>().map_err(|_| StatusCode::BAD_REQUEST)?;
227+
let handle = configure_tracing().await;
228+
set_log_level(&handle, &crate_name, level_filter);
229+
Ok(StatusCode::OK)
230+
}

crates/apollo_monitoring_endpoint/src/monitoring_endpoint_test.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,10 @@ use crate::monitoring_endpoint::{
3737
MEMPOOL_SNAPSHOT,
3838
METRICS,
3939
READY,
40+
SET_LOG_LEVEL,
4041
VERSION,
4142
};
42-
use crate::test_utils::build_request;
43+
use crate::test_utils::{build_post_request, build_request};
4344
use crate::tokio_metrics::{
4445
TOKIO_GLOBAL_QUEUE_DEPTH,
4546
TOKIO_MAX_BUSY_DURATION_MICROS,
@@ -71,6 +72,10 @@ async fn request_app(app: Router, method: &str) -> Response {
7172
app.oneshot(build_request(&IpAddr::from([0, 0, 0, 0]), 0, method)).await.unwrap()
7273
}
7374

75+
async fn request_post_app(app: Router, method: &str) -> Response {
76+
app.oneshot(build_post_request(&IpAddr::from([0, 0, 0, 0]), 0, method)).await.unwrap()
77+
}
78+
7479
#[tokio::test]
7580
async fn node_version() {
7681
let response = request_app(setup_monitoring_endpoint(None).app(), VERSION).await;
@@ -92,6 +97,26 @@ async fn ready_endpoint() {
9297
assert_eq!(response.status(), StatusCode::OK);
9398
}
9499

100+
#[tokio::test]
101+
async fn set_log_level_valid() {
102+
let app = setup_monitoring_endpoint(None).app();
103+
let crate_name = "apollo_monitoring_endpoint";
104+
let level = "debug";
105+
let method = format!("{SET_LOG_LEVEL}/{crate_name}/{level}");
106+
let response = request_post_app(app, &method).await;
107+
assert_eq!(response.status(), StatusCode::OK);
108+
}
109+
110+
#[tokio::test]
111+
async fn set_log_level_invalid_level() {
112+
let app = setup_monitoring_endpoint(None).app();
113+
let crate_name = "apollo_monitoring_endpoint";
114+
let invalid_level = "foobar";
115+
let method = format!("{SET_LOG_LEVEL}/{crate_name}/{invalid_level}");
116+
let response = request_post_app(app, &method).await;
117+
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
118+
}
119+
95120
#[tokio::test]
96121
async fn with_metrics() {
97122
let config = MonitoringEndpointConfig { collect_metrics: true, ..Default::default() };

crates/apollo_monitoring_endpoint/src/test_utils.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,11 @@ pub(crate) fn build_request(ip: &IpAddr, port: u16, method: &str) -> Request<Bod
120120
.body(Body::empty())
121121
.unwrap()
122122
}
123+
124+
pub fn build_post_request(ip: &IpAddr, port: u16, method: &str) -> Request<Body> {
125+
Request::builder()
126+
.method("POST")
127+
.uri(format!("http://{ip}:{port}/{MONITORING_PREFIX}/{method}").as_str())
128+
.body(Body::empty())
129+
.unwrap()
130+
}

0 commit comments

Comments
 (0)