你好,我是翁一磊。
在上一讲,我们说建立可观测性不仅仅是运维同学的责任,开发同学也应该积极地参与进来,因为代码是开发写出来的,他们是最了解系统和应用的。这节课,我们就更近距离看看可观测性驱动的软件开发,看看它如何更加有效地帮助我们分析生产环境问题,保障生产环境的服务可靠性。
如今,在软件投入生产之前,需要先进行一系列的测试,这已经是非常标准的流程了。而你可能也早就听过它的英文首字母缩写TDD,测试驱动的软件开发(Test Driven Development)。
TDD指的是一个软件开发过程,它依赖于在软件完全开发之前将软件需求转换为测试用例,然后通过对所有测试用例的重复测试,来跟踪所有软件开发。
简单地说,测试驱动的软件开发包括下面这些流程:
更多详细的介绍,可以访问这个链接。
测试驱动的软件开发,可以在许多潜在问题投入生产之前,通过在测试环境中的一系列验证,发现和捕获程序上的问题。
然而,如果你管理或维护过生产环境,你应该很清楚,生产环境是实际用户访问和使用产品的环境,它很多时候和测试环境是不一致的。在生产环境中很容易遇到测试环境中没有碰到过的问题,程序的代码也总是会存在一些测试没有覆盖到的地方。所以我们需要在生产环境中快速定位和解决问题的能力。
生产环境不是一成不变的,它充满了各种可能性,因为这是真正的最终用户访问和使用软件的环境。工程师们应该有能力和自信来应对任何异常,原因就像我们上节课说的,可观测性不仅仅是基础设施工程师或者运维工程师的专属领域,更重要的是,软件工程师也必须采用可观测性并将其运用到自己的开发实践中,打破自己对于变更生产环境的恐惧感。
换个角度来看,当我们升级或更新了生产环境之后,如果有问题,也希望能够及时发现,及时排错,而不是等过了很久之后才发现问题。因为这时候开发往往已经进入到后续的新功能迭代阶段,再来处理之前迭代周期的功能开发,常常是事倍功半的。
所以说,我们需要针对生产环境建立可观测性。当代码发布在生产环境之后,开发同学也应该去看看软件程序在生产环境中实际的运行情况,检查功能是不是都符合预期,最终用户在使用时有没有遇到异常或者错误,有没有出现测试环境中没有碰到过的问题。如果开发对生产环境足够关注,将会在真正影响用户体验之前发现和解决很多问题。
针对生产环境建立可观测性,具体要怎么做呢?
可观测性驱动的软件开发(Observability Driven Development,缩写为 ODD)鼓励开发团队在整个开发过程中考虑应用程序的可靠性和软件质量,利用工具或是开发人员的插桩来观测系统的状态和行为。可观测性并不是要直接调试代码逻辑,而是在每次新功能或者版本发布到生产环境后,检验生产环境的状态,帮助发现并定位潜在问题,找出系统中需要调试的代码所处的位置。
这里有一些最佳实践和准则可以遵守,包括建立文化、有意义的代码插桩,还有选择合适的可观测工具。
开发不应该只是关注于产品功能的实现,也需要为系统整体的可靠性负责。在这个认知的前提下,我们也需要建立可观测性驱动的开发文化,鼓励开发更好地参与到可观测性的建立上来。
但是,只有文化愿景是不够的,我们在代码设计阶段,就必须考虑和确定系统在生产环境运行时需要达到的目标。比如说,定义好服务水平目标 SLO,为了提供预期的服务质量,你需要什么程度的可观测性?你的用户关心什么?他们会注意到什么?试图找出可能出错的地方,以及提前发现错误的方法。
在明确了目标之后,我们应该将代码插桩视为重要的责任,并视为将其交付生产的要求。代码插桩主要包括下面几种类型。
良好的插桩可以帮助你的组织更广泛地传播可观测性文化,减轻团队的负担,因为如果插桩提供了足够的上下文,运维或技术支持团队就能够解决更多问题,不需要频繁地寻呼开发了。
就像我们在第 5 讲中介绍的,构建可观测性,并不是一定要完全依靠自己来搭建和研发,很多时候,选择合适的工具可以帮助你更有效率地达到目标。
有许多工具都自称是“可观测性工具”,但事实并非如此。这样一来,选择正确的工具就很重要了。一个好的可观测性工具需要具有下面几种能力。
好了,这节课就上到这里。
在这一讲,我们重点讲述了测试和可观测性驱动的软件开发。使用测试进行驱动,可以依靠各种测试来检验代码的质量,但是生产环境和测试环境完全不同,你也无法完全预料最终用户使用你的产品和服务的方式,不能确定他们会遇到怎么样的问题。
而可观测性驱动的软件开发,能够帮助你更加清晰地了解在生产环境中,你的用户如何使用你的产品,遇到了哪些问题,包括那些你之前可能无法预料或者发现的问题。
可能你以前无法理解生产环境的实际运行情况,导向了一种不敢触碰生产环境的心态。而通过可观测性,开发工程师可以观测新功能发布到生产环境时的各种状态,将生产环境作为一个可观测、可交互的环境,这样就可以获取到最终用户的真实体验,用它来改进开发软件了。
在这节课的最后,留给你一道思考题。
你在工作中,是如何维护生产环境中系统和软件的可靠性的?有没有遇到在测试环境中无法复现的问题,又是通过什么方法来解决的?
欢迎你在留言区和我交流讨论,我们下节课见!
© 2019 - 2023 Liangliang Lee. Powered by gin and hexo-theme-book.