risingwavelabs/risingwave · warning · DashboardError
Unsupported actor_traces_format
Error message
Unsupported actor_traces_format `{}`, only `text` and `json` are supported for now What it means
The dashboard `diagnose` handler parses the `actor_traces_format` query parameter inline instead of using the shared helper. Only `text` or `json` is accepted; any other string aborts the diagnostic report generation with this error.
Solutions
- Set the query parameter to exactly `text` or `json`.
- Remove the parameter if a default format is acceptable to the handler.
- Keep this parameter in sync with the /actor_traces endpoint's `format` values, which use the same enum.
Example fix
// before curl 'http://localhost:5691/api/v1/diagnose?actor_traces_format=yaml' // after curl 'http://localhost:5691/api/v1/diagnose?actor_traces_format=text'
Defensive patterns
Strategy: validation
Validate before calling
if (!['text', 'json'].includes(actorTracesFormat)) throw new Error("actor_traces_format must be 'text' or 'json'");
const url = `http://localhost:5691/api/v1/diagnose?actor_traces_format=${actorTracesFormat}`; Type guard
function isActorTracesFormat(v) { return v === 'text' || v === 'json'; } Try / catch
try { const res = await fetch(url); if (!res.ok) throw new Error(await res.text()); } catch (e) { /* detect 'Unsupported actor_traces_format' and retry with 'text' */ } Prevention
- Share one format constant between actor_traces and diagnose calls — they use the same enum.
- Never pass through arbitrary client config values as this query parameter without whitelisting.
When it happens
Trigger: Calling GET /api/v1/diagnose (or the diagnoseDdv handler) with `actor_traces_format` set to anything besides `text` or `json`, e.g. `actor_traces_format=yaml` or an uppercase variant.
Common situations: Monitoring integrations that reuse a generic 'format' value from their own config; copy-pasted curl commands from older docs; typos like `jsonl` when `json` was meant.
Understand the failure class
Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.
Related errors
- Unsupported format ` `, only `text` and `json` are…
- CPU profiling duration must be greater than zero
- {0}
- ALTER SINK_RATE_LIMIT is not for sink into table
- ALTER SOURCE_RATE_LIMIT is not for table without source
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/3b9d9a8c638f2873.
Report an issue: GitHub.
Appendix: source
Thrown at src/meta/src/dashboard/mod.rs:685
response.map_err(err)
}
#[derive(Debug, Deserialize)]
pub struct DiagnoseParams {
#[serde(default = "await_tree_default_format")]
actor_traces_format: String,
}
pub async fn diagnose(
Query(params): Query<DiagnoseParams>,
Extension(srv): Extension<Service>,
) -> Result<String> {
let actor_traces_format = match params.actor_traces_format.as_str() {
"text" => ActorTracesFormat::Text,
"json" => ActorTracesFormat::Json,
_ => {
return Err(err(anyhow!(
"Unsupported actor_traces_format `{}`, only `text` and `json` are supported for now",
params.actor_traces_format
)));
}
};
Ok(srv.diagnose_command.report(actor_traces_format).await)
}
/// NOTE(kwannoel): Although we fetch the BP for the entire graph via this API,
/// the workload should be reasonable.
/// In most cases, we can safely assume each node has most 2 outgoing edges (e.g. join).
/// In such a scenario, the number of edges is linear to the number of nodes.
/// So the workload is proportional to the relation id graph we fetch in `get_relation_id_infos`.
pub async fn get_streaming_stats(
Extension(srv): Extension<Service>,
) -> Result<Json<GetStreamingStatsResponse>> {
let worker_nodes = srv
.metadata_managerView on GitHub (pinned to 6469eb736d)