vmpooler 2.1.0 → 2.2.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
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
+ backend.hset("vmpooler__vm__#{hostname}", "tag:#{tag}", value)
155
+ backend.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)
@@ -156,301 +190,321 @@ module Vmpooler
156
190
  end
157
191
 
158
192
  def get_task_times(backend, task, date_str)
159
- backend.hvals("vmpooler__#{task}__" + date_str).map(&:to_f)
193
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
194
+ backend.hvals("vmpooler__#{task}__" + date_str).map(&:to_f)
195
+ end
160
196
  end
161
197
 
162
198
  # Takes the pools and a key to run scard on
163
199
  # returns an integer for the total count
164
200
  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'])
201
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
202
+ # using pipelined is much faster than querying each of the pools and adding them
203
+ # as we get the result.
204
+ res = backend.pipelined do
205
+ pools.each do |pool|
206
+ backend.scard(key + pool['name'])
207
+ end
170
208
  end
209
+ res.inject(0) { |m, x| m + x }.to_i
171
210
  end
172
- res.inject(0) { |m, x| m + x }.to_i
173
211
  end
174
212
 
175
213
  # Takes the pools and a key to run scard on
176
214
  # returns a hash with each pool name as key and the value being the count as integer
177
215
  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'])
216
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
217
+ # using pipelined is much faster than querying each of the pools and adding them
218
+ # as we get the result.
219
+ temp_hash = {}
220
+ res = backend.pipelined do
221
+ pools.each do |pool|
222
+ backend.scard(key + pool['name'])
223
+ end
184
224
  end
225
+ pools.each_with_index do |pool, i|
226
+ temp_hash[pool['name']] = res[i].to_i
227
+ end
228
+ temp_hash
185
229
  end
186
- pools.each_with_index do |pool, i|
187
- temp_hash[pool['name']] = res[i].to_i
188
- end
189
- temp_hash
190
230
  end
191
231
 
192
232
  # Takes the pools and a key to run hget on
193
233
  # returns a hash with each pool name as key and the value as string
194
234
  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'])
235
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
236
+ # using pipelined is much faster than querying each of the pools and adding them
237
+ # as we get the result.
238
+ temp_hash = {}
239
+ res = backend.pipelined do
240
+ pools.each do |pool|
241
+ backend.hget(key, pool['name'])
242
+ end
201
243
  end
244
+ pools.each_with_index do |pool, i|
245
+ temp_hash[pool['name']] = res[i].to_s
246
+ end
247
+ temp_hash
202
248
  end
203
- pools.each_with_index do |pool, i|
204
- temp_hash[pool['name']] = res[i].to_s
205
- end
206
- temp_hash
207
249
  end
208
250
 
209
251
  def get_capacity_metrics(pools, backend)
210
- capacity = {
211
- current: 0,
212
- total: 0,
213
- percent: 0
214
- }
252
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
253
+ capacity = {
254
+ current: 0,
255
+ total: 0,
256
+ percent: 0
257
+ }
215
258
 
216
- pools.each do |pool|
217
- capacity[:total] += pool['size'].to_i
218
- end
259
+ pools.each do |pool|
260
+ capacity[:total] += pool['size'].to_i
261
+ end
219
262
 
220
- capacity[:current] = get_total_across_pools_redis_scard(pools, 'vmpooler__ready__', backend)
263
+ capacity[:current] = get_total_across_pools_redis_scard(pools, 'vmpooler__ready__', backend)
221
264
 
222
- if capacity[:total] > 0
223
- capacity[:percent] = (capacity[:current].fdiv(capacity[:total]) * 100.0).round(1)
224
- end
265
+ if capacity[:total] > 0
266
+ capacity[:percent] = (capacity[:current].fdiv(capacity[:total]) * 100.0).round(1)
267
+ end
225
268
 
226
- capacity
269
+ capacity
270
+ end
227
271
  end
228
272
 
229
273
  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
274
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
275
+ queue = {
276
+ pending: 0,
277
+ cloning: 0,
278
+ booting: 0,
279
+ ready: 0,
280
+ running: 0,
281
+ completed: 0,
282
+ total: 0
283
+ }
284
+
285
+ queue[:pending] = get_total_across_pools_redis_scard(pools, 'vmpooler__pending__', backend)
286
+ queue[:ready] = get_total_across_pools_redis_scard(pools, 'vmpooler__ready__', backend)
287
+ queue[:running] = get_total_across_pools_redis_scard(pools, 'vmpooler__running__', backend)
288
+ queue[:completed] = get_total_across_pools_redis_scard(pools, 'vmpooler__completed__', backend)
289
+
290
+ queue[:cloning] = backend.get('vmpooler__tasks__clone').to_i + backend.get('vmpooler__tasks__ondemandclone').to_i
291
+ queue[:booting] = queue[:pending].to_i - queue[:cloning].to_i
292
+ queue[:booting] = 0 if queue[:booting] < 0
293
+ queue[:total] = queue[:pending].to_i + queue[:ready].to_i + queue[:running].to_i + queue[:completed].to_i
294
+
295
+ queue
296
+ end
251
297
  end
252
298
 
253
299
  def get_tag_metrics(backend, date_str, opts = {})
254
- opts = {:only => false}.merge(opts)
300
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
301
+ opts = {:only => false}.merge(opts)
255
302
 
256
- tags = {}
303
+ tags = {}
257
304
 
258
- backend.hgetall("vmpooler__tag__#{date_str}").each do |key, value|
259
- hostname = 'unknown'
260
- tag = 'unknown'
305
+ backend.hgetall("vmpooler__tag__#{date_str}").each do |key, value|
306
+ hostname = 'unknown'
307
+ tag = 'unknown'
261
308
 
262
- if key =~ /:/
263
- hostname, tag = key.split(':', 2)
264
- end
309
+ if key =~ /:/
310
+ hostname, tag = key.split(':', 2)
311
+ end
265
312
 
266
- next if opts[:only] && tag != opts[:only]
313
+ next if opts[:only] && tag != opts[:only]
267
314
 
268
- tags[tag] ||= {}
269
- tags[tag][value] ||= 0
270
- tags[tag][value] += 1
315
+ tags[tag] ||= {}
316
+ tags[tag][value] ||= 0
317
+ tags[tag][value] += 1
271
318
 
272
- tags[tag]['total'] ||= 0
273
- tags[tag]['total'] += 1
274
- end
319
+ tags[tag]['total'] ||= 0
320
+ tags[tag]['total'] += 1
321
+ end
275
322
 
276
- tags
323
+ tags
324
+ end
277
325
  end
278
326
 
279
327
  def get_tag_summary(backend, from_date, to_date, opts = {})
280
- opts = {:only => false}.merge(opts)
281
-
282
- result = {
283
- tag: {},
284
- daily: []
285
- }
328
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
329
+ opts = {:only => false}.merge(opts)
286
330
 
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)
331
+ result = {
332
+ tag: {},
333
+ daily: []
291
334
  }
292
- result[:daily].push(daily)
293
- end
294
335
 
295
- result[:daily].each do |daily|
296
- daily[:tag].each_key do |tag|
297
- result[:tag][tag] ||= {}
336
+ (from_date..to_date).each do |date|
337
+ daily = {
338
+ date: date.to_s,
339
+ tag: get_tag_metrics(backend, date.to_s, opts)
340
+ }
341
+ result[:daily].push(daily)
342
+ end
343
+
344
+ result[:daily].each do |daily|
345
+ daily[:tag].each_key do |tag|
346
+ result[:tag][tag] ||= {}
298
347
 
299
- daily[:tag][tag].each do |key, value|
300
- result[:tag][tag][key] ||= 0
301
- result[:tag][tag][key] += value
348
+ daily[:tag][tag].each do |key, value|
349
+ result[:tag][tag][key] ||= 0
350
+ result[:tag][tag][key] += value
351
+ end
302
352
  end
303
353
  end
304
- end
305
354
 
306
- result
355
+ result
356
+ end
307
357
  end
308
358
 
309
359
  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
- }
360
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
361
+ opts = {:bypool => false, :only => false}.merge(opts)
362
+
363
+ task = {
364
+ duration: {
365
+ average: 0,
366
+ min: 0,
367
+ max: 0,
368
+ total: 0
369
+ },
370
+ count: {
371
+ total: 0
372
+ }
373
+ }
323
374
 
324
- task[:count][:total] = backend.hlen("vmpooler__#{task_str}__#{date_str}").to_i
375
+ task[:count][:total] = backend.hlen("vmpooler__#{task_str}__#{date_str}").to_i
325
376
 
326
- if task[:count][:total] > 0
327
- if opts[:bypool] == true
328
- task_times_bypool = {}
377
+ if task[:count][:total] > 0
378
+ if opts[:bypool] == true
379
+ task_times_bypool = {}
329
380
 
330
- task[:count][:pool] = {}
331
- task[:duration][:pool] = {}
381
+ task[:count][:pool] = {}
382
+ task[:duration][:pool] = {}
332
383
 
333
- backend.hgetall("vmpooler__#{task_str}__#{date_str}").each do |key, value|
334
- pool = 'unknown'
335
- hostname = 'unknown'
384
+ backend.hgetall("vmpooler__#{task_str}__#{date_str}").each do |key, value|
385
+ pool = 'unknown'
386
+ hostname = 'unknown'
336
387
 
337
- if key =~ /:/
338
- pool, hostname = key.split(':')
339
- else
340
- hostname = key
341
- end
388
+ if key =~ /:/
389
+ pool, hostname = key.split(':')
390
+ else
391
+ hostname = key
392
+ end
342
393
 
343
- task[:count][:pool][pool] ||= {}
344
- task[:duration][:pool][pool] ||= {}
394
+ task[:count][:pool][pool] ||= {}
395
+ task[:duration][:pool][pool] ||= {}
345
396
 
346
- task_times_bypool[pool] ||= []
347
- task_times_bypool[pool].push(value.to_f)
348
- end
397
+ task_times_bypool[pool] ||= []
398
+ task_times_bypool[pool].push(value.to_f)
399
+ end
349
400
 
350
- task_times_bypool.each_key do |pool|
351
- task[:count][:pool][pool][:total] = task_times_bypool[pool].length
401
+ task_times_bypool.each_key do |pool|
402
+ task[:count][:pool][pool][:total] = task_times_bypool[pool].length
352
403
 
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
404
+ task[:duration][:pool][pool][:total] = task_times_bypool[pool].reduce(:+).to_f
405
+ task[:duration][:pool][pool][:average] = (task[:duration][:pool][pool][:total] / task[:count][:pool][pool][:total]).round(1)
406
+ task[:duration][:pool][pool][:min], task[:duration][:pool][pool][:max] = task_times_bypool[pool].minmax
407
+ end
356
408
  end
357
- end
358
409
 
359
- task_times = get_task_times(backend, task_str, date_str)
410
+ task_times = get_task_times(backend, task_str, date_str)
360
411
 
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
412
+ task[:duration][:total] = task_times.reduce(:+).to_f
413
+ task[:duration][:average] = (task[:duration][:total] / task[:count][:total]).round(1)
414
+ task[:duration][:min], task[:duration][:max] = task_times.minmax
415
+ end
365
416
 
366
- if opts[:only]
367
- task.each_key do |key|
368
- task.delete(key) unless key.to_s == opts[:only]
417
+ if opts[:only]
418
+ task.each_key do |key|
419
+ task.delete(key) unless key.to_s == opts[:only]
420
+ end
369
421
  end
370
- end
371
422
 
372
- task
423
+ task
424
+ end
373
425
  end
374
426
 
375
427
  def get_task_summary(backend, task_str, from_date, to_date, opts = {})
376
- opts = {:bypool => false, :only => false}.merge(opts)
428
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
429
+ opts = {:bypool => false, :only => false}.merge(opts)
377
430
 
378
- task_sym = task_str.to_sym
431
+ task_sym = task_str.to_sym
379
432
 
380
- result = {
381
- task_sym => {},
382
- daily: []
383
- }
384
-
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)
433
+ result = {
434
+ task_sym => {},
435
+ daily: []
389
436
  }
390
- result[:daily].push(daily)
391
- end
392
437
 
393
- daily_task = {}
394
- daily_task_bypool = {} if opts[:bypool] == true
438
+ (from_date..to_date).each do |date|
439
+ daily = {
440
+ date: date.to_s,
441
+ task_sym => get_task_metrics(backend, task_str, date.to_s, opts)
442
+ }
443
+ result[:daily].push(daily)
444
+ end
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
+ daily_task = {}
447
+ daily_task_bypool = {} if opts[:bypool] == true
400
448
 
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])
449
+ result[:daily].each do |daily|
450
+ daily[task_sym].each_key do |type|
451
+ result[task_sym][type] ||= {}
452
+ daily_task[type] ||= {}
453
+
454
+ ['min', 'max'].each do |key|
455
+ if daily[task_sym][type][key]
456
+ daily_task[type][:data] ||= []
457
+ daily_task[type][:data].push(daily[task_sym][type][key])
458
+ end
405
459
  end
406
- end
407
460
 
408
- result[task_sym][type][:total] ||= 0
409
- result[task_sym][type][:total] += daily[task_sym][type][:total]
461
+ result[task_sym][type][:total] ||= 0
462
+ result[task_sym][type][:total] += daily[task_sym][type][:total]
410
463
 
411
- if opts[:bypool] == true
412
- result[task_sym][type][:pool] ||= {}
413
- daily_task_bypool[type] ||= {}
464
+ if opts[:bypool] == true
465
+ result[task_sym][type][:pool] ||= {}
466
+ daily_task_bypool[type] ||= {}
414
467
 
415
- next unless daily[task_sym][type][:pool]
468
+ next unless daily[task_sym][type][:pool]
416
469
 
417
- daily[task_sym][type][:pool].each_key do |pool|
418
- result[task_sym][type][:pool][pool] ||= {}
419
- daily_task_bypool[type][pool] ||= {}
470
+ daily[task_sym][type][:pool].each_key do |pool|
471
+ result[task_sym][type][:pool][pool] ||= {}
472
+ daily_task_bypool[type][pool] ||= {}
420
473
 
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])
474
+ ['min', 'max'].each do |key|
475
+ if daily[task_sym][type][:pool][pool][key.to_sym]
476
+ daily_task_bypool[type][pool][:data] ||= []
477
+ daily_task_bypool[type][pool][:data].push(daily[task_sym][type][:pool][pool][key.to_sym])
478
+ end
425
479
  end
426
- end
427
480
 
428
- result[task_sym][type][:pool][pool][:total] ||= 0
429
- result[task_sym][type][:pool][pool][:total] += daily[task_sym][type][:pool][pool][:total]
481
+ result[task_sym][type][:pool][pool][:total] ||= 0
482
+ result[task_sym][type][:pool][pool][:total] += daily[task_sym][type][:pool][pool][:total]
483
+ end
430
484
  end
431
485
  end
432
486
  end
433
- end
434
487
 
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
488
+ result[task_sym].each_key do |type|
489
+ if daily_task[type][:data]
490
+ result[task_sym][type][:min], result[task_sym][type][:max] = daily_task[type][:data].minmax
491
+ result[task_sym][type][:average] = mean(daily_task[type][:data])
492
+ end
440
493
 
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])
494
+ if opts[:bypool] == true
495
+ result[task_sym].each_key do |type|
496
+ result[task_sym][type][:pool].each_key do |pool|
497
+ if daily_task_bypool[type][pool][:data]
498
+ result[task_sym][type][:pool][pool][:min], result[task_sym][type][:pool][pool][:max] = daily_task_bypool[type][pool][:data].minmax
499
+ result[task_sym][type][:pool][pool][:average] = mean(daily_task_bypool[type][pool][:data])
500
+ end
447
501
  end
448
502
  end
449
503
  end
450
504
  end
451
- end
452
505
 
453
- result
506
+ result
507
+ end
454
508
  end
455
509
 
456
510
  def pool_index(pools)
@@ -464,11 +518,13 @@ module Vmpooler
464
518
  end
465
519
 
466
520
  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
521
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
522
+ prepared_template = backend.hget('vmpooler__template__prepared', pool['name'])
523
+ return false if prepared_template.nil?
524
+ return true if pool['template'] == prepared_template
470
525
 
471
- return false
526
+ return false
527
+ end
472
528
  end
473
529
 
474
530
  def is_integer?(x)
@@ -479,26 +535,39 @@ module Vmpooler
479
535
  end
480
536
 
481
537
  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
538
+ tracer.in_span(
539
+ "Vmpooler::API::Helpers.#{__method__}",
540
+ attributes: {
541
+ 'net.peer.port' => port,
542
+ 'net.transport' => 'ip_tcp'
543
+ },
544
+ kind: :client
545
+ ) do
546
+ Timeout.timeout(timeout) do
547
+ target_host = host
548
+ target_host = "#{host}.#{domain}" if domain
549
+ span = OpenTelemetry::Trace.current_span
550
+ span.set_attribute('net.peer.name', target_host)
551
+ sock = TCPSocket.new target_host, port
552
+ begin
553
+ yield sock if block_given?
554
+ ensure
555
+ sock.close
556
+ end
490
557
  end
491
558
  end
492
559
  end
493
560
 
494
561
  def vm_ready?(vm_name, domain = nil)
495
- begin
496
- open_socket(vm_name, domain)
497
- rescue StandardError => _e
498
- return false
499
- end
562
+ tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
563
+ begin
564
+ open_socket(vm_name, domain)
565
+ rescue StandardError => _e
566
+ return false
567
+ end
500
568
 
501
- true
569
+ true
570
+ end
502
571
  end
503
572
  end
504
573
  end