hawkular-client 5.0.0.pre1 → 5.0.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9ce43741f3e66c655f0d1c559576dad7296a8e32
4
- data.tar.gz: 70e51c3bed465d9ce434b4eef252722c8afff244
3
+ metadata.gz: 125d32626ed72fe6dab9a3413b025002c3a1dda3
4
+ data.tar.gz: ae957eb3a34c40d273b1db2c3cb04edeae17639d
5
5
  SHA512:
6
- metadata.gz: 78e7755e7ecb8ec09c31c59758302a3cf5ce76d302fe7dadfb71f226a91ad81db7b7a33829c6edf7ebdecf7f346b03c31975725e86d424a160b23f70ce15dcab
7
- data.tar.gz: 571f341fef1bff183163ecd58027d1e8cfc81b4c94e68cb2f21aaffbf877098c2d5e68728dd3f2b3b93a860255acf8502d2c1da0d7b34dd3859dc1ec1051c3b7
6
+ metadata.gz: adc002be0c18fa0d666c076ab0d34e36571b7c9b6359f3c970850b74326292ecc661668699aa69b68f9358ffc4e8394ccc88fb36e272a60d931c01e263a6b6f7
7
+ data.tar.gz: a38704b444dd7b832eb9507acd25b1f398e949d10bf4f8705ed4154cd388ff63d56651f42df4da8c2080d555203446f61c658b3f4e1ec4b164392f7dd68c42f2
@@ -135,7 +135,6 @@ Check each resource API for a detailed description of what methods are available
135
135
  Integration tests are recorded and played against cassettes recorded with VCR
136
136
  (http://www.relishapp.com/vcr/vcr/docs)
137
137
 
138
- * Edit the endpoint properties in the file +spec/endpoint.yml+ (user, password and host name) if needed
139
138
  * From command line run
140
139
  rake spec
141
140
  * To run the tests against a live server, set +VCR_OFF+ to +1+ as in
@@ -182,11 +182,7 @@ module Hawkular::Alerts
182
182
  # Obtains action definition/plugin from the server.
183
183
  # @param [String] action_plugin Id of the action plugin to fetch. If nil, all the plugins are fetched
184
184
  def get_action_definition(action_plugin = nil)
185
- if action_plugin.nil?
186
- plugins = http_get('plugins')
187
- else
188
- plugins = [action_plugin]
189
- end
185
+ plugins = action_plugin.nil? ? http_get('plugins') : [action_plugin]
190
186
  ret = {}
191
187
  plugins.each do |p|
192
188
  ret[p] = http_get("/plugins/#{p}")
@@ -232,7 +228,8 @@ module Hawkular::Alerts
232
228
  # Obtain the alerts for the Trigger with the passed id
233
229
  # @param [String] trigger_id Id of the trigger that has fired the alerts
234
230
  # @return [Array<Alert>] List of alerts for the trigger. Can be empty
235
- def get_alerts_for_trigger(trigger_id) # TODO: add additional filters
231
+ def get_alerts_for_trigger(trigger_id)
232
+ # TODO: add additional filters
236
233
  return [] unless trigger_id
237
234
 
238
235
  url = '/?triggerIds=' + trigger_id
@@ -254,7 +251,7 @@ module Hawkular::Alerts
254
251
  # @param [Array] tenants optional list of tenants. The elements of the array can be any object
255
252
  # convertible to a string
256
253
  # @return [Array<Alert>] List of alerts in the system. Can be empty
257
- def alerts(criteria: {}, tenants:nil)
254
+ def alerts(criteria: {}, tenants: nil)
258
255
  query = generate_query_params(criteria)
259
256
  uri = tenants ? '/admin/alerts/' : '/'
260
257
  ret = http_get(uri + query, multi_tenants_header(tenants))
@@ -389,7 +386,7 @@ module Hawkular::Alerts
389
386
  attr_accessor :auto_resolve, :auto_resolve_alerts, :tags, :type
390
387
  attr_accessor :tenant, :description, :group, :severity, :event_type, :event_category, :member_of, :data_id_map
391
388
  attr_reader :conditions, :dampenings
392
- attr_accessor :enabled, :actions, :firing_match, :auto_resolve_match
389
+ attr_accessor :enabled, :firing_match, :auto_resolve_match
393
390
 
394
391
  def initialize(trigger_hash)
395
392
  return if trigger_hash.nil?
@@ -427,9 +424,10 @@ module Hawkular::Alerts
427
424
  ret = x.to_s.split('_').collect(&:capitalize).join
428
425
  ret[0, 1].downcase + ret[1..-1]
429
426
  end
430
- fields = [:id, :name, :enabled, :severity, :auto_resolve, :auto_resolve_alerts, :event_type, :event_category,
431
- :description, :auto_enable, :auto_disable, :context, :type, :tags, :member_of, :data_id_map,
432
- :firing_match, :auto_resolve_match]
427
+ fields = %i[id name enabled severity auto_resolve auto_resolve_alerts
428
+ event_type event_category description auto_enable auto_disable
429
+ context type tags member_of data_id_map firing_match
430
+ auto_resolve_match]
433
431
 
434
432
  fields.each do |field|
435
433
  camelized_field = to_camel.call(field)
@@ -448,6 +446,7 @@ module Hawkular::Alerts
448
446
  class Condition
449
447
  attr_accessor :condition_id, :type, :operator, :threshold
450
448
  attr_accessor :trigger_mode, :data_id, :data2_id, :data2_multiplier
449
+ attr_accessor :alerter_id, :expression
451
450
  attr_reader :condition_set_size, :condition_set_index, :trigger_id
452
451
 
453
452
  def initialize(cond_hash)
@@ -461,7 +460,8 @@ module Hawkular::Alerts
461
460
  @data2_id = cond_hash['data2Id']
462
461
  @data2_multiplier = cond_hash['data2Multiplier']
463
462
  @trigger_id = cond_hash['triggerId']
464
- @interval = cond_hash['interval']
463
+ @alerter_id = cond_hash['alerterId']
464
+ @expression = cond_hash['expression']
465
465
  end
466
466
 
467
467
  def to_h
@@ -476,7 +476,8 @@ module Hawkular::Alerts
476
476
  cond_hash['data2Id'] = @data2_id
477
477
  cond_hash['data2Multiplier'] = @data2_multiplier
478
478
  cond_hash['triggerId'] = @trigger_id
479
- cond_hash['interval'] = @interval
479
+ cond_hash['alerterId'] = @alerter_id
480
+ cond_hash['expression'] = @expression
480
481
  cond_hash
481
482
  end
482
483
  end
@@ -601,8 +602,8 @@ module Hawkular::Alerts
601
602
  end
602
603
 
603
604
  # for some API back compatibility
604
- alias_method :ackBy, :ack_by
605
- alias_method :resolvedBy, :resolved_by
605
+ alias ackBy ack_by
606
+ alias resolvedBy resolved_by
606
607
  end
607
608
 
608
609
  # Representation of one event.
@@ -95,7 +95,7 @@ module Hawkular
95
95
  opts[:user] = @credentials[:username]
96
96
  opts[:password] = @credentials[:password]
97
97
  # strip @endpoint in case suburl is absolute
98
- suburl = suburl[@entrypoint.length, suburl.length] if suburl.match(/^http/)
98
+ suburl = suburl[@entrypoint.length, suburl.length] if suburl =~ /^http/
99
99
  RestClient::Resource.new(@entrypoint, opts)[suburl]
100
100
  end
101
101
 
@@ -131,12 +131,12 @@ module Hawkular
131
131
  # @param params [Hash] key-values pairs
132
132
  # @return [String] complete query string to append to a base url, '' if no valid params
133
133
  def generate_query_params(params = {})
134
- params = params.select { |_k, v| !(v.nil? || ((v.instance_of? Array) && v.empty?)) }
134
+ params = params.reject { |_k, v| v.nil? || ((v.instance_of? Array) && v.empty?) }
135
135
  return '' if params.empty?
136
136
 
137
137
  params.inject('?') do |ret, (k, v)|
138
138
  ret += '&' unless ret == '?'
139
- part = (v.instance_of? Array) ? "#{k}=#{v.join(',')}" : "#{k}=#{v}"
139
+ part = v.instance_of?(Array) ? "#{k}=#{v.join(',')}" : "#{k}=#{v}"
140
140
  ret + hawk_escape(part)
141
141
  end
142
142
  end
@@ -1,14 +1,12 @@
1
1
  require 'hawkular/inventory/inventory_api'
2
- require 'hawkular/metrics/metrics_client'
3
2
  require 'hawkular/alerts/alerts_api'
4
3
  require 'hawkular/tokens/tokens_api'
5
4
  require 'hawkular/operations/operations_api'
5
+ require 'hawkular/prometheus/prometheus_api'
6
6
  require 'hawkular/base_client'
7
7
 
8
8
  module Hawkular
9
9
  class Client
10
- attr_reader :inventory, :metrics, :alerts, :operations, :tokens, :state
11
-
12
10
  def initialize(hash)
13
11
  hash[:credentials] ||= {}
14
12
  hash[:options] ||= {}
@@ -18,19 +16,19 @@ module Hawkular
18
16
  @state = hash
19
17
  end
20
18
 
19
+ def respond_to_missing?(method_name, include_private = false)
20
+ delegate_client = client_for_method(method_name)
21
+ return super if delegate_client.nil?
22
+
23
+ method = submethod_name_for(method_name)
24
+ return super unless delegate_client.respond_to?(method)
25
+
26
+ true
27
+ end
28
+
21
29
  def method_missing(name, *args, &block)
22
- delegate_client = case name
23
- when /^inventory_/ then inventory
24
- when /^metrics_/ then metrics
25
- when /^alerts_/ then alerts
26
- when /^operations_/ then operations
27
- when /^tokens_/ then tokens
28
- else
29
- fail Hawkular::ArgumentError, "unknown method prefix `#{name}`, allowed prefixes:"\
30
- '`inventory_`, `metrics_`,`alerts_`,`operations_`, `tokens_`'
31
- end
32
- method = name.to_s.sub(/^[^_]+_/, '')
33
- delegate_client.__send__(method, *args, &block)
30
+ super unless respond_to?(name)
31
+ client_for_method(name).__send__(submethod_name_for(name), *args, &block)
34
32
  end
35
33
 
36
34
  def inventory
@@ -39,12 +37,6 @@ module Hawkular
39
37
  @state[:options])
40
38
  end
41
39
 
42
- def metrics
43
- @metrics ||= Metrics::Client.new("#{@state[:entrypoint]}/hawkular/metrics",
44
- @state[:credentials],
45
- @state[:options])
46
- end
47
-
48
40
  def alerts
49
41
  @alerts ||= Alerts::Client.new("#{@state[:entrypoint]}/hawkular/alerts",
50
42
  @state[:credentials],
@@ -64,6 +56,12 @@ module Hawkular
64
56
  @state[:options])
65
57
  end
66
58
 
59
+ def prometheus
60
+ @prometheus ||= Prometheus::Client.new(@state[:entrypoint],
61
+ @state[:credentials],
62
+ @state[:options])
63
+ end
64
+
67
65
  private
68
66
 
69
67
  # this is in a dedicated method, because constructor opens the websocket connection to make the handshake
@@ -72,5 +70,19 @@ module Hawkular
72
70
  credentials: @state[:credentials],
73
71
  options: @state[:options])
74
72
  end
73
+
74
+ def client_for_method(method_name)
75
+ case method_name
76
+ when /^inventory_/ then inventory
77
+ when /^alerts_/ then alerts
78
+ when /^operations_/ then operations
79
+ when /^tokens_/ then tokens
80
+ when /^prometheus_/ then prometheus
81
+ end
82
+ end
83
+
84
+ def submethod_name_for(method_name)
85
+ method_name.to_s.sub(/^[^_]+_/, '')
86
+ end
75
87
  end
76
88
  end
@@ -1,32 +1,36 @@
1
1
  # It contains class definitions that are used by the inventory REST client
2
2
  module Hawkular::Inventory
3
3
  class Metric
4
- # @return [String] Name of the metric
4
+ # @return [String] Provider Name of the metric
5
5
  attr_reader :name
6
- # @return [String] Type of the metric
7
- attr_reader :type
6
+ # @return [String] Display Name of the metric
7
+ attr_reader :display_name
8
+ # @return [String] Family of the metric (Prometheus family name)
9
+ attr_reader :family
10
+ # @return [String] Promql expression for fetching the time series
11
+ attr_reader :expression
8
12
  # @return [String] Unit of the metric
9
13
  attr_reader :unit
14
+ # @return [Hash<String,String>] Labels of this metric (Prometheus labels)
15
+ attr_reader :labels
10
16
  # @return [Hash<String,String>] Properties of this metric
11
17
  attr_reader :properties
12
18
 
13
19
  def initialize(hash)
14
- @name = hash['name']
15
- @type = hash['type']
20
+ @name = hash['displayName']
21
+ @display_name = hash['displayName']
22
+ @family = hash['family']
23
+ @expression = hash['expression']
16
24
  @unit = hash['unit']
25
+ @labels = hash['labels'] || {}
17
26
  @properties = hash['properties'] || {}
27
+ @_hash = hash.dup
18
28
  end
19
29
 
20
- def hawkular_id
21
- @properties.fetch('hawkular.metric.id')
22
- end
23
-
24
- def hawkular_type
25
- @properties.fetch('hawkular.metric.type')
26
- end
27
-
28
- def hawkular_type_id
29
- @properties.fetch('hawkular.metric.typeId')
30
+ # Returns a hash representation of the metric type
31
+ # @return [Hash<String,Object>] hash of the metric type
32
+ def to_h
33
+ @_hash.dup
30
34
  end
31
35
  end
32
36
 
@@ -37,7 +41,7 @@ module Hawkular::Inventory
37
41
 
38
42
  def initialize(op_hash)
39
43
  @name = op_hash['name']
40
- @params = (op_hash.key? 'parameters') ? op_hash['parameters'] : {}
44
+ @params = op_hash.key?('parameters') ? op_hash['parameters'] : {}
41
45
  end
42
46
  end
43
47
 
@@ -57,7 +61,7 @@ module Hawkular::Inventory
57
61
  end
58
62
 
59
63
  def ==(other)
60
- self.equal?(other) || other.class == self.class && other.id == @id
64
+ equal?(other) || other.class == self.class && other.id == @id
61
65
  end
62
66
 
63
67
  # Returns a hash representation of the resource type
@@ -82,10 +86,6 @@ module Hawkular::Inventory
82
86
  attr_reader :properties
83
87
  # @return [Hash<String,String>] Config map of this resource
84
88
  attr_reader :config
85
- # @return [List<Metric>] Metrics associated to this resource
86
- attr_reader :metrics
87
- # @return [List<Resource>] List of children (present when the whole tree is loaded, else nil)
88
- attr_reader :children
89
89
 
90
90
  def initialize(hash)
91
91
  @id = hash['id']
@@ -117,12 +117,12 @@ module Hawkular::Inventory
117
117
  children(recursive).collect(&:metrics).flat_map(&:itself).concat(@metrics)
118
118
  end
119
119
 
120
- def metrics_by_type(type)
121
- @metrics.select { |m| m.type == type }
120
+ def metrics_by_family(family)
121
+ @metrics.select { |m| m.family == family }
122
122
  end
123
123
 
124
124
  def ==(other)
125
- self.equal?(other) || other.class == self.class && other.id == @id
125
+ equal?(other) || other.class == self.class && other.id == @id
126
126
  end
127
127
 
128
128
  # Returns a hash representation of the resource
@@ -39,6 +39,9 @@ module Hawkular::Inventory
39
39
  def resource(id)
40
40
  hash = http_get(url('/resources/%s', id))
41
41
  Resource.new(hash)
42
+ rescue ::Hawkular::Exception => e
43
+ return if e.cause.is_a?(::RestClient::NotFound)
44
+ raise
42
45
  end
43
46
 
44
47
  # Get resource by id with its complete subtree
@@ -23,7 +23,8 @@ module Hawkular::Metrics
23
23
  # @param starts [Integer] optional timestamp (default now - 8h)
24
24
  # @param ends [Integer] optional timestamp (default now)
25
25
  # @return [Array[Hash]] datapoints
26
- def data_by_tags(tags, buckets: nil, bucketDuration:nil, start:nil, ends: nil)
26
+ def data_by_tags(tags, buckets: nil, bucketDuration: nil, # rubocop:disable Naming/VariableName
27
+ start: nil, ends: nil)
27
28
  data = {
28
29
  tags: tags_param(tags), buckets: buckets, bucketDuration: bucketDuration, start: start, end: ends
29
30
  }
@@ -56,7 +57,7 @@ module Hawkular::Metrics
56
57
  strings.each { |g| default_timestamp g[:data] }
57
58
  data = { gauges: gauges, counters: counters, availabilities: availabilities, strings: strings }
58
59
  path = '/metrics/'
59
- @legacy_api ? path << 'data' : path << 'raw'
60
+ path << (@legacy_api ? 'data' : 'raw')
60
61
  http_post(path, data)
61
62
  end
62
63
 
@@ -84,7 +85,7 @@ module Hawkular::Metrics
84
85
  path = '/metrics/stats/query'
85
86
  metrics = { gauge: gauge_ids, counter: counter_ids, availability: avail_ids }
86
87
  data = { metrics: metrics, start: starts, end: ends, bucketDuration: bucket_duration }
87
- data['types'] = %w(gauge gauge_rate counter counter_rate availability) if rates
88
+ data['types'] = %w[gauge gauge_rate counter counter_rate availability] if rates
88
89
  http_post(path, data)
89
90
  end
90
91
 
@@ -93,9 +94,11 @@ module Hawkular::Metrics
93
94
  def tags
94
95
  tags = []
95
96
  http_get('/metrics/').map do |g|
97
+ next if g['tags'].nil?
98
+
96
99
  g['tags'].map do |k, v|
97
100
  tags << { k => v }
98
- end unless g['tags'].nil?
101
+ end
99
102
  end
100
103
  tags.uniq!
101
104
  end
@@ -171,7 +174,7 @@ module Hawkular::Metrics
171
174
  def push_data(id, data)
172
175
  data = [data] unless data.is_a?(Array)
173
176
  uri = "/#{@resource}/#{ERB::Util.url_encode(id)}/"
174
- @legacy_api ? uri << 'data' : uri << 'raw'
177
+ uri << (@legacy_api ? 'data' : 'raw')
175
178
  @client.default_timestamp data
176
179
  @client.http_post(uri, data)
177
180
  end
@@ -187,8 +190,8 @@ module Hawkular::Metrics
187
190
  # @param order [String] optional Data point sort order, based on timestamp (ASC, DESC)
188
191
  # @return [Array[Hash]] datapoints
189
192
  # @see #push_data #push_data for datapoint detail
190
- def get_data(id, starts: nil, ends: nil, bucketDuration: nil, buckets: nil, percentiles: nil, limit: nil,
191
- order: nil)
193
+ def get_data(id, starts: nil, ends: nil, bucketDuration: nil, # rubocop:disable Naming/VariableName
194
+ buckets: nil, percentiles: nil, limit: nil, order: nil)
192
195
  params = { start: starts, end: ends, bucketDuration: bucketDuration, buckets: buckets,
193
196
  percentiles: percentiles, limit: limit, order: order }
194
197
  get_data_helper(id, params)
@@ -214,28 +217,32 @@ module Hawkular::Metrics
214
217
  # @param buckets [Integer] optional number of buckets
215
218
  # @return [Array[Hash]] datapoints
216
219
  # @see #push_data #push_data for datapoint detail
217
- def get_data_by_tags(tags, starts: nil, ends: nil, bucketDuration: nil, buckets:nil)
220
+ def get_data_by_tags(tags, starts: nil, ends: nil, bucketDuration: nil, # rubocop:disable Naming/VariableName
221
+ buckets: nil)
218
222
  params = { tags: @client.tags_param(tags), start: starts,
219
223
  end: ends, bucketDuration: bucketDuration, buckets: buckets }
220
224
  path = "/#{@resource}/"
221
- @legacy_api ? path << 'data/?' : path << 'stats/?'
225
+ path << (@legacy_api ? 'data/?' : 'stats/?')
222
226
  resp = @client.http_get(path + encode_params(params))
223
227
  resp.is_a?(Array) ? resp : [] # API returns no content (empty Hash) instead of empty array
224
228
  end
225
229
 
226
230
  def encode_params(params)
227
- URI.encode_www_form(params.select { |_k, v| !v.nil? })
231
+ URI.encode_www_form(params.reject { |_k, v| v.nil? })
228
232
  end
229
233
 
230
234
  private
231
235
 
232
236
  def get_data_helper(id, params)
233
237
  path = "/#{@resource}/#{ERB::Util.url_encode(id)}/"
234
- if @legacy_api
235
- path << 'data/?'
236
- else
237
- (params[:bucketDuration].nil? && params[:buckets].nil?) ? path << 'raw/?' : path << 'stats/?'
238
- end
238
+ path << if @legacy_api
239
+ 'data/?'
240
+ elsif params[:bucketDuration].nil? && params[:buckets].nil?
241
+ 'raw/?'
242
+ else
243
+ 'stats/?'
244
+ end
245
+
239
246
  path << encode_params(params)
240
247
  resp = @client.http_get(path)
241
248
  resp.is_a?(Array) ? resp : [] # API returns no content (empty Hash) instead of empty array
@@ -329,8 +336,8 @@ module Hawkular::Metrics
329
336
  # @param order [String] optional Data point sort order, based on timestamp (ASC, DESC)
330
337
  # @return [Array[Hash]] datapoints
331
338
  # @see #push_data #push_data for datapoint detail
332
- def get_data(id, starts: nil, ends: nil, bucketDuration: nil, buckets: nil, distinct: nil, limit: nil,
333
- order: nil)
339
+ def get_data(id, starts: nil, ends: nil, bucketDuration: nil, # rubocop:disable Naming/VariableName
340
+ buckets: nil, distinct: nil, limit: nil, order: nil)
334
341
  params = { start: starts, end: ends, bucketDuration: bucketDuration, buckets: buckets,
335
342
  distinct: distinct, limit: limit, order: order }
336
343
  get_data_helper(id, params)
@@ -41,7 +41,7 @@ module Hawkular::Metrics
41
41
  version = version_status_hash['Implementation-Version']
42
42
  major, minor = version.scan(/\d+/).map(&:to_i)
43
43
  fail Hawkular::Exception, fail_version_msg if major.nil? || minor.nil?
44
- @legacy_api = (major == 0 && minor < 16)
44
+ @legacy_api = (major.zero? && minor < 16)
45
45
  end
46
46
 
47
47
  # Construct a new Hawkular Metrics client class.
@@ -95,7 +95,7 @@ module Hawkular::Operations
95
95
  if args[:entrypoint]
96
96
  uri = URI.parse(args[:entrypoint].to_s)
97
97
  args[:host] = "#{uri.host}:#{uri.port}"
98
- args[:use_secure_connection] = %w(https wss).include?(uri.scheme) ? true : false
98
+ args[:use_secure_connection] = %w[https wss].include?(uri.scheme) ? true : false
99
99
  end
100
100
 
101
101
  fail Hawkular::ArgumentError, 'no parameter ":host" or ":entrypoint" given' if args[:host].nil?
@@ -153,7 +153,7 @@ module Hawkular::Operations
153
153
  # which the operation is about to run, feedId [String], operationName [String]
154
154
  # @param callback [Block] callback that is run after the operation is done
155
155
  def invoke_generic_operation(hash, &callback)
156
- required = [:resourceId, :feedId, :operationName]
156
+ required = %i[resourceId feedId operationName]
157
157
  check_pre_conditions hash, required, &callback
158
158
 
159
159
  invoke_operation_helper(hash, &callback)
@@ -168,7 +168,7 @@ module Hawkular::Operations
168
168
  # @param callback [Block] callback that is run after the operation is done
169
169
  def invoke_specific_operation(operation_payload, operation_name, &callback)
170
170
  fail Hawkular::ArgumentError, 'Operation must be specified' if operation_name.nil?
171
- required = [:resourceId, :feedId]
171
+ required = %i[resourceId feedId]
172
172
  check_pre_conditions operation_payload, required, &callback
173
173
 
174
174
  invoke_operation_helper(operation_payload, operation_name, &callback)
@@ -190,7 +190,7 @@ module Hawkular::Operations
190
190
  def add_deployment(hash, &callback)
191
191
  hash[:enabled] = hash.key?(:enabled) ? hash[:enabled] : true
192
192
  hash[:force_deploy] = hash.key?(:force_deploy) ? hash[:force_deploy] : false
193
- required = [:resource_id, :feed_id, :destination_file_name, :binary_content]
193
+ required = %i[resource_id feed_id destination_file_name binary_content]
194
194
  check_pre_conditions hash, required, &callback
195
195
 
196
196
  operation_payload = prepare_payload_hash([:binary_content], hash)
@@ -209,7 +209,7 @@ module Hawkular::Operations
209
209
  # @param callback [Block] callback that is run after the operation is done
210
210
  def undeploy(hash, &callback)
211
211
  hash[:remove_content] = hash.key?(:remove_content) ? hash[:remove_content] : true
212
- required = [:resource_id, :feed_id, :deployment_name]
212
+ required = %i[resource_id feed_id deployment_name]
213
213
  check_pre_conditions hash, required, &callback
214
214
 
215
215
  hash[:destination_file_name] = hash[:deployment_name]
@@ -228,7 +228,7 @@ module Hawkular::Operations
228
228
  #
229
229
  # @param callback [Block] callback that is run after the operation is done
230
230
  def enable_deployment(hash, &callback)
231
- required = [:resource_id, :feed_id, :deployment_name]
231
+ required = %i[resource_id feed_id deployment_name]
232
232
  check_pre_conditions hash, required, &callback
233
233
 
234
234
  hash[:destination_file_name] = hash[:deployment_name]
@@ -247,7 +247,7 @@ module Hawkular::Operations
247
247
  #
248
248
  # @param callback [Block] callback that is run after the operation is done
249
249
  def disable_deployment(hash, &callback)
250
- required = [:resource_id, :feed_id, :deployment_name]
250
+ required = %i[resource_id feed_id deployment_name]
251
251
  check_pre_conditions hash, required, &callback
252
252
 
253
253
  hash[:destination_file_name] = hash[:deployment_name]
@@ -266,7 +266,7 @@ module Hawkular::Operations
266
266
  #
267
267
  # @param callback [Block] callback that is run after the operation is done
268
268
  def restart_deployment(hash, &callback)
269
- required = [:resource_id, :feed_id, :deployment_name]
269
+ required = %i[resource_id feed_id deployment_name]
270
270
  check_pre_conditions hash, required, &callback
271
271
 
272
272
  hash[:destination_file_name] = hash[:deployment_name]
@@ -292,8 +292,8 @@ module Hawkular::Operations
292
292
  #
293
293
  # @param callback [Block] callback that is run after the operation is done
294
294
  def add_datasource(hash, &callback)
295
- required = [:resourceId, :feedId, :xaDatasource, :datasourceName, :jndiName, :driverName,
296
- :driverClass, :connectionUrl]
295
+ required = %i[resourceId feedId xaDatasource datasourceName jndiName
296
+ driverName driverClass connectionUrl]
297
297
  check_pre_conditions hash, required, &callback
298
298
 
299
299
  invoke_specific_operation(hash, 'AddDatasource', &callback)
@@ -312,8 +312,8 @@ module Hawkular::Operations
312
312
  #
313
313
  # @param callback [Block] callback that is run after the operation is done
314
314
  def add_jdbc_driver(hash, &callback)
315
- required = [:resource_id, :feed_id, :driver_jar_name, :driver_name, :module_name,
316
- :driver_class, :binary_content]
315
+ required = %i[resource_id feed_id driver_jar_name driver_name module_name
316
+ driver_class binary_content]
317
317
  check_pre_conditions hash, required, &callback
318
318
 
319
319
  operation_payload = prepare_payload_hash([:binary_content], hash)
@@ -351,7 +351,7 @@ module Hawkular::Operations
351
351
  #
352
352
  # @param callback [Block] callback that is run after the operation is done
353
353
  def update_collection_intervals(hash, &callback)
354
- required = [:resourceId, :feedId, :metricTypes, :availTypes]
354
+ required = %i[resourceId feedId metricTypes availTypes]
355
355
  check_pre_conditions hash, required, &callback
356
356
  invoke_specific_operation(hash, 'UpdateCollectionIntervals', &callback)
357
357
  end
@@ -424,15 +424,18 @@ module Hawkular::Operations
424
424
  def self.handle_error(parsed_message, &callback)
425
425
  callback.perform(:failure, parsed_message == {} ? 'error' : parsed_message[:data]['errorMessage'])
426
426
  end
427
+ private_class_method :handle_error
427
428
 
428
429
  def prepare_payload_hash(ignored_params, hash)
429
430
  # it filters out ignored params and convert keys from snake_case to camelCase
430
- Hash[hash.select { |k, _| !ignored_params.include? k }.map { |k, v| [to_camel_case(k.to_s).to_sym, v] }]
431
+ Hash[hash.reject { |k, _| ignored_params.include? k }.map { |k, v| [to_camel_case(k.to_s).to_sym, v] }]
431
432
  end
432
433
 
433
434
  def to_camel_case(str)
434
- ret = str.split('_').collect(&:capitalize).join
435
- ret[0, 1].downcase + ret[1..-1]
435
+ subs = str.split('_')
436
+ ret = subs.length > 1 ? subs.collect(&:capitalize).join : subs[0]
437
+ ret[0] = ret[0].downcase
438
+ ret
436
439
  end
437
440
  end
438
441
  end
@@ -0,0 +1,66 @@
1
+ require 'hawkular/base_client'
2
+ require 'hawkular/inventory/entities'
3
+ require 'ostruct'
4
+
5
+ module Hawkular::Prometheus
6
+ class Alerter < Hawkular::BaseClient
7
+ def initialize(entrypoint, credentials = {}, options = {})
8
+ @entrypoint = normalize_entrypoint_url entrypoint, 'hawkular/alerter'
9
+ super(@entrypoint, credentials, options)
10
+ end
11
+
12
+ def prometheus_entrypoint
13
+ rest_client('/prometheus/endpoint').get
14
+ end
15
+ end
16
+
17
+ # Interface to talk with the Prometheus server used for Middleware Manager
18
+ # @param entrypoint [String] base url of Hawkular Services
19
+ class Client < Hawkular::BaseClient
20
+ attr_reader :entrypoint
21
+
22
+ def initialize(entrypoint, credentials = {}, options = {})
23
+ prometheus_entrypoint = Alerter.new(entrypoint, credentials, options).prometheus_entrypoint
24
+ @entrypoint = normalize_entrypoint_url prometheus_entrypoint, 'api/v1'
25
+ super(@entrypoint, credentials, options)
26
+ end
27
+
28
+ def query(metrics: [], time: nil)
29
+ results = []
30
+ metrics.each do |metric|
31
+ query = metric['expression']
32
+ response = http_get "/query?start=#{time}&query=#{query}"
33
+ result = response['data']['result'].empty? ? {} : response['data']['result'].first
34
+ result['metric'] = metric
35
+ results << result
36
+ end
37
+ results
38
+ end
39
+
40
+ def query_range(metrics: [], starts: nil, ends: nil, step: nil)
41
+ results = []
42
+ metrics.each do |metric|
43
+ query = metric['expression']
44
+ response = http_get "/query_range?start=#{starts}&end=#{ends}&step=#{step}&query=#{query}"
45
+ result = response['data']['result'].empty? ? {} : response['data']['result'].first
46
+ result['metric'] = metric
47
+ results << result
48
+ end
49
+ results
50
+ end
51
+
52
+ def up_time(feed_id: nil, starts: nil, ends: nil, step: nil)
53
+ query = "up{feed_id=\"#{feed_id}\"}"
54
+ response = http_get "/query_range?start=#{starts}&end=#{ends}&step=#{step}&query=#{query}"
55
+ if response['data']['result'].empty?
56
+ []
57
+ else
58
+ response['data']['result'].first['values']
59
+ end
60
+ end
61
+
62
+ def ping
63
+ http_get '/query?query=up'
64
+ end
65
+ end
66
+ end
@@ -4,5 +4,5 @@
4
4
  # @see https://github.com/hawkular
5
5
  module Hawkular
6
6
  # Version of the Hawkular Ruby Gem
7
- VERSION = '5.0.0.pre1'.freeze
7
+ VERSION = '5.0.0.pre2'.freeze
8
8
  end
@@ -4,5 +4,6 @@ require 'hawkular/metrics/metrics_client'
4
4
  require 'hawkular/alerts/alerts_api'
5
5
  require 'hawkular/tokens/tokens_api'
6
6
  require 'hawkular/operations/operations_api'
7
+ require 'hawkular/prometheus/prometheus_api'
7
8
  require 'hawkular/base_client'
8
9
  require 'hawkular/hawkular_client'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hawkular-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0.pre1
4
+ version: 5.0.0.pre2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Libor Zoubek
@@ -11,22 +11,36 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2017-11-15 00:00:00.000000000 Z
14
+ date: 2020-09-03 00:00:00.000000000 Z
15
15
  dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: addressable
18
+ requirement: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
16
30
  - !ruby/object:Gem::Dependency
17
31
  name: rest-client
18
32
  requirement: !ruby/object:Gem::Requirement
19
33
  requirements:
20
34
  - - "~>"
21
35
  - !ruby/object:Gem::Version
22
- version: 2.0.0
36
+ version: '2.1'
23
37
  type: :runtime
24
38
  prerelease: false
25
39
  version_requirements: !ruby/object:Gem::Requirement
26
40
  requirements:
27
41
  - - "~>"
28
42
  - !ruby/object:Gem::Version
29
- version: 2.0.0
43
+ version: '2.1'
30
44
  - !ruby/object:Gem::Dependency
31
45
  name: websocket-client-simple
32
46
  requirement: !ruby/object:Gem::Requirement
@@ -42,21 +56,21 @@ dependencies:
42
56
  - !ruby/object:Gem::Version
43
57
  version: 0.3.0
44
58
  - !ruby/object:Gem::Dependency
45
- name: addressable
59
+ name: actionpack
46
60
  requirement: !ruby/object:Gem::Requirement
47
61
  requirements:
48
- - - ">="
62
+ - - "~>"
49
63
  - !ruby/object:Gem::Version
50
- version: '0'
51
- type: :runtime
64
+ version: '4'
65
+ type: :development
52
66
  prerelease: false
53
67
  version_requirements: !ruby/object:Gem::Requirement
54
68
  requirements:
55
- - - ">="
69
+ - - "~>"
56
70
  - !ruby/object:Gem::Version
57
- version: '0'
71
+ version: '4'
58
72
  - !ruby/object:Gem::Dependency
59
- name: shoulda
73
+ name: coveralls
60
74
  requirement: !ruby/object:Gem::Requirement
61
75
  requirements:
62
76
  - - ">="
@@ -70,33 +84,33 @@ dependencies:
70
84
  - !ruby/object:Gem::Version
71
85
  version: '0'
72
86
  - !ruby/object:Gem::Dependency
73
- name: rspec-rails
87
+ name: pry-byebug
74
88
  requirement: !ruby/object:Gem::Requirement
75
89
  requirements:
76
- - - "~>"
90
+ - - ">="
77
91
  - !ruby/object:Gem::Version
78
- version: '3.1'
92
+ version: '0'
79
93
  type: :development
80
94
  prerelease: false
81
95
  version_requirements: !ruby/object:Gem::Requirement
82
96
  requirements:
83
- - - "~>"
97
+ - - ">="
84
98
  - !ruby/object:Gem::Version
85
- version: '3.1'
99
+ version: '0'
86
100
  - !ruby/object:Gem::Dependency
87
- name: actionpack
101
+ name: rack
88
102
  requirement: !ruby/object:Gem::Requirement
89
103
  requirements:
90
104
  - - "~>"
91
105
  - !ruby/object:Gem::Version
92
- version: '4'
106
+ version: 1.6.4
93
107
  type: :development
94
108
  prerelease: false
95
109
  version_requirements: !ruby/object:Gem::Requirement
96
110
  requirements:
97
111
  - - "~>"
98
112
  - !ruby/object:Gem::Version
99
- version: '4'
113
+ version: 1.6.4
100
114
  - !ruby/object:Gem::Dependency
101
115
  name: rake
102
116
  requirement: !ruby/object:Gem::Requirement
@@ -112,49 +126,35 @@ dependencies:
112
126
  - !ruby/object:Gem::Version
113
127
  version: '11'
114
128
  - !ruby/object:Gem::Dependency
115
- name: simple-websocket-vcr
116
- requirement: !ruby/object:Gem::Requirement
117
- requirements:
118
- - - '='
119
- - !ruby/object:Gem::Version
120
- version: 0.1.0
121
- type: :development
122
- prerelease: false
123
- version_requirements: !ruby/object:Gem::Requirement
124
- requirements:
125
- - - '='
126
- - !ruby/object:Gem::Version
127
- version: 0.1.0
128
- - !ruby/object:Gem::Dependency
129
- name: yard
129
+ name: rspec-rails
130
130
  requirement: !ruby/object:Gem::Requirement
131
131
  requirements:
132
- - - ">="
132
+ - - "~>"
133
133
  - !ruby/object:Gem::Version
134
- version: '0'
134
+ version: '3.1'
135
135
  type: :development
136
136
  prerelease: false
137
137
  version_requirements: !ruby/object:Gem::Requirement
138
138
  requirements:
139
- - - ">="
139
+ - - "~>"
140
140
  - !ruby/object:Gem::Version
141
- version: '0'
141
+ version: '3.1'
142
142
  - !ruby/object:Gem::Dependency
143
- name: webmock
143
+ name: rubocop
144
144
  requirement: !ruby/object:Gem::Requirement
145
145
  requirements:
146
- - - "~>"
146
+ - - '='
147
147
  - !ruby/object:Gem::Version
148
- version: '3.0'
148
+ version: 0.51.0
149
149
  type: :development
150
150
  prerelease: false
151
151
  version_requirements: !ruby/object:Gem::Requirement
152
152
  requirements:
153
- - - "~>"
153
+ - - '='
154
154
  - !ruby/object:Gem::Version
155
- version: '3.0'
155
+ version: 0.51.0
156
156
  - !ruby/object:Gem::Dependency
157
- name: vcr
157
+ name: shoulda
158
158
  requirement: !ruby/object:Gem::Requirement
159
159
  requirements:
160
160
  - - ">="
@@ -168,21 +168,21 @@ dependencies:
168
168
  - !ruby/object:Gem::Version
169
169
  version: '0'
170
170
  - !ruby/object:Gem::Dependency
171
- name: rubocop
171
+ name: simple-websocket-vcr
172
172
  requirement: !ruby/object:Gem::Requirement
173
173
  requirements:
174
174
  - - '='
175
175
  - !ruby/object:Gem::Version
176
- version: 0.34.2
176
+ version: 0.1.0
177
177
  type: :development
178
178
  prerelease: false
179
179
  version_requirements: !ruby/object:Gem::Requirement
180
180
  requirements:
181
181
  - - '='
182
182
  - !ruby/object:Gem::Version
183
- version: 0.34.2
183
+ version: 0.1.0
184
184
  - !ruby/object:Gem::Dependency
185
- name: coveralls
185
+ name: vcr
186
186
  requirement: !ruby/object:Gem::Requirement
187
187
  requirements:
188
188
  - - ">="
@@ -196,21 +196,21 @@ dependencies:
196
196
  - !ruby/object:Gem::Version
197
197
  version: '0'
198
198
  - !ruby/object:Gem::Dependency
199
- name: rack
199
+ name: webmock
200
200
  requirement: !ruby/object:Gem::Requirement
201
201
  requirements:
202
202
  - - "~>"
203
203
  - !ruby/object:Gem::Version
204
- version: 1.6.4
204
+ version: '3.0'
205
205
  type: :development
206
206
  prerelease: false
207
207
  version_requirements: !ruby/object:Gem::Requirement
208
208
  requirements:
209
209
  - - "~>"
210
210
  - !ruby/object:Gem::Version
211
- version: 1.6.4
211
+ version: '3.0'
212
212
  - !ruby/object:Gem::Dependency
213
- name: pry-byebug
213
+ name: yard
214
214
  requirement: !ruby/object:Gem::Requirement
215
215
  requirements:
216
216
  - - ">="
@@ -223,7 +223,7 @@ dependencies:
223
223
  - - ">="
224
224
  - !ruby/object:Gem::Version
225
225
  version: '0'
226
- description: " A Ruby client for Hawkular\n"
226
+ description: A Ruby client for Hawkular
227
227
  email:
228
228
  - lzoubek@redhat.com
229
229
  - hrupp@redhat.com
@@ -250,6 +250,7 @@ files:
250
250
  - lib/hawkular/metrics/tenant_api.rb
251
251
  - lib/hawkular/metrics/types.rb
252
252
  - lib/hawkular/operations/operations_api.rb
253
+ - lib/hawkular/prometheus/prometheus_api.rb
253
254
  - lib/hawkular/tokens/tokens_api.rb
254
255
  - lib/hawkular/version.rb
255
256
  - lib/hawkularclient.rb
@@ -279,7 +280,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
279
280
  version: 1.3.1
280
281
  requirements: []
281
282
  rubyforge_project:
282
- rubygems_version: 2.6.11
283
+ rubygems_version: 2.6.14
283
284
  signing_key:
284
285
  specification_version: 4
285
286
  summary: A Ruby client for Hawkular