一、监控系统的诞生与核心架构
Borgmon诞生于Google服务规模急剧扩张的背景下。传统的基于主机和静态阈值的监控方式无法应对动态、大规模的集群环境,亟需一个能自动发现、采集和处理海量指标的系统。
Borgmon是一个“拉”模式的、基于多维度标签的、内置强大计算能力的谷歌内部的监控系统。名称由Borg+mon组成,Borg是谷歌的任务管理系统,也是k8s的前身,mon即monitor的简写,Borgmon正是监控这套任务管理的监控系统。
在google的应用程序代码中内置监控埋点,以统一格式(如/varz端点)暴露内部状态指标(如请求数、错误数、延迟分布)并以kay-value的纯文本形式展现,这也是所有监控数据的源头。
Borgmon具有自动发现机制,对所有的端点统一发起http请求,就可以收集到所有监控对象的所有监控指标。这也就是所谓的“拉”模式,与当下流行的开源监控系统Prometheus原理近似,Prometheus主动拉取各种exporter(/metrics),同时Prometheus也是起源于Borgmon,完全继承了这一模式。
二、监控数据的结构与计算
Borgmon设计了高效的时间序列数据库,用于存储带时间戳的多维度指标数据。数据区分冷热,热数据存储在内存中,通常用于渲染图表使用,冷数据会被定期归档之外部数据库(TSDB),通过查询TSDB获取历史数据。
time-series:以(timestamp,vlues)格式存储的按照时间排序的链表。
标签:修饰时间序列的属性和维度
Borgmon从本质上,也是一个可编程计算器,它允许用户定义规则计算,对原始时间序列进行实时聚合、计算和推导,生成新的、更有意义的复合指标(如错误率、QPS、健康度等)。配合报警管理服务(Alertmanager)实现告警的分类发送。
三、监控系统的分片机制
由于google庞大的业务系统,单个Borgmon实例无法处理全公司的监控任务,出于高可用和性能的考量,因此需要根据范围(如集群、业务单元)进行分片。
同时,在更庞大的部署模型中,将Borgmon分为收集层和汇总层,收集层负责采集各个业务系统的监控数据,汇总层会直接采用收集层的Borgmon的数据,进行计算、汇总、分析,大幅降低了CPU、网络等硬件成本的消耗。
四、黑盒监控
Borgmon是一个白盒监控,能够看到目标服务的内部状态,但是白盒监控并不能完全代表一个系统的所有状态,完全依赖白盒监控,可能无法感知终端用户看到的系统是什么样的。Google团队通过探针程序(prober),直接使用应用级别的自动请求探测目标是否成功返回,对接Borgmon的强大时许数据库引擎,实现了白盒监控与黑盒监控的兼备。
总结与感想
1、从“资源导向视图”转向“业务导向视图”
传统的监控视角往往局限于资源驱动型指标,如CPU利用率、内存占用或磁盘空间。这种视角固然重要,但它本质上是一种过去式的监控模式,这些指标只能告诉我们系统过去和现在的资源消耗情况,却难以揭示系统未来的健康状况和真正的业务价值。如果只局限于这些指标,非常容易陷入“只见树木,不见森林”的困境,即使每台服务器的资源指标都看似正常,整个服务却可能因性能瓶颈而不可用。
要突破这一困境,我们必须将监控提升到一个新的维度:从“资源导向视图”转向“业务导向视图”。这其中的关键,在于充分利用现代时序数据库(如prometheus、influxdb等)的计算与聚合能力。我们不应满足于存储和展示原始数据,二十将低维度的资源指标冶炼成高维度、具有直接业务意义的高级指标。例如,从磁盘增长率推断业务数据上涨情况,并评估出系统的容纳上限,并及时做出清理、扩容或分片的优化手段;从异常数量的增多反推断功能模块的影响,以及用户的实际体验。
2、黑盒监控的必要性
在云平台架构升级后,由于cloudwalker探针磁盘设置不当导致数据库所在主机的iowait指标异常飙升,表面上看是CPU资源将耗尽的标准警报。但是深入检查数据库集群的核心指标(TPS,超时,阻塞等)却未发现任何明显的性能衰减或业务影响。
这个矛盾的场景暴露了一个关键盲点——缺少一个从外部视角审视数据库服务的“黑盒探针”。尽管拥有详尽的“内部体检报告”(白盒监控),却不知道从“用户/应用”(黑盒监控)看来,它的服务是否依然真正可用且响应及时。
白盒监控固然重要,黑盒监控更能站在用户角度感受业务系统的可用性,只有二者结合,才能构成开阔的监控视野,形成故障定位的完整证据链。