Commit 9c6631e3 authored by Markus Koller's avatar Markus Koller

Merge branch '283947-fj-track-sse-edit-in-api' into 'master'

Track SSE edit action

See merge request gitlab-org/gitlab!48377
parents 840299c3 9c56cf2e
...@@ -19,6 +19,10 @@ class Projects::StaticSiteEditorController < Projects::ApplicationController ...@@ -19,6 +19,10 @@ class Projects::StaticSiteEditorController < Projects::ApplicationController
feature_category :static_site_editor feature_category :static_site_editor
def index
render_404
end
def show def show
service_response = ::StaticSiteEditor::ConfigService.new( service_response = ::StaticSiteEditor::ConfigService.new(
container: project, container: project,
......
---
title: Track MAU for SSE edit
merge_request: 48377
author:
type: added
...@@ -34,6 +34,7 @@ scope format: false do ...@@ -34,6 +34,7 @@ scope format: false do
scope constraints: { id: /[^\0]+?/ } do scope constraints: { id: /[^\0]+?/ } do
scope controller: :static_site_editor do scope controller: :static_site_editor do
get '/sse/:id(/*vueroute)', action: :show, as: :show_sse get '/sse/:id(/*vueroute)', action: :show, as: :show_sse
get '/sse', as: :root_sse, action: :index
end end
end end
end end
......
# frozen_string_literal: true
module API
module Helpers
module SSEHelpers
def request_from_sse?(project)
return false if request.referer.blank?
uri = URI.parse(request.referer)
uri.path.starts_with?(::Gitlab::Routing.url_helpers.project_root_sse_path(project))
rescue URI::InvalidURIError
false
end
end
end
end
...@@ -11,6 +11,7 @@ module API ...@@ -11,6 +11,7 @@ module API
feature_category :code_review feature_category :code_review
helpers Helpers::MergeRequestsHelpers helpers Helpers::MergeRequestsHelpers
helpers Helpers::SSEHelpers
# EE::API::MergeRequests would override the following helpers # EE::API::MergeRequests would override the following helpers
helpers do helpers do
...@@ -216,6 +217,8 @@ module API ...@@ -216,6 +217,8 @@ module API
handle_merge_request_errors!(merge_request) handle_merge_request_errors!(merge_request)
Gitlab::UsageDataCounters::EditorUniqueCounter.track_sse_edit_action(author: current_user) if request_from_sse?(user_project)
present merge_request, with: Entities::MergeRequest, current_user: current_user, project: user_project present merge_request, with: Entities::MergeRequest, current_user: current_user, project: user_project
end end
......
...@@ -770,6 +770,7 @@ module Gitlab ...@@ -770,6 +770,7 @@ module Gitlab
action_monthly_active_users_web_ide_edit: redis_usage_data { counter.count_web_ide_edit_actions(**date_range) }, action_monthly_active_users_web_ide_edit: redis_usage_data { counter.count_web_ide_edit_actions(**date_range) },
action_monthly_active_users_sfe_edit: redis_usage_data { counter.count_sfe_edit_actions(**date_range) }, action_monthly_active_users_sfe_edit: redis_usage_data { counter.count_sfe_edit_actions(**date_range) },
action_monthly_active_users_snippet_editor_edit: redis_usage_data { counter.count_snippet_editor_edit_actions(**date_range) }, action_monthly_active_users_snippet_editor_edit: redis_usage_data { counter.count_snippet_editor_edit_actions(**date_range) },
action_monthly_active_users_sse_edit: redis_usage_data { counter.count_sse_edit_actions(**date_range) },
action_monthly_active_users_ide_edit: redis_usage_data { counter.count_edit_using_editor(**date_range) } action_monthly_active_users_ide_edit: redis_usage_data { counter.count_edit_using_editor(**date_range) }
} }
end end
......
...@@ -6,6 +6,7 @@ module Gitlab ...@@ -6,6 +6,7 @@ module Gitlab
EDIT_BY_SNIPPET_EDITOR = 'g_edit_by_snippet_ide' EDIT_BY_SNIPPET_EDITOR = 'g_edit_by_snippet_ide'
EDIT_BY_SFE = 'g_edit_by_sfe' EDIT_BY_SFE = 'g_edit_by_sfe'
EDIT_BY_WEB_IDE = 'g_edit_by_web_ide' EDIT_BY_WEB_IDE = 'g_edit_by_web_ide'
EDIT_BY_SSE = 'g_edit_by_sse'
EDIT_CATEGORY = 'ide_edit' EDIT_CATEGORY = 'ide_edit'
class << self class << self
...@@ -38,6 +39,14 @@ module Gitlab ...@@ -38,6 +39,14 @@ module Gitlab
count_unique(events, date_from, date_to) count_unique(events, date_from, date_to)
end end
def track_sse_edit_action(author:, time: Time.zone.now)
track_unique_action(EDIT_BY_SSE, author, time)
end
def count_sse_edit_actions(date_from:, date_to:)
count_unique(EDIT_BY_SSE, date_from, date_to)
end
private private
def track_unique_action(action, author, time) def track_unique_action(action, author, time)
......
...@@ -118,6 +118,12 @@ ...@@ -118,6 +118,12 @@
expiry: 29 expiry: 29
aggregation: daily aggregation: daily
feature_flag: track_editor_edit_actions feature_flag: track_editor_edit_actions
- name: g_edit_by_sse
category: ide_edit
redis_slot: edit
expiry: 29
aggregation: daily
feature_flag: track_editor_edit_actions
- name: g_edit_by_snippet_ide - name: g_edit_by_snippet_ide
category: ide_edit category: ide_edit
redis_slot: edit redis_slot: edit
......
...@@ -7,6 +7,21 @@ RSpec.describe Projects::StaticSiteEditorController do ...@@ -7,6 +7,21 @@ RSpec.describe Projects::StaticSiteEditorController do
let_it_be(:user) { create(:user) } let_it_be(:user) { create(:user) }
let(:data) { { key: 'value' } } let(:data) { { key: 'value' } }
describe 'GET index' do
let(:default_params) do
{
namespace_id: project.namespace,
project_id: project
}
end
it 'responds with 404 page' do
get :index, params: default_params
expect(response).to have_gitlab_http_status(:not_found)
end
end
describe 'GET show' do describe 'GET show' do
render_views render_views
......
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe API::Helpers::SSEHelpers do
include Gitlab::Routing
let_it_be(:project) { create(:project) }
subject { Class.new.include(described_class).new }
describe '#request_from_sse?' do
before do
allow(subject).to receive(:request).and_return(request)
end
context 'when referer is nil' do
let(:request) { double(referer: nil)}
it 'returns false' do
expect(URI).not_to receive(:parse)
expect(subject.request_from_sse?(project)).to eq false
end
end
context 'when referer is not from SSE' do
let(:request) { double(referer: 'https://gitlab.com')}
it 'returns false' do
expect(URI).to receive(:parse).and_call_original
expect(subject.request_from_sse?(project)).to eq false
end
end
context 'when referer is from SSE' do
let(:request) { double(referer: project_show_sse_path(project, 'master/README.md'))}
it 'returns true' do
expect(URI).to receive(:parse).and_call_original
expect(subject.request_from_sse?(project)).to eq true
end
end
end
end
...@@ -74,6 +74,18 @@ RSpec.describe Gitlab::UsageDataCounters::EditorUniqueCounter, :clean_gitlab_red ...@@ -74,6 +74,18 @@ RSpec.describe Gitlab::UsageDataCounters::EditorUniqueCounter, :clean_gitlab_red
end end
end end
context 'for SSE edit actions' do
it_behaves_like 'tracks and counts action' do
def track_action(params)
described_class.track_sse_edit_action(**params)
end
def count_unique(params)
described_class.count_sse_edit_actions(**params)
end
end
end
it 'can return the count of actions per user deduplicated ' do it 'can return the count of actions per user deduplicated ' do
described_class.track_web_ide_edit_action(author: user1) described_class.track_web_ide_edit_action(author: user1)
described_class.track_snippet_editor_edit_action(author: user1) described_class.track_snippet_editor_edit_action(author: user1)
......
...@@ -1122,6 +1122,12 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do ...@@ -1122,6 +1122,12 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
counter.track_web_ide_edit_action(author: user3, time: time - 3.days) counter.track_web_ide_edit_action(author: user3, time: time - 3.days)
counter.track_snippet_editor_edit_action(author: user3) counter.track_snippet_editor_edit_action(author: user3)
counter.track_sse_edit_action(author: user1)
counter.track_sse_edit_action(author: user1)
counter.track_sse_edit_action(author: user2)
counter.track_sse_edit_action(author: user3)
counter.track_sse_edit_action(author: user2, time: time - 3.days)
end end
it 'returns the distinct count of user actions within the specified time period' do it 'returns the distinct count of user actions within the specified time period' do
...@@ -1134,7 +1140,8 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do ...@@ -1134,7 +1140,8 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
action_monthly_active_users_web_ide_edit: 2, action_monthly_active_users_web_ide_edit: 2,
action_monthly_active_users_sfe_edit: 2, action_monthly_active_users_sfe_edit: 2,
action_monthly_active_users_snippet_editor_edit: 2, action_monthly_active_users_snippet_editor_edit: 2,
action_monthly_active_users_ide_edit: 3 action_monthly_active_users_ide_edit: 3,
action_monthly_active_users_sse_edit: 3
} }
) )
end end
......
...@@ -1888,6 +1888,54 @@ RSpec.describe API::MergeRequests do ...@@ -1888,6 +1888,54 @@ RSpec.describe API::MergeRequests do
expect(response).to have_gitlab_http_status(:created) expect(response).to have_gitlab_http_status(:created)
end end
end end
describe 'SSE counter' do
let(:headers) { {} }
let(:params) do
{
title: 'Test merge_request',
source_branch: 'feature_conflict',
target_branch: 'master',
author_id: user.id,
milestone_id: milestone.id,
squash: true
}
end
subject { post api("/projects/#{project.id}/merge_requests", user), params: params, headers: headers }
it 'does not increase the SSE counter by default' do
expect(Gitlab::UsageDataCounters::EditorUniqueCounter).not_to receive(:track_sse_edit_action)
subject
expect(response).to have_gitlab_http_status(:created)
end
context 'when referer is not the SSE' do
let(:headers) { { 'HTTP_REFERER' => 'https://gitlab.com' } }
it 'does not increase the SSE counter by default' do
expect(Gitlab::UsageDataCounters::EditorUniqueCounter).not_to receive(:track_sse_edit_action)
subject
expect(response).to have_gitlab_http_status(:created)
end
end
context 'when referer is the SSE' do
let(:headers) { { 'HTTP_REFERER' => project_show_sse_url(project, 'master/README.md') } }
it 'increases the SSE counter by default' do
expect(Gitlab::UsageDataCounters::EditorUniqueCounter).to receive(:track_sse_edit_action).with(author: user)
subject
expect(response).to have_gitlab_http_status(:created)
end
end
end
end end
describe 'PUT /projects/:id/merge_reuests/:merge_request_iid' do describe 'PUT /projects/:id/merge_reuests/:merge_request_iid' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment