gitlab-exporter 7.2.0 → 10.1.0
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/.gitlab-ci.yml +1 -1
 - data/.rubocop.yml +7 -5
 - data/.rubocop_todo.yml +64 -0
 - data/.ruby-version +1 -0
 - data/Gemfile.lock +26 -15
 - data/README.md +0 -17
 - data/bin/gitlab-exporter +3 -1
 - data/config/gitlab-exporter.yml.example +10 -1
 - data/gitlab-exporter.gemspec +5 -4
 - data/lib/gitlab_exporter.rb +1 -0
 - data/lib/gitlab_exporter/cli.rb +1 -2
 - data/lib/gitlab_exporter/database/base.rb +33 -10
 - data/lib/gitlab_exporter/database/bloat.rb +2 -2
 - data/lib/gitlab_exporter/database/ci_builds.rb +4 -137
 - data/lib/gitlab_exporter/database/row_count.rb +7 -25
 - data/lib/gitlab_exporter/database/tuple_stats.rb +4 -2
 - data/lib/gitlab_exporter/git.rb +8 -1
 - data/lib/gitlab_exporter/memstats.rb +1 -1
 - data/lib/gitlab_exporter/memstats/mapping.rb +1 -1
 - data/lib/gitlab_exporter/process.rb +13 -3
 - data/lib/gitlab_exporter/ruby.rb +21 -0
 - data/lib/gitlab_exporter/sidekiq.rb +83 -69
 - data/lib/gitlab_exporter/util.rb +1 -1
 - data/lib/gitlab_exporter/version.rb +1 -1
 - data/lib/gitlab_exporter/web_exporter.rb +23 -1
 - data/spec/database/bloat_spec.rb +1 -1
 - data/spec/database/ci_builds_spec.rb +23 -98
 - data/spec/git_process_proper_spec.rb +1 -1
 - data/spec/memstats_spec.rb +3 -3
 - data/spec/ruby_spec.rb +25 -0
 - data/spec/spec_helper.rb +2 -4
 - metadata +36 -17
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 93717aa36fc361dbf6e6550ffd1aee5bb4c36fd70f46c9688ee86dcdc94f7572
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 7e97447aee55e492879c51d6740f1d73b959b235c09d59a3cca7d9595bc1669b
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: ca6b7c6192be12153b5392dd1fa4526c247bae7a8dfcf28f03ab262039a1abf29c27b40a8e0cb7efe3d6eb156bd4f472645307d53407ed87058fb3c5fd3013dd
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 6a9125c7d46223b178bbc3d180482fd4f44643e02bc7b5887a3a264597cfa25a5cf5c6bc0782b79969dc89c09f34140b2aea47f8d6530d6ef48f301650218101
         
     | 
    
        data/.gitlab-ci.yml
    CHANGED
    
    | 
         @@ -7,7 +7,7 @@ include: 
     | 
|
| 
       7 
7 
     | 
    
         
             
              - template: Security/Secret-Detection.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab-foss/-/blob/master/lib/gitlab/ci/templates/Security/Secret-Detection.gitlab-ci.yml
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
9 
     | 
    
         
             
            default:
         
     | 
| 
       10 
     | 
    
         
            -
              image:  
     | 
| 
      
 10 
     | 
    
         
            +
              image: ruby:2.7
         
     | 
| 
       11 
11 
     | 
    
         
             
              cache:
         
     | 
| 
       12 
12 
     | 
    
         
             
                paths:
         
     | 
| 
       13 
13 
     | 
    
         
             
                  - vendor
         
     | 
    
        data/.rubocop.yml
    CHANGED
    
    | 
         @@ -1,5 +1,7 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            inherit_from: .rubocop_todo.yml
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            AllCops:
         
     | 
| 
       2 
     | 
    
         
            -
              TargetRubyVersion: 2. 
     | 
| 
      
 4 
     | 
    
         
            +
              TargetRubyVersion: 2.7
         
     | 
| 
       3 
5 
     | 
    
         
             
              DisplayCopNames: true
         
     | 
| 
       4 
6 
     | 
    
         | 
| 
       5 
7 
     | 
    
         
             
            # Just use double quotes please
         
     | 
| 
         @@ -20,15 +22,15 @@ Style/RaiseArgs: 
     | 
|
| 
       20 
22 
     | 
    
         
             
            Style/FrozenStringLiteralComment:
         
     | 
| 
       21 
23 
     | 
    
         
             
              Enabled: false
         
     | 
| 
       22 
24 
     | 
    
         | 
| 
      
 25 
     | 
    
         
            +
            # Commonly used screens these days easily fit more than 80 characters.
         
     | 
| 
      
 26 
     | 
    
         
            +
            Layout/LineLength:
         
     | 
| 
      
 27 
     | 
    
         
            +
              Max: 120
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
       23 
29 
     | 
    
         
             
            Metrics/MethodLength:
         
     | 
| 
       24 
30 
     | 
    
         
             
              Max: 15
         
     | 
| 
       25 
31 
     | 
    
         | 
| 
       26 
32 
     | 
    
         
             
            Metrics/AbcSize:
         
     | 
| 
       27 
33 
     | 
    
         
             
              Enabled: false
         
     | 
| 
       28 
34 
     | 
    
         | 
| 
       29 
     | 
    
         
            -
            # Commonly used screens these days easily fit more than 80 characters.
         
     | 
| 
       30 
     | 
    
         
            -
            Metrics/LineLength:
         
     | 
| 
       31 
     | 
    
         
            -
              Max: 120
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
35 
     | 
    
         
             
            Metrics/ClassLength:
         
     | 
| 
       34 
36 
     | 
    
         
             
              Max: 150
         
     | 
    
        data/.rubocop_todo.yml
    ADDED
    
    | 
         @@ -0,0 +1,64 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # This configuration was generated by
         
     | 
| 
      
 2 
     | 
    
         
            +
            # `rubocop --auto-gen-config`
         
     | 
| 
      
 3 
     | 
    
         
            +
            # on 2021-01-11 12:24:03 UTC using RuboCop version 0.93.1.
         
     | 
| 
      
 4 
     | 
    
         
            +
            # The point is for the user to remove these configuration records
         
     | 
| 
      
 5 
     | 
    
         
            +
            # one by one as the offenses are removed from the code base.
         
     | 
| 
      
 6 
     | 
    
         
            +
            # Note that changes in the inspected code, or installation of new
         
     | 
| 
      
 7 
     | 
    
         
            +
            # versions of RuboCop, may require this file to be generated again.
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            # Offense count: 1
         
     | 
| 
      
 10 
     | 
    
         
            +
            # Configuration parameters: Include.
         
     | 
| 
      
 11 
     | 
    
         
            +
            # Include: **/*.gemspec
         
     | 
| 
      
 12 
     | 
    
         
            +
            Gemspec/RequiredRubyVersion:
         
     | 
| 
      
 13 
     | 
    
         
            +
              Exclude:
         
     | 
| 
      
 14 
     | 
    
         
            +
                - 'gitlab-exporter.gemspec'
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            # Offense count: 3
         
     | 
| 
      
 17 
     | 
    
         
            +
            Lint/AmbiguousBlockAssociation:
         
     | 
| 
      
 18 
     | 
    
         
            +
              Exclude:
         
     | 
| 
      
 19 
     | 
    
         
            +
                - 'spec/git_spec.rb'
         
     | 
| 
      
 20 
     | 
    
         
            +
                - 'spec/util_spec.rb'
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            # Offense count: 2
         
     | 
| 
      
 23 
     | 
    
         
            +
            # Configuration parameters: MaximumRangeSize.
         
     | 
| 
      
 24 
     | 
    
         
            +
            Lint/MissingCopEnableDirective:
         
     | 
| 
      
 25 
     | 
    
         
            +
              Exclude:
         
     | 
| 
      
 26 
     | 
    
         
            +
                - 'spec/database/ci_builds_spec.rb'
         
     | 
| 
      
 27 
     | 
    
         
            +
                - 'spec/git_process_proper_spec.rb'
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            # Offense count: 1
         
     | 
| 
      
 30 
     | 
    
         
            +
            # Cop supports --auto-correct.
         
     | 
| 
      
 31 
     | 
    
         
            +
            Lint/NonDeterministicRequireOrder:
         
     | 
| 
      
 32 
     | 
    
         
            +
              Exclude:
         
     | 
| 
      
 33 
     | 
    
         
            +
                - 'spec/spec_helper.rb'
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
            # Offense count: 16
         
     | 
| 
      
 36 
     | 
    
         
            +
            # Configuration parameters: CountComments, CountAsOne, ExcludedMethods.
         
     | 
| 
      
 37 
     | 
    
         
            +
            # ExcludedMethods: refine
         
     | 
| 
      
 38 
     | 
    
         
            +
            Metrics/BlockLength:
         
     | 
| 
      
 39 
     | 
    
         
            +
              Max: 349
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            # Offense count: 1
         
     | 
| 
      
 42 
     | 
    
         
            +
            # Configuration parameters: IgnoredMethods.
         
     | 
| 
      
 43 
     | 
    
         
            +
            Metrics/CyclomaticComplexity:
         
     | 
| 
      
 44 
     | 
    
         
            +
              Max: 8
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
            # Offense count: 1
         
     | 
| 
      
 47 
     | 
    
         
            +
            # Configuration parameters: IgnoredMethods.
         
     | 
| 
      
 48 
     | 
    
         
            +
            Metrics/PerceivedComplexity:
         
     | 
| 
      
 49 
     | 
    
         
            +
              Max: 9
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
            # Offense count: 1
         
     | 
| 
      
 52 
     | 
    
         
            +
            # Configuration parameters: EnforcedStyle, AllowModifiersOnSymbols.
         
     | 
| 
      
 53 
     | 
    
         
            +
            # SupportedStyles: inline, group
         
     | 
| 
      
 54 
     | 
    
         
            +
            Style/AccessModifierDeclarations:
         
     | 
| 
      
 55 
     | 
    
         
            +
              Exclude:
         
     | 
| 
      
 56 
     | 
    
         
            +
                - 'lib/gitlab_exporter/util.rb'
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
            # Offense count: 2
         
     | 
| 
      
 59 
     | 
    
         
            +
            # Cop supports --auto-correct.
         
     | 
| 
      
 60 
     | 
    
         
            +
            # Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods.
         
     | 
| 
      
 61 
     | 
    
         
            +
            # AllowedMethods: present?, blank?, presence, try, try!
         
     | 
| 
      
 62 
     | 
    
         
            +
            Style/SafeNavigation:
         
     | 
| 
      
 63 
     | 
    
         
            +
              Exclude:
         
     | 
| 
      
 64 
     | 
    
         
            +
                - 'lib/gitlab_exporter/database/base.rb'
         
     | 
    
        data/.ruby-version
    ADDED
    
    | 
         @@ -0,0 +1 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            2.7.2
         
     | 
    
        data/Gemfile.lock
    CHANGED
    
    | 
         @@ -1,9 +1,10 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            PATH
         
     | 
| 
       2 
2 
     | 
    
         
             
              remote: .
         
     | 
| 
       3 
3 
     | 
    
         
             
              specs:
         
     | 
| 
       4 
     | 
    
         
            -
                gitlab-exporter ( 
     | 
| 
      
 4 
     | 
    
         
            +
                gitlab-exporter (10.1.0)
         
     | 
| 
       5 
5 
     | 
    
         
             
                  connection_pool (~> 2.2.1)
         
     | 
| 
       6 
6 
     | 
    
         
             
                  pg (~> 1.1)
         
     | 
| 
      
 7 
     | 
    
         
            +
                  puma (~> 5.1.1)
         
     | 
| 
       7 
8 
     | 
    
         
             
                  quantile (~> 0.2.0)
         
     | 
| 
       8 
9 
     | 
    
         
             
                  redis (~> 4.1.2)
         
     | 
| 
       9 
10 
     | 
    
         
             
                  redis-namespace (~> 1.6.0)
         
     | 
| 
         @@ -13,23 +14,28 @@ PATH 
     | 
|
| 
       13 
14 
     | 
    
         
             
            GEM
         
     | 
| 
       14 
15 
     | 
    
         
             
              remote: https://rubygems.org/
         
     | 
| 
       15 
16 
     | 
    
         
             
              specs:
         
     | 
| 
       16 
     | 
    
         
            -
                ast (2.4. 
     | 
| 
      
 17 
     | 
    
         
            +
                ast (2.4.1)
         
     | 
| 
       17 
18 
     | 
    
         
             
                connection_pool (2.2.3)
         
     | 
| 
       18 
19 
     | 
    
         
             
                diff-lcs (1.3)
         
     | 
| 
       19 
20 
     | 
    
         
             
                mustermann (1.1.1)
         
     | 
| 
       20 
21 
     | 
    
         
             
                  ruby2_keywords (~> 0.0.1)
         
     | 
| 
       21 
     | 
    
         
            -
                 
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
      
 22 
     | 
    
         
            +
                nio4r (2.5.7)
         
     | 
| 
      
 23 
     | 
    
         
            +
                parallel (1.20.1)
         
     | 
| 
      
 24 
     | 
    
         
            +
                parser (3.0.0.0)
         
     | 
| 
      
 25 
     | 
    
         
            +
                  ast (~> 2.4.1)
         
     | 
| 
       23 
26 
     | 
    
         
             
                pg (1.2.3)
         
     | 
| 
       24 
     | 
    
         
            -
                 
     | 
| 
      
 27 
     | 
    
         
            +
                puma (5.1.1)
         
     | 
| 
      
 28 
     | 
    
         
            +
                  nio4r (~> 2.0)
         
     | 
| 
       25 
29 
     | 
    
         
             
                quantile (0.2.1)
         
     | 
| 
       26 
30 
     | 
    
         
             
                rack (2.2.3)
         
     | 
| 
       27 
31 
     | 
    
         
             
                rack-protection (2.0.8.1)
         
     | 
| 
       28 
32 
     | 
    
         
             
                  rack
         
     | 
| 
       29 
     | 
    
         
            -
                rainbow ( 
     | 
| 
      
 33 
     | 
    
         
            +
                rainbow (3.0.0)
         
     | 
| 
       30 
34 
     | 
    
         
             
                redis (4.1.4)
         
     | 
| 
       31 
35 
     | 
    
         
             
                redis-namespace (1.6.0)
         
     | 
| 
       32 
36 
     | 
    
         
             
                  redis (>= 3.0.4)
         
     | 
| 
      
 37 
     | 
    
         
            +
                regexp_parser (2.0.3)
         
     | 
| 
      
 38 
     | 
    
         
            +
                rexml (3.2.4)
         
     | 
| 
       33 
39 
     | 
    
         
             
                rspec (3.7.0)
         
     | 
| 
       34 
40 
     | 
    
         
             
                  rspec-core (~> 3.7.0)
         
     | 
| 
       35 
41 
     | 
    
         
             
                  rspec-expectations (~> 3.7.0)
         
     | 
| 
         @@ -43,14 +49,19 @@ GEM 
     | 
|
| 
       43 
49 
     | 
    
         
             
                  diff-lcs (>= 1.2.0, < 2.0)
         
     | 
| 
       44 
50 
     | 
    
         
             
                  rspec-support (~> 3.7.0)
         
     | 
| 
       45 
51 
     | 
    
         
             
                rspec-support (3.7.1)
         
     | 
| 
       46 
     | 
    
         
            -
                rubocop (0. 
     | 
| 
       47 
     | 
    
         
            -
                   
     | 
| 
       48 
     | 
    
         
            -
                   
     | 
| 
       49 
     | 
    
         
            -
                  rainbow (>=  
     | 
| 
      
 52 
     | 
    
         
            +
                rubocop (0.93.1)
         
     | 
| 
      
 53 
     | 
    
         
            +
                  parallel (~> 1.10)
         
     | 
| 
      
 54 
     | 
    
         
            +
                  parser (>= 2.7.1.5)
         
     | 
| 
      
 55 
     | 
    
         
            +
                  rainbow (>= 2.2.2, < 4.0)
         
     | 
| 
      
 56 
     | 
    
         
            +
                  regexp_parser (>= 1.8)
         
     | 
| 
      
 57 
     | 
    
         
            +
                  rexml
         
     | 
| 
      
 58 
     | 
    
         
            +
                  rubocop-ast (>= 0.6.0)
         
     | 
| 
       50 
59 
     | 
    
         
             
                  ruby-progressbar (~> 1.7)
         
     | 
| 
       51 
     | 
    
         
            -
                  unicode-display_width ( 
     | 
| 
       52 
     | 
    
         
            -
                 
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
      
 60 
     | 
    
         
            +
                  unicode-display_width (>= 1.4.0, < 2.0)
         
     | 
| 
      
 61 
     | 
    
         
            +
                rubocop-ast (1.4.0)
         
     | 
| 
      
 62 
     | 
    
         
            +
                  parser (>= 2.7.1.5)
         
     | 
| 
      
 63 
     | 
    
         
            +
                ruby-progressbar (1.11.0)
         
     | 
| 
      
 64 
     | 
    
         
            +
                ruby2_keywords (0.0.4)
         
     | 
| 
       54 
65 
     | 
    
         
             
                sidekiq (5.2.9)
         
     | 
| 
       55 
66 
     | 
    
         
             
                  connection_pool (~> 2.2, >= 2.2.2)
         
     | 
| 
       56 
67 
     | 
    
         
             
                  rack (~> 2.0)
         
     | 
| 
         @@ -62,7 +73,7 @@ GEM 
     | 
|
| 
       62 
73 
     | 
    
         
             
                  rack-protection (= 2.0.8.1)
         
     | 
| 
       63 
74 
     | 
    
         
             
                  tilt (~> 2.0)
         
     | 
| 
       64 
75 
     | 
    
         
             
                tilt (2.0.10)
         
     | 
| 
       65 
     | 
    
         
            -
                unicode-display_width (1. 
     | 
| 
      
 76 
     | 
    
         
            +
                unicode-display_width (1.7.0)
         
     | 
| 
       66 
77 
     | 
    
         | 
| 
       67 
78 
     | 
    
         
             
            PLATFORMS
         
     | 
| 
       68 
79 
     | 
    
         
             
              ruby
         
     | 
| 
         @@ -74,4 +85,4 @@ DEPENDENCIES 
     | 
|
| 
       74 
85 
     | 
    
         
             
              rubocop (~> 0.42)
         
     | 
| 
       75 
86 
     | 
    
         | 
| 
       76 
87 
     | 
    
         
             
            BUNDLED WITH
         
     | 
| 
       77 
     | 
    
         
            -
               1. 
     | 
| 
      
 88 
     | 
    
         
            +
               2.1.4
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -33,23 +33,6 @@ metrics. 
     | 
|
| 
       33 
33 
     | 
    
         
             
                * [git pull/push timings](lib/gitlab_exporter/git.rb) --
         
     | 
| 
       34 
34 
     | 
    
         
             
                  `git_pull_time_milliseconds`, `git_push_time_milliseconds`
         
     | 
| 
       35 
35 
     | 
    
         
             
                * git processes stats (see Process below)
         
     | 
| 
       36 
     | 
    
         
            -
            1. [Process](lib/gitlab_exporter/process.rb)
         
     | 
| 
       37 
     | 
    
         
            -
                * CPU time -- `process_cpu_seconds_total`
         
     | 
| 
       38 
     | 
    
         
            -
                * Start time -- `process_start_time_seconds`
         
     | 
| 
       39 
     | 
    
         
            -
                * Count -- `process_count`
         
     | 
| 
       40 
     | 
    
         
            -
                * Memory usage
         
     | 
| 
       41 
     | 
    
         
            -
                  * Data from /proc/<pid>/cmdline:
         
     | 
| 
       42 
     | 
    
         
            -
                    * `process_resident_memory_bytes`
         
     | 
| 
       43 
     | 
    
         
            -
                    * `process_virtual_memory_bytes`
         
     | 
| 
       44 
     | 
    
         
            -
                  * Data from /proc/<pid>/smaps -- `probe_smaps` (off by default):
         
     | 
| 
       45 
     | 
    
         
            -
                    * `process_smaps_size_bytes`
         
     | 
| 
       46 
     | 
    
         
            -
                    * `process_smaps_rss_bytes`
         
     | 
| 
       47 
     | 
    
         
            -
                    * `process_smaps_shared_clean_bytes`
         
     | 
| 
       48 
     | 
    
         
            -
                    * `process_smaps_shared_dirty_bytes`
         
     | 
| 
       49 
     | 
    
         
            -
                    * `process_smaps_private_clean_bytes`
         
     | 
| 
       50 
     | 
    
         
            -
                    * `process_smaps_private_dirty_bytes`
         
     | 
| 
       51 
     | 
    
         
            -
                    * `process_smaps_swap_bytes`
         
     | 
| 
       52 
     | 
    
         
            -
                    * `process_smaps_pss_bytes`
         
     | 
| 
       53 
36 
     | 
    
         
             
            1. [Sidekiq](lib/gitlab_exporter/sidekiq.rb)
         
     | 
| 
       54 
37 
     | 
    
         
             
            	* Stats
         
     | 
| 
       55 
38 
     | 
    
         
             
            	  * `sidekiq_jobs_processed_total`
         
     | 
    
        data/bin/gitlab-exporter
    CHANGED
    
    
| 
         @@ -6,6 +6,7 @@ db_common: &db_common 
     | 
|
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
            # Web server config
         
     | 
| 
       8 
8 
     | 
    
         
             
            server:
         
     | 
| 
      
 9 
     | 
    
         
            +
              name: puma # cf. https://github.com/sinatra/sinatra#available-settings
         
     | 
| 
       9 
10 
     | 
    
         
             
              listen_address: 0.0.0.0
         
     | 
| 
       10 
11 
     | 
    
         
             
              listen_port: 9168
         
     | 
| 
       11 
12 
     | 
    
         
             
              # Maximum amount of memory to use in megabytes, after which the process is killed
         
     | 
| 
         @@ -45,7 +46,6 @@ probes: 
     | 
|
| 
       45 
46 
     | 
    
         
             
                  <<: *db_common
         
     | 
| 
       46 
47 
     | 
    
         
             
                  opts:
         
     | 
| 
       47 
48 
     | 
    
         
             
                    <<: *db_common_opts
         
     | 
| 
       48 
     | 
    
         
            -
                    allowed_repeated_commands_count: 2
         
     | 
| 
       49 
49 
     | 
    
         
             
                    created_builds_counting_disabled: true
         
     | 
| 
       50 
50 
     | 
    
         
             
                    unarchived_traces_offset_minutes: 1440
         
     | 
| 
       51 
51 
     | 
    
         
             
                tuple_stats:
         
     | 
| 
         @@ -94,12 +94,21 @@ probes: 
     | 
|
| 
       94 
94 
     | 
    
         
             
                  redis_url: "redis://localhost:6379"
         
     | 
| 
       95 
95 
     | 
    
         
             
                  redis_enable_client: true
         
     | 
| 
       96 
96 
     | 
    
         | 
| 
      
 97 
     | 
    
         
            +
              ruby: &ruby
         
     | 
| 
      
 98 
     | 
    
         
            +
                class_name: RubyProber
         
     | 
| 
      
 99 
     | 
    
         
            +
                methods:
         
     | 
| 
      
 100 
     | 
    
         
            +
                - probe_gc
         
     | 
| 
      
 101 
     | 
    
         
            +
                opts:
         
     | 
| 
      
 102 
     | 
    
         
            +
                  quantiles: false
         
     | 
| 
      
 103 
     | 
    
         
            +
             
     | 
| 
       97 
104 
     | 
    
         
             
              metrics:
         
     | 
| 
       98 
105 
     | 
    
         
             
                multiple: true
         
     | 
| 
       99 
106 
     | 
    
         
             
                git_process:
         
     | 
| 
       100 
107 
     | 
    
         
             
                  <<: *git_process
         
     | 
| 
       101 
108 
     | 
    
         
             
                process:
         
     | 
| 
       102 
109 
     | 
    
         
             
                  <<: *process
         
     | 
| 
      
 110 
     | 
    
         
            +
                ruby:
         
     | 
| 
      
 111 
     | 
    
         
            +
                  <<: *ruby
         
     | 
| 
       103 
112 
     | 
    
         
             
                sidekiq:
         
     | 
| 
       104 
113 
     | 
    
         
             
                  <<: *sidekiq
         
     | 
| 
       105 
114 
     | 
    
         
             
                ci_builds:
         
     | 
    
        data/gitlab-exporter.gemspec
    CHANGED
    
    | 
         @@ -1,4 +1,4 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            lib = File.expand_path(" 
     | 
| 
      
 1 
     | 
    
         
            +
            lib = File.expand_path("lib", __dir__)
         
     | 
| 
       2 
2 
     | 
    
         
             
            $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
         
     | 
| 
       3 
3 
     | 
    
         
             
            require "gitlab_exporter/version"
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
         @@ -20,13 +20,14 @@ Gem::Specification.new do |s| 
     | 
|
| 
       20 
20 
     | 
    
         
             
              s.homepage      = "http://gitlab.com"
         
     | 
| 
       21 
21 
     | 
    
         
             
              s.license       = "MIT"
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
      
 23 
     | 
    
         
            +
              s.add_runtime_dependency "connection_pool", "~> 2.2.1"
         
     | 
| 
       23 
24 
     | 
    
         
             
              s.add_runtime_dependency "pg", "~> 1.1"
         
     | 
| 
       24 
     | 
    
         
            -
              s.add_runtime_dependency " 
     | 
| 
      
 25 
     | 
    
         
            +
              s.add_runtime_dependency "puma", "~> 5.1.1"
         
     | 
| 
       25 
26 
     | 
    
         
             
              s.add_runtime_dependency "quantile", "~> 0.2.0"
         
     | 
| 
       26 
     | 
    
         
            -
              s.add_runtime_dependency "sidekiq", "~> 5.2.1"
         
     | 
| 
       27 
27 
     | 
    
         
             
              s.add_runtime_dependency "redis", "~> 4.1.2"
         
     | 
| 
       28 
28 
     | 
    
         
             
              s.add_runtime_dependency "redis-namespace", "~> 1.6.0"
         
     | 
| 
       29 
     | 
    
         
            -
              s.add_runtime_dependency " 
     | 
| 
      
 29 
     | 
    
         
            +
              s.add_runtime_dependency "sidekiq", "~> 5.2.1"
         
     | 
| 
      
 30 
     | 
    
         
            +
              s.add_runtime_dependency "sinatra", "~> 2.0.4"
         
     | 
| 
       30 
31 
     | 
    
         | 
| 
       31 
32 
     | 
    
         
             
              s.add_development_dependency "rspec", "~> 3.7.0"
         
     | 
| 
       32 
33 
     | 
    
         
             
              s.add_development_dependency "rspec-expectations", "~> 3.7.0"
         
     | 
    
        data/lib/gitlab_exporter.rb
    CHANGED
    
    
    
        data/lib/gitlab_exporter/cli.rb
    CHANGED
    
    | 
         @@ -19,8 +19,7 @@ module GitLab 
     | 
|
| 
       19 
19 
     | 
    
         
             
                  # Empty runner that will raise an InvalidCLICommand when executed to provide the usage
         
     | 
| 
       20 
20 
     | 
    
         
             
                  # in the exception message
         
     | 
| 
       21 
21 
     | 
    
         
             
                  class NullRunner
         
     | 
| 
       22 
     | 
    
         
            -
                    def initialize(args)
         
     | 
| 
       23 
     | 
    
         
            -
                    end
         
     | 
| 
      
 22 
     | 
    
         
            +
                    def initialize(args); end
         
     | 
| 
       24 
23 
     | 
    
         | 
| 
       25 
24 
     | 
    
         
             
                    def run
         
     | 
| 
       26 
25 
     | 
    
         
             
                      fail InvalidCLICommand.new("Usage: #{EXECUTABLE_NAME} <command> [options] [arguments...]\n\n"\
         
     | 
| 
         @@ -8,14 +8,39 @@ module GitLab 
     | 
|
| 
       8 
8 
     | 
    
         
             
                  #
         
     | 
| 
       9 
9 
     | 
    
         
             
                  # It takes a connection string (e.g. "dbname=test port=5432")
         
     | 
| 
       10 
10 
     | 
    
         
             
                  class Base
         
     | 
| 
      
 11 
     | 
    
         
            +
                    POOL_SIZE = 3
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                    # This timeout is configured to higher interval than scrapping
         
     | 
| 
      
 14 
     | 
    
         
            +
                    # of Prometheus to ensure that connection is kept instead of
         
     | 
| 
      
 15 
     | 
    
         
            +
                    # needed to be re-initialized
         
     | 
| 
      
 16 
     | 
    
         
            +
                    POOL_TIMEOUT = 90
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
       11 
18 
     | 
    
         
             
                    def self.connection_pool
         
     | 
| 
       12 
     | 
    
         
            -
                       
     | 
| 
       13 
     | 
    
         
            -
                        h[connection_string] = ConnectionPool.new(size:  
     | 
| 
       14 
     | 
    
         
            -
                          PG.connect(connection_string)
         
     | 
| 
      
 19 
     | 
    
         
            +
                      @@connection_pool ||= Hash.new do |h, connection_string| # rubocop:disable Style/ClassVars
         
     | 
| 
      
 20 
     | 
    
         
            +
                        h[connection_string] = ConnectionPool.new(size: POOL_SIZE, timeout: POOL_TIMEOUT) do
         
     | 
| 
      
 21 
     | 
    
         
            +
                          PG.connect(connection_string).tap do |conn|
         
     | 
| 
      
 22 
     | 
    
         
            +
                            configure_type_map_for_results(conn)
         
     | 
| 
      
 23 
     | 
    
         
            +
                          end
         
     | 
| 
       15 
24 
     | 
    
         
             
                        end
         
     | 
| 
       16 
25 
     | 
    
         
             
                      end
         
     | 
| 
       17 
26 
     | 
    
         
             
                    end
         
     | 
| 
       18 
27 
     | 
    
         | 
| 
      
 28 
     | 
    
         
            +
                    def self.configure_type_map_for_results(conn)
         
     | 
| 
      
 29 
     | 
    
         
            +
                      tm = PG::BasicTypeMapForResults.new(conn)
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                      # Remove warning message:
         
     | 
| 
      
 32 
     | 
    
         
            +
                      # Warning: no type cast defined for type "name" with oid 19.
         
     | 
| 
      
 33 
     | 
    
         
            +
                      # Please cast this type explicitly to TEXT to be safe for future changes.
         
     | 
| 
      
 34 
     | 
    
         
            +
                      # Warning: no type cast defined for type "regproc" with oid 24.
         
     | 
| 
      
 35 
     | 
    
         
            +
                      # Please cast this type explicitly to TEXT to be safe for future changes.
         
     | 
| 
      
 36 
     | 
    
         
            +
                      [{ "type": "text", "oid": 19 }, { "type": "int4", "oid": 24 }].each do |value|
         
     | 
| 
      
 37 
     | 
    
         
            +
                        old_coder = tm.coders.find { |c| c.name == value[:type] }
         
     | 
| 
      
 38 
     | 
    
         
            +
                        tm.add_coder(old_coder.dup.tap { |c| c.oid = value[:oid] })
         
     | 
| 
      
 39 
     | 
    
         
            +
                      end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                      conn.type_map_for_results = tm
         
     | 
| 
      
 42 
     | 
    
         
            +
                    end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
       19 
44 
     | 
    
         
             
                    def initialize(args, logger: nil)
         
     | 
| 
       20 
45 
     | 
    
         
             
                      @connection_string = args[:connection_string]
         
     | 
| 
       21 
46 
     | 
    
         
             
                      @logger = logger
         
     | 
| 
         @@ -31,13 +56,11 @@ module GitLab 
     | 
|
| 
       31 
56 
     | 
    
         | 
| 
       32 
57 
     | 
    
         
             
                    def with_connection_pool
         
     | 
| 
       33 
58 
     | 
    
         
             
                      connection_pool.with do |conn|
         
     | 
| 
       34 
     | 
    
         
            -
                         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                          raise e
         
     | 
| 
       40 
     | 
    
         
            -
                        end
         
     | 
| 
      
 59 
     | 
    
         
            +
                        yield conn
         
     | 
| 
      
 60 
     | 
    
         
            +
                      rescue PG::UnableToSend => e
         
     | 
| 
      
 61 
     | 
    
         
            +
                        @logger.warn "Error sending to the database: #{e}" if @logger
         
     | 
| 
      
 62 
     | 
    
         
            +
                        conn.reset
         
     | 
| 
      
 63 
     | 
    
         
            +
                        raise e
         
     | 
| 
       41 
64 
     | 
    
         
             
                      end
         
     | 
| 
       42 
65 
     | 
    
         
             
                    rescue PG::Error => e
         
     | 
| 
       43 
66 
     | 
    
         
             
                      @logger.error "Error connecting to the database: #{e}" if @logger
         
     | 
| 
         @@ -35,7 +35,7 @@ module GitLab 
     | 
|
| 
       35 
35 
     | 
    
         | 
| 
       36 
36 
     | 
    
         
             
                  # Prober class to gather bloat metrics
         
     | 
| 
       37 
37 
     | 
    
         
             
                  class BloatProber
         
     | 
| 
       38 
     | 
    
         
            -
                    METRIC_KEYS = %w 
     | 
| 
      
 38 
     | 
    
         
            +
                    METRIC_KEYS = %w[bloat_ratio bloat_size extra_size real_size].freeze
         
     | 
| 
       39 
39 
     | 
    
         | 
| 
       40 
40 
     | 
    
         
             
                    attr_reader :metrics, :collector, :bloat_types
         
     | 
| 
       41 
41 
     | 
    
         | 
| 
         @@ -46,7 +46,7 @@ module GitLab 
     | 
|
| 
       46 
46 
     | 
    
         
             
                      @metrics = metrics
         
     | 
| 
       47 
47 
     | 
    
         
             
                      @collector = collector
         
     | 
| 
       48 
48 
     | 
    
         
             
                      @collector.logger = logger
         
     | 
| 
       49 
     | 
    
         
            -
                      @bloat_types = opts[:bloat_types] || %i 
     | 
| 
      
 49 
     | 
    
         
            +
                      @bloat_types = opts[:bloat_types] || %i[btree table]
         
     | 
| 
       50 
50 
     | 
    
         
             
                    end
         
     | 
| 
       51 
51 
     | 
    
         | 
| 
       52 
52 
     | 
    
         
             
                    def probe_db
         
     | 
| 
         @@ -147,100 +147,6 @@ module GitLab 
     | 
|
| 
       147 
147 
     | 
    
         
             
                        SELECT COUNT(*) FROM licenses
         
     | 
| 
       148 
148 
     | 
    
         
             
                      SQL
         
     | 
| 
       149 
149 
     | 
    
         | 
| 
       150 
     | 
    
         
            -
                    REPEATED_COMMANDS_QUERY_EE =
         
     | 
| 
       151 
     | 
    
         
            -
                      <<~SQL.freeze
         
     | 
| 
       152 
     | 
    
         
            -
                        SELECT
         
     | 
| 
       153 
     | 
    
         
            -
                          subquery.namespace_id,
         
     | 
| 
       154 
     | 
    
         
            -
                          subquery.shared_runners_enabled,
         
     | 
| 
       155 
     | 
    
         
            -
                          subquery.project_id,
         
     | 
| 
       156 
     | 
    
         
            -
                          subquery.status,
         
     | 
| 
       157 
     | 
    
         
            -
                          subquery.has_minutes,
         
     | 
| 
       158 
     | 
    
         
            -
                          MAX(subquery.count) as count
         
     | 
| 
       159 
     | 
    
         
            -
                        FROM (
         
     | 
| 
       160 
     | 
    
         
            -
                          SELECT
         
     | 
| 
       161 
     | 
    
         
            -
                            projects.namespace_id,
         
     | 
| 
       162 
     | 
    
         
            -
                            projects.shared_runners_enabled,
         
     | 
| 
       163 
     | 
    
         
            -
                            ci_builds.project_id,
         
     | 
| 
       164 
     | 
    
         
            -
                            ci_builds.commit_id,
         
     | 
| 
       165 
     | 
    
         
            -
                            ci_builds.status,
         
     | 
| 
       166 
     | 
    
         
            -
                            (COALESCE(namespaces.shared_runners_minutes_limit, application_settings.shared_runners_minutes, 0) = 0 OR
         
     | 
| 
       167 
     | 
    
         
            -
                               COALESCE(namespace_statistics.shared_runners_seconds, 0) < COALESCE(namespaces.shared_runners_minutes_limit, application_settings.shared_runners_minutes, 0) * 60) as has_minutes,
         
     | 
| 
       168 
     | 
    
         
            -
                            COUNT(*) AS count
         
     | 
| 
       169 
     | 
    
         
            -
                          FROM ci_builds
         
     | 
| 
       170 
     | 
    
         
            -
                          JOIN projects
         
     | 
| 
       171 
     | 
    
         
            -
                            ON projects.id = ci_builds.project_id
         
     | 
| 
       172 
     | 
    
         
            -
                          JOIN namespaces
         
     | 
| 
       173 
     | 
    
         
            -
                            ON namespaces.id = projects.namespace_id
         
     | 
| 
       174 
     | 
    
         
            -
                          LEFT JOIN namespace_statistics
         
     | 
| 
       175 
     | 
    
         
            -
                            ON namespace_statistics.namespace_id = namespaces.id
         
     | 
| 
       176 
     | 
    
         
            -
                          JOIN application_settings ON (TRUE)
         
     | 
| 
       177 
     | 
    
         
            -
                          WHERE ci_builds.type = 'Ci::Build'
         
     | 
| 
       178 
     | 
    
         
            -
                            AND ci_builds.status IN ('running', 'pending')
         
     | 
| 
       179 
     | 
    
         
            -
                            -- The created_at filter has been introduced for performance reasons only
         
     | 
| 
       180 
     | 
    
         
            -
                            AND ci_builds.created_at > NOW() - INTERVAL '7 days'
         
     | 
| 
       181 
     | 
    
         
            -
                          GROUP BY
         
     | 
| 
       182 
     | 
    
         
            -
                            projects.namespace_id,
         
     | 
| 
       183 
     | 
    
         
            -
                            projects.shared_runners_enabled,
         
     | 
| 
       184 
     | 
    
         
            -
                            ci_builds.project_id,
         
     | 
| 
       185 
     | 
    
         
            -
                            ci_builds.commit_id,
         
     | 
| 
       186 
     | 
    
         
            -
                            ci_builds.status,
         
     | 
| 
       187 
     | 
    
         
            -
                            ci_builds.commands,
         
     | 
| 
       188 
     | 
    
         
            -
                            namespaces.shared_runners_minutes_limit,
         
     | 
| 
       189 
     | 
    
         
            -
                            namespace_statistics.shared_runners_seconds,
         
     | 
| 
       190 
     | 
    
         
            -
                            application_settings.shared_runners_minutes
         
     | 
| 
       191 
     | 
    
         
            -
                          HAVING COUNT(*) > %d
         
     | 
| 
       192 
     | 
    
         
            -
                        ) AS subquery
         
     | 
| 
       193 
     | 
    
         
            -
                        GROUP BY
         
     | 
| 
       194 
     | 
    
         
            -
                          subquery.namespace_id,
         
     | 
| 
       195 
     | 
    
         
            -
                          subquery.shared_runners_enabled,
         
     | 
| 
       196 
     | 
    
         
            -
                          subquery.project_id,
         
     | 
| 
       197 
     | 
    
         
            -
                          subquery.commit_id,
         
     | 
| 
       198 
     | 
    
         
            -
                          subquery.status,
         
     | 
| 
       199 
     | 
    
         
            -
                          subquery.has_minutes
         
     | 
| 
       200 
     | 
    
         
            -
                      SQL
         
     | 
| 
       201 
     | 
    
         
            -
             
     | 
| 
       202 
     | 
    
         
            -
                    REPEATED_COMMANDS_QUERY_CE =
         
     | 
| 
       203 
     | 
    
         
            -
                      <<~SQL.freeze
         
     | 
| 
       204 
     | 
    
         
            -
                        SELECT
         
     | 
| 
       205 
     | 
    
         
            -
                          subquery.namespace_id,
         
     | 
| 
       206 
     | 
    
         
            -
                          subquery.shared_runners_enabled,
         
     | 
| 
       207 
     | 
    
         
            -
                          subquery.project_id,
         
     | 
| 
       208 
     | 
    
         
            -
                          subquery.status,
         
     | 
| 
       209 
     | 
    
         
            -
                          MAX(subquery.count) as count
         
     | 
| 
       210 
     | 
    
         
            -
                        FROM (
         
     | 
| 
       211 
     | 
    
         
            -
                          SELECT
         
     | 
| 
       212 
     | 
    
         
            -
                            projects.namespace_id,
         
     | 
| 
       213 
     | 
    
         
            -
                            projects.shared_runners_enabled,
         
     | 
| 
       214 
     | 
    
         
            -
                            ci_builds.project_id,
         
     | 
| 
       215 
     | 
    
         
            -
                            ci_builds.commit_id,
         
     | 
| 
       216 
     | 
    
         
            -
                            ci_builds.status,
         
     | 
| 
       217 
     | 
    
         
            -
                            COUNT(*) AS count
         
     | 
| 
       218 
     | 
    
         
            -
                          FROM ci_builds
         
     | 
| 
       219 
     | 
    
         
            -
                          JOIN projects
         
     | 
| 
       220 
     | 
    
         
            -
                            ON projects.id = ci_builds.project_id
         
     | 
| 
       221 
     | 
    
         
            -
                          JOIN namespaces
         
     | 
| 
       222 
     | 
    
         
            -
                            ON namespaces.id = projects.namespace_id
         
     | 
| 
       223 
     | 
    
         
            -
                          WHERE ci_builds.type = 'Ci::Build'
         
     | 
| 
       224 
     | 
    
         
            -
                            AND ci_builds.status IN ('running', 'pending')
         
     | 
| 
       225 
     | 
    
         
            -
                          -- The created_at filter has been introduced for performance reasons only
         
     | 
| 
       226 
     | 
    
         
            -
                          AND ci_builds.created_at > NOW() - INTERVAL '7 days'
         
     | 
| 
       227 
     | 
    
         
            -
                          GROUP BY
         
     | 
| 
       228 
     | 
    
         
            -
                            projects.namespace_id,
         
     | 
| 
       229 
     | 
    
         
            -
                            projects.shared_runners_enabled,
         
     | 
| 
       230 
     | 
    
         
            -
                            ci_builds.project_id,
         
     | 
| 
       231 
     | 
    
         
            -
                            ci_builds.commit_id,
         
     | 
| 
       232 
     | 
    
         
            -
                            ci_builds.status,
         
     | 
| 
       233 
     | 
    
         
            -
                            ci_builds.commands
         
     | 
| 
       234 
     | 
    
         
            -
                          HAVING COUNT(*) > %d
         
     | 
| 
       235 
     | 
    
         
            -
                        ) AS subquery
         
     | 
| 
       236 
     | 
    
         
            -
                        GROUP BY
         
     | 
| 
       237 
     | 
    
         
            -
                          subquery.namespace_id,
         
     | 
| 
       238 
     | 
    
         
            -
                          subquery.shared_runners_enabled,
         
     | 
| 
       239 
     | 
    
         
            -
                          subquery.project_id,
         
     | 
| 
       240 
     | 
    
         
            -
                          subquery.commit_id,
         
     | 
| 
       241 
     | 
    
         
            -
                          subquery.status
         
     | 
| 
       242 
     | 
    
         
            -
                      SQL
         
     | 
| 
       243 
     | 
    
         
            -
             
     | 
| 
       244 
150 
     | 
    
         
             
                    UNARCHIVED_TRACES_QUERY =
         
     | 
| 
       245 
151 
     | 
    
         
             
                      <<~SQL.freeze
         
     | 
| 
       246 
152 
     | 
    
         
             
                        SELECT
         
     | 
| 
         @@ -265,7 +171,6 @@ module GitLab 
     | 
|
| 
       265 
171 
     | 
    
         
             
                    def initialize(opts, logger: nil)
         
     | 
| 
       266 
172 
     | 
    
         
             
                      super(opts, logger: logger)
         
     | 
| 
       267 
173 
     | 
    
         | 
| 
       268 
     | 
    
         
            -
                      @allowed_repeated_commands_count = opts[:allowed_repeated_commands_count]
         
     | 
| 
       269 
174 
     | 
    
         
             
                      @created_builds_counting_disabled = opts[:created_builds_counting_disabled]
         
     | 
| 
       270 
175 
     | 
    
         
             
                      @unarchived_traces_offset_minutes = opts[:unarchived_traces_offset_minutes]
         
     | 
| 
       271 
176 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -276,7 +181,6 @@ module GitLab 
     | 
|
| 
       276 
181 
     | 
    
         
             
                      results[:pending_builds] = builds(STATUS_PENDING)
         
     | 
| 
       277 
182 
     | 
    
         
             
                      results[:stale_builds] = stale_builds
         
     | 
| 
       278 
183 
     | 
    
         
             
                      results[:per_runner] = per_runner_builds
         
     | 
| 
       279 
     | 
    
         
            -
                      results[:repeated_commands] = repeated_commands
         
     | 
| 
       280 
184 
     | 
    
         
             
                      results[:unarchived_traces] = unarchived_traces
         
     | 
| 
       281 
185 
     | 
    
         
             
                      results
         
     | 
| 
       282 
186 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -335,34 +239,6 @@ module GitLab 
     | 
|
| 
       335 
239 
     | 
    
         
             
                      include_ee_fields(values, row)
         
     | 
| 
       336 
240 
     | 
    
         
             
                    end
         
     | 
| 
       337 
241 
     | 
    
         | 
| 
       338 
     | 
    
         
            -
                    def repeated_commands
         
     | 
| 
       339 
     | 
    
         
            -
                      results = []
         
     | 
| 
       340 
     | 
    
         
            -
             
     | 
| 
       341 
     | 
    
         
            -
                      query = ee? ? REPEATED_COMMANDS_QUERY_EE : REPEATED_COMMANDS_QUERY_CE
         
     | 
| 
       342 
     | 
    
         
            -
                      query = query % [allowed_repeated_commands_count] # rubocop:disable Style/FormatString
         
     | 
| 
       343 
     | 
    
         
            -
                      exec_query_with_custom_random_page_cost(query).each do |row|
         
     | 
| 
       344 
     | 
    
         
            -
                        results << transform_repeated_commands_row_to_values(row)
         
     | 
| 
       345 
     | 
    
         
            -
                      end
         
     | 
| 
       346 
     | 
    
         
            -
             
     | 
| 
       347 
     | 
    
         
            -
                      results
         
     | 
| 
       348 
     | 
    
         
            -
                    rescue PG::UndefinedTable, PG::UndefinedColumn
         
     | 
| 
       349 
     | 
    
         
            -
                      []
         
     | 
| 
       350 
     | 
    
         
            -
                    end
         
     | 
| 
       351 
     | 
    
         
            -
             
     | 
| 
       352 
     | 
    
         
            -
                    def allowed_repeated_commands_count
         
     | 
| 
       353 
     | 
    
         
            -
                      @allowed_repeated_commands_count ||= 2
         
     | 
| 
       354 
     | 
    
         
            -
                    end
         
     | 
| 
       355 
     | 
    
         
            -
             
     | 
| 
       356 
     | 
    
         
            -
                    def transform_repeated_commands_row_to_values(row)
         
     | 
| 
       357 
     | 
    
         
            -
                      values = { namespace: row["namespace_id"].to_s,
         
     | 
| 
       358 
     | 
    
         
            -
                                 project: row["project_id"].to_s,
         
     | 
| 
       359 
     | 
    
         
            -
                                 shared_runners: row["shared_runners_enabled"] == "t" ? "yes" : "no",
         
     | 
| 
       360 
     | 
    
         
            -
                                 status: row["status"].to_s,
         
     | 
| 
       361 
     | 
    
         
            -
                                 value: row["count"].to_i }
         
     | 
| 
       362 
     | 
    
         
            -
             
     | 
| 
       363 
     | 
    
         
            -
                      include_has_minutes_field(values, row)
         
     | 
| 
       364 
     | 
    
         
            -
                    end
         
     | 
| 
       365 
     | 
    
         
            -
             
     | 
| 
       366 
242 
     | 
    
         
             
                    def unarchived_traces
         
     | 
| 
       367 
243 
     | 
    
         
             
                      time = Time.now - (unarchived_traces_offset_minutes * 60)
         
     | 
| 
       368 
244 
     | 
    
         
             
                      query = UNARCHIVED_TRACES_QUERY % [time.strftime("%F %T")] # rubocop:disable Style/FormatString
         
     | 
| 
         @@ -391,6 +267,7 @@ module GitLab 
     | 
|
| 
       391 
267 
     | 
    
         | 
| 
       392 
268 
     | 
    
         
             
                    def include_bool_if_row_defined(row, field)
         
     | 
| 
       393 
269 
     | 
    
         
             
                      return {} unless row[field.to_s]
         
     | 
| 
      
 270 
     | 
    
         
            +
             
     | 
| 
       394 
271 
     | 
    
         
             
                      { field => row[field.to_s] == "t" ? "yes" : "no" }
         
     | 
| 
       395 
272 
     | 
    
         
             
                    end
         
     | 
| 
       396 
273 
     | 
    
         | 
| 
         @@ -421,7 +298,6 @@ module GitLab 
     | 
|
| 
       421 
298 
     | 
    
         
             
                      @metrics = metrics
         
     | 
| 
       422 
299 
     | 
    
         | 
| 
       423 
300 
     | 
    
         
             
                      collector_opts = { connection_string: opts[:connection_string],
         
     | 
| 
       424 
     | 
    
         
            -
                                         allowed_repeated_commands_count: opts[:allowed_repeated_commands_count],
         
     | 
| 
       425 
301 
     | 
    
         
             
                                         created_builds_counting_disabled: opts[:created_builds_counting_disabled],
         
     | 
| 
       426 
302 
     | 
    
         
             
                                         unarchived_traces_offset_minutes: opts[:unarchived_traces_offset_minutes] }
         
     | 
| 
       427 
303 
     | 
    
         
             
                      @collector = CiBuildsCollector.new(collector_opts, logger: logger)
         
     | 
| 
         @@ -434,7 +310,6 @@ module GitLab 
     | 
|
| 
       434 
310 
     | 
    
         
             
                      ci_builds_metrics(@results[:pending_builds], "ci_pending_builds")
         
     | 
| 
       435 
311 
     | 
    
         
             
                      ci_stale_builds_metrics
         
     | 
| 
       436 
312 
     | 
    
         
             
                      metrics_per_runner
         
     | 
| 
       437 
     | 
    
         
            -
                      repeated_commands_metrics
         
     | 
| 
       438 
313 
     | 
    
         
             
                      unarchived_traces_metrics
         
     | 
| 
       439 
314 
     | 
    
         | 
| 
       440 
315 
     | 
    
         
             
                      self
         
     | 
| 
         @@ -470,7 +345,7 @@ module GitLab 
     | 
|
| 
       470 
345 
     | 
    
         | 
| 
       471 
346 
     | 
    
         
             
                    def add_ci_created_pending_builds(metric_name, value, labels)
         
     | 
| 
       472 
347 
     | 
    
         
             
                      add_metric_with_namespace_label(metric_name,
         
     | 
| 
       473 
     | 
    
         
            -
                                                      [ 
     | 
| 
      
 348 
     | 
    
         
            +
                                                      %i[namespace shared_runners has_minutes],
         
     | 
| 
       474 
349 
     | 
    
         
             
                                                      value,
         
     | 
| 
       475 
350 
     | 
    
         
             
                                                      labels)
         
     | 
| 
       476 
351 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -505,8 +380,8 @@ module GitLab 
     | 
|
| 
       505 
380 
     | 
    
         
             
                    def add_ci_running_builds(value, labels)
         
     | 
| 
       506 
381 
     | 
    
         
             
                      add_metric_with_namespace_label(
         
     | 
| 
       507 
382 
     | 
    
         
             
                        "ci_running_builds",
         
     | 
| 
       508 
     | 
    
         
            -
                        [ 
     | 
| 
       509 
     | 
    
         
            -
             
     | 
| 
      
 383 
     | 
    
         
            +
                        %i[runner namespace runner_type scheduled
         
     | 
| 
      
 384 
     | 
    
         
            +
                           triggered mirror mirror_trigger_builds has_minutes],
         
     | 
| 
       510 
385 
     | 
    
         
             
                        value,
         
     | 
| 
       511 
386 
     | 
    
         
             
                        labels
         
     | 
| 
       512 
387 
     | 
    
         
             
                      )
         
     | 
| 
         @@ -519,14 +394,6 @@ module GitLab 
     | 
|
| 
       519 
394 
     | 
    
         
             
                      @metrics.add(metric_name, value.to_f, selected_labels)
         
     | 
| 
       520 
395 
     | 
    
         
             
                    end
         
     | 
| 
       521 
396 
     | 
    
         | 
| 
       522 
     | 
    
         
            -
                    def repeated_commands_metrics
         
     | 
| 
       523 
     | 
    
         
            -
                      @results[:repeated_commands].each do |metric|
         
     | 
| 
       524 
     | 
    
         
            -
                        value = metric.delete(:value)
         
     | 
| 
       525 
     | 
    
         
            -
             
     | 
| 
       526 
     | 
    
         
            -
                        @metrics.add("ci_repeated_commands_builds", value.to_f, metric)
         
     | 
| 
       527 
     | 
    
         
            -
                      end
         
     | 
| 
       528 
     | 
    
         
            -
                    end
         
     | 
| 
       529 
     | 
    
         
            -
             
     | 
| 
       530 
397 
     | 
    
         
             
                    def unarchived_traces_metrics
         
     | 
| 
       531 
398 
     | 
    
         
             
                      @metrics.add("ci_unarchived_traces", @results[:unarchived_traces].to_f)
         
     | 
| 
       532 
399 
     | 
    
         
             
                    end
         
     |