greenhat 0.6.3 → 0.6.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: abf4296d91fa1a63e0858e1a1ee0bc461668a6839d7ffb7ab6fbaeadae035dc1
4
- data.tar.gz: c7134e262cabb6c1873dc92e56ca6318cef9c64abb4573646228ee52c36be60e
3
+ metadata.gz: d1d43c5b575df2757d624faaccf19b9474232d1fcdcfbc4ca5b9c7a59c8c0f0d
4
+ data.tar.gz: 3b3b17030206edca1b23533f1df6624a3c16e8e881c2460f84c78b4fcc0ccef4
5
5
  SHA512:
6
- metadata.gz: 6ea40f3c0fc24c35722631e61ad489bd1b9eabd2d6453669e2b56476a5e1c4c883d181d062794023555598da608a69615d4f10f0bfd0c8a75bccf6e0faed8189
7
- data.tar.gz: 9b947cdfc641164da1ed4d76df4e9739a01ad29a8120bc3485a534b7a0274beb3965c07dc275004e0a3320341844a00031b480e984835e91610edf77b70bf3e4
6
+ metadata.gz: dd7839606650408a33b2af5fbb20288a9390c16f6909bf12e55501988f5314f6ce27f85ebcea0ce9b6012073c92960bfadafd4ea59171873233a65259a860012
7
+ data.tar.gz: ad39e169472755c3b08bf5f8c2a6bf9bfed558f5ee7fa7318ba75439eb76d53e712e26b26c51a0e8ca6f651d90c138ff2200a63b9cddca78aae6109e1cca04e7
@@ -0,0 +1,66 @@
1
+ module GreenHat
2
+ # Pretending to do grep stuffs
3
+ module Grep
4
+ def self.help
5
+ puts "\u2500".pastel(:cyan) * 20
6
+ puts "#{'Grep'.pastel(:yellow)} - gimme... GIMME!"
7
+ puts 'General text searching through all files (logs, parsed, and raw)'
8
+ puts "\u2500".pastel(:cyan) * 20
9
+
10
+ puts 'Usage'.pastel(:blue)
11
+ puts ' <search term> <optional: files>'.pastel(:green)
12
+ puts ' Examples:'
13
+ puts ' grep external_url'
14
+ puts ' grep external_url gitlab.rb'
15
+ puts ' grep "spaced terms"'
16
+ puts ' grep "System clock" timedatectl'
17
+ puts ' grep "search in two files" nfsiostat nfsstat'
18
+ puts
19
+ end
20
+
21
+ def self.grep(raw)
22
+ files, flags, _args = Args.parse(raw)
23
+
24
+ if flags.help
25
+ help
26
+ return
27
+ end
28
+
29
+ # Search Term
30
+ term = files.shift
31
+
32
+ things = find_things(files)
33
+
34
+ # Renderer
35
+ output = []
36
+ things.each do |thing|
37
+ results = thing.grep(term)
38
+
39
+ next if results.empty?
40
+
41
+ output.push("#{thing.friendly_name} #{results.count.to_s.pastel(:bright_black)}")
42
+ output.concat results
43
+ output.push ''
44
+ end
45
+
46
+ # Output
47
+ if output.empty?
48
+ puts 'No results'.pastel(:red)
49
+ return
50
+ end
51
+
52
+ ShellHelper.show GreenHat::Paper.new(data: output, flags: flags).render
53
+ end
54
+
55
+ def self.find_things(files = [])
56
+ if files.empty?
57
+ Thing.all
58
+ else
59
+ Thing.all.select { |x| files.any? { |f| x.name.include? f } }
60
+ end
61
+ end
62
+
63
+ # ------------------
64
+ end
65
+ # ------------------
66
+ end
@@ -6,12 +6,13 @@ module GreenHat
6
6
  class Builder
7
7
  include GreenHat::Reports::Shared
8
8
 
9
- attr_accessor :store, :flags, :args
9
+ attr_accessor :store, :flags, :args, :raw_args
10
10
 
11
- def initialize(file:, flags:, args:)
11
+ def initialize(file:, flags:, args:, raw_args:)
12
12
  self.store = []
13
13
  self.flags = flags
14
14
  self.args = args
15
+ self.raw_args = raw_args
15
16
  instance_eval File.read(file)
16
17
  rescue StandardError => e
17
18
  print "#{e.message}\n"
@@ -88,6 +89,10 @@ module GreenHat
88
89
  add(:query_format, query, show_output, block)
89
90
  end
90
91
 
92
+ def query_if_exists(query, show_output = true, &block)
93
+ add(:query_if_exists, query, show_output, block)
94
+ end
95
+
91
96
  # FastStats Helper
92
97
  def faststats(query, subcmd = '')
93
98
  add(:faststats, query, subcmd)
@@ -52,6 +52,10 @@ def query(query, show_output = true, &block)
52
52
  add(:query, query, show_output, block)
53
53
  end
54
54
 
55
+ def query_if_exists(query, show_output = true, &block)
56
+ add(:query_if_exists, query, show_output, block)
57
+ end
58
+
55
59
  # Log Query / Assume Format
56
60
  def query_format(query, show_output = true, &block)
57
61
  add(:query_format, query, show_output, block)
@@ -37,6 +37,28 @@ module GreenHat
37
37
  instance_exec(&block)
38
38
  end
39
39
 
40
+ # Log Query Ignore if no Files
41
+ def query_if_exists(query, show_output, block)
42
+ files, query_flags, query_args = GreenHat::Args.parse(Shellwords.split(query))
43
+
44
+ query_flags[:archive] = [archive.name] # Limit query to archive
45
+ query_flags[:combine] = true
46
+
47
+ # Default to everything
48
+ files = archive.things if files.empty?
49
+
50
+ # Ignore if no files are found
51
+ return unless ShellHelper.any_things?(files, query_flags)
52
+
53
+ results = Query.start(files, query_flags, query_args)
54
+
55
+ # Print and Exit of No Block / Show
56
+ return show(results) if block.nil? && show_output
57
+
58
+ output = instance_exec(results, &block)
59
+ show output if show_output
60
+ end
61
+
40
62
  # Log Query
41
63
  def query(query, show_output, block)
42
64
  files, query_flags, query_args = GreenHat::Args.parse(Shellwords.split(query))
@@ -24,11 +24,13 @@ entries = [
24
24
  { header: 'Sidekiq', base: 'sidekiq/current --severity=error', stats: 'message' },
25
25
  { header: 'API', base: 'gitlab-rails/api_json.log --severity=error',
26
26
  stats: 'exception.class,exception.message,status' },
27
- { header: 'Gitaly', base: 'gitaly/current --level=error --truncate=99', stats: 'error' }
27
+ { header: 'Gitaly', base: 'gitaly/current --level=error --truncate=99', stats: 'error' },
28
+ { header: 'Praefect', base: 'praefect/current --level=error --truncate=99', stats: 'error' }
28
29
  ]
29
30
 
30
31
  # Filter Logic
31
32
  filters = args_select(:filter)
33
+
32
34
  unless filters.empty?
33
35
  entries.select! do |entry|
34
36
  filters.any? do |filter|
@@ -37,6 +39,17 @@ unless filters.empty?
37
39
  end
38
40
  end
39
41
 
42
+ # Fuzzy Filter Match
43
+ unless raw_args.empty?
44
+ entries.select! do |entry|
45
+ # Create a pattern with the file and title
46
+ globby = [entry.header.downcase, entry.base.split(' ', 2).first].join(' ')
47
+
48
+ # Check any Matches
49
+ raw_args.any? { |x| globby.include? x }
50
+ end
51
+ end
52
+
40
53
  # Return output
41
54
  entries.each do |entry|
42
55
  query_string = flags[:verbose] ? entry.base : entry.base + " --stats=#{entry.stats}"
@@ -114,37 +114,43 @@ end
114
114
  br
115
115
  puts indent('Errors'.pastel(:cyan))
116
116
 
117
- query 'gitlab-rails/production_json.log --status=500' do |data|
117
+ query_if_exists 'gitlab-rails/production_json.log --status=500' do |data|
118
118
  color = data.count.zero? ? :green : :red
119
119
  indent("#{ljust('Production:', 14, :magenta)} #{data.count.to_s.pastel(color)}", 4)
120
120
  end
121
121
 
122
- query 'gitlab-rails/application_json.log --message!="Cannot obtain an exclusive lease" --severity=error' do |data|
122
+ app_query = 'gitlab-rails/application_json.log --message!="Cannot obtain an exclusive lease" --severity=error'
123
+ query_if_exists app_query do |data|
123
124
  color = data.count.zero? ? :green : :red
124
125
  indent("#{ljust('Application:', 14, :magenta)} #{data.count.to_s.pastel(color)}", 4)
125
126
  end
126
127
 
127
- query 'sidekiq/current --severity=error' do |data|
128
+ query_if_exists 'sidekiq/current --severity=error' do |data|
128
129
  color = data.count.zero? ? :green : :red
129
130
  indent("#{ljust('Sidekiq:', 14, :magenta)} #{data.count.to_s.pastel(color)}", 4)
130
131
  end
131
132
 
132
- query 'gitlab-rails/api_json.log --status=500' do |data|
133
+ query_if_exists 'gitlab-rails/api_json.log --status=500' do |data|
133
134
  color = data.count.zero? ? :green : :red
134
135
  indent("#{ljust('API:', 14, :magenta)} #{data.count.to_s.pastel(color)}", 4)
135
136
  end
136
137
 
137
- query 'gitaly/current --level=error' do |data|
138
+ query_if_exists 'gitaly/current --level=error' do |data|
138
139
  color = data.count.zero? ? :green : :red
139
140
  indent("#{ljust('Gitaly:', 14, :magenta)} #{data.count.to_s.pastel(color)}", 4)
140
141
  end
141
142
 
142
- query 'gitlab-workhorse/current --level=error' do |data|
143
+ query_if_exists 'gitlab-workhorse/current --level=error' do |data|
143
144
  color = data.count.zero? ? :green : :red
144
145
  indent("#{ljust('Workhorse:', 14, :magenta)} #{data.count.to_s.pastel(color)}", 4)
145
146
  end
146
147
 
147
- query 'gitlab-rails/exceptions_json.log' do |data|
148
+ query_if_exists 'gitlab-rails/exceptions_json.log' do |data|
148
149
  color = data.count.zero? ? :green : :red
149
150
  indent("#{ljust('Exceptions:', 14, :magenta)} #{data.count.to_s.pastel(color)}", 4)
150
151
  end
152
+
153
+ query_if_exists('praefect/current --level=error') do |data|
154
+ color = data.count.zero? ? :green : :red
155
+ indent("#{ljust('Praefect:', 14, :magenta)} #{data.count.to_s.pastel(color)}", 4)
156
+ end
@@ -0,0 +1,14 @@
1
+ quiet!
2
+ archive_header
3
+
4
+ fields = %w[
5
+ duration_ms
6
+ time_ms
7
+ grpc.time_ms
8
+ command.cpu_time_ms
9
+ command.real_time_ms
10
+ command.system_time_ms
11
+ command.user_time_ms
12
+ ]
13
+
14
+ query_format "gitaly/current --percentile --slice=#{fields.join(',')} --round"
@@ -0,0 +1,21 @@
1
+ quiet!
2
+ archive_header
3
+
4
+ fields = %w[
5
+ duration_s
6
+ cpu_s
7
+ db_duration_s
8
+ gitaly_duration_s
9
+ redis_duration_s
10
+ target_duration_s
11
+ view_duration_s
12
+ db_main_duration_s
13
+ db_main_replica_duration_s
14
+ db_primary_duration_s
15
+ db_replica_duration_s
16
+ external_http_duration_s
17
+ redis_cache_duration_s
18
+ redis_shared_state_duration_s
19
+ ]
20
+
21
+ query_format "production_json.log --percentile --slice=#{fields.join(',')} --round"
@@ -0,0 +1,15 @@
1
+ quiet!
2
+ archive_header
3
+
4
+ fields = %w[
5
+ duration_s
6
+ db_duration_s
7
+ redis_duration_s
8
+ gitaly_duration_s
9
+ db_main_duration_s
10
+ db_replica_duration_s
11
+ redis_queues_duration_s
12
+ elasticsearch_duration_s
13
+ ]
14
+
15
+ query_format "sidekiq/current --percentile --slice=#{fields.join(',')} --round"
@@ -9,18 +9,19 @@ module GreenHat
9
9
 
10
10
  include InternalMethods
11
11
  include Shared
12
- attr_accessor :store, :archive, :flags, :args, :output
12
+ attr_accessor :store, :archive, :flags, :args, :raw_args, :output
13
13
 
14
14
  # Make Pry Easier
15
15
  def inspect
16
16
  "#<Runner archive: '#{archive}'>"
17
17
  end
18
18
 
19
- def initialize(archive:, store:, flags:, args:)
19
+ def initialize(archive:, store:, flags:, args:, raw_args:)
20
20
  self.store = store
21
21
  self.archive = archive
22
22
  self.flags = flags
23
23
  self.args = args
24
+ self.raw_args = raw_args
24
25
  self.output = []
25
26
 
26
27
  # Don't render paper new lines
@@ -31,6 +31,7 @@ module GreenHat
31
31
  def args_select(field)
32
32
  args.select { |x| x.field == field.to_sym }
33
33
  end
34
+
34
35
  # -=-=-=-=-=-
35
36
  end
36
37
  end
@@ -3,14 +3,15 @@ module GreenHat
3
3
  # Log Helpers
4
4
  module Reports
5
5
  # Make Running more consistent
6
- def self.run(file:, args:, flags:)
7
- report = GreenHat::Reports::Builder.new(file: file, args: args, flags: flags)
6
+ def self.run(file:, args:, flags:, raw_args:)
7
+ report = GreenHat::Reports::Builder.new(file: file, args: args, flags: flags, raw_args: raw_args)
8
8
  output = Archive.all.map do |archive|
9
9
  runner = GreenHat::Reports::Runner.new(
10
10
  archive: archive,
11
11
  store: report.store.clone,
12
12
  flags: flags,
13
- args: args
13
+ args: args,
14
+ raw_args: raw_args
14
15
  )
15
16
 
16
17
  runner.run!
@@ -12,12 +12,19 @@ module GreenHat
12
12
  end
13
13
 
14
14
  def self.open(url = 'http://localhost:4567/chart/time')
15
- cmd = if platform.linux? || platform.unix?
16
- 'xdg-open'
17
- elsif platform.mac?
15
+ cmd = if platform.mac?
18
16
  'open'
17
+ elsif platform.linux? || platform.unix?
18
+ 'xdg-open'
19
19
  end
20
20
 
21
+ # See if anything was detected -- ignore system call if nothing was
22
+ if cmd.nil?
23
+ puts "Unknown OS! #{RbConfig::CONFIG['arch']}"
24
+ puts url
25
+ return
26
+ end
27
+
21
28
  # platform.windows? # => false
22
29
  # platform.unix? # => true
23
30
  # platform.linux? # => false
@@ -47,7 +47,8 @@ module GreenHat
47
47
  run_list.uniq!
48
48
 
49
49
  run_list.each do |file|
50
- GreenHat::ShellHelper::Reports.run(file: file, args: args, flags: flags)
50
+ raw_args = list.reject { |x| file.include? x }
51
+ GreenHat::ShellHelper::Reports.run(file: file, args: args, flags: flags, raw_args: raw_args)
51
52
  end
52
53
  end
53
54
  end
@@ -331,6 +331,11 @@ module GreenHat
331
331
  @thing_list
332
332
  end
333
333
 
334
+ # Shortcut to see if any things exist
335
+ def self.any_things?(file_list, flags = {}, base_list = nil)
336
+ !find_things(file_list, flags, base_list).empty?
337
+ end
338
+
334
339
  # Shortcut find things
335
340
  def self.find_things(file_list, flags = {}, base_list = nil)
336
341
  base_list ||= Thing.all
@@ -24,6 +24,10 @@ module GreenHat
24
24
  Log.default(raw_list)
25
25
  end
26
26
 
27
+ def self.grep(raw_list = [])
28
+ Grep.grep(raw_list)
29
+ end
30
+
27
31
  def self.df
28
32
  Disk.df
29
33
  end
@@ -18,16 +18,10 @@ module GreenHat
18
18
  module FileTypes
19
19
  def types
20
20
  {
21
- 'ifconfig' => {
21
+ 'gitlab_rb' => {
22
22
  format: :raw,
23
23
  pattern: [
24
- /ifconfig/
25
- ]
26
- },
27
- 'ip_address' => {
28
- format: :raw,
29
- pattern: [
30
- /ip_address/
24
+ %r{gitlab/gitlab.rb}
31
25
  ]
32
26
  },
33
27
  'cpuinfo' => {
@@ -115,12 +109,6 @@ module GreenHat
115
109
  /getenforce/
116
110
  ]
117
111
  },
118
- 'gitlab.rb' => {
119
- format: :raw,
120
- pattern: [
121
- %r{gitlab/gitlab.rb}
122
- ]
123
- },
124
112
  'geo-logcursor/current' => {
125
113
  format: :raw,
126
114
  pattern: [
@@ -387,6 +375,18 @@ module GreenHat
387
375
  /hostname/
388
376
  ]
389
377
  },
378
+ 'ifconfig' => {
379
+ format: :raw,
380
+ pattern: [
381
+ /ifconfig/
382
+ ]
383
+ },
384
+ 'ip_address' => {
385
+ format: :raw,
386
+ pattern: [
387
+ /ip_address/
388
+ ]
389
+ },
390
390
  'lscpu' => {
391
391
  format: :colon_split_strip,
392
392
  pattern: [
@@ -539,6 +539,27 @@ module GreenHat
539
539
  /^ps/
540
540
  ]
541
541
  },
542
+ 'pressure_cpu.txt' => {
543
+ format: :raw,
544
+ log: false,
545
+ pattern: [
546
+ /pressure_cpu.txt/
547
+ ]
548
+ },
549
+ 'pressure_io.txt' => {
550
+ format: :raw,
551
+ log: false,
552
+ pattern: [
553
+ /pressure_io.txt/
554
+ ]
555
+ },
556
+ 'pressure_mem.txt' => {
557
+ format: :raw,
558
+ log: false,
559
+ pattern: [
560
+ /pressure_mem.txt/
561
+ ]
562
+ },
542
563
  'puma/puma_stderr.log' => {
543
564
  format: :raw,
544
565
  log: false,
@@ -547,6 +568,7 @@ module GreenHat
547
568
  %r{webservice.log/puma.stderr.log}
548
569
  ]
549
570
  },
571
+
550
572
  'puma/puma_stdout.log' => {
551
573
  format: :json,
552
574
  log: true,
@@ -725,12 +747,6 @@ module GreenHat
725
747
  %r{gitlab-rails/gitlab-rails-db-migrate.*}
726
748
  ]
727
749
  },
728
- 'rpm_verify' => {
729
- format: :raw,
730
- pattern: [
731
- /rpm_verify/
732
- ]
733
- },
734
750
  'tainted' => {
735
751
  format: :raw,
736
752
  pattern: [
@@ -856,18 +872,48 @@ module GreenHat
856
872
  /vmstat/
857
873
  ]
858
874
  },
875
+ 'gitlab-kas/config' => {
876
+ format: :raw,
877
+ pattern: [
878
+ %r{gitlab-kas/config}
879
+ ]
880
+ },
881
+ 'mailroom/config' => {
882
+ format: :raw,
883
+ pattern: [
884
+ %r{mailroom/config}
885
+ ]
886
+ },
859
887
  'iotop' => {
860
888
  format: :raw,
861
889
  pattern: [
862
890
  /iotop/
863
891
  ]
864
892
  },
893
+ 'top_res' => {
894
+ format: :raw,
895
+ pattern: [
896
+ /top_res/
897
+ ]
898
+ },
899
+ 'top_cpu' => {
900
+ format: :raw,
901
+ pattern: [
902
+ /top_cpu/
903
+ ]
904
+ },
865
905
  'ntpq' => {
866
906
  format: :raw,
867
907
  pattern: [
868
908
  /ntpq/
869
909
  ]
870
910
  },
911
+ 'rpm_verify' => {
912
+ format: :raw,
913
+ pattern: [
914
+ /rpm_verify/
915
+ ]
916
+ },
871
917
  'gitlab-rails/application.log' => {
872
918
  format: :raw,
873
919
  pattern: [
@@ -42,6 +42,23 @@ class Thing < Teron
42
42
  save!
43
43
  end
44
44
 
45
+ # Helper to make it easier to query through hashed / parsed objects
46
+ def hash_to_a_query
47
+ data.to_a.map { |x| x.join(': ') }
48
+ end
49
+
50
+ def grep(term)
51
+ selectable = if query?
52
+ data
53
+ elsif process?
54
+ hash_to_a_query
55
+ else
56
+ raw_full
57
+ end
58
+
59
+ selectable.select { |r| r.to_s.include?(term) }
60
+ end
61
+
45
62
  # Processor
46
63
  def data
47
64
  process unless parsed
@@ -91,7 +108,7 @@ class Thing < Teron
91
108
 
92
109
  # Things that can be queried (Query Helper)
93
110
  def query?
94
- data.instance_of?(Array)
111
+ data.instance_of?(Array) || data.instance_of?(Enumerator)
95
112
  end
96
113
 
97
114
  # Helper for all things that can be hash/value filtered
@@ -1,3 +1,3 @@
1
1
  module GreenHat
2
- VERSION = '0.6.3'.freeze
2
+ VERSION = '0.6.6'.freeze
3
3
  end
data/lib/greenhat.rb CHANGED
@@ -22,7 +22,7 @@ require 'tty-reader'
22
22
  require 'tty-spinner'
23
23
  require 'tty-table'
24
24
  require 'tty-which'
25
- require 'warning'
25
+ # require 'warning' # Ruby 3
26
26
  require 'ruby_native_statistics'
27
27
  require 'gitlab_chronic_duration'
28
28
 
@@ -79,4 +79,4 @@ require 'greenhat/tty/reader'
79
79
  require 'greenhat/tty/custom_line'
80
80
  require 'greenhat/tty/columns'
81
81
 
82
- Warning.ignore(/The table size exceeds the currently set width/)
82
+ # Warning.ignore(/The table size exceeds the currently set width/) # Ruby 3
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: greenhat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
4
+ version: 0.6.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Davin Walker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-01 00:00:00.000000000 Z
11
+ date: 2022-09-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: amazing_print
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '1.12'
89
+ version: '1.0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '1.12'
96
+ version: '1.0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: actionview
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -142,14 +142,14 @@ dependencies:
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: '1.5'
145
+ version: '1.6'
146
146
  type: :runtime
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: '1.5'
152
+ version: '1.6'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: dotenv
155
155
  requirement: !ruby/object:Gem::Requirement
@@ -234,6 +234,20 @@ dependencies:
234
234
  - - "~>"
235
235
  - !ruby/object:Gem::Version
236
236
  version: '0.14'
237
+ - !ruby/object:Gem::Dependency
238
+ name: puma
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - "~>"
242
+ - !ruby/object:Gem::Version
243
+ version: '5.6'
244
+ type: :runtime
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - "~>"
249
+ - !ruby/object:Gem::Version
250
+ version: '5.6'
237
251
  - !ruby/object:Gem::Dependency
238
252
  name: require_all
239
253
  requirement: !ruby/object:Gem::Requirement
@@ -276,6 +290,20 @@ dependencies:
276
290
  - - "~>"
277
291
  - !ruby/object:Gem::Version
278
292
  version: '1.6'
293
+ - !ruby/object:Gem::Dependency
294
+ name: sinatra
295
+ requirement: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - "~>"
298
+ - !ruby/object:Gem::Version
299
+ version: '2.2'
300
+ type: :runtime
301
+ prerelease: false
302
+ version_requirements: !ruby/object:Gem::Requirement
303
+ requirements:
304
+ - - "~>"
305
+ - !ruby/object:Gem::Version
306
+ version: '2.2'
279
307
  - !ruby/object:Gem::Dependency
280
308
  name: slim
281
309
  requirement: !ruby/object:Gem::Requirement
@@ -430,20 +458,6 @@ dependencies:
430
458
  - - "~>"
431
459
  - !ruby/object:Gem::Version
432
460
  version: '0.5'
433
- - !ruby/object:Gem::Dependency
434
- name: warning
435
- requirement: !ruby/object:Gem::Requirement
436
- requirements:
437
- - - "~>"
438
- - !ruby/object:Gem::Version
439
- version: '1.2'
440
- type: :runtime
441
- prerelease: false
442
- version_requirements: !ruby/object:Gem::Requirement
443
- requirements:
444
- - - "~>"
445
- - !ruby/object:Gem::Version
446
- version: '1.2'
447
461
  description: Experimental SOS and Log Parser for GitLab
448
462
  email:
449
463
  - dwalker@gitlab.com
@@ -457,6 +471,7 @@ files:
457
471
  - lib/greenhat.rb
458
472
  - lib/greenhat/accessors/disk.rb
459
473
  - lib/greenhat/accessors/gitlab.rb
474
+ - lib/greenhat/accessors/grep.rb
460
475
  - lib/greenhat/accessors/logs/production.rb
461
476
  - lib/greenhat/accessors/logs/sidekiq.rb
462
477
  - lib/greenhat/accessors/memory.rb
@@ -479,6 +494,9 @@ files:
479
494
  - lib/greenhat/reports/reports/faststats.rb
480
495
  - lib/greenhat/reports/reports/full.rb
481
496
  - lib/greenhat/reports/reports/full_markdown.rb
497
+ - lib/greenhat/reports/reports/gitaly_duration.rb
498
+ - lib/greenhat/reports/reports/production_log_duration.rb
499
+ - lib/greenhat/reports/reports/sidekiq_duration.rb
482
500
  - lib/greenhat/reports/runner.rb
483
501
  - lib/greenhat/reports/shared.rb
484
502
  - lib/greenhat/reports/shell_helper.rb
@@ -590,14 +608,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
590
608
  requirements:
591
609
  - - ">="
592
610
  - !ruby/object:Gem::Version
593
- version: 3.0.0
611
+ version: 2.7.5
594
612
  required_rubygems_version: !ruby/object:Gem::Requirement
595
613
  requirements:
596
614
  - - ">="
597
615
  - !ruby/object:Gem::Version
598
616
  version: '0'
599
617
  requirements: []
600
- rubygems_version: 3.2.32
618
+ rubygems_version: 3.1.6
601
619
  signing_key:
602
620
  specification_version: 4
603
621
  summary: GitLab SOS Tool