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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/lib/greenhat/accessors/disk.rb +58 -2
  3. data/lib/greenhat/accessors/gitlab.rb +75 -0
  4. data/lib/greenhat/accessors/memory.rb +10 -10
  5. data/lib/greenhat/accessors/process.rb +10 -1
  6. data/lib/greenhat/cli.rb +148 -63
  7. data/lib/greenhat/color.rb +27 -0
  8. data/lib/greenhat/logbot.rb +9 -9
  9. data/lib/greenhat/settings.rb +51 -3
  10. data/lib/greenhat/shell/args.rb +146 -0
  11. data/lib/greenhat/shell/cat.rb +25 -73
  12. data/lib/greenhat/shell/color_string.rb +43 -0
  13. data/lib/greenhat/shell/disk.rb +30 -42
  14. data/lib/greenhat/shell/faststats.rb +104 -58
  15. data/lib/greenhat/shell/field_helper.rb +75 -0
  16. data/lib/greenhat/shell/filter_help.rb +162 -0
  17. data/lib/greenhat/shell/gitlab.rb +61 -2
  18. data/lib/greenhat/shell/help.rb +98 -15
  19. data/lib/greenhat/shell/list.rb +46 -0
  20. data/lib/greenhat/shell/log.rb +115 -209
  21. data/lib/greenhat/shell/page.rb +39 -0
  22. data/lib/greenhat/shell/process.rb +57 -2
  23. data/lib/greenhat/shell/report.rb +70 -60
  24. data/lib/greenhat/shell/shell_helper.rb +654 -0
  25. data/lib/greenhat/shell.rb +27 -13
  26. data/lib/greenhat/thing/file_types.rb +54 -7
  27. data/lib/greenhat/thing/formatters/json_shellwords.rb +0 -3
  28. data/lib/greenhat/thing/formatters/nginx.rb +44 -0
  29. data/lib/greenhat/thing/formatters/syslog.rb +39 -0
  30. data/lib/greenhat/thing/helpers.rb +4 -4
  31. data/lib/greenhat/thing/kind.rb +9 -2
  32. data/lib/greenhat/thing/spinner.rb +3 -3
  33. data/lib/greenhat/thing.rb +25 -3
  34. data/lib/greenhat/tty/columns.rb +44 -0
  35. data/lib/greenhat/version.rb +1 -1
  36. data/lib/greenhat.rb +16 -14
  37. metadata +42 -17
  38. 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".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
 
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.colorize(:yellow)}"
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(file_list, _other = nil)
81
- # Extract Args
82
- file_list, opts, args = ShellHelper.param_parse(file_list)
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 = opts.map { |opt| "--#{opt.field}=#{opt.value}" }.join(' ')
85
- cmd += args.keys.map { |arg| "--#{arg}" }.join(' ')
116
+ files, flags, cmd = ShellHelper::Faststats.parse(raw)
86
117
 
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)
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, args)
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(log_list)
114
- # Extract Args
115
- log_list, opts, args = ShellHelper.param_parse(log_list)
116
-
117
- # Default to color output
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
- # Prepare Log List
124
- log_list = ShellHelper.prepare_list(log_list, ShellHelper::Faststats.things)
146
+ files, flags, cmd = ShellHelper::Faststats.parse(raw)
125
147
 
126
- # Convert to Things
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, args)
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(log_list)
145
- # Extract Args
146
- log_list, opts, args = ShellHelper.param_parse(log_list)
147
-
148
- # Default to color output
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
- cmd = opts.map { |opt| "--#{opt.field}=#{opt.value}" }.join(' ')
152
- cmd += args.keys.map { |arg| "--#{arg}" }.join(' ')
171
+ # Add Color Output
172
+ raw.push '--color-output'
173
+ files, flags, cmd = ShellHelper::Faststats.parse(raw)
153
174
 
154
- # Prepare Log List
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, args)
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.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
  ]