greenhat 0.3.4 → 0.5.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.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/bin/greenhat +2 -6
  3. data/lib/greenhat/accessors/disk.rb +1 -3
  4. data/lib/greenhat/accessors/gitlab.rb +7 -2
  5. data/lib/greenhat/accessors/memory.rb +1 -1
  6. data/lib/greenhat/archive.rb +19 -8
  7. data/lib/greenhat/cli.rb +35 -135
  8. data/lib/greenhat/entrypoint.rb +170 -0
  9. data/lib/greenhat/host.rb +25 -37
  10. data/lib/greenhat/settings.rb +33 -5
  11. data/lib/greenhat/shell/args.rb +22 -9
  12. data/lib/greenhat/shell/faststats.rb +23 -3
  13. data/lib/greenhat/shell/field_helper.rb +1 -1
  14. data/lib/greenhat/shell/filter_help.rb +217 -162
  15. data/lib/greenhat/shell/gitlab.rb +1 -0
  16. data/lib/greenhat/shell/log.rb +150 -25
  17. data/lib/greenhat/shell/markdown.rb +21 -25
  18. data/lib/greenhat/shell/old_search_helper.rb +54 -0
  19. data/lib/greenhat/shell/page.rb +1 -1
  20. data/lib/greenhat/shell/pipe.rb +31 -0
  21. data/lib/greenhat/shell/platform.rb +28 -0
  22. data/lib/greenhat/shell/query.rb +378 -0
  23. data/lib/greenhat/shell/report.rb +76 -24
  24. data/lib/greenhat/shell/shell_helper.rb +42 -393
  25. data/lib/greenhat/shell.rb +19 -4
  26. data/lib/greenhat/thing/file_types.rb +51 -1
  27. data/lib/greenhat/thing/formatters/api_json.rb +4 -2
  28. data/lib/greenhat/thing/formatters/bracket_log.rb +1 -1
  29. data/lib/greenhat/thing/formatters/colon_split_strip.rb +2 -2
  30. data/lib/greenhat/thing/formatters/dotenv.rb +1 -1
  31. data/lib/greenhat/thing/formatters/format.rb +0 -11
  32. data/lib/greenhat/thing/formatters/free_m.rb +2 -2
  33. data/lib/greenhat/thing/formatters/json.rb +43 -15
  34. data/lib/greenhat/thing/formatters/json_shellwords.rb +3 -2
  35. data/lib/greenhat/thing/formatters/kube_json.rb +3 -2
  36. data/lib/greenhat/thing/formatters/multiline_json.rb +1 -1
  37. data/lib/greenhat/thing/formatters/nginx.rb +11 -3
  38. data/lib/greenhat/thing/formatters/table.rb +3 -3
  39. data/lib/greenhat/thing/formatters/time_space.rb +0 -16
  40. data/lib/greenhat/thing/helpers.rb +12 -11
  41. data/lib/greenhat/thing/info_format.rb +4 -4
  42. data/lib/greenhat/thing/kind.rb +5 -0
  43. data/lib/greenhat/thing/super_log.rb +0 -101
  44. data/lib/greenhat/thing.rb +31 -25
  45. data/lib/greenhat/version.rb +1 -1
  46. data/lib/greenhat/views/api.slim +55 -0
  47. data/lib/greenhat/views/chart.slim +42 -0
  48. data/lib/greenhat/views/chart_template.slim +31 -0
  49. data/lib/greenhat/views/chartkick.js +21 -0
  50. data/lib/greenhat/views/css.slim +47 -0
  51. data/lib/greenhat/views/gitaly.slim +53 -0
  52. data/lib/greenhat/views/headers.slim +16 -0
  53. data/lib/greenhat/views/index-old.slim +51 -0
  54. data/lib/greenhat/views/index.slim +14 -14
  55. data/lib/greenhat/views/info.slim +17 -18
  56. data/lib/greenhat/views/production.slim +55 -0
  57. data/lib/greenhat/views/sidekiq.slim +55 -0
  58. data/lib/greenhat/views/time.slim +63 -0
  59. data/lib/greenhat/views/workhorse.slim +16 -0
  60. data/lib/greenhat/web/api.rb +94 -0
  61. data/lib/greenhat/web/chartkick_shim.rb +14 -0
  62. data/lib/greenhat/web/faststats.rb +44 -0
  63. data/lib/greenhat/web/gitaly.rb +65 -0
  64. data/lib/greenhat/web/helpers.rb +198 -0
  65. data/lib/greenhat/web/production.rb +104 -0
  66. data/lib/greenhat/web/sidekiq.rb +73 -0
  67. data/lib/greenhat/web/stats_helpers.rb +74 -0
  68. data/lib/greenhat/web/time.rb +36 -0
  69. data/lib/greenhat/web/workhorse.rb +43 -0
  70. data/lib/greenhat/web.rb +63 -19
  71. data/lib/greenhat.rb +2 -0
  72. metadata +74 -5
@@ -2,169 +2,205 @@ module GreenHat
2
2
  # CLI Helper
3
3
  module ShellHelper
4
4
  # Unify Filter / Filter Help
5
- # rubocop:disable Metrics/MethodLength,Metrics/ModuleLength
5
+ # rubocop:disable Metrics/MethodLength,Layout/LineLength
6
6
  module Filter
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
7
+ def self.help(args = '')
8
+ if args.blank?
9
+ help_index.values.map { |x| x.push '' }
10
+ else
11
+ list = help_index.select do |k, _v|
12
+ k.to_s.include? args
13
+ end
14
+
15
+ list.values
16
+ end
17
+
18
+ # .map { |x| x.join("\n") }.join("\n\n")
158
19
  end
159
20
 
21
+ # TODO: Confirm Remove
22
+ # def self.legacy
23
+ # puts "\u2500".pastel(:cyan) * 20
24
+ # puts 'Filter'.pastel(:yellow)
25
+ # puts "\u2500".pastel(:cyan) * 20
26
+
27
+ # puts 'Options'.pastel(:blue)
28
+ # puts '--raw'.pastel(:green)
29
+ # puts ' Disable formatting and page/less'
30
+ # puts
31
+
32
+ # puts '--page'.pastel(:green)
33
+ # puts ' Specifically enable or disable paging'
34
+ # puts ' E.g. --page (default to true), --page=true, --page=false'
35
+ # puts
36
+
37
+ # puts '--round'.pastel(:green)
38
+ # puts ' Attempt to round all integers. Default: 2.'
39
+ # puts ' E.g. --round, --round=3, --round=0'
40
+ # puts
41
+
42
+ # puts '--limit'.pastel(:green)
43
+ # puts ' Limit total output lines. Disabled by default. Default without value is based on screen height'
44
+ # puts ' E.g. --limit, --limit=5'
45
+ # puts
46
+
47
+ # puts '--json'.pastel(:green)
48
+ # puts ' Print output back into JSON'
49
+ # puts
50
+
51
+ # puts '--or'.pastel(:green)
52
+ # puts ' Filters will use OR instead of AND (all match vs any match)'
53
+ # puts
54
+
55
+ # puts '--total'.pastel(:green)
56
+ # puts ' Show total count, duration, start/end time for matching entries'
57
+ # puts
58
+
59
+ # puts '--fields'.pastel(:green)
60
+ # puts ' Print only Available fields for selected files'
61
+ # puts
62
+
63
+ # puts '--slice'.pastel(:green)
64
+ # puts ' Extract specific fields from entries (slice multiple with comma)'
65
+ # puts ' Ex: --slice=path or --slice=path,params'
66
+ # puts
67
+
68
+ # puts '--except'.pastel(:green)
69
+ # puts ' Exclude specific fields (except multiple with comma)'
70
+ # puts ' Ex: --except=params --except=params,path'
71
+ # puts
72
+
73
+ # puts '--exists'.pastel(:green)
74
+ # puts ' Ensure field exists regardless of contents'
75
+ # puts ' Ex: --exists=params --exists=params,path'
76
+ # puts
77
+
78
+ # puts '--stats'.pastel(:green)
79
+ # puts ' Order/Count occurrances by field. Combine with `truncate` for key names'
80
+ # puts ' Ex: --stats=params --except=params,path'
81
+ # puts
82
+
83
+ # puts '--uniq'.pastel(:green)
84
+ # puts ' Show unique values only'
85
+ # puts ' Ex: --uniq=params --uniq=params,path'
86
+ # puts
87
+
88
+ # puts '--pluck'.pastel(:green)
89
+ # puts ' Extract values from entries'
90
+ # puts ' Ex: --pluck=params --pluck=params,path'
91
+ # puts
92
+
93
+ # puts '--archive'.pastel(:green)
94
+ # puts ' Limit to specific archvie name (partial matching /inclusive). Matching SOS tar.gz name'
95
+ # puts ' Ex: --archive=dev-gitlab_20210622154626, --archive=202106,202107'
96
+ # puts
97
+
98
+ # puts '--sort'.pastel(:green)
99
+ # puts ' Sort by multiple fields'
100
+ # puts ' Ex: --sort=duration_s,db_duration_s'
101
+ # puts
102
+
103
+ # puts '--reverse'.pastel(:green)
104
+ # puts ' Reverse all results'
105
+ # puts ' Ex: --reverse'
106
+ # puts
107
+
108
+ # puts '--combine'.pastel(:green)
109
+ # puts ' Omit archive identifier dividers. Useful with sort or time filters'
110
+ # puts ' Ex: --combine'
111
+ # puts
112
+
113
+ # puts '--case'.pastel(:green)
114
+ # puts ' Exact case match. Defaults to case insensitive'
115
+ # puts ' Ex: --case; --name=Jon, --name=jane --case'
116
+ # puts
117
+
118
+ # puts '--exact'.pastel(:green)
119
+ # puts ' Exact parameter/value match. Defaults to partial match'
120
+ # puts ' Ex: --field=CommonPartial --exact'
121
+ # puts
122
+
123
+ # puts '--start'.pastel(:green)
124
+ # puts ' Show events after specified time. Filtered by the `time` field'
125
+ # puts ' Use with `--end` for between selections'
126
+ # puts ' Ex: log filter --start="2021-06-22 14:44 UTC" --end="2021-06-22 14:45 UTC"'
127
+ # puts
128
+
129
+ # puts '--end'.pastel(:green)
130
+ # puts ' Show events before specified time. Filtered by the `time` field'
131
+ # puts ' Use with `--start` for between selections'
132
+ # puts ' Ex: log filter --end="2021-06-22"'
133
+ # puts
134
+
135
+ # puts '--time_zone'.pastel(:green)
136
+ # puts ' Manipulate the `time` field into a specific timezone'
137
+ # puts ' Ex: log filter --time_zone=EDT'
138
+ # puts
139
+
140
+ # puts '--text'.pastel(:green)
141
+ # puts ' Full entry text searching (slow)'
142
+ # puts ' --text="anything here"'
143
+ # puts
144
+
145
+ # puts '--table_style'.pastel(:green)
146
+ # puts ' Renderer used for formatted output. basic, ascii, or unicode(default)'
147
+ # puts ' Ex: log filter --table_style=base'
148
+ # puts
149
+
150
+ # puts '--truncate'.pastel(:green)
151
+ # puts ' Truncate field length. On by default (4 rows). Performance issues!'
152
+ # puts ' Disable with --truncate=0'.pastel(:bright_red)
153
+ # puts ' Ex: --truncate=200, --truncate=2048"'
154
+ # puts
155
+
156
+ # puts 'Search specific logs'.pastel(:blue)
157
+ # puts ' Any non dash parameters will be the log list to search from'
158
+ # puts " Ex: log filter --path=api sidekiq/current (hint: use `#{'ls'.pastel(:yellow)}` for log names"
159
+ # puts
160
+
161
+ # puts 'General (Field) Searching'.pastel(:blue)
162
+ # puts " There are different ways filter within specific keys/fields within log. The baseline is #{'--[key]=[value]'.pastel(:green)}"
163
+ # puts ' This will, by default, select any entries with any partial match (case insensitive) of [value] in the entry [key]'
164
+ # puts ' Example: --path=mirror/pull'
165
+ # puts
166
+
167
+ # puts " You can modify logic with params like: #{'case'.pastel(:green)}, #{'exact'.pastel(:green)}"
168
+ # puts ' Ex Case turn on case sensitivity, exact will change from the inclusive to only exact matching.'
169
+ # puts
170
+
171
+ # puts " You can also use multiple #{'--[key]=[value]'.pastel(:green)} to narrow down, or combine it with #{'or'.pastel(:green)} to be more inclusive"
172
+ # puts ' Ex nginx/gitlab_access.log --http_user_agent=gitlab-runner --path=/api/v4/jobs/request'
173
+ # puts ' This will look through the access logs for anything that is a runner (user agent) and hitting the request endpoint'
174
+ # puts
175
+
176
+ # puts " You can also modify whether a field search excluded or a integer (and technically string) comparison by changing the operator: #{'(!= >= <=)'.pastel(:green)}"
177
+ # puts ' Ex "nginx/gitlab_access.log --http_user_agent=gitlab-runner --http_user_agent!=13.12.0" will exclude any entries with 13.12.0/13.12 runners'
178
+ # puts ' Ex "sidekiq/current --duration_s>=5 --class!=LdapSyncWorker" Duration over 5 that is not an ldap job'
179
+ # puts
180
+
181
+ # puts 'Pipe to Shell'.pastel(:blue)
182
+ # puts ' This is very experimental! The idea is to take all the output from the search and allow a pipe into a traditional shell command.'
183
+ # puts ' Due to the arg parsing its not a straight send to the terminal. You may need to escape quotes.'
184
+ # puts ' Order is relevant, no arguments after the pipe'
185
+ # puts
186
+ # puts ' <files> <params> | grep path'
187
+ # puts
188
+
189
+ # puts 'Example Queries'.pastel(:blue)
190
+ # puts " Also see #{'examples'.pastel(:bright_blue)} for even more examples"
191
+ # puts ' log filter --class=BuildFinishedWorker sidekiq/current --slice=time,message'
192
+ # puts ' log filter gitlab-rails/api_json.log --slice=ua --uniq=ua --ua=gitlab-runner'
193
+
194
+ # puts
195
+ # end
196
+
160
197
  def self.help_index
161
198
  {
162
199
  title: [
163
200
  "\u2500".pastel(:cyan) * 20,
164
201
  'Filter'.pastel(:yellow),
165
- "\u2500".pastel(:cyan) * 20
166
- ],
167
- options: [
202
+ "\u2500".pastel(:cyan) * 20,
203
+ '',
168
204
  'Options'.pastel(:blue)
169
205
  ],
170
206
 
@@ -202,7 +238,7 @@ module GreenHat
202
238
 
203
239
  total: [
204
240
  '--total'.pastel(:green),
205
- ' Print only total count of matching entries'
241
+ ' Show total count, duration, start/end time for matching entries'
206
242
  ],
207
243
 
208
244
  fields: [
@@ -335,11 +371,30 @@ module GreenHat
335
371
  ' Ex: --truncate=200, --truncate=2048"'
336
372
  ],
337
373
 
338
- field: [
339
- 'Field Searching'.pastel(:blue),
340
- ' --[key]=[value]',
341
- ' Search in key for value',
342
- ' Example: --path=mirror/pull'
374
+ field_search: [
375
+ 'General (Field) Searching'.pastel(:blue),
376
+ " There are different ways filter within specific keys/fields within log. The baseline is #{'--[key]=[value]'.pastel(:green)}",
377
+ ' This will, by default, select any entries with any partial match (case insensitive) of [value] in the entry [key]',
378
+ ' Example: --path=mirror/pull',
379
+ '',
380
+ " You can modify logic with params like: #{'case'.pastel(:green)}, #{'exact'.pastel(:green)}",
381
+ ' Ex Case turn on case sensitivity, exact will change from the inclusive to only exact matching.',
382
+ '',
383
+ " You can also use multiple #{'--[key]=[value]'.pastel(:green)} to narrow down, or combine it with #{'or'.pastel(:green)} to be more inclusive",
384
+ ' Ex nginx/gitlab_access.log --http_user_agent=gitlab-runner --path=/api/v4/jobs/request',
385
+ ' This will look through the access logs for anything that is a runner (user agent) and hitting the request endpoint',
386
+ '',
387
+ " You can also modify whether a field search excluded or a integer (and technically string) comparison by changing the operator: #{'(!= >= <=)'.pastel(:green)}",
388
+ ' Ex "nginx/gitlab_access.log --http_user_agent=gitlab-runner --http_user_agent!=13.12.0" will exclude any entries with 13.12.0/13.12 runners',
389
+ ' Ex "sidekiq/current --duration_s>=5 --class!=LdapSyncWorker" Duration over 5 that is not an ldap job'
390
+ ],
391
+
392
+ pipe_to_shell: [
393
+ 'Pipe to Shell'.pastel(:blue),
394
+ ' This is very experimental! The idea is to take all the output from the search and allow a pipe into a traditional shell command.',
395
+ ' Due to the arg parsing its not a straight send to the terminal. You may need to escape quotes.',
396
+ ' Order is relevant, no arguments after the pipe',
397
+ ' <files> <params> | grep path'
343
398
  ],
344
399
 
345
400
  ls: [
@@ -357,7 +412,7 @@ module GreenHat
357
412
 
358
413
  }
359
414
  end
360
- # rubocop:enable Metrics/MethodLength,Metrics/ModuleLength
415
+ # rubocop:enable Metrics/MethodLength,Layout/LineLength
361
416
  end
362
417
  end
363
418
  end
@@ -99,6 +99,7 @@ module GreenHat
99
99
  end
100
100
  end
101
101
  end
102
+
102
103
  # -----
103
104
  end
104
105
  end