Add admin commands to get and reset tracing filters

This commit is contained in:
Lambda 2025-02-15 00:12:38 +00:00
parent 5eab758bd2
commit 99924e5779
4 changed files with 121 additions and 19 deletions

View file

@ -1,6 +1,6 @@
use std::{collections::BTreeMap, fmt::Write, sync::Arc, time::Instant};
use clap::{Parser, ValueEnum};
use clap::{Parser, Subcommand, ValueEnum};
use regex::Regex;
use ruma::{
api::appservice::Registration,
@ -205,10 +205,41 @@ enum AdminCommand {
VerifyJson,
/// Dynamically change a tracing backend's filter string
SetTracingFilter {
TracingFilter {
#[command(subcommand)]
cmd: TracingFilterCommand,
},
}
#[derive(Debug, Subcommand)]
enum TracingFilterCommand {
Get {
backend: TracingBackend,
},
Set {
backend: TracingBackend,
filter: String,
},
Reset {
backend: TracingBackend,
},
}
impl TracingFilterCommand {
fn backend(&self) -> &TracingBackend {
match self {
TracingFilterCommand::Get {
backend,
}
| TracingFilterCommand::Set {
backend,
..
}
| TracingFilterCommand::Reset {
backend,
} => backend,
}
}
}
#[derive(Debug)]
@ -1167,9 +1198,8 @@ impl Service {
)
}
}
AdminCommand::SetTracingFilter {
backend,
filter,
AdminCommand::TracingFilter {
cmd,
} => {
let Some(handles) = &services().globals.reload_handles else {
return Ok(RoomMessageEventContent::text_plain(
@ -1177,7 +1207,7 @@ impl Service {
));
};
let mut handles = handles.write().await;
let handle = match backend {
let handle = match cmd.backend() {
TracingBackend::Log => &mut handles.log,
TracingBackend::Flame => &mut handles.flame,
TracingBackend::Traces => &mut handles.traces,
@ -1187,15 +1217,27 @@ impl Service {
"Backend is disabled",
));
};
let filter = match filter.parse() {
Ok(filter) => filter,
Err(e) => {
let filter = match cmd {
TracingFilterCommand::Set {
filter,
..
} => filter,
TracingFilterCommand::Reset {
..
} => handle.get_initial_filter().to_owned(),
TracingFilterCommand::Get {
..
} => {
return Ok(RoomMessageEventContent::text_plain(
format!("Invalid filter string: {e}"),
format!(
"Current filter string: {}",
handle.get_filter()
),
));
}
};
if let Err(e) = handle.reload(filter) {
if let Err(e) = handle.set_filter(filter) {
return Ok(RoomMessageEventContent::text_plain(format!(
"Failed to reload filter: {e}"
)));