greenhat 0.7.2 → 0.7.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/README.md +7 -1
- data/lib/greenhat/accessors/gitlab.rb +1 -1
- data/lib/greenhat/accessors/grep.rb +1 -1
- data/lib/greenhat/archive.rb +3 -3
- data/lib/greenhat/cli.rb +2 -2
- data/lib/greenhat/entrypoint.rb +1 -1
- data/lib/greenhat/host.rb +2 -2
- data/lib/greenhat/paper/paper_helper.rb +1 -1
- data/lib/greenhat/reports/internal_methods.rb +2 -2
- data/lib/greenhat/reports/reports/errors.rb +2 -1
- data/lib/greenhat/reports/reports/full.rb +5 -0
- data/lib/greenhat/reports/reports/production_log_duration.rb +1 -0
- data/lib/greenhat/reports/shell_helper.rb +5 -5
- data/lib/greenhat/reports.rb +3 -3
- data/lib/greenhat/shell/args.rb +3 -3
- data/lib/greenhat/shell/filter_help.rb +2 -1
- data/lib/greenhat/shell/query.rb +9 -3
- data/lib/greenhat/shell/reports.rb +10 -1
- data/lib/greenhat/shell/shell_helper.rb +1 -1
- data/lib/greenhat/shell.rb +2 -2
- data/lib/greenhat/thing/file_types.rb +17 -0
- data/lib/greenhat/thing/formatters/api_json.rb +11 -4
- data/lib/greenhat/thing/formatters/exporters.rb +1 -1
- data/lib/greenhat/thing/formatters/gitlab_status.rb +1 -1
- data/lib/greenhat/thing/formatters/identify_db.rb +2 -2
- data/lib/greenhat/thing/formatters/json.rb +3 -0
- data/lib/greenhat/thing/formatters/json_shellwords.rb +12 -5
- data/lib/greenhat/thing/formatters/kube_nginx.rb +10 -10
- data/lib/greenhat/thing/formatters/nginx.rb +10 -10
- data/lib/greenhat/thing/formatters/runner_log.rb +5 -5
- data/lib/greenhat/thing/formatters/syslog.rb +4 -4
- data/lib/greenhat/thing/formatters/time_json.rb +1 -1
- data/lib/greenhat/thing/formatters/time_space.rb +1 -1
- data/lib/greenhat/thing/history.rb +1 -1
- data/lib/greenhat/thing/info_format.rb +2 -2
- data/lib/greenhat/thing/kind.rb +5 -1
- data/lib/greenhat/thing/spinner.rb +1 -1
- data/lib/greenhat/version.rb +1 -1
- data/lib/greenhat/web/faststats.rb +1 -1
- data/lib/greenhat/web/helpers.rb +1 -1
- metadata +11 -81
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: bfa1c48eaba3ee835bbb027b9e7314fa8e64d17629d481c7c3aa73d7e00b83a4
|
|
4
|
+
data.tar.gz: '0175799c24f2d5c43fda1d50e103446a73ee12600dca511d4d52327128a66767'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 95e6819b6e8f333c8537752d863ebc03fb3197e90be7ce92488bd68018c534be2d0db7593056cfa7c716ae43dae1ccf16d9f89ec84c72d4ef3b39fdb65734710
|
|
7
|
+
data.tar.gz: db52e83d2c456cd5d217310223ad62ea380e4e27f72ccc2819fa63b4e7734460b121153aaaa318743f3700f9e63eafbe71cda38caac94361cc659b88618edd20
|
data/README.md
CHANGED
|
@@ -38,7 +38,7 @@ bundle exec rake
|
|
|
38
38
|
- Update CHANGELOG
|
|
39
39
|
- Increment `version.rb`
|
|
40
40
|
- Create MR
|
|
41
|
-
- Merge to
|
|
41
|
+
- Merge to `main`
|
|
42
42
|
|
|
43
43
|
```
|
|
44
44
|
# Build and Push
|
|
@@ -46,6 +46,12 @@ bundle exec rake build
|
|
|
46
46
|
gem push pkg/greenhat-1.x.x.gem
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
+
## Dev Troubleshooting
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
docker run -it -v ${PWD}:/app ruby:3.1.4 bash
|
|
53
|
+
```
|
|
54
|
+
|
|
49
55
|
## Contributing
|
|
50
56
|
|
|
51
57
|
Bug reports and merge requests are welcome on GitLab at https://gitlab.com/gitlab-com/support/toolbox/greenhat. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
data/lib/greenhat/archive.rb
CHANGED
|
@@ -24,9 +24,9 @@ module GreenHat
|
|
|
24
24
|
list = Find.find(path).reject { |x| File.directory?(x) || File.symlink?(x) }
|
|
25
25
|
|
|
26
26
|
# Ignore Empty Files
|
|
27
|
-
list.reject! { |x| File.
|
|
27
|
+
list.reject! { |x| File.empty?(x) }
|
|
28
28
|
|
|
29
|
-
archive = Archive.new(name: archive_path, path:
|
|
29
|
+
archive = Archive.new(name: archive_path, path:)
|
|
30
30
|
archive.save
|
|
31
31
|
|
|
32
32
|
list.each do |file|
|
|
@@ -34,7 +34,7 @@ module GreenHat
|
|
|
34
34
|
next if missing_command(file)
|
|
35
35
|
|
|
36
36
|
# Thread.new do
|
|
37
|
-
thing = archive.things_create(file:
|
|
37
|
+
thing = archive.things_create(file:)
|
|
38
38
|
thing.setup
|
|
39
39
|
# end
|
|
40
40
|
end
|
data/lib/greenhat/cli.rb
CHANGED
|
@@ -8,7 +8,7 @@ module GreenHat
|
|
|
8
8
|
value ||= '' # Empty Start
|
|
9
9
|
|
|
10
10
|
loop do
|
|
11
|
-
line = reader.read_line(readline_notch, value:
|
|
11
|
+
line = reader.read_line(readline_notch, value:)
|
|
12
12
|
value = '' # Remove Afterwards
|
|
13
13
|
|
|
14
14
|
if reader.breaker
|
|
@@ -169,7 +169,7 @@ module GreenHat
|
|
|
169
169
|
def self.did_you_mean
|
|
170
170
|
dictionary = current_methods + current_submodules + cmd_list
|
|
171
171
|
|
|
172
|
-
all = DidYouMean::SpellChecker.new(dictionary:
|
|
172
|
+
all = DidYouMean::SpellChecker.new(dictionary:).correct(cmd)
|
|
173
173
|
|
|
174
174
|
if all.empty?
|
|
175
175
|
puts [
|
data/lib/greenhat/entrypoint.rb
CHANGED
|
@@ -12,7 +12,7 @@ module GreenHat
|
|
|
12
12
|
load_files files
|
|
13
13
|
Cli.run_command(args) if args.any? { |arg| Cli.run_command?(arg) }
|
|
14
14
|
|
|
15
|
-
report_runner(args
|
|
15
|
+
report_runner(args:, files:, raw:, flags:)
|
|
16
16
|
post_args(flags)
|
|
17
17
|
post_setup(flags)
|
|
18
18
|
|
data/lib/greenhat/host.rb
CHANGED
|
@@ -152,7 +152,7 @@ class Host < Teron
|
|
|
152
152
|
obj[headers[i]] = v
|
|
153
153
|
end
|
|
154
154
|
end
|
|
155
|
-
{ headers
|
|
155
|
+
{ headers:, list: }
|
|
156
156
|
end
|
|
157
157
|
|
|
158
158
|
def systemctl_unit_files
|
|
@@ -161,7 +161,7 @@ class Host < Teron
|
|
|
161
161
|
|
|
162
162
|
all = file.raw[1..-2].map do |x|
|
|
163
163
|
unit, status = x.split
|
|
164
|
-
{ unit
|
|
164
|
+
{ unit:, status: }
|
|
165
165
|
end
|
|
166
166
|
|
|
167
167
|
all.reject! { |x| x[:unit].nil? }
|
|
@@ -105,7 +105,7 @@ module GreenHat
|
|
|
105
105
|
# --------------------------------------------------------------------------
|
|
106
106
|
def render_array_table(entry)
|
|
107
107
|
header, rows = entry
|
|
108
|
-
table = TTY::Table.new(header
|
|
108
|
+
table = TTY::Table.new(header:, rows:)
|
|
109
109
|
|
|
110
110
|
LogBot.debug('Rendering Entries') if ENV['DEBUG']
|
|
111
111
|
self.output = table.render(table_style, padding: [0, 1, 0, 1], multiline: true) do |renderer|
|
|
@@ -125,10 +125,10 @@ module GreenHat
|
|
|
125
125
|
def show(value)
|
|
126
126
|
if value.instance_of?(Array)
|
|
127
127
|
value.each do |x|
|
|
128
|
-
output.push GreenHat::Paper.new(data: x, flags:
|
|
128
|
+
output.push GreenHat::Paper.new(data: x, flags:).render
|
|
129
129
|
end
|
|
130
130
|
else
|
|
131
|
-
output.push GreenHat::Paper.new(data: value, flags:
|
|
131
|
+
output.push GreenHat::Paper.new(data: value, flags:).render
|
|
132
132
|
end
|
|
133
133
|
end
|
|
134
134
|
|
|
@@ -26,7 +26,8 @@ entries = [
|
|
|
26
26
|
stats: 'exception.class,exception.message,status' },
|
|
27
27
|
{ header: 'Gitaly', base: 'gitaly/current --level=error --truncate=99', stats: 'error' },
|
|
28
28
|
{ header: 'Praefect', base: 'praefect/current --level=error --truncate=99', stats: 'error' },
|
|
29
|
-
{ header: 'Pages', base: 'gitlab-pages/current --level=error', stats: 'error' }
|
|
29
|
+
{ header: 'Pages', base: 'gitlab-pages/current --level=error', stats: 'error' },
|
|
30
|
+
{ header: 'Geo', base: 'gitlab-rails/geo.log --severity=error', stats: 'message' }
|
|
30
31
|
]
|
|
31
32
|
|
|
32
33
|
# Filter Logic
|
|
@@ -159,3 +159,8 @@ query_if_exists('gitlab-pages/current --level=error') do |data|
|
|
|
159
159
|
color = data.count.zero? ? :green : :red
|
|
160
160
|
indent("#{ljust('Pages:', 14, :magenta)} #{data.count.to_s.pastel(color)}", 4)
|
|
161
161
|
end
|
|
162
|
+
|
|
163
|
+
query_if_exists 'gitlab-rails/geo.log --severity=error' do |data|
|
|
164
|
+
color = data.count.zero? ? :green : :red
|
|
165
|
+
indent("#{ljust('Geo:', 14, :magenta)} #{data.count.to_s.pastel(color)}", 4)
|
|
166
|
+
end
|
|
@@ -4,14 +4,14 @@ module GreenHat
|
|
|
4
4
|
module Reports
|
|
5
5
|
# Make Running more consistent
|
|
6
6
|
def self.run(file:, args:, flags:, raw_args:)
|
|
7
|
-
report = GreenHat::Reports::Builder.new(file
|
|
7
|
+
report = GreenHat::Reports::Builder.new(file:, args:, flags:, raw_args:)
|
|
8
8
|
output = Archive.all.map do |archive|
|
|
9
9
|
runner = GreenHat::Reports::Runner.new(
|
|
10
|
-
archive
|
|
10
|
+
archive:,
|
|
11
11
|
store: report.store.clone,
|
|
12
|
-
flags
|
|
13
|
-
args
|
|
14
|
-
raw_args:
|
|
12
|
+
flags:,
|
|
13
|
+
args:,
|
|
14
|
+
raw_args:
|
|
15
15
|
)
|
|
16
16
|
|
|
17
17
|
runner.run!
|
data/lib/greenhat/reports.rb
CHANGED
data/lib/greenhat/shell/args.rb
CHANGED
|
@@ -201,7 +201,8 @@ module GreenHat
|
|
|
201
201
|
table_style: [
|
|
202
202
|
'--table_style'.pastel(:green),
|
|
203
203
|
' Renderer used for formatted output. basic, ascii, or unicode(default)',
|
|
204
|
-
'
|
|
204
|
+
' Without any params this will result in basic',
|
|
205
|
+
' Ex: log filter --table_style=basic'
|
|
205
206
|
],
|
|
206
207
|
|
|
207
208
|
truncate: [
|
data/lib/greenhat/shell/query.rb
CHANGED
|
@@ -25,10 +25,13 @@ module GreenHat
|
|
|
25
25
|
files.reject(&:blank?).map do |file|
|
|
26
26
|
src = file.archive&.friendly_name || file&.name
|
|
27
27
|
file.data.map do |entry|
|
|
28
|
+
# Some entries are nil?
|
|
29
|
+
next if entry.nil?
|
|
30
|
+
|
|
28
31
|
bit = entry.clone
|
|
29
32
|
bit[:src] = src
|
|
30
33
|
bit
|
|
31
|
-
end
|
|
34
|
+
end.compact
|
|
32
35
|
end
|
|
33
36
|
end
|
|
34
37
|
|
|
@@ -164,6 +167,9 @@ module GreenHat
|
|
|
164
167
|
process_transform(flags[:transform], results) if flags.key? :transform
|
|
165
168
|
|
|
166
169
|
results.select! do |row|
|
|
170
|
+
# Skip Integers?
|
|
171
|
+
# next if row.is_a? Integer
|
|
172
|
+
|
|
167
173
|
args.send(flags.logic || :all?) do |arg|
|
|
168
174
|
filter_row_key(row, arg, flags)
|
|
169
175
|
end
|
|
@@ -372,7 +378,7 @@ module GreenHat
|
|
|
372
378
|
l95 = l95.round(flags.round) if flags.round
|
|
373
379
|
|
|
374
380
|
{
|
|
375
|
-
key
|
|
381
|
+
key:,
|
|
376
382
|
'99' => l99,
|
|
377
383
|
'95' => l95,
|
|
378
384
|
mean: flags.round ? values.mean.round(flags.round) : values.mean,
|
|
@@ -494,7 +500,7 @@ module GreenHat
|
|
|
494
500
|
match
|
|
495
501
|
end
|
|
496
502
|
rescue StandardError => e
|
|
497
|
-
LogBot.fatal('[Query] Filter Row Failure', message: e.message, backtrace: e.backtrace.first, row:
|
|
503
|
+
LogBot.fatal('[Query] Filter Row Failure', message: e.message, backtrace: e.backtrace.first, row:)
|
|
498
504
|
false
|
|
499
505
|
end
|
|
500
506
|
|
|
@@ -8,6 +8,15 @@ require 'greenhat/reports/shell_helper'
|
|
|
8
8
|
module GreenHat
|
|
9
9
|
# CLI Helper
|
|
10
10
|
module Shell
|
|
11
|
+
# Make `report` a default top layer command
|
|
12
|
+
def self.report(_raw = ['default'])
|
|
13
|
+
# Move
|
|
14
|
+
Cli.move_shell Shell::Reports
|
|
15
|
+
|
|
16
|
+
# Run
|
|
17
|
+
Reports.default ['full']
|
|
18
|
+
end
|
|
19
|
+
|
|
11
20
|
# Logs
|
|
12
21
|
module Reports
|
|
13
22
|
def self.auto_complete(_list, word)
|
|
@@ -48,7 +57,7 @@ module GreenHat
|
|
|
48
57
|
|
|
49
58
|
run_list.each do |file|
|
|
50
59
|
raw_args = list.reject { |x| file.include? x }
|
|
51
|
-
GreenHat::ShellHelper::Reports.run(file
|
|
60
|
+
GreenHat::ShellHelper::Reports.run(file:, args:, flags:, raw_args:)
|
|
52
61
|
end
|
|
53
62
|
end
|
|
54
63
|
end
|
data/lib/greenhat/shell.rb
CHANGED
|
@@ -59,11 +59,11 @@ module GreenHat
|
|
|
59
59
|
file_list = Dir['/var/log/gitlab/*/current'] + Dir['/var/log/gitlab/*/*.log']
|
|
60
60
|
|
|
61
61
|
file_list.each do |file|
|
|
62
|
-
next if File.
|
|
62
|
+
next if File.empty?(file)
|
|
63
63
|
|
|
64
64
|
puts "- Loading #{file.pastel(:green)}"
|
|
65
65
|
|
|
66
|
-
archive.things_create(file:
|
|
66
|
+
archive.things_create(file:).setup
|
|
67
67
|
end
|
|
68
68
|
end
|
|
69
69
|
|
|
@@ -920,6 +920,12 @@ module GreenHat
|
|
|
920
920
|
/vmstat/
|
|
921
921
|
]
|
|
922
922
|
},
|
|
923
|
+
'date' => {
|
|
924
|
+
format: :raw,
|
|
925
|
+
pattern: [
|
|
926
|
+
/date/
|
|
927
|
+
]
|
|
928
|
+
},
|
|
923
929
|
'gitlab-kas/config' => {
|
|
924
930
|
format: :raw,
|
|
925
931
|
pattern: [
|
|
@@ -989,6 +995,13 @@ module GreenHat
|
|
|
989
995
|
%r{sidekiq/perf.data}
|
|
990
996
|
]
|
|
991
997
|
},
|
|
998
|
+
'gitlab-rails/geo.log' => {
|
|
999
|
+
format: :json,
|
|
1000
|
+
log: true,
|
|
1001
|
+
pattern: [
|
|
1002
|
+
%r{gitlab-rails/geo.log}
|
|
1003
|
+
]
|
|
1004
|
+
},
|
|
992
1005
|
|
|
993
1006
|
# ======================================================================
|
|
994
1007
|
# KubeSoS TODO Section
|
|
@@ -1014,6 +1027,10 @@ module GreenHat
|
|
|
1014
1027
|
'kubesos' => {
|
|
1015
1028
|
format: :raw,
|
|
1016
1029
|
pattern: [
|
|
1030
|
+
/license_info/,
|
|
1031
|
+
%r{etc/sshd_config},
|
|
1032
|
+
/btmp_size/,
|
|
1033
|
+
/user_uid/,
|
|
1017
1034
|
/all_values.yaml/,
|
|
1018
1035
|
%r{webservice.log/sidekiq_client.log},
|
|
1019
1036
|
/chart-version/,
|
|
@@ -8,19 +8,26 @@ module GreenHat
|
|
|
8
8
|
# Primarily for gitlab-rails/api_json.log
|
|
9
9
|
def format_api_json
|
|
10
10
|
self.result = raw.map do |row|
|
|
11
|
+
# Seeing regular edge cases where there is random new non-json
|
|
12
|
+
# at the beginning of a log / Attempt to save first entry
|
|
13
|
+
if row[0] != '{'
|
|
14
|
+
# Nothing to Escape Parse
|
|
15
|
+
next unless row.include?('{')
|
|
16
|
+
|
|
17
|
+
row = "{#{row.split('{', 2).last}"
|
|
18
|
+
end
|
|
19
|
+
|
|
11
20
|
result = Oj.load row
|
|
12
21
|
|
|
13
22
|
# Parsing Time
|
|
14
23
|
format_time(result)
|
|
15
24
|
|
|
16
|
-
# flatten_hash(result).sort.to_h
|
|
17
25
|
result
|
|
18
26
|
rescue StandardError => e
|
|
19
27
|
# TODO: Background Logger?
|
|
20
|
-
e.message
|
|
21
|
-
LogBot.warn('JSON Parse', e.message)
|
|
28
|
+
LogBot.warn('[API JSON] JSON Parse', "#{e.message}: #{row.inspect}")
|
|
22
29
|
next
|
|
23
|
-
end
|
|
30
|
+
end.compact
|
|
24
31
|
|
|
25
32
|
:ok
|
|
26
33
|
end
|
|
@@ -31,7 +31,7 @@ module GreenHat
|
|
|
31
31
|
# Breakout
|
|
32
32
|
method, path, protocol, status, bytes = request.gsub('"', '').split(' ', 5)
|
|
33
33
|
|
|
34
|
-
result.merge!(method
|
|
34
|
+
result.merge!(method:, path:, protocol:, status:, bytes:)
|
|
35
35
|
|
|
36
36
|
else
|
|
37
37
|
result[:msg] = msg
|
|
@@ -47,6 +47,9 @@ module GreenHat
|
|
|
47
47
|
|
|
48
48
|
# Loop through potential fields and parse as needed
|
|
49
49
|
def format_time(result)
|
|
50
|
+
# Don't format integers
|
|
51
|
+
# return if result.is_a? Integer
|
|
52
|
+
|
|
50
53
|
format_time_fields.each do |field|
|
|
51
54
|
result[field] = format_time_parse(result[field]) if result.key?(field)
|
|
52
55
|
rescue StandardError => e
|
|
@@ -7,11 +7,7 @@ module GreenHat
|
|
|
7
7
|
# ==========================================================================
|
|
8
8
|
def format_json_shell
|
|
9
9
|
self.result = raw.map do |row|
|
|
10
|
-
result =
|
|
11
|
-
Oj.load row
|
|
12
|
-
rescue EncodingError
|
|
13
|
-
json_shellwords_fallback row
|
|
14
|
-
end
|
|
10
|
+
result = format_json_row(row)
|
|
15
11
|
|
|
16
12
|
# Parsing Time
|
|
17
13
|
format_time(result)
|
|
@@ -25,6 +21,17 @@ module GreenHat
|
|
|
25
21
|
:ok
|
|
26
22
|
end
|
|
27
23
|
|
|
24
|
+
# Simplify Map Loop / Short Circuit for weird entries
|
|
25
|
+
def format_json_row(row)
|
|
26
|
+
return { message: row } if row[0] != '{' && !row.include?('{')
|
|
27
|
+
|
|
28
|
+
begin
|
|
29
|
+
Oj.load row
|
|
30
|
+
rescue EncodingError
|
|
31
|
+
json_shellwords_fallback row
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
28
35
|
def json_shellwords_fallback(row)
|
|
29
36
|
result = Shellwords.split(row).each_with_object({}) do |x, h|
|
|
30
37
|
key, value = x.split('=')
|
|
@@ -18,16 +18,16 @@ module GreenHat
|
|
|
18
18
|
|
|
19
19
|
{
|
|
20
20
|
remote_addr: ip,
|
|
21
|
-
remote_user
|
|
22
|
-
method
|
|
23
|
-
path
|
|
24
|
-
status
|
|
25
|
-
bytes
|
|
26
|
-
http_version
|
|
27
|
-
http_referer
|
|
28
|
-
http_user_agent
|
|
29
|
-
gzip_ratio
|
|
30
|
-
time:
|
|
21
|
+
remote_user:,
|
|
22
|
+
method:,
|
|
23
|
+
path:,
|
|
24
|
+
status:,
|
|
25
|
+
bytes:,
|
|
26
|
+
http_version:,
|
|
27
|
+
http_referer:,
|
|
28
|
+
http_user_agent:,
|
|
29
|
+
gzip_ratio:,
|
|
30
|
+
time:
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
# Fall back for malformed logs
|
|
@@ -21,16 +21,16 @@ module GreenHat
|
|
|
21
21
|
|
|
22
22
|
{
|
|
23
23
|
remote_addr: ip,
|
|
24
|
-
remote_user
|
|
25
|
-
method
|
|
26
|
-
path
|
|
27
|
-
status
|
|
28
|
-
bytes
|
|
29
|
-
http_version
|
|
30
|
-
http_referer
|
|
31
|
-
http_user_agent
|
|
32
|
-
gzip_ratio
|
|
33
|
-
time:
|
|
24
|
+
remote_user:,
|
|
25
|
+
method:,
|
|
26
|
+
path:,
|
|
27
|
+
status:,
|
|
28
|
+
bytes:,
|
|
29
|
+
http_version:,
|
|
30
|
+
http_referer:,
|
|
31
|
+
http_user_agent:,
|
|
32
|
+
gzip_ratio:,
|
|
33
|
+
time:
|
|
34
34
|
}
|
|
35
35
|
rescue StandardError => e
|
|
36
36
|
LogBot.warn('NGINX Parse', e.message)
|
|
@@ -23,11 +23,11 @@ module GreenHat
|
|
|
23
23
|
|
|
24
24
|
entry = {
|
|
25
25
|
time: format_time_parse("#{month} #{day} #{time}"),
|
|
26
|
-
device
|
|
27
|
-
service
|
|
28
|
-
message
|
|
29
|
-
pid
|
|
30
|
-
row:
|
|
26
|
+
device:,
|
|
27
|
+
service:,
|
|
28
|
+
message:,
|
|
29
|
+
pid:,
|
|
30
|
+
row: # Insert full row for different timestamp formats
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
# Remove Empty Keys
|
|
@@ -103,7 +103,7 @@ module GreenHat
|
|
|
103
103
|
obj[headers[i]] = v
|
|
104
104
|
end
|
|
105
105
|
end
|
|
106
|
-
{ headers
|
|
106
|
+
{ headers:, list: }
|
|
107
107
|
end
|
|
108
108
|
|
|
109
109
|
def manifest_json_format
|
|
@@ -150,7 +150,7 @@ module GreenHat
|
|
|
150
150
|
|
|
151
151
|
all = info.systemctl_unit_files[1..-2].map do |x|
|
|
152
152
|
unit, status = x.split
|
|
153
|
-
{ unit
|
|
153
|
+
{ unit:, status: }
|
|
154
154
|
end
|
|
155
155
|
all.reject! { |x| x[:unit].nil? }
|
|
156
156
|
all.sort_by(&:unit)
|
data/lib/greenhat/thing/kind.rb
CHANGED
|
@@ -44,7 +44,11 @@ module GreenHat
|
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
def check_oj_parse?(first_line)
|
|
47
|
-
Oj.load(first_line)
|
|
47
|
+
result = Oj.load(first_line)
|
|
48
|
+
|
|
49
|
+
# Extra Validation (Oj is being more generous than we want)
|
|
50
|
+
return false if result.is_a? Integer
|
|
51
|
+
|
|
48
52
|
true
|
|
49
53
|
rescue StandardError
|
|
50
54
|
false
|
|
@@ -9,7 +9,7 @@ module GreenHat
|
|
|
9
9
|
@spinner = TTY::Spinner.new(
|
|
10
10
|
"#{time.pastel(:bright_black)} - [:spinner] :title", hide_cursor: true, success_mark: '✔'.pastel(:green)
|
|
11
11
|
)
|
|
12
|
-
@spinner.update(title:
|
|
12
|
+
@spinner.update(title:)
|
|
13
13
|
|
|
14
14
|
# Don't Auto spin when debug output is happening
|
|
15
15
|
@spinner.auto_spin unless ENV['DEBUG']
|
data/lib/greenhat/version.rb
CHANGED
|
@@ -29,7 +29,7 @@ module WebHelpers
|
|
|
29
29
|
|
|
30
30
|
# Handle Short Results
|
|
31
31
|
top = results.dig(kind, :stats).sort_by { |_k, v| v[:duration] }
|
|
32
|
-
top = top
|
|
32
|
+
top = top[-10..] if top.size >= 10
|
|
33
33
|
|
|
34
34
|
top.to_h.map do |k, v|
|
|
35
35
|
count_perc = percent(v[:count], count)
|
data/lib/greenhat/web/helpers.rb
CHANGED
metadata
CHANGED
|
@@ -1,101 +1,31 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: greenhat
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.7.
|
|
4
|
+
version: 0.7.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Davin Walker
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-
|
|
11
|
+
date: 2023-11-14 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
|
-
name:
|
|
14
|
+
name: actionview
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '1
|
|
19
|
+
version: '6.1'
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '1
|
|
27
|
-
- !ruby/object:Gem::Dependency
|
|
28
|
-
name: bundler
|
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
|
30
|
-
requirements:
|
|
31
|
-
- - ">="
|
|
32
|
-
- !ruby/object:Gem::Version
|
|
33
|
-
version: '0'
|
|
34
|
-
type: :development
|
|
35
|
-
prerelease: false
|
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
-
requirements:
|
|
38
|
-
- - ">="
|
|
39
|
-
- !ruby/object:Gem::Version
|
|
40
|
-
version: '0'
|
|
41
|
-
- !ruby/object:Gem::Dependency
|
|
42
|
-
name: minitest
|
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
|
44
|
-
requirements:
|
|
45
|
-
- - "~>"
|
|
46
|
-
- !ruby/object:Gem::Version
|
|
47
|
-
version: '5.14'
|
|
48
|
-
type: :development
|
|
49
|
-
prerelease: false
|
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
-
requirements:
|
|
52
|
-
- - "~>"
|
|
53
|
-
- !ruby/object:Gem::Version
|
|
54
|
-
version: '5.14'
|
|
55
|
-
- !ruby/object:Gem::Dependency
|
|
56
|
-
name: minitest-reporters
|
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
|
58
|
-
requirements:
|
|
59
|
-
- - "~>"
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: '1.4'
|
|
62
|
-
type: :development
|
|
63
|
-
prerelease: false
|
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
-
requirements:
|
|
66
|
-
- - "~>"
|
|
67
|
-
- !ruby/object:Gem::Version
|
|
68
|
-
version: '1.4'
|
|
69
|
-
- !ruby/object:Gem::Dependency
|
|
70
|
-
name: rake
|
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
|
72
|
-
requirements:
|
|
73
|
-
- - "~>"
|
|
74
|
-
- !ruby/object:Gem::Version
|
|
75
|
-
version: '13.0'
|
|
76
|
-
type: :development
|
|
77
|
-
prerelease: false
|
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
-
requirements:
|
|
80
|
-
- - "~>"
|
|
81
|
-
- !ruby/object:Gem::Version
|
|
82
|
-
version: '13.0'
|
|
83
|
-
- !ruby/object:Gem::Dependency
|
|
84
|
-
name: rubocop
|
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
|
86
|
-
requirements:
|
|
87
|
-
- - "~>"
|
|
88
|
-
- !ruby/object:Gem::Version
|
|
89
|
-
version: '1.0'
|
|
90
|
-
type: :development
|
|
91
|
-
prerelease: false
|
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
-
requirements:
|
|
94
|
-
- - "~>"
|
|
95
|
-
- !ruby/object:Gem::Version
|
|
96
|
-
version: '1.0'
|
|
26
|
+
version: '6.1'
|
|
97
27
|
- !ruby/object:Gem::Dependency
|
|
98
|
-
name:
|
|
28
|
+
name: activesupport
|
|
99
29
|
requirement: !ruby/object:Gem::Requirement
|
|
100
30
|
requirements:
|
|
101
31
|
- - "~>"
|
|
@@ -109,19 +39,19 @@ dependencies:
|
|
|
109
39
|
- !ruby/object:Gem::Version
|
|
110
40
|
version: '6.1'
|
|
111
41
|
- !ruby/object:Gem::Dependency
|
|
112
|
-
name:
|
|
42
|
+
name: amazing_print
|
|
113
43
|
requirement: !ruby/object:Gem::Requirement
|
|
114
44
|
requirements:
|
|
115
45
|
- - "~>"
|
|
116
46
|
- !ruby/object:Gem::Version
|
|
117
|
-
version: '
|
|
47
|
+
version: '1.3'
|
|
118
48
|
type: :runtime
|
|
119
49
|
prerelease: false
|
|
120
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
51
|
requirements:
|
|
122
52
|
- - "~>"
|
|
123
53
|
- !ruby/object:Gem::Version
|
|
124
|
-
version: '
|
|
54
|
+
version: '1.3'
|
|
125
55
|
- !ruby/object:Gem::Dependency
|
|
126
56
|
name: chartkick
|
|
127
57
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -609,14 +539,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
609
539
|
requirements:
|
|
610
540
|
- - ">="
|
|
611
541
|
- !ruby/object:Gem::Version
|
|
612
|
-
version:
|
|
542
|
+
version: '3'
|
|
613
543
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
614
544
|
requirements:
|
|
615
545
|
- - ">="
|
|
616
546
|
- !ruby/object:Gem::Version
|
|
617
547
|
version: '0'
|
|
618
548
|
requirements: []
|
|
619
|
-
rubygems_version: 3.
|
|
549
|
+
rubygems_version: 3.3.26
|
|
620
550
|
signing_key:
|
|
621
551
|
specification_version: 4
|
|
622
552
|
summary: GitLab SOS Tool
|