hawkular-client 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +3 -3
- data/CHANGES.rdoc +8 -0
- data/README.rdoc +12 -5
- data/hawkularclient.gemspec +2 -2
- data/lib/alerts/alerts_api.rb +193 -0
- data/lib/{hawkularclient.rb → hawkular.rb} +93 -52
- data/lib/hawkular_all.rb +7 -0
- data/lib/inventory/inventory_api.rb +378 -0
- data/lib/metrics/metric_api.rb +20 -10
- data/lib/metrics/metrics_client.rb +52 -0
- data/lib/metrics/tenant_api.rb +1 -1
- data/lib/metrics/version.rb +3 -1
- data/lib/version.rb +8 -0
- data/spec/integration/alerts_spec.rb +143 -0
- data/spec/integration/inventory_spec.rb +191 -0
- data/spec/integration/metric_spec.rb +33 -0
- data/spec/spec_helper.rb +14 -1
- data/spec/unit/base_spec.rb +57 -0
- data/spec/vcr_cassettes/Alert/Alerts/Should_acknowledge_an_alert.yml +183 -0
- data/spec/vcr_cassettes/Alert/Alerts/Should_fetch_single_alert.yml +69 -0
- data/spec/vcr_cassettes/Alert/Alerts/Should_list_alerts.yml +85 -0
- data/spec/vcr_cassettes/Alert/Alerts/Should_list_alerts_for_trigger.yml +142 -0
- data/spec/vcr_cassettes/Alert/Alerts/Should_list_alerts_for_unknown_trigger.yml +46 -0
- data/spec/vcr_cassettes/Alert/Alerts/Should_resolve_an_alert.yml +181 -0
- data/spec/vcr_cassettes/Alert/Alerts/Should_resolve_an_alert2.yml +49 -0
- data/spec/vcr_cassettes/Alert/Triggers/Should_List_Triggers.yml +62 -0
- data/spec/vcr_cassettes/Alert/Triggers/Should_List_Triggers_for_ID.yml +55 -0
- data/spec/vcr_cassettes/Alert/Triggers/Should_List_Triggers_for_Tag.yml +68 -0
- data/spec/vcr_cassettes/Alert/Triggers/Should_List_Triggers_for_Tags.yml +68 -0
- data/spec/vcr_cassettes/Alert/Triggers/Should_get_a_single_Trigger_with_conditions.yml +138 -0
- data/spec/vcr_cassettes/Alert/Triggers/Should_get_a_single_metric_Trigger.yml +50 -0
- data/spec/vcr_cassettes/Gauge_metrics/Platform_mem.yml +44 -0
- data/spec/vcr_cassettes/Gauge_metrics/Platform_mem_def.yml +45 -0
- data/spec/vcr_cassettes/Inventory/Should_List_datasources_with_no_props.yml +228 -0
- data/spec/vcr_cassettes/Inventory/Should_list_URLs.yml +105 -0
- data/spec/vcr_cassettes/Inventory/Should_list_WildFlys.yml +104 -0
- data/spec/vcr_cassettes/Inventory/Should_list_WildFlys_with_props.yml +162 -0
- data/spec/vcr_cassettes/Inventory/Should_list_children_of_WildFly.yml +180 -0
- data/spec/vcr_cassettes/Inventory/Should_list_feeds.yml +102 -0
- data/spec/vcr_cassettes/Inventory/Should_list_heap_metrics_for_WildFlys.yml +308 -0
- data/spec/vcr_cassettes/Inventory/Should_list_metrics_for_WildFlys.yml +172 -0
- data/spec/vcr_cassettes/Inventory/Should_list_types_with_bad_feed.yml +101 -0
- data/spec/vcr_cassettes/Inventory/Should_list_types_with_feed.yml +109 -0
- data/spec/vcr_cassettes/Inventory/Should_list_types_without_feed.yml +110 -0
- data/spec/vcr_cassettes/Metrics/Status.yml +44 -0
- data/spec/vcr_cassettes/No_Tenant/Should_fail.yml +42 -0
- data/spec/vcr_cassettes/Tenants/Should_Get_Tenant_For_Explicit_Credentials.yml +50 -0
- data/spec/vcr_cassettes/Tenants/Should_Get_Tenant_For_Implicit_Credentials.yml +50 -0
- metadata +74 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed7c1be5e375b0389cf9a4849fb45c78641becd0
|
4
|
+
data.tar.gz: 03c792250b1ba9ed81c25f9ecda174b983c843e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b5b8f44790e31b63e0574a4d09b510de537275f121d88e93712e24fc33c1e7543ace9e9539f1beb410ff70f1fce8148edee7b4b7431601d7341407f820d4c05c
|
7
|
+
data.tar.gz: b77f46b103e59f10d7568dd1c96de81399192a01fe1fef2038d0f3635fbb8d1a545bcedc785b52bf60cbfea0d29a94eaa2a92f39b7e20f7c6e166057d770bd97
|
data/.travis.yml
CHANGED
data/CHANGES.rdoc
CHANGED
@@ -3,6 +3,14 @@
|
|
3
3
|
This document describes the relevant changes beween releases of the
|
4
4
|
_hawkular-client_ project.
|
5
5
|
|
6
|
+
=== V 0.2.0
|
7
|
+
|
8
|
+
* Add support for Hawkular-Inventory and Hawkular-Alerts
|
9
|
+
* Reshuffeling of inner classes
|
10
|
+
* The sub-url that is passed to `http_*` methods is escaped via
|
11
|
+
`Addressable::URI.escape()`
|
12
|
+
|
13
|
+
|
6
14
|
=== V 0.1.2
|
7
15
|
|
8
16
|
* Fix exception handling - this was missing `require 'English'`
|
data/README.rdoc
CHANGED
@@ -10,14 +10,21 @@ A Ruby Hawkular Client.
|
|
10
10
|
* Start a feature/bugfix branch
|
11
11
|
* Commit and push until you are happy with your contribution
|
12
12
|
* Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
|
13
|
-
*
|
13
|
+
* Run your code through RuboCop (which is default when running `rake`) and fix complaints.
|
14
|
+
* When you open a pull request, watch out for failures on Travis.
|
15
|
+
* Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is
|
16
|
+
otherwise necessary, that is fine, but please isolate to its own commit so we can cherry-pick around it.
|
14
17
|
|
15
18
|
== Running the tests
|
16
19
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
*
|
20
|
+
Integration tests are recorded and played against cassettes recorded with VCR
|
21
|
+
(http://www.relishapp.com/vcr/vcr/docs)
|
22
|
+
|
23
|
+
* Edit the endpoint properties in the file `spec/endpoint.yml`(user, password and host name) if needed
|
24
|
+
* From command line run
|
25
|
+
rake spec
|
26
|
+
* To run the tests against a live server, set VCR_OFF to 1 as in
|
27
|
+
VCR_OFF=1 rake spec
|
21
28
|
|
22
29
|
== Logging
|
23
30
|
|
data/hawkularclient.gemspec
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require '
|
4
|
+
require 'version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |gem|
|
7
7
|
gem.name = 'hawkular-client'
|
8
|
-
gem.version = Hawkular::
|
8
|
+
gem.version = Hawkular::VERSION
|
9
9
|
gem.authors = ['Libor Zoubek', 'Heiko W. Rupp', 'Federico Simoncelli']
|
10
10
|
gem.email = %w(lzoubek@redhat.com hrupp@redhat.com)
|
11
11
|
gem.homepage = 'https://github.com/hawkular/hawkular-client-ruby'
|
@@ -0,0 +1,193 @@
|
|
1
|
+
require 'hawkular'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
# Alerts module provides access to Hawkular-Alerts.
|
5
|
+
# There are two main parts here: Triggers, that define alertable conditions
|
6
|
+
# and Alerts that represent a fired trigger.
|
7
|
+
# @see http://www.hawkular.org/docs/rest/rest-alerts.html
|
8
|
+
module Hawkular::Alerts
|
9
|
+
# Interface to use to talk to the Hawkular-Alerts component.
|
10
|
+
# @param entrypoint [String] base url of Hawkular-Alerts - e.g
|
11
|
+
# http://localhost:8080/hawkular/alerts
|
12
|
+
# @param credentials [Hash{String=>String}] Hash of username, password, token(optional)
|
13
|
+
class AlertsClient < Hawkular::BaseClient
|
14
|
+
def initialize(entrypoint = nil, credentials = {})
|
15
|
+
@entrypoint = entrypoint
|
16
|
+
|
17
|
+
super(entrypoint, credentials)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Lists defined triggers in the system
|
21
|
+
# @param [Array] ids List of trigger ids. If provided, limits to the given triggers
|
22
|
+
# @param [Array] tags List of tags. If provided, limits to the given tags. Individual
|
23
|
+
# tags are of the format # key|value. Tags are OR'd together. If a tag-key shows up
|
24
|
+
# more than once, only the last one is accepted
|
25
|
+
# @return [Array<Trigger>] Triggers found
|
26
|
+
def list_triggers(ids = [], tags = [])
|
27
|
+
query = generate_query_params 'triggerIds' => ids, 'tags' => tags
|
28
|
+
sub_url = '/triggers' + query
|
29
|
+
|
30
|
+
ret = http_get(sub_url)
|
31
|
+
|
32
|
+
val = []
|
33
|
+
ret.each { |t| val.push(Trigger.new(t)) }
|
34
|
+
val
|
35
|
+
end
|
36
|
+
|
37
|
+
# Obtains one Trigger definition from the server.
|
38
|
+
# @param [String] trigger_id Id of the trigger to fetch
|
39
|
+
# @param full If true then conditions and dampenings for the trigger are also fetched
|
40
|
+
# @return [Trigger] the selected trigger
|
41
|
+
def get_single_trigger(trigger_id, full = false)
|
42
|
+
the_trigger = '/triggers/' + trigger_id
|
43
|
+
ret = http_get(the_trigger)
|
44
|
+
trigger = Trigger.new(ret)
|
45
|
+
|
46
|
+
if full
|
47
|
+
ret = http_get(the_trigger + '/conditions')
|
48
|
+
ret.each { |c| trigger.conditions.push(Trigger::Condition.new(c)) }
|
49
|
+
ret = http_get(the_trigger + '/dampenings')
|
50
|
+
ret.each { |c| trigger.dampenings.push(Trigger::Dampening.new(c)) }
|
51
|
+
end
|
52
|
+
|
53
|
+
trigger
|
54
|
+
end
|
55
|
+
|
56
|
+
# Obtain the alerts for the Trigger with the passed id
|
57
|
+
# @param [String] trigger_id Id of the trigger that has fired the alerts
|
58
|
+
# @return [Array<Alert>] List of alerts for the trigger. Can be empty
|
59
|
+
def get_alerts_for_trigger(trigger_id) # TODO: add additional filters
|
60
|
+
return [] unless trigger_id
|
61
|
+
|
62
|
+
url = '/?triggerIds=' + trigger_id
|
63
|
+
ret = http_get(url)
|
64
|
+
val = []
|
65
|
+
ret.each { |a| val.push(Alert.new(a)) }
|
66
|
+
val
|
67
|
+
end
|
68
|
+
|
69
|
+
# List fired alerts
|
70
|
+
# @return [Array<Alert>] List of alerts in the system. Can be empty
|
71
|
+
def list_alerts
|
72
|
+
ret = http_get('/')
|
73
|
+
val = []
|
74
|
+
ret.each { |a| val.push(Alert.new(a)) }
|
75
|
+
val
|
76
|
+
end
|
77
|
+
|
78
|
+
# Retrieve a single Alert by its id
|
79
|
+
# @param [String] alert_id id of the alert to fetch
|
80
|
+
# @return [Alert] Alert object retrieved
|
81
|
+
def get_single_alert(alert_id)
|
82
|
+
ret = http_get('/alert/' + alert_id)
|
83
|
+
val = Alert.new(ret)
|
84
|
+
val
|
85
|
+
end
|
86
|
+
|
87
|
+
# Mark one alert as resolved
|
88
|
+
# @param [String] alert_id Id of the alert to resolve
|
89
|
+
# @param [String] by name of the user resolving the alert
|
90
|
+
# @param [String] comment A comment on the resolution
|
91
|
+
def resolve_alert(alert_id, by = nil, comment = nil)
|
92
|
+
sub_url = "/resolve/#{alert_id}"
|
93
|
+
query = generate_query_params 'resolvedBy' => by, 'resolvedNotes' => comment
|
94
|
+
sub_url += query
|
95
|
+
http_put(sub_url, {})
|
96
|
+
|
97
|
+
true
|
98
|
+
end
|
99
|
+
|
100
|
+
# Mark one alert as acknowledged
|
101
|
+
# @param [String] alert_id Id of the alert to ack
|
102
|
+
# @param [String] by name of the user acknowledging the alert
|
103
|
+
# @param [String] comment A comment on the acknowledge
|
104
|
+
def acknowledge_alert(alert_id, by = nil, comment = nil)
|
105
|
+
sub_url = "/ack/#{alert_id}"
|
106
|
+
query = generate_query_params 'ackBy' => by, 'ackNotes' => comment
|
107
|
+
sub_url += query
|
108
|
+
http_put(sub_url, {})
|
109
|
+
|
110
|
+
true
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# Representation of one Trigger
|
115
|
+
class Trigger
|
116
|
+
attr_reader :id, :name, :context, :actions, :auto_disable, :auto_enable
|
117
|
+
attr_reader :auto_resolve, :auto_resolve_alerts
|
118
|
+
attr_reader :tenant, :description, :group, :severity
|
119
|
+
attr_reader :conditions, :dampenings, :event_type
|
120
|
+
attr_accessor :enabled
|
121
|
+
|
122
|
+
def initialize(trigger_hash)
|
123
|
+
@_hash = trigger_hash
|
124
|
+
@conditions = []
|
125
|
+
@dampenings = []
|
126
|
+
@id = trigger_hash['id']
|
127
|
+
@name = trigger_hash['name']
|
128
|
+
@enabled = trigger_hash['enabled']
|
129
|
+
@severity = trigger_hash['severity']
|
130
|
+
@auto_resolve = trigger_hash['autoResolve']
|
131
|
+
@auto_resolve_alerts = trigger_hash['autoResolveAlerts']
|
132
|
+
@event_type = trigger_hash['eventType']
|
133
|
+
@tenant = trigger_hash['tenantId']
|
134
|
+
@description = trigger_hash['description']
|
135
|
+
@auto_enable = trigger_hash['autoEnable']
|
136
|
+
@auto_disable = trigger_hash['autoDisable']
|
137
|
+
end
|
138
|
+
|
139
|
+
# def enable
|
140
|
+
# @enabled = true
|
141
|
+
# @_hash['enabled'] = true
|
142
|
+
# url = '/triggers/' + @id
|
143
|
+
# Hawkular::BaseClient.http_put(url, @_hash)
|
144
|
+
# end
|
145
|
+
#
|
146
|
+
# def disable
|
147
|
+
# @enabled = false
|
148
|
+
# url = '/triggers/' + @id
|
149
|
+
# AlertsClient.http_put(url, self)
|
150
|
+
# end
|
151
|
+
|
152
|
+
# Representing of one Condition
|
153
|
+
class Condition
|
154
|
+
attr_reader :condition_id, :type, :operator_low, :operator_high, :threshold_low
|
155
|
+
attr_reader :in_range, :threshold_high
|
156
|
+
|
157
|
+
def initialize(cond_hash)
|
158
|
+
@condition_id = cond_hash['conditionId']
|
159
|
+
@type = cond_hash['type']
|
160
|
+
@operator_low = cond_hash['operatorLow']
|
161
|
+
@operator_high = cond_hash['operatorHigh']
|
162
|
+
@threshold_low = cond_hash['thresholdLow']
|
163
|
+
@threshold_high = cond_hash['thresholdHigh']
|
164
|
+
@in_range = cond_hash['inRange']
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
# Representation of one Dampening setting
|
169
|
+
class Dampening
|
170
|
+
attr_reader :dampening_id, :type, :eval_true_setting, :eval_total_setting, :eval_time_setting
|
171
|
+
attr_reader :current_evals
|
172
|
+
|
173
|
+
def initialize(damp_hash)
|
174
|
+
@current_evals = {}
|
175
|
+
@dampening_id = damp_hash['dampeningId']
|
176
|
+
@type = damp_hash['type']
|
177
|
+
@eval_true_setting = damp_hash['evalTrueSetting']
|
178
|
+
@eval_total_setting = damp_hash['evalTotalSetting']
|
179
|
+
@eval_time_setting = damp_hash['evalTimeSetting']
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
# Representation of one alert.
|
185
|
+
# The name of the members are literally what they are in the JSON sent from the
|
186
|
+
# server and not 'rubyfied'. So 'alertId' and not 'alert_ic'
|
187
|
+
# Check http://www.hawkular.org/docs/rest/rest-alerts.html#Alert for details
|
188
|
+
class Alert < OpenStruct
|
189
|
+
def initialize(alert_hash)
|
190
|
+
super(alert_hash)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
@@ -1,60 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'json'
|
4
|
-
require 'rest-client'
|
5
|
-
require 'English'
|
1
|
+
require 'base64'
|
2
|
+
require 'addressable/uri'
|
6
3
|
|
7
4
|
module Hawkular
|
8
|
-
# Metrics module provides access to Hawkular Metrics REST API
|
9
|
-
# @see http://www.hawkular.org/docs/rest/rest-metrics.html Hawkular Metrics REST API Documentation
|
10
|
-
# @example Create Hawkular-Metrics client and start pushing some metric data
|
11
|
-
# # create client instance
|
12
|
-
# client = Hawkular::Metrics::Client::new("http://server","username",
|
13
|
-
# "password",{"tenant" => "your tenant ID"})
|
14
|
-
# # push gauge metric data for metric called "myGauge" (no need to create metric definition
|
15
|
-
# # unless you wish to specify data retention)
|
16
|
-
# client.gauges.push_data("myGauge", {:value => 3.1415925})
|
17
5
|
module Metrics
|
18
6
|
end
|
19
|
-
end
|
20
|
-
|
21
|
-
require 'metrics/types'
|
22
|
-
require 'metrics/tenant_api'
|
23
|
-
require 'metrics/metric_api'
|
24
|
-
|
25
|
-
module Hawkular::Metrics
|
26
|
-
class HawkularException < StandardError
|
27
|
-
def initialize(message)
|
28
|
-
@message = message
|
29
|
-
super
|
30
|
-
end
|
31
|
-
|
32
|
-
attr_reader :message
|
33
|
-
end
|
34
7
|
|
35
|
-
|
8
|
+
# This is the base functionality for all the clients,
|
9
|
+
# that inherit from it. You should not directly use it,
|
10
|
+
# but through the more specialized clients.
|
11
|
+
class BaseClient
|
36
12
|
# @!visibility private
|
37
13
|
attr_reader :credentials, :entrypoint, :options
|
38
14
|
# @return [Tenants] access tenants API
|
39
15
|
attr_reader :tenants
|
40
|
-
|
41
|
-
|
42
|
-
# @return [Gauges] access gauges API
|
43
|
-
attr_reader :gauges
|
44
|
-
# @return [Availability] access counters API
|
45
|
-
attr_reader :avail
|
46
|
-
|
47
|
-
# Construct a new Hawkular Metrics client class.
|
48
|
-
# optional parameters
|
49
|
-
# @param entrypoint [String] Base url of the Hawkular (metrics) server
|
50
|
-
# @param credentials Hash of username, password, token(optional)
|
51
|
-
# @param options [Hash{String=>String}] client options
|
52
|
-
# @example initialize with Hawkular-tenant option
|
53
|
-
# Hawkular::Metrics::Client::new("http://server",
|
54
|
-
# {username:"username",password:"password"},
|
55
|
-
# {"tenant" => "your tenant ID"})
|
56
|
-
#
|
57
|
-
def initialize(entrypoint = 'http://localhost:8080/hawkular/metrics',
|
16
|
+
|
17
|
+
def initialize(entrypoint = nil,
|
58
18
|
credentials = {},
|
59
19
|
options = {})
|
60
20
|
@entrypoint = entrypoint
|
@@ -72,10 +32,7 @@ module Hawkular::Metrics
|
|
72
32
|
headers: {}
|
73
33
|
}.merge(options)
|
74
34
|
|
75
|
-
|
76
|
-
@counters = Client::Counters.new self
|
77
|
-
@gauges = Client::Gauges.new self
|
78
|
-
@avail = Client::Availability.new self
|
35
|
+
fail 'You need to provide an entrypoint' if entrypoint.nil?
|
79
36
|
end
|
80
37
|
|
81
38
|
def http_get(suburl, headers = {})
|
@@ -86,6 +43,25 @@ module Hawkular::Metrics
|
|
86
43
|
handle_fault $ERROR_INFO
|
87
44
|
end
|
88
45
|
|
46
|
+
# Escapes the passed url part. This is necessary,
|
47
|
+
# as many ids inside Hawkular can contain characters
|
48
|
+
# that are invalid for an url/uri.
|
49
|
+
# The passed value is duplicated
|
50
|
+
# @param [String] url_part Part of an url to be escaped
|
51
|
+
# @return [String] escaped url_part as new string
|
52
|
+
def hawk_escape(url_part)
|
53
|
+
sub_url = url_part.dup
|
54
|
+
sub_url.gsub!('%', '%25')
|
55
|
+
sub_url.gsub!(' ', '%20')
|
56
|
+
sub_url.gsub!('[', '%5b')
|
57
|
+
sub_url.gsub!(']', '%5d')
|
58
|
+
sub_url.gsub!('|', '%7c')
|
59
|
+
sub_url.gsub!('(', '%28')
|
60
|
+
sub_url.gsub!(')', '%29')
|
61
|
+
sub_url.gsub!('/', '%2f')
|
62
|
+
sub_url
|
63
|
+
end
|
64
|
+
|
89
65
|
def http_post(suburl, hash, headers = {})
|
90
66
|
body = JSON.generate(hash)
|
91
67
|
res = rest_client(suburl).post(body, http_headers(headers))
|
@@ -153,8 +129,62 @@ module Hawkular::Metrics
|
|
153
129
|
Integer(Time.now.to_f * 1000)
|
154
130
|
end
|
155
131
|
|
132
|
+
# Encode the passed credentials (username/password) into a base64
|
133
|
+
# representation that can be used to generate a Http-Authentication header
|
134
|
+
# @param credentials [Hash{:username,:password}]
|
135
|
+
# @return [String] Base64 encoded result
|
136
|
+
def base_64_credentials(credentials = {})
|
137
|
+
creds = credentials.empty? ? @credentials : credentials
|
138
|
+
|
139
|
+
encoded = Base64.encode64(creds[:username] + ':' + creds[:password])
|
140
|
+
encoded.rstrip!
|
141
|
+
end
|
142
|
+
|
143
|
+
# Generate a query string from the passed hash.
|
144
|
+
# This string starts with a `?` if the hash is
|
145
|
+
# not empty.
|
146
|
+
# Values may be an array, in which case the array values are joined together by `,`.
|
147
|
+
# @param param_hash [Hash] key-values pairs
|
148
|
+
# @return [String] complete query string to append to a base url
|
149
|
+
def generate_query_params(param_hash = {})
|
150
|
+
return '' if param_hash.size == 0
|
151
|
+
|
152
|
+
num = count_non_nil_values(param_hash)
|
153
|
+
|
154
|
+
i = 0
|
155
|
+
ret = ''
|
156
|
+
ret = '?' if num > 0
|
157
|
+
param_hash.each do |k, v|
|
158
|
+
next if not_suitable?(v)
|
159
|
+
|
160
|
+
if v.instance_of? Array
|
161
|
+
part = "#{k}=#{v.join(',')}"
|
162
|
+
else
|
163
|
+
part = "#{k}=#{v}"
|
164
|
+
end
|
165
|
+
|
166
|
+
ret += hawk_escape part
|
167
|
+
|
168
|
+
i += 1
|
169
|
+
ret += '&' if i < num
|
170
|
+
end
|
171
|
+
ret
|
172
|
+
end
|
173
|
+
|
156
174
|
private
|
157
175
|
|
176
|
+
def not_suitable?(v)
|
177
|
+
v.nil? || (v.instance_of? Array) && v.size == 0
|
178
|
+
end
|
179
|
+
|
180
|
+
def count_non_nil_values(param_hash)
|
181
|
+
num = 0
|
182
|
+
param_hash.each do |_k, v|
|
183
|
+
num += 1 unless not_suitable?(v)
|
184
|
+
end
|
185
|
+
num
|
186
|
+
end
|
187
|
+
|
158
188
|
def token_header
|
159
189
|
@credentials[:token].nil? ? {} : { 'Authorization' => "Bearer #{@credentials[:token]}" }
|
160
190
|
end
|
@@ -178,4 +208,15 @@ module Hawkular::Metrics
|
|
178
208
|
end
|
179
209
|
end
|
180
210
|
end
|
211
|
+
|
212
|
+
# Specialized exception to be thrown
|
213
|
+
# when the interction with Hawkular fails
|
214
|
+
class HawkularException < StandardError
|
215
|
+
def initialize(message)
|
216
|
+
@message = message
|
217
|
+
super
|
218
|
+
end
|
219
|
+
|
220
|
+
attr_reader :message
|
221
|
+
end
|
181
222
|
end
|