1 - 服务端
项目地址: https://github.com/jkstack/agent-server
最新版本:
2 - example-agent
项目地址: https://github.com/jkstack/example-agent
最新版本:
2.1 - Agent开发
Agent开发
创建项目并导入libagent库
go get github.com/jkstack/libagent
定义一个结构体并实现App接口
在main函数中添加RegisterService、UnregisterService和Run等libagent库中的接口调用
switch *act { case "install": agent.RegisterService(app) case "uninstall": agent.UnregisterService(app) default: agent.Run(app) }
研发与打包规范
- 项目根目录中必须包含一个
CHANGELOG.md
文件,在打包过程中会自动读取该文件中的内容并自动填写到Release的描述信息中,格式可参考样例 - 项目根目录中必须包含一个
Makefile
文件,在打包过程中会使用该文件中的第一个目标进行打包,打包成功后的产物必须存放到release目录下 - 开发的代码在原则上需要支持谷歌维护的最新的两个go语言版本,因此在go.mod文件中目前会被设置为1.18版本
- 在项目初始化的过程中需要修改contrib目录下的文件,如修改正确的打包路径等
- 为方便于外部工具化部署,需要正确修改
manifest.yaml
文件,使其符合配置文件中的配置项描述
打包方法
通过在项目中引入workflows目录下的build.yml和release.yml可实现项目的自动化打包。
- build.yml中定义了当master分支发生合并时会进行代码的lint检查及go build测试
- release.yml中定义了当该项目被打上了
v*.*.*
的标签后将会触发release动作,首先会进行各种系统下的跨平台编译与打包,然后读取CHANGELOG.md
中对应版本的描述信息进行创建release操作,并将release目录下的文件进行上传
更多示例
- exec-agent: 远程执行脚本以及文件传输
- metrics-agent: 监控数据采集
2.2 - 配置项描述
每一个Agent项目中的conf目录下必须包含一个manifest.yaml
文件用于描述该Agent的配置项信息,该文件被用于外部工具做自动化部署时的展示。
该文件的内容最顶层为一个数组,其中每一个元素代表配置文件中的某一个字段,该字段的描述信息如下:
key
: 该字段在配置文件中的名称name.zh
: 该字段的中文名称,用于自动化部署工具的展示desc.zh
: 该字段的中文描述type
: 该字段类型,目前已支持以下类型string
: 字符串enum
: 枚举值csv
: 逗号分隔的字符串,允许多个值int
: 有符号整数uint
: 无符号整数float
: 浮点数bool
: 布尔值naddr
: 网络地址,<ip>:<port>path
: 文件路径bytes
: 可视化字节数,(n)G、(n)M、(n)KB、(n)B等duration
: 时长,(n)h、(n)m、(n)s等uuid
: 唯一标识ID
required
: 是否必填default
: (可选)默认值enum_valid
: (可选)enum字段允许输入的内容csv_valid
: (可选)csv字段允许输入的内容str_valid
: (可选)string类型的匹配正则表达式min
: (可选)最小值,支持的数据类型int
、uint
、float
、bytes
、duration
max
: (可选)最大值,支持的数据类型int
、uint
、float
、bytes
、duration
len
: (可选)最大长度,支持的数据类型string
、csv
、path
allow_relative
: (可选)是否允许使用相对路径,支持的数据类型path
category
: (可选)配置项分类
示例
- key: basic.id
type: string
name:
zh: AgentID
desc:
zh: Agent的ID,在当前服务器下的集群内唯一
required: true
- key: basic.server
type: naddr
name:
zh: 服务端地址
desc:
zh: 链接服务器端的地址
default: 127.0.0.1:13081
required: true
- key: basic.log.target
type: csv
name:
zh: 日志保存目标
desc:
zh: 日志保存目标,目前仅支持stdout和文件
default: stdout
csv_valid: [ stdout, file ]
required: false
- key: basic.log.dir
type: path
name:
zh: 日志保存路径
desc:
zh: 日志保存路径
default: ./logs
required: false
- key: basic.log.size
type: bytes
name:
zh: 日志文件滚动大小
desc:
zh: 日志文件生成时每个文件的大小
default: 10M
min: 1M
max: 100M
required: false
- key: basic.log.rotate
type: uint
name:
zh: 日志文件保留份数
desc:
zh: 日志文件生成时最多保留份数
default: 7
min: 1
max: 100
required: false
关联关系
示例1
log.target = stdout,file
log.dir = ./logs
log.size = 10M
log.rotate = 7
当log.target
字段未设置file
属性时,log.dir
、log.size
、log.rotate
配置项是无效的。
示例2
monitor.enabled = true
monitor.interval = 10s
当monitor.enabled
字段设置为false时,monitor.interval
配置项是无效的。
基于以上两种情况,增加配置字段如下:
- key: basic.log.dir
...
enabled:
when:
target: basic.log.target
contain: file
- key: basic.monitor.interval
...
enabled:
when:
target: basic.monitor.enabled
equal: true
enabled
字段用于表示当前字段的有效范围when
字段表示当条件中的描述符合要求时该字段有效target
: 该字段表示需要关联到的原始字段名称contain
: 针对于原始字段为csv
类型时csv内容中包含该配置项时当前字段才有效equal
: 针对于原始字段为bool
或数值
类型时原始字段的值与要求内容相符时才有效
4 - metrics-agent
项目地址: https://github.com/jkstack/metrics-agent
最新版本:
兼容性
系统 | 版本号 | 内核版本 | 是否支持 |
---|---|---|---|
ubuntu | 12.04 | 3.2 | ✅ |
ubuntu | 14.04 | 3.13 | ✅ |
ubuntu | 16.04 | 4.4 | ✅ |
ubuntu | 18.04 | 4.15 | ✅ |
ubuntu | 20.04 | 5.4 | ✅ |
ubuntu | 22.04 | 5.15 | ✅ |
suse | 10(SP4) | 2.6.16.60-0.132.1 | ❌ |
suse | 11(SP4) | 3.0.101-108.135.1 | ✅ |
suse | 12(SP5) | 4.12.14-122.130.1 | ✅ |
suse | 15(SP4) | 5.14.21-150400.24.18.1 | ✅ |
redhat | 5.11 | 2.6.18-398 | ❌ |
redhat | 6.1 | 2.6.32-754 | ✅ |
redhat | 7.9 | 3.10.0-1160 | ✅ |
redhat | 8.6 | 4.18.0-372.9.1 | ✅ |
centos | 5.11 | 2.6.18-398 | ❌ |
centos | 6.1 | 2.6.32-754 | ✅ |
centos | 7.9-2009 | 3.10.0-1160 | ✅ |
centos | 8.5.2111 | 4.18.0-348 | ✅ |
windows | XP | ❌ | |
windows | 7 Enterprise with Service Pack 1 | ✅ | |
windows | 7 Professional with Service Pack 1, VL Build | ✅ | |
windows | 10 Enterprise LTSC 2021 | ✅ | |
windows | 2008 R2 Enterprise | ✅ | |
windows | 2008 R2 Datacenter | ✅ | |
windows | 2016 VL | ✅ | |
windows | 2016(Updated Feb 2018) | ✅ | |
windows | 2016 Essentials | ✅ | |
windows | 2019(Updated July 2020) | ✅ | |
windows | 2022(updated Aug 2022) | ✅ |
采集项
采集项分为静态数据、usage数据、进程列表数据、连接列表数据、传感器温度数据,这5类数据可单独设置采集频率。
静态数据
静态数据的默认采集频率为1天,该部分数据的特点是基本不太会变化,如CPU核心数、CPU型号、内存总大小等,可采集到的内容如下:
采集项 | 描述 |
---|---|
host_name | 主机名 |
uptime | 系统启动时长 |
os_name | 操作系统类型,如linux、windows等 |
platform_name | 操作系统名称,如debian、centos等 |
platform_version | 操作系统版本号,如7.7.1908 |
install | 操作系统安装时间 |
startup | 操作系统启动时间 |
kernel_version | 内核版本号 |
arch | 操作系统位数,如amd64、i386等 |
physical_cpu | 物理核心数,表示有多少块CPU |
logical_cpu | 逻辑核心数 |
gateway | 网关地址 |
nameservers | dns服务器列表 |
其中cores
字段表示该主机的CPU核心列表,内容如下:
采集项 | 描述 |
---|---|
processor | 当前是第几个核心 |
model | 核心型号,如Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz |
core | 该核心所在物理核心编号 |
cores | 该核心所在CPU上的编号 |
physical | 该核心所在CPU在主板上的物理编号 |
mhz | 该核心的频率 |
其中disks
字段表示该机器的磁盘列表,内容如下:
采集项 | 描述 |
---|---|
model | 品牌型号 |
total | 总容量 |
type | 磁盘类型,0=硬盘;1=软盘;2=光盘 |
partitions | 分区列表 |
其中partitions
字段表示该机器的硬盘分区信息,内容如下:
采集项 | 描述 |
---|---|
mount | linux系统为挂载路径如/run,windows系统为盘符如C: |
type | 分区类型,如NTFS等 |
options | 挂载选项,如rw,nosuid,nodev等 |
total | 该分区总容量 |
inodes | 该分区总inode数量 |
其中interfaces
字段表示该机器的网卡列表信息,内容如下:
采集项 | 描述 |
---|---|
index | 该网卡下标 |
name | 网卡名称,如eth0 |
mtu | 该网卡的mut配置 |
flags | 该网卡的附加参数,如BROADCAST,RUNNING,MULTICAST等 |
addrs | 该网卡绑定的IP列表,包含IPv4和IPv6地址 |
mac | 该网卡的mac地址 |
其中users
字段表示该主机上的账号列表,内容如下:
采集项 | 描述 |
---|---|
name | 用户名 |
id | 用户ID |
gid | 用户所在组ID |
usage数据
usage数据表示该主机的使用率数据,默认采集频率为5秒,可采集到的内容如下:
采集项 | 描述 |
---|---|
cpu_usage | CPU使用率 |
memory_used | 内存占用字节数 |
memory_free | 内存剩余字节数 |
memory_available | 可用内存字节数 |
memory_usage | 内存使用率 |
swap_used | 已使用swap内存字节数 |
swap_free | 剩余swap内存字节数 |
cpu_load_1 | CPU的最近1分钟负载 |
cpu_load_5 | CPU的最近5分钟负载 |
cpu_load_15 | CPU的最近15分钟负载 |
其中partitions
字段表示磁盘分区当前使用率列表,内容如下:
采集项 | 描述 |
---|---|
mount | linux系统为挂载路径如/run,windows系统为盘符如C:,用于与静态数据关联 |
used | 已使用字节数 |
free | 未使用字节数 |
usage | 使用率 |
inode_used | 已使用的inode数量 |
inode_free | 未使用的inode数量 |
inode_usage | inode使用率 |
read_per_second | 每秒读取字节数 |
write_per_second | 每秒写入字节数 |
iops_in_progress | 正在等待的IO操作数量 |
其中interfaces
字段表示网卡信息,内容如下:
采集项 | 描述 |
---|---|
name | 网卡名称,如eth0,用于与静态数据关联 |
bytes_sent | 已发送字节数 |
bytes_recv | 已接收字节数 |
packets_sent | 已发送数据包数量 |
packets_recv | 已接收数据包数量 |
进程列表数据
该采集项用于采集主机上的进程列表信息,内容如下:
采集项 | 描述 |
---|---|
id | 进程ID |
parent_id | 父进程ID |
user | 所属用户 |
cpu_usage | CPU使用率 |
rss | 物理内存字节数 |
vms | 虚拟内存字节数 |
swap | swap内存字节数 |
memory_usage | 内存使用率 |
cmd | 启动命令行参数 |
listen | 监听端口列表 |
connections | 连接数 |
连接列表数据
该采集项用于采集主机上的连接列表信息,内容如下:
采集项 | 描述 |
---|---|
fd | 句柄编号 |
pid | 所属进程ID |
type | 连接类型,0=tcp IPv4;1=tcp IPv6;2=udp IPv4;3=udp IPv6;4=unix domain socket;5=unix file socket |
local | 本地地址 |
remote | 远程地址 |
status | 连接状态,如ESTABLISHED等 |
传感器温度数据
该采集项用于采集主机上的传感器温度信息,如CPU温度、显卡温度等,内容如下:
采集项 | 描述 |
---|---|
name | 设备名称 |
temp | 温度,单位摄氏度 |