cAdvisor 存储驱动插件详解:将容器指标推送到 BigQuery、InfluxDB、Kafka、Redis 等后端的完整指南
2026/9/20 6:02:14 网站建设 项目流程

cAdvisor 存储驱动插件详解:将容器指标推送到 BigQuery、InfluxDB、Kafka、Redis 等后端的完整指南

【免费下载链接】cadvisorAnalyzes resource usage and performance characteristics of running containers.项目地址: https://gitcode.com/gh_mirrors/ca/cadvisor

本文围绕 cAdvisor 的存储驱动(storage driver)插件体系展开:先讲清StorageDriver接口与插件注册机制,再逐一介绍 BigQuery、Elasticsearch、InfluxDB、Kafka、Prometheus、Redis、StatsD、stdout 八种后端各自的配置参数与默认值,帮助你在生产环境把容器资源用量数据可靠地落地到外部存储系统。

核心概念:数据流向与-storage_driver开关

cAdvisor 持续采集容器与宿主机的 CPU、内存、网络、文件系统、HugeTLB、perf、resctrl 等指标。这些指标始终会先缓存在本地内存中(内存缓存时长由-storage_duration控制,默认 2 分钟),而存储驱动决定这些数据是否还要被**主动推送(push 模型)**到外部后端。

这一机制在 入口文件 cmd/storagedriver.go 中实现:

storageDriver = flag.String("storage_driver", "", "Storage `driver` to use. Data is always cached shortly in memory, this controls where data is pushed besides the local cache. Empty means none, multiple separated by commas. ...") storageDuration = flag.Duration("storage_duration", 2*time.Minute, "How long to keep data stored (Default: 2min).")

启用存储驱动只需设置-storage_driver标志,取值为已注册驱动名;留空表示不启用任何后端推送。值得注意的是,支持逗号分隔同时启用多个驱动(如-storage_driver=stdout,influxdb),NewMemoryStorage会按逗号拆分并对每个名称调用storage.New逐个构造,任何一个驱动初始化失败都会导致 cAdvisor 启动失败(Failed to initialize storage driver)。

插件注册机制:StorageDriver接口

所有后端共享同一个极简接口,定义在 lib/storage/storage.go:

type StorageDriver interface { AddStats(cInfo *info.ContainerInfo, stats *info.ContainerStats) error // Close will clear the state of the storage driver. ... Close() error }
  • AddStats:每次采到一条容器统计(*info.ContainerStats)时被调用,驱动自行决定序列化格式与写入目标;
  • Close:退出时清理连接状态(如关闭 Kafka producer、Redis 连接)。

驱动通过init()中的storage.RegisterStorageDriver(name, new)注册到全局 registry,lib/storage/storage.go 提供RegisterStorageDriver/New/ListDrivers三个函数。二进制通过 cmd/storagedriver.go 的 7 个_ import(blank import)触发各驱动的init()完成注册:

_ "github.com/google/cadvisor/cmd/internal/storage/bigquery" _ "github.com/google/cadvisor/cmd/internal/storage/elasticsearch" _ "github.com/google/cadvisor/cmd/internal/storage/influxdb" _ "github.com/google/cadvisor/cmd/internal/storage/kafka" _ "github.com/google/cadvisor/cmd/internal/storage/redis" _ "github.com/google/cadvisor/cmd/internal/storage/statsd" _ "github.com/google/cadvisor/cmd/internal/storage/stdout"

-storage_driver的帮助文本中列出的可选驱动名正是通过storage.ListDrivers()动态生成的,因此帮助信息与实际注册表永远一致。

通用存储标志:storage_driver_*系列

各数据库类驱动(InfluxDB、Redis 等)共享一组通用标志,统一定义在 lib/storage/common_flags.go:

标志默认值说明
-storage_driver_hostlocalhost:8086数据库/服务实例的ip:port
-storage_driver_dbcadvisor数据库名(Redis 驱动中则作为存储键名使用)
-storage_driver_tablestats表名
-storage_driver_userroot数据库用户名
-storage_driver_passwordroot数据库密码
-storage_driver_securefalse是否使用安全(TLS)连接
-storage_driver_buffer_duration60s写入在非内存后端前缓冲的时长,按单个事务提交

其中-storage_driver_buffer_duration的缓冲语义在各驱动实现中体现:例如 cmd/internal/storage/redis/redis.go 中AddStats先加锁,仅当距上次落盘时间超过bufferDuration(由readyToFlush判断)时才真正执行LPUSH,把多条统计合并为低频写入。

各驱动详解

1. stdout:最简驱动,用于调试

stdout驱动把每条容器统计格式化为一行文本打印到标准输出,实现在 cmd/internal/storage/stdout/stdout.go。输出格式形如:

cName=<容器名或首个alias> host=<storage_driver_host值> timestamp=... cpu_usage_total=... memory_usage=... rx_bytes=... fs_limit=...

从源码看,它输出的指标键覆盖 CPU(cpu_usage_total/system/user/per_cpu,并保留待废弃的cpu_cumulative_usage兼容字段)、load_average、网络收发、内存(usage/max/cache/rss/swap/working set/failcnt)、文件系统(汇总与按设备)、HugeTLB、perf 与 resctrl 等全部维度。该驱动没有任何外部依赖,最适合验证采集链路是否打通——注意它复用了storage_driver_host作为日志中的host字段,仅起标识作用。

2. InfluxDB:时序数据库首选

用法文档见 docs/storage/influxdb.md。启用方式与完整参数如下(默认值取自 cmd/internal/storage/influxdb/influxdb.go 及通用标志定义):

# 设置存储驱动为 InfluxDB -storage_driver=influxdb # 数据库的 *ip:port*。默认 'localhost:8086' -storage_driver_host=ip:port # 数据库名。默认使用 'cadvisor' -storage_driver_db # 数据库用户名。默认 'root' -storage_driver_user # 数据库密码。默认 'root' -storage_driver_password # 是否使用安全连接。默认 false -storage_driver_secure # 写入按此时长缓冲,合并为单个事务提交。默认 '60s' -storage_driver_buffer_duration # 保留策略。默认 '',对应 InfluxDB 默认保留策略 -storage_driver_influxdb_retention_policy

3. Prometheus:拉模式(pull)指标端点

Prometheus 与其他 push 型驱动不同,它不出现在-storage_driver注册表中,而是由 cAdvisor 内建采集器在 HTTP 端点上暴露指标,Prometheus 按 scrape 周期拉取,说明见 docs/storage/prometheus.md。关键配置:

  • -prometheus_endpoint:指标端点路径,默认/metrics(见 cmd/cadvisor.go);
  • -enable_metrics/-disable_metrics:按指标类别(如cpumemorynetworkdiskdiskIOfs等逗号分隔集合)控制采集范围,两者都定义在 cmd/cadvisor.go。从源码看,默认禁用集合包含 NUMA 内存、TCP/UDP 网络、进程调度、Hugetlb、referenced memory、CPU 拓扑、resctrl、cpuset 等类别,设置-enable_metrics时它会完全覆盖-disable_metrics

因此对 Prometheus 用户而言,“存储”工作完全外置,cAdvisor 只需保证端点可达并选对指标类别。

4. BigQuery(实验性):服务端到端 OAuth 认证

文档见 cmd/internal/storage/bigquery/README.md,其中明确标注该实现为EXPERIMENTAL,认证参数尚未合并为单一后端配置。需要指定:

# 存储驱动 -storage_driver=bigquery # 服务端到端 OAuth 凭证(Service Account client id,Google Developer API 下创建) -bq_id="XYZ.apps.googleusercontent.com" # 服务账号邮箱 -bq_account="ABC@developer.gserviceaccount.com" # PEM 私钥文件路径(由 p12 文件转换而来) -bq_credentials_file="/path/to/key.pem" # 存储数据集的 GCP 项目 ID -bq_project_id="awesome_project"

5. Elasticsearch:JSON 全文索引

说明文档见 docs/storage/elasticsearch.md。实现位于 cmd/internal/storage/elasticsearch/elasticsearch.go,每条统计以 JSON 文档形式索引,文档包含timestamp(微秒)、machine_name(宿主机名)、container_Name(优先取别名)与完整container_stats。相关标志(见 elasticsearch.go):

标志默认值说明
-storage_driver_es_hosthttp://localhost:9200Elasticsearch 地址
-storage_driver_es_indexcadvisor索引名
-storage_driver_es_typestats类型名
-storage_driver_es_enable_snifferfalse是否启用节点嗅探自动发现集群全部节点

从源码看,客户端启用健康检查(30 秒间隔),初始化时会 Ping 一次服务端获取版本号;写入由互斥锁串行化,因为AddStats会被多线程并发调用。

6. Kafka:异步生产者 + TLS

说明文档见 docs/storage/kafka.md。实现位于 cmd/internal/storage/kafka/kafka.go,基于 sarama 的AsyncProducer,每条统计序列化为包含timestampmachine_namecontainer_Namecontainer_Idcontainer_labelscontainer_stats的 JSON 消息(见 detailSpec 结构)。标志:

标志默认值说明
-storage_driver_kafka_broker_listlocalhost:9092broker 列表,CSV 逗号分隔
-storage_driver_kafka_topicstats目标 topic
-storage_driver_kafka_ssl_cert/_ssl_key/_ssl_caTLS 客户端证书、私钥与 CA 文件,三者同时提供时启用 mTLS
-storage_driver_kafka_ssl_verifytrue是否校验证书链

生产者配置Producer.RequiredAcks = kafka.WaitForAll,即等待全部 ISR 副本确认后才认为发送成功。注意Close时才会关闭 producer 并 flush,进程退出信号由 cmd/cadvisor.go 的 signal handler 统一触发containerManager.Stop()

7. Redis:LPUSH 列表缓冲

实现位于 cmd/internal/storage/redis/redis.go。该驱动没有独立标志,直接复用通用标志:以-storage_driver_host建立 TCP 连接,以-storage_driver_db(默认cadvisor)作为 Redis 中的键名,按-storage_driver_buffer_duration控制落盘频率。每条统计包装为{timestamp, machine_name, container_Name, container_stats}JSON 后执行LPUSH,数据以列表形式堆积在指定键上,消费方可用BRPOP/RPOP等命令拉取。从源码看,lastWrite初始化为当前时间,即启动后首个缓冲窗口内不会写入——这是排查“Redis 里迟迟没有数据”时的第一个检查点。

8. StatsD:极简计数器协议

说明文档见 docs/storage/statsd.md。只需:

-storage_driver=statsd -storage_driver_host=ip:port

statsd 默认端口为 8125,典型启动命令:

cadvisor --storage_driver="statsd" --storage_driver_host="localhost:8125"

实现见 cmd/internal/storage/statsd/statsd.go,指标命名与 stdout 驱动一致(cpu_usage_totalmemory_usagememory_working_set等),仅通过 UDP 计数器/gauge 上报,适合已部署 Datadog/Graphite 体系的团队。

选型与组合建议

结合仓库实现可以给出如下选择依据:

  • 时序存储与可视化:InfluxDB(push + 保留策略)或 Prometheus(pull,/metrics);后者无需维护数据库,且指标命名(container_cpu_usage_seconds_total等)符合 Prometheus 惯例;
  • 大数据/BI 查询:BigQuery,但需接受其实验性状态与独立的 OAuth 参数集;
  • 日志式全文检索:Elasticsearch,每条统计即一个 JSON 文档,可直接按容器名与字段检索;
  • 流式处理管道:Kafka,带WaitForAll确认与可选 mTLS;
  • 轻量队列或临时落地:Redis,配置最少;
  • 监控协议兼容:StatsD;
  • 本地调试:stdout。

由于-storage_driver支持逗号分隔多驱动,可以在同一 cAdvisor 实例上同时推送 stdout(审计)+ InfluxDB(长期存储)+ Prometheus(告警),三者互不冲突——各驱动由内存缓存统一喂数据,写入彼此独立。

小结

cAdvisor 的存储层以极小的接口(AddStats/Close)加注册表机制(lib/storage/storage.go)承载了 7 个 push 型驱动,配合 7 个通用storage_driver_*标志完成主机、库名、凭据与缓冲时长的配置;Prometheus 则以拉模式端点单独承担。理解“内存缓存 +-storage_duration+ 驱动 push”这条数据链路后,你就可以按目标后端的特性选择驱动、组合启用,并通过 docs/storage/ 目录下的各专项文档继续深入具体示例。

【免费下载链接】cadvisorAnalyzes resource usage and performance characteristics of running containers.项目地址: https://gitcode.com/gh_mirrors/ca/cadvisor

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询