greenhat 0.6.3 → 0.6.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 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