func (d *driver) Stats(id string) (*execdriver.ResourceStats, error) { c := d.activeContainers[id] state, err := libcontainer.GetState(filepath.Join(d.root, id)) if err != nil { if os.IsNotExist(err) { return nil, execdriver.ErrNotRunning } return nil, err } now := time.Now() stats, err := libcontainer.GetStats(nil, state) if err != nil { return nil, err } memoryLimit := c.container.Cgroups.Memory // if the container does not have any memory limit specified set the // limit to the machines memory if memoryLimit == 0 { memoryLimit = d.machineMemory } return &execdriver.ResourceStats{ Read: now, ContainerStats: stats, MemoryLimit: memoryLimit, }, nil }
func Stats(stateFile string, containerMemoryLimit int64, machineMemory int64) (*ResourceStats, error) { state, err := libcontainer.GetState(stateFile) if err != nil { if os.IsNotExist(err) { return nil, ErrNotRunning } return nil, err } now := time.Now() stats, err := libcontainer.GetStats(nil, state) if err != nil { return nil, err } // if the container does not have any memory limit specified set the // limit to the machines memory memoryLimit := containerMemoryLimit if memoryLimit == 0 { memoryLimit = machineMemory } return &ResourceStats{ Read: now, ContainerStats: stats, MemoryLimit: memoryLimit, }, nil }
// Get stats of the specified container func GetStats(config *libcontainer.Config, state *libcontainer.State) (*info.ContainerStats, error) { // TODO(vmarmol): Use libcontainer's Stats() in the new API when that is ready. libcontainerStats, err := libcontainer.GetStats(config, state) if err != nil { return nil, err } return toContainerStats(libcontainerStats), nil }
// returns the container stats in json format. func getStats(container *libcontainer.Config, state *libcontainer.State) (string, error) { stats, err := libcontainer.GetStats(container, state) if err != nil { return "", err } out, err := json.MarshalIndent(stats, "", "\t") if err != nil { return "", err } return string(out), nil }
// getContainerStats reads usage data of a container from the cgroup fs. func (collector *LibcontainerStatsCollector) getContainerStats(container *CronContainer) (*ContainerStats, error) { state, err := libcontainer.GetState(container.statePath) if err != nil { // The state file is not created immediately when a container starts. // Bubble up the error. return nil, err } // libcontainer.GetStats ignores the config argument. So, don't bother providing one. containerStats, err := libcontainer.GetStats(nil, state) if err != nil && !isNetworkStatsError(err) { log.Error("Error getting libcontainer stats", "err", err) return nil, err } cs := toContainerStats(*containerStats) return cs, nil }
func statsAction(context *cli.Context) { container, err := loadContainer() if err != nil { log.Fatal(err) } state, err := libcontainer.GetState(dataPath) if err != nil { log.Fatal(err) } stats, err := libcontainer.GetStats(container, state) if err != nil { log.Fatal(err) } data, err := json.MarshalIndent(stats, "", "\t") if err != nil { log.Fatal(err) } fmt.Printf("%s", data) }