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

  1. Set the query parameter to exactly `text` or `json`.
  2. Remove the parameter if a default format is acceptable to the handler.
  3. 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

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


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_manager

View on GitHub (pinned to 6469eb736d)