update new metrics

This commit is contained in:
Celina Lopez
2025-08-27 12:44:59 -07:00
parent a9386de0dc
commit cef3145fcb
8 changed files with 20 additions and 17 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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|

View File

@@ -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}" ]

View File

@@ -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
}

View File

@@ -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

View File

@@ -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"

View File

@@ -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)