in source/plugins/ruby/health/health_container_cpu_memory_aggregator.rb [175:333]
def get_records
time_now = Time.now.utc.iso8601
container_cpu_memory_records = []
@cpu_records.each{|resource_key, record|
cpu_limit_mc = 1.0
if record["limit"].is_a?(Numeric)
cpu_limit_mc = record["limit"]/1000000.to_f
else
@log.info "CPU Limit is not a number #{record['limit']}"
if !@@limit_is_array_event_sent.key?(resource_key)
custom_properties = {}
custom_properties['limit'] = record['limit']
if record['limit'].is_a?(Array)
record['limit'].each_index{|i|
custom_properties[i] = record['limit'][i]
}
end
@@limit_is_array_event_sent[resource_key] = true
ApplicationInsightsUtility.sendCustomEvent(@@LIMIT_IS_ARRAY_EVENT, custom_properties)
end
end
health_monitor_record = {
"timestamp" => time_now,
"state" => record["state"],
"details" => {
"cpu_limit_millicores" => cpu_limit_mc,
"cpu_usage_instances" => record["records"].map{|r| r.each {|k,v|
k == "counter_value" ? r[k] = r[k] / 1000000.to_f : r[k]
}},
"workload_name" => record["workload_name"],
"workload_kind" => record["workload_kind"],
"namespace" => record["namespace"],
"container" => record["container"],
"limit_set" => record["limit_set"]
}
}
monitor_instance_id = HealthMonitorHelpers.get_monitor_instance_id(MonitorId::CONTAINER_CPU_MONITOR_ID, resource_key.split('_'))
health_record = {}
health_record[HealthMonitorRecordFields::MONITOR_ID] = MonitorId::CONTAINER_CPU_MONITOR_ID
health_record[HealthMonitorRecordFields::MONITOR_INSTANCE_ID] = monitor_instance_id
health_record[HealthMonitorRecordFields::DETAILS] = health_monitor_record
health_record[HealthMonitorRecordFields::TIME_GENERATED] = time_now
health_record[HealthMonitorRecordFields::TIME_FIRST_OBSERVED] = time_now
container_cpu_memory_records.push(health_record)
}
if @@cpu_last_sent_monitors.keys.size != 0
@@cpu_last_sent_monitors.keys.each{|key|
begin
@log.info "Container CPU monitor #{key} not present in current set. Sending none state transition"
tokens = key.split('_')
namespace = tokens[0]
workload_name = "#{tokens[0]}~~#{tokens[1]}"
container = tokens[2]
health_monitor_record = {
"timestamp" => time_now,
"state" => HealthMonitorStates::NONE,
"details" => {
"reason" => "No record received for workload #{workload_name}",
"workload_name" => workload_name,
"namespace" => namespace,
"container" => container
}
}
monitor_instance_id = HealthMonitorHelpers.get_monitor_instance_id(MonitorId::CONTAINER_CPU_MONITOR_ID, key.split('_'))
health_record = {}
health_record[HealthMonitorRecordFields::MONITOR_ID] = MonitorId::CONTAINER_CPU_MONITOR_ID
health_record[HealthMonitorRecordFields::MONITOR_INSTANCE_ID] = monitor_instance_id
health_record[HealthMonitorRecordFields::DETAILS] = health_monitor_record
health_record[HealthMonitorRecordFields::TIME_GENERATED] = time_now
health_record[HealthMonitorRecordFields::TIME_FIRST_OBSERVED] = time_now
container_cpu_memory_records.push(health_record)
rescue => e
@log.info "Error when trying to create NONE State transition signal for #{key} for monitor #{monitor_instance_id} #{e.message}"
next
end
}
end
@memory_records.each{|resource_key, record|
health_monitor_record = {
"timestamp" => time_now,
"state" => record["state"],
"details" => {
"memory_limit_bytes" => record["limit"],
"memory_usage_instances" => record["records"],
"workload_name" => record["workload_name"],
"workload_kind" => record["workload_kind"],
"namespace" => record["namespace"],
"container" => record["container"]
}
}
monitor_instance_id = HealthMonitorHelpers.get_monitor_instance_id(MonitorId::CONTAINER_MEMORY_MONITOR_ID, resource_key.split('_'))
health_record = {}
health_record[HealthMonitorRecordFields::MONITOR_ID] = MonitorId::CONTAINER_MEMORY_MONITOR_ID
health_record[HealthMonitorRecordFields::MONITOR_INSTANCE_ID] = monitor_instance_id
health_record[HealthMonitorRecordFields::DETAILS] = health_monitor_record
health_record[HealthMonitorRecordFields::TIME_GENERATED] = time_now
health_record[HealthMonitorRecordFields::TIME_FIRST_OBSERVED] = time_now
container_cpu_memory_records.push(health_record)
}
if @@memory_last_sent_monitors.keys.size != 0
@@memory_last_sent_monitors.keys.each{|key|
begin
@log.info "Container Memory monitor #{key} not present in current set. Sending none state transition"
tokens = key.split('_')
namespace = tokens[0]
workload_name = "#{tokens[0]}~~#{tokens[1]}"
container = tokens[2]
health_monitor_record = {
"timestamp" => time_now,
"state" => HealthMonitorStates::NONE,
"details" => {
"reason" => "No record received for workload #{workload_name}",
"workload_name" => workload_name,
"namespace" => namespace,
"container" => container
}
}
monitor_instance_id = HealthMonitorHelpers.get_monitor_instance_id(MonitorId::CONTAINER_MEMORY_MONITOR_ID, key.split('_'))
health_record = {}
health_record[HealthMonitorRecordFields::MONITOR_ID] = MonitorId::CONTAINER_MEMORY_MONITOR_ID
health_record[HealthMonitorRecordFields::MONITOR_INSTANCE_ID] = monitor_instance_id
health_record[HealthMonitorRecordFields::DETAILS] = health_monitor_record
health_record[HealthMonitorRecordFields::TIME_GENERATED] = time_now
health_record[HealthMonitorRecordFields::TIME_FIRST_OBSERVED] = time_now
container_cpu_memory_records.push(health_record)
rescue => e
@log.info "Error when trying to create NONE State transition signal for #{key} for monitor #{monitor_instance_id} #{e.message}"
next
end
}
end
@@memory_last_sent_monitors = {}
@@cpu_last_sent_monitors = {}
@cpu_records.keys.each{|k|
@@cpu_last_sent_monitors[k] = true
}
@memory_records.keys.each{|k|
@@memory_last_sent_monitors[k] = true
}
return container_cpu_memory_records
end