cAdvisor监控数据分析
入口
- 代码入口:
github.com/google/cadvisor/cadvisor.go
- API handler:
github.com/google/cadvisor/api/handler.go
- 基于 tag: v0.19.2
# github.com/google/cadvisor/cadvisor.go
... ...
73 containerManager, err := manager.New(memoryStorage, sysFs, *maxHousekeepingInterval, *allowDynamicHousekeeping)
74 if err != nil {
75 glog.Fatalf("Failed to create a Container Manager: %s", err)
76 }
77
78 mux := http.DefaultServeMux
79
80 // Register all HTTP handlers.
81 err = cadvisorHttp.RegisterHandlers(mux, containerManager, *httpAuthFile, *httpAuthRealm, *httpDigestFile, *httpDigestRealm)
82 if err != nil {
83 glog.Fatalf("Failed to register HTTP handlers: %v", err)
84 }
85
86 cadvisorHttp.RegisterPrometheusHandler(mux, containerManager, *prometheusEndpoint, nil)
87
88 // Start the manager.
89 if err := containerManager.Start(); err != nil {
90 glog.Fatalf("Failed to start container manager: %v", err)
91 }
... ...
从入口可以得知真正获取 container 和 machine 信息的 interface 为 Manager,github.com/google/cadvisor/manager/manager.go
# github.com/google/cadvisor/manager/manager.go
52 // The Manager interface defines operations for starting a manager and getting
53 // container and machine information.
54 type Manager interface {
55 // Start the manager. Calling other manager methods before this returns
56 // may produce undefined behavior.
57 Start() error
58
59 // Stops the manager.
60 Stop() error
61
62 // Get information about a container.
63 GetContainerInfo(containerName string, query *info.ContainerInfoRequest) (*info.ContainerInfo, error)
... ...
以下对 cadvisor 具体如何获取到 machine 和 docker container 的信息结合代码具体讲解。
Machine Info
# github.com/google/cadvisor/manager/manager.go
158 machineInfo, err := getMachineInfo(sysfs, fsInfo) // 此处通过 getMachineInfo() 函数获取 machine 信息
159 if err != nil {
160 return nil, err
161 }
162 newManager.machineInfo = *machineInfo
163 glog.Infof("Machine: %+v", newManager.machineInfo)
获取 machineinfo 的具体函数 getMachineInfo()
# github.com/google/cadvisor/manager/machine.go
52 func getMachineInfo(sysFs sysfs.SysFs, fsInfo fs.FsInfo) (*info.MachineInfo, error) {
53 cpuinfo, err := ioutil.ReadFile("/proc/cpuinfo")
54 clockSpeed, err := machine.GetClockSpeed(cpuinfo)
55 if err != nil {
56 return nil, err
57 }
58
... ...
MachineInfo 数据结构:
# github.com/google/cadvisor/info/v1/machine.go
131 type MachineInfo struct {
132 // The number of cores in this machine.
133 NumCores int `json:"num_cores"`
134
135 // Maximum clock speed for the cores, in KHz.