From a407d2329d3c4ffad368066a15479d860fa7c6e0 Mon Sep 17 00:00:00 2001 From: John O'Connor Date: Tue, 10 Nov 2020 19:13:24 +0000 Subject: [PATCH 001/220] (MAINT) Fix checkout counter allocation Checkout metric counters were against the template name and not the actual pool used which prevents us from counting the checkouts in the pixa4 pools for example. Note - this is a re-rerun - the last commit on this file over-wrote the change. --- lib/vmpooler/api/v1.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/vmpooler/api/v1.rb b/lib/vmpooler/api/v1.rb index 25ac1cf..a13ceeb 100644 --- a/lib/vmpooler/api/v1.rb +++ b/lib/vmpooler/api/v1.rb @@ -213,7 +213,7 @@ module Vmpooler if vmname account_for_starting_vm(vmpool, vmname) vms << [vmpool, vmname, vmtemplate] - metrics.increment("checkout.success.#{vmtemplate}") + metrics.increment("checkout.success.#{vmpool}") else failed = true metrics.increment("checkout.empty.#{requested}") From 7ff23a386dc27711a2281c96ecc47ec40f39e313 Mon Sep 17 00:00:00 2001 From: "kirby@puppetlabs.com" Date: Tue, 10 Nov 2020 11:38:14 -0800 Subject: [PATCH 002/220] Remove usage of redis multi from api This change removes usage of redis multi from API. Without this change the redis usage can cause issues because no connection pool is used, so another worker may try to use the same backend object causing a failure. --- lib/vmpooler/api/v1.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/vmpooler/api/v1.rb b/lib/vmpooler/api/v1.rb index 25ac1cf..91ecda6 100644 --- a/lib/vmpooler/api/v1.rb +++ b/lib/vmpooler/api/v1.rb @@ -163,18 +163,15 @@ module Vmpooler end def return_vm_to_ready_state(template, vm) - backend.multi backend.srem("vmpooler__migrating__#{template}", vm) backend.hdel("vmpooler__active__#{template}", vm) backend.hdel("vmpooler__vm__#{vm}", 'checkout', 'token:token', 'token:user') backend.smove("vmpooler__running__#{template}", "vmpooler__ready__#{template}", vm) - backend.exec end def account_for_starting_vm(template, vm) user = backend.hget("vmpooler__token__#{request.env['HTTP_X_AUTH_TOKEN']}", 'user') has_token_result = has_token? - backend.multi backend.sadd("vmpooler__migrating__#{template}", vm) backend.hset("vmpooler__active__#{template}", vm, Time.now) backend.hset("vmpooler__vm__#{vm}", 'checkout', Time.now) @@ -187,7 +184,6 @@ module Vmpooler backend.hset("vmpooler__vm__#{vm}", 'lifetime', config['vm_lifetime_auth'].to_i) end end - backend.exec end def update_result_hosts(result, template, vm) From eddca1c67daf37d942ecafc45d3d83ef9b74e3c0 Mon Sep 17 00:00:00 2001 From: Jenkins Date: Tue, 10 Nov 2020 21:07:51 +0000 Subject: [PATCH 003/220] (GEM) update vmpooler version to 0.18.2 --- lib/vmpooler/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/vmpooler/version.rb b/lib/vmpooler/version.rb index a883647..0845fd5 100644 --- a/lib/vmpooler/version.rb +++ b/lib/vmpooler/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Vmpooler - VERSION = '0.18.1' + VERSION = '0.18.2' end From a5aa6d4613272eec5180ae5e68b412939af28107 Mon Sep 17 00:00:00 2001 From: Belen Bustamante Date: Tue, 1 Dec 2020 14:49:35 -0800 Subject: [PATCH 004/220] Update lightstep pre-deploy ghaction to v0.2.6 --- .github/workflows/lightstep.yml | 2 +- vmpooler.gemspec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lightstep.yml b/.github/workflows/lightstep.yml index d32f2b1..5e6a92f 100644 --- a/.github/workflows/lightstep.yml +++ b/.github/workflows/lightstep.yml @@ -13,7 +13,7 @@ jobs: # Run checks - name: Lightstep Pre-Deploy Check - uses: lightstep/lightstep-action-predeploy@v0.1.4 + uses: lightstep/lightstep-action-predeploy@v0.2.6 id: lightstep-predeploy with: lightstep_api_key: ${{ secrets.LIGHTSTEP_API_KEY }} diff --git a/vmpooler.gemspec b/vmpooler.gemspec index e6135b4..cddd9bd 100644 --- a/vmpooler.gemspec +++ b/vmpooler.gemspec @@ -45,7 +45,7 @@ Gem::Specification.new do |s| s.add_development_dependency 'pry' s.add_development_dependency 'rack-test', '>= 0.6' s.add_development_dependency 'rspec', '>= 3.2' - s.add_development_dependency 'rubocop', '~> 1.0' + s.add_development_dependency 'rubocop', '~> 1.1.0' s.add_development_dependency 'simplecov', '>= 0.11.2' s.add_development_dependency 'yarjuf', '>= 2.0' end From 95ebc4837ac634317578f8695aed0198f8b5886a Mon Sep 17 00:00:00 2001 From: Gene Liverman Date: Tue, 2 Feb 2021 11:02:23 -0500 Subject: [PATCH 005/220] Migrate testing to GH Actions from Travis --- .github/workflows/testing.yml | 47 +++++++++++++++++++++++++++++++++++ .travis.yml | 18 -------------- 2 files changed, 47 insertions(+), 18 deletions(-) create mode 100644 .github/workflows/testing.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml new file mode 100644 index 0000000..4e6958f --- /dev/null +++ b/.github/workflows/testing.yml @@ -0,0 +1,47 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. +# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake +# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby + +name: Testing + +on: + pull_request: + branches: + - master + +jobs: + rubocop: + runs-on: ubuntu-latest + strategy: + matrix: + ruby-version: + - '2.5.8' + steps: + - uses: actions/checkout@v2 + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby-version }} + bundler-cache: true # runs 'bundle install' and caches installed gems automatically + - name: Run Rubocop + run: bundle exec rake rubocop + + spec_tests: + runs-on: ubuntu-latest + strategy: + matrix: + ruby-version: + - '2.5.8' + - 'jruby-9.2.12.0' + steps: + - uses: actions/checkout@v2 + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby-version }} + bundler-cache: true # runs 'bundle install' and caches installed gems automatically + - name: Run spec tests + run: bundle exec rake test diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 4469cd6..0000000 --- a/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -cache: bundler -language: ruby -dist: xenial -os: linux - -jobs: - include: - - rvm: 2.5.8 - env: "CHECK=rubocop" - - - rvm: 2.5.8 - env: "CHECK=test" - - - rvm: jruby-9.2.12.0 - env: "CHECK=test" - -script: - - "bundle exec rake $CHECK" From 7a1fc246853a02f0bea28722aec186700f0618be Mon Sep 17 00:00:00 2001 From: Gene Liverman Date: Tue, 2 Feb 2021 10:37:21 -0500 Subject: [PATCH 006/220] Fix regex for ondemand instances It appears we renamed `/ondemand/` to `/ondemandvm/` at some point and, as a result, have not been stripping hostnames from that endpoint's metrics. This has caused issues with metrics collection due a very high cardinality. --- lib/vmpooler/metrics/promstats/collector_middleware.rb | 2 +- spec/unit/collector_middleware_spec.rb | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/vmpooler/metrics/promstats/collector_middleware.rb b/lib/vmpooler/metrics/promstats/collector_middleware.rb index 540b1e6..c7e8325 100644 --- a/lib/vmpooler/metrics/promstats/collector_middleware.rb +++ b/lib/vmpooler/metrics/promstats/collector_middleware.rb @@ -113,7 +113,7 @@ module Vmpooler # Similarly, request IDs are also stripped from the /ondemand path. path .gsub(%r{/vm/.+$}, '/vm') - .gsub(%r{/ondemand/.+$}, '/ondemand') + .gsub(%r{/ondemandvm/.+$}, '/ondemandvm') .gsub(%r{/token/.+$}, '/token') .gsub(%r{/lib/.+$}, '/lib') .gsub(%r{/img/.+$}, '/img') diff --git a/spec/unit/collector_middleware_spec.rb b/spec/unit/collector_middleware_spec.rb index 5244c25..704ac5a 100644 --- a/spec/unit/collector_middleware_spec.rb +++ b/spec/unit/collector_middleware_spec.rb @@ -72,14 +72,14 @@ describe Vmpooler::Metrics::Promstats::CollectorMiddleware do it 'normalizes paths containing /ondemandvm by ' do expect(Benchmark).to receive(:realtime).and_yield.and_return(0.3) - get '/foo/ondemand/bar/fatman' + get '/foo/ondemandvm/bar/fatman' metric = :http_server_requests_total - labels = { method: 'get', path: '/foo/ondemand', code: '200' } + labels = { method: 'get', path: '/foo/ondemandvm', code: '200' } expect(registry.get(metric).get(labels: labels)).to eql(1.0) metric = :http_server_request_duration_seconds - labels = { method: 'get', path: '/foo/ondemand' } + labels = { method: 'get', path: '/foo/ondemandvm' } expect(registry.get(metric).get(labels: labels)).to include("0.1" => 0, "0.5" => 1) end From 8e9d8ee51edce04376208fe6c875934917849e7a Mon Sep 17 00:00:00 2001 From: Gene Liverman Date: Tue, 2 Feb 2021 11:25:26 -0500 Subject: [PATCH 007/220] Update OTel gems to 0.13.z --- lib/vmpooler.rb | 1 - vmpooler.gemspec | 13 ++++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/vmpooler.rb b/lib/vmpooler.rb index cee8db8..74bd697 100644 --- a/lib/vmpooler.rb +++ b/lib/vmpooler.rb @@ -16,7 +16,6 @@ module Vmpooler require 'yaml' # Dependencies for tracing - require 'opentelemetry-api' require 'opentelemetry-instrumentation-concurrent_ruby' require 'opentelemetry-instrumentation-redis' require 'opentelemetry-instrumentation-sinatra' diff --git a/vmpooler.gemspec b/vmpooler.gemspec index cddd9bd..1ef8f34 100644 --- a/vmpooler.gemspec +++ b/vmpooler.gemspec @@ -21,13 +21,12 @@ Gem::Specification.new do |s| s.add_dependency 'connection_pool', '~> 2.2' s.add_dependency 'net-ldap', '~> 0.16' s.add_dependency 'nokogiri', '~> 1.10' - s.add_dependency 'opentelemetry-api', '= 0.8.0' - s.add_dependency 'opentelemetry-exporter-jaeger', '= 0.8.0' - s.add_dependency 'opentelemetry-instrumentation-concurrent_ruby', '= 0.8.0' - s.add_dependency 'opentelemetry-instrumentation-redis', '= 0.8.0' - s.add_dependency 'opentelemetry-instrumentation-sinatra', '= 0.8.0' - s.add_dependency 'opentelemetry-resource_detectors', '= 0.8.0' - s.add_dependency 'opentelemetry-sdk', '= 0.8.0' + s.add_dependency 'opentelemetry-exporter-jaeger', '= 0.13.0' + s.add_dependency 'opentelemetry-instrumentation-concurrent_ruby', '= 0.13.0' + s.add_dependency 'opentelemetry-instrumentation-redis', '= 0.13.0' + s.add_dependency 'opentelemetry-instrumentation-sinatra', '= 0.13.0' + s.add_dependency 'opentelemetry-resource_detectors', '= 0.13.0' + s.add_dependency 'opentelemetry-sdk', '= 0.13.1' s.add_dependency 'pickup', '~> 0.0.11' s.add_dependency 'prometheus-client', '~> 2.0' s.add_dependency 'puma', '~> 5.0', '>= 5.0.4' From 9984a274b55267dbbc4ba5f9c6dc6e90fd842453 Mon Sep 17 00:00:00 2001 From: Jenkins Date: Tue, 2 Feb 2021 17:05:29 +0000 Subject: [PATCH 008/220] (GEM) update vmpooler version to 1.0.0 --- lib/vmpooler/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/vmpooler/version.rb b/lib/vmpooler/version.rb index 0845fd5..59a3ceb 100644 --- a/lib/vmpooler/version.rb +++ b/lib/vmpooler/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Vmpooler - VERSION = '0.18.2' + VERSION = '1.0.0' end From e05ee525be5c2a012b3e9780f009683b466d2414 Mon Sep 17 00:00:00 2001 From: Gene Liverman Date: Tue, 23 Feb 2021 14:26:18 -0500 Subject: [PATCH 009/220] Update OTel gems to 0.15.0 --- vmpooler.gemspec | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/vmpooler.gemspec b/vmpooler.gemspec index 1ef8f34..390ace0 100644 --- a/vmpooler.gemspec +++ b/vmpooler.gemspec @@ -21,12 +21,12 @@ Gem::Specification.new do |s| s.add_dependency 'connection_pool', '~> 2.2' s.add_dependency 'net-ldap', '~> 0.16' s.add_dependency 'nokogiri', '~> 1.10' - s.add_dependency 'opentelemetry-exporter-jaeger', '= 0.13.0' - s.add_dependency 'opentelemetry-instrumentation-concurrent_ruby', '= 0.13.0' - s.add_dependency 'opentelemetry-instrumentation-redis', '= 0.13.0' - s.add_dependency 'opentelemetry-instrumentation-sinatra', '= 0.13.0' - s.add_dependency 'opentelemetry-resource_detectors', '= 0.13.0' - s.add_dependency 'opentelemetry-sdk', '= 0.13.1' + s.add_dependency 'opentelemetry-exporter-jaeger', '= 0.15.0' + s.add_dependency 'opentelemetry-instrumentation-concurrent_ruby', '= 0.15.0' + s.add_dependency 'opentelemetry-instrumentation-redis', '= 0.15.0' + s.add_dependency 'opentelemetry-instrumentation-sinatra', '= 0.15.0' + s.add_dependency 'opentelemetry-resource_detectors', '= 0.15.0' + s.add_dependency 'opentelemetry-sdk', '= 0.15.0' s.add_dependency 'pickup', '~> 0.0.11' s.add_dependency 'prometheus-client', '~> 2.0' s.add_dependency 'puma', '~> 5.0', '>= 5.0.4' From c06cfc28f70ff5d8e2f659562b1f4861d62a84b2 Mon Sep 17 00:00:00 2001 From: Jake Spain Date: Tue, 10 Aug 2021 10:55:04 -0400 Subject: [PATCH 010/220] Add operation label to user metric and move from manager to api This adds an "operation" label to the user metrics and moves incrementing from the manager to api, so that the user metrics show when resources are allocated, as well as destroyed. Previously, user metrics were only updated upon destroying a resource. I think its better suited to increment the metric as part of the api instead of the pool_manger, because it's expected to do so when a user successfully checks out or deletes a VM, but can be problematic when doing so in the provider since it can clone VMs before actually being checked out by a user. --- lib/vmpooler/api/v1.rb | 42 +++++ lib/vmpooler/metrics/promstats.rb | 30 ++-- lib/vmpooler/pool_manager.rb | 43 ------ spec/unit/pool_manager_spec.rb | 246 ------------------------------ spec/unit/promstats_spec.rb | 35 +++-- vmpooler.yaml.example | 6 +- 6 files changed, 80 insertions(+), 322 deletions(-) diff --git a/lib/vmpooler/api/v1.rb b/lib/vmpooler/api/v1.rb index 3a3c177..1503100 100644 --- a/lib/vmpooler/api/v1.rb +++ b/lib/vmpooler/api/v1.rb @@ -210,6 +210,7 @@ module Vmpooler account_for_starting_vm(vmpool, vmname) vms << [vmpool, vmname, vmtemplate] metrics.increment("checkout.success.#{vmpool}") + update_user_metrics('allocate', vmname) if Vmpooler::API.settings.config[:config]['usage_stats'] else failed = true metrics.increment("checkout.empty.#{requested}") @@ -235,6 +236,46 @@ module Vmpooler result end + def update_user_metrics(operation, vmname) + backend.multi + backend.hget("vmpooler__vm__#{vmname}", 'tag:jenkins_build_url') + backend.hget("vmpooler__vm__#{vmname}", 'token:user') + backend.hget("vmpooler__vm__#{vmname}", 'template') + jenkins_build_url, user, poolname = backend.exec + + if user + user = user.gsub('.', '_') + else + user = 'unauthenticated' + end + metrics.increment("user.#{user}.#{operation}.#{poolname}") + + if jenkins_build_url + if jenkins_build_url.include? 'litmus' + # Very simple filter for Litmus jobs - just count them coming through for the moment. + metrics.increment("usage_litmus.#{user}.#{operation}.#{poolname}") + return + end + + url_parts = jenkins_build_url.split('/')[2..-1] + jenkins_instance = url_parts[0].gsub('.', '_') + value_stream_parts = url_parts[2].split('_') + value_stream_parts = value_stream_parts.map { |s| s.gsub('.', '_') } + value_stream = value_stream_parts.shift + branch = value_stream_parts.pop + project = value_stream_parts.shift + job_name = value_stream_parts.join('_') + build_metadata_parts = url_parts[3] + component_to_test = component_to_test('RMM_COMPONENT_TO_TEST_NAME', build_metadata_parts) + + metrics.increment("usage_jenkins_instance.#{jenkins_instance}.#{value_stream}.#{operation}.#{poolname}") + metrics.increment("usage_branch_project.#{branch}.#{project}.#{operation}.#{poolname}") + metrics.increment("usage_job_component.#{job_name}.#{component_to_test}.#{operation}.#{poolname}") + end + rescue StandardError => e + puts 'd', "[!] [#{poolname}] failed while evaluating usage labels on '#{vmname}' with an error: #{e}" + end + def update_pool_size(payload) result = { 'ok' => false } @@ -1169,6 +1210,7 @@ module Vmpooler status 200 result['ok'] = true metrics.increment('delete.success') + update_user_metrics('destroy', params[:hostname]) if Vmpooler::API.settings.config[:config]['usage_stats'] else metrics.increment('delete.failed') end diff --git a/lib/vmpooler/metrics/promstats.rb b/lib/vmpooler/metrics/promstats.rb index 253879c..f24f9b9 100644 --- a/lib/vmpooler/metrics/promstats.rb +++ b/lib/vmpooler/metrics/promstats.rb @@ -165,33 +165,33 @@ module Vmpooler }, user: { mtype: M_COUNTER, - torun: %i[manager], - docstring: 'Number of pool instances this user created created', - param_labels: %i[user poolname] + torun: %i[api], + docstring: 'Number of pool instances and the operation performed by a user', + param_labels: %i[user operation poolname] }, usage_litmus: { mtype: M_COUNTER, - torun: %i[manager], - docstring: 'Pools by Litmus job usage', - param_labels: %i[user poolname] + torun: %i[api], + docstring: 'Number of pool instances and the operation performed by Litmus jobs', + param_labels: %i[user operation poolname] }, usage_jenkins_instance: { mtype: M_COUNTER, - torun: %i[manager], - docstring: 'Pools by Jenkins instance usage', - param_labels: %i[jenkins_instance value_stream poolname] + torun: %i[api], + docstring: 'Number of pool instances and the operation performed by Jenkins instances', + param_labels: %i[jenkins_instance value_stream operation poolname] }, usage_branch_project: { mtype: M_COUNTER, - torun: %i[manager], - docstring: 'Pools by branch/project usage', - param_labels: %i[branch project poolname] + torun: %i[api], + docstring: 'Number of pool instances and the operation performed by Jenkins branch/project', + param_labels: %i[branch project operation poolname] }, usage_job_component: { mtype: M_COUNTER, - torun: %i[manager], - docstring: 'Pools by job/component usage', - param_labels: %i[job_name component_to_test poolname] + torun: %i[api], + docstring: 'Number of pool instances and the operation performed by Jenkins job/component', + param_labels: %i[job_name component_to_test operation poolname] }, checkout: { mtype: M_COUNTER, diff --git a/lib/vmpooler/pool_manager.rb b/lib/vmpooler/pool_manager.rb index e473364..8ad7902 100644 --- a/lib/vmpooler/pool_manager.rb +++ b/lib/vmpooler/pool_manager.rb @@ -473,54 +473,11 @@ module Vmpooler finish = format('%