greenhat 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
- ShellHelper.file_output GreenHat::Disk.df
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
- _log_list, _1opts, args = ShellHelper.param_parse(raw)
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
- GreenHat::Disk.df(args).each do |file|
46
+ files.each do |file|
20
47
  puts GreenHat::Disk.format_output(file, true)
21
48
 
22
49
  # File End Loop / Break
@@ -5,47 +5,65 @@ module GreenHat
5
5
  module Faststats
6
6
  # rubocop:disable Metrics/MethodLength)
7
7
  def self.help
8
- puts "\u2500".colorize(:cyan) * 25
9
- puts "Gimme #{'Performance Stats'.colorize(:yellow)}"
10
- puts "\u2500".colorize(:cyan) * 25
8
+ puts "\u2500".pastel(:cyan) * 25
9
+ puts "Gimme #{'Performance Stats'.pastel(:yellow)}"
10
+ puts "\u2500".pastel(:cyan) * 25
11
11
 
12
- puts 'General'.colorize(:blue)
13
- puts " Any double dash arguments (e.g. #{'--color-output'.colorize(:green)}) are passed directly to fast-stats"
14
- puts " See #{'`fast-stats --help`'.colorize(:light_black)} for all available options"
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'.colorize(:blue)
18
- puts ' --raw'.colorize(:green)
17
+ puts 'Common Options'.pastel(:blue)
18
+ puts ' --raw'.pastel(:green)
19
19
  puts ' Do not use less/paging'
20
- puts ' --display'.colorize(:green)
21
- puts ' Show percentage of totals and/or actual durations (value, perc, both, default: both)'
22
- puts ' --sort'.colorize(:green)
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'.colorize(:green)
24
+ puts ' --limit'.pastel(:green)
25
25
  puts ' The number of rows to print'
26
- puts ' --verbose'.colorize(:green)
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'.colorize(:blue)
31
- puts 'ls'.colorize(:green)
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+>'.colorize(:green)
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'.colorize(:green)
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'.colorize(:green)
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
 
@@ -67,7 +85,7 @@ module GreenHat
67
85
  if all
68
86
  puts "- #{log.friendly_name}"
69
87
  else
70
- puts "- #{log.name.colorize(:yellow)}"
88
+ puts "- #{log.name.pastel(:yellow)}"
71
89
  end
72
90
  end
73
91
  end
@@ -77,18 +95,10 @@ module GreenHat
77
95
  end
78
96
 
79
97
  # Vanilla Fast Stats
80
- def self.default(file_list, _other = nil)
81
- # Extract Args
82
- file_list, opts, args = ShellHelper.param_parse(file_list)
83
-
84
- cmd = opts.map { |opt| "--#{opt.field}=#{opt.value}" }.join(' ')
85
- cmd += args.keys.map { |arg| "--#{arg}" }.join(' ')
98
+ def self.default(raw, _other = nil)
99
+ files, flags, cmd = ShellHelper::Faststats.parse(raw)
86
100
 
87
- # Prepare List
88
- file_list = ShellHelper.prepare_list(file_list, ShellHelper::Faststats.things)
89
-
90
- # Convert to Things
91
- files = ShellHelper.find_things(file_list)
101
+ LogBot.debug('FastStats CMD', cmd) if ENV['DEBUG']
92
102
 
93
103
  results = ShellHelper.file_process(files) do |file|
94
104
  [
@@ -98,7 +108,7 @@ module GreenHat
98
108
  ]
99
109
  end
100
110
 
101
- ShellHelper.show(results.flatten, args)
111
+ ShellHelper.show(results.flatten, flags)
102
112
  end
103
113
 
104
114
  # ========================================================================
@@ -110,18 +120,10 @@ module GreenHat
110
120
  # --limit=X
111
121
  # --sort=count,fail,max,median,min,p95,p99,rps,score
112
122
  # ========================================================================
113
- def self.top(log_list)
114
- # Extract Args, No Round / Truncate for Fast Stats
115
- log_list, opts, args = ShellHelper.param_parse(log_list, %i[page round truncate])
116
-
117
- cmd = opts.map { |opt| "--#{opt.field}=#{opt.value}" }.join(' ')
118
- cmd += args.keys.map { |arg| "--#{arg}" }.join(' ')
119
-
120
- # Prepare Log List
121
- log_list = ShellHelper.prepare_list(log_list, ShellHelper::Faststats.things)
123
+ def self.top(raw)
124
+ files, flags, cmd = ShellHelper::Faststats.parse(raw)
122
125
 
123
- # Convert to Things
124
- files = ShellHelper.find_things(log_list)
126
+ LogBot.debug('FastStats CMD', cmd) if ENV['DEBUG']
125
127
 
126
128
  results = ShellHelper.file_process(files) do |file|
127
129
  [
@@ -131,28 +133,17 @@ module GreenHat
131
133
  ]
132
134
  end
133
135
 
134
- ShellHelper.show(results.flatten, args)
136
+ ShellHelper.show(results.flatten, flags)
135
137
  end
136
138
  # ========================================================================
137
139
 
138
140
  # ========================================================================
139
141
  # ===== [ Fast Stats - Errors ] ====================
140
142
  # ========================================================================
141
- def self.errors(log_list)
142
- # Extract Args, No Round / Truncate for Fast Stats
143
- log_list, opts, args = ShellHelper.param_parse(log_list, %i[page round truncate])
144
-
145
- # Default to color output
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)
153
-
154
- # Convert to Things
155
- files = ShellHelper.find_things(log_list)
143
+ def self.errors(raw)
144
+ # Add Color Output
145
+ raw.push '--color-output'
146
+ files, flags, cmd = ShellHelper::Faststats.parse(raw)
156
147
 
157
148
  LogBot.debug('FastStats CMD', cmd) if ENV['DEBUG']
158
149
 
@@ -164,7 +155,7 @@ module GreenHat
164
155
  ]
165
156
  end
166
157
 
167
- ShellHelper.show(results.flatten, args)
158
+ ShellHelper.show(results.flatten, flags)
168
159
  end
169
160
  # ========================================================================
170
161
  end
@@ -175,6 +166,35 @@ module GreenHat
175
166
  module ShellHelper
176
167
  # Hide from Commands
177
168
  module Faststats
169
+ # Default Settings from arg parse that won't work
170
+ def self.invalid_settings
171
+ %i[page round truncate logic fuzzy_file_match]
172
+ end
173
+
174
+ def self.parse(raw)
175
+ file_list, flags, args = Args.parse(raw, invalid_settings)
176
+ cmd = args.map { |opt| "--#{opt.field}=#{opt.value}" }.join(' ')
177
+ cmd += flags.map do |flag, value|
178
+ # Don't Include Raw
179
+ next if flag == :raw
180
+
181
+ case value
182
+ when true then "--#{flag}"
183
+ when Array then "--#{flag}=#{value.join}"
184
+ else
185
+ "--#{flag}=#{value}"
186
+ end
187
+ end.join(' ')
188
+
189
+ # Prepare Log List
190
+ file_list = ShellHelper.prepare_list(file_list, ShellHelper::Faststats.things, flags)
191
+
192
+ # Convert to Things
193
+ files = ShellHelper.find_things(file_list)
194
+
195
+ [files, flags, cmd]
196
+ end
197
+
178
198
  def self.files
179
199
  %w[
180
200
  production_json
@@ -5,118 +5,133 @@ module GreenHat
5
5
  module Filter
6
6
  # rubocop:disable Metrics/MethodLength
7
7
  def self.help
8
- puts "\u2500".colorize(:cyan) * 20
9
- puts 'Filter'.colorize(:yellow)
10
- puts "\u2500".colorize(:cyan) * 20
8
+ puts "\u2500".pastel(:cyan) * 20
9
+ puts 'Filter'.pastel(:yellow)
10
+ puts "\u2500".pastel(:cyan) * 20
11
11
 
12
- puts 'Options'.colorize(:blue)
13
- puts '--raw'.colorize(:green)
12
+ puts 'Options'.pastel(:blue)
13
+ puts '--raw'.pastel(:green)
14
14
  puts ' Do not use less/paging'
15
15
  puts
16
16
 
17
- puts '--page'.colorize(:green)
17
+ puts '--page'.pastel(:green)
18
18
  puts ' Specifically enable or disable paging'
19
19
  puts ' E.g. --page (default to true), --page=true, --page=false'
20
20
  puts
21
21
 
22
- puts '--round'.colorize(:green)
22
+ puts '--round'.pastel(:green)
23
23
  puts ' Attempt to round all integers. Default: 2.'
24
24
  puts ' E.g. --round, --round=3, --round=0'
25
25
  puts
26
26
 
27
- puts '--truncate'.colorize(:green)
28
- puts ' Limit output values. Defaults to 4 lines. 0 to disable'
29
- puts ' E.g. --truncate=100 or --truncate=0'
27
+ puts '--limit'.pastel(:green)
28
+ puts ' Limit total output lines. Disabled by default. Default without value is based on screen height'
29
+ puts ' E.g. --limit, --limit=5'
30
30
  puts
31
31
 
32
- puts '--json'.colorize(:green)
32
+ puts '--json'.pastel(:green)
33
33
  puts ' Print output back into JSON'
34
34
  puts
35
35
 
36
- puts '--or'.colorize(:green)
37
- puts ' Filters will use OR instead of AND'
36
+ puts '--or'.pastel(:green)
37
+ puts ' Filters will use OR instead of AND (all match vs any match)'
38
38
  puts
39
39
 
40
- puts '--total'.colorize(:green)
40
+ puts '--total'.pastel(:green)
41
41
  puts ' Print only total count of matching entries'
42
42
  puts
43
43
 
44
- puts '--slice'.colorize(:green)
44
+ puts '--slice'.pastel(:green)
45
45
  puts ' Extract specific fields from entries (slice multiple with comma)'
46
46
  puts ' Ex: --slice=path or --slice=path,params'
47
47
  puts
48
48
 
49
- puts '--except'.colorize(:green)
49
+ puts '--except'.pastel(:green)
50
50
  puts ' Exclude specific fields (except multiple with comma)'
51
51
  puts ' Ex: --except=params --except=params,path'
52
52
  puts
53
53
 
54
- puts '--stats'.colorize(:green)
54
+ puts '--exists'.pastel(:green)
55
+ puts ' Ensure field exists regardless of contents'
56
+ puts ' Ex: --exists=params --exists=params,path'
57
+ puts
58
+
59
+ puts '--stats'.pastel(:green)
55
60
  puts ' Order/Count occurrances by field'
56
61
  puts ' Ex: --stats=params --except=params,path'
57
62
  puts
58
63
 
59
- puts '--uniq'.colorize(:green)
64
+ puts '--uniq'.pastel(:green)
60
65
  puts ' Show unique values only'
61
66
  puts ' Ex: --uniq=params --uniq=params,path'
62
67
  puts
63
68
 
64
- puts '--pluck'.colorize(:green)
69
+ puts '--pluck'.pastel(:green)
65
70
  puts ' Extract values from entries'
66
71
  puts ' Ex: --pluck=params --pluck=params,path'
67
72
  puts
68
73
 
69
- puts '--archive'.colorize(:green)
70
- puts ' Limit to specific archvie name (inclusive). Matching SOS tar.gz name'
74
+ puts '--archive'.pastel(:green)
75
+ puts ' Limit to specific archvie name (partial matching /inclusive). Matching SOS tar.gz name'
71
76
  puts ' Ex: --archive=dev-gitlab_20210622154626, --archive=202106,202107'
72
77
  puts
73
78
 
74
- puts '--sort'.colorize(:green)
79
+ puts '--sort'.pastel(:green)
75
80
  puts ' Sort by multiple fields'
76
81
  puts ' Ex: --sort=duration_s,db_duration_s'
77
82
  puts
78
83
 
79
- puts '--reverse'.colorize(:green)
84
+ puts '--reverse'.pastel(:green)
80
85
  puts ' Reverse all results'
81
86
  puts ' Ex: --reverse'
82
87
  puts
83
88
 
84
- puts '--combine'.colorize(:green)
89
+ puts '--combine'.pastel(:green)
85
90
  puts ' Omit archive identifier dividers. Useful with sort or time filters'
86
91
  puts ' Ex: --combine'
87
92
  puts
88
93
 
89
- puts '--start'.colorize(:green)
94
+ puts '--case'.pastel(:green)
95
+ puts ' Exact case match. Defaults to case insensitive'
96
+ puts ' Ex: --case; --name=Jon, --name=jane --case'
97
+ puts
98
+
99
+ puts '--exact'.pastel(:green)
100
+ puts ' Exact parameter/value match. Defaults to partial match'
101
+ puts ' Ex: --field=CommonPartial --exact'
102
+ puts
103
+
104
+ puts '--start'.pastel(:green)
90
105
  puts ' Show events after specified time. Filtered by the `time` field'
91
106
  puts ' Use with `--end` for between selections'
92
107
  puts ' Ex: log filter --start="2021-06-22 14:44 UTC" --end="2021-06-22 14:45 UTC"'
93
108
  puts
94
109
 
95
- puts '--end'.colorize(:green)
110
+ puts '--end'.pastel(:green)
96
111
  puts ' Show events before specified time. Filtered by the `time` field'
97
112
  puts ' Use with `--start` for between selections'
98
113
  puts ' Ex: log filter --end="2021-06-22"'
99
114
  puts
100
115
 
101
- puts '--truncate'.colorize(:green)
116
+ puts '--truncate'.pastel(:green)
102
117
  puts ' Truncate field length. On by default (4 rows). Performance issues!'
103
- puts ' Disable with --truncate=0'.colorize(:light_red)
118
+ puts ' Disable with --truncate=0'.pastel(:bright_red)
104
119
  puts ' Ex: --truncate=200, --truncate=2048"'
105
120
  puts
106
121
 
107
- puts 'Field Searching'.colorize(:blue)
122
+ puts 'Field Searching'.pastel(:blue)
108
123
  puts ' --[key]=[value]'
109
124
  puts ' Search in key for value'
110
125
  puts ' Example: --path=mirror/pull'
111
126
  puts
112
127
 
113
- puts 'Search specific logs'.colorize(:blue)
128
+ puts 'Search specific logs'.pastel(:blue)
114
129
  puts ' Any non dash parameters will be the log list to search from'
115
- puts " Ex: log filter --path=api sidekiq/current (hint: use `#{'ls'.colorize(:yellow)}` for log names"
130
+ puts " Ex: log filter --path=api sidekiq/current (hint: use `#{'ls'.pastel(:yellow)}` for log names"
116
131
  puts
117
132
 
118
- puts 'Example Queries'.colorize(:blue)
119
- puts " Also see #{'examples'.colorize(:light_blue)} for even more examples"
133
+ puts 'Example Queries'.pastel(:blue)
134
+ puts " Also see #{'examples'.pastel(:bright_blue)} for even more examples"
120
135
  puts ' log filter --class=BuildFinishedWorker sidekiq/current --slice=time,message'
121
136
  puts ' log filter gitlab-rails/api_json.log --slice=ua --uniq=ua --ua=gitlab-runner'
122
137
 
@@ -3,16 +3,75 @@ module GreenHat
3
3
  module Shell
4
4
  # Logs
5
5
  module Gitlab
6
+ def self.ls
7
+ help
8
+ end
9
+
10
+ def self.help
11
+ puts "\u2500".pastel(:cyan) * 20
12
+ puts "#{'GitLab'.pastel(:yellow)} - Tanuki power"
13
+ puts "\u2500".pastel(:cyan) * 20
14
+
15
+ puts 'Command Summary'.pastel(:blue)
16
+
17
+ puts ' services'.pastel(:green)
18
+ puts ' Show services status and version'
19
+ puts
20
+
21
+ puts ' status'.pastel(:green)
22
+ puts ' Show gitlab-ctl status'
23
+ puts
24
+
25
+ puts ' architecture'.pastel(:green)
26
+ puts ' Show node responsibility. E.g. Webservice, Gitaly, and etc'
27
+ puts
28
+
29
+ puts ' version'.pastel(:green)
30
+ puts ' Show GitLab software version'
31
+ puts
32
+ end
33
+
34
+ def self.architecture
35
+ results = Archive.all.map { |x| GitLab.identify_node(x) }
36
+
37
+ GitLab.node_types.each do |entry|
38
+ list = results.select { |x| (x.services & entry.pattern).any? }.map(&:host).join(', ')
39
+ next if list.blank?
40
+
41
+ puts entry.name.pastel(:bright_green)
42
+ puts list
43
+ puts
44
+ end
45
+ end
46
+
6
47
  def self.version
7
48
  Thing.where(type: 'gitlab/version-manifest.json').each do |file|
8
49
  next unless file.data
9
50
 
10
51
  puts file.friendly_name
11
- puts Semantic::Version.new(file.data.build_version).to_s.colorize(:yellow)
52
+ puts Semantic::Version.new(file.data.build_version).to_s.pastel(:yellow)
12
53
  puts
13
54
  end
14
55
  end
15
56
 
57
+ # Print service info / shared report method
58
+ def self.services(raw = {})
59
+ _files, flags, _args = Args.parse(raw, [:truncate])
60
+
61
+ results = {}
62
+
63
+ Archive.all.each do |archive|
64
+ result = GitLab.services(archive)
65
+ next unless result
66
+
67
+ # Generated Output
68
+ results[archive.friendly_name.pastel(:blue)] = result
69
+ end
70
+
71
+ # Print
72
+ ShellHelper.show(results, flags)
73
+ end
74
+
16
75
  def self.status
17
76
  Thing.where(type: 'gitlab_status').each do |file|
18
77
  next unless file.data
@@ -27,7 +86,7 @@ module GreenHat
27
86
 
28
87
  [
29
88
  "#{service.status}:",
30
- service.name.ljust(pad).colorize(color),
89
+ service.name.ljust(pad).pastel(color),
31
90
  "#{service.pid_uptime};".ljust(pad)
32
91
 
33
92
  ]