可观测性工程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 把可观测性应用到软件系统

卡尔曼的可观测性定义可以应用到现代软件系统中。不过,当我们将可观测性的概念应用于软件系统时,还需要增加一些额外的思考来满足软件工程领域的需求。为了让一个软件应用程序具有可观测性,你必须能做到以下几点:

• 了解应用程序的内部运行情况。

• 了解你的应用程序可能进入的所有系统状态,甚至是你以前从未见过和无法预测的新状态。

• 仅通过观测和使用外部工具来了解内部运行情况和系统状态。

• 理解内部状态,而不是提供任何新的自定义代码来定义它(因为这意味着你需要事先完全了解这些内部状态)。

要判断你是否能做到这些,一种很好的方式就是问自己以下问题:

• 能否持续回答任何关于应用内部运行机制的开放式问题,以解释所有的异常并可以做到完全无死角的覆盖(例如,发现某个问题可能与某些模糊的东西关联,但却无法进一步分解从而真正定位这个问题)?

• 能否在任何给定的时间理解软件的任何特定用户可能正在体验的东西?

• 能否快速地看到你关注的系统性能的任意一个层面,无论是全局的系统性能问题导致的系统缓慢,还是每一个用户实际请求中所产生的性能问题导致的缓慢?

• 能否比较任意组的用户请求行为,从而正确地发现所有在应用程序中遇到意外行为的用户的共同属性或状况?

• 如果你从单个用户请求中发现了可疑情况,那么是否可以在所有用户请求中搜索,以确定类似的行为模式,从而确认或排除你的怀疑?

• 能否确定哪个系统用户产生的负载最大(因此导致应用程序性能变慢),以及第2个、第3个或第100个产生负载最多的用户?

• 能否分辨那些最近体验糟糕的用户是不是最近才开始获得糟糕的体验的?

• 如果第142位最慢的用户抱怨性能速度慢,能否分析他们的请求,然后发现是什么导致了该用户的性能变糟?

• 如果用户抱怨超时故障发生,但你的图表显示第99个、99.9个,甚至99.99个百分点的请求都是快速且正常的,那么你能找到这个隐藏的超时吗?

• 是否可以立刻回答类似前面的这些问题,而不需要事先准备(提前设置特定的监视器来聚合必要的数据)?

• 即使以前从未见过或调试过某些遇到的问题,你也能回答关于应用程序的这些问题吗?

• 能否快速得到上一个问题的答案,这样你就可以持续迭代地问一个新问题,一个又一个,直至找到导致问题的正确原因,而不会中断你的思路(这通常意味着在几秒钟内得到答案,而不是花费几分钟)?

• 即使这个问题从未发生过,一旦发生了,你能知道它是怎么发生的吗?

• 在调试或者定位问题时通常能解决各种令人困惑的奇怪问题,还是只能处理那些你知道发生原因的问题?

• 能否快速地(在几分钟内)隔离系统中的任何错误,无论这些错误多么复杂,甚至是深埋或隐藏在程序的堆栈中?

对于许多软件开发团队来说,遵循上述准则是一个很高的门槛。如果你已经知道怎么去回答上面的问题,那么你无疑就理解了为什么可观测性已经成为软件工程团队的一个流行话题。

简单地说,我们对软件系统的“可观测性”的定义是:一种度量能力,能帮助你更好地理解和解释系统当前所处的任何状态,无论这种状态多么新颖或怪异。你必须能够在特定的迭代调查中,跨系统状态数据的所有维度和维度组合,比较调试这种怪异或新颖的状态,而无须事先定义或预测这些调试需求。如果你无须发布新代码(如增加一个用于调试的日志)就可以理解任何新颖或怪异的状态,那么你的系统就具备可观测性。

我们相信,以这种方式将可观测性的传统概念引入软件工程中是一种独特的方法,值得我们去深入研究其中的细微差别。对于现代软件系统,可观测性与数据类型或输入无关,也与数学方程式无关。它的本质是关于人们如何与他们复杂的系统互动并尝试理解它们。因此,可观测性需要发现人与技术之间的交互,以理解这些复杂系统如何一起工作。

如果你接受这个定义,那么看看接下来这些问题:

• 如何收集数据并将其组合起来进行分析?

• 处理这些数据的技术要求是什么?

• 要从这些数据中获益,团队的哪些能力是必要的?

我们将在本书后面进一步探讨这些问题。现在讨论将可观测性应用于软件时,一些额外的上下文内容。

软件系统中的可观测性与控制论中的原本定义有许多共同之处。然而,它不需要那么数学范,而且更实用。从某种程度上来说,相比于成熟的机械工程,软件工程本身是一门更年轻、发展更快的学科。软件系统的开发并不需要物理公式计算。在某种程度上,缺乏严谨性反而是软件行业没有更早引入可观测性所产生的一个历史伤疤。

过去,当工程师试图理解如何弥合在本地测试中编码的理论运行状况和正式环境中大规模运行代码时所产生的影响之间的差距时,我们没有去寻找一个新的术语、定义或功能来描述我们是如何做到这一点的。当前管理系统和团队的环境与方式导致我们将实践从传统概念(如监控)中演进出来,而这些传统概念其实已经不再有效。作为一个行业,我们需要超越工具和术语方面的实际差距,以克服停机和缺乏更主动的解决方案所带来的痛苦。

可观测性是解决这个差距的方法论。受各种技术和社会因素影响,复杂的生产软件系统可能变得一团糟。因此,需要社会和技术两方面的解决方案来把我们从这个困境中解救出来。可观测性本身并不是所有软件工程问题的完整解决方案。但它确实帮助你清楚地看到在软件的所有阴暗角落发生了什么,否则你通常会在黑暗中磕磕绊绊,试图通过脑补来理解事物。

想象一下,你在一个周六早上醒来,计划着为整个大家庭做早午餐。你脑子里有好几道菜,包括奶酪蛋奶酥的复杂配方、每个人已知的过敏源和食物敏感性的清单,以及紧张的时间安排——奶奶必须在中午之前赶到机场,这本身就是一个不小的挑战。现在想象一下,你找不到你的眼镜(而且你和我们一样近视)。其实在软件工程中每天都会遇到类似的问题,要让生活有序一点,可观测性是一个很好的起点。