greenhat 0.2.0 → 0.3.3
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/disk.rb +13 -13
- data/lib/greenhat/accessors/gitlab.rb +75 -0
- data/lib/greenhat/accessors/memory.rb +10 -10
- data/lib/greenhat/accessors/process.rb +4 -0
- data/lib/greenhat/cli.rb +147 -58
- data/lib/greenhat/color.rb +27 -0
- data/lib/greenhat/logbot.rb +9 -9
- data/lib/greenhat/settings.rb +27 -7
- data/lib/greenhat/shell/args.rb +146 -0
- data/lib/greenhat/shell/cat.rb +25 -73
- data/lib/greenhat/shell/color_string.rb +8 -8
- data/lib/greenhat/shell/disk.rb +31 -4
- data/lib/greenhat/shell/faststats.rb +103 -56
- data/lib/greenhat/shell/field_helper.rb +75 -0
- data/lib/greenhat/shell/filter_help.rb +162 -0
- data/lib/greenhat/shell/gitlab.rb +61 -2
- data/lib/greenhat/shell/help.rb +98 -15
- data/lib/greenhat/shell/list.rb +46 -0
- data/lib/greenhat/shell/log.rb +118 -104
- data/lib/greenhat/shell/page.rb +11 -5
- data/lib/greenhat/shell/process.rb +29 -17
- data/lib/greenhat/shell/report.rb +37 -47
- data/lib/greenhat/shell/shell_helper.rb +661 -0
- data/lib/greenhat/shell.rb +23 -9
- data/lib/greenhat/thing/file_types.rb +31 -5
- data/lib/greenhat/thing/formatters/json_shellwords.rb +0 -3
- data/lib/greenhat/thing/formatters/nginx.rb +44 -0
- data/lib/greenhat/thing/helpers.rb +4 -4
- data/lib/greenhat/thing/kind.rb +9 -2
- data/lib/greenhat/thing/spinner.rb +3 -3
- data/lib/greenhat/thing.rb +25 -3
- data/lib/greenhat/tty/columns.rb +4 -0
- data/lib/greenhat/version.rb +1 -1
- data/lib/greenhat.rb +15 -14
- metadata +38 -18
- data/lib/greenhat/shell/filter.rb +0 -128
- data/lib/greenhat/shell/helper.rb +0 -584
@@ -0,0 +1,146 @@
|
|
1
|
+
module GreenHat
|
2
|
+
# Module for Argument Parsing
|
3
|
+
# Possible Args
|
4
|
+
# --value=thing
|
5
|
+
# --value / Default => --value=thing
|
6
|
+
# --flag
|
7
|
+
# --slice=value,value2
|
8
|
+
# files
|
9
|
+
|
10
|
+
# Variable Breakdown
|
11
|
+
# Args:Array supplied or default values for entry looping action
|
12
|
+
# Flags:Hash Key/Value filter Actionables
|
13
|
+
# Files:Array/String are any non start `-` dash entries
|
14
|
+
module Args
|
15
|
+
def self.parse(raw, skip_flags = [])
|
16
|
+
# Don't affect original object / Better deep clone?
|
17
|
+
cmd = raw.clone
|
18
|
+
# cmd = Marshal.load(Marshal.dump(raw))
|
19
|
+
|
20
|
+
# Extract Files
|
21
|
+
files = cmd.grep_v(/^-+([^=]+)/)
|
22
|
+
|
23
|
+
# Collect and Naturalize Arguments
|
24
|
+
args = cmd.flat_map { |arg| arg_scan(arg) }
|
25
|
+
|
26
|
+
# Collect all Flags to Hash
|
27
|
+
flags = cmd.flat_map { |flag| flag_scan(flag) }.to_h
|
28
|
+
|
29
|
+
# Move Flags to Args
|
30
|
+
arg_to_flag(flags, args)
|
31
|
+
|
32
|
+
# Logic
|
33
|
+
# And / Or
|
34
|
+
flag_defaults(flags, skip_flags)
|
35
|
+
|
36
|
+
[files, flags, args]
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.flag_defaults(flags, skip_flags)
|
40
|
+
# Update other user defaults
|
41
|
+
Settings.default_log_flags(flags, skip_flags)
|
42
|
+
|
43
|
+
# FastStats / Don't set default flags
|
44
|
+
return if skip_flags.include? :logic
|
45
|
+
|
46
|
+
# Default Logic
|
47
|
+
if flags.key?(:or)
|
48
|
+
flags.logic = :any?
|
49
|
+
flags.delete(:or)
|
50
|
+
else
|
51
|
+
flags.logic = :all?
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Move Valued Flags to arguments (--truncate=5)
|
56
|
+
def self.arg_to_flag(flags, args)
|
57
|
+
args.reject! do |arg|
|
58
|
+
# Entries specifically to move to Args
|
59
|
+
if arg_to_flag_list.include?(arg.field)
|
60
|
+
flags[arg.field] = arg.value
|
61
|
+
|
62
|
+
true
|
63
|
+
# Ignore Good Entries
|
64
|
+
else
|
65
|
+
false
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Flags Anything that isn't sent as a key/filter
|
71
|
+
def self.arg_to_flag_list
|
72
|
+
%i[
|
73
|
+
archive end except exists json limit pluck reverse round slice sort start
|
74
|
+
stats truncate uniq page time_zone table_style
|
75
|
+
]
|
76
|
+
end
|
77
|
+
|
78
|
+
# Arg Scan (Split -- values into keys)
|
79
|
+
def self.arg_scan(arg)
|
80
|
+
arg.scan(/^-+([^=]+)=(.*)/).map do |field, value|
|
81
|
+
bang = false
|
82
|
+
if field.include? '!'
|
83
|
+
field.delete!('!')
|
84
|
+
bang = true
|
85
|
+
end
|
86
|
+
|
87
|
+
# Symbolize
|
88
|
+
field = field.to_sym
|
89
|
+
|
90
|
+
{
|
91
|
+
field: field,
|
92
|
+
value: arg_normalize(field, value),
|
93
|
+
bang: bang
|
94
|
+
}
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# Collect All Flags
|
99
|
+
def self.flag_scan(arg)
|
100
|
+
arg.scan(/^-+([^=]+)$/).map do |field, _val|
|
101
|
+
# Symbolize
|
102
|
+
field = field.to_sym
|
103
|
+
|
104
|
+
[field, flag_arg_defaults(field)]
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# Naturlalize Values, Manipluate Special Values
|
109
|
+
def self.arg_normalize(field, value)
|
110
|
+
# Special Comma Params With Symbol
|
111
|
+
return value.split(',').map(&:to_sym) if arg_special_split.include?(field)
|
112
|
+
|
113
|
+
# Integer Arguments
|
114
|
+
return value.to_i if value.numeric?
|
115
|
+
|
116
|
+
# Other Field Manipulation
|
117
|
+
case field
|
118
|
+
when :page then value == 'true'
|
119
|
+
else
|
120
|
+
|
121
|
+
# Default Original
|
122
|
+
value
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
# Arguments that Accept multiple options / Comma Delimted
|
127
|
+
def self.arg_special_split
|
128
|
+
%i[
|
129
|
+
slice except uniq pluck sort archive stats exists
|
130
|
+
]
|
131
|
+
end
|
132
|
+
|
133
|
+
# Arg Defaults
|
134
|
+
def self.flag_arg_defaults(field)
|
135
|
+
case field
|
136
|
+
when :round then 2
|
137
|
+
when :limit then (TTY::Screen.height / 3) - 3
|
138
|
+
when :truncate then TTY::Screen.width * 4
|
139
|
+
# when :page, :case, :exact then :true # Override Specials
|
140
|
+
when *arg_special_split then []
|
141
|
+
else
|
142
|
+
true
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
data/lib/greenhat/shell/cat.rb
CHANGED
@@ -3,60 +3,38 @@ module GreenHat
|
|
3
3
|
module Shell
|
4
4
|
# Common File Reader File
|
5
5
|
module Cat
|
6
|
-
# rubocop:disable Metrics/MethodLength
|
7
6
|
def self.help
|
8
|
-
puts "\u2500".
|
9
|
-
puts "#{'Cat'.
|
10
|
-
puts "\u2500".
|
7
|
+
puts "\u2500".pastel(:cyan) * 20
|
8
|
+
puts "#{'Cat'.pastel(:yellow)} All the files"
|
9
|
+
puts "\u2500".pastel(:cyan) * 20
|
11
10
|
puts 'Print raw file by just entering the file name'
|
12
11
|
puts
|
13
12
|
|
14
|
-
|
15
|
-
puts ' --raw'.colorize(:green)
|
16
|
-
puts ' Do not use less/paging'
|
17
|
-
puts
|
18
|
-
puts ' --archive'.colorize(:green)
|
19
|
-
puts ' Limit to specific archvie name (inclusive). Matching SOS tar.gz name'
|
20
|
-
puts ' Ex: --archive=dev-gitlab_20210622154626, --archive=202106,202107'
|
21
|
-
puts ' cat mount --archive=dev-gitlab_202106221546'
|
22
|
-
puts
|
13
|
+
ShellHelper.common_opts
|
23
14
|
|
24
|
-
puts 'Commands'.
|
25
|
-
puts
|
26
|
-
puts ' List available files'
|
27
|
-
puts ' Options'
|
28
|
-
puts ' -a, --all, show all files including source'
|
29
|
-
puts
|
15
|
+
puts 'Commands'.pastel(:blue)
|
16
|
+
puts ShellHelper::List.help
|
30
17
|
|
31
|
-
puts '<file names+>'.
|
32
|
-
puts '
|
33
|
-
puts '
|
34
|
-
puts '
|
18
|
+
puts ' <file names+>'.pastel(:green)
|
19
|
+
puts ' Print any file names'
|
20
|
+
puts ' Ex: `free_m`'
|
21
|
+
puts ' Ex: `ps mount --raw`'
|
35
22
|
puts
|
36
23
|
|
37
|
-
puts "#{'show'.
|
38
|
-
puts '
|
39
|
-
puts '
|
40
|
-
|
41
|
-
puts '--archive'.colorize(:green)
|
42
|
-
puts ' Limit to specific archvie name (inclusive). Matching SOS tar.gz name'
|
43
|
-
puts ' Ex: --archive=dev-gitlab_20210622154626, --archive=202106,202107'
|
44
|
-
puts
|
24
|
+
puts " #{'show'.pastel(:green)} <file names>"
|
25
|
+
puts ' Attempt to print formatted output'
|
26
|
+
puts ' Ex: show `free_m`'
|
45
27
|
end
|
46
|
-
# rubocop:enable Metrics/MethodLength
|
47
28
|
|
48
29
|
# ========================================================================
|
49
30
|
# Default
|
50
31
|
# ========================================================================
|
51
|
-
def self.default(
|
32
|
+
def self.default(raw)
|
52
33
|
# Extract Args
|
53
|
-
|
54
|
-
|
55
|
-
# Prepare Log List
|
56
|
-
file_list = ShellHelper.prepare_list(file_list, Thing.all)
|
34
|
+
files_list, flags, _args = Args.parse(raw)
|
57
35
|
|
58
|
-
#
|
59
|
-
files = ShellHelper.
|
36
|
+
# Collect Files
|
37
|
+
files = ShellHelper.files(files_list, Thing.all, flags)
|
60
38
|
|
61
39
|
results = ShellHelper.file_process(files) do |file|
|
62
40
|
[
|
@@ -66,58 +44,32 @@ module GreenHat
|
|
66
44
|
]
|
67
45
|
end
|
68
46
|
|
69
|
-
ShellHelper.show(results.flatten,
|
47
|
+
ShellHelper.show(results.flatten, flags)
|
70
48
|
end
|
71
49
|
|
72
50
|
# ========================================================================
|
73
51
|
# Show Attempted Formatting
|
74
52
|
# ========================================================================
|
75
|
-
def self.show(
|
53
|
+
def self.show(raw)
|
76
54
|
# Extract Args
|
77
|
-
|
55
|
+
files_list, flags, _args = Args.parse(raw)
|
78
56
|
|
79
|
-
#
|
80
|
-
|
81
|
-
|
82
|
-
# Convert to Things
|
83
|
-
files = ShellHelper.find_things(file_list, args)
|
57
|
+
# Collect Files
|
58
|
+
files = ShellHelper.files(files_list, Thing.all, flags)
|
84
59
|
|
85
60
|
results = ShellHelper.file_process(files) do |file|
|
86
61
|
[
|
87
62
|
file.friendly_name,
|
88
|
-
file.
|
63
|
+
file.data,
|
89
64
|
"\n"
|
90
65
|
]
|
91
66
|
end
|
92
67
|
|
93
|
-
ShellHelper.show(results.flatten,
|
94
|
-
end
|
95
|
-
|
96
|
-
# List Files Helpers
|
97
|
-
def self.list(args = [])
|
98
|
-
all = false
|
99
|
-
all = true if args.include?('-a') || args.include?('--all')
|
100
|
-
|
101
|
-
files = Thing.all
|
102
|
-
|
103
|
-
# Sort
|
104
|
-
files.sort_by!(&:name)
|
105
|
-
|
106
|
-
# Short & Uniq
|
107
|
-
files.uniq!(&:name) unless all
|
108
|
-
|
109
|
-
# Print
|
110
|
-
files.each do |log|
|
111
|
-
if all
|
112
|
-
puts "- #{log.friendly_name}"
|
113
|
-
else
|
114
|
-
puts "- #{log.name.colorize(:yellow)}"
|
115
|
-
end
|
116
|
-
end
|
68
|
+
ShellHelper.show(results.flatten, flags)
|
117
69
|
end
|
118
70
|
|
119
71
|
def self.ls(args = [])
|
120
|
-
list(args)
|
72
|
+
ShellHelper::List.list(args, Thing.all)
|
121
73
|
end
|
122
74
|
# ------------------------------------------------------------------------
|
123
75
|
end
|
@@ -6,20 +6,20 @@ module GreenHat
|
|
6
6
|
LogBot.debug('Unknown Format', entry.class) if ENV['DEBUG'] && !entry.instance_of?(String)
|
7
7
|
|
8
8
|
# Other Helpful colorizers
|
9
|
-
if
|
10
|
-
|
9
|
+
if pastel?(key)
|
10
|
+
pastel(key, entry)
|
11
11
|
else
|
12
12
|
entry.to_s
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
# Add Color?
|
17
|
-
def self.
|
17
|
+
def self.pastel?(key)
|
18
18
|
[:severity].any? key
|
19
19
|
end
|
20
20
|
|
21
21
|
# General Key/Value Coloring
|
22
|
-
def self.
|
22
|
+
def self.pastel(key, value)
|
23
23
|
case key
|
24
24
|
when :severity then severity(value)
|
25
25
|
else
|
@@ -30,10 +30,10 @@ module GreenHat
|
|
30
30
|
|
31
31
|
def self.severity(value)
|
32
32
|
case value.to_s.downcase.to_sym
|
33
|
-
when :debug then value.
|
34
|
-
when :info then value.
|
35
|
-
when :warn then value.
|
36
|
-
when :fatal, :error then value.
|
33
|
+
when :debug then value.pastel(:blue)
|
34
|
+
when :info then value.pastel(:cyan)
|
35
|
+
when :warn then value.pastel(:yellow)
|
36
|
+
when :fatal, :error then value.pastel(:bright_red)
|
37
37
|
else
|
38
38
|
value.to_s
|
39
39
|
end
|
data/lib/greenhat/shell/disk.rb
CHANGED
@@ -8,15 +8,42 @@ module GreenHat
|
|
8
8
|
Cli.help
|
9
9
|
end
|
10
10
|
|
11
|
+
def self.help
|
12
|
+
puts "\u2500".pastel(:cyan) * 22
|
13
|
+
puts "#{'Disk'.pastel(:yellow)} - Storage Helper"
|
14
|
+
puts "\u2500".pastel(:cyan) * 22
|
15
|
+
|
16
|
+
ShellHelper.common_opts
|
17
|
+
|
18
|
+
puts 'Command Summary'.pastel(:blue)
|
19
|
+
puts ' df'.pastel(:green)
|
20
|
+
puts " Raw #{'df'.pastel(:cyan)} output"
|
21
|
+
puts
|
22
|
+
puts ' free'.pastel(:green)
|
23
|
+
puts ' Formatted / Bar Output'
|
24
|
+
puts
|
25
|
+
end
|
26
|
+
|
11
27
|
# Easy Show All
|
12
|
-
def self.df
|
13
|
-
|
28
|
+
def self.df(raw = {})
|
29
|
+
# Extract Args
|
30
|
+
files_list, flags, _args = Args.parse(raw)
|
31
|
+
|
32
|
+
# Collect Files
|
33
|
+
files = ShellHelper.files(files_list, GreenHat::Disk.df, flags)
|
34
|
+
|
35
|
+
# Output
|
36
|
+
ShellHelper.file_output(files, flags)
|
14
37
|
end
|
15
38
|
|
16
39
|
def self.free(raw = {})
|
17
|
-
|
40
|
+
# Extract Args
|
41
|
+
files_list, flags, _args = Args.parse(raw)
|
42
|
+
|
43
|
+
# Collect Files
|
44
|
+
files = ShellHelper.files(files_list, GreenHat::Disk.df, flags)
|
18
45
|
|
19
|
-
|
46
|
+
files.each do |file|
|
20
47
|
puts GreenHat::Disk.format_output(file, true)
|
21
48
|
|
22
49
|
# File End Loop / Break
|
@@ -5,52 +5,82 @@ module GreenHat
|
|
5
5
|
module Faststats
|
6
6
|
# rubocop:disable Metrics/MethodLength)
|
7
7
|
def self.help
|
8
|
-
puts "\u2500".
|
9
|
-
puts "Gimme #{'Performance Stats'.
|
10
|
-
puts "\u2500".
|
8
|
+
puts "\u2500".pastel(:cyan) * 25
|
9
|
+
puts "Gimme #{'Performance Stats'.pastel(:yellow)}"
|
10
|
+
puts "\u2500".pastel(:cyan) * 25
|
11
11
|
|
12
|
-
puts 'General'.
|
13
|
-
puts " Any double dash arguments (e.g. #{'--color-output'.
|
14
|
-
puts " See #{'`fast-stats --help`'.
|
12
|
+
puts 'General'.pastel(:blue)
|
13
|
+
puts " Any double dash arguments (e.g. #{'--color-output'.pastel(:green)}) are passed directly to fast-stats"
|
14
|
+
puts " See #{'`fast-stats --help`'.pastel(:bright_black)} for all available options"
|
15
15
|
puts
|
16
16
|
|
17
|
-
puts 'Common Options'.
|
18
|
-
puts ' --raw'.
|
17
|
+
puts 'Common Options'.pastel(:blue)
|
18
|
+
puts ' --raw'.pastel(:green)
|
19
19
|
puts ' Do not use less/paging'
|
20
|
-
puts ' --
|
21
|
-
puts '
|
22
|
-
puts ' --sort'.
|
20
|
+
puts ' --search'.pastel(:green)
|
21
|
+
puts ' Case-insensitive search of controller/method/worker field'
|
22
|
+
puts ' --sort'.pastel(:green)
|
23
23
|
puts ' count,fail,max,median,min,p95,p99,rps,score'
|
24
|
-
puts ' --limit'.
|
24
|
+
puts ' --limit'.pastel(:green)
|
25
25
|
puts ' The number of rows to print'
|
26
|
-
puts ' --verbose'.
|
26
|
+
puts ' --verbose'.pastel(:green)
|
27
27
|
puts ' Prints the component details of the maximum, P99, P95, and median events by total duration for each'
|
28
28
|
puts
|
29
29
|
|
30
|
-
puts 'Commands'.
|
31
|
-
puts 'ls'.
|
30
|
+
puts 'Commands'.pastel(:blue)
|
31
|
+
puts 'ls'.pastel(:green)
|
32
32
|
puts ' List available files'
|
33
33
|
puts ' Options'
|
34
34
|
puts ' -a, --all, show all files including source'
|
35
35
|
puts
|
36
36
|
|
37
|
-
puts '<file names+>'.
|
37
|
+
puts '<file names+>'.pastel(:green)
|
38
38
|
puts ' Print any file names'
|
39
39
|
puts ' Ex: `gitaly/current`'
|
40
40
|
puts ' Ex: `gitlab-rails/api_json.log gitlab-rails/production_json.log --raw`'
|
41
41
|
puts
|
42
42
|
|
43
|
-
puts 'top'.
|
43
|
+
puts 'top'.pastel(:green)
|
44
44
|
puts ' Print a summary of top items in a category'
|
45
45
|
puts
|
46
46
|
|
47
|
-
puts 'errors'.
|
47
|
+
puts 'errors'.pastel(:green)
|
48
48
|
puts ' Show summary of errors captured in log'
|
49
|
+
puts
|
50
|
+
|
51
|
+
puts 'Examples'.pastel(:blue)
|
52
|
+
puts ' Default'.pastel(:bright_white)
|
53
|
+
puts ' gitaly/current'
|
54
|
+
puts ' --raw gitlab-rails/production_json.log'
|
55
|
+
puts ' gitlab-rails/api_json.log --sort=count'
|
56
|
+
puts ' --search=pipeline sidekiq/current'
|
57
|
+
puts
|
58
|
+
|
59
|
+
puts ' Top'.pastel(:bright_white)
|
60
|
+
puts ' top gitaly/current'
|
61
|
+
puts ' top --limit=5 sidekiq/current'
|
62
|
+
puts
|
63
|
+
|
64
|
+
puts ' Errors'.pastel(:bright_white)
|
65
|
+
puts ' errors gitaly/current'
|
66
|
+
puts ' errors gitaly/current --no-border'
|
49
67
|
end
|
50
68
|
# rubocop:enable Metrics/MethodLength)
|
51
69
|
|
70
|
+
def self.faststats_installation
|
71
|
+
puts "#{'Unable to find'.pastel(:red)} #{'fast-stats'.pastel(:blue)}"
|
72
|
+
puts ' Release Downloads here'
|
73
|
+
puts ' - https://gitlab.com/gitlab-com/support/toolbox/fast-stats/-/releases'.pastel(:yellow)
|
74
|
+
puts ''
|
75
|
+
end
|
76
|
+
|
52
77
|
# List Files Helpers
|
53
78
|
def self.list(args = [])
|
79
|
+
unless TTY::Which.exist? 'fast-stats'
|
80
|
+
faststats_installation
|
81
|
+
return false
|
82
|
+
end
|
83
|
+
|
54
84
|
all = false
|
55
85
|
all = true if args.include?('-a') || args.include?('--all')
|
56
86
|
|
@@ -67,7 +97,7 @@ module GreenHat
|
|
67
97
|
if all
|
68
98
|
puts "- #{log.friendly_name}"
|
69
99
|
else
|
70
|
-
puts "- #{log.name.
|
100
|
+
puts "- #{log.name.pastel(:yellow)}"
|
71
101
|
end
|
72
102
|
end
|
73
103
|
end
|
@@ -77,18 +107,15 @@ module GreenHat
|
|
77
107
|
end
|
78
108
|
|
79
109
|
# Vanilla Fast Stats
|
80
|
-
def self.default(
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
cmd += args.keys.map { |arg| "--#{arg}" }.join(' ')
|
110
|
+
def self.default(raw, _other = nil)
|
111
|
+
unless TTY::Which.exist? 'fast-stats'
|
112
|
+
faststats_installation
|
113
|
+
return false
|
114
|
+
end
|
86
115
|
|
87
|
-
|
88
|
-
file_list = ShellHelper.prepare_list(file_list, ShellHelper::Faststats.things)
|
116
|
+
files, flags, cmd = ShellHelper::Faststats.parse(raw)
|
89
117
|
|
90
|
-
|
91
|
-
files = ShellHelper.find_things(file_list)
|
118
|
+
LogBot.debug('FastStats CMD', cmd) if ENV['DEBUG']
|
92
119
|
|
93
120
|
results = ShellHelper.file_process(files) do |file|
|
94
121
|
[
|
@@ -98,7 +125,7 @@ module GreenHat
|
|
98
125
|
]
|
99
126
|
end
|
100
127
|
|
101
|
-
ShellHelper.show(results.flatten,
|
128
|
+
ShellHelper.show(results.flatten, flags)
|
102
129
|
end
|
103
130
|
|
104
131
|
# ========================================================================
|
@@ -110,18 +137,15 @@ module GreenHat
|
|
110
137
|
# --limit=X
|
111
138
|
# --sort=count,fail,max,median,min,p95,p99,rps,score
|
112
139
|
# ========================================================================
|
113
|
-
def self.top(
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
cmd += args.keys.map { |arg| "--#{arg}" }.join(' ')
|
140
|
+
def self.top(raw)
|
141
|
+
unless TTY::Which.exist? 'fast-stats'
|
142
|
+
faststats_installation
|
143
|
+
return false
|
144
|
+
end
|
119
145
|
|
120
|
-
|
121
|
-
log_list = ShellHelper.prepare_list(log_list, ShellHelper::Faststats.things)
|
146
|
+
files, flags, cmd = ShellHelper::Faststats.parse(raw)
|
122
147
|
|
123
|
-
|
124
|
-
files = ShellHelper.find_things(log_list)
|
148
|
+
LogBot.debug('FastStats CMD', cmd) if ENV['DEBUG']
|
125
149
|
|
126
150
|
results = ShellHelper.file_process(files) do |file|
|
127
151
|
[
|
@@ -131,28 +155,22 @@ module GreenHat
|
|
131
155
|
]
|
132
156
|
end
|
133
157
|
|
134
|
-
ShellHelper.show(results.flatten,
|
158
|
+
ShellHelper.show(results.flatten, flags)
|
135
159
|
end
|
136
160
|
# ========================================================================
|
137
161
|
|
138
162
|
# ========================================================================
|
139
163
|
# ===== [ Fast Stats - Errors ] ====================
|
140
164
|
# ========================================================================
|
141
|
-
def self.errors(
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
args['color-output'] ||= true
|
147
|
-
|
148
|
-
cmd = opts.map { |opt| "--#{opt.field}=#{opt.value}" }.join(' ')
|
149
|
-
cmd += args.keys.map { |arg| "--#{arg}" }.join(' ')
|
150
|
-
|
151
|
-
# Prepare Log List
|
152
|
-
log_list = ShellHelper.prepare_list(log_list, ShellHelper::Faststats.things)
|
165
|
+
def self.errors(raw)
|
166
|
+
unless TTY::Which.exist? 'fast-stats'
|
167
|
+
faststats_installation
|
168
|
+
return false
|
169
|
+
end
|
153
170
|
|
154
|
-
#
|
155
|
-
|
171
|
+
# Add Color Output
|
172
|
+
raw.push '--color-output'
|
173
|
+
files, flags, cmd = ShellHelper::Faststats.parse(raw)
|
156
174
|
|
157
175
|
LogBot.debug('FastStats CMD', cmd) if ENV['DEBUG']
|
158
176
|
|
@@ -164,7 +182,7 @@ module GreenHat
|
|
164
182
|
]
|
165
183
|
end
|
166
184
|
|
167
|
-
ShellHelper.show(results.flatten,
|
185
|
+
ShellHelper.show(results.flatten, flags)
|
168
186
|
end
|
169
187
|
# ========================================================================
|
170
188
|
end
|
@@ -175,6 +193,35 @@ module GreenHat
|
|
175
193
|
module ShellHelper
|
176
194
|
# Hide from Commands
|
177
195
|
module Faststats
|
196
|
+
# Default Settings from arg parse that won't work
|
197
|
+
def self.invalid_settings
|
198
|
+
%i[page round truncate logic fuzzy_file_match]
|
199
|
+
end
|
200
|
+
|
201
|
+
def self.parse(raw)
|
202
|
+
file_list, flags, args = Args.parse(raw, invalid_settings)
|
203
|
+
cmd = args.map { |opt| "--#{opt.field}=#{opt.value}" }.join(' ')
|
204
|
+
cmd += flags.map do |flag, value|
|
205
|
+
# Don't Include Raw
|
206
|
+
next if flag == :raw
|
207
|
+
|
208
|
+
case value
|
209
|
+
when true then "--#{flag}"
|
210
|
+
when Array then "--#{flag}=#{value.join}"
|
211
|
+
else
|
212
|
+
"--#{flag}=#{value}"
|
213
|
+
end
|
214
|
+
end.join(' ')
|
215
|
+
|
216
|
+
# Prepare Log List
|
217
|
+
file_list = ShellHelper.prepare_list(file_list, ShellHelper::Faststats.things, flags)
|
218
|
+
|
219
|
+
# Convert to Things
|
220
|
+
files = ShellHelper.find_things(file_list)
|
221
|
+
|
222
|
+
[files, flags, cmd]
|
223
|
+
end
|
224
|
+
|
178
225
|
def self.files
|
179
226
|
%w[
|
180
227
|
production_json
|