可观察性驱动开发,探索未知之地

2019 年 3 月 02 日

可观察性驱动开发,探索未知之地

可观察性驱动开发与监控有什么不同?随着我们的分布式系统变得越来越复杂,随着我们对DevOps测试、自动化和效率的追求,筒仓的打破,为了了解代码中未知的未知,ODD作为一种超级监控而出现。本文包括Honeycomb创始人Charity Majors的见解。


本文要点


  • 随着微服务和容器使系统变得更加分散和复杂,未知的未知也在增加。

  • 只在发布后进行监控是不够的,你只有在完全了解系统的潜在故障时才能获得成功。

  • 可观察性驱动开发(ODD)通过工具和开发人员的结合来观察系统的状态和行为,通过这种方式你可以更多地了解系统的缺陷模式。

  • 监控通常由运维人员在发布后完成,而可观察性则是生产环境中的事件优先测试。

  • 可观察性,就像整个DevOps运动一样,是关于成为一个更好的软件管理员,为接下来的开发人员留下线索,向他们说明你为什么在产品中这样做。


毫无疑问,系统越分散就越复杂。这使得 24/7 监控和随叫随到的轮流值班对大多数公司来说都至关重要。但是,可观察性是如何影响我们越来越短的 DevOps 反馈循环的呢?本文概括介绍了从Honeycomb创始人和可观察性的强烈支持者Charity Majors那里了解到的关于可观察性驱动开发的经验。


用 DevOps 重新激发开发人员的活力


在伦敦举办的CloudNative 2018大会上,Majors 说:“起初,反馈回路是,当你造成了破坏,人们会对你大喊大叫,然后,当你修好它的时候,他们就会称赞你。但后来,互联网出现了,我们的系统变得更加复杂。”


Majors 回忆说,我们都是从拥有自己的软件开始的——因为谁还会拥有它——但是,当我们距离拥有它越来越远的时候,我们就失去了判断错误的能力。筒仓让开发人员越来越远离代码的运行,DevOps 运动是“一种回归优雅、回归良性反馈循环状态的尝试,”Majors 这样说道。


每个开发人员都需要拥有自己的代码,从编写到部署,再到调试和再次部署。Majors 认为,少了任何东西就不是完全的 DevOps:


它使软件变得更好,调试人员在软件运行期间进行调试时可以获得最相关的上下文信息。


她接下来介绍了 Charity 的 DevOps 原则:


编写代码的人可以也应该部署他们的代码并在生产环境中提供支持。


DevOps 自动化的目的不仅仅是为了提高速度,它还是为了将开发人员从非创造性的、乏味的修复工作中解放出来,重新激发并利用开发人员的内在动机和创造力:


让我们感到满足和欣慰的东西全和自主性、感觉被授权以及构建一些重要的东西并关心它是否被完成好有关。


当然,这与 Dan Pink 提出的知识型员工的三个关键内在动机相一致:自主性、精通性和目的性。


然而,开发人员一次又一次地发布在本地设置中看起来没有问题的代码,而一旦部署,各种问题就接踵而至。发现问题可能就需要几天时间,就更不用说解决问题了。Majors 警告说:


分布式系统的第一个教训是,你的系统永远不会全无问题——任何时候都存在许多灾难性状态。


然而,一旦你运用了可观察性驱动开发,使用了合适的栈、工具,特别是可视化,你就可以更快地发现和解决相同的系统缺陷,通常是几个小时甚至几分钟。


可观察性驱动开发如何帮助开发人员了解他们的系统


什么是可观察性开发?它利用工具和有实际经验的开发人员观察系统的状态和行为,让你可以更多地了解该系统,包括缺陷模式。实际上,ODD 是在查询系统,而监控只是为系统设置阈值并进行测量。


Majors 认为,测试驱动开发——编写测试,然后编写通过该测试的代码的过程——现在已经准备好发展成可观察性驱动开发。两者都属于行为驱动开发的范畴,但 ODD 对行为表现出了更好的理解。


Majors 说,你还可以通过可观察性驱动开发过程实现随时待命。可观察性是控制理论的一部分,该理论研究如何控制复杂的分布式系统。


仅通过询问系统的话,你能知道你的系统、你的代码里发生了什么。如果不提供新代码,你能够回答新问题吗?


Majors 强调,这关乎实现恰当的抽象级别,而不是生成更复杂的代码库:


当你有一个可观察的系统时,你的团队将在没有先验知识的情况下快速可靠地跟踪任何新问题。他们会理解代码和缺陷的用户体验、行为以及原因。


可观察性并不否定监控,监控仍然是 DevOps 范畴的一个重要部分。但据专业人士称,在过去的 20 年里,监控并没有跟上时代的步伐,仍然主要适用于内部需求。


它会把过去中断时的残余信息转换为那些指示板需要表达的东西——只有大约2%的软件工程师理解这一点。


Majors 引用自动化工具Sensu工程副总裁Greg Poirier的话说:“监控已死”。Poirier 认为,随着时间的推移,对系统及其组件的行为和输出进行观察和检查的行为——这是对可观察性驱动开发的良好定义——使得对复杂系统进行监控成为一种过时的模型。


Majors 说,“很重要的一点是,要构建对人们有意义的工具,让他们生活在同一个现实中。”他谈了清晰的、跨组织的仪表盘的必要性。


对于 Majors 来说,可观察性就是确保“已知的未知”大于或等于“未知的未知”。


有些问题只有你找到方法才能看出来。你必须收集细节信息,这样才能找到其中的任何一个。


Majors 将可观察性称为寻找异常值的游戏——如果你有十几个故障案例,根据收集到和查询到的数据,它们有什么共同之处?她说,你应该关心每个请求是否能够成功,以及是否能够让资源端到端地工作。


分布式系统面临着巨大的挑战,因为它们实际上更类似于一个相互连接的系统网络,其中许多系统超出了我们的控制范围。因此,无法直接观察它们。


监控是监控,而观察是生产环境中事件优先的测试


Majors 指出,“架构的每个部分都是独一无二的,所以你必须测试它。你必须在生产环境中测试它,因为在进入生产环境之前,你只能测试这么多。”她解释说,部署代码不是一个只有开/关状态的二元开关。



当然,你可以在部署到过渡环境之前和部署到生产环境之后进行测试,但这可能会耗尽通常有限的工程资源。Majors 建议接受这样的现实,无论你是否打算在生产环境中进行测试,并建议使用类似于金丝雀测试这样的技术作为保障,帮助你实现可观察性。


她将可观察性称为缺失的环节,它允许软件所有者在生产环境中进行测试,提供软件的事件优先视角,软件是如何被使用的,以及它对这种使用的反应如何。


Majors 说,良好的自动化监控包括以下最佳实践:


  • 许多可操作的活动检查和警报

  • 主动通知工程师故障和告警

  • 维护一个运行手册,保证生产系统的稳定性和可预测性

  • 对紧密耦合的系统集群同时崩溃有预期


但是,对于微服务,它变得更加复杂,有更多“未知的未知”。


有太多的组件和存储系统,你无法在头脑中对整个系统建模。系统的健康并不重要——每个请求的健康才是最重要的。


TDD 只覆盖了已知的未知,这成为了一个支持问题。这些都是可预测的,可以在可预测的时间框架内进行处理,并且可以在仪表板上进行监控。


“未知的未知”仍然是一个工程问题。通常,在修复的过程中,这些问题是没有预期结论的,需要对系统进行探索和创造力。这是开发者应该花时间去做的事情。可观察性解决了这个巨大的未知。


可观察性是寻找未知和发现事件


Majors 说,要想正确地观察事物,你应该在考虑构建什么东西的时候就把它加入进来,让它成为你开发过程中固有的一部分。


她说,这是关于寻找未知,从内到外进行系统微调。它是关于成为下一个用户的优秀软件管理员,即使那个用户六个月后想知道你为什么会做出那样的选择。


进入软件的内部,向你自己和天真的用户说明这个软件——找到那些线索,留下它们,这样,未来的你就可以追溯到它的源头。


监控主要与度量有关,而可观察性则与事件有关。Majors 建议首先致力于调试高基数事件——重要但通常是唯一的信息,如标识号、用户名和电子邮件地址——因为它们涉及大量上下文和跟踪信息。


她说,事件讲述的故事可以帮助你发现来龙去脉和异常值,从而帮助你找出问题所在。她继续说,带宽和成本限制了你随时存储“所有数据”的能力,但“因为这是我们大脑的工作方式,这是我们代码的工作方式”,所以构建聚合数据日志是至关重要的。


根据 Majors 的说法,创建仪表板并不是答案:“它是以往故障的产物。它会跳到答案,而不是从一个问题开始,”Majors 主张什么都要实时,而不是掌握趋势。她继续解释说,可观察性要求能够从采样数据一直深入到原始请求。聚合不起作用,因为你永远无法再次展开以前合并在一起的数据。但是,抽样可以让你保留足够的细节,以便以后提出更多问题。可观察性是关于问一个问题并追踪答案。然后问一个新问题。重复这个循环,直到发现“未知的未知”。


服务所有者而不仅仅是运维者


服务确实需要所有者,而不是运维者,它们需要所有者在编写一行代码之前就关心可观察性。


在一个永远在线的 DevOps 新世界中,这意味着开发人员需要具有更高的运维素养,并且能够流畅地编写自己的代码。Majors 说,要达到这种熟练程度并真正理解“异常”是什么样子,开发人员需要观察他们的代码在生产环境中的运行。Majors 表示,这将使生产事件减少 80%。


她认为,在将来的某个时候,人工智能和机器学习将使软件达到能够感知环境和自我修复的水平。


关于 Majors 的看法,有一个重要的前提,就是适当的可观察性将大幅减少呼叫告警,只有延迟问题会被标记出来。


关于作者


Jennifer Riggins 是一位科技故事讲述者和作家,在这个领域,数字变革与文化交汇,她希望能使世界变得更美好。感兴趣的读者可以关注她的推特(@jkriggins)。


查看英文原文:[Observability-Driven Development for Tackling the Great Unknown](https://www.infoq.com/articles/observability-driven-development)


2019 年 3 月 02 日 08:005133
用户头像

发布了 323 篇内容, 共 140.6 次阅读, 收获喜欢 661 次。

关注

评论

发布
暂无评论
发现更多内容

对象的实例化内存布局与访问定位

朱华

Java 对象初始化

英特尔为北京2022年冬奥会打造智慧新体验

intel001

Java之父都需要的《Effective Java中文版(第3版)》到底有多牛

Java成神之路

Java 程序员 面试 编程语言

关于GO语言,这篇文章讲的很明白

华为云开发者社区

go 编程语言 语言

《谛听说智能》迎来圆满落幕,企业降本增效新指南

Geek_e670ab

MySQL-技术专题-解决死锁问题

李浩宇/Alex

MySQL-技术专题-mysql的联合索引

李浩宇/Alex

Spring Cloud 微服务实践(8) - 部署

xiaoboey

Docker zookeeper 微服务 Spring Cloud actuator

LeetCode题解:83. 删除排序链表中的重复元素,HashMap,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

使用 Flutter 快速实现聊天应用

LeanCloud

flutter 后端 聊天

MySQL-技术专题-事务实现原理

李浩宇/Alex

解密360容器云平台的Harbor高可用方案

博文视点Broadview

容器 高可用 云原生 k8s Harbor

Java 未捕获异常处理

朱华

Java Exception

不走寻常路

滴滴技术

招聘 滴滴技术 地图与公交事业群分享月

九面成功定级阿里资深架构师,拿到180W年薪+15000股,学习一下大神的成长之路!

Java架构追梦

Java 学习 架构 面试 微服务

DB-Engines 10月数据库排名:“三大王”无人能敌,PostgreSQL紧随其后

华章IT

数据库 postgresql Clickhouse MySQ

惊艳!阿里出产的MyCat性能笔记,带你领略什么叫细节爆炸

周老师

Java 编程 程序员 架构 面试

技术分享丨华为鲲鹏架构Redis知识二三事

华为云开发者社区

redis 鲲鹏

Github资源在线加速下载

xcbeyond

GitHub 工具类网站

程序员的美丽假期(并不)

Learun

程序员 敏捷开发 软件设计

看这里!带你快速体验MindSpore V1.0(For ubuntu 18.04)

华为云开发者社区

华为 AI 技术

链表反转的两种实现方法,后一种击败了100%的用户

小Q

Java 程序员 数据结构 算法 开发

违规内容屡屡曝光下,企业如何自救

Geek_e670ab

水滴石穿之Java学习之路

孟旬

Java 学习 后端

c++笔记——类

菜鸟小sailor 🐕

c++

滴滴导航若干关键功能的技术突破与实践

滴滴技术

人工智能 滴滴技术 滴滴导航

链表反转的两种实现方法,后一种击败了100%的用户!

王磊

Java 数据结构 算法

Minds Factory 2020 HUAWEI HiCar 创新活动

Jessie

物联网 创新 智能 汽车 大赛

头条终面:写个消息中间件

yes的练级攻略

消息队列 面试技巧

中国首个“芯片大学”即将落地;生成对抗网络(GAN)的数学原理全解

京东智联云开发者

技术 网络 GAN 芯片

伯克利:serverless是下一代计算范式

华为云开发者社区

云计算 服务

可观察性驱动开发,探索未知之地-InfoQ