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 +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
|