Module: RailsOtelContext::Adapters::Clickhouse

Defined in:
lib/rails_otel_context/adapters/clickhouse.rb

Constant Summary collapse

CANDIDATE_METHODS =
%i[query select insert execute command].freeze
REENTRANCY_KEY =
:_rails_otel_ctx_clickhouse_instrumenting

Class Method Summary collapse

Class Method Details

.install!(app_root:) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/rails_otel_context/adapters/clickhouse.rb', line 11

def install!(app_root:)
  begin
    require 'click_house'
  rescue LoadError
    # ClickHouse client gem is optional for consumers.
  end

  target_clients.each do |klass|
    methods = CANDIDATE_METHODS.select { |method_name| klass.method_defined?(method_name) }
    next if methods.empty?

    patch_module = patch_module_for(klass, methods)
    patch_module.configure(app_root: app_root)
    next if klass.ancestors.include?(patch_module)

    klass.prepend(patch_module)
  end
end

.patch_module_for(klass, methods) ⇒ Object



40
41
42
43
44
# File 'lib/rails_otel_context/adapters/clickhouse.rb', line 40

def patch_module_for(klass, methods)
  @patch_modules ||= {}
  key = [klass.name, methods.sort].join(':')
  @patch_modules[key] ||= build_patch_module(methods)
end

.target_clientsObject



30
31
32
33
34
35
36
37
38
# File 'lib/rails_otel_context/adapters/clickhouse.rb', line 30

def target_clients
  clients = []

  clients << ::ClickHouse::Client if defined?(::ClickHouse::Client)
  clients << ::ClickHouse::Connection if defined?(::ClickHouse::Connection)
  clients << ::Clickhouse::Client if defined?(::Clickhouse::Client)

  clients.uniq
end