vmpooler 0.18.1 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e3a176887cf8f30a94b12b6eeb6341da12bed5dc6b71d182c0dd4a4c055b78fb
4
- data.tar.gz: 03ce6a7c2845a6b010b0948d2ed430692d4316df6175f2acdf16b924d0244db7
3
+ metadata.gz: 6ae03cde5adef86e2f5b52928b1b241e6e300993f5ab9bca3c76fbba49b5f29a
4
+ data.tar.gz: 3f04c605b3a255baf73ea7a5e985ab5d241411a43763b47e2b8739574b48178b
5
5
  SHA512:
6
- metadata.gz: 0f426a1ca432757c929bc7f792297dd6ad3fba50c03f0469ea0856c1c6561f9e5ca59b2139a8c088cba1c5087ec95ada0e525a4ec3cf06555e09c12dc10ea4b1
7
- data.tar.gz: 5bca724e57bca246e7cf1c680e631cee143e3f287f9525774714b0b86a099e8ab03b75a7f36c28e6225e5de1d2ad915e62e7d981e2dfe4f767eb595717fb3aee
6
+ metadata.gz: 4ec28d2335628c1fe8bf079940db915233c45100e885eb387ffa86bfdcb384078f9fb5aa7fb2985ead5e0b9c8e8f619037a66b0927a9325db8bc8a2cfc63e1ae
7
+ data.tar.gz: dff5b02ccab6c7eab949dab4df8ea2c1d530d6c672278dd9fe7c485e9234b19045f6e65f28870dbe3fe1cbbb8d53aac4fea45cfe008b548e619307b04ba56f25
@@ -163,18 +163,15 @@ module Vmpooler
163
163
  end
164
164
 
165
165
  def return_vm_to_ready_state(template, vm)
166
- backend.multi
167
166
  backend.srem("vmpooler__migrating__#{template}", vm)
168
167
  backend.hdel("vmpooler__active__#{template}", vm)
169
168
  backend.hdel("vmpooler__vm__#{vm}", 'checkout', 'token:token', 'token:user')
170
169
  backend.smove("vmpooler__running__#{template}", "vmpooler__ready__#{template}", vm)
171
- backend.exec
172
170
  end
173
171
 
174
172
  def account_for_starting_vm(template, vm)
175
173
  user = backend.hget("vmpooler__token__#{request.env['HTTP_X_AUTH_TOKEN']}", 'user')
176
174
  has_token_result = has_token?
177
- backend.multi
178
175
  backend.sadd("vmpooler__migrating__#{template}", vm)
179
176
  backend.hset("vmpooler__active__#{template}", vm, Time.now)
180
177
  backend.hset("vmpooler__vm__#{vm}", 'checkout', Time.now)
@@ -187,7 +184,6 @@ module Vmpooler
187
184
  backend.hset("vmpooler__vm__#{vm}", 'lifetime', config['vm_lifetime_auth'].to_i)
188
185
  end
189
186
  end
190
- backend.exec
191
187
  end
192
188
 
193
189
  def update_result_hosts(result, template, vm)
@@ -213,7 +209,8 @@ module Vmpooler
213
209
  if vmname
214
210
  account_for_starting_vm(vmpool, vmname)
215
211
  vms << [vmpool, vmname, vmtemplate]
216
- metrics.increment("checkout.success.#{vmtemplate}")
212
+ metrics.increment("checkout.success.#{vmpool}")
213
+ update_user_metrics('allocate', vmname) if Vmpooler::API.settings.config[:config]['usage_stats']
217
214
  else
218
215
  failed = true
219
216
  metrics.increment("checkout.empty.#{requested}")
@@ -239,6 +236,46 @@ module Vmpooler
239
236
  result
240
237
  end
241
238
 
239
+ def update_user_metrics(operation, vmname)
240
+ backend.multi
241
+ backend.hget("vmpooler__vm__#{vmname}", 'tag:jenkins_build_url')
242
+ backend.hget("vmpooler__vm__#{vmname}", 'token:user')
243
+ backend.hget("vmpooler__vm__#{vmname}", 'template')
244
+ jenkins_build_url, user, poolname = backend.exec
245
+
246
+ if user
247
+ user = user.gsub('.', '_')
248
+ else
249
+ user = 'unauthenticated'
250
+ end
251
+ metrics.increment("user.#{user}.#{operation}.#{poolname}")
252
+
253
+ if jenkins_build_url
254
+ if jenkins_build_url.include? 'litmus'
255
+ # Very simple filter for Litmus jobs - just count them coming through for the moment.
256
+ metrics.increment("usage_litmus.#{user}.#{operation}.#{poolname}")
257
+ return
258
+ end
259
+
260
+ url_parts = jenkins_build_url.split('/')[2..-1]
261
+ jenkins_instance = url_parts[0].gsub('.', '_')
262
+ value_stream_parts = url_parts[2].split('_')
263
+ value_stream_parts = value_stream_parts.map { |s| s.gsub('.', '_') }
264
+ value_stream = value_stream_parts.shift
265
+ branch = value_stream_parts.pop
266
+ project = value_stream_parts.shift
267
+ job_name = value_stream_parts.join('_')
268
+ build_metadata_parts = url_parts[3]
269
+ component_to_test = component_to_test('RMM_COMPONENT_TO_TEST_NAME', build_metadata_parts)
270
+
271
+ metrics.increment("usage_jenkins_instance.#{jenkins_instance}.#{value_stream}.#{operation}.#{poolname}")
272
+ metrics.increment("usage_branch_project.#{branch}.#{project}.#{operation}.#{poolname}")
273
+ metrics.increment("usage_job_component.#{job_name}.#{component_to_test}.#{operation}.#{poolname}")
274
+ end
275
+ rescue StandardError => e
276
+ puts 'd', "[!] [#{poolname}] failed while evaluating usage labels on '#{vmname}' with an error: #{e}"
277
+ end
278
+
242
279
  def update_pool_size(payload)
243
280
  result = { 'ok' => false }
244
281
 
@@ -1173,6 +1210,7 @@ module Vmpooler
1173
1210
  status 200
1174
1211
  result['ok'] = true
1175
1212
  metrics.increment('delete.success')
1213
+ update_user_metrics('destroy', params[:hostname]) if Vmpooler::API.settings.config[:config]['usage_stats']
1176
1214
  else
1177
1215
  metrics.increment('delete.failed')
1178
1216
  end
@@ -113,7 +113,7 @@ module Vmpooler
113
113
  # Similarly, request IDs are also stripped from the /ondemand path.
114
114
  path
115
115
  .gsub(%r{/vm/.+$}, '/vm')
116
- .gsub(%r{/ondemand/.+$}, '/ondemand')
116
+ .gsub(%r{/ondemandvm/.+$}, '/ondemandvm')
117
117
  .gsub(%r{/token/.+$}, '/token')
118
118
  .gsub(%r{/lib/.+$}, '/lib')
119
119
  .gsub(%r{/img/.+$}, '/img')
@@ -165,33 +165,33 @@ module Vmpooler
165
165
  },
166
166
  user: {
167
167
  mtype: M_COUNTER,
168
- torun: %i[manager],
169
- docstring: 'Number of pool instances this user created created',
170
- param_labels: %i[user poolname]
168
+ torun: %i[api],
169
+ docstring: 'Number of pool instances and the operation performed by a user',
170
+ param_labels: %i[user operation poolname]
171
171
  },
172
172
  usage_litmus: {
173
173
  mtype: M_COUNTER,
174
- torun: %i[manager],
175
- docstring: 'Pools by Litmus job usage',
176
- param_labels: %i[user poolname]
174
+ torun: %i[api],
175
+ docstring: 'Number of pool instances and the operation performed by Litmus jobs',
176
+ param_labels: %i[user operation poolname]
177
177
  },
178
178
  usage_jenkins_instance: {
179
179
  mtype: M_COUNTER,
180
- torun: %i[manager],
181
- docstring: 'Pools by Jenkins instance usage',
182
- param_labels: %i[jenkins_instance value_stream poolname]
180
+ torun: %i[api],
181
+ docstring: 'Number of pool instances and the operation performed by Jenkins instances',
182
+ param_labels: %i[jenkins_instance value_stream operation poolname]
183
183
  },
184
184
  usage_branch_project: {
185
185
  mtype: M_COUNTER,
186
- torun: %i[manager],
187
- docstring: 'Pools by branch/project usage',
188
- param_labels: %i[branch project poolname]
186
+ torun: %i[api],
187
+ docstring: 'Number of pool instances and the operation performed by Jenkins branch/project',
188
+ param_labels: %i[branch project operation poolname]
189
189
  },
190
190
  usage_job_component: {
191
191
  mtype: M_COUNTER,
192
- torun: %i[manager],
193
- docstring: 'Pools by job/component usage',
194
- param_labels: %i[job_name component_to_test poolname]
192
+ torun: %i[api],
193
+ docstring: 'Number of pool instances and the operation performed by Jenkins job/component',
194
+ param_labels: %i[job_name component_to_test operation poolname]
195
195
  },
196
196
  checkout: {
197
197
  mtype: M_COUNTER,
@@ -473,54 +473,11 @@ module Vmpooler
473
473
  finish = format('%<time>.2f', time: Time.now - start)
474
474
  $logger.log('s', "[-] [#{pool}] '#{vm}' destroyed in #{finish} seconds")
475
475
  $metrics.timing("destroy.#{pool}", finish)
476
- get_vm_usage_labels(vm, redis)
477
476
  end
478
477
  end
479
478
  dereference_mutex(vm)
480
479
  end
481
480
 
482
- def get_vm_usage_labels(vm, redis)
483
- return unless $config[:config]['usage_stats']
484
-
485
- redis.multi
486
- redis.hget("vmpooler__vm__#{vm}", 'checkout')
487
- redis.hget("vmpooler__vm__#{vm}", 'tag:jenkins_build_url')
488
- redis.hget("vmpooler__vm__#{vm}", 'token:user')
489
- redis.hget("vmpooler__vm__#{vm}", 'template')
490
- checkout, jenkins_build_url, user, poolname = redis.exec
491
- return if checkout.nil?
492
-
493
- user ||= 'unauthenticated'
494
- user = user.gsub('.', '_')
495
- $metrics.increment("user.#{user}.#{poolname}")
496
-
497
- return unless jenkins_build_url
498
-
499
- if jenkins_build_url.include? 'litmus'
500
- # Very simple filter for Litmus jobs - just count them coming through for the moment.
501
- $metrics.increment("usage_litmus.#{user}.#{poolname}")
502
- return
503
- end
504
-
505
- url_parts = jenkins_build_url.split('/')[2..-1]
506
- jenkins_instance = url_parts[0].gsub('.', '_')
507
- value_stream_parts = url_parts[2].split('_')
508
- value_stream_parts = value_stream_parts.map { |s| s.gsub('.', '_') }
509
- value_stream = value_stream_parts.shift
510
- branch = value_stream_parts.pop
511
- project = value_stream_parts.shift
512
- job_name = value_stream_parts.join('_')
513
- build_metadata_parts = url_parts[3]
514
- component_to_test = component_to_test('RMM_COMPONENT_TO_TEST_NAME', build_metadata_parts)
515
-
516
- $metrics.increment("usage_jenkins_instance.#{jenkins_instance}.#{value_stream}.#{poolname}")
517
- $metrics.increment("usage_branch_project.#{branch}.#{project}.#{poolname}")
518
- $metrics.increment("usage_job_component.#{job_name}.#{component_to_test}.#{poolname}")
519
- rescue StandardError => e
520
- $logger.log('d', "[!] [#{poolname}] failed while evaluating usage labels on '#{vm}' with an error: #{e}")
521
- raise
522
- end
523
-
524
481
  def component_to_test(match, labels_string)
525
482
  return if labels_string.nil?
526
483
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Vmpooler
4
- VERSION = '0.18.1'
4
+ VERSION = '1.1.1'
5
5
  end
data/lib/vmpooler.rb CHANGED
@@ -16,7 +16,6 @@ module Vmpooler
16
16
  require 'yaml'
17
17
 
18
18
  # Dependencies for tracing
19
- require 'opentelemetry-api'
20
19
  require 'opentelemetry-instrumentation-concurrent_ruby'
21
20
  require 'opentelemetry-instrumentation-redis'
22
21
  require 'opentelemetry-instrumentation-sinatra'
@@ -237,12 +236,12 @@ module Vmpooler
237
236
  if tracing_enabled.eql?('false')
238
237
  puts "Exporting of traces has been disabled so the span processor has been se to a 'NoopSpanExporter'"
239
238
  span_processor = OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
240
- exporter: OpenTelemetry::SDK::Trace::Export::NoopSpanExporter.new
239
+ OpenTelemetry::SDK::Trace::Export::NoopSpanExporter.new
241
240
  )
242
241
  else
243
242
  puts "Exporting of traces will be done over HTTP in binary Thrift format to #{tracing_jaeger_host}"
244
243
  span_processor = OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
245
- exporter: OpenTelemetry::Exporter::Jaeger::CollectorExporter.new(endpoint: tracing_jaeger_host)
244
+ OpenTelemetry::Exporter::Jaeger::CollectorExporter.new(endpoint: tracing_jaeger_host)
246
245
  )
247
246
  end
248
247
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vmpooler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.1
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-10 00:00:00.000000000 Z
11
+ date: 2021-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -66,104 +66,90 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.10'
69
- - !ruby/object:Gem::Dependency
70
- name: opentelemetry-api
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - '='
74
- - !ruby/object:Gem::Version
75
- version: 0.8.0
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - '='
81
- - !ruby/object:Gem::Version
82
- version: 0.8.0
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: opentelemetry-exporter-jaeger
85
71
  requirement: !ruby/object:Gem::Requirement
86
72
  requirements:
87
73
  - - '='
88
74
  - !ruby/object:Gem::Version
89
- version: 0.8.0
75
+ version: 0.17.0
90
76
  type: :runtime
91
77
  prerelease: false
92
78
  version_requirements: !ruby/object:Gem::Requirement
93
79
  requirements:
94
80
  - - '='
95
81
  - !ruby/object:Gem::Version
96
- version: 0.8.0
82
+ version: 0.17.0
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: opentelemetry-instrumentation-concurrent_ruby
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
87
  - - '='
102
88
  - !ruby/object:Gem::Version
103
- version: 0.8.0
89
+ version: 0.17.0
104
90
  type: :runtime
105
91
  prerelease: false
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
108
94
  - - '='
109
95
  - !ruby/object:Gem::Version
110
- version: 0.8.0
96
+ version: 0.17.0
111
97
  - !ruby/object:Gem::Dependency
112
98
  name: opentelemetry-instrumentation-redis
113
99
  requirement: !ruby/object:Gem::Requirement
114
100
  requirements:
115
101
  - - '='
116
102
  - !ruby/object:Gem::Version
117
- version: 0.8.0
103
+ version: 0.17.0
118
104
  type: :runtime
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
107
  requirements:
122
108
  - - '='
123
109
  - !ruby/object:Gem::Version
124
- version: 0.8.0
110
+ version: 0.17.0
125
111
  - !ruby/object:Gem::Dependency
126
112
  name: opentelemetry-instrumentation-sinatra
127
113
  requirement: !ruby/object:Gem::Requirement
128
114
  requirements:
129
115
  - - '='
130
116
  - !ruby/object:Gem::Version
131
- version: 0.8.0
117
+ version: 0.17.0
132
118
  type: :runtime
133
119
  prerelease: false
134
120
  version_requirements: !ruby/object:Gem::Requirement
135
121
  requirements:
136
122
  - - '='
137
123
  - !ruby/object:Gem::Version
138
- version: 0.8.0
124
+ version: 0.17.0
139
125
  - !ruby/object:Gem::Dependency
140
126
  name: opentelemetry-resource_detectors
141
127
  requirement: !ruby/object:Gem::Requirement
142
128
  requirements:
143
129
  - - '='
144
130
  - !ruby/object:Gem::Version
145
- version: 0.8.0
131
+ version: 0.17.0
146
132
  type: :runtime
147
133
  prerelease: false
148
134
  version_requirements: !ruby/object:Gem::Requirement
149
135
  requirements:
150
136
  - - '='
151
137
  - !ruby/object:Gem::Version
152
- version: 0.8.0
138
+ version: 0.17.0
153
139
  - !ruby/object:Gem::Dependency
154
140
  name: opentelemetry-sdk
155
141
  requirement: !ruby/object:Gem::Requirement
156
142
  requirements:
157
143
  - - '='
158
144
  - !ruby/object:Gem::Version
159
- version: 0.8.0
145
+ version: 0.17.0
160
146
  type: :runtime
161
147
  prerelease: false
162
148
  version_requirements: !ruby/object:Gem::Requirement
163
149
  requirements:
164
150
  - - '='
165
151
  - !ruby/object:Gem::Version
166
- version: 0.8.0
152
+ version: 0.17.0
167
153
  - !ruby/object:Gem::Dependency
168
154
  name: pickup
169
155
  requirement: !ruby/object:Gem::Requirement
@@ -392,14 +378,14 @@ dependencies:
392
378
  requirements:
393
379
  - - "~>"
394
380
  - !ruby/object:Gem::Version
395
- version: '1.0'
381
+ version: 1.1.0
396
382
  type: :development
397
383
  prerelease: false
398
384
  version_requirements: !ruby/object:Gem::Requirement
399
385
  requirements:
400
386
  - - "~>"
401
387
  - !ruby/object:Gem::Version
402
- version: '1.0'
388
+ version: 1.1.0
403
389
  - !ruby/object:Gem::Dependency
404
390
  name: simplecov
405
391
  requirement: !ruby/object:Gem::Requirement