stackeye 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.DS_Store +0 -0
- data/.fasterer.yml +19 -0
- data/.gitignore +13 -0
- data/.reek.yml +20 -0
- data/.rspec +3 -0
- data/.rubocop.yml +18 -0
- data/.travis.yml +5 -0
- data/CHANGELOG.md +11 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +119 -0
- data/LICENSE.txt +21 -0
- data/README.md +92 -0
- data/Rakefile +8 -0
- data/app.rb +7 -0
- data/bin/console +15 -0
- data/bin/setup +9 -0
- data/examples/web-ui.png +0 -0
- data/lib/generators/stackeye/install_generator.rb +12 -0
- data/lib/generators/stackeye/templates/install.rb +5 -0
- data/lib/stackeye.rb +7 -0
- data/lib/stackeye/application.rb +32 -0
- data/lib/stackeye/configuration.rb +31 -0
- data/lib/stackeye/helpers/base.rb +56 -0
- data/lib/stackeye/helpers/init.rb +5 -0
- data/lib/stackeye/metrics/all.rb +25 -0
- data/lib/stackeye/metrics/base.rb +113 -0
- data/lib/stackeye/metrics/init.rb +5 -0
- data/lib/stackeye/metrics/mysql.rb +42 -0
- data/lib/stackeye/metrics/server.rb +74 -0
- data/lib/stackeye/public/fonts/feather.eot +0 -0
- data/lib/stackeye/public/fonts/feather.svg +1050 -0
- data/lib/stackeye/public/fonts/feather.ttf +0 -0
- data/lib/stackeye/public/fonts/feather.woff +0 -0
- data/lib/stackeye/public/images/favicon.ico +0 -0
- data/lib/stackeye/public/images/stackeye.png +0 -0
- data/lib/stackeye/public/images/ubuntu.svg +1 -0
- data/lib/stackeye/public/javascripts/3PL.js +15 -0
- data/lib/stackeye/public/javascripts/application.js +242 -0
- data/lib/stackeye/public/stylesheets/3PL.css +5 -0
- data/lib/stackeye/public/stylesheets/application.css +13 -0
- data/lib/stackeye/routes/base.rb +21 -0
- data/lib/stackeye/routes/init.rb +5 -0
- data/lib/stackeye/routes/metrics.rb +17 -0
- data/lib/stackeye/tools/cli.rb +27 -0
- data/lib/stackeye/tools/database.rb +69 -0
- data/lib/stackeye/tools/init.rb +5 -0
- data/lib/stackeye/tools/os.rb +48 -0
- data/lib/stackeye/version.rb +5 -0
- data/lib/stackeye/views/layout.erb +34 -0
- data/lib/stackeye/views/metrics/mysql/_queries.erb +73 -0
- data/lib/stackeye/views/metrics/mysql/index.erb +10 -0
- data/lib/stackeye/views/metrics/server/_cpu.erb +73 -0
- data/lib/stackeye/views/metrics/server/_disk.erb +35 -0
- data/lib/stackeye/views/metrics/server/_memory.erb +73 -0
- data/lib/stackeye/views/metrics/server/_processes.erb +52 -0
- data/lib/stackeye/views/metrics/server/index.erb +23 -0
- data/lib/stackeye/views/shared/_header.erb +20 -0
- data/lib/stackeye/views/shared/_navbar.erb +57 -0
- data/lib/stackeye/views/unsupported.erb +13 -0
- data/stackeye.gemspec +31 -0
- metadata +218 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
<!doctype html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<!-- Metatags -->
|
5
|
+
<meta charset="utf-8">
|
6
|
+
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
|
7
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
8
|
+
<meta http-equiv="cleartype" content="on">
|
9
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover">
|
10
|
+
<link rel="shortcut icon" href="<%= base_path %>/images/favicon.ico" type="image/x-icon">
|
11
|
+
<% if refreshing? %>
|
12
|
+
<meta http-equiv="refresh" content="60">
|
13
|
+
<% end %>
|
14
|
+
<title>Stackeye</title>
|
15
|
+
|
16
|
+
<!-- Stylesheets -->
|
17
|
+
<link rel="stylesheet" href="<%= base_path %>/stylesheets/3PL.css">
|
18
|
+
<link rel="stylesheet" href="<%= base_path %>/stylesheets/application.css">
|
19
|
+
</head>
|
20
|
+
<body>
|
21
|
+
<!-- Components -->
|
22
|
+
<%= erb(:"shared/_navbar") %>
|
23
|
+
|
24
|
+
<div class="main-content">
|
25
|
+
<div class="container-fluid">
|
26
|
+
<%= yield %>
|
27
|
+
</div>
|
28
|
+
</div>
|
29
|
+
|
30
|
+
<!-- Javascripts -->
|
31
|
+
<script src="<%= base_path %>/javascripts/3PL.js"></script>
|
32
|
+
<script src="<%= base_path %>/javascripts/application.js"></script>
|
33
|
+
</body>
|
34
|
+
</html>
|
@@ -0,0 +1,73 @@
|
|
1
|
+
<div class="card">
|
2
|
+
<div class="card-header">
|
3
|
+
<div class="row align-items-center">
|
4
|
+
<div class="col">
|
5
|
+
<h4 class="card-header-title">
|
6
|
+
Queries
|
7
|
+
</h4>
|
8
|
+
</div>
|
9
|
+
<div class="col-auto">
|
10
|
+
<ul class="nav nav-tabs nav-tabs-sm card-header-tabs">
|
11
|
+
<% { velocity: { label: "Velocity", suffix: "/sec" }, slow_queries: { label: "Slow" } }.each_with_index do |(metric, opts), i| %>
|
12
|
+
<li class="nav-item"
|
13
|
+
data-toggle="chart"
|
14
|
+
data-type="time"
|
15
|
+
data-target="queries_chart"
|
16
|
+
data-metrics="<%= @metrics.pluck(metric.to_s) %>"
|
17
|
+
data-mean="<%= @metrics.mean(metric.to_s).round(1) %>"
|
18
|
+
data-timestamps="<%= @metrics.pluck('timestamp') %>"
|
19
|
+
data-suffix="<%= opts[:suffix] %>"
|
20
|
+
data-expand="#card_<%= metric %>"
|
21
|
+
data-contract=".card-contract-queries">
|
22
|
+
<a class="nav-link <%= :active if i.zero? %>" href="#" data-toggle="tab">
|
23
|
+
<%= opts[:label] %>
|
24
|
+
</a>
|
25
|
+
</li>
|
26
|
+
<% end %>
|
27
|
+
</ul>
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
<div class="card-body">
|
32
|
+
<div class="chart">
|
33
|
+
<canvas id="queries_chart"
|
34
|
+
class="chart-canvas chartjs-render-monitor"
|
35
|
+
width="1816"
|
36
|
+
height="600"
|
37
|
+
style="display: block; height: 300px; width: 908px;">
|
38
|
+
</canvas>
|
39
|
+
</div>
|
40
|
+
<div class="chart-legend">
|
41
|
+
<% { primary: "Metric", dark: "Average" }.each do |color, label| %>
|
42
|
+
<span class="chart-legend-item">
|
43
|
+
<i class="chart-legend-indicator bg-<%= color %>"></i>
|
44
|
+
<%= label %>
|
45
|
+
</span>
|
46
|
+
<% end %>
|
47
|
+
</div>
|
48
|
+
</div>
|
49
|
+
</div>
|
50
|
+
|
51
|
+
<% %w[velocity slow_queries].each_with_index do |metric, i| %>
|
52
|
+
<div class="row <%= 'd-none' unless i.zero? %> card-contract-queries" id="card_<%= metric %>">
|
53
|
+
<% %w[mean median mode range].each do |action| %>
|
54
|
+
<div class="col-12 col-lg-6 col-xl">
|
55
|
+
<div class="card">
|
56
|
+
<div class="card-body">
|
57
|
+
<div class="row align-items-center">
|
58
|
+
<div class="col">
|
59
|
+
<h6 class="card-title text-uppercase text-muted mb-2">
|
60
|
+
<%= titleize(metric) %>
|
61
|
+
<%= titleize(action) %>
|
62
|
+
</h6>
|
63
|
+
<span class="h2 mb-0">
|
64
|
+
<%= @metrics.send(action, metric).round(1) %><%= '/sec' if i.zero? %>
|
65
|
+
</span>
|
66
|
+
</div>
|
67
|
+
</div>
|
68
|
+
</div>
|
69
|
+
</div>
|
70
|
+
</div>
|
71
|
+
<% end %>
|
72
|
+
</div>
|
73
|
+
<% end %>
|
@@ -0,0 +1,73 @@
|
|
1
|
+
<div class="card">
|
2
|
+
<div class="card-header">
|
3
|
+
<div class="row align-items-center">
|
4
|
+
<div class="col">
|
5
|
+
<h4 class="card-header-title">
|
6
|
+
CPU
|
7
|
+
</h4>
|
8
|
+
</div>
|
9
|
+
<div class="col-auto">
|
10
|
+
<ul class="nav nav-tabs nav-tabs-sm card-header-tabs">
|
11
|
+
<% { cpu_load_1m: { label: "CPU load 1m" }, cpu_utilization: { label: "CPU utilization", suffix: "%" } }.each_with_index do |(metric, opts), i| %>
|
12
|
+
<li class="nav-item"
|
13
|
+
data-toggle="chart"
|
14
|
+
data-type="time"
|
15
|
+
data-target="cpu_chart"
|
16
|
+
data-metrics="<%= @metrics.pluck(metric.to_s) %>"
|
17
|
+
data-mean="<%= @metrics.mean(metric.to_s).round(1) %>"
|
18
|
+
data-timestamps="<%= @metrics.pluck('timestamp') %>"
|
19
|
+
data-suffix="<%= opts[:suffix] %>"
|
20
|
+
data-expand="#card_<%= metric %>"
|
21
|
+
data-contract=".card-contract-cpu">
|
22
|
+
<a class="nav-link <%= :active if i.zero? %>" href="#" data-toggle="tab">
|
23
|
+
<%= opts[:label] %>
|
24
|
+
</a>
|
25
|
+
</li>
|
26
|
+
<% end %>
|
27
|
+
</ul>
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
<div class="card-body">
|
32
|
+
<div class="chart">
|
33
|
+
<canvas id="cpu_chart"
|
34
|
+
class="chart-canvas chartjs-render-monitor"
|
35
|
+
width="1816"
|
36
|
+
height="600"
|
37
|
+
style="display: block; height: 300px; width: 908px;">
|
38
|
+
</canvas>
|
39
|
+
</div>
|
40
|
+
<div class="chart-legend">
|
41
|
+
<% { primary: "Metric", dark: "Average" }.each do |color, label| %>
|
42
|
+
<span class="chart-legend-item">
|
43
|
+
<i class="chart-legend-indicator bg-<%= color %>"></i>
|
44
|
+
<%= label %>
|
45
|
+
</span>
|
46
|
+
<% end %>
|
47
|
+
</div>
|
48
|
+
</div>
|
49
|
+
</div>
|
50
|
+
|
51
|
+
<% %w[cpu_load_1m cpu_utilization].each_with_index do |metric, i| %>
|
52
|
+
<div class="row <%= 'd-none' unless i.zero? %> card-contract-cpu" id="card_<%= metric %>">
|
53
|
+
<% %w[mean median mode range].each do |action| %>
|
54
|
+
<div class="col-12 col-lg-6 col-xl">
|
55
|
+
<div class="card">
|
56
|
+
<div class="card-body">
|
57
|
+
<div class="row align-items-center">
|
58
|
+
<div class="col">
|
59
|
+
<h6 class="card-title text-uppercase text-muted mb-2">
|
60
|
+
<%= titleize(metric) %>
|
61
|
+
<%= titleize(action) %>
|
62
|
+
</h6>
|
63
|
+
<span class="h2 mb-0">
|
64
|
+
<%= @metrics.send(action, metric).round(1) %><%= '%' unless i.zero? %>
|
65
|
+
</span>
|
66
|
+
</div>
|
67
|
+
</div>
|
68
|
+
</div>
|
69
|
+
</div>
|
70
|
+
</div>
|
71
|
+
<% end %>
|
72
|
+
</div>
|
73
|
+
<% end %>
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<div class="card">
|
2
|
+
<div class="card-header">
|
3
|
+
<div class="row align-items-center">
|
4
|
+
<div class="col">
|
5
|
+
<h4 class="card-header-title">
|
6
|
+
Disk
|
7
|
+
</h4>
|
8
|
+
</div>
|
9
|
+
</div>
|
10
|
+
</div>
|
11
|
+
<div class="card-body">
|
12
|
+
<div class="chart chart-appended">
|
13
|
+
<canvas id="disk-chart"
|
14
|
+
class="chart-canvas chartjs-render-monitor"
|
15
|
+
data-toggle="chart"
|
16
|
+
data-target="disk-chart"
|
17
|
+
data-type="doughnut"
|
18
|
+
data-labels='["Free", "Used"]'
|
19
|
+
data-metrics="[<%= @metrics.pluck('disk_free').first %>, <%= @metrics.pluck('disk_used').first %>]"
|
20
|
+
data-suffix="GB"
|
21
|
+
width="506"
|
22
|
+
height="482"
|
23
|
+
style="display: block; height: 241px; width: 253px;">
|
24
|
+
</canvas>
|
25
|
+
</div>
|
26
|
+
<div class="chart-legend">
|
27
|
+
<% { primary: "Free", dark: "Used" }.each do |color, label| %>
|
28
|
+
<span class="chart-legend-item">
|
29
|
+
<i class="chart-legend-indicator bg-<%= color %>"></i>
|
30
|
+
<%= label %>
|
31
|
+
</span>
|
32
|
+
<% end %>
|
33
|
+
</div>
|
34
|
+
</div>
|
35
|
+
</div>
|
@@ -0,0 +1,73 @@
|
|
1
|
+
<div class="card">
|
2
|
+
<div class="card-header">
|
3
|
+
<div class="row align-items-center">
|
4
|
+
<div class="col">
|
5
|
+
<h4 class="card-header-title">
|
6
|
+
Memory
|
7
|
+
</h4>
|
8
|
+
</div>
|
9
|
+
<div class="col-auto">
|
10
|
+
<ul class="nav nav-tabs nav-tabs-sm card-header-tabs">
|
11
|
+
<% { memory_used: { label: "Memory used", suffix: "GB" }, swap_used: { label: "Swap used", suffix: "GB" } }.each_with_index do |(metric, opts), i| %>
|
12
|
+
<li class="nav-item"
|
13
|
+
data-toggle="chart"
|
14
|
+
data-type="time"
|
15
|
+
data-target="memory_chart"
|
16
|
+
data-metrics="<%= @metrics.pluck(metric.to_s) %>"
|
17
|
+
data-mean="<%= @metrics.mean(metric.to_s).round(1) %>"
|
18
|
+
data-timestamps="<%= @metrics.pluck('timestamp') %>"
|
19
|
+
data-suffix="<%= opts[:suffix] %>"
|
20
|
+
data-expand="#card_<%= metric %>"
|
21
|
+
data-contract=".card-contract-memory">
|
22
|
+
<a class="nav-link <%= :active if i.zero? %>" href="#" data-toggle="tab">
|
23
|
+
<%= opts[:label] %>
|
24
|
+
</a>
|
25
|
+
</li>
|
26
|
+
<% end %>
|
27
|
+
</ul>
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
<div class="card-body">
|
32
|
+
<div class="chart">
|
33
|
+
<canvas id="memory_chart"
|
34
|
+
class="chart-canvas chartjs-render-monitor"
|
35
|
+
width="1816"
|
36
|
+
height="600"
|
37
|
+
style="display: block; height: 300px; width: 908px;">
|
38
|
+
</canvas>
|
39
|
+
</div>
|
40
|
+
<div class="chart-legend">
|
41
|
+
<% { primary: "Metric", dark: "Average" }.each do |color, label| %>
|
42
|
+
<span class="chart-legend-item">
|
43
|
+
<i class="chart-legend-indicator bg-<%= color %>"></i>
|
44
|
+
<%= label %>
|
45
|
+
</span>
|
46
|
+
<% end %>
|
47
|
+
</div>
|
48
|
+
</div>
|
49
|
+
</div>
|
50
|
+
|
51
|
+
<% %w[memory_used swap_used].each_with_index do |metric, i| %>
|
52
|
+
<div class="row <%= 'd-none' unless i.zero? %> card-contract-memory" id="card_<%= metric %>">
|
53
|
+
<% %w[mean median mode range].each do |action| %>
|
54
|
+
<div class="col-12 col-lg-6 col-xl">
|
55
|
+
<div class="card">
|
56
|
+
<div class="card-body">
|
57
|
+
<div class="row align-items-center">
|
58
|
+
<div class="col">
|
59
|
+
<h6 class="card-title text-uppercase text-muted mb-2">
|
60
|
+
<%= titleize(metric) %>
|
61
|
+
<%= titleize(action) %>
|
62
|
+
</h6>
|
63
|
+
<span class="h2 mb-0">
|
64
|
+
<%= @metrics.send(action, metric).round(1) %>GB
|
65
|
+
</span>
|
66
|
+
</div>
|
67
|
+
</div>
|
68
|
+
</div>
|
69
|
+
</div>
|
70
|
+
</div>
|
71
|
+
<% end %>
|
72
|
+
</div>
|
73
|
+
<% end %>
|
@@ -0,0 +1,52 @@
|
|
1
|
+
<div class="card">
|
2
|
+
<div class="card-header">
|
3
|
+
<div class="row align-items-center">
|
4
|
+
<div class="col">
|
5
|
+
<h4 class="card-header-title">
|
6
|
+
Top 10 processes
|
7
|
+
</h4>
|
8
|
+
</div>
|
9
|
+
<div class="col-auto">
|
10
|
+
<ul class="nav nav-tabs nav-tabs-sm card-header-tabs">
|
11
|
+
<% { cpu_processes: "CPU", memory_processes: "Memory" }.each_with_index do |(metric, label), i| %>
|
12
|
+
<li class="nav-item"
|
13
|
+
data-expand="#card_<%= metric %>"
|
14
|
+
data-contract=".card-contract-process">
|
15
|
+
<a class="nav-link <%= :active if i.zero? %>" href="#" data-toggle="tab">
|
16
|
+
<%= label %>
|
17
|
+
</a>
|
18
|
+
</li>
|
19
|
+
<% end %>
|
20
|
+
</ul>
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
</div>
|
24
|
+
<div class="table-responsive mb-0">
|
25
|
+
<table class="table table-sm table-nowrap card-table">
|
26
|
+
<thead>
|
27
|
+
<tr>
|
28
|
+
<% %w[USER UID COMMAND PID %CPU %MEM].each do |header| %>
|
29
|
+
<th class="text-muted">
|
30
|
+
<%= header %>
|
31
|
+
</th>
|
32
|
+
<% end %>
|
33
|
+
</tr>
|
34
|
+
</thead>
|
35
|
+
<% %w[cpu_processes memory_processes].each_with_index do |metric, i| %>
|
36
|
+
<tbody class="<%= 'd-none' unless i.zero? %> card-contract-process" id="card_<%= metric %>">
|
37
|
+
<% processes = @metrics.pluck(metric).first %>
|
38
|
+
|
39
|
+
<% unless processes.nil? %>
|
40
|
+
<% processes.each do |process| %>
|
41
|
+
<tr>
|
42
|
+
<% process.each do |cell| %>
|
43
|
+
<td><%= cell %></td>
|
44
|
+
<% end %>
|
45
|
+
</tr>
|
46
|
+
<% end %>
|
47
|
+
<% end %>
|
48
|
+
</tbody>
|
49
|
+
<% end %>
|
50
|
+
</table>
|
51
|
+
</div>
|
52
|
+
</div>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<div class="row">
|
2
|
+
<div class="col-12 col-xl-12">
|
3
|
+
<%= erb(:"shared/_header") %>
|
4
|
+
</div>
|
5
|
+
</div>
|
6
|
+
<div class="row">
|
7
|
+
<div class="col-12 col-xl-12">
|
8
|
+
<%= erb(:"metrics/server/_cpu") %>
|
9
|
+
</div>
|
10
|
+
</div>
|
11
|
+
<div class="row">
|
12
|
+
<div class="col-12 col-xl-12">
|
13
|
+
<%= erb(:"metrics/server/_memory") %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
<div class="row">
|
17
|
+
<div class="col-12 col-xl-4">
|
18
|
+
<%= erb(:"metrics/server/_disk") %>
|
19
|
+
</div>
|
20
|
+
<div class="col-12 col-xl-8">
|
21
|
+
<%= erb(:"metrics/server/_processes") %>
|
22
|
+
</div>
|
23
|
+
</div>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<div class="header">
|
2
|
+
<div class="header-body">
|
3
|
+
<div class="row align-items-end">
|
4
|
+
<div class="col">
|
5
|
+
<h6 class="header-pretitle">
|
6
|
+
Metrics
|
7
|
+
</h6>
|
8
|
+
<h1 class="header-title">
|
9
|
+
<%= @title %>
|
10
|
+
</h1>
|
11
|
+
</div>
|
12
|
+
<div class="col-auto">
|
13
|
+
<a href="<%= base_path %>/refresh" class="btn <%= refreshing? ? 'btn-outline-danger' : 'btn-success' %>">
|
14
|
+
<span class="fe fe-rotate-cw"></span>
|
15
|
+
Auto-Refresh
|
16
|
+
</a>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
</div>
|
@@ -0,0 +1,57 @@
|
|
1
|
+
<nav class="navbar navbar-vertical fixed-left navbar-expand-md navbar-light bg-white">
|
2
|
+
<div class="container-fluid">
|
3
|
+
<button class="navbar-toggler collapsed" type="button" data-toggle="collapse" data-target="#sidebarCollapse" aria-controls="sidebarCollapse" aria-expanded="false" aria-label="Toggle navigation">
|
4
|
+
<span class="navbar-toggler-icon"></span>
|
5
|
+
</button>
|
6
|
+
<a class="navbar-brand" href="<%= base_path %>/server">
|
7
|
+
<img src="<%= base_path %>/images/stackeye.png" class="navbar-brand-img mx-auto" alt="Stackeye">
|
8
|
+
</a>
|
9
|
+
<div class="navbar-user d-md-none">
|
10
|
+
<!-- Nothing -->
|
11
|
+
</div>
|
12
|
+
<div class="navbar-collapse collapse" id="sidebarCollapse" style="">
|
13
|
+
<hr class="my-3 d-none d-sm-block">
|
14
|
+
<h6 class="navbar-heading text-muted">
|
15
|
+
Metrics
|
16
|
+
</h6>
|
17
|
+
<ul class="navbar-nav">
|
18
|
+
<% Stackeye.configuration.metrics.each do |metric| %>
|
19
|
+
<li class="nav-item">
|
20
|
+
<a class='nav-link <%= :active if page?("/#{metric}") %>'
|
21
|
+
href="<%= base_path %>/<%= metric %>">
|
22
|
+
<i class="fe fe-<%= metric_icon_decorator(metric) %>"></i>
|
23
|
+
<%= metric_name_decorator(metric) %>
|
24
|
+
</a>
|
25
|
+
</li>
|
26
|
+
<% end %>
|
27
|
+
</ul>
|
28
|
+
<hr class="my-3">
|
29
|
+
<h6 class="navbar-heading text-muted">
|
30
|
+
Documentation
|
31
|
+
</h6>
|
32
|
+
<ul class="navbar-nav mb-md-3">
|
33
|
+
<li class="nav-item">
|
34
|
+
<a class="nav-link" target="_blank" href="https://github.com/drexed/stackeye">
|
35
|
+
<i class="fe fe-clipboard"></i>
|
36
|
+
Getting started
|
37
|
+
</a>
|
38
|
+
</li>
|
39
|
+
<li class="nav-item">
|
40
|
+
<a class="nav-link" target="_blank" href="https://github.com/drexed/stackeye/blob/master/CHANGELOG.md">
|
41
|
+
<i class="fe fe-git-branch"></i>
|
42
|
+
Changelog
|
43
|
+
<span class="badge badge-primary ml-auto">
|
44
|
+
v<%= Stackeye::VERSION %>
|
45
|
+
</span>
|
46
|
+
</a>
|
47
|
+
</li>
|
48
|
+
</ul>
|
49
|
+
<hr class="my-3">
|
50
|
+
<h6 class="navbar-heading text-muted text-center">
|
51
|
+
Built with
|
52
|
+
<i class="fe fe-heart text-danger"></i>
|
53
|
+
by Drexed
|
54
|
+
</h6>
|
55
|
+
</div>
|
56
|
+
</div>
|
57
|
+
</nav>
|