Files
gitlab-ce/lib/gitlab/ci/pipeline/access_logger.rb
2025-06-26 15:10:12 +00:00

75 lines
2.0 KiB
Ruby

# frozen_string_literal: true
module Gitlab
module Ci
module Pipeline
class AccessLogger
include ::Gitlab::Utils::StrongMemoize
PROVISIONAL_ARCHIVE_VALUE = 90.days
def initialize(pipeline:, archived:, destination: Gitlab::AppJsonLogger)
@pipeline = pipeline
@archived = archived
@destination = destination
end
def log
return unless enabled?
log_access_entry if log_access?
end
private
attr_reader :pipeline, :destination
delegate :project, to: :pipeline
def archived?
@archived
end
# Tracks interactions with pipelines that are archived or will be archived (90+ days old).
# Helps assess impact of archival policies on user workflows before implementation.
# Primarily for GitLab.com data collection.
#
def enabled?
::Gitlab::SafeRequestStore.fetch(:ci_pipeline_archived_access) do
::Feature.enabled?(:ci_pipeline_archived_access, :current_request, type: :ops)
end
end
strong_memoize_attr :enabled?
def log_access_entry
::Gitlab::ApplicationContext.with_context(project: project) do
attributes = ::Gitlab::ApplicationContext.current.merge(
class: self.class.name.to_s,
graphql: graphql_operation_names,
project_id: project.id,
pipeline_id: pipeline.id,
pipeline_age: pipeline.age_in_minutes,
archived: archived?
)
attributes.deep_stringify_keys!
destination.info(attributes)
end
end
def graphql_operation_names
RequestStore.store[:graphql_logs].to_a.map { |log| log.slice(:operation_name) }
end
def log_access?
archived? || pipeline_will_be_archived?
end
def pipeline_will_be_archived?
pipeline.created_at.before?(PROVISIONAL_ARCHIVE_VALUE.ago)
end
end
end
end
end