in kubelet-to-gcm/monitor/kubelet/translate.go [273:305]
func (t *Translator) translateContainers(pods []stats.PodStats) ([]*v3.TimeSeries, error) {
var timeSeries []*v3.TimeSeries
for _, pod := range pods {
metricsSeen := make(map[string]time.Time)
metrics := make(map[string][]*v3.TimeSeries)
namespace := pod.PodRef.Namespace
podID := pod.PodRef.Name
// There can be duplicate data points for containers, so only
// take the latest one.
for _, container := range pod.Containers {
containerName := container.Name
// Check for duplicates
if container.StartTime.Time.Before(metricsSeen[containerName]) || container.StartTime.Time.Equal(metricsSeen[containerName]) {
continue
}
metricsSeen[containerName] = container.StartTime.Time
containerSeries, err := t.translateContainer(podID, namespace, container, true /* requireFsStats */)
if err != nil {
glog.Warningf("Failed to translate container stats for container %q in pod %q(%q): %v",
containerName, podID, namespace, err)
continue
}
metrics[containerName] = containerSeries
}
// Flatten the deduplicated metrics.
for _, containerSeries := range metrics {
timeSeries = append(timeSeries, containerSeries...)
}
}
return timeSeries, nil
}