Categraf 监控采集器常见问题汇总

总结一下社区常见的问题,供大家参考。不过在描述具体问题之前,请先了解 Categraf 的核心职能:

采集监控指标

在即时查询里可以看到机器各个指标的历史趋势图,就是 Categraf 采集的监控指标。比如:

如果这个页面查不到机器的历史监控数据,说明采集、上报、存储链路出了问题。

上报机器元信息

机器列表里的机器,会呈现一些字段,比如更新时间、时间偏移、内存、CPU 等字段,都是通过 Categraf 上报的元信息拿到的。

点击某个机器,会展开侧拉板,侧拉板里会呈现机器的元信息:

执行自愈脚本

一些日常运维工作需要批量对一批机器执行脚本,或者某个机器报警了,想要自动去机器上跑一个脚本。

hostname 配置

Categraf 要想达成上面所述的功能,需要有一个唯一标识,用以区分不同的机器。这个唯一标识就是 conf/config.toml 配置文件中的 hostname 配置。

复制代码
# add label(agent_hostname) to series
# "" -> auto detect hostname
# "xx" -> use specified string xx
# "$hostname" -> auto detect hostname
# "$ip" -> auto detect ip
# "$hostname-$ip" -> auto detect hostname and ip to replace the vars
hostname = ""

上面的注释其实也说得很清楚了,我这里也再啰嗦一下。

hostname 字段用户配置成啥,就以啥作为机器标识。所以,不同机器一定要配置为不同的字符串。

但是每个机器都要配置一个不同的字符串,有点费劲,能否自动设置为本机的机器名?可以的,这个字段如果留空,就会自动获取本机的机器名。

有些公司机器名可能会重复,想要自动设置为本机 IP,也可以,那就配置为:

复制代码
hostname = "$ip"

Categraf 发现用户配置的是 $ip,就会自动探测本机 IP 填充进去,不过你要检查一下最终探测到的 IP 是不是对的,怎么检查?测试采集一下指标,看看输出即可:

shell 复制代码
[root@iZ2ze4oi71k3qgdxwsyn07Z categraf-v0.4.20-linux-amd64]# ./categraf --test --inputs mem 2>/dev/null| grep mem_
1762167444 18:57:24 mem_high_free agent_hostname=10.99.1.107 0
1762167444 18:57:24 mem_huge_pages_free agent_hostname=10.99.1.107 0

hostname 的信息会体现为指标里的 agent_hostname 标签,如上,我的本机 IP 自动探测为 10.99.1.107。

有时想从环境变量里获取,也可以,也是使用 $ 符号引用环境变量的名称即可,比如:

shell 复制代码
[root@iZ2ze4oi71k3qgdxwsyn07Z categraf-v0.4.20-linux-amd64]# export HOST=hello007
[root@iZ2ze4oi71k3qgdxwsyn07Z categraf-v0.4.20-linux-amd64]# grep HOST conf/config.toml
hostname = "$HOST"
[root@iZ2ze4oi71k3qgdxwsyn07Z categraf-v0.4.20-linux-amd64]# ./categraf --test --inputs mem 2>/dev/null| grep mem_
1762167642 19:00:42 mem_active agent_hostname=hello007 1265184768
1762167642 19:00:42 mem_huge_page_size agent_hostname=hello007 2097152

如上,我设置了一个环境变量 HOST=hello007,然后在配置文件里通过 hostname="$HOST" 做了引用。最终通过 --test 看到的就是 agent_hostname=hello007 标签。

⚠️ 注意:

  • 如果 config.toml 里配置里 omit_hostname = true 上报的监控数据中就没有 agent_hostname 标签了
  • Categraf 的监控数据如果发给夜莺,夜莺会把 agent_hostname 标签重命名为 ident

writers 配置

配置段样例如下:

复制代码
[[writers]]
url = "http://nightingale:17000/prometheus/v1/write"
basic_auth_user = ""
basic_auth_pass = ""
timeout = 5000
dial_timeout = 2500
max_idle_conns_per_host = 100

Categraf 采集了监控数据之后,就是推送给 writers 指定的 url,通常是推送给夜莺,所以 url 配置为夜莺的地址。

如果使用了边缘模式,边缘机房的 Categraf 要配置为边缘 n9e-edge 的地址。

如果要做高可用,应该在夜莺前面架设负载均衡,Categraf 这里配置负载均衡的地址。Categraf 这里不支持写多个夜莺的 IP。

⚠️ 如果你们不用夜莺,只用 Categraf,也可以把 writers 的 url 配置为时序库的 remote write 地址。Categraf 使用 Prometheus remote write 协议推送监控数据。

writers 部分是使用双中括号括起来的,这在 toml 语法中表示数组,即可以配置多个 writer 地址,比如:

复制代码
[[writers]]
url = "http://ip1:17000/prometheus/v1/write"
basic_auth_user = ""
basic_auth_pass = ""
timeout = 5000
dial_timeout = 2500
max_idle_conns_per_host = 100
[[writers]]
url = "http://ip2:17000/prometheus/v1/write"
basic_auth_user = ""
basic_auth_pass = ""
timeout = 5000
dial_timeout = 2500
max_idle_conns_per_host = 100

Categraf 会把采集到的数据分别推送给这两个 writer。其中一个 writer 慢了可能也会影响另一个。通常,这个双写的功能应该用不到。

heartbeat 配置

Categraf 采集了机器元信息,推送给 heartbeat 配置的 url。必须配置为夜莺的地址。如果用到了边缘的 n9e-edge,则配置为 n9e-edge 的地址。

如果这个地址配置的不对或没有 enable,机器列表就是空的,或者即便机器列表不为空,机器后面的各个字段都是 unknown,页面上点击机器标识展开的侧拉板里也看不到机器的元信息。

机器的元信息发给夜莺之后,夜莺是存储在 redis 中的。

如果不用夜莺,只用 Categraf 的采集能力,heartbeat 可以关闭,即设置 enable = false

ibex 配置

ibex 是执行脚本的,告警自愈脚本就是通过 ibex 执行的。如果你们担心安全性,就不要启用 ibex 了。

ibex 下面有个 servers 配置,是配置夜莺的 rpc 地址,默认夜莺 rpc server 会监听在 20090 端口,如果是边缘模式,则配置为边缘 n9e-edge 的 rpc 端口。

注意,这个是走的四层不是七层。如果要做高可用,把多个夜莺 server 的地址配置到 servers 配置里即可,servers 的 value 是个数组,比如:

复制代码
servers = ["ip1:20090", "ip2:20090"]

多个监控目标的问题

Categraf 有很多监控插件,每个监控插件有自己的配置,在 conf 目录下有一堆 input. 打头的目录,就是一个一个的插件配置目录。

比如 mysql 的配置文件:conf/input.mysql/mysql.toml

复制代码
[[instances]]
address = "127.0.0.1:3306"
username = "categraf"
password = "XXXXXXXX"

但凡你看到插件的配置里有 [[instances]] 就说明,可以配置多个监控目标,比如要监控两个 mysql 实例:

复制代码
[[instances]]
address = "10.1.2.3:3306"
username = "categraf"
password = "XXXXXXXX"
[[instances]]
address = "10.1.2.4:3306"
username = "categraf"
password = "XXXXXXXX"

采集频率问题

在插件里,最开始的位置通常有个 interval = 15 的配置,表示这个插件的所有 instance 都是 15s 采集一次,如果这个配置注释了,那就是复用全局的 interval,全局的 interval 在 conf/config.toml 里。

如果第一个实例希望 15s 采集一次,第二个实例 30s 采集一次,可以这么配置:

复制代码
interval = 15
[[instances]]
address = "10.1.2.3:3306"
username = "categraf"
password = "XXXXXXXX"
interval_times = 1
[[instances]]
address = "10.1.2.4:3306"
username = "categraf"
password = "XXXXXXXX"
interval_times = 2

通过 interval_times 来控制,这个实例的采集频率等于:

复制代码
interval * interval_times

那如果我想更频繁,不是 15s 的倍数怎么办?简单,直接把 interval 设置为 1,1 乘以任何数都是原来的数,那就变相使用 interval_times 来控制了。比如:

复制代码
interval = 1
[[instances]]
address = "10.1.2.3:3306"
username = "categraf"
password = "XXXXXXXX"
interval_times = 7
[[instances]]
address = "10.1.2.4:3306"
username = "categraf"
password = "XXXXXXXX"
interval_times = 8

这个例子里,第一个实例,每 7s 执行一次,第二个实例,每 8s 执行一次。

标签问题

所有监控数据都要附加的标签,配置在 conf/config.toml[global.labels] 中,比如:

复制代码
[global.labels]
env = "prod"
region = "shanghai"

如果只想给部分实例附加标签,就在各个 instances 下面,比如:

复制代码
interval = 1
[[instances]]
address = "10.1.2.3:3306"
username = "categraf"
password = "XXXXXXXX"
interval_times = 7
[instances.labels]
instance = "a"
env = "prod"

[[instances]]
address = "10.1.2.4:3306"
username = "categraf"
password = "XXXXXXXX"
interval_times = 8
[instances.labels]
instance = "b"
env = "test"

或者换个写法:

复制代码
interval = 1
[[instances]]
address = "10.1.2.3:3306"
username = "categraf"
password = "XXXXXXXX"
interval_times = 7
labels = { instance="a", env="prod"}

[[instances]]
address = "10.1.2.4:3306"
username = "categraf"
password = "XXXXXXXX"
interval_times = 8
labels = { instance="b", env="test"}

两种写法在 toml 格式的配置文件中作用相同。

配置文件合并问题

每个插件都有一个目录,有时方便管理,想把插件配置拆成多个文件,也是可以的。Categraf 的处理逻辑是:把插件目录下的所有 toml 文件,按照文件名字排序,拼接成一个大的 toml 文件来处理。

注意,interval 配置是在所有 instances 前面的,所以要拆成多个配置文件的话,只在第一个 toml 文件中配置 interval 即可。其他配置文件的 interval 即便配置了也不生效。所谓的第一个 toml 文件,是把所有 toml 文件按照文件名的字符序排序,取第一个。

相关推荐
SRETalk2 个月前
夜莺监控设计思考(五)告警原理和处理流程深度剖析
可观测性·监控告警·observability·nightingale·开源监控·夜莺监控
SRETalk2 个月前
夜莺监控设计思考(四)关于机器那些事儿
开源软件·可观测性·监控告警·observability·nightingale·夜莺监控
SRETalk2 个月前
夜莺监控设计思考(三)时序库、agent 的一些设计考量
prometheus·可观测性·监控告警·nightingale·opentelemetry·夜莺监控·categraf
夜莺云原生监控2 个月前
夜莺监控设计思考(二)边缘机房架构思考
开源·监控告警·nightingale·夜莺监控·运维监控
SRETalk2 个月前
夜莺监控设计思考(二)边缘机房架构思考
监控告警·nightingale·开源监控·夜莺监控
SRETalk2 个月前
夜莺监控设计思考(一)整体定位、架构设计、单进程多进程选择、高可用设计
监控告警·开源监控
摘星编程3 个月前
Redis 连接数爆炸:连接池配置错误踩坑记录
性能优化·监控告警·redis连接池·连接数爆炸·jedis配置
SRETalk4 个月前
为 Prometheus 告警规则增加 UI 管理能力
prometheus·监控告警·夜莺监控·运维监控
SRETalk4 个月前
如何监控多个进程的存活和CPU、内存占用
进程监控·夜莺监控·运维监控