Blameless Postmortem: Incidente con el pico de la masa

11 Jun 2024 - Memo, Nepo y Mario

Resumen del incidente

En el reporte anterior al del 28 mayo no reportamos diferencias en el pico de la masa ni en el éxito de vuelo. En el reporte del 28 de mayo sí reportamos diferencias.

¿Qué nos condujo al evento?

Los JSON que utilizamos para escribir el reporte los editábamos en diferentes pasos del Makefile. Los reescribíamos. En el JSON de la variable pico de la masa no calculamos la variable is_there_difference y se quedó con null. Al pasar la variable is_there_difference por un condicional if el null lo interpretó como falso. Escribíamos la sección del reporte como si no hubiera diferencias en el pico de la masa ni en el éxito de vuelo. Al asegurarnos que todas las variables biológicas pasaran el flujo completo notamos que sí había diferencias.

Falla

Queremos saber si las variables climáticas explican las diferencias de las variables biológicas entre temporadas. Para esto seguimos los siguientes pasos:

  1. Ajustar un modelo sin tomar en cuenta las variables climáticas.
  2. Revisamos si hay diferencias significativas entre temporadas para cada variable biológica.
  3. Para las variables biológicas en las que encontramos alguna diferencia significativa, ajustamos algunos modelos que sí incluyan el clima.
  4. Comparamos cada modelo usando el Akaike Information Criterion y decidimos cual es el mejor.

En el caso del pico de la masa, nos saltábamos el segundo paso.

Con el Éxito de vuelo ocurría que no usábamos jinja_render para escribir su sección. Esta sección estaba escrita a mano en el reporte. Nos faltó actualizar esa sección con su versión automática.

Impacto

Detección

Respuesta

Imagen respuesta

En la figura de arriba vemos a la función write_results() (línea 46). Esa es la que usamos para escribir la sección 8.1 del reporte. En la sección 8.1 presentamos las diferencias entre temporadas de las variables biológicas. En la línea 48 de la figura de arriba, vemos la función CheckerDifferences(). Esta función nos asegura que la variable is_there_difference no está vacía.

El reporte ahora ya no se puede escribir si la variable is_there_difference está vacía. Cada vez que le pasemos los datos a la función write_results() revisaremos que las variables del JSON sean las correctas. Con esto nos aseguramos que los archivos con los que escribimos las secciones del reporte ya pasaron por todo el flujo de trabajo. Si no fuera así, en lugar del reporte se generaría un error. Eso lo notaríamos porque el canal de integración continua estaría en rojo.

Recuperación

Reducción del tiempo de recuperación

Línea de tiempo

Cinco “¿por qué?”

  1. ¿Por qué antes del reporte del 28 de mayo no hay diferencias en el pico de la masa?
    • Porque la sección de las diferencias entre temporadas del pico de la masa no se genera correctamente.
  2. ¿Por qué no se generaba correctamente la sección del pico de la masa?
    • Porque le pasábamos un JSON incompleto. No tenía información si había o no diferencias entre temporadas.
  3. ¿Por qué el JSON estaba incompleto?
    • Porque no pasaba por el archivo de código que discernía si hay diferencias o no.
  4. ¿Por qué no pasaba por el archivo de código que determinaba si había o no diferencias?
    • El reporte esperaba un ingrediente, pero ese ingrediente tenía que pasar por un flujo que no era obligatorio.
  5. ¿Por qué ese flujo no era obligatorio?
    • La reescritura de este JSON complicaba saber en qué etapa del flujo estaba. Como desde el inicio ya estaba generado el JSON la dependencia ya estaba cumplida. Nadie aseguraba que se cumplía el flujo. Nadie aseguraba que el JSON tenía el valor correcto en la variable.
  6. ¿Por qué era complicado saber en qué etapa del flujo estaba el JSON?
    • Porque había muchos pasos intermedios para generar la sección de resultados con información del JSON. El JSON se llamaba igual en todos los pasos intermedios.

Causa raíz

Lecciones aprendidas y cosas ganadas

Acciones correctivas