greenhat 0.1.5 → 0.3.2
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 +58 -2
- data/lib/greenhat/accessors/gitlab.rb +75 -0
- data/lib/greenhat/accessors/memory.rb +10 -10
- data/lib/greenhat/accessors/process.rb +10 -1
- data/lib/greenhat/cli.rb +148 -63
- data/lib/greenhat/color.rb +27 -0
- data/lib/greenhat/logbot.rb +9 -9
- data/lib/greenhat/settings.rb +51 -3
- data/lib/greenhat/shell/args.rb +146 -0
- data/lib/greenhat/shell/cat.rb +25 -73
- data/lib/greenhat/shell/color_string.rb +43 -0
- data/lib/greenhat/shell/disk.rb +30 -42
- data/lib/greenhat/shell/faststats.rb +104 -58
- 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 +115 -209
- data/lib/greenhat/shell/page.rb +39 -0
- data/lib/greenhat/shell/process.rb +57 -2
- data/lib/greenhat/shell/report.rb +70 -60
- data/lib/greenhat/shell/shell_helper.rb +654 -0
- data/lib/greenhat/shell.rb +27 -13
- data/lib/greenhat/thing/file_types.rb +54 -7
- data/lib/greenhat/thing/formatters/json_shellwords.rb +0 -3
- data/lib/greenhat/thing/formatters/nginx.rb +44 -0
- data/lib/greenhat/thing/formatters/syslog.rb +39 -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 +44 -0
- data/lib/greenhat/version.rb +1 -1
- data/lib/greenhat.rb +16 -14
- metadata +42 -17
- data/lib/greenhat/shell/helper.rb +0 -541
@@ -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
|
-
|
110
|
+
def self.default(raw, _other = nil)
|
111
|
+
unless TTY::Which.exist? 'fast-stats'
|
112
|
+
faststats_installation
|
113
|
+
return false
|
114
|
+
end
|
83
115
|
|
84
|
-
cmd =
|
85
|
-
cmd += args.keys.map { |arg| "--#{arg}" }.join(' ')
|
116
|
+
files, flags, cmd = ShellHelper::Faststats.parse(raw)
|
86
117
|
|
87
|
-
|
88
|
-
file_list = ShellHelper.prepare_list(file_list, ShellHelper::Faststats.things)
|
89
|
-
|
90
|
-
# Convert to Things
|
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,21 +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
|
-
args['color-output'] ||= true
|
119
|
-
|
120
|
-
cmd = opts.map { |opt| "--#{opt.field}=#{opt.value}" }.join(' ')
|
121
|
-
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
|
122
145
|
|
123
|
-
|
124
|
-
log_list = ShellHelper.prepare_list(log_list, ShellHelper::Faststats.things)
|
146
|
+
files, flags, cmd = ShellHelper::Faststats.parse(raw)
|
125
147
|
|
126
|
-
|
127
|
-
files = ShellHelper.find_things(log_list)
|
148
|
+
LogBot.debug('FastStats CMD', cmd) if ENV['DEBUG']
|
128
149
|
|
129
150
|
results = ShellHelper.file_process(files) do |file|
|
130
151
|
[
|
@@ -134,28 +155,24 @@ module GreenHat
|
|
134
155
|
]
|
135
156
|
end
|
136
157
|
|
137
|
-
ShellHelper.show(results.flatten,
|
158
|
+
ShellHelper.show(results.flatten, flags)
|
138
159
|
end
|
139
160
|
# ========================================================================
|
140
161
|
|
141
162
|
# ========================================================================
|
142
163
|
# ===== [ Fast Stats - Errors ] ====================
|
143
164
|
# ========================================================================
|
144
|
-
def self.errors(
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
args['color-output'] ||= true
|
165
|
+
def self.errors(raw)
|
166
|
+
unless TTY::Which.exist? 'fast-stats'
|
167
|
+
faststats_installation
|
168
|
+
return false
|
169
|
+
end
|
150
170
|
|
151
|
-
|
152
|
-
|
171
|
+
# Add Color Output
|
172
|
+
raw.push '--color-output'
|
173
|
+
files, flags, cmd = ShellHelper::Faststats.parse(raw)
|
153
174
|
|
154
|
-
|
155
|
-
log_list = ShellHelper.prepare_list(log_list, ShellHelper::Faststats.things)
|
156
|
-
|
157
|
-
# Convert to Things
|
158
|
-
files = ShellHelper.find_things(log_list)
|
175
|
+
LogBot.debug('FastStats CMD', cmd) if ENV['DEBUG']
|
159
176
|
|
160
177
|
results = ShellHelper.file_process(files) do |file|
|
161
178
|
[
|
@@ -165,7 +182,7 @@ module GreenHat
|
|
165
182
|
]
|
166
183
|
end
|
167
184
|
|
168
|
-
ShellHelper.show(results.flatten,
|
185
|
+
ShellHelper.show(results.flatten, flags)
|
169
186
|
end
|
170
187
|
# ========================================================================
|
171
188
|
end
|
@@ -176,6 +193,35 @@ module GreenHat
|
|
176
193
|
module ShellHelper
|
177
194
|
# Hide from Commands
|
178
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
|
+
|
179
225
|
def self.files
|
180
226
|
%w[
|
181
227
|
production_json
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module GreenHat
|
2
|
+
# Common Helpers
|
3
|
+
module FieldHelper
|
4
|
+
def self.fields_find(files, word, flags = {})
|
5
|
+
fields = ShellHelper.find_things(files, flags).map(&:fields).flatten.uniq
|
6
|
+
|
7
|
+
if word.blank?
|
8
|
+
puts 'Possible Fields:'.pastel(:bright_blue)
|
9
|
+
puts ShellHelper.field_table(fields)
|
10
|
+
|
11
|
+
return [] # Empty Result
|
12
|
+
end
|
13
|
+
|
14
|
+
list_select(fields, word)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.list_select(list, word)
|
18
|
+
list.select! { |x| x[/^#{Regexp.escape(word)}/] }
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.filter_flags(word)
|
22
|
+
if word.blank?
|
23
|
+
puts 'Filter Options:'.pastel(:bright_blue)
|
24
|
+
puts ShellHelper.field_table(filter_opts, 6)
|
25
|
+
puts
|
26
|
+
|
27
|
+
return []
|
28
|
+
end
|
29
|
+
|
30
|
+
list_select(filter_opts, word)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.filter_opts
|
34
|
+
%w[
|
35
|
+
archive case combine end exact except exists json limit or page pluck
|
36
|
+
raw reverse round slice sort start stats table_style text time_zone
|
37
|
+
total truncate uniq
|
38
|
+
]
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.filter_auto_completes
|
42
|
+
%w[
|
43
|
+
except exists pluck slice sort stats uniq
|
44
|
+
]
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.field_auto_complete?(word)
|
48
|
+
return false if word.blank?
|
49
|
+
|
50
|
+
filter_auto_completes.include? word.split('=', 2).first
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.field_auto_complete(word, files, flags = {})
|
54
|
+
# Prevent weird dupes
|
55
|
+
return nil if word[-1] == ','
|
56
|
+
|
57
|
+
# Command Manipulation
|
58
|
+
cmd, fields = word.split('=', 2)
|
59
|
+
complete = fields.split(',')[0..-2]
|
60
|
+
auto = fields.split(',').last
|
61
|
+
|
62
|
+
# Field Finder
|
63
|
+
matches = fields_find(files, auto, flags)
|
64
|
+
|
65
|
+
if matches.count == 1
|
66
|
+
"--#{cmd}=#{(complete + matches).join(',')}"
|
67
|
+
elsif matches.count > 1
|
68
|
+
puts "#{'Field Options:'.pastel(:bright_blue)} #{matches.join(' ').pastel(:bright_green)}"
|
69
|
+
|
70
|
+
list = [Cli.common_substr(matches.map(&:to_s))]
|
71
|
+
"--#{cmd}=#{(complete + list).join(',')}"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
module GreenHat
|
2
|
+
# CLI Helper
|
3
|
+
module ShellHelper
|
4
|
+
# Unify Filter / Filter Help
|
5
|
+
module Filter
|
6
|
+
# rubocop:disable Metrics/MethodLength
|
7
|
+
def self.help
|
8
|
+
puts "\u2500".pastel(:cyan) * 20
|
9
|
+
puts 'Filter'.pastel(:yellow)
|
10
|
+
puts "\u2500".pastel(:cyan) * 20
|
11
|
+
|
12
|
+
puts 'Options'.pastel(:blue)
|
13
|
+
puts '--raw'.pastel(:green)
|
14
|
+
puts ' Disable formatting and page/less'
|
15
|
+
puts
|
16
|
+
|
17
|
+
puts '--page'.pastel(:green)
|
18
|
+
puts ' Specifically enable or disable paging'
|
19
|
+
puts ' E.g. --page (default to true), --page=true, --page=false'
|
20
|
+
puts
|
21
|
+
|
22
|
+
puts '--round'.pastel(:green)
|
23
|
+
puts ' Attempt to round all integers. Default: 2.'
|
24
|
+
puts ' E.g. --round, --round=3, --round=0'
|
25
|
+
puts
|
26
|
+
|
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
|
+
puts
|
31
|
+
|
32
|
+
puts '--json'.pastel(:green)
|
33
|
+
puts ' Print output back into JSON'
|
34
|
+
puts
|
35
|
+
|
36
|
+
puts '--or'.pastel(:green)
|
37
|
+
puts ' Filters will use OR instead of AND (all match vs any match)'
|
38
|
+
puts
|
39
|
+
|
40
|
+
puts '--total'.pastel(:green)
|
41
|
+
puts ' Print only total count of matching entries'
|
42
|
+
puts
|
43
|
+
|
44
|
+
puts '--fields'.pastel(:green)
|
45
|
+
puts ' Print only Available fields for selected files'
|
46
|
+
puts
|
47
|
+
|
48
|
+
puts '--slice'.pastel(:green)
|
49
|
+
puts ' Extract specific fields from entries (slice multiple with comma)'
|
50
|
+
puts ' Ex: --slice=path or --slice=path,params'
|
51
|
+
puts
|
52
|
+
|
53
|
+
puts '--except'.pastel(:green)
|
54
|
+
puts ' Exclude specific fields (except multiple with comma)'
|
55
|
+
puts ' Ex: --except=params --except=params,path'
|
56
|
+
puts
|
57
|
+
|
58
|
+
puts '--exists'.pastel(:green)
|
59
|
+
puts ' Ensure field exists regardless of contents'
|
60
|
+
puts ' Ex: --exists=params --exists=params,path'
|
61
|
+
puts
|
62
|
+
|
63
|
+
puts '--stats'.pastel(:green)
|
64
|
+
puts ' Order/Count occurrances by field. Combine with `truncate` for key names'
|
65
|
+
puts ' Ex: --stats=params --except=params,path'
|
66
|
+
puts
|
67
|
+
|
68
|
+
puts '--uniq'.pastel(:green)
|
69
|
+
puts ' Show unique values only'
|
70
|
+
puts ' Ex: --uniq=params --uniq=params,path'
|
71
|
+
puts
|
72
|
+
|
73
|
+
puts '--pluck'.pastel(:green)
|
74
|
+
puts ' Extract values from entries'
|
75
|
+
puts ' Ex: --pluck=params --pluck=params,path'
|
76
|
+
puts
|
77
|
+
|
78
|
+
puts '--archive'.pastel(:green)
|
79
|
+
puts ' Limit to specific archvie name (partial matching /inclusive). Matching SOS tar.gz name'
|
80
|
+
puts ' Ex: --archive=dev-gitlab_20210622154626, --archive=202106,202107'
|
81
|
+
puts
|
82
|
+
|
83
|
+
puts '--sort'.pastel(:green)
|
84
|
+
puts ' Sort by multiple fields'
|
85
|
+
puts ' Ex: --sort=duration_s,db_duration_s'
|
86
|
+
puts
|
87
|
+
|
88
|
+
puts '--reverse'.pastel(:green)
|
89
|
+
puts ' Reverse all results'
|
90
|
+
puts ' Ex: --reverse'
|
91
|
+
puts
|
92
|
+
|
93
|
+
puts '--combine'.pastel(:green)
|
94
|
+
puts ' Omit archive identifier dividers. Useful with sort or time filters'
|
95
|
+
puts ' Ex: --combine'
|
96
|
+
puts
|
97
|
+
|
98
|
+
puts '--case'.pastel(:green)
|
99
|
+
puts ' Exact case match. Defaults to case insensitive'
|
100
|
+
puts ' Ex: --case; --name=Jon, --name=jane --case'
|
101
|
+
puts
|
102
|
+
|
103
|
+
puts '--exact'.pastel(:green)
|
104
|
+
puts ' Exact parameter/value match. Defaults to partial match'
|
105
|
+
puts ' Ex: --field=CommonPartial --exact'
|
106
|
+
puts
|
107
|
+
|
108
|
+
puts '--start'.pastel(:green)
|
109
|
+
puts ' Show events after specified time. Filtered by the `time` field'
|
110
|
+
puts ' Use with `--end` for between selections'
|
111
|
+
puts ' Ex: log filter --start="2021-06-22 14:44 UTC" --end="2021-06-22 14:45 UTC"'
|
112
|
+
puts
|
113
|
+
|
114
|
+
puts '--end'.pastel(:green)
|
115
|
+
puts ' Show events before specified time. Filtered by the `time` field'
|
116
|
+
puts ' Use with `--start` for between selections'
|
117
|
+
puts ' Ex: log filter --end="2021-06-22"'
|
118
|
+
puts
|
119
|
+
|
120
|
+
puts '--time_zone'.pastel(:green)
|
121
|
+
puts ' Manipulate the `time` field into a specific timezone'
|
122
|
+
puts ' Ex: log filter --time_zone=EDT'
|
123
|
+
puts
|
124
|
+
|
125
|
+
puts '--text'.pastel(:green)
|
126
|
+
puts ' Full entry text searching (slow)'
|
127
|
+
puts ' --text="anything here"'
|
128
|
+
puts
|
129
|
+
|
130
|
+
puts '--table_style'.pastel(:green)
|
131
|
+
puts ' Renderer used for formatted output. basic, ascii, or unicode(default)'
|
132
|
+
puts ' Ex: log filter --table_style=base'
|
133
|
+
puts
|
134
|
+
|
135
|
+
puts '--truncate'.pastel(:green)
|
136
|
+
puts ' Truncate field length. On by default (4 rows). Performance issues!'
|
137
|
+
puts ' Disable with --truncate=0'.pastel(:bright_red)
|
138
|
+
puts ' Ex: --truncate=200, --truncate=2048"'
|
139
|
+
puts
|
140
|
+
|
141
|
+
puts 'Field Searching'.pastel(:blue)
|
142
|
+
puts ' --[key]=[value]'
|
143
|
+
puts ' Search in key for value'
|
144
|
+
puts ' Example: --path=mirror/pull'
|
145
|
+
puts
|
146
|
+
|
147
|
+
puts 'Search specific logs'.pastel(:blue)
|
148
|
+
puts ' Any non dash parameters will be the log list to search from'
|
149
|
+
puts " Ex: log filter --path=api sidekiq/current (hint: use `#{'ls'.pastel(:yellow)}` for log names"
|
150
|
+
puts
|
151
|
+
|
152
|
+
puts 'Example Queries'.pastel(:blue)
|
153
|
+
puts " Also see #{'examples'.pastel(:bright_blue)} for even more examples"
|
154
|
+
puts ' log filter --class=BuildFinishedWorker sidekiq/current --slice=time,message'
|
155
|
+
puts ' log filter gitlab-rails/api_json.log --slice=ua --uniq=ua --ua=gitlab-runner'
|
156
|
+
|
157
|
+
puts
|
158
|
+
end
|
159
|
+
# rubocop:enable Metrics/MethodLength
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
@@ -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.
|
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).
|
89
|
+
service.name.ljust(pad).pastel(color),
|
31
90
|
"#{service.pid_uptime};".ljust(pad)
|
32
91
|
|
33
92
|
]
|