summaryrefslogtreecommitdiff
path: root/app/models/container_registry/event.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/container_registry/event.rb')
-rw-r--r--app/models/container_registry/event.rb41
1 files changed, 41 insertions, 0 deletions
diff --git a/app/models/container_registry/event.rb b/app/models/container_registry/event.rb
index d4075e1ff1b..c4d06be8841 100644
--- a/app/models/container_registry/event.rb
+++ b/app/models/container_registry/event.rb
@@ -8,6 +8,21 @@ module ContainerRegistry
PUSH_ACTION = 'push'
DELETE_ACTION = 'delete'
EVENT_TRACKING_CATEGORY = 'container_registry:notification'
+ EVENT_PREFIX = "i_container_registry"
+
+ ALLOWED_ACTOR_TYPES = %w(
+ personal_access_token
+ build
+ gitlab_or_ldap
+ ).freeze
+
+ TRACKABLE_ACTOR_EVENTS = %w(
+ push_tag
+ delete_tag
+ push_repository
+ delete_repository
+ create_repository
+ ).freeze
attr_reader :event
@@ -32,6 +47,9 @@ module ContainerRegistry
end
::Gitlab::Tracking.event(EVENT_TRACKING_CATEGORY, tracking_action)
+
+ event = usage_data_event_for(tracking_action)
+ ::Gitlab::UsageDataCounters::HLLRedisCounter.track_event(event, values: originator.id) if event
end
private
@@ -81,6 +99,29 @@ module ContainerRegistry
container_registry_path&.repository_project
end
+ # counter name for unique user tracking (for MAU)
+ def usage_data_event_for(tracking_action)
+ return unless originator
+ return unless TRACKABLE_ACTOR_EVENTS.include?(tracking_action)
+
+ "#{EVENT_PREFIX}_#{tracking_action}_user"
+ end
+
+ def originator_type
+ event.dig('actor', 'user_type')
+ end
+
+ def originator
+ return unless ALLOWED_ACTOR_TYPES.include?(originator_type)
+
+ username = event.dig('actor', 'name')
+ return unless username
+
+ strong_memoize(:originator) do
+ User.find_by_username(username)
+ end
+ end
+
def update_project_statistics
return unless supported?
return unless target_tag? || (action_delete? && target_digest?)