Signatur
Beschreibung
PerformanceServerTiming.duration enthält den Wert des dur-Parameters einer Metrik aus dem HTTP-Antwort-Header Server-Timing. Der Server schreibt dort zum Beispiel Server-Timing: db;dur=53.2;desc="Datenbank". Im Browser landet der Wert 53.2 dann in der Eigenschaft duration des passenden PerformanceServerTiming-Objekts.
So kommen serverseitige Messwerte wie Datenbankabfragen, Cache-Treffer oder Renderzeit direkt im Frontend an. Dort kann man sie mit den clientseitigen Werten aus PerformanceResourceTiming bzw. PerformanceNavigationTiming zusammenführen und an ein Monitoring-System (RUM) senden. Die Objekte erreicht man über die Eigenschaft serverTiming eines Navigations- oder Ressourcen-Eintrags.
Die Einheit legt allein der Server fest. Üblich sind Millisekunden, aber der Browser prüft das nicht. Fehlt dur oder lässt sich der Wert nicht als Zahl lesen, ist duration gleich 0. Deshalb lässt sich „keine Dauer angegeben“ nicht von „Dauer 0“ unterscheiden.
Beispiele
Server-Timing der aktuellen Seitennavigation auslesen
// Server sendet z. B.: Server-Timing: db;dur=53.2, app;dur=47.1;desc="Rendern", cache;desc="HIT"
const [nav] = performance.getEntriesByType('navigation');
for (const metric of nav?.serverTiming ?? []) {
console.log(`${metric.name}: ${metric.duration} ms (${metric.description})`);
}
Ressourcen laufend mit PerformanceObserver überwachen
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
const total = entry.serverTiming.reduce((sum, m) => sum + m.duration, 0);
if (total > 0) {
console.log(`${entry.name}: Serverzeit ${total.toFixed(1)} ms`);
}
}
});
observer.observe({ type: 'resource', buffered: true });
Serverzeit mit der Zeit bis zum ersten Byte vergleichen und melden
const [nav] = performance.getEntriesByType('navigation');
const ttfb = nav.responseStart - nav.requestStart;
const serverMetrics = Object.fromEntries(
nav.serverTiming.map(({ name, duration }) => [name, duration])
);
const payload = { ttfb: Math.round(ttfb), ...serverMetrics };
navigator.sendBeacon('/rum', JSON.stringify(payload));
console.log(payload);
// Wichtig · Fallstricke
- Cross-Origin: Bei Ressourcen von fremden Ursprüngen ist
serverTimingein leeres Array, es sei denn, der Server sendetTiming-Allow-Originmit Ihrem Ursprung oder*. - Nur sichere Kontexte:
serverTiminggibt es nur über HTTPS (bzw.localhost). - Wert
0ist mehrdeutig: Fehltduroder ist der Wert ungültig, liefertdurationebenfalls0. Wer das unterscheiden muss, sollte zusätzlichdescriptionauswerten oder serverseitig immerdursenden. - Einheit nicht garantiert: Millisekunden sind nur üblich, nicht vorgeschrieben. Legen Sie die Einheit mit dem Backend-Team fest.
- Datenschutz: Server-Timing-Werte sind für jeden Client sichtbar. Geben Sie daher keine internen Details (Hostnamen, Abfragen) und keine Zeiten preis, die Rückschlüsse auf Nutzerdaten zulassen (Timing-Angriffe).
- Schreibgeschützt: Zuweisungen werden stillschweigend ignoriert, im Strict Mode lösen sie einen
TypeErroraus. - Trailer: Server-Timing als HTTP-Trailer wird von Browsern kaum unterstützt. Senden Sie den Header am besten vor dem Antwortkörper.