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 +4 -4
- data/lib/greenhat/accessors/grep.rb +66 -0
- data/lib/greenhat/reports/builder.rb +7 -2
- data/lib/greenhat/reports/helpers.rb +4 -0
- data/lib/greenhat/reports/internal_methods.rb +22 -0
- data/lib/greenhat/reports/reports/errors.rb +14 -1
- data/lib/greenhat/reports/reports/full.rb +13 -7
- data/lib/greenhat/reports/reports/gitaly_duration.rb +14 -0
- data/lib/greenhat/reports/reports/production_log_duration.rb +21 -0
- data/lib/greenhat/reports/reports/sidekiq_duration.rb +15 -0
- data/lib/greenhat/reports/runner.rb +3 -2
- data/lib/greenhat/reports/shared.rb +1 -0
- data/lib/greenhat/reports/shell_helper.rb +4 -3
- data/lib/greenhat/shell/platform.rb +10 -3
- data/lib/greenhat/shell/reports.rb +2 -1
- data/lib/greenhat/shell/shell_helper.rb +5 -0
- data/lib/greenhat/shell.rb +4 -0
- data/lib/greenhat/thing/file_types.rb +66 -20
- data/lib/greenhat/thing.rb +18 -1
- data/lib/greenhat/version.rb +1 -1
- data/lib/greenhat.rb +2 -2
- metadata +40 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d1d43c5b575df2757d624faaccf19b9474232d1fcdcfbc4ca5b9c7a59c8c0f0d
|
4
|
+
data.tar.gz: 3b3b17030206edca1b23533f1df6624a3c16e8e881c2460f84c78b4fcc0ccef4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
@@ -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.
|
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
|
-
|
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
|
data/lib/greenhat/shell.rb
CHANGED
@@ -18,16 +18,10 @@ module GreenHat
|
|
18
18
|
module FileTypes
|
19
19
|
def types
|
20
20
|
{
|
21
|
-
'
|
21
|
+
'gitlab_rb' => {
|
22
22
|
format: :raw,
|
23
23
|
pattern: [
|
24
|
-
/
|
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: [
|
data/lib/greenhat/thing.rb
CHANGED
@@ -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
|
data/lib/greenhat/version.rb
CHANGED
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.
|
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-
|
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.
|
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.
|
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.
|
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.
|
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:
|
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.
|
618
|
+
rubygems_version: 3.1.6
|
601
619
|
signing_key:
|
602
620
|
specification_version: 4
|
603
621
|
summary: GitLab SOS Tool
|