Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use MetricsCaptureMixin in Kubevirt MetricsCapture #266

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,50 +1,5 @@
class ManageIQ::Providers::Kubevirt::InfraManager::MetricsCapture < ManageIQ::Providers::InfraManager::MetricsCapture
class CollectionFailure < RuntimeError; end
class NoMetricsFoundError < RuntimeError; end

class TargetValidationError < RuntimeError
def log_severity
:error
end
end

class TargetValidationWarning < RuntimeError
def log_severity
:warn
end
end

INTERVAL = 60.seconds

VIM_STYLE_COUNTERS = {
"cpu_usage_rate_average" => {
:counter_key => "cpu_usage_rate_average",
:instance => "",
:capture_interval => INTERVAL.to_s,
:precision => 1,
:rollup => "average",
:unit_key => "percent",
:capture_interval_name => "realtime"
},
"mem_usage_absolute_average" => {
:counter_key => "mem_usage_absolute_average",
:instance => "",
:capture_interval => INTERVAL.to_s,
:precision => 1,
:rollup => "average",
:unit_key => "percent",
:capture_interval_name => "realtime"
},
"net_usage_rate_average" => {
:counter_key => "net_usage_rate_average",
:instance => "",
:capture_interval => INTERVAL.to_s,
:precision => 1,
:rollup => "average",
:unit_key => "kilobytespersecond",
:capture_interval_name => "realtime"
}
}
include ManageIQ::Providers::Kubernetes::ContainerManager::MetricsCaptureMixin

def capture_ems_targets(options = {})
begin
Expand All @@ -62,80 +17,6 @@ def capture_ems_targets(options = {})
end

def prometheus_capture_context(target, start_time, end_time)
PrometheusCaptureContext.new(target, start_time, end_time, INTERVAL)
end

def metrics_connection(ems)
ems.connection_configurations.prometheus
end

def metrics_connection_valid?(ems)
metrics_connection(ems)&.authentication&.status == "Valid"
end

def verify_metrics_connection!(ems)
raise TargetValidationError, "no provider for #{target_name}" if ems.nil?

raise TargetValidationWarning, "no metrics endpoint found for #{target_name}" if metrics_connection(ems).nil?
raise TargetValidationWarning, "metrics authentication isn't valid for #{target_name}" unless metrics_connection_valid?(ems)
end

def build_capture_context!(ems, target, start_time, end_time)
verify_metrics_connection!(ems)
# make start_time align to minutes
start_time = start_time.beginning_of_minute

context = prometheus_capture_context(target, start_time, end_time)
raise TargetValidationWarning, "no metrics endpoint found for #{target_name}" if context.nil?

context
end

def perf_collect_metrics(interval_name, start_time = nil, end_time = nil)
raise "No EMS defined" if target.ext_management_system.nil?

start_time ||= 15.minutes.ago.beginning_of_minute.utc
ems = target.ext_management_system

_log.info("Collecting metrics for #{target_name} [#{interval_name}] [#{start_time}] [#{end_time}]")

begin
context = build_capture_context!(ems, target, start_time, end_time)
rescue TargetValidationError, TargetValidationWarning => e
_log.send(e.log_severity, "[#{target_name}] #{e.message}")
ems.try(:update,
:last_metrics_error => :invalid,
:last_metrics_update_date => Time.now.utc)
raise
end

Benchmark.realtime_block(:collect_data) do
begin
context.collect_metrics
rescue NoMetricsFoundError => e
_log.warn("Metrics missing: [#{target_name}] #{e.message}")
rescue StandardError => e
_log.error("Metrics unavailable: [#{target_name}] #{e.message}")
ems.update(:last_metrics_error => :unavailable,
:last_metrics_update_date => Time.now.utc) if ems
raise
end
end

ems.update(:last_metrics_error => nil,
:last_metrics_update_date => Time.now.utc,
:last_metrics_success_date => Time.now.utc) if ems

[{target.ems_ref => VIM_STYLE_COUNTERS},
{target.ems_ref => context.ts_values}]
end

private

def target_name
@target_name ||= begin
t = target || ems
"#{t.class.name.demodulize}(#{t.id})"
end
ManageIQ::Providers::Kubevirt::InfraManager::MetricsCapture::PrometheusCaptureContext.new(target, start_time, end_time, INTERVAL)
end
end
Loading