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.
- checksums.yaml +4 -4
- data/lib/greenhat/accessors/disk.rb +42 -3
- data/lib/greenhat/accessors/gitlab.rb +30 -1
- data/lib/greenhat/accessors/memory.rb +1 -1
- data/lib/greenhat/archive.rb +11 -2
- data/lib/greenhat/cli.rb +37 -0
- data/lib/greenhat/host.rb +25 -37
- data/lib/greenhat/shell/args.rb +22 -9
- data/lib/greenhat/shell/faststats.rb +23 -3
- data/lib/greenhat/shell/field_helper.rb +1 -1
- data/lib/greenhat/shell/filter_help.rb +232 -9
- data/lib/greenhat/shell/log.rb +153 -9
- data/lib/greenhat/shell/markdown.rb +352 -0
- data/lib/greenhat/shell/old_search_helper.rb +54 -0
- data/lib/greenhat/shell/page.rb +1 -1
- data/lib/greenhat/shell/pipe.rb +31 -0
- data/lib/greenhat/shell/platform.rb +28 -0
- data/lib/greenhat/shell/report.rb +106 -25
- data/lib/greenhat/shell/shell_helper.rb +114 -106
- data/lib/greenhat/shell.rb +7 -0
- data/lib/greenhat/thing/file_types.rb +126 -7
- data/lib/greenhat/thing/formatters/json.rb +4 -0
- data/lib/greenhat/thing/formatters/kube_json.rb +36 -0
- data/lib/greenhat/thing/formatters/kube_nginx.rb +48 -0
- data/lib/greenhat/thing/formatters/kube_webservice.rb +51 -0
- data/lib/greenhat/thing/formatters/nginx.rb +6 -2
- data/lib/greenhat/thing/formatters/registry.rb +47 -0
- data/lib/greenhat/thing/formatters/time_space.rb +0 -16
- data/lib/greenhat/thing/helpers.rb +12 -0
- data/lib/greenhat/thing.rb +10 -0
- data/lib/greenhat/version.rb +1 -1
- data/lib/greenhat/views/api.slim +55 -0
- data/lib/greenhat/views/chart.slim +42 -0
- data/lib/greenhat/views/chart_template.slim +31 -0
- data/lib/greenhat/views/chartkick.js +21 -0
- data/lib/greenhat/views/css.slim +47 -0
- data/lib/greenhat/views/gitaly.slim +53 -0
- data/lib/greenhat/views/headers.slim +16 -0
- data/lib/greenhat/views/index-old.slim +51 -0
- data/lib/greenhat/views/index.slim +14 -14
- data/lib/greenhat/views/info.slim +17 -18
- data/lib/greenhat/views/production.slim +55 -0
- data/lib/greenhat/views/sidekiq.slim +55 -0
- data/lib/greenhat/views/time.slim +63 -0
- data/lib/greenhat/views/workhorse.slim +16 -0
- data/lib/greenhat/web/api.rb +94 -0
- data/lib/greenhat/web/chartkick_shim.rb +14 -0
- data/lib/greenhat/web/faststats.rb +44 -0
- data/lib/greenhat/web/gitaly.rb +65 -0
- data/lib/greenhat/web/helpers.rb +198 -0
- data/lib/greenhat/web/production.rb +104 -0
- data/lib/greenhat/web/sidekiq.rb +73 -0
- data/lib/greenhat/web/stats_helpers.rb +74 -0
- data/lib/greenhat/web/time.rb +36 -0
- data/lib/greenhat/web/workhorse.rb +43 -0
- data/lib/greenhat/web.rb +63 -19
- data/lib/greenhat.rb +1 -0
- 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
|
-
|
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, '
|
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
|
data/lib/greenhat/thing.rb
CHANGED
@@ -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
|
data/lib/greenhat/version.rb
CHANGED
@@ -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
|