From cef3145fcb7f7f1514b3500f208f9be4ba5fdeb8 Mon Sep 17 00:00:00 2001 From: Celina Lopez Date: Wed, 27 Aug 2025 12:44:59 -0700 Subject: [PATCH] update new metrics --- app/helpers/namespace_metrics_helper.rb | 2 +- app/jobs/scheduled/fetch_metrics_job.rb | 5 +++-- app/services/k8/metrics/api.rb | 12 ++++++------ app/services/k8/metrics/metrics.rb | 4 ++-- .../async/clusters/metrics/show_view_model.rb | 2 +- app/view_models/async/k8/nodes_view_model.rb | 2 +- lib/tasks/metrics.rake | 5 +++-- spec/services/k8/metrics/metrics_spec.rb | 5 +++-- 8 files changed, 20 insertions(+), 17 deletions(-) diff --git a/app/helpers/namespace_metrics_helper.rb b/app/helpers/namespace_metrics_helper.rb index c9369b06..9d8fd3dd 100644 --- a/app/helpers/namespace_metrics_helper.rb +++ b/app/helpers/namespace_metrics_helper.rb @@ -3,7 +3,7 @@ module NamespaceMetricsHelper include MetricsHelper def configure(nameable) - @pods = K8::Metrics::Api::Pod.fetch(nameable.cluster, nameable.name) + @pods = K8::Metrics::Api::Pod.fetch(nameable.cluster, nameable.name, current_user) @time_range = params[:time_range] || "2h" start_time = parse_time_range(@time_range) end_time = Time.now diff --git a/app/jobs/scheduled/fetch_metrics_job.rb b/app/jobs/scheduled/fetch_metrics_job.rb index 35213487..f3503208 100644 --- a/app/jobs/scheduled/fetch_metrics_job.rb +++ b/app/jobs/scheduled/fetch_metrics_job.rb @@ -1,9 +1,10 @@ class Scheduled::FetchMetricsJob < ApplicationJob queue_as :default - def perform + def perform(user_id) + user = User.find(user_id) Cluster.running.each do |cluster| - nodes = K8::Metrics::Metrics.call(cluster) + nodes = K8::Metrics::Metrics.call(cluster, user) rescue => e Rails.logger.error("Error fetching metrics for cluster #{cluster.name}: #{e.message}") end diff --git a/app/services/k8/metrics/api.rb b/app/services/k8/metrics/api.rb index 3bad51fb..2e1042c0 100644 --- a/app/services/k8/metrics/api.rb +++ b/app/services/k8/metrics/api.rb @@ -1,9 +1,9 @@ module K8::Metrics::Api class Node extend StorageHelper - def self.ls(cluster, with_namespaces: true) + def self.ls(cluster, user, with_namespaces: true) # Here, run kubectl top nodes - kubectl = K8::Kubectl.new(cluster) + kubectl = K8::Kubectl.new(K8::Connection.new(cluster, user)) response = kubectl.call("top nodes") parsed_data = parse_output(response) # get --raw /apis/metrics.k8s.io/v1beta1/nodes/#{node} @@ -27,14 +27,14 @@ module K8::Metrics::Api if with_namespaces cluster.projects.each do |project| begin - node.namespaces[project.name] = K8::Metrics::Api::Pod.fetch(cluster, project.name) + node.namespaces[project.name] = K8::Metrics::Api::Pod.fetch(cluster, project.name, user) rescue StandardError => e Rails.logger.error("Failed to fetch pod metrics for project #{project.name}: #{e.message}") end end cluster.add_ons.each do |add_on| begin - node.namespaces[add_on.name] = K8::Metrics::Api::Pod.fetch(cluster, add_on.name) + node.namespaces[add_on.name] = K8::Metrics::Api::Pod.fetch(cluster, add_on.name, user) rescue StandardError => e Rails.logger.error("Failed to fetch pod metrics for add-on #{add_on.name}: #{e.message}") end @@ -100,8 +100,8 @@ module K8::Metrics::Api class Pod extend StorageHelper - def self.fetch(cluster, namespace) - kubectl = K8::Kubectl.new(cluster) + def self.fetch(cluster, namespace, user) + kubectl = K8::Kubectl.new(K8::Connection.new(cluster, user)) response = kubectl.call("top pods -n #{namespace}") parsed_data = parse_output(response) parsed_data.map do |data| diff --git a/app/services/k8/metrics/metrics.rb b/app/services/k8/metrics/metrics.rb index bb106a96..6048f6ce 100644 --- a/app/services/k8/metrics/metrics.rb +++ b/app/services/k8/metrics/metrics.rb @@ -2,8 +2,8 @@ include StorageHelper class K8::Metrics::Metrics - def self.call(cluster) - nodes = K8::Metrics::Api::Node.ls(cluster) + def self.call(cluster, user) + nodes = K8::Metrics::Api::Node.ls(cluster, user) metrics = [] nodes.each do |node| tags = [ "node:#{node.name}" ] diff --git a/app/view_models/async/clusters/metrics/show_view_model.rb b/app/view_models/async/clusters/metrics/show_view_model.rb index c1e985a6..df028590 100644 --- a/app/view_models/async/clusters/metrics/show_view_model.rb +++ b/app/view_models/async/clusters/metrics/show_view_model.rb @@ -13,7 +13,7 @@ class Async::Clusters::Metrics::ShowViewModel < Async::BaseViewModel end def async_render - nodes = K8::Metrics::Api::Node.ls(cluster) + nodes = K8::Metrics::Api::Node.ls(cluster, current_user) render "clusters/metrics/live_metrics", locals: { nodes: nodes } diff --git a/app/view_models/async/k8/nodes_view_model.rb b/app/view_models/async/k8/nodes_view_model.rb index 9ced444e..105de539 100644 --- a/app/view_models/async/k8/nodes_view_model.rb +++ b/app/view_models/async/k8/nodes_view_model.rb @@ -8,7 +8,7 @@ class Async::K8::NodesViewModel < Async::BaseViewModel end def nodes - @nodes ||= K8::Metrics::Api::Node.ls(cluster) + @nodes ||= K8::Metrics::Api::Node.ls(cluster, current_user) end def initial_render diff --git a/lib/tasks/metrics.rake b/lib/tasks/metrics.rake index 6a77d66a..35cd9731 100644 --- a/lib/tasks/metrics.rake +++ b/lib/tasks/metrics.rake @@ -5,8 +5,9 @@ namespace :metrics do end desc "Poll Kubernetes cluster metrics" - task fetch: :environment do - Scheduled::FetchMetricsJob.perform_now + task fetch: :environment do |_, args| + user_id = args[:user_id] || 1 + Scheduled::FetchMetricsJob.perform_now(user_id) end desc "Flush metrics older than 1 week" diff --git a/spec/services/k8/metrics/metrics_spec.rb b/spec/services/k8/metrics/metrics_spec.rb index fe8e3360..41d42417 100644 --- a/spec/services/k8/metrics/metrics_spec.rb +++ b/spec/services/k8/metrics/metrics_spec.rb @@ -3,6 +3,7 @@ require 'rails_helper' RSpec.describe K8::Metrics::Metrics do describe '.call' do let(:cluster) { create(:cluster) } + let(:user) { create(:user) } let(:pod) do double('Pod', name: 'pod1', cpu: 1, memory: 512) end @@ -24,10 +25,10 @@ RSpec.describe K8::Metrics::Metrics do end before do - allow(K8::Metrics::Api::Node).to receive(:ls).with(cluster).and_return([ node ]) + allow(K8::Metrics::Api::Node).to receive(:ls).with(cluster, user).and_return([ node ]) end - subject { K8::Metrics::Metrics.call(cluster) } + subject { K8::Metrics::Metrics.call(cluster, user) } it 'creates metrics for nodes' do expect { subject }.to change { cluster.metrics.count }.by(4)