vmpooler 2.1.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,136 +6,170 @@ module Vmpooler
6
6
 
7
7
  module Helpers
8
8
 
9
+ def tracer
10
+ @tracer ||= OpenTelemetry.tracer_provider.tracer('api', Vmpooler::VERSION)
11
+ end
12
+
9
13
  def has_token?
10
14
  request.env['HTTP_X_AUTH_TOKEN'].nil? ? false : true
11
15
  end
12
16
 
13
17
  def valid_token?(backend)
14
- return false unless has_token?
18
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
19
+ return false unless has_token?
15
20
 
16
- backend.exists?("vmpooler__token__#{request.env['HTTP_X_AUTH_TOKEN']}") ? true : false
21
+ backend.exists?("vmpooler__token__#{request.env['HTTP_X_AUTH_TOKEN']}") ? true : false
22
+ end
17
23
  end
18
24
 
19
25
  def validate_token(backend)
20
- if valid_token?(backend)
21
- backend.hset("vmpooler__token__#{request.env['HTTP_X_AUTH_TOKEN']}", 'last', Time.now)
26
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
27
+ if valid_token?(backend)
28
+ backend.hset("vmpooler__token__#{request.env['HTTP_X_AUTH_TOKEN']}", 'last', Time.now)
22
29
 
23
- return true
24
- end
30
+ return true
31
+ end
25
32
 
26
- content_type :json
33
+ content_type :json
27
34
 
28
- result = { 'ok' => false }
35
+ result = { 'ok' => false }
29
36
 
30
- headers['WWW-Authenticate'] = 'Basic realm="Authentication required"'
31
- halt 401, JSON.pretty_generate(result)
37
+ headers['WWW-Authenticate'] = 'Basic realm="Authentication required"'
38
+ halt 401, JSON.pretty_generate(result)
39
+ end
32
40
  end
33
41
 
34
42
  def validate_auth(backend)
35
- return if authorized?
43
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
44
+ return if authorized?
36
45
 
37
- content_type :json
46
+ content_type :json
38
47
 
39
- result = { 'ok' => false }
48
+ result = { 'ok' => false }
40
49
 
41
- headers['WWW-Authenticate'] = 'Basic realm="Authentication required"'
42
- halt 401, JSON.pretty_generate(result)
50
+ headers['WWW-Authenticate'] = 'Basic realm="Authentication required"'
51
+ halt 401, JSON.pretty_generate(result)
52
+ end
43
53
  end
44
54
 
45
55
  def authorized?
46
- @auth ||= Rack::Auth::Basic::Request.new(request.env)
56
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
57
+ @auth ||= Rack::Auth::Basic::Request.new(request.env)
47
58
 
48
- if @auth.provided? and @auth.basic? and @auth.credentials
49
- username, password = @auth.credentials
59
+ if @auth.provided? and @auth.basic? and @auth.credentials
60
+ username, password = @auth.credentials
50
61
 
51
- if authenticate(Vmpooler::API.settings.config[:auth], username, password)
52
- return true
62
+ if authenticate(Vmpooler::API.settings.config[:auth], username, password)
63
+ return true
64
+ end
53
65
  end
54
- end
55
66
 
56
- return false
67
+ return false
68
+ end
57
69
  end
58
70
 
59
71
  def authenticate_ldap(port, host, encryption_hash, user_object, base, username_str, password_str)
60
- ldap = Net::LDAP.new(
61
- :host => host,
62
- :port => port,
63
- :encryption => encryption_hash,
64
- :base => base,
65
- :auth => {
66
- :method => :simple,
67
- :username => "#{user_object}=#{username_str},#{base}",
68
- :password => password_str
69
- }
70
- )
72
+ tracer.in_span(
73
+ "Vmpooler::API::Helpers.#{__method__}",
74
+ attributes: {
75
+ 'net.peer.name' => host,
76
+ 'net.peer.port' => port,
77
+ 'net.transport' => 'ip_tcp',
78
+ 'enduser.id' => username_str
79
+ },
80
+ kind: :client
81
+ ) do
82
+ ldap = Net::LDAP.new(
83
+ :host => host,
84
+ :port => port,
85
+ :encryption => encryption_hash,
86
+ :base => base,
87
+ :auth => {
88
+ :method => :simple,
89
+ :username => "#{user_object}=#{username_str},#{base}",
90
+ :password => password_str
91
+ }
92
+ )
71
93
 
72
- return true if ldap.bind
94
+ return true if ldap.bind
73
95
 
74
- return false
96
+ return false
97
+ end
75
98
  end
76
99
 
77
100
  def authenticate(auth, username_str, password_str)
78
- case auth['provider']
79
- when 'dummy'
80
- return (username_str != password_str)
81
- when 'ldap'
82
- ldap_base = auth[:ldap]['base']
83
- ldap_port = auth[:ldap]['port'] || 389
84
- ldap_user_obj = auth[:ldap]['user_object']
85
- ldap_host = auth[:ldap]['host']
86
- ldap_encryption_hash = auth[:ldap]['encryption'] || {
87
- :method => :start_tls,
88
- :tls_options => { :ssl_version => 'TLSv1' }
101
+ tracer.in_span(
102
+ "Vmpooler::API::Helpers.#{__method__}",
103
+ attributes: {
104
+ 'enduser.id' => username_str
89
105
  }
106
+ ) do
107
+ case auth['provider']
108
+ when 'dummy'
109
+ return (username_str != password_str)
110
+ when 'ldap'
111
+ ldap_base = auth[:ldap]['base']
112
+ ldap_port = auth[:ldap]['port'] || 389
113
+ ldap_user_obj = auth[:ldap]['user_object']
114
+ ldap_host = auth[:ldap]['host']
115
+ ldap_encryption_hash = auth[:ldap]['encryption'] || {
116
+ :method => :start_tls,
117
+ :tls_options => { :ssl_version => 'TLSv1' }
118
+ }
90
119
 
91
- unless ldap_base.is_a? Array
92
- ldap_base = ldap_base.split
93
- end
120
+ unless ldap_base.is_a? Array
121
+ ldap_base = ldap_base.split
122
+ end
94
123
 
95
- unless ldap_user_obj.is_a? Array
96
- ldap_user_obj = ldap_user_obj.split
97
- end
124
+ unless ldap_user_obj.is_a? Array
125
+ ldap_user_obj = ldap_user_obj.split
126
+ end
98
127
 
99
- ldap_base.each do |search_base|
100
- ldap_user_obj.each do |search_user_obj|
101
- result = authenticate_ldap(
102
- ldap_port,
103
- ldap_host,
104
- ldap_encryption_hash,
105
- search_user_obj,
106
- search_base,
107
- username_str,
108
- password_str
109
- )
110
- return true if result
128
+ ldap_base.each do |search_base|
129
+ ldap_user_obj.each do |search_user_obj|
130
+ result = authenticate_ldap(
131
+ ldap_port,
132
+ ldap_host,
133
+ ldap_encryption_hash,
134
+ search_user_obj,
135
+ search_base,
136
+ username_str,
137
+ password_str
138
+ )
139
+ return true if result
140
+ end
111
141
  end
112
- end
113
142
 
114
- return false
143
+ return false
144
+ end
115
145
  end
116
146
  end
117
147
 
118
148
  def export_tags(backend, hostname, tags)
119
- backend.pipelined do
120
- tags.each_pair do |tag, value|
121
- next if value.nil? or value.empty?
149
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
150
+ backend.pipelined do |pipeline|
151
+ tags.each_pair do |tag, value|
152
+ next if value.nil? or value.empty?
122
153
 
123
- backend.hset("vmpooler__vm__#{hostname}", "tag:#{tag}", value)
124
- backend.hset("vmpooler__tag__#{Date.today}", "#{hostname}:#{tag}", value)
154
+ pipeline.hset("vmpooler__vm__#{hostname}", "tag:#{tag}", value)
155
+ pipeline.hset("vmpooler__tag__#{Date.today}", "#{hostname}:#{tag}", value)
156
+ end
125
157
  end
126
158
  end
127
159
  end
128
160
 
129
161
  def filter_tags(tags)
130
- return unless Vmpooler::API.settings.config[:tagfilter]
162
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
163
+ return unless Vmpooler::API.settings.config[:tagfilter]
131
164
 
132
- tags.each_pair do |tag, value|
133
- next unless filter = Vmpooler::API.settings.config[:tagfilter][tag]
165
+ tags.each_pair do |tag, value|
166
+ next unless filter = Vmpooler::API.settings.config[:tagfilter][tag]
134
167
 
135
- tags[tag] = value.match(filter).captures.join if value.match(filter)
136
- end
168
+ tags[tag] = value.match(filter).captures.join if value.match(filter)
169
+ end
137
170
 
138
- tags
171
+ tags
172
+ end
139
173
  end
140
174
 
141
175
  def mean(list)
@@ -147,310 +181,327 @@ module Vmpooler
147
181
  /^\d{4}-\d{2}-\d{2}$/ === date_str
148
182
  end
149
183
 
184
+ # NOTE: domain is not needed here, so we should update the callers of this method
150
185
  def hostname_shorten(hostname, domain=nil)
151
- if domain && hostname =~ /^[\w-]+\.#{domain}$/
152
- hostname = hostname[/[^.]+/]
153
- end
154
-
155
- hostname
186
+ hostname[/[^.]+/]
156
187
  end
157
188
 
158
189
  def get_task_times(backend, task, date_str)
159
- backend.hvals("vmpooler__#{task}__" + date_str).map(&:to_f)
190
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
191
+ backend.hvals("vmpooler__#{task}__" + date_str).map(&:to_f)
192
+ end
160
193
  end
161
194
 
162
195
  # Takes the pools and a key to run scard on
163
196
  # returns an integer for the total count
164
197
  def get_total_across_pools_redis_scard(pools, key, backend)
165
- # using pipelined is much faster than querying each of the pools and adding them
166
- # as we get the result.
167
- res = backend.pipelined do
168
- pools.each do |pool|
169
- backend.scard(key + pool['name'])
198
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
199
+ # using pipelined is much faster than querying each of the pools and adding them
200
+ # as we get the result.
201
+ res = backend.pipelined do |pipeline|
202
+ pools.each do |pool|
203
+ pipeline.scard(key + pool['name'])
204
+ end
170
205
  end
206
+ res.inject(0) { |m, x| m + x }.to_i
171
207
  end
172
- res.inject(0) { |m, x| m + x }.to_i
173
208
  end
174
209
 
175
210
  # Takes the pools and a key to run scard on
176
211
  # returns a hash with each pool name as key and the value being the count as integer
177
212
  def get_list_across_pools_redis_scard(pools, key, backend)
178
- # using pipelined is much faster than querying each of the pools and adding them
179
- # as we get the result.
180
- temp_hash = {}
181
- res = backend.pipelined do
182
- pools.each do |pool|
183
- backend.scard(key + pool['name'])
213
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
214
+ # using pipelined is much faster than querying each of the pools and adding them
215
+ # as we get the result.
216
+ temp_hash = {}
217
+ res = backend.pipelined do |pipeline|
218
+ pools.each do |pool|
219
+ pipeline.scard(key + pool['name'])
220
+ end
184
221
  end
222
+ pools.each_with_index do |pool, i|
223
+ temp_hash[pool['name']] = res[i].to_i
224
+ end
225
+ temp_hash
185
226
  end
186
- pools.each_with_index do |pool, i|
187
- temp_hash[pool['name']] = res[i].to_i
188
- end
189
- temp_hash
190
227
  end
191
228
 
192
229
  # Takes the pools and a key to run hget on
193
230
  # returns a hash with each pool name as key and the value as string
194
231
  def get_list_across_pools_redis_hget(pools, key, backend)
195
- # using pipelined is much faster than querying each of the pools and adding them
196
- # as we get the result.
197
- temp_hash = {}
198
- res = backend.pipelined do
199
- pools.each do |pool|
200
- backend.hget(key, pool['name'])
232
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
233
+ # using pipelined is much faster than querying each of the pools and adding them
234
+ # as we get the result.
235
+ temp_hash = {}
236
+ res = backend.pipelined do |pipeline|
237
+ pools.each do |pool|
238
+ pipeline.hget(key, pool['name'])
239
+ end
201
240
  end
241
+ pools.each_with_index do |pool, i|
242
+ temp_hash[pool['name']] = res[i].to_s
243
+ end
244
+ temp_hash
202
245
  end
203
- pools.each_with_index do |pool, i|
204
- temp_hash[pool['name']] = res[i].to_s
205
- end
206
- temp_hash
207
246
  end
208
247
 
209
248
  def get_capacity_metrics(pools, backend)
210
- capacity = {
211
- current: 0,
212
- total: 0,
213
- percent: 0
214
- }
249
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
250
+ capacity = {
251
+ current: 0,
252
+ total: 0,
253
+ percent: 0
254
+ }
215
255
 
216
- pools.each do |pool|
217
- capacity[:total] += pool['size'].to_i
218
- end
256
+ pools.each do |pool|
257
+ capacity[:total] += pool['size'].to_i
258
+ end
219
259
 
220
- capacity[:current] = get_total_across_pools_redis_scard(pools, 'vmpooler__ready__', backend)
260
+ capacity[:current] = get_total_across_pools_redis_scard(pools, 'vmpooler__ready__', backend)
221
261
 
222
- if capacity[:total] > 0
223
- capacity[:percent] = (capacity[:current].fdiv(capacity[:total]) * 100.0).round(1)
224
- end
262
+ if capacity[:total] > 0
263
+ capacity[:percent] = (capacity[:current].fdiv(capacity[:total]) * 100.0).round(1)
264
+ end
225
265
 
226
- capacity
266
+ capacity
267
+ end
227
268
  end
228
269
 
229
270
  def get_queue_metrics(pools, backend)
230
- queue = {
231
- pending: 0,
232
- cloning: 0,
233
- booting: 0,
234
- ready: 0,
235
- running: 0,
236
- completed: 0,
237
- total: 0
238
- }
239
-
240
- queue[:pending] = get_total_across_pools_redis_scard(pools, 'vmpooler__pending__', backend)
241
- queue[:ready] = get_total_across_pools_redis_scard(pools, 'vmpooler__ready__', backend)
242
- queue[:running] = get_total_across_pools_redis_scard(pools, 'vmpooler__running__', backend)
243
- queue[:completed] = get_total_across_pools_redis_scard(pools, 'vmpooler__completed__', backend)
244
-
245
- queue[:cloning] = backend.get('vmpooler__tasks__clone').to_i + backend.get('vmpooler__tasks__ondemandclone').to_i
246
- queue[:booting] = queue[:pending].to_i - queue[:cloning].to_i
247
- queue[:booting] = 0 if queue[:booting] < 0
248
- queue[:total] = queue[:pending].to_i + queue[:ready].to_i + queue[:running].to_i + queue[:completed].to_i
249
-
250
- queue
271
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
272
+ queue = {
273
+ pending: 0,
274
+ cloning: 0,
275
+ booting: 0,
276
+ ready: 0,
277
+ running: 0,
278
+ completed: 0,
279
+ total: 0
280
+ }
281
+
282
+ queue[:pending] = get_total_across_pools_redis_scard(pools, 'vmpooler__pending__', backend)
283
+ queue[:ready] = get_total_across_pools_redis_scard(pools, 'vmpooler__ready__', backend)
284
+ queue[:running] = get_total_across_pools_redis_scard(pools, 'vmpooler__running__', backend)
285
+ queue[:completed] = get_total_across_pools_redis_scard(pools, 'vmpooler__completed__', backend)
286
+
287
+ queue[:cloning] = backend.get('vmpooler__tasks__clone').to_i + backend.get('vmpooler__tasks__ondemandclone').to_i
288
+ queue[:booting] = queue[:pending].to_i - queue[:cloning].to_i
289
+ queue[:booting] = 0 if queue[:booting] < 0
290
+ queue[:total] = queue[:pending].to_i + queue[:ready].to_i + queue[:running].to_i + queue[:completed].to_i
291
+
292
+ queue
293
+ end
251
294
  end
252
295
 
253
296
  def get_tag_metrics(backend, date_str, opts = {})
254
- opts = {:only => false}.merge(opts)
297
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
298
+ opts = {:only => false}.merge(opts)
255
299
 
256
- tags = {}
300
+ tags = {}
257
301
 
258
- backend.hgetall("vmpooler__tag__#{date_str}").each do |key, value|
259
- hostname = 'unknown'
260
- tag = 'unknown'
302
+ backend.hgetall("vmpooler__tag__#{date_str}").each do |key, value|
303
+ hostname = 'unknown'
304
+ tag = 'unknown'
261
305
 
262
- if key =~ /:/
263
- hostname, tag = key.split(':', 2)
264
- end
306
+ if key =~ /:/
307
+ hostname, tag = key.split(':', 2)
308
+ end
265
309
 
266
- next if opts[:only] && tag != opts[:only]
310
+ next if opts[:only] && tag != opts[:only]
267
311
 
268
- tags[tag] ||= {}
269
- tags[tag][value] ||= 0
270
- tags[tag][value] += 1
312
+ tags[tag] ||= {}
313
+ tags[tag][value] ||= 0
314
+ tags[tag][value] += 1
271
315
 
272
- tags[tag]['total'] ||= 0
273
- tags[tag]['total'] += 1
274
- end
316
+ tags[tag]['total'] ||= 0
317
+ tags[tag]['total'] += 1
318
+ end
275
319
 
276
- tags
320
+ tags
321
+ end
277
322
  end
278
323
 
279
324
  def get_tag_summary(backend, from_date, to_date, opts = {})
280
- opts = {:only => false}.merge(opts)
325
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
326
+ opts = {:only => false}.merge(opts)
281
327
 
282
- result = {
283
- tag: {},
284
- daily: []
285
- }
286
-
287
- (from_date..to_date).each do |date|
288
- daily = {
289
- date: date.to_s,
290
- tag: get_tag_metrics(backend, date.to_s, opts)
328
+ result = {
329
+ tag: {},
330
+ daily: []
291
331
  }
292
- result[:daily].push(daily)
293
- end
294
332
 
295
- result[:daily].each do |daily|
296
- daily[:tag].each_key do |tag|
297
- result[:tag][tag] ||= {}
333
+ (from_date..to_date).each do |date|
334
+ daily = {
335
+ date: date.to_s,
336
+ tag: get_tag_metrics(backend, date.to_s, opts)
337
+ }
338
+ result[:daily].push(daily)
339
+ end
298
340
 
299
- daily[:tag][tag].each do |key, value|
300
- result[:tag][tag][key] ||= 0
301
- result[:tag][tag][key] += value
341
+ result[:daily].each do |daily|
342
+ daily[:tag].each_key do |tag|
343
+ result[:tag][tag] ||= {}
344
+
345
+ daily[:tag][tag].each do |key, value|
346
+ result[:tag][tag][key] ||= 0
347
+ result[:tag][tag][key] += value
348
+ end
302
349
  end
303
350
  end
304
- end
305
351
 
306
- result
352
+ result
353
+ end
307
354
  end
308
355
 
309
356
  def get_task_metrics(backend, task_str, date_str, opts = {})
310
- opts = {:bypool => false, :only => false}.merge(opts)
311
-
312
- task = {
313
- duration: {
314
- average: 0,
315
- min: 0,
316
- max: 0,
317
- total: 0
318
- },
319
- count: {
320
- total: 0
321
- }
322
- }
357
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
358
+ opts = {:bypool => false, :only => false}.merge(opts)
359
+
360
+ task = {
361
+ duration: {
362
+ average: 0,
363
+ min: 0,
364
+ max: 0,
365
+ total: 0
366
+ },
367
+ count: {
368
+ total: 0
369
+ }
370
+ }
323
371
 
324
- task[:count][:total] = backend.hlen("vmpooler__#{task_str}__#{date_str}").to_i
372
+ task[:count][:total] = backend.hlen("vmpooler__#{task_str}__#{date_str}").to_i
325
373
 
326
- if task[:count][:total] > 0
327
- if opts[:bypool] == true
328
- task_times_bypool = {}
374
+ if task[:count][:total] > 0
375
+ if opts[:bypool] == true
376
+ task_times_bypool = {}
329
377
 
330
- task[:count][:pool] = {}
331
- task[:duration][:pool] = {}
378
+ task[:count][:pool] = {}
379
+ task[:duration][:pool] = {}
332
380
 
333
- backend.hgetall("vmpooler__#{task_str}__#{date_str}").each do |key, value|
334
- pool = 'unknown'
335
- hostname = 'unknown'
381
+ backend.hgetall("vmpooler__#{task_str}__#{date_str}").each do |key, value|
382
+ pool = 'unknown'
383
+ hostname = 'unknown'
336
384
 
337
- if key =~ /:/
338
- pool, hostname = key.split(':')
339
- else
340
- hostname = key
341
- end
385
+ if key =~ /:/
386
+ pool, hostname = key.split(':')
387
+ else
388
+ hostname = key
389
+ end
342
390
 
343
- task[:count][:pool][pool] ||= {}
344
- task[:duration][:pool][pool] ||= {}
391
+ task[:count][:pool][pool] ||= {}
392
+ task[:duration][:pool][pool] ||= {}
345
393
 
346
- task_times_bypool[pool] ||= []
347
- task_times_bypool[pool].push(value.to_f)
348
- end
394
+ task_times_bypool[pool] ||= []
395
+ task_times_bypool[pool].push(value.to_f)
396
+ end
349
397
 
350
- task_times_bypool.each_key do |pool|
351
- task[:count][:pool][pool][:total] = task_times_bypool[pool].length
398
+ task_times_bypool.each_key do |pool|
399
+ task[:count][:pool][pool][:total] = task_times_bypool[pool].length
352
400
 
353
- task[:duration][:pool][pool][:total] = task_times_bypool[pool].reduce(:+).to_f
354
- task[:duration][:pool][pool][:average] = (task[:duration][:pool][pool][:total] / task[:count][:pool][pool][:total]).round(1)
355
- task[:duration][:pool][pool][:min], task[:duration][:pool][pool][:max] = task_times_bypool[pool].minmax
401
+ task[:duration][:pool][pool][:total] = task_times_bypool[pool].reduce(:+).to_f
402
+ task[:duration][:pool][pool][:average] = (task[:duration][:pool][pool][:total] / task[:count][:pool][pool][:total]).round(1)
403
+ task[:duration][:pool][pool][:min], task[:duration][:pool][pool][:max] = task_times_bypool[pool].minmax
404
+ end
356
405
  end
357
- end
358
406
 
359
- task_times = get_task_times(backend, task_str, date_str)
407
+ task_times = get_task_times(backend, task_str, date_str)
360
408
 
361
- task[:duration][:total] = task_times.reduce(:+).to_f
362
- task[:duration][:average] = (task[:duration][:total] / task[:count][:total]).round(1)
363
- task[:duration][:min], task[:duration][:max] = task_times.minmax
364
- end
409
+ task[:duration][:total] = task_times.reduce(:+).to_f
410
+ task[:duration][:average] = (task[:duration][:total] / task[:count][:total]).round(1)
411
+ task[:duration][:min], task[:duration][:max] = task_times.minmax
412
+ end
365
413
 
366
- if opts[:only]
367
- task.each_key do |key|
368
- task.delete(key) unless key.to_s == opts[:only]
414
+ if opts[:only]
415
+ task.each_key do |key|
416
+ task.delete(key) unless key.to_s == opts[:only]
417
+ end
369
418
  end
370
- end
371
419
 
372
- task
420
+ task
421
+ end
373
422
  end
374
423
 
375
424
  def get_task_summary(backend, task_str, from_date, to_date, opts = {})
376
- opts = {:bypool => false, :only => false}.merge(opts)
377
-
378
- task_sym = task_str.to_sym
425
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
426
+ opts = {:bypool => false, :only => false}.merge(opts)
379
427
 
380
- result = {
381
- task_sym => {},
382
- daily: []
383
- }
428
+ task_sym = task_str.to_sym
384
429
 
385
- (from_date..to_date).each do |date|
386
- daily = {
387
- date: date.to_s,
388
- task_sym => get_task_metrics(backend, task_str, date.to_s, opts)
430
+ result = {
431
+ task_sym => {},
432
+ daily: []
389
433
  }
390
- result[:daily].push(daily)
391
- end
392
434
 
393
- daily_task = {}
394
- daily_task_bypool = {} if opts[:bypool] == true
435
+ (from_date..to_date).each do |date|
436
+ daily = {
437
+ date: date.to_s,
438
+ task_sym => get_task_metrics(backend, task_str, date.to_s, opts)
439
+ }
440
+ result[:daily].push(daily)
441
+ end
442
+
443
+ daily_task = {}
444
+ daily_task_bypool = {} if opts[:bypool] == true
395
445
 
396
- result[:daily].each do |daily|
397
- daily[task_sym].each_key do |type|
398
- result[task_sym][type] ||= {}
399
- daily_task[type] ||= {}
446
+ result[:daily].each do |daily|
447
+ daily[task_sym].each_key do |type|
448
+ result[task_sym][type] ||= {}
449
+ daily_task[type] ||= {}
400
450
 
401
- ['min', 'max'].each do |key|
402
- if daily[task_sym][type][key]
403
- daily_task[type][:data] ||= []
404
- daily_task[type][:data].push(daily[task_sym][type][key])
451
+ ['min', 'max'].each do |key|
452
+ if daily[task_sym][type][key]
453
+ daily_task[type][:data] ||= []
454
+ daily_task[type][:data].push(daily[task_sym][type][key])
455
+ end
405
456
  end
406
- end
407
457
 
408
- result[task_sym][type][:total] ||= 0
409
- result[task_sym][type][:total] += daily[task_sym][type][:total]
458
+ result[task_sym][type][:total] ||= 0
459
+ result[task_sym][type][:total] += daily[task_sym][type][:total]
410
460
 
411
- if opts[:bypool] == true
412
- result[task_sym][type][:pool] ||= {}
413
- daily_task_bypool[type] ||= {}
461
+ if opts[:bypool] == true
462
+ result[task_sym][type][:pool] ||= {}
463
+ daily_task_bypool[type] ||= {}
414
464
 
415
- next unless daily[task_sym][type][:pool]
465
+ next unless daily[task_sym][type][:pool]
416
466
 
417
- daily[task_sym][type][:pool].each_key do |pool|
418
- result[task_sym][type][:pool][pool] ||= {}
419
- daily_task_bypool[type][pool] ||= {}
467
+ daily[task_sym][type][:pool].each_key do |pool|
468
+ result[task_sym][type][:pool][pool] ||= {}
469
+ daily_task_bypool[type][pool] ||= {}
420
470
 
421
- ['min', 'max'].each do |key|
422
- if daily[task_sym][type][:pool][pool][key.to_sym]
423
- daily_task_bypool[type][pool][:data] ||= []
424
- daily_task_bypool[type][pool][:data].push(daily[task_sym][type][:pool][pool][key.to_sym])
471
+ ['min', 'max'].each do |key|
472
+ if daily[task_sym][type][:pool][pool][key.to_sym]
473
+ daily_task_bypool[type][pool][:data] ||= []
474
+ daily_task_bypool[type][pool][:data].push(daily[task_sym][type][:pool][pool][key.to_sym])
475
+ end
425
476
  end
426
- end
427
477
 
428
- result[task_sym][type][:pool][pool][:total] ||= 0
429
- result[task_sym][type][:pool][pool][:total] += daily[task_sym][type][:pool][pool][:total]
478
+ result[task_sym][type][:pool][pool][:total] ||= 0
479
+ result[task_sym][type][:pool][pool][:total] += daily[task_sym][type][:pool][pool][:total]
480
+ end
430
481
  end
431
482
  end
432
483
  end
433
- end
434
484
 
435
- result[task_sym].each_key do |type|
436
- if daily_task[type][:data]
437
- result[task_sym][type][:min], result[task_sym][type][:max] = daily_task[type][:data].minmax
438
- result[task_sym][type][:average] = mean(daily_task[type][:data])
439
- end
485
+ result[task_sym].each_key do |type|
486
+ if daily_task[type][:data]
487
+ result[task_sym][type][:min], result[task_sym][type][:max] = daily_task[type][:data].minmax
488
+ result[task_sym][type][:average] = mean(daily_task[type][:data])
489
+ end
440
490
 
441
- if opts[:bypool] == true
442
- result[task_sym].each_key do |type|
443
- result[task_sym][type][:pool].each_key do |pool|
444
- if daily_task_bypool[type][pool][:data]
445
- result[task_sym][type][:pool][pool][:min], result[task_sym][type][:pool][pool][:max] = daily_task_bypool[type][pool][:data].minmax
446
- result[task_sym][type][:pool][pool][:average] = mean(daily_task_bypool[type][pool][:data])
491
+ if opts[:bypool] == true
492
+ result[task_sym].each_key do |type|
493
+ result[task_sym][type][:pool].each_key do |pool|
494
+ if daily_task_bypool[type][pool][:data]
495
+ result[task_sym][type][:pool][pool][:min], result[task_sym][type][:pool][pool][:max] = daily_task_bypool[type][pool][:data].minmax
496
+ result[task_sym][type][:pool][pool][:average] = mean(daily_task_bypool[type][pool][:data])
497
+ end
447
498
  end
448
499
  end
449
500
  end
450
501
  end
451
- end
452
502
 
453
- result
503
+ result
504
+ end
454
505
  end
455
506
 
456
507
  def pool_index(pools)
@@ -464,11 +515,13 @@ module Vmpooler
464
515
  end
465
516
 
466
517
  def template_ready?(pool, backend)
467
- prepared_template = backend.hget('vmpooler__template__prepared', pool['name'])
468
- return false if prepared_template.nil?
469
- return true if pool['template'] == prepared_template
518
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
519
+ prepared_template = backend.hget('vmpooler__template__prepared', pool['name'])
520
+ return false if prepared_template.nil?
521
+ return true if pool['template'] == prepared_template
470
522
 
471
- return false
523
+ return false
524
+ end
472
525
  end
473
526
 
474
527
  def is_integer?(x)
@@ -479,26 +532,39 @@ module Vmpooler
479
532
  end
480
533
 
481
534
  def open_socket(host, domain = nil, timeout = 1, port = 22, &_block)
482
- Timeout.timeout(timeout) do
483
- target_host = host
484
- target_host = "#{host}.#{domain}" if domain
485
- sock = TCPSocket.new target_host, port
486
- begin
487
- yield sock if block_given?
488
- ensure
489
- sock.close
535
+ tracer.in_span(
536
+ "Vmpooler::API::Helpers.#{__method__}",
537
+ attributes: {
538
+ 'net.peer.port' => port,
539
+ 'net.transport' => 'ip_tcp'
540
+ },
541
+ kind: :client
542
+ ) do
543
+ Timeout.timeout(timeout) do
544
+ target_host = host
545
+ target_host = "#{host}.#{domain}" if domain
546
+ span = OpenTelemetry::Trace.current_span
547
+ span.set_attribute('net.peer.name', target_host)
548
+ sock = TCPSocket.new target_host, port
549
+ begin
550
+ yield sock if block_given?
551
+ ensure
552
+ sock.close
553
+ end
490
554
  end
491
555
  end
492
556
  end
493
557
 
494
558
  def vm_ready?(vm_name, domain = nil)
495
- begin
496
- open_socket(vm_name, domain)
497
- rescue StandardError => _e
498
- return false
499
- end
559
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
560
+ begin
561
+ open_socket(vm_name, domain)
562
+ rescue StandardError => _e
563
+ return false
564
+ end
500
565
 
501
- true
566
+ true
567
+ end
502
568
  end
503
569
  end
504
570
  end