stackeye 0.1.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 (63) hide show
  1. checksums.yaml +7 -0
  2. data/.DS_Store +0 -0
  3. data/.fasterer.yml +19 -0
  4. data/.gitignore +13 -0
  5. data/.reek.yml +20 -0
  6. data/.rspec +3 -0
  7. data/.rubocop.yml +18 -0
  8. data/.travis.yml +5 -0
  9. data/CHANGELOG.md +11 -0
  10. data/CODE_OF_CONDUCT.md +74 -0
  11. data/Gemfile +8 -0
  12. data/Gemfile.lock +119 -0
  13. data/LICENSE.txt +21 -0
  14. data/README.md +92 -0
  15. data/Rakefile +8 -0
  16. data/app.rb +7 -0
  17. data/bin/console +15 -0
  18. data/bin/setup +9 -0
  19. data/examples/web-ui.png +0 -0
  20. data/lib/generators/stackeye/install_generator.rb +12 -0
  21. data/lib/generators/stackeye/templates/install.rb +5 -0
  22. data/lib/stackeye.rb +7 -0
  23. data/lib/stackeye/application.rb +32 -0
  24. data/lib/stackeye/configuration.rb +31 -0
  25. data/lib/stackeye/helpers/base.rb +56 -0
  26. data/lib/stackeye/helpers/init.rb +5 -0
  27. data/lib/stackeye/metrics/all.rb +25 -0
  28. data/lib/stackeye/metrics/base.rb +113 -0
  29. data/lib/stackeye/metrics/init.rb +5 -0
  30. data/lib/stackeye/metrics/mysql.rb +42 -0
  31. data/lib/stackeye/metrics/server.rb +74 -0
  32. data/lib/stackeye/public/fonts/feather.eot +0 -0
  33. data/lib/stackeye/public/fonts/feather.svg +1050 -0
  34. data/lib/stackeye/public/fonts/feather.ttf +0 -0
  35. data/lib/stackeye/public/fonts/feather.woff +0 -0
  36. data/lib/stackeye/public/images/favicon.ico +0 -0
  37. data/lib/stackeye/public/images/stackeye.png +0 -0
  38. data/lib/stackeye/public/images/ubuntu.svg +1 -0
  39. data/lib/stackeye/public/javascripts/3PL.js +15 -0
  40. data/lib/stackeye/public/javascripts/application.js +242 -0
  41. data/lib/stackeye/public/stylesheets/3PL.css +5 -0
  42. data/lib/stackeye/public/stylesheets/application.css +13 -0
  43. data/lib/stackeye/routes/base.rb +21 -0
  44. data/lib/stackeye/routes/init.rb +5 -0
  45. data/lib/stackeye/routes/metrics.rb +17 -0
  46. data/lib/stackeye/tools/cli.rb +27 -0
  47. data/lib/stackeye/tools/database.rb +69 -0
  48. data/lib/stackeye/tools/init.rb +5 -0
  49. data/lib/stackeye/tools/os.rb +48 -0
  50. data/lib/stackeye/version.rb +5 -0
  51. data/lib/stackeye/views/layout.erb +34 -0
  52. data/lib/stackeye/views/metrics/mysql/_queries.erb +73 -0
  53. data/lib/stackeye/views/metrics/mysql/index.erb +10 -0
  54. data/lib/stackeye/views/metrics/server/_cpu.erb +73 -0
  55. data/lib/stackeye/views/metrics/server/_disk.erb +35 -0
  56. data/lib/stackeye/views/metrics/server/_memory.erb +73 -0
  57. data/lib/stackeye/views/metrics/server/_processes.erb +52 -0
  58. data/lib/stackeye/views/metrics/server/index.erb +23 -0
  59. data/lib/stackeye/views/shared/_header.erb +20 -0
  60. data/lib/stackeye/views/shared/_navbar.erb +57 -0
  61. data/lib/stackeye/views/unsupported.erb +13 -0
  62. data/stackeye.gemspec +31 -0
  63. metadata +218 -0
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stackeye
4
+ VERSION = '0.1.0'
5
+ end
@@ -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,10 @@
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/mysql/_queries") %>
9
+ </div>
10
+ </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
+ 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>