企业级多维度立体监控体系源码剖析






应用层:
多个应用部署在容器中,每个应用都有一个客户端(Client)。
客户端通过 Monitor Agent 和 Open-Falcon Agent 收集监控数据。
Monitor Agent 和 Open-Falcon Agent:
负责收集虚拟机(vm)的监控项汇总数据,并上报到服务端。
服务端:
接收 Monitor Agent 和 Open-Falcon Agent 上报的数据。
拉起服务器信息,将数据传递给 Codis 和可视化平台。
Codis:
负责接收和归集服务端传递的数据。
可视化平台:
处理和显示监控数据,提供图形化界面供观察者和管理者使用。
数据来源包括服务端和 MySQL、InfluxDB。
数据库:
MySQL:处理计算落地的相关数据。
InfluxDB:存储时序数据,供监控系统查询。
告警通知:
当 Codis 收到异常数据或阈值被触发时,会发送报警通知给相关干系人。
干系人:
包括观察者和管理者,通过可视化平台查看系统状态和监控数据。
数据流程:
应用客户端收集监控数据(步骤1)。
Monitor Agent 和 Open-Falcon Agent 上报数据到服务端(步骤2)。
服务端将数据传递到 Codis 和可视化平台,同时进行数据计算落地到 MySQL 和 InfluxDB(步骤3、4)。
Codis 负责数据接收和归集,并在必要时发送报警通知(步骤5)。
可视化平台显示监控数据,供观察者和管理者使用。




启动 (main.go):
启动收集端程序的入口。
解析配置 (cfg.go ParseConfig):
读取和解析配置文件,配置收集端的各种参数。
启动监控 (sec.go StartMonitor):
初始化监控功能,开始对系统进行监控。
初始化启动收包线程 (receiver.go):
启动一个线程用于接收来自客户端或其他监控源的数据包。
初始化启动上报线程 (reporter.go):
启动一个线程负责将收集到的数据上报到服务端。
启动服务器同步线程 (reporter.go):
启动一个线程用于与服务器进行数据同步,确保收集到的数据能够及时传输。
启动心跳线程 (heartbeat.go):
启动一个心跳线程,每分钟发送一个心跳信号,以确保收集端和服务端的连接正常。
MonitorServer:
一个核心组件,负责监控和管理收集端的各个线程和数据流转。
数据流动
数据收集:
收集端通过
Local 35001端口循环监控并接收数据。数据通过
cache.go进行接收计数和合并缓存处理。数据上报:
每10秒通过
reportItemData将数据上报到MonitorServer。心跳信号:
每分钟通过
UdpMessageHandler发送一个心跳信号,以确保系统正常运行。
与可视化平台和服务端的交互
与可视化平台:
收集的数据会发送到可视化平台,进行实时展示和分析。
与服务端:
收集端通过上报线程将数据发送到服务端,并通过心跳线程保持连接稳定。
关键流程和功能
数据采集:
主要通过本地端口监控和接收数据,并进行缓存处理。
数据上报:
通过定时上报机制,将数据传输到服务端,确保数据的实时性和准确性。
系统监控:
通过心跳信号和监控服务端,保证收集端和服务端的正常通信和数据传输。





上报业务监控数据:
首先,代码检查
itemProtocol是否为空。如果不为空,调用
MonitorServers()函数获取监控服务器列表。如果MonitorServers()返回的服务器列表为空,则使用一个默认的服务器列表(IP:10.9.193.93, 端口:35002)。随机选择一个服务器。
将
itemProtocol中的数据转换为字节数组(ToBytes())。通过 UDP 将数据包发送到选择的服务器。
记录发送日志。
上报业务监控统计数据:
代码检查
mixProtocol是否为空。如果不为空,调用
MonitorServers()函数获取监控服务器列表。如果MonitorServers()返回的服务器列表为空,则使用一个默认的服务器列表(IP:10.9.193.93, 端口:35002)。随机选择一个服务器。
将
mixProtocol中的数据转换为字节数组(ToBytes())。通过 UDP 将数据包发送到选择的服务器。
记录发送日志。
清理缓存:
代码调用
cache.RemoveItemCache(lastMinute)清理缓存中指定的条目。


