千家信息网

cAdvisor如何获取到machine和docker container的信息

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍"cAdvisor如何获取到machine和docker container的信息",在日常操作中,相信很多人在cAdvisor如何获取到machine和docker containe
千家信息网最后更新 2026年11月03日cAdvisor如何获取到machine和docker container的信息

这篇文章主要介绍"cAdvisor如何获取到machine和docker container的信息",在日常操作中,相信很多人在cAdvisor如何获取到machine和docker container的信息问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"cAdvisor如何获取到machine和docker container的信息"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

入口

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     }7778     mux := http.DefaultServeMux7980     // 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     }8586     cadvisorHttp.RegisterPrometheusHandler(mux, containerManager, *prometheusEndpoint, nil)8788     // 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.go52 // The Manager interface defines operations for starting a manager and getting53 // container and machine information.54 type Manager interface {55     // Start the manager. Calling other manager methods before this returns56     // may produce undefined behavior.57     Start() error5859     // Stops the manager.60     Stop() error6162     // 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.go158     machineInfo, err := getMachineInfo(sysfs, fsInfo) // 此处通过 getMachineInfo() 函数获取 machine 信息159     if err != nil {160         return nil, err161     }162     newManager.machineInfo = *machineInfo163     glog.Infof("Machine: %+v", newManager.machineInfo)

获取 machineinfo 的具体函数 getMachineInfo()

# github.com/google/cadvisor/manager/machine.go52 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, err57     }58... ...

MachineInfo 数据结构:

# github.com/google/cadvisor/info/v1/machine.go131 type MachineInfo struct {132     // The number of cores in this machine.133     NumCores int `json:"num_cores"`134135     // Maximum clock speed for the cores, in KHz.136     CpuFrequency uint64 `json:"cpu_frequency_khz"`137138     // The amount of memory (in bytes) in this machine139     MemoryCapacity int64 `json:"memory_capacity"`140141     // The machine id142     MachineID string `json:"machine_id"`143144     // The system uuid145     SystemUUID string `json:"system_uuid"`146147     // The boot id148     BootID string `json:"boot_id"`149150     // Filesystems on this machine.151     Filesystems []FsInfo `json:"filesystems"`152153     // Disk map154     DiskMap map[string]DiskInfo `json:"disk_map"`155156     // Network devices157     NetworkDevices []NetInfo `json:"network_devices"`158159     // Machine Topology160     // Describes cpu/memory layout and hierarchy.161     Topology []Node `json:"topology"`162163     // Cloud provider the machine belongs to.164     CloudProvider CloudProvider `json:"cloud_provider"`165166     // Type of cloud instance (e.g. GCE standard) the machine is.167     InstanceType InstanceType `json:"instance_type"`168 }
  • cpu /proc/cpuinfo

  • mem /proc/meminfo

# github.com/google/cadvisor/utils/machine/machine.go76 func GetMachineMemoryCapacity() (int64, error) {77     out, err := ioutil.ReadFile("/proc/meminfo")78     if err != nil {79         return 0, err80     }8182     memoryCapacity, err := parseCapacity(out, memoryCapacityRegexp)83     if err != nil {84         return 0, err85     }86     return memoryCapacity, err87 }
  • machine_id /var/lib/dbus/machine-id

  • boot_id /proc/sys/kernel/random/boot_id

➜  ~  cat /var/lib/dbus/machine-ida8919ec7c9ee43bd1bcaf6cd55e1a7bc➜  ~  cat /proc/sys/kernel/random/boot_id2f6bac7f-738a-4d85-8b58-53e71296119e
  • disk /proc/diskstats

# github.com/google/cadvisor/fs/fs.go189 func (self *RealFsInfo) GetFsInfoForPath(mountSet map[string]struct{}) ([]Fs, error) {190     filesystems := make([]Fs, 0)191     deviceSet := make(map[string]struct{})192     diskStatsMap, err := getDiskStatsMap("/proc/diskstats") // 磁盘状态通过 /proc/diskstats 获取193     if err != nil {194         return nil, err195     }... ...

对于分配给容器的 pool 值,如果是 device mapper 类型的,则通过 dmsetup status pool_device_name 获取设备使用情况

# github.com/google/cadvisor/fs/fs.go... ...205             case "devicemapper":206                 total, free, avail, err = getDMStats(device, partition.blockSize)....
  • 获取磁盘设备信息 /sys/block

# github.com/google/cadvisor/utils/sysinfo/sysinfo.go31 func GetBlockDeviceInfo(sysfs sysfs.SysFs) (map[string]info.DiskInfo, error) {32     disks, err := sysfs.GetBlockDevices()       // cadvisor/utils/sysfs/sysfs.go GetBlockDevices() 可知,通过 /sys/block 获取磁盘设备名,其它信息雷同33     if err != nil {34         return nil, err35     }... ...
➜  ~  cat /sys/block/sda/dev                       # 主次设备号8:0➜  ~  cat /sys/block/sda/size                  # 磁盘设备大小976773168➜  ~  cat /sys/block/sda/queue/scheduler    # 磁盘调度类型noop deadline [cfq]➜  ~
  • netDevices /sys/class/net

# github.com/google/cadvisor/utils/sysinfo/sysinfo.go87 func GetNetworkDevices(sysfs sysfs.SysFs) ([]info.NetInfo, error) {88     devs, err := sysfs.GetNetworkDevices()89     if err != nil {90         return nil, err91     }92     netDevices := []info.NetInfo{}... ...
➜  ~  cat /sys/class/net/eth0/addressf0:76:1c:6d:26:d6➜  ~  cat /sys/class/net/eth0/mtu1500➜  ~  cat /sys/class/net/eth0/speed10
  • system UUID /sys/class/dmi/id/product_uuid

➜  ~  sudo cat /sys/class/dmi/id/product_uuidF27316D5-4DB3-E411-A26A-F0761C6D26D6➜  ~

Docker Info

# github.com/google/cadvisor/manager/manager.go201 // Start the container manager.202 func (self *manager) Start() error {203     // Register Docker container factory.204     err := docker.Register(self, self.fsInfo)205     if err != nil {206         glog.Errorf("Docker container factory registration failed: %v.", err)207     }... ...

cAdvisor 启动 container manager,通过调用 Linux 系统 inotify 监测 cgroup docker 目录的文件变化判断 docker 的创建和删除。

Getprocesslist

cAdvisor 首先判断自己是否运行在 container 中,如果是则 chroot /rootfs (cAdvisor 在 container 中运行会通过 volume 方式把系统 / mount 到 /rootfs 下)再执行 ps -e -o user,pid,ppid,stime,pcpu,pmem,rss,vsz,stat,time,comm,cgrou,否则直接执行获取。(github.com/google/cadvisor/manager/container.go GetProcessList() 函数实现)

# github.com/google/cadvisor/manager/manager.go687 func (m *manager) GetProcessList(containerName string, options v2.RequestOptions) ([]v2.ProcessInfo, error) {688     // override recursive. Only support single container listing.689     options.Recursive = false690     conts, err := m.getRequestedContainers(containerName, options)691     if err != nil {692         return nil, err693     }694     if len(conts) != 1 {695         return nil, fmt.Errorf("Expected the request to match only one container")696     }... ...

如果是获取全局而非某个 container 的 processlist,则 containername 默认为 "/",判断逻辑如下:

# github.com/google/cadvisor/manager/container.go273         if isRoot || c.info.Name == cgroup {274             processes = append(processes, v2.ProcessInfo{275                 User:          fields[0],276                 Pid:           pid,277                 Ppid:          ppid,278                 StartTime:     fields[3],279                 PercentCpu:    float32(percentCpu),... ...

ContainerInfo

获取指定 container 的 info 数据:

# github.com/google/cadvisor manager/manager.go531 func (self *manager) DockerContainer(containerName string, query *info.ContainerInfoRequest) (info.ContainerInfo, error) {532     container, err := self.getDockerContainer(containerName)533     if err != nil {534         return info.ContainerInfo{}, err535     }536... ...

具体获取函数:

# github.com/google/cadvisor/manager/container.go102 func (c *containerData) GetInfo() (*containerInfo, error) {103     // Get spec and subcontainers.104     if time.Since(c.lastUpdatedTime) > 5*time.Second {   // 可以看出当上一次更新时间超过 5s 的时候才会更新 info 数据 5105         err := c.updateSpec()106         if err != nil {107             return nil, err108         }... ...
  • ContainerSpec

cAdvisor 获取 ContainerSpec 总体的逻辑是找出对应 container 对应的系统 Spec json 文件。

container info handler:

# github.com/google/cadvisor/container/docker/handler.go220 func (self *dockerContainerHandler) GetSpec() (info.ContainerSpec, error) {221     mi, err := self.machineInfoFactory.GetMachineInfo()222     if err != nil {223         return info.ContainerSpec{}, err224     }
  • /proc/self/mountinfo 当前运行进程的挂载信息

  • /proc/cgroups 当前内核支持的 cgroup 类型

  • libcontainer configpath /var/run/docker/execdriver/native/containerId

# github.com/google/cadvisor/container/libcontainer/compatibility.go 读取 libcontainer config 文件信息150 func ReadConfig(dockerRoot, dockerRun, containerID string) (*configs.Config, error) {151     // Try using the new config if it is available.152     configPath := configPath(dockerRun, containerID)153     if utils.FileExists(configPath) {154         out, err := ioutil.ReadFile(configPath)155         if err != nil {156             return nil, err157         }158159         var state libcontainer.State160         err = json.Unmarshal(out, &state)161         if err != nil {162             return nil, err163         }164         return &state.Config, nil165     }
# github.com/google/cadvisor/container/docker/handler.go 磁盘使用率统计目前支持 aufs,这是目前 CentOS7 上没有 filesystem 大小的原因... ...232     // For now only enable for aufs filesystems233     spec.HasFilesystem = self.storageDriver == aufsStorageDriver... ...241 func (self *dockerContainerHandler) getFsStats(stats *info.ContainerStats) error {242     // No support for non-aufs storage drivers.243     if self.storageDriver != aufsStorageDriver {244         return nil245     }... ...
  • 文件系统相关 # github.com/google/cadvisor/fs/fs.go

  • aufs storage dir: /var/lib/docker/aufs/diff/containerId

  • 获取 cgroup 和 网络状态

# github.com/google/cadvisor/container/docker/handler.go# cgroup 信息是调用 github.com/docker/libcontainer/cgroups 获取276 func (self *dockerContainerHandler) GetStats() (*info.ContainerStats, error) {277     stats, err := containerLibcontainer.GetStats(self.cgroupManager, self.rootFs, self.pid)278     if err != nil {279         return stats, err280     }281     // Clean up stats for containers that don't have their own network - this282     // includes containers running in Kubernetes pods that use the network of the283     // infrastructure container. This stops metrics being reported multiple times284     // for each container in a pod.  如果 container 没有自己的网络,则返回空。对于 K8s pod 内部 container 都是通过 pause container 网络通信285     if !hasNet(self.networkMode) {286         stats.Network = info.NetworkStats{}287     }288289     // Get filesystem stats.290     err = self.getFsStats(stats)291     if err != nil {292         return stats, err293     }294295     return stats, nil296 }

具体获取 cgroup 和 network 的函数实现 GetStats()

  • container 网络状态 /proc//net/dev

# github.com/google/cadvisor/container/libcontainer/helpers.go81 // Get cgroup and networking stats of the specified container82 func GetStats(cgroupManager cgroups.Manager, rootFs string, pid int) (*info.ContainerStats, error) {83     cgroupStats, err := cgroupManager.GetStats()84     if err != nil {85         return nil, err86     }87     libcontainerStats := &libcontainer.Stats{88         CgroupStats: cgroupStats,89     }90     stats := toContainerStats(libcontainerStats)9192     // If we know the pid then get network stats from /proc//net/dev93     if pid > 0 {94         netStats, err := networkStatsFromProc(rootFs, pid)95         if err != nil {96             glog.V(2).Infof("Unable to get network stats from pid %d: %v", pid, err)97         } else {98             stats.Network.Interfaces = append(stats.Network.Interfaces, netStats...)99         }... ...

cgroup status 包含信息如下(cadVisor 调用 licontainer/cgroups 获取 container 对应 cgroup 信息):

# github.com/docker/libcontainer/cgroups/stats.go88 func NewStats() *Stats {89     memoryStats := MemoryStats{Stats: make(map[string]uint64)}90     hugetlbStats := make(map[string]HugetlbStats)91     return &Stats{MemoryStats: memoryStats, HugetlbStats: hugetlbStats}92 }

到此,关于"cAdvisor如何获取到machine和docker container的信息"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

信息 磁盘 函数 设备 文件 系统 网络 学习 代码 入口 数据 状态 类型 大小 更多 逻辑 帮助 支持 更新 运行 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网加科技 西安纸贵互联网科技有限公司 国智互联网科技 科技和互联网公司 厦门中拓互联网络科技有限公司 致骋互联网科技 广西互联网科技公司 科技互联网创业计划书 字节跳动和互联网科技 顶级互联网科技成果有哪些 宁夏众和广鑫互联网科技有限公司 受益于互联网科技的高速发展 昭通互联网科技选哪家 昊天互联网科技有限公司 广州新华互联网科技学校电竞方面 企晟互联网信息科技有限公司 山东有哪些互联网科技公司 互联网金融科技元年 互联网高科技行业有哪些企业 互联网企业和网络科技有限公司 亿人帮互联网科技有限公司 科技互联网龙头 互联网科技金融 北京禾田雨橡互联网科技 唐信互联网科技 大连 玖二柒互联网科技公司待遇 互联网科技与大数据专业 米聚互联网科技南京有限公司排面 悟空问答互联网科技 好易买互联网科技
0