服务器时间
服务器时间是性能 API 的一部分,它允许服务器将有关请求-响应周期的指标传达给用户代理。您可以收集此信息并在服务器端指标上采取行动,就像使用性能 API 处理的所有其他指标一样。
发送服务器指标
Server-Timing
HTTP 标头用于显示任何后端服务器计时指标。例如,您可能希望发送数据库读/写操作时间、CPU 时间和文件系统访问。
您可以有值或无值地发送指标。指标可以选择包含描述。建议将名称、描述和数据保持尽可能短,以最大程度地减少 HTTP 负载。
Server-Timing
标头的示例
// 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
,如下所示
Server-Timing: cache;desc="Cache Read";dur=23.2,db;dur=53,app;dur=47.2
PerformanceObserver
可以使用以下代码在客户端记录条目
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)中可用。