Welcome to mirror list, hosted at ThFree Co, Russian Federation.

global_search_slis.rb « metrics « gitlab « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: c361d755a1259db3aec7ddcb0e862b1955757d10 (plain)
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
# frozen_string_literal: true

module Gitlab
  module Metrics
    module GlobalSearchSlis
      class << self
        # The following targets are the 99.95th percentile of code searches
        # gathered on 25-10-2022
        # from https://log.gprd.gitlab.net/goto/0c89cd80-23af-11ed-8656-f5f2137823ba (internal only)
        BASIC_CONTENT_TARGET_S = 8.812
        BASIC_CODE_TARGET_S = 27.538
        ADVANCED_CONTENT_TARGET_S = 2.452
        ADVANCED_CODE_TARGET_S = 15.52

        def initialize_slis!
          Gitlab::Metrics::Sli::Apdex.initialize_sli(:global_search, possible_labels)
          Gitlab::Metrics::Sli::ErrorRate.initialize_sli(:global_search, possible_labels)
        end

        def record_apdex(elapsed:, search_type:, search_level:, search_scope:)
          Gitlab::Metrics::Sli::Apdex[:global_search].increment(
            labels: labels(search_type: search_type, search_level: search_level, search_scope: search_scope),
            success: elapsed < duration_target(search_type, search_scope)
          )
        end

        def record_error_rate(error:, search_type:, search_level:, search_scope:)
          Gitlab::Metrics::Sli::ErrorRate[:global_search].increment(
            labels: labels(search_type: search_type, search_level: search_level, search_scope: search_scope),
            error: error
          )
        end

        private

        def duration_target(search_type, search_scope)
          if search_type == 'basic' && content_search?(search_scope)
            BASIC_CONTENT_TARGET_S
          elsif search_type == 'basic' && code_search?(search_scope)
            BASIC_CODE_TARGET_S
          elsif search_type == 'advanced' && content_search?(search_scope)
            ADVANCED_CONTENT_TARGET_S
          elsif search_type == 'advanced' && code_search?(search_scope)
            ADVANCED_CODE_TARGET_S
          end
        end

        def search_types
          %w[basic advanced]
        end

        def search_levels
          %w[project group global]
        end

        def search_scopes
          Gitlab::Search::AbuseDetection::ALLOWED_SCOPES
        end

        def endpoint_ids
          api_endpoints = ['GET /api/:version/search', 'GET /api/:version/projects/:id/(-/)search',
                           'GET /api/:version/groups/:id/(-/)search']
          web_endpoints = ['SearchController#show']

          endpoints = []

          endpoints += api_endpoints if Gitlab::Metrics::Environment.api?
          endpoints += web_endpoints if Gitlab::Metrics::Environment.web?

          endpoints
        end

        def possible_labels
          search_types.flat_map do |search_type|
            search_levels.flat_map do |search_level|
              search_scopes.flat_map do |search_scope|
                endpoint_ids.flat_map do |endpoint_id|
                  {
                    search_type: search_type,
                    search_level: search_level,
                    search_scope: search_scope,
                    endpoint_id: endpoint_id
                  }
                end
              end
            end
          end
        end

        def labels(search_type:, search_level:, search_scope:)
          {
            search_type: search_type,
            search_level: search_level,
            search_scope: search_scope,
            endpoint_id: endpoint_id
          }
        end

        def endpoint_id
          ::Gitlab::ApplicationContext.current_context_attribute(:caller_id)
        end

        def code_search?(search_scope)
          search_scope == 'blobs'
        end

        def content_search?(search_scope)
          !code_search?(search_scope)
        end
      end
    end
  end
end