可观测性指引
什么是可观测性?
可观测性使我们能够从外部了解一个系统,通过提出关于该系统的问题而无需了解其内部工作方式。此外,它还可以帮助我们轻松地排查和处理新问题(即“未知的未知”),并帮助我们回答“为什么会发生这种情况?”的问题。
为了能够对系统提出这些问题,应用程序必须被正确地仪表化。也就是说,应用程序代码必须发出诸如 信号 的东西,例如 跟踪、指标 和 日志。只有在开发人员无需添加更多仪表化来解决问题时,应用程序才被正确地仪表化,因为他们拥有所需的所有信息。
OpenTelemetry 是通过该机制对应用程序代码进行仪表化,以帮助使系统可观测。
可靠性和指标
遥测是指关于系统行为的数据。这些数据可以形成 跟踪、指标 和 日志 的形式。
可靠性回答了这个问题:“服务是否按照用户的期望进行工作?”如果一个系统在百分之百的时间内都处于运行状态,但是当用户点击“加入购物车”按钮来将一条黑色长裤添加到购物车时,系统并不总是添加黑色长裤,那么这个系统就被认为是不可靠的。
指标是关于基础设施或应用程序的数值数据在一段时间内的聚合。例如:系统错误率、CPU 利用率、给定服务的请求率等。有关指标及其与 OTel 的关系的更多信息,请参阅 指标。
SLI,或服务级别指标,表示对服务行为的度量。一个好的 SLI 从用户的角度来衡量你的服务。一个例子是网页加载的速度。
SLO,或服务级别目标,是通信可靠性的手段,可以将一个或多个 SLI 附加到业务价值上。
理解分布式跟踪
要理解分布式跟踪,让我们从一些基础知识开始。
日志
日志是由服务或其他组件发出的带时间戳的消息。然而,与跟踪不同的是,日志不一定与任何特定的用户请求或事务相关联。它们几乎存在于软件的各个地方,并且过去被开发人员和操作员广泛依赖,以帮助他们理解系统行为。
示例日志:
I,[2021-02-23T13:26:23.505892 #22473] INFO -- : [6459ffe1-ea53-4044-aaa3-bf902868f730] Started GET "/" for ::1 at 2021-02-23 13:26:23 -0800
不幸的是,日志对于跟踪代码的执行并不是非常有用,因为它们通常缺乏上下文信息,比如从哪里调用它们。
当它们作为 span 的一部分或与跟踪和跨度相关联时,它们变得更加有用。
有关日志及其与 OTel 的关系的更多信息,请参阅 日志。
跨度
跨度表示一项工作或操作的单位。它跟踪请求所进行的具体操作,描绘了该操作执行期间发生的情况。
跨度包含名称、与时间相关的数据、结构化日志消息和其他元数据(即属性),以提供有关所跟踪操作的信息。
跨度属性
以下表格给出了一些跨度属性的示例:
Key | Value |
---|---|
net.transport | IP.TCP |
net.peer.ip | 10.244.0.1 |
net.peer.port | 10243 |
net.host.name | localhost |
http.method | GET |
http.target | /cart |
http.server_name | frontend |
http.route | /cart |
http.scheme | http |
http.host | localhost |
http.flavor | 1.1 |
http.status_code | 200 |
http.user_agent | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 |
有关跨度及其与 OTel 的关系的更多信息,请参阅 跨度。
分布式跟踪
分布式跟踪,更常被称为跟踪,记录了请求(由应用程序或最终用户发起)在多服务架构中传播时所经过的路径,比如微服务和无服务器应用程序。
在没有跟踪的情况下,在分布式系统中很难确定性能问题的原因。
它提高了我们应用程序或系统的健康状况的可见性,并使我们能够调试在本地难以重现的行为。跟踪对于具有非确定性问题或在本地无法复制的过于复杂的分布式系统至关重要。
跟踪通过分解请求在分布式系统中的传递过程来使调试和理解分布式系统变得不那么令人望而却步。
一个跟踪由一个或多个跨度组成。第一个跨度表示根跨度。每个根跨度表示从开始到结束的请求。父母下面的跨度提供了有关请求期间发生的更详细的上下文(或组成请求的步骤)的信息。
许多可观测性后端将跟踪可视化为瀑布图,看起来可能像这样:
瀑布图显示了根跨度和其子跨度之间的父子关系。当一个跨度封装另一个跨度时,这也表示了一种嵌套关系。
有关跟踪及其与 OTel 的关系的更多信息,请参阅 跟踪。