vmpooler 0.18.2 → 1.1.2
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/lib/vmpooler/api/v1.rb +55 -0
- data/lib/vmpooler/metrics/promstats/collector_middleware.rb +1 -1
- data/lib/vmpooler/metrics/promstats.rb +15 -15
- data/lib/vmpooler/pool_manager.rb +0 -55
- data/lib/vmpooler/version.rb +1 -1
- data/lib/vmpooler.rb +2 -3
- metadata +16 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e7864a4052aa108e7946af16f5388c43d2f755b55a45cd04e5c1aa808209fe7
|
4
|
+
data.tar.gz: b11cc686a8f1ea02551ee874b67f98d70b621848865fdde8acdb6bb1b43e716e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e20f396405f1eaad295555312603977242b5803466ef0049de517efae3d0098edda2d51bf85e1168e9b5c188364b8fdab8c9e8b5197bd5e2970109d148f838c
|
7
|
+
data.tar.gz: 54c61501623bee35381b7e4241d98b00ad0cee8f8904d5ba20edabd6bc942a69c6cfcc11e8bbc8e23429da661ccb0f027e13e83452ad98327c48a210075b3ce8
|
data/lib/vmpooler/api/v1.rb
CHANGED
@@ -210,6 +210,7 @@ module Vmpooler
|
|
210
210
|
account_for_starting_vm(vmpool, vmname)
|
211
211
|
vms << [vmpool, vmname, vmtemplate]
|
212
212
|
metrics.increment("checkout.success.#{vmpool}")
|
213
|
+
update_user_metrics('allocate', vmname) if Vmpooler::API.settings.config[:config]['usage_stats']
|
213
214
|
else
|
214
215
|
failed = true
|
215
216
|
metrics.increment("checkout.empty.#{requested}")
|
@@ -235,6 +236,59 @@ module Vmpooler
|
|
235
236
|
result
|
236
237
|
end
|
237
238
|
|
239
|
+
def component_to_test(match, labels_string)
|
240
|
+
return if labels_string.nil?
|
241
|
+
|
242
|
+
labels_string_parts = labels_string.split(',')
|
243
|
+
labels_string_parts.each do |part|
|
244
|
+
key, value = part.split('=')
|
245
|
+
next if value.nil?
|
246
|
+
return value if key == match
|
247
|
+
end
|
248
|
+
'none'
|
249
|
+
end
|
250
|
+
|
251
|
+
def update_user_metrics(operation, vmname)
|
252
|
+
backend.multi
|
253
|
+
backend.hget("vmpooler__vm__#{vmname}", 'tag:jenkins_build_url')
|
254
|
+
backend.hget("vmpooler__vm__#{vmname}", 'token:user')
|
255
|
+
backend.hget("vmpooler__vm__#{vmname}", 'template')
|
256
|
+
jenkins_build_url, user, poolname = backend.exec
|
257
|
+
poolname = poolname.gsub('.', '_')
|
258
|
+
|
259
|
+
if user
|
260
|
+
user = user.gsub('.', '_')
|
261
|
+
else
|
262
|
+
user = 'unauthenticated'
|
263
|
+
end
|
264
|
+
metrics.increment("user.#{user}.#{operation}.#{poolname}")
|
265
|
+
|
266
|
+
if jenkins_build_url
|
267
|
+
if jenkins_build_url.include? 'litmus'
|
268
|
+
# Very simple filter for Litmus jobs - just count them coming through for the moment.
|
269
|
+
metrics.increment("usage_litmus.#{user}.#{operation}.#{poolname}")
|
270
|
+
return
|
271
|
+
end
|
272
|
+
|
273
|
+
url_parts = jenkins_build_url.split('/')[2..-1]
|
274
|
+
jenkins_instance = url_parts[0].gsub('.', '_')
|
275
|
+
value_stream_parts = url_parts[2].split('_')
|
276
|
+
value_stream_parts = value_stream_parts.map { |s| s.gsub('.', '_') }
|
277
|
+
value_stream = value_stream_parts.shift
|
278
|
+
branch = value_stream_parts.pop
|
279
|
+
project = value_stream_parts.shift
|
280
|
+
job_name = value_stream_parts.join('_')
|
281
|
+
build_metadata_parts = url_parts[3]
|
282
|
+
component_to_test = component_to_test('RMM_COMPONENT_TO_TEST_NAME', build_metadata_parts)
|
283
|
+
|
284
|
+
metrics.increment("usage_jenkins_instance.#{jenkins_instance}.#{value_stream}.#{operation}.#{poolname}")
|
285
|
+
metrics.increment("usage_branch_project.#{branch}.#{project}.#{operation}.#{poolname}")
|
286
|
+
metrics.increment("usage_job_component.#{job_name}.#{component_to_test}.#{operation}.#{poolname}")
|
287
|
+
end
|
288
|
+
rescue StandardError => e
|
289
|
+
puts 'd', "[!] [#{poolname}] failed while evaluating usage labels on '#{vmname}' with an error: #{e}"
|
290
|
+
end
|
291
|
+
|
238
292
|
def update_pool_size(payload)
|
239
293
|
result = { 'ok' => false }
|
240
294
|
|
@@ -1169,6 +1223,7 @@ module Vmpooler
|
|
1169
1223
|
status 200
|
1170
1224
|
result['ok'] = true
|
1171
1225
|
metrics.increment('delete.success')
|
1226
|
+
update_user_metrics('destroy', params[:hostname]) if Vmpooler::API.settings.config[:config]['usage_stats']
|
1172
1227
|
else
|
1173
1228
|
metrics.increment('delete.failed')
|
1174
1229
|
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{/
|
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[
|
169
|
-
docstring: 'Number of pool instances
|
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[
|
175
|
-
docstring: '
|
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[
|
181
|
-
docstring: '
|
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[
|
187
|
-
docstring: '
|
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[
|
193
|
-
docstring: '
|
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,66 +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
|
-
def component_to_test(match, labels_string)
|
525
|
-
return if labels_string.nil?
|
526
|
-
|
527
|
-
labels_string_parts = labels_string.split(',')
|
528
|
-
labels_string_parts.each do |part|
|
529
|
-
key, value = part.split('=')
|
530
|
-
next if value.nil?
|
531
|
-
return value if key == match
|
532
|
-
end
|
533
|
-
'none'
|
534
|
-
end
|
535
|
-
|
536
481
|
def purge_unused_vms_and_folders
|
537
482
|
global_purge = $config[:config]['purge_unconfigured_folders']
|
538
483
|
providers = $config[:providers].keys
|
data/lib/vmpooler/version.rb
CHANGED
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
|
-
|
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
|
-
|
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:
|
4
|
+
version: 1.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-08-25 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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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:
|
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:
|
388
|
+
version: 1.1.0
|
403
389
|
- !ruby/object:Gem::Dependency
|
404
390
|
name: simplecov
|
405
391
|
requirement: !ruby/object:Gem::Requirement
|