跳到主要内容

本产品及文档完善中,如果有什么问题请联系我们:18721583683(同微信)或chaho@qq.com

Prometheus

XAgent 代理进程基于 Go 语言实现,内置 Prometheus 指标暴露能力。部署后访问 http://<主机IP>:<端口>/metrics 即可获取代理进程的标准运行指标,配合 Prometheus 采集与 Grafana 可视化,可对代理进程的运行状态、资源占用与健康度进行持续监控。

指标获取​

XAgent 代理进程启动后,通过 HTTP 接口对外暴露 Prometheus 文本格式指标:

GET http://<主机IP>:<端口>/metrics

返回内容为 Prometheus 标准文本格式,包含 # HELP(指标说明)与 # TYPE(指标类型)注释行,可直接被 Prometheus Server 抓取,也可用 curl 手动验证:

curl http://<主机IP>:<端口>/metrics

以下为实际抓取的部分指标文本:

# HELP go_goroutines Number of goroutines that currently exist.
# TYPE go_goroutines gauge
go_goroutines 119
# HELP go_info Information about the Go environment.
# TYPE go_info gauge
go_info{version="go1.27.0"} 1
# HELP go_memstats_alloc_bytes Number of bytes allocated and still in use.
# TYPE go_memstats_alloc_bytes gauge
go_memstats_alloc_bytes 1.13662008e+08

Prometheus 指标

指标总览​

XAgent 暴露的指标分为 Go 运行时指标 与 进程资源指标 两大类,全部遵循 Prometheus 命名规范(go_* 前缀为 Go 运行时,process_* 前缀为进程资源)。

Go 运行时指标​

序号指标类型说明参考基线
1go_gc_duration_secondssummary垃圾回收(GC)暂停耗时分布,按分位数(quantile 0/0.25/0.5/0.75/1)统计单次 < 10ms,均值越低越好
2go_gc_duration_seconds_sumcounterGC 暂停累计耗时持续增长属正常,需关注增速
3go_gc_duration_seconds_countcounterGC 执行次数高频 GC 需关注内存压力
4go_goroutinesgauge当前存在的 goroutine(协程)数量数百以内正常,异常增长多为泄漏
5go_threadsgauge当前操作系统线程数与 CPU 核数相当,异常增长需排查
6go_infogaugeGo 运行环境信息,含版本号(如 go1.27.0)版本越高越好
7go_memstats_alloc_bytesgauge已分配且仍在使用的字节数(堆内存)关注趋势,持续攀升需排查
8go_memstats_alloc_bytes_totalcounter累计分配的字节总数(含已释放)反映分配压力
9go_memstats_heap_alloc_bytesgauge堆上已分配且在用的字节数同 alloc_bytes
10go_memstats_heap_inuse_bytesgauge堆中正在使用的字节数同 heap_alloc
11go_memstats_heap_idle_bytesgauge堆中空闲等待使用的字节数内存回收是否充分
12go_memstats_heap_objectsgauge已分配对象数量对象数异常增长需排查
13go_memstats_heap_sys_bytesgauge堆从系统获取的内存总量接近物理内存上限需扩容
14go_memstats_heap_released_bytesgauge已归还操作系统的堆内存越大说明回收越充分
15go_memstats_next_gc_bytesgauge下次触发 GC 的堆阈值达到即触发 GC,是内存水位标尺
16go_memstats_sys_bytesgauge从系统获取的内存总字节数进程整体内存占用
17go_memstats_mallocs_totalcounter累计分配(malloc)次数分配频繁需关注对象生命周期
18go_memstats_frees_totalcounter累计释放(free)次数malloc/frees 差值≈存活对象
19go_memstats_last_gc_time_secondsgauge最近一次 GC 的 Unix 时间戳距当前越久说明内存越稳定
20go_memstats_stack_inuse_bytesgauge栈分配器正在使用的字节数goroutine 栈占用
21go_memstats_mcache_inuse_bytesgaugemcache 结构正在使用的字节数运行内部结构,观察即可
22go_memstats_mspan_inuse_bytesgaugemspan 结构正在使用的字节数运行内部结构,观察即可
23go_memstats_gc_sys_bytesgaugeGC 系统元数据占用字节数运行内部结构,观察即可
24go_memstats_other_sys_bytesgauge其他系统分配字节数运行内部结构,观察即可
25go_memstats_buck_hash_sys_bytesgauge性能分析桶哈希表占用字节数运行内部结构,观察即可
26go_memstats_lookups_totalcounter指针查找次数现代 Go 通常为 0

进程资源指标​

序号指标类型说明参考基线
1process_cpu_seconds_totalcounter进程累计消耗的 CPU 时间(用户态+系统态,秒)与运行时长比值反映 CPU 利用率
2process_resident_memory_bytesgauge进程常驻内存(RSS),即实际占用的物理内存重点监控项,异常增长需排查
3process_virtual_memory_bytesgauge进程虚拟内存大小含映射文件,一般大于 RSS
4process_open_fdsgauge当前打开的文件描述符数量接近 max_fds 需排查泄漏
5process_max_fdsgauge进程可打开的文件描述符上限Linux 默认 ulimit 限制
6process_start_time_secondsgauge进程启动时间(Unix 时间戳)用于计算运行时长与检测重启
7promhttp_metric_handler_requests_in_flightgauge当前正在处理的指标抓取请求数一般 ≤ 1
8promhttp_metric_handler_requests_totalcounter指标抓取请求总数(按 HTTP 状态码区分)关注 200 比例,500/503 需排查

实测样例解读​

以下为 XAgent 一次实际抓取的指标快照(实测环境),可直观了解各指标的典型取值与含义:

序号指标实测值解读
1go_goroutines119协程数量处于低位,说明服务负载很轻
2go_gc_duration_seconds_count12进程累计 GC 12 次,频率很低
3go_info{version="go1.27.0"}1代理基于 Go 1.27 构建
4go_memstats_alloc_bytes≈ 113.7 MB当前堆内存占用约 114 MB
5go_memstats_alloc_bytes_total≈ 150.7 MB累计分配约 151 MB,分配压力低
6go_memstats_heap_inuse_bytes≈ 116.8 MB堆在用内存约 117 MB,与分配基本一致
7go_memstats_heap_objects55178堆对象约 5.5 万个,规模正常
8go_memstats_mallocs_total521603累计分配 52 万余次
9go_memstats_frees_total466425累计释放 46 万余次,存活对象约 5.5 万(与 heap_objects 吻合)
10go_memstats_last_gc_time_seconds1.7916e+09最近一次 GC 时间戳,距抓取时点较近属正常
11go_memstats_lookups_total0指针查找 0 次,符合现代 Go 预期
12promhttp_metric_handler_requests_total{code="200"}1指标抓取请求成功返回

结论:该实例代理运行轻量、内存占用约 114 MB、GC 频率极低、协程数量平稳,适合大规模终端部署场景。

接入 Prometheus​

在 Prometheus 配置文件 prometheus.yml 的 scrape_configs 中添加采集目标:

scrape_configs:
- job_name: 'xagent'
static_configs:
- targets: ['<xagent服务端IP>:<端口>']
metrics_path: /metrics
scrape_interval: 15s

常用监控告警规则​

在 Prometheus 告警规则中可配置以下常用告警项:

序号告警名称表达式说明
1进程挂掉up{job="xagent"} == 0服务不可用
2内存异常增长process_resident_memory_bytes{job="xagent"} > 1e9常驻内存超 1 GB
3协程数异常go_goroutines{job="xagent"} > 1000goroutine 疑似泄漏
4GC 频繁rate(go_gc_duration_seconds_count{job="xagent"}[5m]) > 105 分钟内 GC 超 10 次
5句柄耗尽风险process_open_fds{job="xagent"} / process_max_fds{job="xagent"} > 0.8打开句柄超上限 80%

Grafana 可视化​

采集接入后,可在 Grafana 中新建 Dashboard,推荐面板:

序号面板数据源查询(PromQL)
1内存占用process_resident_memory_bytes{job="xagent"}
2堆内存趋势go_memstats_heap_alloc_bytes{job="xagent"}
3协程数量go_goroutines{job="xagent"}
4GC 暂停耗时go_gc_duration_seconds{job="xagent"}
5CPU 利用率rate(process_cpu_seconds_total{job="xagent"}[5m])
6服务存活up{job="xagent"}

运维建议​

序号建议说明
1定期观察 process_resident_memory_bytes 与 go_memstats_heap_alloc_bytes 趋势内存持续攀升不下探,提示可能存在资源未释放
2关注 go_goroutines 与 go_threads 的异常增长二者持续增长是协程/线程泄漏的典型信号
3关注 process_open_fds 逼近上限句柄泄漏会导致服务无法建立新连接
4配置进程存活与内存告警优先保障"进程在线"与"内存水位"两项基础告警
5结合 process_start_time_seconds 监控意外重启非计划内重启说明服务异常退出,需回溯日志