stackeye 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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>