64 lines
2.4 KiB
Ruby
64 lines
2.4 KiB
Ruby
|
# 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
|