服务器时间

服务器时间是性能 API 的一部分,它允许服务器将有关请求-响应周期的指标传达给用户代理。您可以收集此信息并在服务器端指标上采取行动,就像使用性能 API 处理的所有其他指标一样。

发送服务器指标

Server-Timing HTTP 标头用于显示任何后端服务器计时指标。例如,您可能希望发送数据库读/写操作时间、CPU 时间和文件系统访问。

您可以有值或无值地发送指标。指标可以选择包含描述。建议将名称、描述和数据保持尽可能短,以最大程度地减少 HTTP 负载。

Server-Timing 标头的示例

http
// Single metric without value
Server-Timing: missedCache

// Single metric with value
Server-Timing: cpu;dur=2.4

// Single metric with description and value
Server-Timing: cache;desc="Cache Read";dur=23.2

// Two metrics with values
Server-Timing: db;dur=53, app;dur=47.2

// Server-Timing as trailer
Trailer: Server-Timing
--- response body ---
Server-Timing: total;dur=123.4

要计算真实的服务器端指标,请参阅您的服务器端 CMS、框架或编程语言的文档,了解如何在后端应用程序中测量性能。如果您的服务器使用 Node.js,性能测量 API 将与浏览器中的性能 API 看起来非常相似。这是因为 Node.js 性能模块也是 W3C Web 性能 API 的一个子集,以及针对 Node.js 特定性能测量的其他 API。有关更多信息,请参阅 Node.js 性能文档

请注意,服务器、客户端以及任何中间代理之间没有时钟同步。这意味着,如果您的服务器发送时间戳或 startTime,该值可能无法有意义地映射到客户端时间轴的 startTime

计算出所需的指标后,服务器需要在其响应中发送 Server-Timing 标头。有关如何在 Node.js 中发送标头的示例,请参阅 Server-Timing 参考页面。

检索服务器指标

服务器计时指标通常会出现在浏览器的开发者工具中,但它们也会存储为 PerformanceServerTiming 性能条目,您可以像其他 性能数据 一样访问它们。但是,它们本身没有 "server-timing" 条目。PerformanceServerTiming 对象可以从 "navigation""resource" 性能条目中观察到。您可以从 PerformanceResourceTiming.serverTiming 属性访问服务器指标,该属性是 PerformanceServerTiming 对象数组。

给定一个 Server-Timing,如下所示

http
Server-Timing: cache;desc="Cache Read";dur=23.2,db;dur=53,app;dur=47.2

PerformanceObserver 可以使用以下代码在客户端记录条目

js
const observer = new PerformanceObserver((list) => {
  list.getEntries().forEach((entry) => {
    entry.serverTiming.forEach((serverEntry) => {
      console.log(
        `${serverEntry.name} (${serverEntry.description}) duration: ${serverEntry.duration}`,
      );
      // Logs "cache (Cache Read) duration: 23.2"
      // Logs "db () duration: 53"
      // Logs "app () duration: 47.2"
    });
  });
});

["navigation", "resource"].forEach((type) =>
  observer.observe({ type, buffered: true }),
);

隐私和安全注意事项

Server-Timing 标头可能会公开潜在的敏感应用程序和基础设施信息。因此,您需要控制服务器端何时向谁返回指标。例如,您可以在服务器端仅向经过身份验证的用户显示指标,而不对公众显示任何指标。

PerformanceServerTiming 接口仅限于同一来源,但您可以使用 Timing-Allow-Origin 标头来指定允许访问服务器指标的域。此外,请注意,此接口仅在某些浏览器的安全上下文(HTTPS)中可用。