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 temporalOpenReplay 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:
- Edita la configuración:
openreplay -e
- 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.
Limpieza de datos (CLI)
Section titled Limpieza de datos (CLI)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
Limpieza de datos (Manual)
Section titled Limpieza de datos (Manual)Los datos pueden eliminarse tanto de la base de datos (donde se almacenan los eventos) como de minio (donde se guardan las grabaciones).
Limpieza de grabaciones
Section titled Limpieza de grabacionesSi alguna vez necesitas liberar espacio, inicia sesión en tu instancia de OpenReplay y sigue los pasos a continuación:
- Ejecuta
k9s -n db - Usa las flechas del teclado para navegar por la lista y llegar al contenedor
minio-* - Pulsa
spara tener acceso de shell al contenedor de Minio (almacenamiento de objetos) - Ejecuta
mc alias set minio http://localhost:9000 $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD - 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) - Usa
exitpara salir del contenedor de Minio - Ejecuta
:quitpara 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 defectoSi estás usando minio (instalación estándar), puedes cambiar la política de ciclo de vida por defecto de esta manera:
- Ejecuta
k9s -n db - Usa las flechas del teclado para navegar por la lista y llegar al contenedor
minio-* - Pulsa
spara tener acceso de shell al contenedor de Minio (almacenamiento de objetos) - Ejecuta
mc alias set minio http://localhost:9000 $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD - 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
- Usa
exitpara salir del contenedor de Minio - Ejecuta
:quitpara 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.
Conectarse a PostgreSQL
Section titled Conectarse a PostgreSQLConéctate a tu instancia de OpenReplay y luego:
- Ejecuta
k9s -n db - Usa las flechas del teclado para navegar por la lista y llegar al contenedor
postgresql-* - Pulsa
spara tener acceso de shell al contenedor de Postgres - Ejecuta
PGPASSWORD=MY_PG_PASSWORD psql -U postgres(reemplazaMY_PG_PASSWORDcon el valor de la variablepostgresqlPassworddel archivo/var/lib/openreplay/vars.yaml) - Ejecuta tu consulta de eliminación (o cualquier otra)
- Escribe
exitpara salir del cliente de postgresql - Usa
exitpara salir del contenedor de Postgres - Ejecuta
:quitpara salir de la CLI de Kubernetes
Comprobar el tamaño de las tablas
Section titled Comprobar el tamaño de las tablasPara 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;
Eliminar eventos específicos
Section titled Eliminar eventos específicosHemos 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 tiempoSi 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;
Eliminar todas las sesiones
Section titled Eliminar todas las sesionesUsa 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;
¿Tienes preguntas?
Section titled ¿Tienes preguntas?Si tienes alguna pregunta sobre este proceso, no dudes en contactarnos en nuestro Slack o consulta nuestro Foro.