From 80b3769ea3218aac2688437757d5599485666933 Mon Sep 17 00:00:00 2001 From: CMGS Date: Fri, 21 Sep 2018 11:18:13 +0800 Subject: [PATCH] not modify old API now --- docker/docker.go | 2 ++ docker/docker_linux.go | 55 ++++++++++++++++++++++------------------------- docker/docker_notlinux.go | 9 ++++---- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/docker/docker.go b/docker/docker.go index 623af0e..912f933 100644 --- a/docker/docker.go +++ b/docker/docker.go @@ -13,6 +13,8 @@ var ErrCgroupNotAvailable = errors.New("cgroup not available") var invoke common.Invoker = common.Invoke{} +const nanoseconds = 1e9 + type CgroupCPUStat struct { cpu.TimesStat Usage float64 diff --git a/docker/docker_linux.go b/docker/docker_linux.go index 85fa6f5..01d09eb 100644 --- a/docker/docker_linux.go +++ b/docker/docker_linux.go @@ -89,31 +89,19 @@ func GetDockerIDListWithContext(ctx context.Context) ([]string, error) { // containerID is same as docker id if you use docker. // If you use container via systemd.slice, you could use // containerID = docker-.scope and base=/sys/fs/cgroup/cpuacct/system.slice/ -func CgroupCPU(containerID string, base string) (*CgroupCPUStat, error) { +func CgroupCPU(containerID string, base string) (*cpu.TimesStat, error) { return CgroupCPUWithContext(context.Background(), containerID, base) } +// CgroupCPUUsage returnes specified cgroup id CPU usage. +// containerID is same as docker id if you use docker. +// If you use container via systemd.slice, you could use +// containerID = docker-.scope and base=/sys/fs/cgroup/cpuacct/system.slice/ func CgroupCPUUsage(containerID string, base string) (float64, error) { return CgroupCPUUsageWithContext(context.Background(), containerID, base) } -func CgroupCPUUsageWithContext(ctx context.Context, containerID, base string) (float64, error) { - usagefile := getCgroupFilePath(containerID, base, "cpuacct", "cpuacct.usage") - lines, err := common.ReadLinesOffsetN(usagefile, 0, 1) - if err != nil { - return 0.0, err - } - - ns, err := strconv.ParseFloat(lines[0], 64) - if err != nil { - return 0.0, err - } - - return ns / 1e9, nil - -} - -func CgroupCPUWithContext(ctx context.Context, containerID string, base string) (*CgroupCPUStat, error) { +func CgroupCPUWithContext(ctx context.Context, containerID string, base string) (*cpu.TimesStat, error) { statfile := getCgroupFilePath(containerID, base, "cpuacct", "cpuacct.stat") lines, err := common.ReadLines(statfile) if err != nil { @@ -123,8 +111,7 @@ func CgroupCPUWithContext(ctx context.Context, containerID string, base string) if len(containerID) == 0 { containerID = "all" } - ret := &CgroupCPUStat{} - ret.CPU = containerID + ret := &cpu.TimesStat{CPU: containerID} for _, line := range lines { fields := strings.Split(line, " ") if fields[0] == "user" { @@ -140,24 +127,34 @@ func CgroupCPUWithContext(ctx context.Context, containerID string, base string) } } } - usage, err := CgroupCPUUsageWithContext(ctx, containerID, base) + return ret, nil +} + +func CgroupCPUUsageWithContext(ctx context.Context, containerID, base string) (float64, error) { + usagefile := getCgroupFilePath(containerID, base, "cpuacct", "cpuacct.usage") + lines, err := common.ReadLinesOffsetN(usagefile, 0, 1) if err != nil { - return nil, err + return 0.0, err } - ret.Usage = usage - return ret, nil + + ns, err := strconv.ParseFloat(lines[0], 64) + if err != nil { + return 0.0, err + } + + return ns / nanoseconds, nil } -func CgroupCPUDocker(containerid string) (*CgroupCPUStat, error) { +func CgroupCPUDocker(containerid string) (*cpu.TimesStat, error) { return CgroupCPUDockerWithContext(context.Background(), containerid) } -func CgroupCPUDockerUsageWithContext(ctx context.Context, containerid string) (float64, error) { - return CgroupCPUUsage(containerid, common.HostSys("fs/cgroup/cpuacct/docker")) +func CgroupCPUDockerWithContext(ctx context.Context, containerid string) (*cpu.TimesStat, error) { + return CgroupCPU(containerid, common.HostSys("fs/cgroup/cpuacct/docker")) } -func CgroupCPUDockerWithContext(ctx context.Context, containerid string) (*CgroupCPUStat, error) { - return CgroupCPU(containerid, common.HostSys("fs/cgroup/cpuacct/docker")) +func CgroupCPUDockerUsageWithContext(ctx context.Context, containerid string) (float64, error) { + return CgroupCPUUsage(containerid, common.HostSys("fs/cgroup/cpuacct/docker")) } func CgroupMem(containerID string, base string) (*CgroupMemStat, error) { diff --git a/docker/docker_notlinux.go b/docker/docker_notlinux.go index 04e87fd..dde104c 100644 --- a/docker/docker_notlinux.go +++ b/docker/docker_notlinux.go @@ -5,6 +5,7 @@ package docker import ( "context" + cpu "github.com/shirou/gopsutil/cpu" "github.com/shirou/gopsutil/internal/common" ) @@ -32,19 +33,19 @@ func GetDockerIDListWithContext(ctx context.Context) ([]string, error) { // containerid is same as docker id if you use docker. // If you use container via systemd.slice, you could use // containerid = docker-.scope and base=/sys/fs/cgroup/cpuacct/system.slice/ -func CgroupCPU(containerid string, base string) (*CgroupCPUStat, error) { +func CgroupCPU(containerid string, base string) (*cpu.TimesStat, error) { return CgroupCPUWithContext(context.Background(), containerid, base) } -func CgroupCPUWithContext(ctx context.Context, containerid string, base string) (*CgroupCPUStat, error) { +func CgroupCPUWithContext(ctx context.Context, containerid string, base string) (*cpu.TimesStat, error) { return nil, ErrCgroupNotAvailable } -func CgroupCPUDocker(containerid string) (*CgroupCPUStat, error) { +func CgroupCPUDocker(containerid string) (*cpu.TimesStat, error) { return CgroupCPUDockerWithContext(context.Background(), containerid) } -func CgroupCPUDockerWithContext(ctx context.Context, containerid string) (*CgroupCPUStat, error) { +func CgroupCPUDockerWithContext(ctx context.Context, containerid string) (*cpu.TimesStat, error) { return CgroupCPU(containerid, common.HostSys("fs/cgroup/cpuacct/docker")) }