From 4106f1ca2ff0fbf8e9407d33f6ca3fcc065a56be Mon Sep 17 00:00:00 2001 From: ASAKURA Kazuki <32762324+Arthur1@users.noreply.github.com> Date: Wed, 6 Mar 2024 13:25:07 +0900 Subject: [PATCH] Use shirou/gopsutil for getting CPU info --- go.mod | 13 ++- go.sum | 40 +++++++- spec/cpu.go | 89 +++++------------ spec/cpu_test.go | 246 ----------------------------------------------- 4 files changed, 70 insertions(+), 318 deletions(-) delete mode 100644 spec/cpu_test.go diff --git a/go.mod b/go.mod index 512ab19..1869177 100644 --- a/go.mod +++ b/go.mod @@ -11,28 +11,35 @@ require ( github.com/mackerelio/go-osstat v0.2.3 github.com/mackerelio/golib v1.2.1 github.com/mackerelio/mackerel-client-go v0.24.0 + github.com/shirou/gopsutil/v3 v3.24.2 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 k8s.io/api v0.25.3 k8s.io/apimachinery v0.25.3 + k8s.io/kubelet v0.25.3 ) -require k8s.io/kubelet v0.25.3 - require ( github.com/Songmu/wrapcommander v0.1.0 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.4.0 // indirect github.com/go-logr/logr v1.2.3 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/gofuzz v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/shoenig/go-m1cpu v0.1.6 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect golang.org/x/net v0.2.0 // indirect - golang.org/x/sys v0.2.0 // indirect + golang.org/x/sys v0.17.0 // indirect golang.org/x/text v0.4.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 64446be..4f2ba11 100644 --- a/go.sum +++ b/go.sum @@ -19,12 +19,17 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7 github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -38,6 +43,8 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/mackerelio/go-osstat v0.2.3 h1:jAMXD5erlDE39kdX2CU7YwCGRcxIO33u/p8+Fhe5dJw= github.com/mackerelio/go-osstat v0.2.3/go.mod h1:DQbPOnsss9JHIXgBStc/dnhhir3gbd3YH+Dbdi7ptMA= github.com/mackerelio/golib v1.2.1 h1:SDcDn6Jw3p9bi1N0bg1Z/ilG5qcBB23qL8xNwrU0gg4= @@ -57,13 +64,32 @@ github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zM github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/shirou/gopsutil/v3 v3.24.2 h1:kcR0erMbLg5/3LcInpw0X/rrPSqq4CDPyI6A6ZRC18Y= +github.com/shirou/gopsutil/v3 v3.24.2/go.mod h1:tSg/594BcA+8UdQU2XcW803GWYgdtauFFPgJCJKZlVk= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= +github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -83,12 +109,16 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+v golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -111,7 +141,9 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= k8s.io/api v0.25.3 h1:Q1v5UFfYe87vi5H7NU0p4RXC26PPMT8KOpr1TLQbCMQ= diff --git a/spec/cpu.go b/spec/cpu.go index 3b49244..5cf5476 100644 --- a/spec/cpu.go +++ b/spec/cpu.go @@ -1,14 +1,13 @@ package spec import ( - "bufio" "context" - "io" - "os" - "strings" + "fmt" + "strconv" "github.com/mackerelio/golib/logging" mackerel "github.com/mackerelio/mackerel-client-go" + "github.com/shirou/gopsutil/v3/cpu" ) // CPUGenerator collects CPU specs @@ -17,69 +16,29 @@ type CPUGenerator struct { var cpuLogger = logging.GetLogger("spec.cpu") -func (g *CPUGenerator) generate(file io.Reader) (interface{}, error) { - scanner := bufio.NewScanner(file) - - var results mackerel.CPU - var cpuinfo map[string]interface{} - var modelName string - - for scanner.Scan() { - line := scanner.Text() - kv := strings.SplitN(line, ":", 2) - if len(kv) < 2 { - continue - } - key := strings.TrimSpace(kv[0]) - val := strings.TrimSpace(kv[1]) - - switch key { - case "processor": - cpuinfo = make(map[string]interface{}) - if modelName != "" { - cpuinfo["model_name"] = modelName - } - results = append(results, cpuinfo) - case "Processor", "system type": - modelName = val - case "vendor_id", "model", "stepping", "physical id", "core id", "model name", "cache size": - cpuinfo[strings.Replace(key, " ", "_", -1)] = val - case "cpu family": - cpuinfo["family"] = val - case "cpu cores": - cpuinfo["cores"] = val - case "cpu MHz": - cpuinfo["mhz"] = val - } - } - - if err := scanner.Err(); err != nil { - // Don't return error to prevent stop agent - // caused by failing on scanning /proc/cpuinfo - cpuLogger.Errorf("failed (on scanning /proc/cpuinfo): %s", err) - return nil, nil - } - - // Old kernels with CONFIG_SMP disabled has no "processor: " line - if len(results) == 0 && modelName != "" { - cpuinfo = make(map[string]interface{}) - cpuinfo["model_name"] = modelName - results = append(results, cpuinfo) - } - - return results, nil -} - // Generate CPU specs -func (g *CPUGenerator) Generate(ctx context.Context) (interface{}, error) { - file, err := os.Open("/proc/cpuinfo") +func (g *CPUGenerator) Generate(ctx context.Context) (any, error) { + infoStats, err := cpu.Info() if err != nil { - // Don't return error to prevent stop agent - // caused by failing on opening /proc/cpuinfo - cpuLogger.Errorf("failed (skip this spec): %s", err) - return nil, nil + cpuLogger.Errorf("Failed (skip this spec): %s", err) + return nil, err + } + results := make(mackerel.CPU, 0, len(infoStats)) + for _, infoStat := range infoStats { + result := map[string]any{ + "vendor_id": infoStat.VendorID, + "model": infoStat.Model, + "stepping": strconv.Itoa(int(infoStat.Stepping)), + "physical_id": infoStat.PhysicalID, + "core_id": infoStat.CoreID, + "cache_size": fmt.Sprintf("%d KB", infoStat.CacheSize), + "model_name": infoStat.ModelName, + "family": infoStat.Family, + "cores": strconv.Itoa(int(infoStat.Cores)), + "mhz": strconv.FormatFloat(infoStat.Mhz, 'f', -1, 64), + } + results = append(results, result) } - defer file.Close() - return g.generate(file) + return results, nil } diff --git a/spec/cpu_test.go b/spec/cpu_test.go deleted file mode 100644 index 99ad495..0000000 --- a/spec/cpu_test.go +++ /dev/null @@ -1,246 +0,0 @@ -package spec - -import ( - "bytes" - "testing" - - "github.com/mackerelio/mackerel-client-go" -) - -func TestCPUgenerate_linux4_0_amd64(t *testing.T) { - cpuinfo := `processor : 0 -vendor_id : GenuineIntel -cpu family : 6 -model : 2 -model name : QEMU Virtual CPU version 1.1.2 -stepping : 3 -microcode : 0x1 -cpu MHz : 3392.292 -cache size : 4096 KB -physical id : 0 -siblings : 1 -core id : 0 -cpu cores : 1 -apicid : 0 -initial apicid : 0 -fpu : yes -fpu_exception : yes -cpuid level : 4 -wp : yes -flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx lm rep_good nopl pni cx16 popcnt hypervisor lahf_lm -bugs : -bogomips : 6784.58 -clflush size : 64 -cache_alignment : 64 -address sizes : 40 bits physical, 48 bits virtual -power management: -processor : 1 -vendor_id : GenuineIntel -cpu family : 6 -model : 2 -model name : QEMU Virtual CPU version 1.1.2 -stepping : 3 -microcode : 0x1 -cpu MHz : 3392.292 -cache size : 4096 KB -physical id : 1 -siblings : 1 -core id : 0 -cpu cores : 1 -apicid : 1 -initial apicid : 1 -fpu : yes -fpu_exception : yes -cpuid level : 4 -wp : yes -flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx lm rep_good nopl pni cx16 popcnt hypervisor lahf_lm -bugs : -bogomips : 6784.58 -clflush size : 64 -cache_alignment : 64 -address sizes : 40 bits physical, 48 bits virtual -power management:` - - g := &CPUGenerator{} - value, err := g.generate(bytes.NewBufferString(cpuinfo)) - if err != nil { - t.Errorf("should not raise error: %v", err) - } - - cpus, typeOk := value.(mackerel.CPU) - if !typeOk { - t.Errorf("value should be mackerel.CPU. %+v", value) - } - - if len(cpus) != 2 { - t.Fatal("should have exactly 2 cpus") - } - - for _, cpu := range cpus { - modelName, ok := cpu["model_name"] - if !ok { - t.Error("cpu should have model_name") - } - if modelName != "QEMU Virtual CPU version 1.1.2" { - t.Error("cpu should have correct model_name") - } - - mhz, ok := cpu["mhz"] - if !ok { - t.Error("cpu should have mhz") - } - if mhz != "3392.292" { - t.Error("cpu should have correct mhz") - } - } -} - -func TestCPUgenerate_linux3_18_arm(t *testing.T) { - cpuinfo := `processor : 0 -model name : ARMv7 Processor rev 5 (v7l) -BogoMIPS : 38.40 -Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm -CPU implementer : 0x41 -CPU architecture: 7 -CPU variant : 0x0 -CPU part : 0xc07 -CPU revision : 5 -processor : 1 -model name : ARMv7 Processor rev 5 (v7l) -BogoMIPS : 38.40 -Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm -CPU implementer : 0x41 -CPU architecture: 7 -CPU variant : 0x0 -CPU part : 0xc07 -CPU revision : 5 -processor : 2 -model name : ARMv7 Processor rev 5 (v7l) -BogoMIPS : 38.40 -Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm -CPU implementer : 0x41 -CPU architecture: 7 -CPU variant : 0x0 -CPU part : 0xc07 -CPU revision : 5 -processor : 3 -model name : ARMv7 Processor rev 5 (v7l) -BogoMIPS : 38.40 -Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm -CPU implementer : 0x41 -CPU architecture: 7 -CPU variant : 0x0 -CPU part : 0xc07 -CPU revision : 5 -Hardware : BCM2709 -Revision : 1a01040` - - g := &CPUGenerator{} - value, err := g.generate(bytes.NewBufferString(cpuinfo)) - if err != nil { - t.Errorf("should not raise error: %v", err) - } - - cpus, typeOk := value.(mackerel.CPU) - if !typeOk { - t.Errorf("value should be mackerel.CPU. %+v", value) - } - - if len(cpus) != 4 { - t.Fatal("should have exactly 4 cpus") - } - - for _, cpu := range cpus { - modelName, ok := cpu["model_name"] - if !ok { - t.Error("cpu should have model_name") - } - if modelName != "ARMv7 Processor rev 5 (v7l)" { - t.Error("cpu should have correct model_name") - } - } -} - -func TestCPUgenerate_linux3_4_smp_arm(t *testing.T) { - cpuinfo := `Processor : ARMv7 Processor rev 0 (v7l) -processor : 0 -BogoMIPS : 38.40 -processor : 1 -BogoMIPS : 38.40 -processor : 2 -BogoMIPS : 38.40 -processor : 3 -BogoMIPS : 38.40 -Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt -CPU implementer : 0x51 -CPU architecture: 7 -CPU variant : 0x2 -CPU part : 0x06f -CPU revision : 0 -Hardware : Qualcomm MSM 8974 (Flattened Device Tree) -Revision : 0000 -Serial : 0000000000000000` - - g := &CPUGenerator{} - value, err := g.generate(bytes.NewBufferString(cpuinfo)) - if err != nil { - t.Errorf("should not raise error: %v", err) - } - - cpus, typeOk := value.(mackerel.CPU) - if !typeOk { - t.Errorf("value should be mackerel.CPU. %+v", value) - } - - if len(cpus) != 4 { - t.Fatal("should have exactly 4 cpus") - } - - for _, cpu := range cpus { - modelName, ok := cpu["model_name"] - if !ok { - t.Error("cpu should have model_name") - } - if modelName != "ARMv7 Processor rev 0 (v7l)" { - t.Error("cpu should have correct model_name") - } - } -} - -func TestCPUgenerate_linux3_0_nosmp_arm(t *testing.T) { - cpuinfo := `Processor : Marvell PJ4Bv7 Processor rev 1 (v7l) -BogoMIPS : 1196.85 -Features : swp half thumb fastmult vfp edsp vfpv3 vfpv3d16 -CPU implementer : 0x56 -CPU architecture: 7 -CPU variant : 0x1 -CPU part : 0x581 -CPU revision : 1 -Hardware : Marvell Armada-370 -Revision : 0000 -Serial : 0000000000000000` - - g := &CPUGenerator{} - value, err := g.generate(bytes.NewBufferString(cpuinfo)) - if err != nil { - t.Errorf("should not raise error: %v", err) - } - - cpus, typeOk := value.(mackerel.CPU) - if !typeOk { - t.Errorf("value should be mackerel.CPU. %+v", value) - } - - if len(cpus) != 1 { - t.Fatal("should have exactly 1 cpu") - } - - cpu1 := cpus[0] - modelName, ok := cpu1["model_name"] - if !ok { - t.Error("cpu should have model_name") - } - if modelName != "Marvell PJ4Bv7 Processor rev 1 (v7l)" { - t.Error("cpu should have correct model_name") - } -}