cAdvisor源码分析

本文深入分析了cAdvisor的源码,从入口开始,详细解释了如何获取Machine Info和Docker Info。Machine Info部分涉及CPU、内存、磁盘等信息的获取,而Docker Info则通过inotify监测cgroup变化来跟踪Docker容器的创建和删除。Getprocesslist和ContainerInfo功能分别用于获取进程列表和特定容器的信息,包括ContainerSpec、cgroup和网络状态。
摘要由CSDN通过智能技术生成

cAdvisor监控数据分析

cAdvisor

入口

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值