summaryrefslogtreecommitdiff
path: root/lib/gitlab/metrics/samplers/action_cable_sampler.rb
blob: 9f4979fa673fc7a75fa421fa5c065d75e5255084 (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
# frozen_string_literal: true

module Gitlab
  module Metrics
    module Samplers
      class ActionCableSampler < BaseSampler
        SAMPLING_INTERVAL_SECONDS = 5

        def initialize(interval = SAMPLING_INTERVAL_SECONDS, action_cable: ::ActionCable.server)
          super(interval)
          @action_cable = action_cable
        end

        def metrics
          @metrics ||= {
            active_connections: ::Gitlab::Metrics.gauge(
              :action_cable_active_connections, 'Number of ActionCable WS clients currently connected'
            ),
            pool_min_size: ::Gitlab::Metrics.gauge(
              :action_cable_pool_min_size, 'Minimum number of worker threads in ActionCable thread pool'
            ),
            pool_max_size: ::Gitlab::Metrics.gauge(
              :action_cable_pool_max_size, 'Maximum number of worker threads in ActionCable thread pool'
            ),
            pool_current_size: ::Gitlab::Metrics.gauge(
              :action_cable_pool_current_size, 'Current number of worker threads in ActionCable thread pool'
            ),
            pool_largest_size: ::Gitlab::Metrics.gauge(
              :action_cable_pool_largest_size, 'Largest number of worker threads observed so far in ActionCable thread pool'
            ),
            pool_completed_tasks: ::Gitlab::Metrics.gauge(
              :action_cable_pool_tasks_total, 'Total number of tasks executed in ActionCable thread pool'
            ),
            pool_pending_tasks: ::Gitlab::Metrics.gauge(
              :action_cable_pool_pending_tasks, 'Number of tasks waiting to be executed in ActionCable thread pool'
            )
          }
        end

        def sample
          pool = @action_cable.worker_pool.executor
          labels = {
            server_mode: server_mode
          }

          metrics[:active_connections].set(labels, @action_cable.connections.size)
          metrics[:pool_min_size].set(labels, pool.min_length)
          metrics[:pool_max_size].set(labels, pool.max_length)
          metrics[:pool_current_size].set(labels, pool.length)
          metrics[:pool_largest_size].set(labels, pool.largest_length)
          metrics[:pool_completed_tasks].set(labels, pool.completed_task_count)
          metrics[:pool_pending_tasks].set(labels, pool.queue_length)
        end

        private

        def server_mode
          Gitlab::ActionCable::Config.in_app? ? 'in-app' : 'standalone'
        end
      end
    end
  end
end