get_records

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