可观测性入门
什么是可观测性?
可观测性允许您通过询问有关系统的问题来从外部理解系统,而无需了解其内部工作原理。此外,它允许您轻松地排查和处理新颖的问题,即“未知的未知”。它还有助于回答“为什么会发生这种情况?”的问题。
要询问有关您系统的这些问题,必须对应用程序进行适当的仪器化。也就是说,应用程序代码必须发出信号,例如跟踪、指标和日志。当开发人员无需添加更多仪器化即可排查问题时,应用程序就被认为得到了适当的仪器化,因为他们拥有所需的所有信息。
OpenTelemetry 是对应用程序代码进行仪器化以帮助使系统可观测的机制。
可靠性和指标
遥测 (Telemetry) 指的是从系统及其行为中发出的数据。数据可以采用跟踪、指标和日志的形式。
可靠性 (Reliability) 回答了这个问题:“服务是否按用户预期运行?”一个系统可以 100% 的时间正常运行,但如果用户点击“添加到购物车”按钮将一双黑色鞋子添加到购物车时,系统并非总是添加黑色鞋子,那么该系统就可能不可靠。
指标 (Metrics) 是在一段时间内对您的基础设施或应用程序的数值数据的聚合。示例包括:系统错误率、CPU 利用率以及给定服务的请求率。有关指标及其与 OpenTelemetry 的关系,请参阅指标。
服务水平指标 (SLI),或 Service Level Indicator,代表对服务行为的度量。一个好的 SLI 从用户的角度衡量您的服务。一个 SLI 的示例可以是网页加载的速度。
服务水平目标 (SLO),或 Service Level Objective,代表向组织/其他团队传达可靠性的方式。这是通过将一个或多个 SLI 与业务价值关联来实现的。
理解分布式追踪
分布式追踪允许您观察请求在复杂的分布式系统中传播的过程。分布式追踪提高了应用程序或系统的健康可见性,并允许您调试难以在本地重现的行为。对于通常具有非确定性问题或过于复杂而无法在本地重现的分布式系统来说,它是必不可少的。
要理解分布式追踪,您需要了解其每个组件的作用:日志、跨度和跟踪。
日志
日志 (Log) 是由服务或其他组件发出的带时间戳的消息。与跟踪不同,它们不一定与任何特定的用户请求或事务相关联。您几乎可以在软件的任何地方找到日志。过去,开发人员和运维人员一直严重依赖日志来帮助他们理解系统行为。
示例日志
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) 中,或者与跟踪和跨度相关联时,它们会变得更有用。
有关日志及其与 OpenTelemetry 的关系,请参阅日志。
Span
跨度 (Span) 代表一项工作或操作。跨度跟踪请求执行的特定操作,描绘了该操作执行期间发生的情况。
一个跨度包含名称、时间相关数据、结构化日志消息和其他元数据(即属性),以提供有关其跟踪的操作的信息。
Span 属性
跨度属性是附加到跨度的元数据。
下表包含跨度属性的示例
| 键 | 值 |
|---|---|
http.request.method | "GET" |
network.protocol.version | "1.1" |
url.path | "/webshop/articles/4" |
url.query | "?s=1" |
server.address | "example.com" |
server.port | 8080 |
url.scheme | "https" |
http.route | "/webshop/articles/:article_id" |
http.response.status_code | 200 |
client.address | "192.0.2.4" |
client.socket.address | "192.0.2.5"(客户端通过代理) |
user_agent.original | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0" |
有关跨度及其与 OpenTelemetry 的关系,请参阅跨度。
分布式追踪
分布式跟踪,更常称为跟踪 (trace),记录了请求(由应用程序或最终用户发起)在多服务体系结构(如微服务和无服务器应用程序)中传播的路径。
一个跟踪由一个或多个跨度组成。第一个跨度代表根跨度。每个根跨度代表一个从开始到结束的请求。父项下的跨度提供了关于请求期间发生情况(或构成请求的步骤)的更深入的上下文。
没有跟踪,在分布式系统中找到性能问题的根本原因可能很困难。跟踪通过分解请求在分布式系统中流动时发生的情况,使得调试和理解分布式系统不那么令人生畏。
许多可观测性后端将跟踪可视化为瀑布图,如下所示
瀑布图显示了根跨度与其子跨度之间的父子关系。当一个跨度包含另一个跨度时,这也代表了嵌套关系。
有关跟踪及其与 OpenTelemetry 的关系,请参阅跟踪。