可观测性并不是某一种工具所能提供的某种单一能力,它最终的目标是帮助我们随时理解软件系统的状态,无论这种状态我们之前有没有遇到过。
1、用户访问监测 RUM
当下,我们的产品和服务越来越多地以手机 App、小程序、网页等方式呈现给用户,用户使用各种客户端的时间越来越长。努力赚取用户注意力的应用越来越多,产品与服务的更新也越来越频繁。
在这样的大环境下,详细了解用户从哪里来,看了哪些页面,停留多长时间,访问速度是否够快,在哪里会遇到报错等等这些问题,不仅有利于挖掘每一个用户行为背后的真实需求,稳定并提升现存流量的转化率,还能反哺产品与服务,促进它们的双重优化,真正实现用户增长和业绩提升。
采集用户访问数据(英文缩写 RUM)也变得越来越重要,我们需要快速查看和分析各类应用的用户浏览行为及应用相关的性能指标,衡量网站及应用的的最终用户体验效果。
需要通过 RUM 来分析、解决可能会影响用户体验的前端性能问题,确定加载时间缓慢的根本原因(无论是代码、网络还是基础架构的问题);排除和解决前端错误,通过将问题的根本原因精确到代码行来解决 JavaScript 错误;甚至是分析产品使用情况,在用户会话期间自动收集和关联每个资源、错误和用户操作,按浏览器、城市或者其他自定义维度来分析你的移动和 Web 应用程序的使用情况,了解可视化的用户体验。
2、eBPF
eBPF 是一种数据包过滤技术,它是从 BPF (Berkeley Packet Filter)技术扩展而来的。
知道操作系统分为用户空间和内核空间,我们编写的应用程序通常是在用户空间中运行的。但是用户空间应用程序能做的事情很有限,需要通过系统调用接口来请求内核帮它做一些事情。例如,每当用户空间中的应用程序需要连接到硬件时,它都是通过调用内核空间中的 API 来实现的。
eBPF 的作用,就是允许你编写在操作系统内核中运行的自定义代码。你不再需要编写新的内核模块,只要根据需求动态加载和卸载 eBPF 程序就可以了。允许在操作系统中运行沙盒程序之后,应用程序开发人员可以通过 eBPF 程序向操作系统添加额外的功能。然后,操作系统会保证安全性和执行效率,就像借助即时 (JIT,Just in Time) 编译器和验证引擎一样进行本地编译。
3、Profiling
rofiling 是一种分析程序复杂性的动态方法,例如,它可以分析 CPU 利用率、函数调用的频率和持续时间。这种方法可以帮助我们进一步地分析应用程序的性能,准确定位程序中资源消耗最多的地方。
通过 Profiling,我们可以分析一段时间内的系统资源调用情况,包括不同类型下代码方法级别的 CPU、内存或 IO 的使用情况,从而定位、调试和修复与性能相关的问题,将 APM 中的每个分布式跟踪与执行请求的方法和线程的性能联系起来,来确定缓慢请求的根本原因。这样,我们能够找到导致高延迟的方法,并通过优化解决服务瓶颈,改善用户体验。
Profiling 也有不少不错的开源工具,比如 Pyroscope,它是用 Go 语言实现的。Pyroscope 提供了丰富的分析的功能,客户端提供 Go、Java、Python、Ruby、PHP、.NET 等多种语言的支持。
4、OpenTelemetry
OpenTelemetry,这是一套可观测性的工具和框架,它可以帮助你实现不被第三方锁定的可观测性。
自 OpenTelemetry 推出以来,也有越来越多的厂商开始关注它并作出一些贡献,例如, opentelemetry-collector-contrib 。这里的 OpenTelemetry Collector 组件库。当然,厂商的关注重点还集中在如何将观测数据更加便利地导入到自身的服务中,但这也侧面说明了 OpenTelemetry 的普遍接受度。