greenhat 0.2.0 → 0.3.0

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.
@@ -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
  ]