in source/plugins/ruby/in_kube_podinventory.rb [474:681]
def getPodInventoryRecords(item, serviceRecords, batchTime = Time.utc.iso8601)
records = []
record = {}
begin
record["CollectionTime"] = batchTime
record["Name"] = item["metadata"]["name"]
podNameSpace = item["metadata"]["namespace"]
podUid = KubernetesApiClient.getPodUid(podNameSpace, item["metadata"])
if podUid.nil?
return records
end
nodeName = ""
if !item["spec"]["nodeName"].nil?
nodeName = item["spec"]["nodeName"]
end
if KubernetesApiClient.isAROv3MasterOrInfraPod(nodeName)
return records
end
record["PodUid"] = podUid
record["PodLabel"] = [item["metadata"]["labels"]]
record["Namespace"] = podNameSpace
record["PodCreationTimeStamp"] = item["metadata"]["creationTimestamp"]
if !item["status"]["startTime"].nil?
record["PodStartTime"] = item["status"]["startTime"]
else
record["PodStartTime"] = ""
end
podReadyCondition = true
if !item["status"]["reason"].nil? && item["status"]["reason"] == "NodeLost" && !item["status"]["conditions"].nil?
item["status"]["conditions"].each do |condition|
if condition["type"] == "Ready" && condition["status"] == "False"
podReadyCondition = false
break
end
end
end
if podReadyCondition == false
record["PodStatus"] = "Unknown"
elsif !item["metadata"]["deletionTimestamp"].nil? && !item["metadata"]["deletionTimestamp"].empty?
record["PodStatus"] = Constants::POD_STATUS_TERMINATING
else
record["PodStatus"] = item["status"]["phase"]
end
if !item["status"]["podIP"].nil?
record["PodIp"] = item["status"]["podIP"]
else
record["PodIp"] = ""
end
record["Computer"] = nodeName
record["ClusterId"] = KubernetesApiClient.getClusterId
record["ClusterName"] = KubernetesApiClient.getClusterName
record["ServiceName"] = getServiceNameFromLabels(item["metadata"]["namespace"], item["metadata"]["labels"], serviceRecords)
if !item["metadata"]["ownerReferences"].nil?
record["ControllerKind"] = item["metadata"]["ownerReferences"][0]["kind"]
record["ControllerName"] = item["metadata"]["ownerReferences"][0]["name"]
@controllerSet.add(record["ControllerKind"] + record["ControllerName"])
if (@controllerData[record["ControllerKind"]].nil?)
@controllerData[record["ControllerKind"]] = 1
else
controllerValue = @controllerData[record["ControllerKind"]]
@controllerData[record["ControllerKind"]] += 1
end
end
podRestartCount = 0
record["PodRestartCount"] = 0
@inventoryToMdmConvertor.process_record_for_pods_ready_metric(record["ControllerName"], record["Namespace"], item["status"]["conditions"])
podContainers = []
if item["status"].key?("containerStatuses") && !item["status"]["containerStatuses"].empty?
podContainers = podContainers + item["status"]["containerStatuses"]
end
if item["status"].key?("initContainerStatuses") && !item["status"]["initContainerStatuses"].empty?
podContainers = podContainers + item["status"]["initContainerStatuses"]
end
if !podContainers.empty?
podContainers.each do |container|
containerRestartCount = 0
lastFinishedTime = nil
if !container["containerID"].nil?
record["ContainerID"] = container["containerID"].split("//")[1]
else
record["ContainerID"] = ""
end
if podUid.nil? || container["name"].nil?
next
else
record["ContainerName"] = podUid + "/" + container["name"]
end
containerRestartCount = container["restartCount"]
record["ContainerRestartCount"] = containerRestartCount
containerStatus = container["state"]
record["ContainerStatusReason"] = ""
if podReadyCondition == false
record["ContainerStatus"] = "Unknown"
else
record["ContainerStatus"] = containerStatus.keys[0]
end
if containerStatus.keys[0] == "running"
record["ContainerCreationTimeStamp"] = container["state"]["running"]["startedAt"]
else
if !containerStatus[containerStatus.keys[0]]["reason"].nil? && !containerStatus[containerStatus.keys[0]]["reason"].empty?
record["ContainerStatusReason"] = containerStatus[containerStatus.keys[0]]["reason"]
end
if !record["ControllerKind"].nil? && record["ControllerKind"].downcase == Constants::CONTROLLER_KIND_JOB
@inventoryToMdmConvertor.process_record_for_terminated_job_metric(record["ControllerName"], record["Namespace"], containerStatus)
end
end
begin
if !container["lastState"].nil? && container["lastState"].keys.length == 1
lastStateName = container["lastState"].keys[0]
lastStateObject = container["lastState"][lastStateName]
if !lastStateObject.is_a?(Hash)
raise "expected a hash object. This could signify a bug or a kubernetes API change"
end
if lastStateObject.key?("reason") && lastStateObject.key?("startedAt") && lastStateObject.key?("finishedAt")
newRecord = Hash.new
newRecord["lastState"] = lastStateName
lastStateReason = lastStateObject["reason"]
newRecord["reason"] = lastStateReason
newRecord["startedAt"] = lastStateObject["startedAt"]
lastFinishedTime = lastStateObject["finishedAt"]
newRecord["finishedAt"] = lastFinishedTime
record["ContainerLastStatus"] = newRecord
if lastStateReason.downcase == Constants::REASON_OOM_KILLED
@inventoryToMdmConvertor.process_record_for_oom_killed_metric(record["ControllerName"], record["Namespace"], lastFinishedTime)
end
lastStateReason = nil
else
record["ContainerLastStatus"] = Hash.new
end
else
record["ContainerLastStatus"] = Hash.new
end
if (!containerRestartCount.nil? && (containerRestartCount.is_a? Integer) && containerRestartCount > 0)
@inventoryToMdmConvertor.process_record_for_container_restarts_metric(record["ControllerName"], record["Namespace"], lastFinishedTime)
end
rescue => errorStr
$log.warn "Failed in parse_and_emit_record pod inventory while processing ContainerLastStatus: #{errorStr}"
$log.debug_backtrace(errorStr.backtrace)
ApplicationInsightsUtility.sendExceptionTelemetry(errorStr)
record["ContainerLastStatus"] = Hash.new
end
podRestartCount += containerRestartCount
records.push(record.dup)
end
else
records.push(record)
end
records.each do |record|
if !record.nil?
record["PodRestartCount"] = podRestartCount
end
end
rescue => error
$log.warn("getPodInventoryRecords failed: #{error}")
end
return records
end