Saltar al contenido

Una sola línea de tiempo

Los registros del core y los del frontend cuentan medias historias. Cómo se juntan en una sola secuencia y qué revela poder leerla entera.

El problema

La solución: un identificador por operación

Lo que resuelve el emparejamiento y es sorprendentemente barato:

Rust
#[tauri::command]async fn guardar_proyecto(id: ProyectoId, datos: Datos) -> Result<(), Error> {    let op = Uuid::new_v4();                     // o un contador    log::info!(op = %op, "guardar_proyecto: inicio id={id}");    let r = repo.guardar(id, datos).await;    log::info!(op = %op, "guardar_proyecto: fin {:?}", r.is_ok());    r}

Y en el frontend, el mismo identificador — generado allí y pasado como argumento, o devuelto por el core y registrado.

Con eso, buscar el identificador en los dos registros da la historia completa de una operación, aunque hubiera diez en vuelo.

Juntar las dos salidas

Tres formas, de más simple a mejor:

La segunda es la que más rinde a largo plazo porque es la que sirve para diagnosticar a distancia: un usuario manda un fichero y ahí está todo.

Y hay que tener cuidado con el bucle: si el frontend manda sus mensajes al core y el core devuelve los suyos a la consola, un mensaje puede dar vueltas. Uno de los dos sentidos, no los dos a la vez.

Qué registrar

Lo que revela poder leerla entera

Y es la razón de hacer este trabajo:

  • Cuántas llamadas hace de verdad una acción del usuario. Casi siempre más de las que uno cree.
  • Dónde se va el tiempo. El nivel 42.5 con datos en vez de sospechas.
  • Qué ocurre en el arranque, en orden, que es el nivel 57.
  • Y las operaciones que se solapan de formas que no habías previsto.

El primer punto suele ser el más revelador: una acción que uno cree que hace una consulta resulta hacer nueve, tres de ellas idénticas.