hawkular-client 3.0.2 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.rdoc +22 -0
- data/README.rdoc +1 -2
- data/lib/hawkular/alerts/alerts_api.rb +16 -15
- data/lib/hawkular/base_client.rb +22 -26
- data/lib/hawkular/client_utils.rb +18 -0
- data/lib/hawkular/hawkular_client.rb +37 -23
- data/lib/hawkular/inventory/entities.rb +85 -257
- data/lib/hawkular/inventory/inventory_api.rb +64 -412
- data/lib/hawkular/metrics/metric_api.rb +24 -17
- data/lib/hawkular/metrics/metrics_client.rb +4 -3
- data/lib/hawkular/operations/operations_api.rb +126 -81
- data/lib/hawkular/prometheus/prometheus_api.rb +66 -0
- data/lib/hawkular/version.rb +1 -1
- data/lib/hawkularclient.rb +1 -0
- metadata +56 -55
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e41fdf0699f44cfc71f223daa51bd936be6b6db7
|
4
|
+
data.tar.gz: 504979a3d89220826149247458d30d50fdbd783c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e75e32352cf4981d90ac6bf55cf177d489fe9e62fc3274a6ffbbc44500ed71c2a3fd702bc3e88fcab7a0c06ea1a7ba62dfa85636ee8a3fe0a532d35371d2dfd
|
7
|
+
data.tar.gz: c8d1e5fac46c5bacbdce0c007ff387545a23154ca4294ab6b277ab7865bfeefe10def5b86df63e6b35d64e0c0acbfdffe806102ae52f2004d49c59d0518b929a
|
data/CHANGES.rdoc
CHANGED
@@ -3,6 +3,28 @@
|
|
3
3
|
This document describes the relevant changes between releases of the
|
4
4
|
_hawkular-client_ project.
|
5
5
|
|
6
|
+
=== v 5.0.0.pre1
|
7
|
+
* Hawkular services version 0.40.x and Hawkular Agent 1.x will be the last
|
8
|
+
versions to include support for _inventory-on-metrics_ and Hawkular Metrics.
|
9
|
+
The following versions won't be backwards compatible. Right now, a new API
|
10
|
+
for inventory is already implemented. This pre-release of the client is
|
11
|
+
adding support for this new inventory API and removing all support for the
|
12
|
+
previous implementation. See link:api_breaking_changes.rdoc for more details.
|
13
|
+
* Because of the new inventory implementation, the _Operations_ client requires
|
14
|
+
the feed id to be sent on all operations. See link:api_breaking_changes.rdoc
|
15
|
+
for more details.
|
16
|
+
* Support for a _sender_request_id_ has been added to the _Operations_ client.
|
17
|
+
This allows to match operation requests with their respective operation result
|
18
|
+
websocket messages.
|
19
|
+
|
20
|
+
=== v 4.1.0
|
21
|
+
* Fixed binary data handling when invoking <em>Export JDR</em> on operations API.
|
22
|
+
* Added <em>delete_immediately</em> parameter to <em>Export JDR</em> operation.
|
23
|
+
|
24
|
+
=== v 4.0.0
|
25
|
+
* Standardized Exceptions under the Hawkular namespace, and the old names were deprecated, here is the list:
|
26
|
+
1. <code>Hawkular::BaseClient::HawkularException</code> -> <code>Hawkular::Exception</code>
|
27
|
+
2. <code>Hawkular::BaseClient::HawkularConnectionException</code> -> <code>Hawkular::ConnectionException</code>
|
6
28
|
|
7
29
|
=== v 3.0.2
|
8
30
|
* Adding <code>URI.unescape</code> in the <code>list_metrics_for_resource</code> method to fix the behavior of the method
|
data/README.rdoc
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
A Ruby Hawkular Client.
|
8
8
|
|
9
|
-
Documentation[http://www.hawkular.org/hawkular-client-ruby/
|
9
|
+
Documentation[http://www.hawkular.org/hawkular-client-ruby/]
|
10
10
|
|
11
11
|
== Changelog
|
12
12
|
|
@@ -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
|
-
|
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)
|
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, :
|
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 = [
|
431
|
-
|
432
|
-
|
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
|
-
@
|
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['
|
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
|
-
|
605
|
-
|
605
|
+
alias ackBy ack_by
|
606
|
+
alias resolvedBy resolved_by
|
606
607
|
end
|
607
608
|
|
608
609
|
# Representation of one event.
|
data/lib/hawkular/base_client.rb
CHANGED
@@ -3,12 +3,16 @@ require 'addressable/uri'
|
|
3
3
|
|
4
4
|
require 'hawkular/logger'
|
5
5
|
require 'hawkular/client_utils'
|
6
|
+
require 'erb'
|
6
7
|
|
7
8
|
module Hawkular
|
8
9
|
# This is the base functionality for all the clients,
|
9
10
|
# that inherit from it. You should not directly use it,
|
10
11
|
# but through the more specialized clients.
|
11
12
|
class BaseClient
|
13
|
+
HawkularException = Hawkular::Exception
|
14
|
+
HawkularConnectionException = Hawkular::ConnectionException
|
15
|
+
|
12
16
|
include ClientUtils
|
13
17
|
|
14
18
|
# @!visibility private
|
@@ -34,7 +38,11 @@ module Hawkular
|
|
34
38
|
|
35
39
|
@logger = Hawkular::Logger.new
|
36
40
|
|
37
|
-
fail 'You need to provide an entrypoint' if entrypoint.nil?
|
41
|
+
fail Hawkular::ArgumentError, 'You need to provide an entrypoint' if entrypoint.nil?
|
42
|
+
end
|
43
|
+
|
44
|
+
def url(url_format, *params)
|
45
|
+
url_format % params.map { |p| ERB::Util.url_encode(p) }
|
38
46
|
end
|
39
47
|
|
40
48
|
def http_get(suburl, headers = {})
|
@@ -87,7 +95,7 @@ module Hawkular
|
|
87
95
|
opts[:user] = @credentials[:username]
|
88
96
|
opts[:password] = @credentials[:password]
|
89
97
|
# strip @endpoint in case suburl is absolute
|
90
|
-
suburl = suburl[@entrypoint.length, suburl.length] if suburl
|
98
|
+
suburl = suburl[@entrypoint.length, suburl.length] if suburl =~ /^http/
|
91
99
|
RestClient::Resource.new(@entrypoint, opts)[suburl]
|
92
100
|
end
|
93
101
|
|
@@ -123,12 +131,12 @@ module Hawkular
|
|
123
131
|
# @param params [Hash] key-values pairs
|
124
132
|
# @return [String] complete query string to append to a base url, '' if no valid params
|
125
133
|
def generate_query_params(params = {})
|
126
|
-
params = params.
|
134
|
+
params = params.reject { |_k, v| v.nil? || ((v.instance_of? Array) && v.empty?) }
|
127
135
|
return '' if params.empty?
|
128
136
|
|
129
137
|
params.inject('?') do |ret, (k, v)|
|
130
138
|
ret += '&' unless ret == '?'
|
131
|
-
part =
|
139
|
+
part = v.instance_of?(Array) ? "#{k}=#{v.join(',')}" : "#{k}=#{v}"
|
132
140
|
ret + hawk_escape(part)
|
133
141
|
end
|
134
142
|
end
|
@@ -141,7 +149,8 @@ module Hawkular
|
|
141
149
|
# @param suffix_path [String] sufix path to be added if it doesn't exist
|
142
150
|
# @return [String] URL with path attached to it at the end
|
143
151
|
def normalize_entrypoint_url(entrypoint, suffix_path)
|
144
|
-
fail ArgumentError, 'suffix_path must not be empty' if suffix_path.empty?
|
152
|
+
fail Hawkular::ArgumentError, 'suffix_path must not be empty' if suffix_path.empty?
|
153
|
+
|
145
154
|
strip_path = suffix_path.gsub(%r{/$}, '')
|
146
155
|
strip_path.nil? || suffix_path = strip_path
|
147
156
|
strip_path = suffix_path.gsub(%r{^/}, '')
|
@@ -165,21 +174,6 @@ module Hawkular
|
|
165
174
|
url.to_s.sub(/^http(s?)/, 'ws\1')
|
166
175
|
end
|
167
176
|
|
168
|
-
# Specialized exception to be thrown
|
169
|
-
# when the interaction with Hawkular fails
|
170
|
-
class HawkularException < StandardError
|
171
|
-
def initialize(message, status_code = 0)
|
172
|
-
@message = message
|
173
|
-
@status_code = status_code
|
174
|
-
super(message)
|
175
|
-
end
|
176
|
-
|
177
|
-
attr_reader :message, :status_code
|
178
|
-
end
|
179
|
-
|
180
|
-
class HawkularConnectionException < HawkularException
|
181
|
-
end
|
182
|
-
|
183
177
|
def admin_header
|
184
178
|
headers = {}
|
185
179
|
headers[:'Hawkular-Admin-Token'] = @admin_token unless @admin_token.nil?
|
@@ -201,17 +195,18 @@ module Hawkular
|
|
201
195
|
# @!visibility private
|
202
196
|
def connect_error(fault)
|
203
197
|
if fault.is_a?(SocketError)
|
204
|
-
|
198
|
+
Hawkular::ConnectionException.new(fault.to_s)
|
205
199
|
elsif [Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::EHOSTUNREACH,
|
206
200
|
Errno::EADDRNOTAVAIL, Errno::ENETDOWN, Errno::ENETUNREACH,
|
207
201
|
Errno::ETIMEDOUT].include?(fault.class)
|
208
|
-
|
202
|
+
Hawkular::ConnectionException.new(fault.to_s, fault.class::Errno)
|
209
203
|
end
|
210
204
|
end
|
211
205
|
|
212
206
|
def handle_fault(f)
|
213
207
|
http_code = (f.respond_to?(:http_code) ? f.http_code : 0)
|
214
|
-
fail
|
208
|
+
fail Hawkular::Exception.new('Unauthorized', http_code) if f.instance_of? RestClient::Unauthorized
|
209
|
+
|
215
210
|
if f.respond_to?(:http_body) && !f.http_body.nil?
|
216
211
|
begin
|
217
212
|
json_body = JSON.parse(f.http_body)
|
@@ -219,11 +214,12 @@ module Hawkular
|
|
219
214
|
rescue JSON::ParserError
|
220
215
|
fault_message = f.http_body
|
221
216
|
end
|
222
|
-
|
217
|
+
|
218
|
+
fail Hawkular::Exception.new(fault_message, http_code)
|
223
219
|
elsif (connect_error_exception = connect_error(f))
|
224
|
-
fail connect_error_exception
|
220
|
+
fail Hawkular::ConnectionException, connect_error_exception
|
225
221
|
else
|
226
|
-
fail f
|
222
|
+
fail Hawkular::Exception, f
|
227
223
|
end
|
228
224
|
end
|
229
225
|
end
|
@@ -1,4 +1,22 @@
|
|
1
1
|
module Hawkular
|
2
|
+
# Specialized exception to be thrown
|
3
|
+
# when the interaction with Hawkular fails
|
4
|
+
class Exception < StandardError
|
5
|
+
def initialize(message, status_code = 0)
|
6
|
+
@message = message
|
7
|
+
@status_code = status_code
|
8
|
+
super(message)
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :message, :status_code
|
12
|
+
end
|
13
|
+
|
14
|
+
class ConnectionException < Hawkular::Exception
|
15
|
+
end
|
16
|
+
|
17
|
+
class ArgumentError < Hawkular::Exception
|
18
|
+
end
|
19
|
+
|
2
20
|
module ClientUtils
|
3
21
|
# Escapes the passed url part. This is necessary,
|
4
22
|
# as many ids inside Hawkular can contain characters
|
@@ -1,48 +1,42 @@
|
|
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] ||= {}
|
15
|
-
|
13
|
+
|
14
|
+
fail Hawkular::ArgumentError, 'no parameter ":entrypoint" given' if hash[:entrypoint].nil?
|
15
|
+
|
16
16
|
@state = hash
|
17
17
|
end
|
18
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
|
+
|
19
29
|
def method_missing(name, *args, &block)
|
20
|
-
|
21
|
-
|
22
|
-
when /^metrics_/ then metrics
|
23
|
-
when /^alerts_/ then alerts
|
24
|
-
when /^operations_/ then operations
|
25
|
-
when /^tokens_/ then tokens
|
26
|
-
else
|
27
|
-
fail "unknown method prefix `#{name}`, allowed prefixes:"\
|
28
|
-
'`inventory_`, `metrics_`,`alerts_`,`operations_`, `tokens_`'
|
29
|
-
end
|
30
|
-
method = name.to_s.sub(/^[^_]+_/, '')
|
31
|
-
delegate_client.__send__(method, *args, &block)
|
30
|
+
super unless respond_to?(name)
|
31
|
+
client_for_method(name).__send__(submethod_name_for(name), *args, &block)
|
32
32
|
end
|
33
33
|
|
34
34
|
def inventory
|
35
|
-
@inventory ||= Inventory::Client.new("#{@state[:entrypoint]}/hawkular/
|
35
|
+
@inventory ||= Inventory::Client.new("#{@state[:entrypoint]}/hawkular/inventory",
|
36
36
|
@state[:credentials],
|
37
37
|
@state[:options])
|
38
38
|
end
|
39
39
|
|
40
|
-
def metrics
|
41
|
-
@metrics ||= Metrics::Client.new("#{@state[:entrypoint]}/hawkular/metrics",
|
42
|
-
@state[:credentials],
|
43
|
-
@state[:options])
|
44
|
-
end
|
45
|
-
|
46
40
|
def alerts
|
47
41
|
@alerts ||= Alerts::Client.new("#{@state[:entrypoint]}/hawkular/alerts",
|
48
42
|
@state[:credentials],
|
@@ -62,6 +56,12 @@ module Hawkular
|
|
62
56
|
@state[:options])
|
63
57
|
end
|
64
58
|
|
59
|
+
def prometheus
|
60
|
+
@prometheus ||= Prometheus::Client.new(@state[:entrypoint],
|
61
|
+
@state[:credentials],
|
62
|
+
@state[:options])
|
63
|
+
end
|
64
|
+
|
65
65
|
private
|
66
66
|
|
67
67
|
# this is in a dedicated method, because constructor opens the websocket connection to make the handshake
|
@@ -70,5 +70,19 @@ module Hawkular
|
|
70
70
|
credentials: @state[:credentials],
|
71
71
|
options: @state[:options])
|
72
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
|
73
87
|
end
|
74
88
|
end
|
@@ -1,306 +1,134 @@
|
|
1
1
|
# It contains class definitions that are used by the inventory REST client
|
2
2
|
module Hawkular::Inventory
|
3
|
-
|
4
|
-
|
5
|
-
# @return [String] Full path of the entity
|
6
|
-
attr_reader :path
|
7
|
-
# @return [String] Name of the entity
|
3
|
+
class Metric
|
4
|
+
# @return [String] Provider Name of the metric
|
8
5
|
attr_reader :name
|
9
|
-
# @return [String]
|
10
|
-
attr_reader :
|
11
|
-
# @return [String]
|
12
|
-
attr_reader :
|
13
|
-
# @return [String]
|
14
|
-
attr_reader :
|
15
|
-
# @return [String]
|
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
|
12
|
+
# @return [String] Unit of the metric
|
13
|
+
attr_reader :unit
|
14
|
+
# @return [Hash<String,String>] Labels of this metric (Prometheus labels)
|
15
|
+
attr_reader :labels
|
16
|
+
# @return [Hash<String,String>] Properties of this metric
|
16
17
|
attr_reader :properties
|
17
18
|
|
18
19
|
def initialize(hash)
|
19
|
-
@
|
20
|
-
@
|
21
|
-
@
|
20
|
+
@name = hash['displayName']
|
21
|
+
@display_name = hash['displayName']
|
22
|
+
@family = hash['family']
|
23
|
+
@expression = hash['expression']
|
24
|
+
@unit = hash['unit']
|
25
|
+
@labels = hash['labels'] || {}
|
22
26
|
@properties = hash['properties'] || {}
|
23
27
|
@_hash = hash.dup
|
24
|
-
|
25
|
-
return if @path.nil?
|
26
|
-
|
27
|
-
tmp = @path.split('/')
|
28
|
-
tmp.each do |pair|
|
29
|
-
(key, val) = pair.split(';')
|
30
|
-
case key
|
31
|
-
when 'f'
|
32
|
-
@feed = val
|
33
|
-
when 'e'
|
34
|
-
@env = val
|
35
|
-
end
|
36
|
-
end
|
37
28
|
end
|
38
29
|
|
39
|
-
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
# Returns a hash representation of the resource type
|
44
|
-
# @return [Hash<String,Object>] hash of the type
|
30
|
+
# Returns a hash representation of the metric type
|
31
|
+
# @return [Hash<String,Object>] hash of the metric type
|
45
32
|
def to_h
|
46
33
|
@_hash.dup
|
47
34
|
end
|
48
35
|
end
|
49
36
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
# (more or less) the same.
|
54
|
-
class ResourceType < BaseEntity
|
55
|
-
def initialize(rt_hash)
|
56
|
-
super(rt_hash)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
# A Resource is an instantiation of a {ResourceType}
|
61
|
-
class Resource < BaseEntity
|
62
|
-
# @return [String] Full path of the {ResourceType}
|
63
|
-
attr_reader :type_path
|
64
|
-
|
65
|
-
def initialize(res_hash)
|
66
|
-
super(res_hash)
|
67
|
-
if res_hash.key? :resourceTypePath
|
68
|
-
@type_path = res_hash[:resourceTypePath]
|
69
|
-
elsif res_hash.key? 'resourceTypePath'
|
70
|
-
@type_path = res_hash['resourceTypePath']
|
71
|
-
else
|
72
|
-
@type = res_hash['type']
|
73
|
-
@type_path = res_hash['type']['path']
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
# Fields that are common for MetricType and Metric
|
79
|
-
module MetricFields
|
80
|
-
# @return [String] GAUGE, COUNTER, etc.
|
81
|
-
attr_reader :type
|
82
|
-
# @return [String] metric unit such as NONE, BYTES, etc.
|
83
|
-
attr_reader :unit
|
84
|
-
# @return [Long] collection interval in seconds, it has different semantics for MetricType and for Metric
|
85
|
-
# for MetricType it's a default that will be applied to all the metric of that type,
|
86
|
-
# in the Metric this can be overridden
|
87
|
-
attr_reader :collection_interval
|
88
|
-
end
|
89
|
-
|
90
|
-
# Definition of a Metric Type inside the inventory.
|
91
|
-
class MetricType < BaseEntity
|
92
|
-
include MetricFields
|
93
|
-
|
94
|
-
def initialize(type_hash)
|
95
|
-
super(type_hash)
|
96
|
-
@type = type_hash['type']
|
97
|
-
@unit = type_hash['unit']
|
98
|
-
@collection_interval = type_hash['collectionInterval']
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
# Definition of a Metric inside the inventory.
|
103
|
-
class Metric < BaseEntity
|
104
|
-
include MetricFields
|
105
|
-
|
106
|
-
attr_reader :type_id
|
107
|
-
# @return [String] metric id used in Hawkular Metrics
|
108
|
-
attr_reader :hawkular_metric_id
|
109
|
-
|
110
|
-
def initialize(metric_hash, metric_type)
|
111
|
-
super(metric_hash)
|
112
|
-
@type = metric_type.type
|
113
|
-
@type_path = metric_hash['metricTypePath']
|
114
|
-
@type_id = metric_type.id
|
115
|
-
@unit = metric_type.unit
|
116
|
-
@collection_interval = metric_hash['collectionInterval'] || metric_type.collection_interval
|
117
|
-
@hawkular_metric_id = @properties.key?('hawkular-metric-id') ? @properties['hawkular-metric-id'] : @id
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
class OperationDefinition < BaseEntity
|
37
|
+
class Operation
|
38
|
+
# @return [String] Name of the operation
|
39
|
+
attr_reader :name
|
122
40
|
attr_reader :params
|
123
41
|
|
124
42
|
def initialize(op_hash)
|
125
|
-
|
126
|
-
@params =
|
43
|
+
@name = op_hash['name']
|
44
|
+
@params = op_hash.key?('parameters') ? op_hash['parameters'] : {}
|
127
45
|
end
|
128
46
|
end
|
129
47
|
|
130
|
-
|
131
|
-
|
132
|
-
attr_accessor :source_id
|
133
|
-
attr_reader :target_id
|
134
|
-
attr_reader :properties
|
135
|
-
attr_reader :name
|
48
|
+
class ResourceType
|
49
|
+
# @return [String] Id of the resource type
|
136
50
|
attr_reader :id
|
51
|
+
# @return [Hash<String,String>] Properties of this resource type
|
52
|
+
attr_reader :properties
|
53
|
+
# @return [List<Operation>] Operations associated with this type
|
54
|
+
attr_reader :operations
|
137
55
|
|
138
|
-
def initialize(hash
|
139
|
-
if hash.empty?
|
140
|
-
@properties = {}
|
141
|
-
return
|
142
|
-
end
|
143
|
-
|
144
|
-
@source_id = hash['source']
|
145
|
-
@target_id = hash['target']
|
146
|
-
@properties = hash['properties']
|
147
|
-
@name = hash['name']
|
56
|
+
def initialize(hash)
|
148
57
|
@id = hash['id']
|
58
|
+
@properties = hash['properties'] || {}
|
59
|
+
@operations = (hash['operations'] || []).map { |op| Operation.new(op) }
|
60
|
+
@_hash = hash.dup
|
61
|
+
end
|
62
|
+
|
63
|
+
def ==(other)
|
64
|
+
equal?(other) || other.class == self.class && other.id == @id
|
149
65
|
end
|
150
66
|
|
67
|
+
# Returns a hash representation of the resource type
|
68
|
+
# @return [Hash<String,Object>] hash of the resource type
|
151
69
|
def to_h
|
152
|
-
|
153
|
-
hash['source'] = @source_id
|
154
|
-
hash['target'] = @target_id
|
155
|
-
hash['properties'] = @properties
|
156
|
-
hash['name'] = @name
|
157
|
-
hash['id'] = @id
|
158
|
-
hash
|
70
|
+
@_hash.dup
|
159
71
|
end
|
160
72
|
end
|
161
73
|
|
162
|
-
class
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
attr_reader :
|
167
|
-
|
168
|
-
attr_reader :
|
169
|
-
|
170
|
-
attr_reader :
|
171
|
-
|
74
|
+
class Resource
|
75
|
+
# @return [String] Id of the entity
|
76
|
+
attr_reader :id
|
77
|
+
# @return [String] Name of the entity
|
78
|
+
attr_reader :name
|
79
|
+
# @return [String] Feed this entity belongs to
|
80
|
+
attr_reader :feed
|
81
|
+
# @return [ResourceType] Type of this resource
|
82
|
+
attr_reader :type
|
83
|
+
# @return [String] Parent ID of this entity (nil if it's a root resource)
|
84
|
+
attr_reader :parent_id
|
85
|
+
# @return [Hash<String,String>] Properties of this resource
|
86
|
+
attr_reader :properties
|
87
|
+
# @return [Hash<String,String>] Config map of this resource
|
88
|
+
attr_reader :config
|
172
89
|
|
173
90
|
def initialize(hash)
|
174
|
-
@
|
175
|
-
@
|
176
|
-
@
|
177
|
-
@
|
178
|
-
@
|
179
|
-
@
|
180
|
-
@
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
fail 'CanonicalPath must not be nil or empty' if path.to_s.strip.length == 0
|
185
|
-
CanonicalPath.new(path_to_h path)
|
186
|
-
end
|
187
|
-
|
188
|
-
def self.parse_if_string(path)
|
189
|
-
path.is_a?(CanonicalPath) ? path : CanonicalPath.parse(path)
|
190
|
-
end
|
191
|
-
|
192
|
-
def copy_hash
|
193
|
-
hash = to_h
|
194
|
-
hash[:resource_ids] = hash[:resource_ids].clone unless hash[:resource_ids].nil?
|
195
|
-
hash
|
91
|
+
@id = hash['id']
|
92
|
+
@name = hash['name']
|
93
|
+
@feed = hash['feedId']
|
94
|
+
@type = ResourceType.new(hash['type'])
|
95
|
+
@parent_id = hash['parentId']
|
96
|
+
@properties = hash['properties'] || {}
|
97
|
+
@config = hash['config'] || {}
|
98
|
+
@metrics = (hash['metrics'] || []).map { |m| Metric.new(m) }
|
99
|
+
@children = hash['children'].map { |r| Resource.new(r) } if hash.key? 'children'
|
100
|
+
@_hash = hash.dup
|
196
101
|
end
|
197
102
|
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
hash[:resource_ids] = res
|
205
|
-
CanonicalPath.new(hash)
|
103
|
+
def children(recursive = false)
|
104
|
+
return @children unless recursive == true
|
105
|
+
fail Hawkular::ArgumentError 'Resource tree not loaded, load it by calling resource_tree' if @children.nil?
|
106
|
+
@children.flat_map do |child|
|
107
|
+
[child, *child.children(recursive)]
|
108
|
+
end
|
206
109
|
end
|
207
110
|
|
208
|
-
|
209
|
-
|
210
|
-
def down(resource)
|
211
|
-
hash = copy_hash
|
212
|
-
hash[:resource_ids] = (hash[:resource_ids] || []) << hawk_escape_id(resource)
|
213
|
-
CanonicalPath.new(hash)
|
111
|
+
def children_by_type(type, recursive = false)
|
112
|
+
children(recursive).select { |c| c.type.id == type }
|
214
113
|
end
|
215
114
|
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
hash = copy_hash
|
220
|
-
hash[:resource_type_id] = hawk_escape_id(resource_type)
|
221
|
-
CanonicalPath.new(hash)
|
115
|
+
def metrics(recursive = false)
|
116
|
+
return @metrics unless recursive == true
|
117
|
+
children(recursive).collect(&:metrics).flat_map(&:itself).concat(@metrics)
|
222
118
|
end
|
223
119
|
|
224
|
-
|
225
|
-
|
226
|
-
def metric_type(metric_type)
|
227
|
-
hash = copy_hash
|
228
|
-
hash[:metric_type_id] = hawk_escape_id(metric_type)
|
229
|
-
CanonicalPath.new(hash)
|
120
|
+
def metrics_by_family(family)
|
121
|
+
@metrics.select { |m| m.family == family }
|
230
122
|
end
|
231
123
|
|
232
124
|
def ==(other)
|
233
|
-
|
125
|
+
equal?(other) || other.class == self.class && other.id == @id
|
234
126
|
end
|
235
127
|
|
128
|
+
# Returns a hash representation of the resource
|
129
|
+
# @return [Hash<String,Object>] hash of the resource
|
236
130
|
def to_h
|
237
|
-
|
238
|
-
tenant_id: @tenant_id,
|
239
|
-
feed_id: @feed_id,
|
240
|
-
environment_id: environment_id,
|
241
|
-
resource_type_id: resource_type_id,
|
242
|
-
metric_type_id: metric_type_id,
|
243
|
-
resource_ids: resource_ids,
|
244
|
-
metric_id: @metric_id
|
245
|
-
}
|
246
|
-
end
|
247
|
-
|
248
|
-
def to_s
|
249
|
-
ret = "/t;#{@tenant_id}"
|
250
|
-
ret += "/f;#{@feed_id}" unless @feed_id.nil?
|
251
|
-
ret += "/e;#{@environment_id}" unless @environment_id.nil?
|
252
|
-
ret += "/rt;#{@resource_type_id}" unless @resource_type_id.nil?
|
253
|
-
ret += "/mt;#{@metric_type_id}" unless @metric_type_id.nil?
|
254
|
-
ret += resources_chunk.to_s
|
255
|
-
ret += "/m;#{@metric_id}" unless @metric_id.nil?
|
256
|
-
ret
|
257
|
-
end
|
258
|
-
|
259
|
-
def to_tags
|
260
|
-
fail 'Missing feed_id' if @feed_id.nil?
|
261
|
-
tags = "module:inventory,feed:#{Regexp.quote(@feed_id)}"
|
262
|
-
tags += ",type:rt,id:#{Regexp.quote(@resource_type_id)}" if @resource_type_id
|
263
|
-
tags += ",type:mt,id:#{Regexp.quote(@metric_type_id)}" if @metric_type_id
|
264
|
-
tags += ",type:r,id:#{Regexp.quote(@resource_ids[0])}" if @resource_ids && (!@resource_ids.empty?)
|
265
|
-
tags
|
266
|
-
end
|
267
|
-
|
268
|
-
protected
|
269
|
-
|
270
|
-
def state
|
271
|
-
[@tenant_id, @feed_id, @environment_id, @resource_ids, @metric_id, @metric_type_id, @resource_type_id]
|
272
|
-
end
|
273
|
-
|
274
|
-
private
|
275
|
-
|
276
|
-
def resources_chunk
|
277
|
-
@resource_ids.map { |r| "/r;#{r}" }.join unless @resource_ids.nil?
|
278
|
-
end
|
279
|
-
|
280
|
-
def self.path_to_h(path)
|
281
|
-
tmp = path.split('/')
|
282
|
-
hash = {}
|
283
|
-
tmp.each do |pair|
|
284
|
-
(key, val) = pair.split(';')
|
285
|
-
case key
|
286
|
-
when 't'
|
287
|
-
hash[:tenant_id] = val
|
288
|
-
when 'f'
|
289
|
-
hash[:feed_id] = val
|
290
|
-
when 'e'
|
291
|
-
hash[:environment_id] = val
|
292
|
-
when 'm'
|
293
|
-
hash[:metric_id] = val
|
294
|
-
when 'r'
|
295
|
-
hash[:resource_ids] = [] if hash[:resource_ids].nil?
|
296
|
-
hash[:resource_ids].push(val)
|
297
|
-
when 'mt'
|
298
|
-
hash[:metric_type_id] = val
|
299
|
-
when 'rt'
|
300
|
-
hash[:resource_type_id] = val
|
301
|
-
end
|
302
|
-
end
|
303
|
-
hash
|
131
|
+
@_hash.dup
|
304
132
|
end
|
305
133
|
end
|
306
134
|
end
|