Open-falcon:Agent源码 - 前置校验

1 读取命令行参数

cfg := flag.String("c", "cfg.json", "configuration file")
version := flag.Bool("v", false, "show version")
check := flag.Bool("check", false, "check collector")

命令行参数:
-c=配置文件名 可以选择不同的配置文件
-v 查看当前版本
-check 检查基础采集项所需的命令是否可用

2 根据命令行参数执行对应操作

1.2.1 版本号

if *version {
    fmt.Println(g.VERSION)
    os.Exit(0)
}
如果命令行参数包含-v
则输出版本号后直接退出

版本号是open-falcon/agent/g/const.go文件中定义的常量:VERSION

1.2.2 校验

if *check {
    funcs.CheckCollector()
    os.Exit(0)
}
如果命令行参数包含-check
则执行采集项所需的命令,是否可用

CheckCollector()包含了以下逻辑,用以检查采集项是否可用

a)_, procStatErr := nux.CurrentProcStat()
判断/proc/stat文件是否读取成功,如果失败,将错误保存在procStatErr
b)_, listDiskErr := nux.ListDiskStats()
判断/proc/diskstats文件是否读取成功,如果失败,将错误保存在listDisErr
c)ports, listeningPortsErr := nux.ListeningPorts()
获取所有打开的TCP Socket,端口号切片放到ports,如果读取失败,错误保存在listeningPortsErr
d)procs, psErr := nux.AllProcs()
获取当前所有进程的基本数据(命令名,进程ID,命令行参数),进程的基本数据存入procs,获取过程中如果出错,则存入psErr
e)output["kernel "] = len(KernelMetrics()) > 0
KernelMetrics()返回一个切片,切片中每个元素代表内核的一个参数。具体元素的含义如下:系统级打开最大的文件描述符数;最大的进程ID;已经打开的文件描述符数量;剩余可用的文件描述符数
f)output["df.bytes"] = len(DeviceMetrics()) > 0
DeviceMetrics()返回一个切片,切片中每个元素代表文件系统中的一个参数。具体元素含义如下:硬盘某个分区总大小,某个分区已用大小,某个分区空闲大小,已用百分比,空闲百分比,文件节点总数,已用文件节点,空闲文件节点,已用文件节点百分比,空闲文件节点百分比
g)output["net.if "] = len(CoreNetMetrics([]string{})) > 0
CoreNetMetrics()返回一个一维切片,每20个元素一组。每20个元素代表一个网卡的当前情况。具体元素含义如下:收发的字节数,收发正确的包量,收发错误的包量,收发丢弃的包量
h)output["loadavg "] = len(LoadAvgMetrics()) > 0
LoadAvgMetrics()返回一个结构体,结构体的成员变量分别代表了前一分钟内平均的进程数,前五分钟内的平均进程数,前十五分钟内的平均进程数
i)output["memory "] = len(MemMetrics()) > 0
MemMetrics()返回一个结构提,结构体的成员变量分别代表了所有可用的RAM大小,所有空闲的RAM大小,已用RAM百分比,空闲RAM百分比,交换空间空闲百分比,交换空间已用百分比交换空间总和,RAM 暂存在 Swap 中的大小
j)output["netstat "] = len(NetstatMetrics()) > 0
NetstatMetrics()返回一个切片,记录了tcp各种异常数据包
k)output["ss -s "] = len(SocketStatSummaryMetrics()) > 0
显示套接字(socket)使用概况
l)output["ss -tln "] = listeningPortsErr == nil && len(ports) > 0
这里有点奇怪,如果一个TCP连接都没建立,check就失败了
m)output["ps aux "] = psErr == nil && len(procs) > 0
判断进程数是否大于0
n)output["du -bs "] = duErr == nil
判断du命令是否可用

你可能感兴趣的:(Open-Falcon源码剖析)