什么是“可观察性”?
当然,“可观察性”这个术语并不是我们发明的。我们最开始从用户那里听到这个概念,这些用户主要来自网站可靠性工程 (SRE) 社区。有些信息来源认为,这个术语起源于硅谷巨头(如 Twitter)建立的 SRE 组织。尽管开创性的 Google SRE Book 没有提到这个术语,但它列出了当今许多与“可观察性”相关的原则。
“可观察性”不是供应商能够在系统之外单独交付的功能,而是您在构建系统时植根于其中的一个属性,就像易用性、高可用性和稳定性一样。设计和构建“可观察”系统的目标在于,确保当它在生产中运行时,负责操作它的人员能够检测到不良行为(例如,服务停机、错误、响应缓慢),并拥有可操作的信息以有效地确定根本原因(例如,详细的事件日志、细粒度的资源使用信息,以及应用程序跟踪)。这个目标看似平淡无奇,但组织在实现这一目标时会遇到诸多挑战,常见挑战包括:没有收集足够的信息;收集了太多信息,但没有提取出有指导意义的内容;这些信息分别存储在诸多不同的位置。
第一个方面是检测不良行为,这通常从设置服务级别指标 (SLI) 和服务级别目标 (SLO) 开始。 这些是衡量成功的内部标准,重视可观察性的组织可通过这些标准来评判生产系统。如果有合同义务来实现这些目标,SLI/SLO 也可以转化为服务级别协议 (SLA)。SLI 最常见的例子是系统正常运行时间,您可以为此设置 99.9999% 的 SLO。系统正常运行时间也是外部客户最常见的服务级别协议。然而,您的 SLI/SLO 内部可能更加精细,对生产系统行为的这些最重要因素的监测和警报是任何可观察性计划的基础。这方面的可观测性也被称为“监测”。
第二个方面 - 为操作员提供精确的信息,以便快速有效地调试生产问题 - 这是一个我们发现有大量发展和创新的领域。关于“可观察性的三大支柱” - 指标、日志和应用程序跟踪 - 网上有很多讨论。人们还认识到,简单地使用拼凑的工具收集所有这些粒度数据不一定是可行的,而且往往不具有成本效益。
可观察性的系统的三个要素
1)日志:程序运行产生的事件,可以详细解释其运行状态;
2)指标:一组聚合数值,主要用于监控基础设施(机器、容器、网络等),但也有应用会用于监控业务层面,比如开源搜索系统Elasticsearch就有关于查询或写入量、耗时、拒绝率等应用层面的指标;
3)应用性能监控(APM):深入到代码层面的追踪(或监控),包括程序内部执行过程、服务之间链路调用等情况,能轻易的找到程序“慢”的原因。APM最常见被用于对web服务器中一次请求处理过程的追踪,包括内部执行逻辑、外部服务的调用及它们相应的耗时。
应用性能监控(APM)
对于大部分应用程序来说性能都是很重要的一个因素,尤其对于比如网站、手机app等直接由用户访问的应用来说更是如此,因为性能较差的应用将会直接影响其用户体验。因此,能对应用进行性能监控变得非常重要,这将帮助我们找到性能瓶颈并优化。
应用性能监控(Application Performance Monitoring,APM),是对应用程序性能和可用性的监视和管理。 APM努力检测和诊断复杂的应用程序性能问题,以维持预期的服务等级。
APM 在维基百科上的定义是应用性能管理(Application Performance Management),而市面上大多数APM产品定义则是应用性能监控(Application Performance Monitoring)。《What Is Application Performance Monitoring and Why It Is Not Application Performance Management》 此文认为应用性能监控是应用性能管理一部分,前者能帮你找到问题,而后者能帮你分析并解决问题。但实际上大部分APM产品都包含了分析问题的部分,并且业界也没有对两个定义作出明确的区分,所以基本上我们可以将两者视为是相同的。
Gartner Research 将APM按功能分为五个维度(2016年将这5个维度归纳至3个),业界的APM产品的主要功能也都基本包含在内。
1)最终用户体验监控(End user experience monitoring)。通过监控用户的行为以期优化用户体验。比如:监控用户和web界面/客户端的交互,并记录交互事件的时间。
2)运行时应用程序架构(Runtime application architecture)。理解服务间的依赖关系、架构中应用程序交互的网络拓扑。
3)业务事务(Business transaction)。产生有意义的SLA报告,并从业务角度提供有关应用程序性能的趋势信息。
4)深入组件监控(Deep dive component monitoring)。通常需要安装agent并且主要针对中间层,包括web服务器、应用和消息服务器等。健壮的监控应该能显示代码执行的清晰路径,因为这一维度和上述第二个维度紧密相关,APM产品通常会将这两个维度合并作为一个功能。
5)分析或报告(Analytics/reporting)。将从应用程序中收集的一系列指标数据,标准化的展现成应用性能数据的通用视图。
开源的APM系统
目前市面上开源的APM系统主要有CAT、Zipkin、Pinpoint、SkyWalking,大都是参考Google的Dapper实现的。
功能和技术方案对比:
1)Zipkin是Twitter开源的调用链路分析工具,目前基于Spingcloud sleuth得到了广泛的应用,特点是轻量,部署简单。
2)一个韩国团队开源的产品,运用了字节码增强技术,只需要在启动时添加启动参数即可,对代码无侵入,目前支持Java和PHP语言,底层采用HBase来存储数据,探针收集的数据粒度非常细,但性能损耗大,因其出现的时间较长,完成度也很高,应用的公司较多
3)Skywalking是本土开源的基于字节码注入的调用链路分析以及应用监控分析工具,特点是支持多种插件,UI功能较强,接入端无代码侵入。
4)CAT是由国内美团点评开源的,基于Java语言开发,目前提供Java、C/C++、Node.js、Python、Go等语言的客户端,监控数据会全量统计,国内很多公司在用,例如美团点评、携程、拼多多等,CAT跟下边要介绍的Zipkin都需要在应用程序中埋点,对代码侵入性强。