找回密码
 立即注册
首页 业界区 业界 vmagent 源码阅读

vmagent 源码阅读

蝙俚 2025-10-1 19:10:56
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!

  • cnblogs博客
  • zhihu
  • Github
  • 公众号:一本正经的瞎扯
    1.png

读了大约半天的 vmagent 的代码,为了确定一些特定的用法的实现逻辑。
增加了很多中文注释,并且把代码提交到了:https://github.com/ahfuzhang/VictoriaMetrics_cluster_v1.96.0/tree/dev/comment_vmagent
通过 github.com/ahfuzhang/VictoriaMetrics_cluster_v1.96.0/app/vmagent/main.go 这个文件开始,可以看到 vmagent 初始化等部分的详细注释。
下面用一句话表达的模式,来总结源码阅读的心得:

  • -promscrape.config=xx.yaml 这个配置项感觉是 vmagent 最重要的配置项

    • 配置项可以填写文件路径,也可以用 http://xxx 提供一个下载地址。文档里面没提可以使用 http,从代码里面发现了这一点。
    • 这个配置文件决定了:

      • 多久抓一轮 exporter 中的 metrics 数据
      • 抓取的 exporter 的列表

    • 如果配置文件中的某个 job,使用了 kubernetes_sd_configs 的方式来寻找 exporter

      • 部署在 k8s 中时,通常使用 k8s 中的名字来归拢一组 pod
      • vmagent 会根据环境变量,定位到 k8s api server 的地址
      • 每个 job 创建一个协程,每隔 5 秒通过 k8s api server 查询 name 对应的多个 exporter 的 ip:port

    • scrape_interval 这个参数只能来自 yaml 配置文件,无法从其他地方修改。

      • 如果有多种 scrape_interval 配置的需求,只能部署不同的群集来支持


  • -remoteWrite.XX 这一系列的参数是第二重要的:具体见 here

    • 这个系列的参数都是数组。一个参数重复出现多次是,第 N 次出现,就对应着数组下标 N-1
    • 这些数组参数包括了(非常多):

      • -remoteWrite.url=vminsert 的地址
      • -remoteWrite.streamAggr.config=xx.yaml


  • vmagent 有 time series 的 aggregation 的能力,具体见:here

    • 每个 -remoteWrite.url 对应着一个 aggregation 的计算对象

      • 每个 aggregation 下面又存在多个 rule


  • 在没有配置 aggregation 的情况下:

    • time series 会冗余发送到多个 -remoteWrite.url 上面。
    • 除非配置 aggregation,否则多个 -remoteWrite.url 的行为是一致的

  • 可以通过配置文件在 -remoteWrite.streamAggr.config 命令行参数中进行配置,也可以通过 -remoteWrite.streamAggr.xx 的系列参数进行配置。

    • 每个 scrape_interval 的间隔,vmagent 会抓取所有 exporter 的 time series 数据,然后进入 aggregation 的计算逻辑
    • aggregation 会进行典型的 relabel / 降采样 / 汇总 等计算
    • 当配置 streamAggrDropInput=true 并且 streamAggrKeepInput=false 的时候,会只留下 aggregation 后的结果,而丢弃原始的 time series

      • 这里其实不合理,我提了一个 issue

    • 在经过 -remoteWrite.streamAggr.dedupInterval 这里配置的这么长的时间后, aggregation 的结果会被发送到 remoteWrite URL
    • 也就是说:vmagent可以作为一种前置计算的能力,可以以 A 频率采集 exporter 数据,然后做各种 Aggregation 计算,然后以 B 频率发送到存储群集
    • remoteWrite.url 与 aggregation 的配置是数组:因此,可以配置非常多的 aggregation 来做不同维度的数据加工,并最终存储在不同的后端里(当然也可以是同一个)


Have Fun. 希望对大家有用。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册