Limpieza del almacenamiento

Elimina grabaciones de forma masiva de la base de datos y limpia tu almacenamiento.

Limpieza del almacenamiento

Cada grabación existe en forma de un archivo y una entrada en la base de datos. OpenReplay vuelca lo necesario para reproducir una sesión (mutaciones del DOM, coordenadas del ratón, registros de la consola, actividad de red y mucho más) en 3 archivos (2 para la reproducción en sí y 1 para los datos de las DevTools). Estos archivos se almacenan por defecto en tu instancia, por lo que constituyen la mayor parte de su almacenamiento. Los metadatos de la sesión se almacenarán en la base de datos PostgreSQL para siempre, pero después de 180 días el archivo que contiene la grabación caducará o se eliminará mediante una política de ciclo de vida de minio.

Limpieza del almacenamiento temporal

Section titled Limpieza del almacenamiento temporal

OpenReplay almacena datos temporales en el sistema de archivos antes de procesarlos y subirlos al servicio de almacenamiento de objetos (minIO o S3). Una vez completado el procesamiento, los datos quedan obsoletos y un cronjob eliminará estos archivos cada 2.º día de la semana.

Si deseas modificar el cronjob:

  1. Edita la configuración:
openreplay -e
  1. Cambia la programación del cronjob añadiendo la siguiente línea:
utilities:
  # Cleanup data everyday morning 3:05 am, server time.
	cron: "5 3 * * *"

Hay 2 formas de limpiar el almacenamiento en tu instancia de OpenReplay: automatizada (CLI) y manual.

Este proceso está totalmente automatizado a través de nuestra CLI. Simplemente ejecuta el siguiente comando para limpiar tu almacenamiento eliminando datos tanto de Postgres (donde se almacenan los eventos) como de minio (donde se guardan las grabaciones):

# To clean data older than 14 days
openreplay --cleanup 14

Los datos pueden eliminarse tanto de la base de datos (donde se almacenan los eventos) como de minio (donde se guardan las grabaciones).

Si alguna vez necesitas liberar espacio, inicia sesión en tu instancia de OpenReplay y sigue los pasos a continuación:

  1. Ejecuta k9s -n db
  2. Usa las flechas del teclado para navegar por la lista y llegar al contenedor minio-*
  3. Pulsa s para tener acceso de shell al contenedor de Minio (almacenamiento de objetos)
  4. Ejecuta mc alias set minio http://localhost:9000 $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD
  5. Ejecuta mc rm --recursive --dangerous --force --older-than 7d minio/mobs (es decir, elimina los archivos con más de 7 días de antigüedad)
  6. Usa exit para salir del contenedor de Minio
  7. Ejecuta :quit para salir de la CLI de Kubernetes

Cambiar la política de ciclo de vida por defecto

Section titled Cambiar la política de ciclo de vida por defecto

Si estás usando minio (instalación estándar), puedes cambiar la política de ciclo de vida por defecto de esta manera:

  1. Ejecuta k9s -n db
  2. Usa las flechas del teclado para navegar por la lista y llegar al contenedor minio-*
  3. Pulsa s para tener acceso de shell al contenedor de Minio (almacenamiento de objetos)
  4. Ejecuta mc alias set minio http://localhost:9000 $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD
  5. Para limpiar automáticamente las grabaciones 14 días después de su creación
export EXPIRATION_DAYS=14
export DELETE_JOB_DAYS=$((EXPIRATION_DAYS>30 ? 30 : EXPIRATION_DAYS))
cat <<EOF > /tmp/lifecycle.json
{
  "Rules": [
    {
      "Expiration": {
        "Days": $EXPIRATION_DAYS
      },
      "ID": "Delete old mob files",
      "Status": "Enabled"
    },
    {
      "Expiration": {
        "Days": $DELETE_JOB_DAYS
      },
      "ID": "Delete flagged mob files after ${DELETE_JOB_DAYS} days",
      "Filter": {
        "Tag": {
          "Key": "to_delete_in_days",
          "Value": "${DELETE_JOB_DAYS}"
        }
      },
      "Status": "Enabled"
    }
  ]
}
EOF
mc ilm import minio/mobs < /tmp/lifecycle.json
  1. Usa exit para salir del contenedor de Minio
  2. Ejecuta :quit para salir de la CLI de Kubernetes

Limpieza de la base de datos (PostgeSQL)

Section titled Limpieza de la base de datos (PostgeSQL)

Según tu uso, los datos pueden eliminarse de varias tablas y de diferentes maneras.

Conéctate a tu instancia de OpenReplay y luego:

  1. Ejecuta k9s -n db
  2. Usa las flechas del teclado para navegar por la lista y llegar al contenedor postgresql-*
  3. Pulsa s para tener acceso de shell al contenedor de Postgres
  4. Ejecuta PGPASSWORD=MY_PG_PASSWORD psql -U postgres (reemplaza MY_PG_PASSWORD con el valor de la variable postgresqlPassword del archivo /var/lib/openreplay/vars.yaml)
  5. Ejecuta tu consulta de eliminación (o cualquier otra)
  6. Escribe exit para salir del cliente de postgresql
  7. Usa exit para salir del contenedor de Postgres
  8. Ejecuta :quit para salir de la CLI de Kubernetes

Comprobar el tamaño de las tablas

Section titled Comprobar el tamaño de las tablas

Para comprobar el tamaño de las tablas, puedes ejecutar la siguiente consulta:

SELECT nspname AS "name_space",
       relname AS "relation",
       pg_size_pretty(
               pg_total_relation_size(C.oid)
           )   AS "total_size"
FROM pg_class C
         LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog','information_schema')
  AND C.relkind <> 'i'
  AND nspname !~ '^pg_toast'
ORDER BY pg_total_relation_size(C.oid) DESC
LIMIT 20;

Hemos notado que la mayoría de los usuarios de OpenReplay, después de revisar los resultados de la sección anterior, decidieron eliminar eventos específicos en lugar de limpiar sesiones (especialmente events.resources y events_common.requests).

Para descartar todos los datos de eventos puedes ejecutar cualquiera de las siguientes consultas, pero ten en cuenta que esto afectará a los valores de las cards, los click-maps, la lista de eventos y otras funciones.

--- To delete all data related to a specific event

-- The next 2 tables are usually the biggest ones, and they affect some cards only
TRUNCATE TABLE events.resources;
TRUNCATE TABLE events_common.requests;

-- The next table will affect click-maps and events list of session's replay
TRUNCATE TABLE events.clicks;
TRUNCATE TABLE events.errors;
TRUNCATE TABLE events.graphql;
TRUNCATE TABLE events.inputs;
TRUNCATE TABLE events.pages;
TRUNCATE TABLE events.performance;
TRUNCATE TABLE events.state_actions;
TRUNCATE TABLE events_common.customs;
TRUNCATE TABLE events_common.issues;

Eliminar sesiones específicas por tiempo

Section titled Eliminar sesiones específicas por tiempo

Si quieres limpiar todas las sesiones, pasa a la siguiente parte, ya que es más rápida y libera espacio de almacenamiento al instante.

Usa la siguiente consulta SQL si deseas limpiar datos de tu base de datos (PostgreSQL). Reemplaza 2021-01-01 con la fecha a partir de la cual conservar las grabaciones. Es una eliminación en cascada, por lo que tanto todas las grabaciones como sus eventos correspondientes se eliminarán de la base de datos.

--- Cascade delete all sessions and their related events captured before Jan 1st, 2021
DELETE FROM public.sessions WHERE start_ts < extract(epoch from '2021-01-01'::date) * 1000;

Después de ejecutar la consulta anterior, la base de datos no liberará el espacio de almacenamiento de inmediato, ya que programará una limpieza para más tarde. Para forzarla manualmente a liberar almacenamiento, puedes ejecutar las siguientes consultas:

--- Recreate indexes and free unused storage
VACUUM FULL public.sessions;
VACUUM FULL events_common.customs;
VACUUM FULL events_common.issues;
VACUUM FULL events_common.requests;
VACUUM FULL events.pages;
VACUUM FULL events.state_actions;
VACUUM FULL events.errors;
VACUUM FULL events.graphql;
VACUUM FULL events.performance;
VACUUM FULL events.resources;
VACUUM FULL events.inputs;
VACUUM FULL events.clicks;

Usa la siguiente consulta SQL si deseas limpiar todos los datos de las sesiones de tu base de datos (PostgreSQL). Es una eliminación en cascada, por lo que tanto todas las grabaciones como sus eventos correspondientes se eliminarán de la base de datos.

--- Cascade delete all sessions and their related events 
TRUNCATE TABLE public.sessions CASCADE;
TRUNCATE TABLE public.errors CASCADE;
TRUNCATE TABLE public.issues CASCADE;
TRUNCATE TABLE public.autocomplete;

Si tienes alguna pregunta sobre este proceso, no dudes en contactarnos en nuestro Slack o consulta nuestro Foro.