// Get cgroup and networking stats of the specified container func GetStats(cgroupManager cgroups.Manager, networkInterfaces []string) (*info.ContainerStats, error) { cgroupStats, err := cgroupManager.GetStats() if err != nil { return nil, err } libcontainerStats := &libcontainer.Stats{ CgroupStats: cgroupStats, } stats := toContainerStats(libcontainerStats) // TODO(rjnagal): Use networking stats directly from libcontainer. stats.Network.Interfaces = make([]info.InterfaceStats, len(networkInterfaces)) for i := range networkInterfaces { interfaceStats, err := sysinfo.GetNetworkStats(networkInterfaces[i]) if err != nil { return stats, err } stats.Network.Interfaces[i] = interfaceStats } // For backwards compatability. if len(networkInterfaces) > 0 { stats.Network.InterfaceStats = stats.Network.Interfaces[0] } return stats, nil }
func GetProcesses(cgroupManager cgroups.Manager) ([]int, error) { pids, err := cgroupManager.GetPids() if err != nil { return nil, err } return pids, nil }
// Get cgroup and networking stats of the specified container func GetStats(cgroupManager cgroups.Manager, rootFs string, pid int) (*info.ContainerStats, error) { cgroupStats, err := cgroupManager.GetStats() if err != nil { return nil, err } libcontainerStats := &libcontainer.Stats{ CgroupStats: cgroupStats, } stats := toContainerStats(libcontainerStats) // If we know the pid then get network stats from /proc/<pid>/net/dev if pid > 0 { netStats, err := networkStatsFromProc(rootFs, pid) if err != nil { glog.V(2).Infof("Unable to get network stats from pid %d: %v", pid, err) } else { stats.Network.Interfaces = append(stats.Network.Interfaces, netStats...) } } // For backwards compatibility. if len(stats.Network.Interfaces) > 0 { stats.Network.InterfaceStats = stats.Network.Interfaces[0] } return stats, nil }
// killCgroupProcesses freezes then iterates over all the processes inside the // manager's cgroups sending a SIGKILL to each process then waiting for them to // exit. func killCgroupProcesses(m cgroups.Manager) error { var procs []*os.Process if err := m.Freeze(configs.Frozen); err != nil { log.Warn(err) } pids, err := m.GetPids() if err != nil { m.Freeze(configs.Thawed) return err } for _, pid := range pids { if p, err := os.FindProcess(pid); err == nil { procs = append(procs, p) if err := p.Kill(); err != nil { log.Warn(err) } } } if err := m.Freeze(configs.Thawed); err != nil { log.Warn(err) } for _, p := range procs { if _, err := p.Wait(); err != nil { log.Warn(err) } } return nil }
// Get cgroup and networking stats of the specified container func GetStats(cgroupManager cgroups.Manager, networkInterfaces []string) (*info.ContainerStats, error) { cgroupStats, err := cgroupManager.GetStats() if err != nil { return nil, err } libcontainerStats := &libcontainer.Stats{ CgroupStats: cgroupStats, } stats := toContainerStats(libcontainerStats) if len(networkInterfaces) != 0 { // ContainerStats only reports stat for one network device. // TODO(rjnagal): Handle multiple physical network devices. // TODO(rjnagal): Use networking stats directly from libcontainer. stats.Network, err = sysinfo.GetNetworkStats(networkInterfaces[0]) if err != nil { return stats, err } } return stats, nil }
// Get cgroup and networking stats of the specified container func GetStats(cgroupManager cgroups.Manager, networkInterfaces []string, pid int) (*info.ContainerStats, error) { cgroupStats, err := cgroupManager.GetStats() if err != nil { return nil, err } libcontainerStats := &libcontainer.Stats{ CgroupStats: cgroupStats, } stats := toContainerStats(libcontainerStats) // TODO(rjnagal): Use networking stats directly from libcontainer. stats.Network.Interfaces = make([]info.InterfaceStats, len(networkInterfaces)) for i := range networkInterfaces { interfaceStats, err := sysinfo.GetNetworkStats(networkInterfaces[i]) if err != nil { return stats, err } stats.Network.Interfaces[i] = interfaceStats } // If we know the pid & we haven't discovered any network interfaces yet // try the network namespace. if pid > 0 && len(stats.Network.Interfaces) == 0 { nsStats, err := networkStatsFromNs(pid) if err != nil { glog.V(2).Infof("Unable to get network stats from pid %d: %v", pid, err) } else { stats.Network.Interfaces = append(stats.Network.Interfaces, nsStats...) } } // For backwards compatibility. if len(stats.Network.Interfaces) > 0 { stats.Network.InterfaceStats = stats.Network.Interfaces[0] } return stats, nil }