使用追踪诊断错误
追踪让您能够快速诊断应用程序中的错误,确保您可以对请求失败执行根本原因分析 (RCA)。追踪可视化有助于您确定错误发生的 Span 以及这些错误背后的上下文,从而缩短平均修复时间。
认识 Handy Site Corp 公司
Handy Site Corp 是一家虚构的网站公司,运营一个电子商务应用程序,其中包括用户认证、产品目录、订单管理、支付处理及其他服务。
Handy Site 的运维团队收到了关于其监控服务中错误服务水平目标 (SLO) 的多个告警。通过他们的 Grafana 仪表盘,他们注意到存在多个问题。仪表盘提供了错误百分比
用户超过 5% 的请求在多个端点(例如 /beholder
、/owlbear
和 /illithid
)上导致错误,这会导致性能和可用性下降。对于 Handy Site 的运维团队来说,快速排除问题至关重要。错误率升高表明 Handy Site 无法向其用户的请求提供有效响应,这不仅威胁到运维团队的 SLO 错误预算,还会影响 Handy Site 的整体盈利能力。
使用 TraceQL 查询数据
Tempo 有一种追踪优先的查询语言 TraceQL,它提供了一套独特的工具集用于选择和搜索追踪数据。TraceQL 可以根据 span 和资源属性、持续时间以及祖先与后代关系来匹配追踪。该语言还可以计算聚合统计信息,例如一组 span 的 rate
。
Handy Site 已对其服务和应用程序进行了追踪 instrumentation,因此他们可以使用 TraceQL 作为调试工具。通过使用三个 TraceQL 查询,团队识别并验证了问题的根本原因。
查找 HTTP 错误
顶层服务 mythical-requester
接收请求并向用户返回响应。当它收到请求时,会调用许多下游服务,并依赖这些服务的响应来向用户请求发送响应。使用 Grafana Explore,运维团队从一个简单的 TraceQL 查询开始,查找来自此顶层服务的所有追踪,其中发送给用户的 HTTP 响应码为 400
或以上。此范围内的状态码包括 Forbidden
(禁止访问)、Not found
(未找到)、Unauthorized
(未授权)以及其他客户端和服务器错误。
{ resource.service.name = "mythical-requester" && span.http.status_code >= 400 } | select(span.http.target)
在此查询中添加 select
语句(在 |
之后)可确保查询响应不仅包含匹配的 span 集合,还包含每个 span 的 http.target
属性(例如,SaaS 服务的端点)。
精确定位错误
查看返回的 span 集合,最令人担忧的是带有 HTTP 500
状态码的那些。这些是内部服务器错误。
团队决定使用结构化运算符,跟踪从顶层服务 mythical-requester
到任何同样具有错误状态的后代 span 的错误链。后代 span 可以是从父 span 衍生的任何 span,例如子 span 或任何深度的更深层子 span。使用此查询,团队可以精确定位可能导致问题的下游服务。下面的查询表示“查找状态为 status = error
的 span,这些 span 是来自 mythical-requester
服务且状态码为 500
的 span 的后代。”
{ resource.service.name = "mythical-requester" && span.http.status_code = 500 } >> { status = error }
展开带有错误的、属于 mythical-server
服务 span 的后代 span,团队发现插入数据库的数据存在问题。具体来说,该服务正在向数据库表中一个不允许 null
值的列传递 null
值。
验证根本原因
在确定此内部服务器错误的具体原因后,团队想知道除了上面发现的 null
INSERT
错误外,是否在任何数据库操作中存在其他错误。他们更新的查询使用否定正则表达式来查找任何数据库语句不存在或不是以 INSERT
子句开头的 span。这应该会暴露导致内部服务器错误的其他任何问题,并过滤掉他们已经诊断出的那类问题。
{ resource.service.name = "mythical-requester" && span.http.status_code = 500 } >> { status = error && span.db.statement !~ "INSERT.*" }
此查询没有产生结果,这表明运维团队遇到的问题的根本原因完全是由于失败的数据库 INSERT
语句。此时,他们可以回滚到已知的工作版本,或者部署一个修复程序,以确保服务适当地拒绝 null
数据。完成后,团队将问题标记为已解决。Handy 团队的错误率 SLI 应该会恢复到可接受的水平。