ストレージのクリーンアップ

データベースから録画を一括削除し、ストレージをクリーンアップします。

ストレージのクリーンアップ

各録画は、ファイルとデータベース内のエントリーという形で存在します。OpenReplay は、セッションを再生するために必要なもの(DOM の変更、マウス座標、コンソールログ、ネットワークアクティビティなど)を 3 つのファイル(リプレイ自体用に 2 つ、DevTools データ用に 1 つ)に書き出します。これらのファイルはデフォルトでインスタンス上に保存されるため、ストレージの大部分を占めます。セッションのメタデータは PostgreSQL データベースに永続的に保存されますが、180 日後には、録画を含むファイルが minio のライフサイクルポリシーによって期限切れ/削除されます。

一時ストレージのクリーンアップ

Section titled 一時ストレージのクリーンアップ

OpenReplay は、処理してオブジェクトストレージサービス(minIO または S3)にアップロードする前に、一時データをファイルシステムに保存します。処理が完了するとそのデータは不要になり、cronjob が毎週 2 日目にこれらのファイルを削除します。

cronjob を変更する場合は、次の手順に従います。

  1. 設定を編集します。
openreplay -e
  1. 次の行を追加して、cronjob のタイミングを変更します。
utilities:
  # Cleanup data everyday morning 3:05 am, server time.
	cron: "5 3 * * *"

OpenReplay インスタンスのストレージをクリーンアップする方法は、自動(CLI)と手動の 2 つがあります。

データのクリーンアップ(CLI)

Section titled データのクリーンアップ(CLI)

このプロセスは CLI によって完全に自動化されています。次のコマンドを実行するだけで、Postgres(イベントが保存されている場所)と minio(録画が保存されている場所)の両方からデータを削除して、ストレージをクリーンアップできます。

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

データのクリーンアップ(手動)

Section titled データのクリーンアップ(手動)

データは、データベース(イベントが保存されている場所)と minio(録画が保存されている場所)の両方から削除できます。

録画のクリーンアップ

Section titled 録画のクリーンアップ

空き容量を確保する必要がある場合は、OpenReplay インスタンスにログインし、次の手順に従ってください。

  1. k9s -n db を実行します
  2. キーボードの矢印キーでリスト内を移動し、minio-* コンテナーを選択します
  3. s を押して、Minio(オブジェクトストレージ)コンテナーのシェルにアクセスします
  4. mc alias set minio http://localhost:9000 $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD を実行します
  5. mc rm --recursive --dangerous --force --older-than 7d minio/mobs を実行します(例: 7 日より古いファイルを削除)
  6. exit を使用して Minio コンテナーを終了します
  7. :quit を実行して Kubernetes CLI を終了します

デフォルトのライフサイクルポリシーの変更

Section titled デフォルトのライフサイクルポリシーの変更

minio(標準インストール)を使用している場合は、次の方法でデフォルトのライフサイクルポリシーを変更できます。

  1. k9s -n db を実行します
  2. キーボードの矢印キーでリスト内を移動し、minio-* コンテナーを選択します
  3. s を押して、Minio(オブジェクトストレージ)コンテナーのシェルにアクセスします
  4. mc alias set minio http://localhost:9000 $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD を実行します
  5. 作成から 14 日後に録画を自動的にクリーンアップするには、次のようにします
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. exit を使用して Minio コンテナーを終了します
  2. :quit を実行して Kubernetes CLI を終了します

データベースのクリーンアップ(PostgreSQL)

Section titled データベースのクリーンアップ(PostgreSQL)

利用状況に応じて、さまざまなテーブルから、さまざまな方法でデータを削除できます。

OpenReplay インスタンスに接続し、次の手順に従います。

  1. k9s -n db を実行します
  2. キーボードの矢印キーでリスト内を移動し、postgresql-* コンテナーを選択します
  3. s を押して、Postgres コンテナーのシェルにアクセスします
  4. PGPASSWORD=MY_PG_PASSWORD psql -U postgres を実行します(MY_PG_PASSWORD は、/var/lib/openreplay/vars.yaml ファイルの postgresqlPassword 変数の値に置き換えてください)
  5. 削除(またはその他の)クエリを実行します
  6. exit と入力して postgresql-client を終了します
  7. exit を使用して Postgres コンテナーを終了します
  8. :quit を実行して Kubernetes CLI を終了します

テーブルサイズの確認

Section titled テーブルサイズの確認

テーブルサイズを確認するには、次のクエリを実行します。

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;

特定のイベントの削除

Section titled 特定のイベントの削除

多くの OpenReplay ユーザーは、前のセクションの結果を確認した後、セッションをクリーンアップする代わりに、特定のイベント(特に events.resources と events_common.requests)を削除することを選んでいます。

すべてのイベントデータを破棄するには、次のいずれかのクエリを実行できますが、カードの値、クリックマップ、イベント一覧、その他の機能に影響することに注意してください。

--- 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;

期間を指定したセッションの削除

Section titled 期間を指定したセッションの削除

すべてのセッションをクリーンアップする場合は、より高速でストレージ容量もすぐに解放されるため、次のパートに進んでください。

データベース(PostgreSQL)のデータをクリーンアップする場合は、次の SQL クエリを使用します。2021-01-01 を、録画を保持し始める日付に置き換えてください。これはカスケード削除であるため、すべての録画と、それに対応するイベントがデータベースから削除されます。

--- 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;

前のクエリを実行しても、データベースはクリーンアップを後でスケジュールするため、ストレージ容量はすぐには解放されません。手動でストレージを強制的に解放するには、次のクエリを実行します。

--- 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;

すべてのセッションの削除

Section titled すべてのセッションの削除

データベース(PostgreSQL)からすべてのセッションデータをクリーンアップする場合は、次の SQL クエリを使用します。これはカスケード削除であるため、すべての録画と、それに対応するイベントがデータベースから削除されます。

--- 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;

ご質問はありますか?

Section titled ご質問はありますか?

この手順についてご不明な点がございましたら、Slack までお気軽にお問い合わせください。