聊一聊可观测性

不知为何,可观测性这个词突然就火起来,各个大厂都甚至纷纷成立可观测团队了。那么可观测性究竟是个啥呢?它凭什么能火起来呢?它与传统监控有什么区别呢,是否又是新瓶装旧酒? 说实话,虽然我很久之前就听说过可观测性这个词,不过一直持怀疑态度,认为不过是炒概念。直到最近,读了《Observability Engineering》这本书,让我打开新视界,可观测性并非空穴来风,其确实有它的价值,而且相当大。 什么是可观测性 可观测性(Observability)这个单词最开始是出现于数学领域,表示度量一个系统内部状态由其外部输出的信息中推断出来的程度。Wikipedia上的定义有点抽象,举个汽车的例子: 一辆汽车可以说是一个系统,当其外部输出信息只有油箱油量、当前车速时,我们能推断出车辆预计还能行驶多少公里 而当其外部输出信息还包括发动机温度、轮胎磨损程度时,我们还能推断出发动机和轮胎的工作情况是否需要维护,如果需要维护那么能行驶的距离显然会比之前预估的行驶举例少,显然此时这辆汽车的可观测性程度比之更高了 而对于一个软件系统,它所能暴露的外部信息常见的有指标、日志、链路追踪事件,显然我们可以通一些工具来分析它的外部信息从而推断系统的内部状态。因此这里,软件系统暴露的信息越详细,分析工具越强劲,内部状态就能推断地越准确与详细,那么该软件系统的可观测性就越好。 不过,此时你可能有疑问:这些指标日志啥的不都是些的现成东西吗?那是不是可以说,本质上,传统意义的监控就是可观测性呢?这里的答案是否定的,且听我下文解释。 与传统监控的区别 传统意义上的监控(Monitoring)是一种行为,这种行为分析系统的内部状态。而可观测性正如上文中描述的一样,是一种系统的性质,其他性质有健壮性、可测试性等 在传统监控的场景下,我们收集、存储并分析指标数据。我们制作监控大盘并设置各种告警,当发生异常时,告警触发,收到告警后,我们根据告警的内容以及相关的监控图表,来推断出异常发生的原因,并由此做出相应的处理(或增加资源、或修复Bug)。 但是这里有一个很大前提,就是告警策略必须预先设置,而如何设置又完全取决于经验与直觉。换句话说,通过监控我们只能检测一些已知的潜在风险,例如机器的负载、CPU使用率、磁盘使用率等。而对于一个未知或复杂的系统,当它发生异常时,我们往往只能束手无策,或者通过一些线索去猜测可能的原因并验证,如果猜错了那又得重复上述过程,非常的浪费时间。 而在可观测性的场景下,系统中植入了各种各样的代码和工具,并提供了非常丰富的可观测的数据(metric, logs, traces等各种数据),通过这些数据并结合合适的工具,我们能够很快地排查出问题的根因所在。举个例子,同样是一个未知的系统,当发现某个接口很慢时,我们可以通过链路追踪工具找到瓶颈点,通过瓶颈点再分析当时的系统资源使用率,饱和度,负载情况以及应用日志等,从而很快地定位出根因(资源问题?代码问题?第三方服务问题?等等) 流行的原因 近10年IT相关行业发生了天翻地覆的变化。IT技术也是日新月异,尤其是微服务架构、分布式以及云原生的高速发展,以及各种敏捷开发思想深入人心。 如今的软件系统已经与10年前的大不相同了,复杂度、灵活度、变化度等都大幅提升。而由此带来的问题就是,系统稳定性保障变得越来越困难,尤其是问题根因的定位 例如,对于一些复杂问题,有时候花费数个月都无法定位,最后的选择往往都是推倒重来 因此单靠传统的监控已经无法满足当下软件系统的观测需求,传统监控只能解决那些"known unknown/known"类的问题,而无法应对"unknown unknown"类的问题,而这类问题在如今的架构下要多得多。 Known unknown/known:指的是你熟悉的已知或未知的软件系统,这种系统可预测,因此我们可以预先设置各种告警 Unknown unknown:指的是你不熟悉的未知系统,这种系统完全未知,只能通过可观测性工具来探测 三大支柱是可观测性吗 一说到可观测性,可能最先联想的就是“三大支柱(the three pillars)”,即logs, metrics以及traces(如下图所示)。很多人(包括我)经常以为它们就是所谓的可观测性,毕竟很多PAAS平台和厂商就是这么宣传的,但这并不完全正确。 是的,没错,三大支柱确实是可观测性体系里不可或缺的条件。但这并不代表我暴露了这些数据,我的软件系统就具备了可观测性,同样也不能代表我收集分析了这些数据,我就实现了一个可观测性工具系统。 首先,可观测性需要的数据并非只有这三者,它还可以是用户的反馈信息、系统profiling信息等各种统计、事件信息;其次暴露的数据的维度、基数以及数据间的关联度等等都会影响系统的可观测性;而一个可观测性工具的搭建除了收集这些统计、时间信息,还包括数据传输与处理,数据存储以及交互的易用性等,此外涉及到的数据隔离,容量规划,低成本且高性能等问题也是十分棘手的。 不过,话虽如此,“三大支柱”虽不能等同于可观测性,但它们是你迈向可观测性的第一步:) 总结 综上所述,如果你的应用非常简单,比如一个单体应用,那么传统监控也足够满足需求了。但是一旦切换为微服务架构,甚至完全云原生化的开发方式时,此时软件系统的复杂度就成指数级增加了,而此时可观测性就显得异常重要。 相信你都经过,一个软件系统随着业务的发展会变得越来越复杂,到最后每个人都只能往上面堆功能,而对老代码甚至不敢改动一行,最终软件系统就会变成人们口中的“屎山”,而后面的人的唯一选择只能是推到重来。 而如果可观测性一开始就在架构考虑中,那么无论我们的的系统变化多大,多复杂,我们都能对其了如指掌并快速定位问题根因,此外还能提前发现到系统架构的不合理之处并及时调整。 参考 Observability Engineering https://www.splunk.com/en_us/data-insider/what-is-observability.html https://en.wikipedia.org/wiki/Observability https://www.dynatrace.com/news/blog/what-is-observability-2/

七月 11, 2022 · 1 分钟 · erenming