lib/drill-sergeant.rb in drill-sergeant-0.1.4 vs lib/drill-sergeant.rb in drill-sergeant-0.2.0
- old
+ new
@@ -1,119 +1,16 @@
-# dependencies
+# stdlib
require "cgi"
require "json"
require "net/http"
# modules
+require "drill/client"
require "drill/version"
-# TODO make module and move to client
-class Drill
+module Drill
class Error < StandardError; end
- HEADERS = {
- "Content-Type" => "application/json",
- "Accept" => "application/json"
- }
-
- def initialize(url: nil, open_timeout: 3, read_timeout: nil)
- url ||= ENV["DRILL_URL"] || "http://localhost:8047"
- # remove trailing slash
- @uri = URI.parse(url.chomp("/"))
- @http = Net::HTTP.new(@uri.host, @uri.port)
- @http.use_ssl = true if @uri.scheme == "https"
- @http.open_timeout = open_timeout if open_timeout
- @http.read_timeout = read_timeout if read_timeout
- end
-
- def query(statement)
- options = {}
- if Gem::Version.new(server_version) >= Gem::Version.new("1.19.0")
- options["drill.exec.http.rest.errors.verbose"] = true
- end
- run_query(statement, options)
- end
-
- def profiles(query_id = nil)
- path = query_id ? "profiles/#{escape_path(query_id)}.json" : "profiles.json"
- get(path)
- end
-
- def storage(name = nil)
- path = name ? "storage/#{escape_path(name)}.json" : "storage.json"
- get(path)
- end
-
- def cluster
- get("cluster.json")
- end
-
- def metrics
- # no .json suffix
- get("status/metrics")
- end
-
- def options
- get("options.json")
- end
-
- def server_version
- @server_version ||= run_query("SELECT version FROM sys.version", {})[0]["version"]
- end
-
- private
-
- def run_query(statement, options)
- data = {
- queryType: "sql",
- query: statement,
- options: options
- }
-
- body = post("query.json", data)
-
- # errors return 200 with Drill 1.19+
- if body["queryState"] != "COMPLETED"
- raise Error, body["errorMessage"] || "Bad state: #{body["queryState"]}"
- end
-
- # return columns in order
- result = []
- columns = body["columns"]
- body["rows"].each do |row|
- result << columns.each_with_object({}) { |c, memo| memo[c] = row[c] }
- end
- result
- end
-
- def get(path)
- handle_response do
- @http.get("#{@uri.request_uri}#{path}", HEADERS)
- end
- end
-
- def post(path, data)
- handle_response do
- @http.post("#{@uri.request_uri}#{path}", data.to_json, HEADERS)
- end
- end
-
- def handle_response
- begin
- response = yield
- rescue Errno::ECONNREFUSED => e
- raise Error, e.message
- end
-
- unless response.kind_of?(Net::HTTPSuccess)
- body = JSON.parse(response.body) rescue {}
- message = body["errorMessage"] || "Bad response: #{response.code}"
- raise Error, message
- end
-
- JSON.parse(response.body)
- end
-
- def escape_path(path)
- CGI.escape(path).gsub("+", "%20")
+ def self.new(**options)
+ Client.new(**options)
end
end