在一个休息日的周六,你和朋友在公司附近逛街,突然,老板来了一通电话:
老板:小王,我们 APP 购物详情页面,怎么突然访问不了,一直在那里加载,出了什么 bug,赶紧看看?
小王:好的,老板,你等等,我马上回来看看是咋回事。
丢下朋友,一路小跑,火花带闪电,奔回办公室,开机找 bug。
修好 bug 后,就应该思考一下,老板是咋发现这种情况?为什么他能先于我发现呢?有什么好的手段处理这种情况,我能最先发现网站访问异常?然后抓紧处理。
这时,你可能想到了对网站进行监控,化被动为主动,主动去获取 APP 异常信息。不错,这是一个很好的方法。
从上面的小故事可以得到一些启发,比如 APP 发生不能访问的异常情况时,相关人员能够快速感知到异常情况的发生,先于用户得到异常情况的信息,能让相关人员及时进行应急处理,减少损失。而不是等到多数用户来报告异常情况才去处理,这时损失就变大了。
监控系统不仅可以监控上面提到的应用程序页面访问异常,还可以监控其他页面访问流量,API 调用情况,响应时间,请求频率,错误率等等,这些都关乎业务整体运行情况。
对应用程序本身也可以进行监控,比如 APM(应用程序性能监控)监控,这样遇到应用程序故障时,可以快速定位问题、处理问题。
还有当运行应用程序服务器的 CPU、内存持续走高,磁盘存储空间所剩不多等等各种异常情况,都需要监控来及时发现,并报给运维人员进行处理。
上面不管是业务访问异常,还是服务器资源运行异常,还是 API 调用异常,程序出 bug 等各种异常情况,都需要及时发现并处理,目的是减少业务损失。
可以通过监控系统来及时发现异常情况,并通过系统记录与异常相关联的信息,还原异常出现的现场环境,从而协助运维或研发人员快速定位问题,并及时处理异常情况。
为什么需要监控,除了上面说的作用外,下面对监控的作用做一些总结。(我理解的最大作用是:化被动为主动)
监控系统一般流程如下图:
数据采集:
通过采集工具收集相关监控指标的数据,比如采集操作系统指标, CPU 使用率、内存使用率、TCP 连接数等等。常用的采集数据的方式有代理和埋点 2 种方式。
数据处理:
又可以叫数据计算处理,对采集到的原始数据进行各种纬度的计算处理,得到我们想要的一些监控指标数据。比如对于一些业务指标的计算,今天新增用户的数、7 天新增用户数、7 天某页面的 UV 等等数据指标。
数据存储:
这里存储有 3 层含义,第一个是对采集的原始数据进行存储,第二个是对计算后的数据进行存储。第三个是有时我们会对原始数据进行暂存处理,比如暂存在 kafka 中。
查询分析、数据可视化:
查询分析对监控的指标进行查看然后分析。数据可视化,用图形方式展示监控的指标。
告警处理:
把系统发生的错误、异常信息及时通知给研发、运维等相关人员,让他们及时进行处理。告警通知方式多种多样,有短信、IM、邮件、Slack等等方式。
根据业务系统架构设计,把监控系统类别进行分层,一般可分为 4 层,如下简图:
上面是一个比较大的监控分类,大的监控类别还可以在细分为一些小类和这些类别的一些监控指标,
业务监控:
这一层主要是对业务运营的指标和业务流程进行监控,随时监控业务异常和 bug 状况。
应用监控:
这一层主要是对应用程序运行情况进行监控,
API 监控:请求量、响应时间、耗时总长、超时比率,响应错误数、比率,比如 404,500 等统计
链路监控:API 请求之间的链路信息,比如链路的响应时间,耗时等
应用程序监控:对应用程序的持续监控,continue profiling。比如应用程序本身使用的内存,CPU 数,哪部分程序使用比较高
中间件监控:
一些使用的软件,比如 数据库、Nginx、Redis、Kafka、K8S 等等软件,这些软件本身会给出一个接口,这个接口用来统计软件自身的一些信息,可以收集这些信息,然后进行统计。还可以用产生的日志进行统计。
比如说 Redis 的命令 redis info
就会显示 Redis 的很多信息,可以摘出需要的信息进行记录统计。
这里每一个软件都可以进行独立的记录和统计。比如数据库,
基础设施监控:
这里的基础设置包括一些硬件,比如交换机,物理磁盘,网卡状态。还包括操作系统,网络,虚拟机的监控
日志类就是指系统产生的日志信息,代码里记录的一些程序运行信息,还有一些业务级别上记录的日志信息,在带上时间。
比如 Nginx 里记录的访问日志,应用记录下用户登录日志,用户搜索记录日志,下单日志数据,这些都是与用户做某件事情相关联的日志信息。
有助于我们进行一些指标统计,异常信息查找和分析,告警通知。
调用链一般是指程序 API 之间相互调用的一些信息,端到端的访问路径相关信息,也叫链路追踪。这些都是 APM 应用程序性能监控。
我前面有写一篇关于 google 的 Dapper 链路追踪文章,在这里 https://www.cnblogs.com/jiujuan/p/16097314.html 。
度量类指的是记录一串以时间为纬度的数据,然后通过聚合统计,来计算一些监控指标。用来描述一些指标数据和指标变化趋势,可以用图表来表示。
在可观测性里这个叫 metrics 。
上面 3 个分类其实跟可观测性的 3 个指标有点类似,下面就讲一讲可观测性的内容。
维基上:
控制理论中的可观察性(observability)是指系统可以由其外部输出推断其其内部状态的程度。系统的可观察性和可控制性是数学上对偶的概念。它与可控制性(Controllability)一起,是由匈牙利数学家 Rudolf E. Kálmán 提出。
IBM:
一般来说,可观察性是指您仅根据所了解的外部输出对复杂系统内部状态或条件的理解程度。 系统的可观察性越高,您就能越迅速、越准确地从发现的性能问题找到根本原因,而不必进行额外的测试或编码。
- From:https://www.ibm.com/cn-zh/topics/observability IBM的可观测性
CNCF:
可观察性是系统的一种属性,描述了系统可以从其外部输出中被理解的程度。
比如通过 CPU 使用时间、内存使用、磁盘空间、延迟、系统运行的错误信息等来衡量,计算机系统或多或少是可以被观察到的状况。聚合分析这些数据,您可以查看这些可观察的数据来了解系统的运行状况。
IBM 的定义和维基的差不多。
可观测性是对软件的一种度量能力。软件是一个复杂系统,怎么知道它的运行状况是否健康呢?怎么从外部窥见软件的运行状况和异常情况呢?怎么分析出现的异常呢?通过软件内部产生的数据信息(日志信息、链路信息、profilling 等等各种信息)并输出到外部,外部把这些信息通过聚合、计算,用一定的形式组织起来,然后用列表、图表形式展现出来,这样我们就可以肉眼去查看软件系统各种纬度的情况、系统当前所处的状态。
可观测性就像一个显微镜,它仔细观察软件系统的各种指标和状态,系统是否出现异常情况。
可观测性具体怎么做?有哪些指标。
可观测性一般有 3 个方向,分别是:事件日志、链路追踪 和 聚合度量,这 3 个方向各有自己的重点,又不是完全独立的,它们有重合的地方。
可以看看 Peter Bourgon 的一篇总结文章《Metrics, Tracing, and Logging》,里面有一张很经典图片描述了 3 者之间的关系,受到了业界普遍的关注:
(图片来源:《Metrics, Tracing, and Logging》)
指标(Metrics)、追踪(Tracing)、日志(Logging),这是可观测性的3个基本指标。
日志 logging
上面表示 Logging 是 events,它是特定时间发生离散事件的记录。比如 Nginx 的访问日志记录,每条日志记录一般有访问时间戳、响应码、页面 URL、客户端 IP 等信息。还有程序也会记录一些用户访问信息,比如下单记录。
链路追踪 Tracing
端到端请求范围内的调用链路相关信息。比如记录每个请求阶段的开始时间、时长等信息。关于 google 的 Dapper 链路追踪文章,我前面写的 https://www.cnblogs.com/jiujuan/p/16097314.html 。
链路追踪主要是为了排除故障,比如分析调用链中哪一部分用时比较长、哪个方法出错了等等。
度量 Metrics
度量是对系统中某一类信息的聚合计算。比如服务器中 CPU 利用率、内存剩余数,系统容量等等
监控是收集一组预定义的指标和日志,来帮助研发和运维观察和了解系统运行状态的工具,并提供解决方案。
可观测性是事先未定义的属性和模式来探索系统出现的问题,有效帮助研发或运维调试系统的工具。
上面是来自 google cloud 。
监控告诉你出了点问题,而可观测性是告诉你哪里出了点问题以及为什么会发生。
监控是一种收集和分析从各个系统中提取的预定义数据,来解决系统中出现的问题。可观测性是一种聚合所有 IT 系统产生的数据的来观察、推演系统内部的状态,并分析系统出现的问题以及为什么出现这个问题。
可观测性的定义范围更广,监控是可观测性的一个子集。
监控和可观测性之间的关系图:
(来自:万字破解云原生可观测性)
(来自:https://landscape.cncf.io/guide#observability-and-analysis--monitoring)
上面最常用的应该是 prometheus + grafana 组合。
除了上面列出的外,还有一款监控系统 - 夜莺监控(Nightingale),它是一款 ALL IN ONE 设计的监控系统。
Nightingale 夜莺监控,一款先进的开源云原生监控分析系统,采用 All-In-One 的设计,集数据采集、可视化、监控告警、数据分析于一体,与云原生生态紧密集成,提供开箱即用的企业级监控分析和告警能力。
github 地址:https://github.com/ccfos/nightingale 。
(来自:https://landscape.cncf.io/guide#observability-and-analysis--logging)
上面最常用的应该是 ELK(elasticsearch、logstash、kinbana)
(来自:https://landscape.cncf.io/guide#observability-and-analysis--tracing)
上面常用的链路追踪, jaeger,pinpoint,skywalking,zipkin,OpenTelemetry 等。