全栈监控系统架构

全栈监控系统架构

可观测性从数据层面可分为三类:

  • 指标度量(Metrics):记录系统的总体运行状态。
  • 事件日志(Logs):记录系统运行期间发生的离散事件。
  • 链路追踪(Tracing):记录一个请求接入到结束的处理过程,主要用于排查故障。

图片来自:Metrics, Tracing, and Logging

CNCF 的 Observability Whitepaper(可观测性白皮书) 将上述数据统称为 Signal(信号),除了以上三种,又提出来额外两种信号:

  • 性能剖析(Profiling):记录代码级别的的详细视图,比如 CPU、内存的使用,帮助诊断环境中的性能瓶颈。
  • 核心转储(Core Dumps):程序崩溃时的内存快照。

从系统架构层面可分为三层:

  • 基础层:对底层主机资源的监控。比如 CPU、内存、磁盘用量、磁盘IO、网络IO 、系统日志等。

  • 中间层:对中间件的监控。比如 MySQL、Redis、ElasticSearch、Nginx 等中间件的关键指标。

  • 应用层 :监控应用的指标。比如 JVM 指标、JDBC 指标、HTTP 的吞吐、响应时间和返回码分布等。当然也包括客户端的监控,比如移动客户端的性能监控。

我们知道分布式系统的架构和运维极其复杂,只有实现一个全栈监控系统,将上述各层的指标、日志、追踪数据收集并关联保存好,让它成为分布式系统的眼睛,我们才能更好的了解系统运行状态,及时发现问题,进而解决问题。

一个分布式系统、一个自动化运维系统、或是一个Cloud Native的云化系统,最重要的事就是把监控系统做好,在把数据收集好的同时更重要的是把数据关联好。开发和运维才可能很快地定位故障,进而根据故障原因做出相应的(自动化)处置,将故障恢复或把故障控制在影响范围之内。 《左耳听风》

监控系统功能要求

一个好的监控系统,主要为两个场景服务:

  1. 体检

    • 容量管理。提供一个全局的系统运行时数据监控大盘,可以让工程师团队知道是否需要增加机器或是其它资源。

    • 性能管理。可以通过查看大盘,找到系统瓶颈,并有针对性的优化系统和相应代码。

  2. 急诊

    • 定位问题。可以快速的暴露并找到问题的发生点,帮助技术人员诊断问题。

    • 性能分析。当出现不预期的流量提升,可以快速的找到系统的瓶颈,并可以帮助开发人员深入代码。

具体需要有如下功能:

全栈监控

做到对基础、中间件和应用层的指标、日志、链路追踪的整体监控。

整体 SLA 分析

需要根据用户的 API 访问计算整体的 SLA。比如下面的一系列指标:

  • 吞吐量:M1,M5,M15 的吞吐量,即最近 1、5、15 分钟的 QPS。
  • 响应时间:P99 、P95 、P90、P75、P50 等延时时长,
  • 错误率:2XX、3XX、4XX、5XX 的各自占比;最近 1、5、15 分钟的 400、500 错误请求数。
  • Apdex(Application Performance Index) 指标

这是工业界用来衡量系统运行是否健康的指标。Apdex 有三种状态来描述用户的使用体验:

  • 满意(Satisfied):请求服务响应时间小于某个阈值 T。
  • 可容忍(Tolerating):请求服务响应时间高于 T,但低于一个可容忍值 F,通常 F = 4T。
  • 失望(Frustrated):请求服务响应时间大于可容忍值 F。

apdex

基于以上值,Apdex 的计算公式如下:

// 满意的请求数加上可容忍的请求数的一半,除以总的请求数。
Apdex = (Satisfied count + Tolerating count / 2) / Total count

假设我们系统有 100 个请求,满意响应时间为 200ms。这 100 个请求中:

  • 80 个请求响应时间小于 200ms,即满意的请求数为 80。
  • 15 个请求响应时间在 200ms 到 800ms(4 * 200) 之间,即可容忍的请求数为 15。
  • 5 个请求响应时间大于 800ms,即失望的请求数为 5。

那么 Apdex 的值为:

Apdex = (80 + 15 / 2) / 100 = 0.875

一般来说,Apdex 的值大于 0.9 时系统可以认为运行正常,用户体验良好;低于 0.8 时需要告警,并进行优化;在 0.5 以下时可以认为系统运行不正常,需要将服务实例下线。

关联分析

监控系统需要对三层数据进行统一全面的关联、分析,并能够通过调用关系帮助我们定位故障的根因。

以一个报 500 的请求为例,我们能够通过链路追踪日志获取该请求的整个请求链路,链路中的所有服务、中间件以及对应的服务器信息都能关联查询出来。查询到链路中的每个 Span 时,对应的日志、指标都能关联展示出来。

下图是使用 MegaEase Cloud 云平台监控的一个微服务系统的调用链追踪展示以及点击某个 Span 时所能关联查询的所有数据。整个调用链的拓扑图、日志、请求、JDBC 等信息全部能关联查询出来。

  • 调用链拓扑图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • Span 信息

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • Span 详情,包括日志、指标、请求、JDBC 等

Span 详情

图片来自 MegaEase 官网

实时告警与自动处理

通过设置告警规则,当系统异常时能够及时的发出告警。在此基础上要有一定的自动故障处理能力,比如自动扩缩容、弹力处理等。

对于常见的指标,比如服务器的 CPU、内存、磁盘的用量,JVM 的 Memory、GC 等最好有默认的告警规则模版,每当有新的机器、服务上线时,能够自动生成告警规则。

系统容量与性能分析

通过对过去一段时段的监控数据分析,获取系统的 SLA、负载、容量使用等情况,为系统的容量规划提供参考依据。

监控系统技术架构

数据采集

数据采集通常会有一个客户端,与被采集的目标实例运行在一起,采集目标实例的运行指标、日志、追踪等信息,并将采集到的数据通过 API 进行暴露或者直接上报。

指标全局字段

为了后续的关联分析,采集的数据需要标明来源等信息,通常需要以下全局字段:

字段说明
category指标分类,通常可以分为 infrastructure、platform、application 三类,即对应基础设施层、中间件层、应用层
host_name采集客户端所在的主机名称
host_ipv4采集客户端所在的主机 IP
system被监控服务的系统名称(一般是所属的业务系统)
service被监控服务的服务名,最重要的一个字段,大盘需要根据该字段确定要查询的目标数据以及关联分析
instance被监控服务的实例名称,一个服务通常会有多个实例,该字段用来标识具体的实例信息, 方便关联分析和故障定位
type指标类型分类,更加细化的指标分类,比如 mysql、jvm、cpu、memory 等,可以基于该 type 将数据存储在不同的索引库中
timestamp指标和日志产生的时间戳

通过这些字段,我们能精确定位某个系统下的任意服务实例位于哪台机器上,从而去目标主机查看实例的状态;也可以在监控系统中通过这些字段关联查询到具体实例的日志、指标、追踪等信息。

基础层与中间件层采集

Linux 系统内核以及几乎所有的的中间件都有运行时的统计信息。比如 Linux 的 /proc 目录,MySQL 的 performance schema 等。

对于基础层和中间件层,有非常多的优秀成熟开源的监控组件可以使用:

  • Telegraf:一款开源的基于 Go 语言开发的指标采集软件,有众多的采集、处理和输出插件,基本能覆盖日常开发的指标采集需求。

  • Elastic Beats:ElasticSearch 公司开发的一系列采集客户端。比如用于采集日志的 Filebeat;用于采集指标的Metricbect;用于采集网络的:Packetbeat

  • Prometheus Exporter:围绕 Prometheus 开发的一系列 Exporter,会暴露指标采集 API,供 Prometheus 定时拉取。

  • OpenTelemetry:由 CNCF 的 OpenTracing 和 Google/微软支持的 OpenCensus 合并而来,最初是为了实现链路追踪的标准化,后来逐渐演化为一套完整的可观测性解决方案。自 2019 年发布以来,逐渐成为了云原生领域可观测性数据收集的事实标准。

在这里插入图片描述

应用层指标采集

应用层的指标采集要相对更麻烦一些,因为不同的语言实现通常需要不同的方式采集。但总体来看有三种如下方式:

  • 应用 API 暴露:比如 SpringBoot 应用就通过 /_actuator API 对外暴露了一系列应用相关信息。我们也可以自行编写相应的 API 对外暴露指标。这里需要注意指标标记的合理性,避免表示不准确和数据量爆炸,对服务本身和监控系统造成影响。一般来说除了指标名、时间戳和指标值外,其他 lable 都是固定的,这样 Prometheus 等时序数据库在存储时会进行压缩,节省存储空间。可以参考这篇文章 程序的 Metrics 优化——Prometheus 文档缺失的一章。

  • SDK 采集上报:将采集上报功能以 SDK 的形式集成到服务中。好处是灵活性高,可以自行编写 SDK,最大程度满足自身的需求,但坏处是会对业务服务造成侵入。主流语言通常会有很多优秀开源库,即使是自己造轮子通常也是在其基础之上做进一步的封装。以笔者比较熟悉的 Java 生态为例,一些优秀的开源工具库:

    • OSHI: Operating System and Hardware Information 用来收集操作系统和硬件信息的 Java 开源库。
    • Dropwizard Metrics 用来测量 Java 应用的相关指标的开源库。
    • opentelemetry-java:opentelemetry 提供的 Java SDK。
  • 无侵入式采集:SDK 的方式一般需要应用添加依赖,修改配置等操作,通常会影响到线上的服务运行。更好的方式是使用无侵入技术,将采集功能无缝集成到应用中。一些常见的技术有:

    • Java Agent: Java 提供了字节码编程,可以动态的修改服务配置。MegaEase 就使用了该技术实现了 EaseAgent 无侵入式观测系统

    • ServiceMesh SideCar: 在 Service Mesh 架构下,可以将服务发现、流量调度、指标日志和分布式追踪收集等非业务性功能放到 SideCar 中,从而避免对应用造成影响。

    在 MegaEase,我们结合 JavaAgent 和 SideCar 实现了 EaseMesh 服务网格, 可以在不改变一行源代码的情况下将 Spring Cloud 应用迁移到服务网格架构,整个架构已经被赋予了全功能的服务治理、弹性设计和完整的可观察性,而用户不需要修改一行代码。具体参考 与 Spring Cloud 完全兼容的服务网格可以干什么样的事。

采集端注意事项
  • 监控系统属于控制面的功能,和业务逻辑没有直接关系。因此业务系统不应该感知到监控系统的存在,更重要的,监控系统的资源占用要尽可能小,不应该影响到业务系统的正常运行。

  • 尽可能对应用开发透明,比如优先使用上述提到的无侵入的方式采集应用的监控数据。

  • 如果做不到无侵入,比如要使用 SDK 的方式,也要做到技术收口,采用切面编程的范式来实现,避免对业务逻辑造成影响。

  • 采集数据的传输应该采用标准的协议,比如 HTTP 协议。

  • 采集数据的格式应该采用标准的格式,比如 JSON、ProtoBuf 等,尤其是数据量过大时,尽量使用高效率的二进制协议。

  • 如果条件允许,应该使用物理上的专用网络来隔离业务网络,避免对业务服务的访问造成影响。

数据传输与清洗

当数据收集上来后,我们需要对数据进行清洗梳理,从而实现

  • 日志数据的结构化
  • 监控数据的标准化

这里需要两个组件的支持:

  • 数据总线:通过数据总线来对接所有的收集组件,成为数据集散地;另外也作为数据缓存和扩展的中间 Broker。Kafka 可以很好的担任这样一个角色。

  • 数据 ETL:ETL 工具用来对数据进行清洗,将客户端采集发送到数据总线的数据解析处理,最终生成结构化的数据写入到存储组件中。常用的开源组件有 LogStash,Fluentd 等,当然也可以自研,选择更合适的高性能语言并满足内部更加复杂的清洗需求。

数据清洗注意事项
  • 清洗组件要做到高性能、高可用。一般来说,指标数据是周期性产生的,其数据量并不会跟随当前请求并发量的多少变化而变化。另外一些数据(比如日志)则是和系统接受的请求并发量有着直接的关系。因此数据处理管线需要能够支撑高并发、大数据量的写入,同时也起到削峰填谷的作用。Kafka 可以非常完美的符合这些要求。

  • 清洗逻辑要尽量的简单,不应该在清洗组件做过多复杂的设计。

  • 清洗组件必须是无状态的,能够支持水平扩展。

  • 尽量提升数据处理的效率,比如使用 Golang 开发清洗组件;对 JVM 的语言做优化,如使用无锁队列、固定大小的 buffer 等提升效率。

数据存储

在存储方面,以 ElasticSearch 为代表的全文搜索引擎和以 Prometheus 为代表的时序数据库已经成为事实上的标准。一般来说可以将以日志为主的、需要全文检索的数据写入到 ES;将告警相关的数据写入到 Prometheus 中。

存储注意事项
  • 根据需要对数据按天、小时或分钟等级别建立索引,避免单个索引数据量过大。

  • 全局字段指标通常需要单独建立索引,以方便后续的关联分析。

  • 尽量提升磁盘的 IO 性能,比如使用 SSD,使用文件系统 cache 机制。避免使用 NFS 等远程文件系统。

  • 监控数据的特点一般是:数据量大,有效期短。因此可以考虑数据冷热分离。热数据存入 ES 和 Prometheus 中做检索和告警;冷数据以时间区间命名做归档存入其他的分布式文件系统做备份。

  • 按照业务级别,需要对日志必须分级,高级别日志需要满足异地容灾、冗余。

  • 根据业务敏感度,要考虑到数据的脱敏和归档安全

数据展示

以图表的形式展示相关的度量指标,方便我们查看系统的当前状态。可以使用 Grafana 实现该功能,作为一款非常流行的 dashboard 组件,已经有了众多现成的图表模版,对于大多数系统和中间件可以直接使用。当然对于应用层的监控,可能需要自行设计开发进行展示了。

总体而言,需要有以下功能的展示:

  • 总体系统健康和容量情况,包括

    • 关键服务的健康状态
    • 系统的 SLA 指标,包括吞吐量、响应时间(P99、P95、P90、P75、P50)、错误率(2XX、3XX、4XX、5XX)。
    • 各种中间件的关键指标,比如 MySQL 的连接数、Redis 的内存碎片等。
    • 服务器基础资源的健康状态,比如 CPU、内存、磁盘、网络等。
  • TopN 视图:包括最慢请求、最热请求、错误最多请求等

alt text

数据告警

当系统容量、性能达到瓶颈,或者某个组件出现问题,需要告警组件及时的通知相关人员介入处理。对于告警,需要定义告警规则,一般需要处理如下一些情况:

  • 基础探活:采用心跳机制,定期检查某个服务的连通性,让心跳检查失败时,触发告警。MegaEase 开源了 EaseProbe 可以作为众多服务的探活工具。

  • 指标 - 持续时间 - 阈值: 当某个指标再一段时间内持续超过某个阈值时,触发告警。比如 两分钟内 CPU 使用率持续超过 90%。

  • 指标 - 持续时间 - 百分比 - 阈值: 当某个指标再一段时间内持续超过某个百分比时,触发告警。比如两分钟内 P99 超过 300ms。

  • 指标 - 持续时间 - 函数 - 阈值: 此时需要一些聚合计算,某些函数的计算在一段时间内超过阈值。比如两分钟内的 JVM GC 次数(sum 函数计算)超过阈值。

  • 指标 - 持续时间 - 关键词 - 匹配次数: 日志中的某个关键词在一段时间内出现的次数超过阈值,关键词需要支持精确匹配和正则匹配。

设置告警规则时,首先需要梳理关键业务路径和非关键业务路径,并以此制定故障分级原则。对于关键业务异常要有事件告警,其次需要对如下关键指标设置告警:

  • 各业务接口的失败率指标
  • P99/P90/P50 指标
  • 主机/服务实例的 CPU、内存、JVM 等基础资源指标
  • 主机/服务实例的饱和度指标(磁盘容量、网络IO、磁盘IO)
  • 各中间件关键指标

上述提到的组件都提供了告警工具,通常可以满足需求。比如:

  • Prometheus Alert Manager
  • Elastic Alerting
  • Grafana Alerting

当然也可以自研,梳理出关键指标后形成告警规则模版,每当有新服务引入时自动创建告警规则,然后定时监测指标信息,及时告警


至此,如果全部采用开源组件实现一个全栈监控系统,技术栈如下:

  • 数据采集端
    • 基础层和中间件指标采集 - Telegraf
    • 日志采集 - Filebeat 和 Fluentd
    • Java Agent - EaseAgent
    • OpenTelemetry - OpenTelemetry
  • 数据处理管线
    • 数据总线 - Apache Kafka
    • 数据 ETL - Logstash,Fluentd
  • 数据存储
    • 日志数据存储 - ElasticSearch
    • 指标数据存储 - Prometheus,InfluxDB
  • 数据图表
    • 数据展示:Grafana
    • 异常告警:Prometheus Alert Manager,Elastic Alerting,Grafana Alerting

最终形成如下架构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自MegaEase 官网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/909153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云服务运行安全创新标杆:阿里云飞天洛神云网络子系统“齐天”再次斩获奖项

引言 为认真落实工信部《工业和信息化部办公厅关于印发信息通信网络运行安全管理年实施方案的通知》,2025年5月30日中国信息通信研究院于浙江杭州举办了“云服务运行安全高质量发展交流会”,推动正向引导,巩固云服务安全专项治理成果。会上&a…

刀客doc:WPP走下神坛

一、至暗时刻? 6月11日,快消巨头玛氏公司宣布其价值17 亿美元,在全球70个市场的广告业务交给阳狮集团,这其中包括M&Ms、士力架、宝路等知名品牌。 此前,玛氏公司一直是WPP的大客户。早在今年3月,WPP就…

进行性核上性麻痹饮食攻略:营养安全双护航

进行性核上性麻痹是一种罕见的神经系统退行性疾病,主要影响患者的运动、平衡和吞咽功能。除了医学干预,科学的饮食管理也能在一定程度上减轻症状,提高生活质量。 由于患者常出现吞咽困难,食物质地的选择尤为重要。应避免干硬、大块…

阿里云可观测 2025 年 5 月产品动态

本月可观测热文回顾 文章一览: StoreView SQL,让数据分析不受地域限制 不懂 PromQL?AI 智能体帮你玩转大规模指标数据分析 DeepWiki LoongCollector:AI 重塑开源代码理解 从 o11y 2.0 说起,大数据 Pipeline 的「…

React 基础状态管理方案

1. useState useState 是 React 提供的最基本的 Hook,用于在函数组件中添加状态管理。它返回一个状态变量和一个更新状态的函数。 1.1. 使用场景 适合管理简单的状态。 适合管理组件内部的局部状态。 1.2. 示例代码 import React, { useState } from react;function Cou…

VScode中如何创建项目分支

在 VS Code 中为前端项目创建自己的分支是一个常见的开发实践,以下是详细步骤: 前提条件 已安装 Git已安装 VS Code已有前端项目或克隆了远程仓库 创建分支步骤 1. 打开项目 在 VS Code 中打开你的前端项目文件夹。 2. 初始化 Git 仓库&#xff08…

Flutter 导航与路由管理:Navigator 的深入解析与实践

在移动应用开发中,页面导航是用户体验的核心组成部分。Flutter 提供了强大而灵活的导航系统,主要通过 Navigator 组件来实现。本文将全面介绍 Flutter 中 Navigator 的使用方法,涵盖基础导航操作、进阶技巧以及最佳实践。 一、Flutter 导航系…

预测性去匿名化攻击(PDAA):重塑数据安全攻防边界

一、数据合规时代的“脱敏”悖论:价值释放与风险并存 在数据驱动的商业模式与日趋严格的个人信息保护法规(如《个人信息保护法》《数据安全法》)双重推动下,企业普遍将“数据脱敏”作为实现数据合规与价值释放的核心手段。对手机…

[python] 使用python设计滤波器

使用python设计滤波器 文章目录 使用python设计滤波器完整滤波器设计代码(未经完整验证,博主还在不断完善中)关键原理与代码对应说明1. 滤波器类型选择2. 阶数估算原理3. 性能分析技术4. 设计参数调整指南 习惯了python后,matlab逐…

mac电脑.sh文件,用来清除git当前分支

#!/bin/bashecho "正在检查Git仓库..." if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; thenecho "错误:当前目录不是Git仓库!"exit 1 fiecho "警告:这将丢弃所有未提交的更改和本地提交&am…

Bash (Bourne Again SHell)

Unix/Linux 系统中最常用的命令行解释器之一,它是原始 Bourne shell (sh) 的增强版本。以下是 Bash 的详细解释: 1. Bash 基础 1.1 什么是 Bash 一个命令行解释器,用于执行用户输入的命令支持脚本编程,可以编写复杂的自动化任务…

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…

AIStor 的模型上下文协议 (MCP) 服务器: 工作原理

在本系列的前几篇博文中,我们讨论了MinIO AIStor 模型上下文协议 (MCP) 服务器的用户级和管理员级功能。在第一篇博文中,我们学习了如何查看存储桶的内容、分析对象并标记它们以便将来处理。在第二篇博文中,我们还学习了如何使用管理员命令以…

Excel 怎么让透视表以正常Excel表格形式显示

目录 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总

汇编语言深度指南:从基础到字符串操作

基础知识 CPU简介 CPU是计算机的核心,负责: 执行机器指令:解码并执行二进制指令 mov eax, 5 ; 将值5移动到EAX寄存器暂存少量数据:通过内部寄存器快速存取访问存储器:读写内存数据 mov [0x1000], eax ; 将EAX值…

树莓派5-ubuntu 24.04 安装 ros环境

在开始安装ros环境前,需要确保已经准备好了以下操作 1.树莓派5开发板,已经烧录了 ubuntu 24.04,并做好了一些基础配置,如:远程访问配置,语言配置,网络配置等 2.新手建议在上面安装一个宝塔面板…

【狂飙AGI】第2课:大模型方向市场分析

目录 (一)产业规模(二)政策引导(三)人才需求(四)工作年限(五)年薪分析(六)薪资情况分析(七)地域及匹配薪资&am…

word用endnote插入国标参考文献

1.在endnote中先设置output style为我的GB格式 参考 Endnote使用——参考文献的插入及引用_endnote怎么引用参考文献-CSDN博客 已经修改好的GB导出格式:Chinese Std GBT7714 (numeric)-spx.ens Peixuan Shu/Chinese_Std_GBT7714 - 码云 - 开源中国 把这个style…

Peiiieee的Linux笔记(1)

基本指令 1. ls指令 语法:ls [选项][目录或文件] 功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其它信息。 -a:列出目录下的所有文件,包括以.开头的隐含文件。 -l&am…

Docker快速构建并启动Springboot程序,快速发布和上线/

Docker部署SpringBoot 1.工作木目录:/mnts/jar_work/vx_kefu/ruoyi_ruoyiwechatinfo 里面的目录是lib文件夹,logs文件夹,Dockerfile文件,SpringBoot的jar包,start.sh的命令,stop.sh的命令,tpid文件进程。 …