open-nomad/client/fingerprint/cpu.go

77 lines
1.8 KiB
Go
Raw Normal View History

2015-08-26 21:27:44 +00:00
package fingerprint
import (
2015-08-27 14:19:53 +00:00
"fmt"
2015-08-26 21:27:44 +00:00
"log"
"github.com/hashicorp/nomad/client/config"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/shirou/gopsutil/cpu"
)
// CPUFingerprint is used to fingerprint the CPU
type CPUFingerprint struct {
2015-11-05 21:46:02 +00:00
StaticFingerprinter
2015-08-26 21:27:44 +00:00
logger *log.Logger
}
// NewCPUFingerprint is used to create a CPU fingerprint
func NewCPUFingerprint(logger *log.Logger) Fingerprint {
f := &CPUFingerprint{logger: logger}
2015-08-26 21:27:44 +00:00
return f
}
func (f *CPUFingerprint) Fingerprint(cfg *config.Config, node *structs.Node) (bool, error) {
2016-05-09 15:19:04 +00:00
cpuInfo, err := cpu.Info()
2015-08-26 21:27:44 +00:00
if err != nil {
f.logger.Println("[WARN] Error reading CPU information:", err)
return false, err
}
// Assume all CPUs found have same Model and MHz. If cpu.Info()
// returns nil above, this loop is still safe.
2015-08-27 14:19:53 +00:00
var mhz float64
2015-08-26 21:27:44 +00:00
var modelName string
2015-08-27 14:19:53 +00:00
for _, c := range cpuInfo {
mhz = c.Mhz
2015-08-26 21:27:44 +00:00
modelName = c.ModelName
break
2015-08-26 21:27:44 +00:00
}
2015-08-27 14:19:53 +00:00
// Allow for a little precision slop
if mhz < 1.0 {
f.logger.Println("[WARN] fingerprint.cpu: Unable to obtain the CPU Mhz")
} else {
2015-08-27 14:19:53 +00:00
node.Attributes["cpu.frequency"] = fmt.Sprintf("%.6f", mhz)
f.logger.Printf("[DEBUG] fingerprint.cpu: frequency: %02.1f MHz", mhz)
2015-08-27 14:19:53 +00:00
}
var numCores int
if numCores, err = cpu.Counts(true); err != nil {
numCores = 1
f.logger.Println("[WARN] Unable to obtain the number of CPUs, defaulting to %d CPU", numCores)
}
2015-08-26 21:27:44 +00:00
if numCores > 0 {
2015-08-27 14:19:53 +00:00
node.Attributes["cpu.numcores"] = fmt.Sprintf("%d", numCores)
f.logger.Printf("[DEBUG] fingerprint.cpu: core count: %d", numCores)
2015-08-27 14:19:53 +00:00
}
if mhz > 0 && numCores > 0 {
2015-08-27 19:15:56 +00:00
tc := float64(numCores) * mhz
node.Attributes["cpu.totalcompute"] = fmt.Sprintf("%.6f", tc)
if node.Resources == nil {
node.Resources = &structs.Resources{}
}
2015-09-23 18:14:32 +00:00
node.Resources.CPU = int(tc)
2015-08-26 21:27:44 +00:00
}
2015-08-27 14:19:53 +00:00
2015-08-26 21:27:44 +00:00
if modelName != "" {
node.Attributes["cpu.modelname"] = modelName
}
return true, nil
}