Zabbix 源码解析之监控项数据采集流程
一、概述
监控项数据采集是一个监控工具最基本的功能,监控数据采集的准确、实时、有效是Zabbix其它监控功能正常运转的前提。因此,Zabbix运维人员有必要了解监控项数据采集流程,并有针对性的设计巡检和问题处理流程,确保监控数据质量。
Zabbix 的监控采集类型很丰富,我最常用的是Agent方式,因此,就挑选Linux的内存监控(Zabbix内置key:vm.memory.size)为例来梳理一下监控项数据采集流程。
二、程序流程图
下图是我们梳理的vm.memory.size监控项采集流程图,数据采集的过程设计得缜密而复杂:
下面,我们将对主要流程和具体实现进行解析,涉及函数的具体实现解析写在了代码注释中。
三、相关数据结构定义
在介绍vm.memory.size具体实现之前,我们先介绍几个相关数据结构的定义。
(1)struct ZBXMETRIC
该结构体用于记录zabbix的监控项配置信息
(2) struct AGENTREQUEST
该结构体用于记录zabbix Agent的监控项请求信息
(3) struct AGENTRESULT
该结构体用于记录给zabbix Agent返回的采集数据
四、监控项vm.memory.size配置
用法: vm.memory.size[]
mode参数:
•total (*) - 总物理内存. mode的默认值
•free (*) - 可用内存.
•active - 内存当前使用或最近使用,它在RAM中是活跃的。
•inactive - 未使用内存.
•wired - 被标记为始终驻留在RAM中的内存,不会移动到磁盘。
•pinned - 同“wired”。
•anon - 与文件无关的内存(不能重新读取)。
•exec - 可执行代码,通常来自于一个(程序)文件。
•file - 缓存最近访问文件的目录。
•buffers (*) - 缓存磁盘读写数据。
•cached (*) - 缓存文件系统读写数据。
•shared - 可以同时被多个进程访问的内存。
•used (*) - 已使用内存。
•pused (*) - 已使用内存占总内存的百分比。
•available (*) - 可用内存
•pavailable (*) - 可用内存占总内存的百分比。
假如我们在某Host下定义了2个item:
Item1:Total memory Key1:vm.memory.size[total]
Item2:Available memory Key2:vm.memory.size[available]
这2个item就会被insert到Server数据库的items表中,这样该Host的Agent就可以获取到相应的采集任务了(获取流程本文不具体阐述),下面我们来重点看下vm.memory.size的采集实现和数据上送。
五、监控项vm.memory.size 采值实现
vm.memory.size监控项在不同的操作系统下实现各不相同,Linux系统下的实现,在src/libs/zbxsysinfo/linux/linux.c中。其配置项存放于parameters_specific数组中,可以看到对应的实现函数为VM_MEMORY_SIZE,
1. VM_MEMORYSIZE函数 (位置在:src/libs/zbxsysinfo/linux/memory.c)
用来接受参数,并对应调用对应的取值函数进行数据采集,并返回数据。
具体实现如下:
从源码中可以看到,Linux系统支持的模式包括如下参数,与官方文档中所列的参数不同。
•total
•free
•buffers
•used
•pused
•available
•pavailable
•shared
•cached
•active
•anon
•inactive
•slab
通过分析各个参数对应的取值逻辑,可分为2种方法:
•第一种:调用sysinfo函数获取指标值。通过这种方式获取的选项参数有:total,free,buffers,used,pused,pavailable,shared。
•第二种:读取/proc/meminfo文件中的指标值。通过这种方式获取的选项参数有:available,cached,active,anon,inactive,slab。
下面我们分别对两种情况进行分析。
(1)调用sysinfo函数
Linux中sysinfo()函数是用来获取系统相关统计信息的函数。它会将结果存储在struct sysinfo结构体中。
函数声明:
int sysinfo(struct sysinfo *info);
struct sysinfo的定义如下:
total,free,buffers,used,pused,pavailable,shared等指标,都是以struct sysinfo中的成员的取值来计算的。
• total:info.totalram * info.mem_unit
• free:info.freeram * info.mem_unit
• buffers:info.bufferram * info.mem_unit
• used:(info.totalram - info.freeram) * info.mem_unit
• pused:(info.totalram - info.freeram) / (double)info.totalram * 100
• pavailable:available / (info.totalram info.mem_unit) 100(available在/proc/meminfo文件中读出)
• shared:info.sharedram * info.mem_unit(仅Linux 2.4)
(2) 读取/proc/meminfo文件
该功能在VM_MEMORY_PROC_MEMINFO函数中实现。向meminfo_entry参数传递"Cached:", “Active:”, “AnonPages:”, “Inactive:”, "Slab:"字段。
其中available的获取比较特殊,它先检测/proc/meminfo文件文件中是否有"MemAvailable:"字段,如果没有,则再调用sysinfo函数获取。
具体实现如下:
六、监控项vm.memory.size 数据上送
前面解析的监控项的采值逻辑,下面我们来分析数据从Agent端上送到Server的过程。
介绍几个相关的函数:
1.init_metrics函数
vm.memory.size监控项会被存储到parameters_specific数组中。那么parameters_specific数组在哪儿被使用到呢?就在init_metrics函数中。
init_metrics函数在zabbix Server和zabbix Agent启动的过程中都被调用了,因此这些监控项在zabbix启动时已经被设置好了。
2.add_metric函数
add_metric函数会向commands数组中添加值。commands是在sysinfo.c中定义的一个ZBX_METRIC结构体变量,初始值是NULL。
add_metric函数具体实现如下:
3.process函数
commands数组在哪里被使用到了呢?在process函数中,process函数定义在src/libs/zbxsysinfo/sysinfo.c中。
在process函数中会最终调用监控项实现函数,那process函数在哪被调用到的呢?
在zabbix_agent中,调用process函数的地方有2处,分别位于agent的被动模式和主动模式的实现中。我们分别来分析一下。
(1) 被动模式下的processlistener函数
(2)主动模式下的processactivechecks函数
4. 监控项值的序列化与上送
介绍完相关的函数和调用,下面我们可以具体来分析数据上送的过程了
(1)agent与server通信协议
首先是通信协议,agent与server间的通信协议比较简单,其协议格式为:。
• PROTOCOL: 协议头,该字段长度为4个字节,内容为"ZBXD"。
• FLAGS: 协议标志,该字段长度为1个字节。有2个取值(这两个值可以使用“或”操作同时取):
– 0x01:ZBX_TCP_PROTOCOL,zabbix TCP通信协议
– 0x02:ZBX_TCP_COMPRESS,使用压缩算法
• DATALEN: 数据长度,该字段长度为4个字节。整型,以小端模式表示。
– 注意该长度不包含协议头这几个字段的长度,它仅表示DATA字段的数据长度。
• RESERVED: 保留字段,用作协议扩展,字段长度为4字节。当ZBX_TCP_COMPRESS标志被设置后,RESERVED字段会保存未被压缩时的数据段的长度。整型,以小端模式表示。
• DATA: 数据内容,使用JSON格式来序列化。
(2)监控项值的传递
1、我们以主动模式下会被调用的send_buffer函数(zbx_tcp_send()最终会调用到zbx_tcp_send_ext()函数)为例,分析一下监控项值如何发送给server。
被动模式下zbx_tcp_send_to(s, *value, …)函数最终也会调用到zbx_tcp_send_ext()函数,与主动模式下最终的处理是一致的,我们不再单独分析。
具体实现如下:
2、agent发送数据后,会从server端收到响应数据,响应数据的格式如下:
在响应数据中,response的状态可以是success或failure。响应数据的检测与解析在check_response函数中操作。
(3) 数据上送的具体实现
zbx_tcp_send()最终会调用到zbx_tcp_send_ext()函数,agent与server间的通信协议的数据序列化是在zbx_tcp_send_ext()函数中实现的。
至此,监控项数据采集流程就解析完了,还请各路专家批评指正:)
参考链接 :
Zabbix 源码解析之监控项数据采集流程 :https://mp.weixin.qq.com/s/YQH7n3HPNciIs71Ns4hz_A
Zabbix 源码解析之监控项数据采集流程相关推荐
- Netty 源码解析系列-服务端启动流程解析
netty源码解析系列 Netty 源码解析系列-服务端启动流程解析 Netty 源码解析系列-客户端连接接入及读I/O解析 五分钟就能看懂pipeline模型 -Netty 源码解析 1.服务端启动 ...
- Spring源码解析(五)-Bean的实例化流程(上)
在前面已经完成了对需要实例化bean的收集并封装成BeanDefinition,并且将BeanPostProcess等组件进行了提前实例化.接下来就到了容器启动的最后一步,也是最复杂的一步-实例化be ...
- FlinkSQL源码解析(三)执行流程
1.前言 前面2部分主要是介绍以下2点: flink sql整体的执行流程大致为:sqlNode --> Operation --> RelNode --> 优化 --> ex ...
- 从源码解析-结合Activity加载流程深入理解ActivityThrad的工作逻辑
ActivityThread源码解析 前言 类简称 类简介 一 二 三 四 五 代理和桩的理解 ActivityThread ActivityThread.main AT.attach AMN.get ...
- 【框架源码】Spring源码解析之BeanDefinition加载流程解析
观看本文之前,我们先思考一个问题,Spring是如何描述Bean对象的? Spring是根据BeanDefinition来创建Bean对象,BeanDefinition就是Spring中表示Bean定 ...
- Kafka源码解析 - 副本迁移任务提交流程
1.副本迁移脚本 kafka-reassign-partitions.sh工具来重新分布分区.该工具有三种使用模式: (1)generate模式,给定需要重新分配的Topic,自动生成reassign ...
- Celery 源码解析六:Events 的实现
序列文章: Celery 源码解析一:Worker 启动流程概述 Celery 源码解析二:Worker 的执行引擎 Celery 源码解析三: Task 对象的实现 Celery 源码解析四: 定时 ...
- Dubbo 实现原理与源码解析系列 —— 精品合集
摘要: 原创出处 http://www.iocoder.cn/Dubbo/good-collection/ 「芋道源码」欢迎转载,保留摘要,谢谢! 1.[芋艿]精尽 Dubbo 原理与源码专栏 2.[ ...
- dubbo源码解析之框架粗谈
dubbo框架设计 一.dubbo框架整体设计 二.各层说明 三.dubbo工程模块分包 四.依赖关系 五.调用链 文章系列 [一.dubbo源码解析之框架粗谈] [二.dubbo源码解析之dubbo ...
最新文章
- SAP PM 初级系列21 - 一个技术关闭的维修工单不能再被修改了!
- HDU 5606 tree 并查集
- 如何解决Silverlight InitializeError #2103 - Invalid or malformed application: Check manifest
- Centos7_ELK5.4.1配置部署
- 风雨飘摇中的HP会分拆Arcsight业务吗?
- 不用第三方库,也能用 Python 作图,效果还不错
- ngnix有版本要求吗_联想小新15 2020款值得入手吗?性能怎么样?不可不看的秘密...
- 老生常谈:工厂模式兄弟姐妹
- 深入探索 Java 热部署
- php响应式布局,响应式布局之弹性布局的介绍
- 获得picker选项的当前年月值_如果你用OPPO手机!千万记得开启开发者选项,手机性能大幅度提升...
- handsontable pro 授权码 key 生成器(JS函数)(仅供学习交流)
- 您的618快递正在燃烧?12吨快递货车高速上起火,网友:代入感极强!
- SPSS基本数据处理(一)
- 解决“虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本”
- .bat脚本执行cmd命令
- 什么是功率因数补偿/校正
- 好用的区块链浏览器--BlockScout安装
- Linux(Centos6.5)下安装Vertica9.2.1数据库教程
- 130 余个相见恨晚的超实用网站,总有一个用得着
热门文章
- 2018-2019互联网大厂算法/深度学习/NLP面试笔记
- 使用python+机器学习方法进行情感分析(详细步骤)
- mysql数据库什么情况下会锁表_mysql数据库锁的产生原因及解决办法
- 定点补码加减法运算_计算机相关问题:谈谈我眼中的补码
- 计算机科学与技术专业大学排名2020,2020计算机科学与技术专业最好大学排名:160余所大学上榜...
- android获取网络视频缩略图,Android 获取缩略图,网络视频,或者本地视频
- java drawimage api_HTML5 Canvas API中drawImage()方法的使用实例
- 《C++游戏开发》笔记十二 战争迷雾:初步实现
- java核心基础 --- 基本数据类型
- Discuz X3.1 论坛修改的方法