greenhat 0.3.2 → 0.3.6

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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/lib/greenhat/accessors/disk.rb +42 -3
  3. data/lib/greenhat/accessors/gitlab.rb +30 -1
  4. data/lib/greenhat/accessors/memory.rb +1 -1
  5. data/lib/greenhat/archive.rb +11 -2
  6. data/lib/greenhat/cli.rb +37 -0
  7. data/lib/greenhat/host.rb +25 -37
  8. data/lib/greenhat/shell/args.rb +22 -9
  9. data/lib/greenhat/shell/faststats.rb +23 -3
  10. data/lib/greenhat/shell/field_helper.rb +1 -1
  11. data/lib/greenhat/shell/filter_help.rb +232 -9
  12. data/lib/greenhat/shell/log.rb +153 -9
  13. data/lib/greenhat/shell/markdown.rb +352 -0
  14. data/lib/greenhat/shell/old_search_helper.rb +54 -0
  15. data/lib/greenhat/shell/page.rb +1 -1
  16. data/lib/greenhat/shell/pipe.rb +31 -0
  17. data/lib/greenhat/shell/platform.rb +28 -0
  18. data/lib/greenhat/shell/report.rb +106 -25
  19. data/lib/greenhat/shell/shell_helper.rb +114 -106
  20. data/lib/greenhat/shell.rb +7 -0
  21. data/lib/greenhat/thing/file_types.rb +126 -7
  22. data/lib/greenhat/thing/formatters/json.rb +4 -0
  23. data/lib/greenhat/thing/formatters/kube_json.rb +36 -0
  24. data/lib/greenhat/thing/formatters/kube_nginx.rb +48 -0
  25. data/lib/greenhat/thing/formatters/kube_webservice.rb +51 -0
  26. data/lib/greenhat/thing/formatters/nginx.rb +6 -2
  27. data/lib/greenhat/thing/formatters/registry.rb +47 -0
  28. data/lib/greenhat/thing/formatters/time_space.rb +0 -16
  29. data/lib/greenhat/thing/helpers.rb +12 -0
  30. data/lib/greenhat/thing.rb +10 -0
  31. data/lib/greenhat/version.rb +1 -1
  32. data/lib/greenhat/views/api.slim +55 -0
  33. data/lib/greenhat/views/chart.slim +42 -0
  34. data/lib/greenhat/views/chart_template.slim +31 -0
  35. data/lib/greenhat/views/chartkick.js +21 -0
  36. data/lib/greenhat/views/css.slim +47 -0
  37. data/lib/greenhat/views/gitaly.slim +53 -0
  38. data/lib/greenhat/views/headers.slim +16 -0
  39. data/lib/greenhat/views/index-old.slim +51 -0
  40. data/lib/greenhat/views/index.slim +14 -14
  41. data/lib/greenhat/views/info.slim +17 -18
  42. data/lib/greenhat/views/production.slim +55 -0
  43. data/lib/greenhat/views/sidekiq.slim +55 -0
  44. data/lib/greenhat/views/time.slim +63 -0
  45. data/lib/greenhat/views/workhorse.slim +16 -0
  46. data/lib/greenhat/web/api.rb +94 -0
  47. data/lib/greenhat/web/chartkick_shim.rb +14 -0
  48. data/lib/greenhat/web/faststats.rb +44 -0
  49. data/lib/greenhat/web/gitaly.rb +65 -0
  50. data/lib/greenhat/web/helpers.rb +198 -0
  51. data/lib/greenhat/web/production.rb +104 -0
  52. data/lib/greenhat/web/sidekiq.rb +73 -0
  53. data/lib/greenhat/web/stats_helpers.rb +74 -0
  54. data/lib/greenhat/web/time.rb +36 -0
  55. data/lib/greenhat/web/workhorse.rb +43 -0
  56. data/lib/greenhat/web.rb +63 -19
  57. data/lib/greenhat.rb +1 -0
  58. metadata +73 -2
@@ -0,0 +1,51 @@
1
+ # Top
2
+ module GreenHat
3
+ # Log
4
+ module Formatters
5
+ # ==========================================================================
6
+ # Gitlab Tail Formatter
7
+ # ==========================================================================
8
+ def format_kube_webservice
9
+ # Revert to raw for cats
10
+ self.kind = :raw
11
+
12
+ output = {}
13
+ current_log = nil
14
+
15
+ raw.each do |line|
16
+ next if line.blank?
17
+
18
+ if line.include? '*** '
19
+ current_log = /\*\*\* (.+?) \*\*\*/.match(line).captures.first
20
+ else
21
+ output[current_log] ||= [] unless current_log.nil?
22
+ output[current_log].push line unless current_log.nil?
23
+ end
24
+ end
25
+
26
+ # Remove Empty Entries
27
+ output.reject { |_k, v| v.empty? }
28
+
29
+ # Root Dir
30
+ root_dir = "#{$TMP}/#{name}"
31
+ Dir.mkdir(root_dir)
32
+
33
+ # Write Files / Create Things
34
+ output.each do |k, v|
35
+ file_name = k.gsub('/var/log/gitlab/', '')
36
+
37
+ dir = "#{root_dir}/gitlab-rails"
38
+ Dir.mkdir(dir) unless File.exist?(dir)
39
+
40
+ File.write("#{root_dir}/#{file_name}", v.join("\n"))
41
+
42
+ # Thing Setup
43
+ archive.things_create(file: "#{root_dir}/#{file_name}").setup
44
+ end
45
+
46
+ # Link
47
+ self.result = raw
48
+ end
49
+ # ==========================================================================
50
+ end
51
+ end
@@ -7,10 +7,11 @@ module GreenHat
7
7
  # ==========================================================================
8
8
  def format_nginx
9
9
  self.result = raw.map do |row|
10
- ip, _sym, remote_user, rest = row.split(' ', 4)
10
+ conn_data, rest = row.split(' [', 2)
11
+ ip, _sym, remote_user = conn_data.split(' ', 3)
11
12
 
12
13
  time, rest = rest.split(']', 2)
13
- time = Time.strptime(time, '[%d/%b/%Y:%H:%M:%S %z')
14
+ time = Time.strptime(time, '%d/%b/%Y:%H:%M:%S %z')
14
15
 
15
16
  verb, status, bytes, http_referer, http_user_agent, gzip_ratio = Shellwords.split(rest)
16
17
 
@@ -29,6 +30,9 @@ module GreenHat
29
30
  gzip_ratio: gzip_ratio,
30
31
  time: time
31
32
  }
33
+ rescue StandardError => e
34
+ LogBot.warn('NGINX Parse', e.message)
35
+ { msg: row }
32
36
  end
33
37
 
34
38
  :ok
@@ -0,0 +1,47 @@
1
+ # Top
2
+ module GreenHat
3
+ # Log
4
+ module Formatters
5
+ # ==========================================================================
6
+ # Registry Split
7
+ # ==========================================================================
8
+ # https://docs.docker.com/registry/configuration/#log
9
+ # Formatters text, json
10
+ # registry['log_formatter'] = "json"
11
+ # TODO: Logstash (Not working in 14.3)
12
+
13
+ def format_time_registry
14
+ self.result = raw.map do |row|
15
+ result = row[0] == '{' ? registry_json(row) : registry_shell_words(row)
16
+
17
+ # Timestamp Parsing
18
+ result.ts = Time.parse result.ts if result.key? 'ts'
19
+ result.time = Time.parse(result.time)
20
+
21
+ result
22
+ end
23
+ end
24
+
25
+ def registry_shell_words(row)
26
+ time, msg = row.split(' ', 2)
27
+
28
+ output = Shellwords.split(msg).each_with_object({}) do |x, h|
29
+ key, value = x.split('=')
30
+ next if value.nil?
31
+
32
+ h[key.to_sym] = value.numeric? ? value.to_f : value
33
+ end
34
+
35
+ output[:time] = time
36
+
37
+ output
38
+ end
39
+
40
+ def registry_json(msg)
41
+ Oj.load(msg)
42
+ rescue EncodingError
43
+ { message: msg }
44
+ end
45
+ # ==========================================================================
46
+ end
47
+ end
@@ -18,19 +18,3 @@ module GreenHat
18
18
  # ==========================================================================
19
19
  end
20
20
  end
21
-
22
- # def time_space
23
- # IO.foreach(file) do |row|
24
- # time, msg = row.split(' ', 2)
25
- # result = {
26
- # time: parse_datetime(time), msg: msg, host: thing.host,
27
- # source: path_format
28
- # }
29
-
30
- # result[:time] ||= datetime
31
- # post result
32
- # rescue StandardError => e
33
- # puts "Unable to Parse, #{name}:#{e.message}"
34
- # post(time: datetime, msg: row, source: path_format, host: thing.host)
35
- # end
36
- # end
@@ -69,3 +69,15 @@ class FalseClass
69
69
  0
70
70
  end
71
71
  end
72
+
73
+ # https://stackoverflow.com/a/449322/1678507
74
+ class Time
75
+ # Time#round already exists with different meaning in Ruby 1.9
76
+ def round_off(seconds = 60)
77
+ Time.at((to_f / seconds).round * seconds).utc
78
+ end
79
+
80
+ def floor(seconds = 60)
81
+ Time.at((to_f / seconds).floor * seconds).utc
82
+ end
83
+ end
@@ -140,4 +140,14 @@ class Thing < Teron
140
140
 
141
141
  []
142
142
  end
143
+
144
+ def query_save(results, name)
145
+ self.archive = Archive.first
146
+ self.result = results
147
+ self.name = name
148
+ self.log = true
149
+ self.parsed = true
150
+ self.result_fields = field_processing
151
+ save!
152
+ end
143
153
  end
@@ -1,3 +1,3 @@
1
1
  module GreenHat
2
- VERSION = '0.3.2'.freeze
2
+ VERSION = '0.3.6'.freeze
3
3
  end
@@ -0,0 +1,55 @@
1
+ == slim :chart_template
2
+ .row
3
+ .chart-menu
4
+ ul.section.table-of-contents
5
+ li
6
+ a href="#top" Top
7
+ li
8
+ a href="#path" Path
9
+ li
10
+ a href="#time" Time
11
+
12
+ h3.white-text.center API
13
+
14
+ h4.col.s12.white-text.center id="top" Top
15
+ .col.s12.card.padding.z-depth-4
16
+ == bubble_chart(faststats_top('gitlab-rails/api_json.log', :project_stats), xtitle:'Duration', ytitle:'% Count', label: "Total", title: 'by Project')
17
+ .col.s12.padding
18
+ .legend X: Duration
19
+ .legend.red Y: % of total calls
20
+ .legend.blue Size: Total Calls
21
+
22
+
23
+ .col.s12.card.padding.z-depth-4
24
+ == bubble_chart(faststats_top('gitlab-rails/api_json.log', :user_stats), xtitle:'Duration', ytitle:'% Count', label: "Total", title: 'by User')
25
+ .col.s12.padding
26
+ .legend X: Duration
27
+ .legend.red Y: % of total calls
28
+ .legend.blue Size: Total Calls
29
+
30
+ .col.s12.card.padding.z-depth-4
31
+ == pie_chart(api_duration_pie, title: 'Duration Total')
32
+
33
+ h4.col.s12.white-text.center id="path" Path
34
+ .col.s12.card.padding.z-depth-4
35
+ == pie_chart(faststats_field('gitlab-rails/api_json.log', :count), title: 'Total by Path')
36
+
37
+ .col.s12.card.padding.z-depth-4
38
+ == column_chart(faststats_field('gitlab-rails/api_json.log',:p95), title: 'p95', ytitle: 'ms')
39
+
40
+ .col.s12.card.padding.z-depth-4
41
+ == column_chart(faststats_field('gitlab-rails/api_json.log',:median), title: 'Median', ytitle: 'ms')
42
+
43
+ h4.col.s12.white-text.center id="time" Over Time
44
+
45
+ .col.s12.card.padding.z-depth-4
46
+ == area_chart(api_avg_path_duration_series, title: 'Path Duration', ytitle: 'seconds')
47
+
48
+ .col.s12.card.padding.z-depth-4
49
+ == area_chart(api_avg_duration_series, title: 'Avg Duration', ytitle: 'ms')
50
+
51
+ .col.s12.card.padding.z-depth-4
52
+ == column_chart(api_duration_series_stacked, stacked: true, title: 'Duration Breakdown', ytitle: 'seconds')
53
+
54
+ .col.s12.card.padding.z-depth-4
55
+ == area_chart(api_duration_series_stacked, stacked: true, title: 'Duration Breakdown', ytitle: 'seconds')
@@ -0,0 +1,42 @@
1
+ doctype html
2
+ html
3
+ head
4
+ == slim :headers
5
+ body.grey.darken-4
6
+ == slim :css
7
+
8
+ nav.blue-grey.darken-4
9
+ .nav-wrapper
10
+ a.brand-logo.center href="/" Charts Home
11
+ ul.left.white-text
12
+ li
13
+ a href ='/'
14
+ .btn-flat.white-text
15
+ i.fa.fa-home.left.line-height
16
+ | Home
17
+
18
+ li
19
+ a href ='/chart'
20
+ .btn-flat.white-text
21
+ i.fa.fa-chart-pie.left.line-height
22
+ | Charts
23
+ li
24
+ a href ='/chart/time'
25
+ .btn-flat.white-text
26
+ i.fa.fa-chart-line.left.line-height
27
+ | Time Query
28
+
29
+ .container.padding
30
+ .row
31
+ h5.white-text.center Dashboards
32
+ .row
33
+ .col.s4.padding
34
+ a.blue.btn-large.chart-btn href="/charts/gitaly" Gitaly
35
+ .col.s4.padding
36
+ a.green.btn-large.chart-btn href="/charts/sidekiq" Sidekiq
37
+ .col.s4.padding
38
+ a.red.btn-large.chart-btn href="/charts/api" Api
39
+ .col.s4.padding
40
+ a.purple.btn-large.chart-btn href="/charts/production" Production
41
+ .col.s4.padding
42
+ a.teal.btn-large.chart-btn href="/charts/workhorse" Workhorse
@@ -0,0 +1,31 @@
1
+ doctype html
2
+ html
3
+ head
4
+ == slim :headers
5
+
6
+ body.grey.darken-4
7
+ == slim :css
8
+
9
+ nav.blue-grey.darken-4
10
+ .nav-wrapper
11
+ a.brand-logo.center href="/" Charts Home
12
+ ul.left.white-text
13
+ li
14
+ a href ='/'
15
+ .btn-flat.white-text
16
+ i.fa.fa-home.left.line-height
17
+ | Home
18
+
19
+ li
20
+ a href ='/chart'
21
+ .btn-flat.white-text
22
+ i.fa.fa-chart-pie.left.line-height
23
+ | Charts
24
+ li
25
+ a href ='/chart/time'
26
+ .btn-flat.white-text
27
+ i.fa.fa-chart-line.left.line-height
28
+ | Time Query
29
+
30
+ .container.padding
31
+ == yield