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

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'gems/click_house-client/lib/click_house/client.rb')
-rw-r--r--gems/click_house-client/lib/click_house/client.rb46
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