atsd 1.0.1
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 +7 -0
- data/.gitignore +11 -0
- data/.rspec +2 -0
- data/Gemfile +8 -0
- data/README.md +365 -0
- data/Rakefile +16 -0
- data/atsd.gemspec +36 -0
- data/lib/atsd.rb +19 -0
- data/lib/atsd/atsd.rb +54 -0
- data/lib/atsd/client.rb +469 -0
- data/lib/atsd/errors/api_error.rb +11 -0
- data/lib/atsd/errors/error.rb +3 -0
- data/lib/atsd/middleware/errors_handler.rb +88 -0
- data/lib/atsd/models/alert.rb +7 -0
- data/lib/atsd/models/alert_history.rb +7 -0
- data/lib/atsd/models/base_model.rb +23 -0
- data/lib/atsd/models/entity.rb +7 -0
- data/lib/atsd/models/entity_group.rb +8 -0
- data/lib/atsd/models/metric.rb +7 -0
- data/lib/atsd/models/property.rb +11 -0
- data/lib/atsd/models/series.rb +8 -0
- data/lib/atsd/queries/alerts_history_query.rb +31 -0
- data/lib/atsd/queries/alerts_query.rb +31 -0
- data/lib/atsd/queries/base_query.rb +40 -0
- data/lib/atsd/queries/properties_query.rb +31 -0
- data/lib/atsd/queries/series_query.rb +150 -0
- data/lib/atsd/services/alerts_service.rb +88 -0
- data/lib/atsd/services/base_service.rb +15 -0
- data/lib/atsd/services/entities_service.rb +130 -0
- data/lib/atsd/services/entity_groups_service.rb +186 -0
- data/lib/atsd/services/metrics_service.rb +122 -0
- data/lib/atsd/services/properties_service.rb +63 -0
- data/lib/atsd/services/series_service.rb +53 -0
- data/lib/atsd/utils.rb +20 -0
- data/lib/atsd/utils/camelize_keys.rb +41 -0
- data/lib/atsd/utils/underscore_keys.rb +21 -0
- data/lib/atsd/version.rb +3 -0
- metadata +264 -0
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'atsd/services/base_service'
|
2
|
+
require 'atsd/models/alert'
|
3
|
+
require 'atsd/models/alert_history'
|
4
|
+
require 'atsd/queries/alerts_query'
|
5
|
+
require 'atsd/queries/alerts_history_query'
|
6
|
+
|
7
|
+
module ATSD
|
8
|
+
class AlertsService < BaseService
|
9
|
+
# Create query builder for alerts.
|
10
|
+
#
|
11
|
+
# @param [Hash] options query parameters
|
12
|
+
# @return [AlertsQuery]
|
13
|
+
def query(options = {})
|
14
|
+
query = AlertsQuery.new @client
|
15
|
+
options.each { |option, value| query[option] = value }
|
16
|
+
query
|
17
|
+
end
|
18
|
+
|
19
|
+
# Acknowledge alerts
|
20
|
+
#
|
21
|
+
# @param [Array<Hash, Alert, Integer>, Hash, Alert, Integer] alerts
|
22
|
+
# @return [self]
|
23
|
+
# @raise [APIError]
|
24
|
+
def acknowledge(alerts)
|
25
|
+
alerts_acknowledge alerts, true
|
26
|
+
end
|
27
|
+
|
28
|
+
# De-acknowledge alerts
|
29
|
+
#
|
30
|
+
# @param [Array<Hash, Alert, Integer>, Hash, Alert, Integer] alerts
|
31
|
+
# @return [self]
|
32
|
+
# @raise [APIError]
|
33
|
+
def de_acknowledge(alerts)
|
34
|
+
alerts_acknowledge alerts, false
|
35
|
+
end
|
36
|
+
|
37
|
+
# Delete alerts
|
38
|
+
#
|
39
|
+
# @param [Array<Hash, Alert>, Hash, Alert] alerts
|
40
|
+
# @return [self]
|
41
|
+
# @raise [APIError]
|
42
|
+
def delete(alerts)
|
43
|
+
alerts = Utils.ensure_array(alerts).map do |alert|
|
44
|
+
{ :id => id_for_alert(alert) }
|
45
|
+
end
|
46
|
+
return if alerts.count == 0
|
47
|
+
@client.alerts_update :action => 'delete',
|
48
|
+
:alerts => alerts
|
49
|
+
end
|
50
|
+
|
51
|
+
# Create query builder for alert history.
|
52
|
+
#
|
53
|
+
# @param [Hash] options query parameters
|
54
|
+
# @return [AlertsHistoryQuery]
|
55
|
+
def history_query(options = {})
|
56
|
+
query = AlertsHistoryQuery.new @client
|
57
|
+
options.each { |option, value| query[option] = value }
|
58
|
+
query
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def alerts_acknowledge(alerts, acknowledge)
|
64
|
+
alerts = Utils.ensure_array(alerts).map do |alert|
|
65
|
+
alert[:acknowledged] = acknowledge if alert.is_a? Hash
|
66
|
+
{ :id => id_for_alert(alert) }
|
67
|
+
end
|
68
|
+
return if alerts.count == 0
|
69
|
+
@client.alerts_update :action => 'update',
|
70
|
+
:fields => {:acknowledge => acknowledge},
|
71
|
+
:alerts => alerts
|
72
|
+
self
|
73
|
+
end
|
74
|
+
|
75
|
+
def id_for_alert(alert)
|
76
|
+
case alert
|
77
|
+
when Integer
|
78
|
+
alert
|
79
|
+
when Alert
|
80
|
+
alert.id
|
81
|
+
when Hash
|
82
|
+
alert[:id] || alert['id']
|
83
|
+
else
|
84
|
+
alert.id
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'atsd/services/base_service'
|
2
|
+
require 'atsd/models/entity'
|
3
|
+
require 'atsd/models/metric'
|
4
|
+
|
5
|
+
module ATSD
|
6
|
+
# Entities service
|
7
|
+
class EntitiesService < BaseService
|
8
|
+
|
9
|
+
# Entities list
|
10
|
+
#
|
11
|
+
# @option options [Boolean] :active
|
12
|
+
# Filter entities by last insert time. If `active = true`,
|
13
|
+
# only entities with positive `last_insert_time` are included in the response
|
14
|
+
# @option options [String] :expression
|
15
|
+
# Use `name` variable for entity name. Use `*` placeholder in `like` expresions
|
16
|
+
# @option options [Array<String>] :tags
|
17
|
+
# Specify entity tags to be included in the response
|
18
|
+
# @option options [Integer] :limit
|
19
|
+
# Limit response to first N entities, ordered by name.
|
20
|
+
# @return [Array<Entity>]
|
21
|
+
# @raise [APIError]
|
22
|
+
def list(options = {})
|
23
|
+
options = options.camelize_keys
|
24
|
+
@client.entities_list(options).map do |json|
|
25
|
+
Entity.new json
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Displays entity properties and all tags.
|
30
|
+
#
|
31
|
+
# @param [String, Entity] entity
|
32
|
+
# @return [Entity]
|
33
|
+
# @raise [APIError]
|
34
|
+
def get(entity)
|
35
|
+
Entity.new(@client.entities_get(name_for_entity entity))
|
36
|
+
end
|
37
|
+
|
38
|
+
# Create an entity with specified properties and tags
|
39
|
+
# or replace an existing entity. This method creates a new
|
40
|
+
# entity or replaces an existing entity.
|
41
|
+
#
|
42
|
+
# @note If only a subset of fields is provided for an existing entity,
|
43
|
+
# the remaining properties will be set to default values and tags
|
44
|
+
# will be deleted.
|
45
|
+
#
|
46
|
+
# @param [Hash, Entity] entity
|
47
|
+
# @return [self]
|
48
|
+
# @raise [APIError]
|
49
|
+
def create_or_replace(entity)
|
50
|
+
entity = Entity.new(entity) if entity.is_a? Hash
|
51
|
+
name = name_for_entity entity
|
52
|
+
raise ArgumentError unless name
|
53
|
+
@client.entities_create_or_replace(name, entity.to_request_hash)
|
54
|
+
self
|
55
|
+
end
|
56
|
+
|
57
|
+
# Update specified properties and tags for the given entity.
|
58
|
+
# @note updates specified properties and tags for an existing entity.
|
59
|
+
# Properties and tags that are not specified are left unchanged.
|
60
|
+
#
|
61
|
+
# @param [Hash, Entity] entity
|
62
|
+
# @return [self]
|
63
|
+
# @raise [APIError]
|
64
|
+
def update(entity)
|
65
|
+
entity = Entity.new(entity) if entity.is_a? Hash
|
66
|
+
@client.entities_update(name_for_entity(entity), entity.to_request_hash)
|
67
|
+
self
|
68
|
+
end
|
69
|
+
|
70
|
+
# Delete the entity. Delete the entity from any Entity Groups that it
|
71
|
+
# belongs to. Data collected by the entity will be removed asynchronously
|
72
|
+
# in the background.
|
73
|
+
#
|
74
|
+
# @param [Hash, Entity, String] entity entity or name
|
75
|
+
# @return [self]
|
76
|
+
# @raise [APIError]
|
77
|
+
def delete(entity)
|
78
|
+
@client.entities_delete(name_for_entity entity)
|
79
|
+
self
|
80
|
+
end
|
81
|
+
|
82
|
+
# Returns an array of property types for the entity.
|
83
|
+
#
|
84
|
+
# @param [String, Hash, Entity] entity
|
85
|
+
# @param [Integer, Time] start_time
|
86
|
+
# Return only property types that have been collected after the specified time.
|
87
|
+
# @return [Array<String>]
|
88
|
+
# @raise [APIError]
|
89
|
+
def property_types(entity, start_time = nil)
|
90
|
+
start_time = start_time.to_i * 1000 if start_time.is_a? Time
|
91
|
+
params = start_time ? { :start_time => start_time } : {}
|
92
|
+
@client.entities_property_types(name_for_entity(entity), params)
|
93
|
+
end
|
94
|
+
|
95
|
+
# Returns a list of metrics collected by the entity.
|
96
|
+
# The list is based on memory cache which is rebuilt on ATSD restart.
|
97
|
+
#
|
98
|
+
# @param [String, Hash, Entity] entity
|
99
|
+
# @option options [Boolean] :active
|
100
|
+
# Filter metrics by last_insert_time. If active = true,
|
101
|
+
# only metrics with positive last_insert_time are included in the response
|
102
|
+
# @option options [Array<String>] :tags
|
103
|
+
# Specify metric tags to be included in the response
|
104
|
+
# @option options [Integer] :limit
|
105
|
+
# Limit response to first N metrics, ordered by name.
|
106
|
+
# @return [Array<Metric>]
|
107
|
+
# @raise [APIError]
|
108
|
+
def metrics(entity, options = {})
|
109
|
+
options = options.camelize_keys
|
110
|
+
@client.entities_metrics(name_for_entity(entity), options).map do |json|
|
111
|
+
Metric.new json
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
def name_for_entity(entity)
|
118
|
+
case entity
|
119
|
+
when String
|
120
|
+
entity
|
121
|
+
when Hash
|
122
|
+
entity[:name] || entity['name']
|
123
|
+
when Entity
|
124
|
+
entity.name? ? entity.name : nil
|
125
|
+
else
|
126
|
+
entity.name
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,186 @@
|
|
1
|
+
require 'atsd/services/base_service'
|
2
|
+
require 'atsd/models/entity_group'
|
3
|
+
|
4
|
+
module ATSD
|
5
|
+
class EntityGroupsService < BaseService
|
6
|
+
# Entity groups list.
|
7
|
+
#
|
8
|
+
# @option parameters [String] :expression
|
9
|
+
# Use name variable for entity group name. Use * placeholder
|
10
|
+
# in like expressions
|
11
|
+
# @option parameters [Array] :tags
|
12
|
+
# Specify entity group tags to be included in the response
|
13
|
+
# @option parameters [Integer] :limit
|
14
|
+
# Limit response to first N entity groups, ordered by name.
|
15
|
+
# @return [Array<EntityGroup>]
|
16
|
+
# @raise [APIError]
|
17
|
+
def list(parameters = {})
|
18
|
+
parameters = parameters.camelize_keys
|
19
|
+
@client.entity_groups_list(parameters).map do |json|
|
20
|
+
EntityGroup.new json
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Displays entity group properties and all tags.
|
25
|
+
#
|
26
|
+
# @param [String] entity_group
|
27
|
+
# @return [Array<EntityGroup>]
|
28
|
+
# @raise [APIError]
|
29
|
+
def get(entity_group)
|
30
|
+
EntityGroup.new(@client.entity_groups_get(name_for_entity_group entity_group))
|
31
|
+
end
|
32
|
+
|
33
|
+
# Create an entity group with specified properties and tags
|
34
|
+
# or replace an existing entity group. This method creates
|
35
|
+
# a new entity group or replaces an existing entity group.
|
36
|
+
#
|
37
|
+
# @note If only a subset of fields is provided for an
|
38
|
+
# existing entity group, the remaining properties and
|
39
|
+
# tags will be deleted.
|
40
|
+
#
|
41
|
+
# @param [Hash, EntityGroup, String] entity_group
|
42
|
+
# @return [self]
|
43
|
+
# @raise [APIError]
|
44
|
+
def create_or_replace(entity_group)
|
45
|
+
entity_group = EntityGroup.new(name: entity_group) if entity_group.is_a? String
|
46
|
+
entity_group = EntityGroup.new(entity_group) if entity_group.is_a? Hash
|
47
|
+
@client.entity_groups_create_or_replace(entity_group.name, entity_group.to_request_hash)
|
48
|
+
self
|
49
|
+
end
|
50
|
+
|
51
|
+
# Update specified properties and tags for the given entity
|
52
|
+
# group. This method updates specified properties and tags
|
53
|
+
# for an existing entity group.
|
54
|
+
#
|
55
|
+
# @note Properties and tags that are not specified are left
|
56
|
+
# unchanged.
|
57
|
+
#
|
58
|
+
# @param [Hash, EntityGroup] entity_group
|
59
|
+
# @return [self]
|
60
|
+
# @raise [APIError]
|
61
|
+
def update(entity_group)
|
62
|
+
entity_group = EntityGroup.new(entity_group) if entity_group.is_a? Hash
|
63
|
+
@client.entity_groups_update(entity_group.name, entity_group.to_request_hash)
|
64
|
+
self
|
65
|
+
end
|
66
|
+
|
67
|
+
# Delete the entity group.
|
68
|
+
#
|
69
|
+
# @note Entities that are members of the group are retained.
|
70
|
+
#
|
71
|
+
# @param [String, EntityGroup, Hash] entity_group
|
72
|
+
# @return [self]
|
73
|
+
# @raise [APIError]
|
74
|
+
def delete(entity_group)
|
75
|
+
@client.entity_groups_delete(name_for_entity_group(entity_group))
|
76
|
+
self
|
77
|
+
end
|
78
|
+
|
79
|
+
# Get entities for entity group
|
80
|
+
#
|
81
|
+
# @param [String, EntityGroup, Hash] entity_group
|
82
|
+
# @option parameters [Boolean] :active
|
83
|
+
# Filter entities by last_insert_time. If active = true, only entities
|
84
|
+
# with positive last_insert_time are included in the response
|
85
|
+
# @option parameters [String] :expression
|
86
|
+
# Use name variable for entity name. Use * placeholder in like expressions
|
87
|
+
# @option parameters [Array] :tags
|
88
|
+
# Specify entity tags to be included in the response
|
89
|
+
# @option parameters [Integer] :limit
|
90
|
+
# Limit response to first N entities, ordered by name.
|
91
|
+
# @return [Array<Entity>]
|
92
|
+
# @raise [APIError]
|
93
|
+
def entities(entity_group, parameters = {})
|
94
|
+
entity_group = name_for_entity_group(entity_group)
|
95
|
+
parameters = parameters.camelize_keys
|
96
|
+
@client.entity_groups_get_entities(entity_group, parameters).map do |json|
|
97
|
+
Entity.new json
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# Add specified entities to entity group.
|
102
|
+
#
|
103
|
+
# @param [String, EntityGroup, Hash] entity_group
|
104
|
+
# @param [Hash, Entity, Array<Hash>, Array<Entity>] entities
|
105
|
+
# @option parameters [Boolean] :create_entities
|
106
|
+
# Automatically create new entities from the submitted list
|
107
|
+
# if such entities don’t already exist. Default value: true
|
108
|
+
# @return [self]
|
109
|
+
# @raise [APIError]
|
110
|
+
def add_entities(entity_group, entities, parameters = {})
|
111
|
+
entity_group = name_for_entity_group(entity_group)
|
112
|
+
parameters = parameters.camelize_keys
|
113
|
+
entities = Utils.ensure_array(entities).map do |e|
|
114
|
+
e = Entity.new(name: e) if e.is_a? String
|
115
|
+
e = Entity.new(e) if e.is_a? Hash
|
116
|
+
e = e.to_request_hash
|
117
|
+
end
|
118
|
+
@client.entity_groups_add_entities(entity_group, entities, parameters)
|
119
|
+
self
|
120
|
+
end
|
121
|
+
|
122
|
+
# Replace entities in the entity group with the specified collection.
|
123
|
+
#
|
124
|
+
# @note All existing entities that are not included in the collection
|
125
|
+
# will be removed. If the specified collection is empty, all entities
|
126
|
+
# are removed from the group (replace with empty collection).
|
127
|
+
#
|
128
|
+
# @param [String, EntityGroup, Hash] entity_group
|
129
|
+
# @param [Hash, Entity, Array<Hash>, Array<Entity>] entities
|
130
|
+
# @return [self]
|
131
|
+
# @raise [APIError]
|
132
|
+
def replace_entities(entity_group, entities)
|
133
|
+
entity_group = name_for_entity_group(entity_group)
|
134
|
+
entities = Utils.ensure_array(entities).map do |e|
|
135
|
+
e = Entity.new(name: e) if e.is_a? String
|
136
|
+
e = Entity.new(e) if e.is_a? Hash
|
137
|
+
e = e.to_request_hash
|
138
|
+
end
|
139
|
+
@client.entity_groups_replace_entities(entity_group, entities)
|
140
|
+
self
|
141
|
+
end
|
142
|
+
|
143
|
+
# Delete entities from entity group.
|
144
|
+
#
|
145
|
+
# @param [String, EntityGroup, Hash] entity_group
|
146
|
+
# @param [Hash, Entity, Array<Hash>, Array<Entity>] entities
|
147
|
+
# @return [self]
|
148
|
+
# @raise [APIError]
|
149
|
+
def delete_entities(entity_group, entities)
|
150
|
+
entity_group = name_for_entity_group(entity_group)
|
151
|
+
entities = Utils.ensure_array(entities).map do |e|
|
152
|
+
e = Entity.new(name: e) if e.is_a? String
|
153
|
+
e = Entity.new(e) if e.is_a? Hash
|
154
|
+
e = e.to_request_hash
|
155
|
+
end
|
156
|
+
@client.entity_groups_delete_entities(entity_group, entities)
|
157
|
+
self
|
158
|
+
end
|
159
|
+
|
160
|
+
# Delete all entities from entity group.
|
161
|
+
#
|
162
|
+
# @param [String, EntityGroup, Hash] entity_group
|
163
|
+
# @return [self]
|
164
|
+
# @raise [APIError]
|
165
|
+
def delete_all_entities(entity_group)
|
166
|
+
entity_group = name_for_entity_group(entity_group)
|
167
|
+
@client.entity_groups_delete_all_entities(entity_group)
|
168
|
+
self
|
169
|
+
end
|
170
|
+
|
171
|
+
private
|
172
|
+
|
173
|
+
def name_for_entity_group(entity_group)
|
174
|
+
case entity_group
|
175
|
+
when String
|
176
|
+
entity_group
|
177
|
+
when Hash
|
178
|
+
entity_group[:name] || entity_group['name']
|
179
|
+
when EntityGroup
|
180
|
+
entity_group.name? ? entity_group.name : nil
|
181
|
+
else
|
182
|
+
entity_group.name
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'atsd/services/base_service'
|
2
|
+
require 'atsd/models/metric'
|
3
|
+
require 'atsd/models/entity'
|
4
|
+
|
5
|
+
module ATSD
|
6
|
+
class MetricsService < BaseService
|
7
|
+
# Metrics list.
|
8
|
+
#
|
9
|
+
# @option parameters [String] :expression
|
10
|
+
# Use name variable for metric name. Use * placeholder
|
11
|
+
# in like expressions
|
12
|
+
# @option parameters [Boolean] :active
|
13
|
+
# Filter metrics by last_insert_time. If active = true,
|
14
|
+
# only metrics with positive last_insert_time are included in the response
|
15
|
+
# @option parameters [Array] :tags
|
16
|
+
# Specify metric tags to be included in the response
|
17
|
+
# @option parameters [Integer] :limit
|
18
|
+
# Limit response to first N metrics, ordered by name.
|
19
|
+
# @return [Array<Metric>]
|
20
|
+
# @raise [APIError]
|
21
|
+
def list(parameters = {})
|
22
|
+
parameters = parameters.camelize_keys
|
23
|
+
@client.metrics_list(parameters).map do |json|
|
24
|
+
Metric.new json
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Displays metric properties and its tags.
|
29
|
+
#
|
30
|
+
# @param [String] metric
|
31
|
+
# @return [Array<Metric>]
|
32
|
+
# @raise [APIError]
|
33
|
+
def get(metric)
|
34
|
+
Metric.new(@client.metrics_get(name_for_metric metric))
|
35
|
+
end
|
36
|
+
|
37
|
+
# Create a metric with specified properties and tags or replace
|
38
|
+
# an existing metric. This method creates a new metric or replaces
|
39
|
+
# an existing metric.
|
40
|
+
#
|
41
|
+
# @note If only a subset of fields is provided for an existing metric,
|
42
|
+
# the remaining properties and tags will be deleted.
|
43
|
+
#
|
44
|
+
# @param [Hash, Metric, String] metric
|
45
|
+
# @return [self]
|
46
|
+
# @raise [APIError]
|
47
|
+
def create_or_replace(metric)
|
48
|
+
metric = Metric.new(name: metric) if metric.is_a? String
|
49
|
+
metric = Metric.new(metric) if metric.is_a? Hash
|
50
|
+
@client.metrics_create_or_replace(metric.name, metric.to_request_hash)
|
51
|
+
self
|
52
|
+
end
|
53
|
+
|
54
|
+
# Update specified properties and tags for the given metric.
|
55
|
+
# This method updates specified properties and tags for an existing metric.
|
56
|
+
#
|
57
|
+
# @note Properties and tags that are not specified are left unchanged.
|
58
|
+
#
|
59
|
+
# @param [Hash, Metric] metric
|
60
|
+
# @return [self]
|
61
|
+
# @raise [APIError]
|
62
|
+
def update(metric)
|
63
|
+
metric = Metric.new(metric) if metric.is_a? Hash
|
64
|
+
@client.metrics_update(metric.name, metric.to_request_hash)
|
65
|
+
self
|
66
|
+
end
|
67
|
+
|
68
|
+
# Delete the metric. Data collected for the metric will be removed
|
69
|
+
# asynchronously in the background.
|
70
|
+
#
|
71
|
+
# @param [String, Metric, Hash] metric
|
72
|
+
# @return [self]
|
73
|
+
# @raise [APIError]
|
74
|
+
def delete(metric)
|
75
|
+
@client.metrics_delete(name_for_metric(metric))
|
76
|
+
self
|
77
|
+
end
|
78
|
+
|
79
|
+
# Returns a list of unique series tags for the metric. The list is
|
80
|
+
# based on data stored on disk for the last 24 hours.
|
81
|
+
#
|
82
|
+
# @param [Hash, Metric, String] metric
|
83
|
+
# @param [Hash, Entity, String] entity
|
84
|
+
# @return [Array<Entity>]
|
85
|
+
# @raise [APIError]
|
86
|
+
def entity_and_tags(metric, entity = nil)
|
87
|
+
metric = name_for_metric(metric)
|
88
|
+
params = {}
|
89
|
+
params[:entity] = name_for_entity(entity) if entity
|
90
|
+
result = @client.metrics_entity_and_tags(metric, params)
|
91
|
+
result.map { |json| Entity.new json }
|
92
|
+
end
|
93
|
+
|
94
|
+
private
|
95
|
+
|
96
|
+
def name_for_metric(metric)
|
97
|
+
case metric
|
98
|
+
when String
|
99
|
+
metric
|
100
|
+
when Hash
|
101
|
+
metric[:name] || metric['name']
|
102
|
+
when Metric
|
103
|
+
metric.name? ? metric.name : nil
|
104
|
+
else
|
105
|
+
metric.name
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def name_for_entity(entity)
|
110
|
+
case entity
|
111
|
+
when String
|
112
|
+
entity
|
113
|
+
when Hash
|
114
|
+
entity[:name] || entity['name']
|
115
|
+
when Entity
|
116
|
+
entity.name? ? entity.name : nil
|
117
|
+
else
|
118
|
+
entity.name
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|