xai-org/grok-build · error

failed to create chrome trace {:?}: {}

Error message

failed to create chrome trace {:?}: {}

What it means

generate_chrome_trace writes the assembled trace JSON to the output path (default: input with .trace.json extension). std::fs::File::create failures are wrapped in this message with the output path and OS error text. The subsequent write step has its own separate error (see failed to write chrome trace), so this one specifically means the file could not be created/opened for writing.

Source

Thrown at crates/codegen/xai-grok-telemetry/src/instrumentation.rs:503

            "tid": thread_id,
            "args": Value::Object(args),
        });

        events.push(trace_event);
        seen += 1;
    }

    if seen == 0 {
        return Err(anyhow!("no timing events found in {:?}", input));
    }

    let trace = serde_json::json!({
        "displayTimeUnit": "ms",
        "traceEvents": events,
    });

    let mut output_file = std::fs::File::create(&output)
        .map_err(|err| anyhow!("failed to create chrome trace {:?}: {}", output, err))?;
    serde_json::to_writer_pretty(&mut output_file, &trace)
        .map_err(|err| anyhow!("failed to write chrome trace: {}", err))?;

    Ok(output)
}

pub fn finalize() -> Result<()> {
    let mode = mode();
    if mode == InstrumentationMode::Disabled {
        return Ok(());
    }

    drop_guard(LOG_GUARD.get());
    drop_guard(CHROME_GUARD.get());

    Ok(())
}

View on GitHub (pinned to bc7f02eddd)

Solutions

  1. Check the printed output path's parent directory exists and is writable (`ls -ld`, `touch <file>`)
  2. Pass an explicit options.output to a writable location instead of relying on the input-with-extension default
  3. Fix permissions (`chmod`/`chown`) or run as a user with write access to the target directory
  4. Free disk space or remove an immutable/directory target at the output path

Example fix

// before
let output = options.output.unwrap_or_else(|| input.with_extension("trace.json"));
// after
let output = options.output.unwrap_or_else(|| input.with_extension("trace.json"));
if let Some(dir) = output.parent() {
    std::fs::create_dir_all(dir)?;
}
Defensive patterns

Strategy: validation

Validate before calling

let output = options.output.unwrap_or_else(|| input.with_extension("trace.json"));
if let Some(dir) = output.parent() {
    if !dir.as_os_str().is_empty() && !dir.exists() {
        std::fs::create_dir_all(dir)?;
    }
}
let writable = std::fs::OpenOptions::new().write(true).create_new(true).open(&output).is_ok();

Type guard

fn writable_target(p: &std::path::Path) -> bool {
    p.parent().map_or(true, |d| d.is_dir()) && !p.is_dir()
}

Try / catch

match generate_chrome_trace(opts) {
    Err(e) if e.to_string().contains("failed to create chrome trace") => {
        eprintln!("cannot write output: {e}; choose a writable output path");
    }
    other => other,
}

Prevention

When it happens

Trigger: Calling generate_chrome_trace where the output path's parent directory does not exist, the path is a directory, or the process lacks write permission — including the default output path derived from the input file.

Common situations: Writing to a read-only directory or one owned by another user; output path colliding with an existing directory; disk-full or immutable file; sandboxed environment (CI, container) restricting writes to the chosen location.

Related errors


AI-assisted analysis of xai-org/grok-build@bc7f02eddd (2026-08-31). Data as JSON: /api/errors/7e8c63b3f87af427. Report an issue: GitHub.