diff options
Diffstat (limited to 'gems/click_house-client/lib/click_house/client.rb')
-rw-r--r-- | gems/click_house-client/lib/click_house/client.rb | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/gems/click_house-client/lib/click_house/client.rb b/gems/click_house-client/lib/click_house/client.rb index 22c42d7be6e..abc54f2bce0 100644 --- a/gems/click_house-client/lib/click_house/client.rb +++ b/gems/click_house-client/lib/click_house/client.rb @@ -3,6 +3,7 @@ require 'addressable' require 'json' require 'active_support/time' +require 'active_support/notifications' require_relative "client/database" require_relative "client/configuration" require_relative "client/formatter" @@ -27,30 +28,23 @@ module ClickHouse # Executes a SELECT database query def self.select(query, database, configuration = self.configuration) - db = lookup_database(configuration, database) - - response = configuration.http_post_proc.call( - db.uri.to_s, - db.headers, - "#{query} FORMAT JSON" # always return JSON - ) + instrumented_execute(query, database, configuration) do |response, instrument| + parsed_response = configuration.json_parser.parse(response.body) - raise DatabaseError, response.body unless response.success? + instrument[:statistics] = parsed_response['statistics']&.symbolize_keys - Formatter.format(configuration.json_parser.parse(response.body)) + Formatter.format(parsed_response) + end end # Executes any kinds of database query without returning any data (INSERT, DELETE) def self.execute(query, database, configuration = self.configuration) - db = lookup_database(configuration, database) - - response = configuration.http_post_proc.call( - db.uri.to_s, - db.headers, - query - ) - - raise DatabaseError, response.body unless response.success? + instrumented_execute(query, database, configuration) do |response, instrument| + if response.headers['x-clickhouse-summary'] + instrument[:statistics] = + Gitlab::Json.parse(response.headers['x-clickhouse-summary']).symbolize_keys + end + end true end @@ -60,5 +54,21 @@ module ClickHouse raise ConfigurationError, "The database '#{database}' is not configured" unless db end end + + private_class_method def self.instrumented_execute(query, database, configuration) + db = lookup_database(configuration, database) + + ActiveSupport::Notifications.instrument('sql.click_house', { query: query, database: database }) do |instrument| + response = configuration.http_post_proc.call( + db.uri.to_s, + db.headers, + query + ) + + raise DatabaseError, response.body unless response.success? + + yield response, instrument + end + end end end |