lib/elasticsearch-serverless.rb (69 lines of code) (raw):
# Licensed to Elasticsearch B.V. under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Elasticsearch B.V. licenses this file to you under
# the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
require 'elastic/transport'
require 'elasticsearch-serverless/api'
require 'elasticsearch-serverless/version'
module ElasticsearchServerless
class Client
include ElasticsearchServerless::API
VALID_PARAMETERS = [:adapter, :log, :logger, :serializer_class, :trace, :tracer, :headers,
:request_timeout, :retry_on_status, :retry_on_failure, :delay_on_retry,
:opentelemetry_tracer_provider]
DEPRECATION_MESSAGE =
'WARNING: Starting with the release of the Elastic Stack 9.0.0, this client ' \
'will be discontinued.' \
'Instead, you can use the latest version of the Elasticsearch Client to build your ' \
'Elasticsearch Serverless Ruby applications: ' \
"https://github.com/elastic/elasticsearch-ruby\n".freeze
# Initializes an Elasticsearch Serverless Client
#
# @param [String] api_key Base64 String, format used to authenticate with Elasticsearch
# @param [String] url Elasticsearch endpoint
# @param [Hash] arguments Other optional arguments.
# @option arguments [Symbol] :adapter A specific adapter for Faraday (e.g. `:patron`)
# @option arguments [Boolean] :log Use the default logger (disabled by default)
# @option arguments [Object] :logger An instance of a Logger-compatible object
# @option arguments [Integer] :request_timeout The request timeout to be passed to transport in
# options in seconds
# @option arguments [Boolean,Number] :retry_on_failure Retry X times when request fails before raising and
# exception (false by default)
# @option arguments Array<Number> :retry_on_status Retry when specific status codes are returned
# @option arguments [Number] :delay_on_retry Delay in milliseconds between each retry (0 by default)
# @option arguments [Boolean] :trace Use the default tracer (disabled by default)
# @option arguments [Boolean] :trace Use the default tracer (disabled by default)
# @option arguments [Object] :tracer An instance of a Logger-compatible object
# @option arguments [Constant] :serializer_class A specific serializer class to use, will be initialized by
# the transport and passed the transport instance
# @option arguments [Hash] :headers Custom HTTP Request Headers
#
def initialize(api_key:, url:, arguments: {})
validate_arguments(arguments)
arguments.merge!(essential_parameters(url, api_key))
@transport = Elastic::Transport::Client.new(arguments)
warn(DEPRECATION_MESSAGE)
end
def essential_parameters(url, api_key)
{
host: url,
transport_options: {
headers: {
'Authorization' => "ApiKey #{api_key}",
'Elastic-Api-Version' => ElasticsearchServerless::API_VERSION,
user_agent: user_agent
}
},
compression: true
}
end
def validate_arguments(arguments)
arguments.map do |k, _|
raise ArgumentError, "Parameter #{k}" unless VALID_PARAMETERS.include?(k)
end
end
# Metaprogramming for integration with Transport
def method_missing(name, *args, &block)
if methods.include?(name)
super
else
@transport.send(name, *args, &block)
end
end
def respond_to_missing?(method_name, *args)
@transport.respond_to?(method_name) || super
end
def user_agent
user_agent = [
"elasticsearch-serverless-ruby/#{ElasticsearchServerless::VERSION}",
"elastic-transport-ruby/#{Elastic::Transport::VERSION}",
"RUBY_VERSION: #{RUBY_VERSION}"
]
if RbConfig::CONFIG && RbConfig::CONFIG['host_os']
user_agent << "#{RbConfig::CONFIG['host_os'].split('_').first[/[a-z]+/i].downcase} #{RbConfig::CONFIG['target_cpu']}"
end
user_agent.join('; ')
end
end
end
module Elastic
# If the version is X.X.X.pre/alpha/beta, use X.X.Xp for the meta-header:
def self.client_meta_version
return "#{ElasticsearchServerless::CLIENT_VERSION}p" if ElasticsearchServerless::VERSION.match(/[a-z]+/)
ElasticsearchServerless::CLIENT_VERSION
end
ES_SERVERLESS_SERVICE_VERSION = [:esv, client_meta_version].freeze
end