测量总请求时间,而不是服务时间
Grafana Beyla 是一款基于 eBPF 的应用自动化 instrumentation 工具,能够跟踪您的服务器端应用代码的总请求时间。
当执行远程服务请求时,客户端感知的响应时间与服务器端测量的响应时间不同。
Web 服务请求的生命周期
下图展示了 Web 服务请求生命周期的示例。从服务请求开始到服务响应结束,客户端感知的响应时间接近 140 毫秒。
在服务器端,大多数 instrumentation agent 只能插入探针来测量服务处理器时间,这是由服务所有者编写的代码部分,而其余的服务器端执行时间则在内核端或语言运行时(例如,大多数语言会将传入的 HTTP 请求排队以供稍后分派)。
在低负载条件下,大部分执行时间花费在服务处理器中,但在高负载场景下,许多请求可能会在内部队列中花费不可忽略的时间等待分派。在上面的时间线中,只对服务器处理器进行 instrumentation 将报告测量 Web 请求执行需要 50ms 的指标,而实际上它在服务器端花费了 120ms。服务所有者将获得有关其服务行为的不准确指标。
跟踪总请求时间
eBPF 使我们能够克服手动 instrumentation 工具的局限性。Beyla 在内核的 connect/receive/write/close 函数处插入 tracepoints(对于 Go 应用,也插入 Go 运行时)。这种低级 instrumentation 提供了更准确的指标和链路追踪,更接近用户感知的响应时间。
Beyla 报告的链路追踪分为不同的 span
上图显示了 Beyla 报告的链路追踪的典型结构
- 一个总 span,测量请求在服务器端的总花费时间
- 一个子 span,测量请求在队列中等待分派的时间
- 一个子 span,从前一个子 span 结束时开始,测量实际请求处理器(应用逻辑)花费的时间