diff --git a/Gemfile b/Gemfile index 903d0d08..3e6af523 100644 --- a/Gemfile +++ b/Gemfile @@ -95,3 +95,7 @@ gem "httparty", "~> 0.22.0" gem "redcarpet", "~> 3.6" gem "rubyzip", "~> 2.3" + +gem "chartkick", "~> 5.1" + +gem "groupdate", "~> 6.5" diff --git a/Gemfile.lock b/Gemfile.lock index 293cf19a..7524b1cc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -111,6 +111,7 @@ GEM rack-test (>= 0.6.3) regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) + chartkick (5.1.2) chronic (0.10.2) chunky_png (1.4.0) coderay (1.1.3) @@ -177,6 +178,8 @@ GEM activerecord (>= 4.0.0) globalid (1.2.1) activesupport (>= 6.1) + groupdate (6.5.1) + activesupport (>= 7) hashdiff (1.0.1) hashie (5.0.0) http (5.2.0) @@ -518,11 +521,13 @@ DEPENDENCIES bootsnap brakeman capybara + chartkick (~> 5.1) cssbundling-rails debug devise (~> 4.9) dotenv (~> 3.1) friendly_id (~> 5.4) + groupdate (~> 6.5) httparty (~> 0.22.0) image_processing (~> 1.13) importmap-rails diff --git a/Procfile.dev b/Procfile.dev index a43b0e8b..61641ddc 100644 --- a/Procfile.dev +++ b/Procfile.dev @@ -1,4 +1,4 @@ web: bin/rails server -p 3000 worker: bundle exec sidekiq -js: yarn build --reload +js: yarn build --watch css: bin/rails tailwindcss:watch diff --git a/app/javascript/apex/index.js b/app/javascript/apex/index.js deleted file mode 100644 index 8b6da8fe..00000000 --- a/app/javascript/apex/index.js +++ /dev/null @@ -1,75 +0,0 @@ -import ApexCharts from "apexcharts"; -const ORDERED_COLORS = [ - "#a25772", - "#3e5eff" -]; - - -class Apex { - constructor(element, datasets) { - this.element = element; - this.datasets = datasets; - this.xAxis = this.datasets.map(d => d.metrics.map(m => new Date(m.created_at))).flat().sort(); - } - - options() { - return { - chart: { - events: { - mounted: (c) => c.windowResizeHandler(), - }, - type: "line", - height: 400, - background: "transparent", - toolbar: { - show: true, - tools: { - download: true, - zoom: false, - zoomin: false, - zoomout: false, - pan: false, - reset: false, - }, - }, - group: "metrics", - }, - theme: { - mode: 'dark', - }, - stroke: { - width: 2, - }, - xaxis: { - categories: this.xAxis, - }, - series: this.datasets.map((dataset) => { - let data = dataset.metrics - if (dataset.type === "size") { - data = data.map(m => m.value) - } else { - data = data.map(m => m.value) - } - return { - name: dataset.name, - data, - } - }) - } - }; - - createSeriesData(data, index) { - return [{ - name: data.name, - data: data.data, - color: ORDERED_COLORS[index], - }]; - } - - render() { - var chart = new ApexCharts(this.element, this.options()); - chart.render() - return chart; - } -} -export default Apex; diff --git a/app/javascript/application.js b/app/javascript/application.js index 2ae7ca54..9392b1c3 100644 --- a/app/javascript/application.js +++ b/app/javascript/application.js @@ -12,4 +12,4 @@ require("@rails/ujs").start() import './channels/**/*_channel.js' import "./controllers" -import "./apex" +import "chartkick/chart.js" diff --git a/app/javascript/controllers/chart_controller.js b/app/javascript/controllers/chart_controller.js deleted file mode 100644 index 0405cc26..00000000 --- a/app/javascript/controllers/chart_controller.js +++ /dev/null @@ -1,12 +0,0 @@ -import Apex from "../apex"; -import { Controller } from "@hotwired/stimulus" - -export default class extends Controller { - static values = { - dataset: Array, - } - - connect() { - new Apex(this.element, this.datasetValue).render(); - } -} diff --git a/app/javascript/controllers/refresh_turbo_frame_controller.js b/app/javascript/controllers/refresh_turbo_frame_controller.js new file mode 100644 index 00000000..1d3ab8ce --- /dev/null +++ b/app/javascript/controllers/refresh_turbo_frame_controller.js @@ -0,0 +1,21 @@ +import { Controller } from "@hotwired/stimulus" + +export default class extends Controller { + static values = { + frequency: Number + } + + connect() { + console.log(this.frequencyValue) + this.refreshInterval = setInterval(() => { + console.log("Updating src"); + this.element.setAttribute("src", window.location.href); + }, this.frequencyValue) + } + + disconnect() { + if (this.refreshInterval) { + clearInterval(this.refreshInterval) + } + } +} diff --git a/app/services/k8/metrics/metrics.rb b/app/services/k8/metrics/metrics.rb index 2c5e5ec9..911eaf84 100644 --- a/app/services/k8/metrics/metrics.rb +++ b/app/services/k8/metrics/metrics.rb @@ -6,42 +6,46 @@ class K8::Metrics::Metrics nodes = K8::Metrics::Api::Node.ls(cluster) metrics = [] nodes.each do |node| + tags = [ "node:#{node.name}" ] metrics << { metric_type: :cpu, - tags: [ node.name ], + tags:, metadata: { cpu: node.cpu_cores } } metrics << { metric_type: :memory, - tags: [ node.name ], + tags:, metadata: { memory: node.used_memory } } metrics << { metric_type: :total_cpu, - tags: [ node.name ], + tags:, metadata: { total_cpu: node.total_cpu } } metrics << { metric_type: :total_memory, - tags: [ node.name ], + tags:, metadata: { total_memory: node.total_memory } } node.namespaces.each do |namespace, pods| pods.each do |pod| + tags = [ "node:#{node.name}", "namespace:#{namespace}", "pod:#{pod.name}" ] metrics << { metric_type: :cpu, - tags: [ node.name, namespace, pod.name ], + tags:, metadata: { cpu: pod.cpu } } metrics << { metric_type: :memory, - tags: [ node.name, namespace, pod.name ], + tags:, metadata: { memory: pod.memory } } end end end - cluster.metrics.create(attributes) + metrics.each do |metric| + cluster.metrics.create(**metric) + end end end diff --git a/app/views/charts/_chart.html.erb b/app/views/charts/_chart.html.erb deleted file mode 100644 index ab4ea075..00000000 --- a/app/views/charts/_chart.html.erb +++ /dev/null @@ -1,6 +0,0 @@ -
| + Node Name + | ++ CPU Cores + | ++ + CPU Usage + + | ++ + Memory Capacity + + | ++ + Memory Usage + + | +
|---|---|---|---|---|
|
+
+
+
+ <%= node.name %>
+
+ |
+
+
+ <%= integer_to_size(node.total_cpu) %>
+
+ |
+
+
+ <%= node.cpu_percent %>%
+
+ |
+
+
+ <%= integer_to_size(node.total_memory) %>
+
+ |
+
+
+ <%= node.memory_percent %>%
+
+ |
+
| + Namespace + | ++ Pod Name + | ++ CPU + | ++ + Memory + + | +
|---|---|---|---|
|
+
+ <%= namespace %>
+
+ |
+
+
+ <%= pod.name %>
+
+ |
+
+
+ <%= pod.cpu %>
+
+ |
+
+
+ <%= integer_to_size(pod.memory) %>
+
+ |
+
| - Node Name - | -- CPU Cores - | -- - CPU Usage - - | -- - Memory Capacity - - | -- - Memory Usage - - | -
|---|---|---|---|---|
|
-
-
-
- <%= node.name %>
-
- |
-
-
- <%= integer_to_size(node.total_cpu) %>
-
- |
-
-
- <%= node.cpu_percent %>%
-
- |
-
-
- <%= integer_to_size(node.total_memory) %>
-
- |
-
-
- <%= node.memory_percent %>%
-
- |
-
| - Namespace - | -- Pod Name - | -- CPU - | -- - Memory - - | -
|---|---|---|---|
|
-
- <%= namespace %>
-
- |
-
-
- <%= pod.name %>
-
- |
-
-
- <%= pod.cpu %>
-
- |
-
-
- <%= integer_to_size(pod.memory) %>
-
- |
-