1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
# frozen_string_literal: true
module API
class UsageData < ::API::Base
include APIGuard
MAXIMUM_TRACKED_EVENTS = 50
before { authenticate_non_get! }
feature_category :service_ping
helpers do
params :event_params do
requires :event, type: String, desc: 'The event name that should be tracked',
documentation: { example: 'i_quickactions_page' }
optional :namespace_id, type: Integer, desc: 'Namespace ID',
documentation: { example: 1234 }
optional :project_id, type: Integer, desc: 'Project ID',
documentation: { example: 1234 }
optional :additional_properties, type: Hash, desc: 'Additional properties to be tracked',
documentation: { example: { label: 'login_button', value: 1 } }
optional :send_to_snowplow, type: Boolean, desc: 'Send the tracked event to Snowplow',
documentation: { example: true, default: false }
end
def process_event(params)
event_name = params[:event]
namespace_id = params[:namespace_id]
project_id = params[:project_id]
additional_properties = params.fetch(:additional_properties, {}).symbolize_keys
send_snowplow_event = !!params[:send_to_snowplow]
Gitlab::Tracking::AiTracking.track_event(event_name, additional_properties.merge(user: current_user))
track_event(
event_name,
send_snowplow_event: send_snowplow_event,
user: current_user,
namespace_id: namespace_id,
project_id: project_id,
additional_properties: additional_properties
)
end
end
namespace 'usage_data' do
desc 'Track usage data event' do
detail 'This feature was introduced in GitLab 13.4.'
success code: 200
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 404, message: 'Not found' }
]
tags %w[usage_data]
end
params do
requires :event, type: String, desc: 'The event name that should be tracked',
documentation: { example: 'i_quickactions_page' }
end
post 'increment_counter' do
event_name = params[:event]
increment_counter(event_name)
status :ok
end
desc 'Track usage data event for the current user' do
success code: 200
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 404, message: 'Not found' }
]
tags %w[usage_data]
end
params do
requires :event, type: String, desc: 'The event name that should be tracked',
documentation: { example: 'i_quickactions_page' }
end
post 'increment_unique_users', urgency: :low do
event_name = params[:event]
increment_unique_values(event_name, current_user.id)
status :ok
end
desc 'Track multiple gitlab internal events' do
detail 'This feature was introduced in GitLab 17.3.'
success code: 200
failure [
{ code: 400, message: 'Validation error' },
{ code: 401, message: 'Unauthorized' }
]
tags %w[usage_data]
end
params do
requires :events, type: Array[JSON],
desc: "An array of internal events. Maximum #{MAXIMUM_TRACKED_EVENTS} events allowed." do
use :event_params
end
end
post 'track_events', urgency: :low do
if params[:events].count > MAXIMUM_TRACKED_EVENTS
render_api_error!("Maximum #{MAXIMUM_TRACKED_EVENTS} events allowed in one request.", :bad_request)
else
params[:events].each do |event_params|
process_event(event_params)
end
status :ok
end
end
desc 'Get a list of all metric definitions' do
detail 'This feature was introduced in GitLab 13.11.'
success code: 200
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 404, message: 'Not found' }
]
produces ['application/yaml']
tags %w[usage_data metrics]
end
params do
optional :include_paths, type: Boolean, desc: 'Include file paths in the metric definitions',
documentation: { example: true, default: false }
end
get 'metric_definitions', urgency: :low do
content_type 'application/yaml'
env['api.format'] = :binary
Gitlab::Usage::MetricDefinition.dump_metrics_yaml(include_paths: !!params[:include_paths])
end
end
end
end
|