Class: Wavefront::Base

Inherits:
Object
  • Object
show all
Includes:
Mixins, Validators
Defined in:
lib/wavefront-sdk/base.rb

Overview

Abstract class from which all API classes inherit. When you make any call to the Wavefront API from this SDK, you are returned an OpenStruct object.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Mixins

#parse_time

Methods included from Validators

#wf_alert_id?, #wf_alert_severity?, #wf_cloudintegration_id?, #wf_dashboard_id?, #wf_epoch?, #wf_event_id?, #wf_granularity?, #wf_link_id?, #wf_link_template?, #wf_maintenance_window_id?, #wf_message_id?, #wf_metric_name?, #wf_ms_ts?, #wf_name?, #wf_point?, #wf_point_tags?, #wf_proxy_id?, #wf_savedsearch_entity?, #wf_savedsearch_id?, #wf_source_id?, #wf_string?, #wf_tag?, #wf_ts?, #wf_user_id?, #wf_value?, #wf_version?, #wf_webhook_id?

Constructor Details

#initialize(creds = {}, opts = {}) ⇒ Nil

Create a new API object. This will always be called from a class which inherits this one. If the inheriting class defines #post_initialize, that method will be called afterwards, with the same arguments.



45
46
47
48
49
50
51
52
53
54
# File 'lib/wavefront-sdk/base.rb', line 45

def initialize(creds = {}, opts = {})
  @opts  = opts
  @debug = opts[:debug] || false
  @noop = opts[:noop] || false
  @verbose = opts[:verbose] || false
  @logger = opts[:logger] || nil
  setup_endpoint(creds)

  post_initialize(creds, opts) if respond_to?(:post_initialize)
end

Instance Attribute Details

#api_baseString (readonly)

Derive the first part of the API path from the class name. You can override this in your class if you wish



74
75
76
# File 'lib/wavefront-sdk/base.rb', line 74

def api_base
  @api_base
end

#connObject (readonly)

Returns the value of attribute conn.



24
25
26
# File 'lib/wavefront-sdk/base.rb', line 24

def conn
  @conn
end

#debugObject (readonly)

Returns the value of attribute debug.



24
25
26
# File 'lib/wavefront-sdk/base.rb', line 24

def debug
  @debug
end

#loggerObject (readonly)

Returns the value of attribute logger.



24
25
26
# File 'lib/wavefront-sdk/base.rb', line 24

def logger
  @logger
end

#netObject (readonly)

Returns the value of attribute net.



24
25
26
# File 'lib/wavefront-sdk/base.rb', line 24

def net
  @net
end

#noopObject (readonly)

Returns the value of attribute noop.



24
25
26
# File 'lib/wavefront-sdk/base.rb', line 24

def noop
  @noop
end

#optsObject (readonly)

Returns the value of attribute opts.



24
25
26
# File 'lib/wavefront-sdk/base.rb', line 24

def opts
  @opts
end

#update_keysObject (readonly)

Returns the value of attribute update_keys.



24
25
26
# File 'lib/wavefront-sdk/base.rb', line 24

def update_keys
  @update_keys
end

#verboseObject (readonly)

Returns the value of attribute verbose.



24
25
26
# File 'lib/wavefront-sdk/base.rb', line 24

def verbose
  @verbose
end

Instance Method Details

#api_delete(path) ⇒ Hash

Make a DELETE call to the Wavefront API and return the result as a Ruby hash. Can optionally perform a verbose noop, if the #noop class variable is set. If #verbose is set, then prints the information used to build the URI.



153
154
155
# File 'lib/wavefront-sdk/base.rb', line 153

def api_delete(path)
  make_call(mk_conn(path), :delete)
end

#api_get(path, query = {}) ⇒ Hash

Make a GET call to the Wavefront API and return the result as a Ruby hash. Can optionally perform a verbose noop, if the #noop class variable is set. If #verbose is set, then prints the information used to build the URI.



105
106
107
# File 'lib/wavefront-sdk/base.rb', line 105

def api_get(path, query = {})
  make_call(mk_conn(path), :get, nil, query)
end

#api_post(path, body = nil, ctype = 'text/plain') ⇒ Hash

Make a POST call to the Wavefront API and return the result as a Ruby hash. Can optionally perform a verbose noop, if the #noop class variable is set. If #verbose is set, then prints the information used to build the URI.



120
121
122
123
124
125
# File 'lib/wavefront-sdk/base.rb', line 120

def api_post(path, body = nil, ctype = 'text/plain')
  body = body.to_json unless body.is_a?(String)
  make_call(mk_conn(path, { 'Content-Type': ctype,
                                   'Accept': 'application/json'}),
            :post, nil, body)
end

#api_put(path, body = nil, ctype = 'application/json') ⇒ Hash

Make a PUT call to the Wavefront API and return the result as a Ruby hash. Can optionally perform a verbose noop, if the #noop class variable is set. If #verbose is set, then prints the information used to build the URI.



138
139
140
141
142
# File 'lib/wavefront-sdk/base.rb', line 138

def api_put(path, body = nil, ctype = 'application/json')
  make_call(mk_conn(path, { 'Content-Type': ctype,
                                  'Accept': 'application/json' }),
            :put, nil, body.to_json)
end

#hash_for_update(old, new) ⇒ Hash

doing a PUT to update an object requires only a certain subset of the keys returned by #describe(). This method takes the existing description of an object and turns it into a new has which can be PUT.

Raises:

  • (ArgumentError)


167
168
169
170
171
172
173
# File 'lib/wavefront-sdk/base.rb', line 167

def hash_for_update(old, new)
  raise ArgumentError unless old.is_a?(Hash) && new.is_a?(Hash)

  Hash[old.merge(new).map { |k, v| [k.to_sym, v] }].select do |k, _v|
    update_keys.include?(k)
  end
end

#log(msg, level = nil) ⇒ Object

Send a message to a Ruby logger object if the user supplied one, or print to standard out if not.



183
184
185
186
187
188
189
190
191
192
193
194
# File 'lib/wavefront-sdk/base.rb', line 183

def log(msg, level = nil)

  if logger
    logger.send(level || :info, msg)
  else
    # print it unless it's a debug and we're not in debug
    #
    return if level == :debug && ! opts[:debug]
    return if level == :info && ! opts[:verbose]
    puts msg
  end
end

#mk_conn(path, headers = {}) ⇒ URI::HTTPS

Create a Faraday connection object. The server comes from the endpoint passed to the initializer in the ‘creds’ hash; the root of the URI is dynamically derived by the #setup_endpoint method.



86
87
88
89
90
91
92
# File 'lib/wavefront-sdk/base.rb', line 86

def mk_conn(path, headers = {})
  Faraday.new(
    url:     Addressable::URI.encode("https://#{net[:endpoint]}" +
             [net[:api_base], path].uri_concat),
    headers: net[:headers].merge(headers)
  )
end

#respond(resp) ⇒ Object

If we need to massage a raw response to fit what the Wavefront::Response class expects (I’m looking at you, ‘User’), a class can provide a #response_shim method.



200
201
202
203
204
205
206
# File 'lib/wavefront-sdk/base.rb', line 200

def respond(resp)
  body = respond_to?(:response_shim) ? response_shim(resp.body,
                                                     resp.status) :
                                       resp.body

  Wavefront::Response.new(body, resp.status)
end

#time_to_ms(t) ⇒ Ingeter

Convert an epoch timestamp into epoch milliseconds. If the timestamp looks like it’s already epoch milliseconds, return it as-is.



63
64
65
66
67
# File 'lib/wavefront-sdk/base.rb', line 63

def time_to_ms(t)
  return false unless t.is_a?(Integer)
  return t if t.to_s.size == 13
  (t.to_f * 1000).round
end