Skip to content

Audit event tables

Harsimar Sandhu requested to merge 454158-new-audit-event-tables into master

What does this MR do and why?

Audit event tables

This commit adds four new audit event tables to store user, instance, group and project audit events

Changelog: added

MR acceptance checklist

Please evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.

Migration Logs

bundle exec rake db:migrate
main: == [advisory_lock_connection] object_id: 125240, pg_backend_pid: 66553
main: == 20240503172929 CreateSharedSequenceForAuditEvents: migrating ===============
main: -- execute("      CREATE SEQUENCE shared_audit_event_id_seq;\n")
main:    -> 0.0051s
main: == 20240503172929 CreateSharedSequenceForAuditEvents: migrated (0.0080s) ======

main: == [advisory_lock_connection] object_id: 125240, pg_backend_pid: 66553
ci: == [advisory_lock_connection] object_id: 125480, pg_backend_pid: 66555
ci: == 20240503172929 CreateSharedSequenceForAuditEvents: migrating ===============
ci: -- execute("      CREATE SEQUENCE shared_audit_event_id_seq;\n")
ci:    -> 0.0033s
ci: == 20240503172929 CreateSharedSequenceForAuditEvents: migrated (0.0096s) ======

ci: == [advisory_lock_connection] object_id: 125480, pg_backend_pid: 66555
main: == [advisory_lock_connection] object_id: 125980, pg_backend_pid: 66558
main: == 20240503173159 CreateUserAuditEvents: migrating ============================
main: -- execute("      CREATE TABLE user_audit_events (\n        id BIGINT NOT NULL DEFAULT nextval('shared_audit_event_id_seq'),\n        created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL,\n        user_id INTEGER NOT NULL,\n        author_id INTEGER NOT NULL,\n        target_id INTEGER,\n        event_name TEXT,\n        details TEXT,\n        ip_address INET,\n        author_name TEXT,\n        entity_path TEXT,\n        target_details TEXT,\n        target_type TEXT,\n        CHECK (char_length(event_name) <= 255),\n        CHECK (char_length(author_name) <= 255),\n        CHECK (char_length(entity_path) <= 5500),\n        CHECK (char_length(target_details) <= 5500),\n        CHECK (char_length(target_type) <= 255),\n        PRIMARY KEY (id, created_at)\n      ) PARTITION BY RANGE (created_at);\n")
main:    -> 0.0046s
main: -- add_index(:user_audit_events, [:created_at, :author_id], {:name=>"idx_user_audit_events_on_created_at_author_id"})
main:    -> 0.0004s
main: -- add_index(:user_audit_events, [:user_id, :id, :author_id, :created_at], {:name=>"idx_user_audit_events_on_user_id_desc_author_id_created_at", :order=>{:id=>:desc}})
main:    -> 0.0002s
main: -- add_index(:user_audit_events, [:user_id, :id, :created_at, :id], {:name=>"idx_user_audit_events_on_user_created_at_id"})
main:    -> 0.0004s
main: == 20240503173159 CreateUserAuditEvents: migrated (0.0232s) ===================

main: == [advisory_lock_connection] object_id: 125980, pg_backend_pid: 66558
ci: == [advisory_lock_connection] object_id: 126140, pg_backend_pid: 66560
ci: == 20240503173159 CreateUserAuditEvents: migrating ============================
ci: -- execute("      CREATE TABLE user_audit_events (\n        id BIGINT NOT NULL DEFAULT nextval('shared_audit_event_id_seq'),\n        created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL,\n        user_id INTEGER NOT NULL,\n        author_id INTEGER NOT NULL,\n        target_id INTEGER,\n        event_name TEXT,\n        details TEXT,\n        ip_address INET,\n        author_name TEXT,\n        entity_path TEXT,\n        target_details TEXT,\n        target_type TEXT,\n        CHECK (char_length(event_name) <= 255),\n        CHECK (char_length(author_name) <= 255),\n        CHECK (char_length(entity_path) <= 5500),\n        CHECK (char_length(target_details) <= 5500),\n        CHECK (char_length(target_type) <= 255),\n        PRIMARY KEY (id, created_at)\n      ) PARTITION BY RANGE (created_at);\n")
ci:    -> 0.0047s
ci: -- add_index(:user_audit_events, [:created_at, :author_id], {:name=>"idx_user_audit_events_on_created_at_author_id"})
ci:    -> 0.0005s
ci: -- add_index(:user_audit_events, [:user_id, :id, :author_id, :created_at], {:name=>"idx_user_audit_events_on_user_id_desc_author_id_created_at", :order=>{:id=>:desc}})
ci:    -> 0.0003s
ci: -- add_index(:user_audit_events, [:user_id, :id, :created_at, :id], {:name=>"idx_user_audit_events_on_user_created_at_id"})
ci:    -> 0.0007s
I, [2024-05-15T12:53:22.016162 #66401]  INFO -- : Database: 'ci', Table: 'user_audit_events': Lock Writes
ci: == 20240503173159 CreateUserAuditEvents: migrated (0.0149s) ===================

ci: == [advisory_lock_connection] object_id: 126140, pg_backend_pid: 66560
main: == [advisory_lock_connection] object_id: 126360, pg_backend_pid: 66563
main: == 20240503174905 CreateGroupAuditEvents: migrating ===========================
main: -- execute("      CREATE TABLE group_audit_events (\n        id BIGINT NOT NULL DEFAULT nextval('shared_audit_event_id_seq'),\n        created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL,\n        group_id INTEGER NOT NULL,\n        author_id INTEGER NOT NULL,\n        target_id INTEGER,\n        event_name TEXT,\n        details TEXT,\n        ip_address INET,\n        author_name TEXT,\n        entity_path TEXT,\n        target_details TEXT,\n        target_type TEXT,\n        CHECK (char_length(event_name) <= 255),\n        CHECK (char_length(author_name) <= 255),\n        CHECK (char_length(entity_path) <= 5500),\n        CHECK (char_length(target_details) <= 5500),\n        CHECK (char_length(target_type) <= 255),\n        PRIMARY KEY (id, created_at)\n      ) PARTITION BY RANGE (created_at);\n")
main:    -> 0.0018s
main: -- add_index(:group_audit_events, [:created_at, :author_id], {:name=>"idx_group_audit_events_on_created_at_and_author_id"})
main:    -> 0.0005s
main: -- add_index(:group_audit_events, [:group_id, :id, :author_id, :created_at], {:name=>"idx_group_audit_events_on_group_id_desc_author_id_created_at", :order=>{:id=>:desc}})
main:    -> 0.0003s
main: -- add_index(:group_audit_events, [:group_id, :id, :created_at, :id], {:name=>"idx_group_audit_events_on_group_created_at_and_id"})
main:    -> 0.0003s
main: == 20240503174905 CreateGroupAuditEvents: migrated (0.0053s) ==================

main: == [advisory_lock_connection] object_id: 126360, pg_backend_pid: 66563
ci: == [advisory_lock_connection] object_id: 126500, pg_backend_pid: 66565
ci: == 20240503174905 CreateGroupAuditEvents: migrating ===========================
ci: -- execute("      CREATE TABLE group_audit_events (\n        id BIGINT NOT NULL DEFAULT nextval('shared_audit_event_id_seq'),\n        created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL,\n        group_id INTEGER NOT NULL,\n        author_id INTEGER NOT NULL,\n        target_id INTEGER,\n        event_name TEXT,\n        details TEXT,\n        ip_address INET,\n        author_name TEXT,\n        entity_path TEXT,\n        target_details TEXT,\n        target_type TEXT,\n        CHECK (char_length(event_name) <= 255),\n        CHECK (char_length(author_name) <= 255),\n        CHECK (char_length(entity_path) <= 5500),\n        CHECK (char_length(target_details) <= 5500),\n        CHECK (char_length(target_type) <= 255),\n        PRIMARY KEY (id, created_at)\n      ) PARTITION BY RANGE (created_at);\n")
ci:    -> 0.0026s
ci: -- add_index(:group_audit_events, [:created_at, :author_id], {:name=>"idx_group_audit_events_on_created_at_and_author_id"})
ci:    -> 0.0004s
ci: -- add_index(:group_audit_events, [:group_id, :id, :author_id, :created_at], {:name=>"idx_group_audit_events_on_group_id_desc_author_id_created_at", :order=>{:id=>:desc}})
ci:    -> 0.0002s
ci: -- add_index(:group_audit_events, [:group_id, :id, :created_at, :id], {:name=>"idx_group_audit_events_on_group_created_at_and_id"})
ci:    -> 0.0002s
I, [2024-05-15T12:53:22.088223 #66401]  INFO -- : Database: 'ci', Table: 'group_audit_events': Lock Writes
ci: == 20240503174905 CreateGroupAuditEvents: migrated (0.0113s) ==================

ci: == [advisory_lock_connection] object_id: 126500, pg_backend_pid: 66565
main: == [advisory_lock_connection] object_id: 126720, pg_backend_pid: 66568
main: == 20240503175347 CreateProjectAuditEvents: migrating =========================
main: -- execute("      CREATE TABLE project_audit_events (\n        id BIGINT NOT NULL DEFAULT nextval('shared_audit_event_id_seq'),\n        created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL,\n        project_id INTEGER NOT NULL,\n        author_id INTEGER NOT NULL,\n        target_id INTEGER,\n        event_name TEXT,\n        details TEXT,\n        ip_address INET,\n        author_name TEXT,\n        entity_path TEXT,\n        target_details TEXT,\n        target_type TEXT,\n        CHECK (char_length(event_name) <= 255),\n        CHECK (char_length(author_name) <= 255),\n        CHECK (char_length(entity_path) <= 5500),\n        CHECK (char_length(target_details) <= 5500),\n        CHECK (char_length(target_type) <= 255),\n        PRIMARY KEY (id, created_at)\n      ) PARTITION BY RANGE (created_at);\n")
main:    -> 0.0021s
main: -- add_index(:project_audit_events, [:created_at, :author_id], {:name=>"idx_project_audit_events_on_created_at_and_author_id"})
main:    -> 0.0006s
main: -- add_index(:project_audit_events, [:project_id, :id, :author_id, :created_at], {:name=>"idx_project_audit_events_on_project_id_desc_author_created_at", :order=>{:id=>:desc}})
main:    -> 0.0006s
main: -- add_index(:project_audit_events, [:project_id, :id, :created_at, :id], {:name=>"idx_project_audit_events_on_project_created_at_and_id"})
main:    -> 0.0005s
main: == 20240503175347 CreateProjectAuditEvents: migrated (0.0062s) ================

main: == [advisory_lock_connection] object_id: 126720, pg_backend_pid: 66568
ci: == [advisory_lock_connection] object_id: 127140, pg_backend_pid: 66570
ci: == 20240503175347 CreateProjectAuditEvents: migrating =========================
ci: -- execute("      CREATE TABLE project_audit_events (\n        id BIGINT NOT NULL DEFAULT nextval('shared_audit_event_id_seq'),\n        created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL,\n        project_id INTEGER NOT NULL,\n        author_id INTEGER NOT NULL,\n        target_id INTEGER,\n        event_name TEXT,\n        details TEXT,\n        ip_address INET,\n        author_name TEXT,\n        entity_path TEXT,\n        target_details TEXT,\n        target_type TEXT,\n        CHECK (char_length(event_name) <= 255),\n        CHECK (char_length(author_name) <= 255),\n        CHECK (char_length(entity_path) <= 5500),\n        CHECK (char_length(target_details) <= 5500),\n        CHECK (char_length(target_type) <= 255),\n        PRIMARY KEY (id, created_at)\n      ) PARTITION BY RANGE (created_at);\n")
ci:    -> 0.0019s
ci: -- add_index(:project_audit_events, [:created_at, :author_id], {:name=>"idx_project_audit_events_on_created_at_and_author_id"})
ci:    -> 0.0010s
ci: -- add_index(:project_audit_events, [:project_id, :id, :author_id, :created_at], {:name=>"idx_project_audit_events_on_project_id_desc_author_created_at", :order=>{:id=>:desc}})
ci:    -> 0.0003s
ci: -- add_index(:project_audit_events, [:project_id, :id, :created_at, :id], {:name=>"idx_project_audit_events_on_project_created_at_and_id"})
ci:    -> 0.0002s
I, [2024-05-15T12:53:22.175347 #66401]  INFO -- : Database: 'ci', Table: 'project_audit_events': Lock Writes
ci: == 20240503175347 CreateProjectAuditEvents: migrated (0.0167s) ================

ci: == [advisory_lock_connection] object_id: 127140, pg_backend_pid: 66570
main: == [advisory_lock_connection] object_id: 128960, pg_backend_pid: 66573
main: == 20240505153633 CreateInstanceAuditEvents: migrating ========================
main: -- execute("      CREATE TABLE instance_audit_events (\n        id BIGINT NOT NULL DEFAULT nextval('shared_audit_event_id_seq'),\n        created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL,\n        author_id INTEGER NOT NULL,\n        target_id INTEGER,\n        event_name TEXT,\n        details TEXT,\n        ip_address INET,\n        author_name TEXT,\n        entity_path TEXT,\n        target_details TEXT,\n        target_type TEXT,\n        CHECK (char_length(event_name) <= 255),\n        CHECK (char_length(author_name) <= 255),\n        CHECK (char_length(entity_path) <= 5500),\n        CHECK (char_length(target_details) <= 5500),\n        CHECK (char_length(target_type) <= 255),\n        PRIMARY KEY (id, created_at)\n      ) PARTITION BY RANGE (created_at);\n")
main:    -> 0.0015s
main: -- add_index(:instance_audit_events, [:created_at, :author_id], {:name=>"idx_audit_events_on_created_at_and_author_id"})
main:    -> 0.0004s
main: -- add_index(:instance_audit_events, [:id, :author_id, :created_at], {:name=>"idx_audit_events_on_id_desc_author_created_at", :order=>{:id=>:desc}})
main:    -> 0.0002s
main: -- add_index(:instance_audit_events, [:id, :created_at, :id], {:name=>"idx_audit_events_on_created_at_and_id"})
main:    -> 0.0002s
main: == 20240505153633 CreateInstanceAuditEvents: migrated (0.0047s) ===============

main: == [advisory_lock_connection] object_id: 128960, pg_backend_pid: 66573
ci: == [advisory_lock_connection] object_id: 130300, pg_backend_pid: 66575
ci: == 20240505153633 CreateInstanceAuditEvents: migrating ========================
ci: -- execute("      CREATE TABLE instance_audit_events (\n        id BIGINT NOT NULL DEFAULT nextval('shared_audit_event_id_seq'),\n        created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL,\n        author_id INTEGER NOT NULL,\n        target_id INTEGER,\n        event_name TEXT,\n        details TEXT,\n        ip_address INET,\n        author_name TEXT,\n        entity_path TEXT,\n        target_details TEXT,\n        target_type TEXT,\n        CHECK (char_length(event_name) <= 255),\n        CHECK (char_length(author_name) <= 255),\n        CHECK (char_length(entity_path) <= 5500),\n        CHECK (char_length(target_details) <= 5500),\n        CHECK (char_length(target_type) <= 255),\n        PRIMARY KEY (id, created_at)\n      ) PARTITION BY RANGE (created_at);\n")
ci:    -> 0.0020s
ci: -- add_index(:instance_audit_events, [:created_at, :author_id], {:name=>"idx_audit_events_on_created_at_and_author_id"})
ci:    -> 0.0004s
ci: -- add_index(:instance_audit_events, [:id, :author_id, :created_at], {:name=>"idx_audit_events_on_id_desc_author_created_at", :order=>{:id=>:desc}})
ci:    -> 0.0002s
ci: -- add_index(:instance_audit_events, [:id, :created_at, :id], {:name=>"idx_audit_events_on_created_at_and_id"})
ci:    -> 0.0002s
I, [2024-05-15T12:53:22.249873 #66401]  INFO -- : Database: 'ci', Table: 'instance_audit_events': Lock Writes
ci: == 20240505153633 CreateInstanceAuditEvents: migrated (0.0097s) ===============

ci: == [advisory_lock_connection] object_id: 130300, pg_backend_pid: 66575

How to set up and validate locally

Numbered steps to set up and validate the change are strongly suggested.

Related to #454158

Edited by Harsimar Sandhu

Merge request reports