Skip to content

Commit 1de86ed

Browse files
authored
fix: use performance.now() for server timing headers (#338)
Replace Date.now() with performance.now() for better timing info. Also limit precision to ms for a smaller server-timing header.
1 parent 7d7be2e commit 1de86ed

File tree

4 files changed

+22
-14
lines changed

4 files changed

+22
-14
lines changed

packages/verified-fetch/README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -811,6 +811,11 @@ Detailed timing is found in the [Server-Timing](https://developer.mozilla.org/en
811811
HTTP header that is returned with every response when a resource is requested
812812
with the `withServerTiming` init option set to `true`.
813813

814+
The `dur` field is in milliseconds, so `dur=100` took 100ms. It is possible
815+
to measure in greater precision, but given these are network operations it's
816+
better to limit the precision and have a smaller header size, since
817+
downloading the headers impacts the time to first byte.
818+
814819
To prevent the header value growing too large, PeerIDs/CIDs are truncated to
815820
their first 10 characters and common strings are abbreviated.
816821

@@ -833,7 +838,7 @@ follow.
833838
A full header might look like:
834839

835840
```
836-
i;dur=0.000,p;dur=0.000;desc="h,bagqbeaawn",p;dur=0.000;desc="h,bagqbeaawn",p;dur=1.000;desc="h,bagqbeaa7n",p;dur=1.000;desc="h,bagqbeaa7n",f;dur=1.000;desc="h,4",f;dur=1.000;desc="h,4",f;dur=144.000;desc="l,0",f;dur=144.000;desc="l,0",c;dur=206.000;desc="t,bagqbeaa7n,h",b;dur=1.000;desc="t,bagqbeaa7n,bafybeigoc"
841+
i;dur=0,p;dur=0;desc="h,bagqbeaawn",p;dur=0;desc="h,bagqbeaawn",p;dur=1;desc="h,bagqbeaa7n",p;dur=1;desc="h,bagqbeaa7n",f;dur=1;desc="h,4",f;dur=1;desc="h,4",f;dur=144;desc="l,0",f;dur=144;desc="l,0",c;dur=206;desc="t,bagqbeaa7n,h",b;dur=1;desc="t,bagqbeaa7n,bafybeigoc"
837842
```
838843

839844
Here resolving a CID to a CID+path took less than a millisecond (e.g. a bare

packages/verified-fetch/src/index.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,11 @@
779779
* HTTP header that is returned with every response when a resource is requested
780780
* with the `withServerTiming` init option set to `true`.
781781
*
782+
* The `dur` field is in milliseconds, so `dur=100` took 100ms. It is possible
783+
* to measure in greater precision, but given these are network operations it's
784+
* better to limit the precision and have a smaller header size, since
785+
* downloading the headers impacts the time to first byte.
786+
*
782787
* To prevent the header value growing too large, PeerIDs/CIDs are truncated to
783788
* their first 10 characters and common strings are abbreviated.
784789
*
@@ -801,7 +806,7 @@
801806
* A full header might look like:
802807
*
803808
* ```
804-
* i;dur=0.000,p;dur=0.000;desc="h,bagqbeaawn",p;dur=0.000;desc="h,bagqbeaawn",p;dur=1.000;desc="h,bagqbeaa7n",p;dur=1.000;desc="h,bagqbeaa7n",f;dur=1.000;desc="h,4",f;dur=1.000;desc="h,4",f;dur=144.000;desc="l,0",f;dur=144.000;desc="l,0",c;dur=206.000;desc="t,bagqbeaa7n,h",b;dur=1.000;desc="t,bagqbeaa7n,bafybeigoc"
809+
* i;dur=0,p;dur=0;desc="h,bagqbeaawn",p;dur=0;desc="h,bagqbeaawn",p;dur=1;desc="h,bagqbeaa7n",p;dur=1;desc="h,bagqbeaa7n",f;dur=1;desc="h,4",f;dur=1;desc="h,4",f;dur=144;desc="l,0",f;dur=144;desc="l,0",c;dur=206;desc="t,bagqbeaa7n,h",b;dur=1;desc="t,bagqbeaa7n,bafybeigoc"
805810
* ```
806811
*
807812
* Here resolving a CID to a CID+path took less than a millisecond (e.g. a bare

packages/verified-fetch/src/utils/server-timing.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
export class ServerTiming {
22
private headers: string[]
3-
private precision: number
43

54
constructor () {
65
this.headers = []
7-
this.precision = 3
86
}
97

108
getHeader (): string {
@@ -18,13 +16,13 @@ export class ServerTiming {
1816
return await promise // Execute the function
1917
} finally {
2018
const endTime = performance.now()
21-
const duration = (endTime - startTime).toFixed(this.precision) // Duration in milliseconds
19+
const duration = endTime - startTime
2220

2321
this.add(name, description, duration)
2422
}
2523
}
2624

27-
add (name: string, description: string, duration: number | string): void {
28-
this.headers.push(`${name};dur=${Number(duration).toFixed(this.precision)}${description === '' ? '' : `;desc="${description}"`}`)
25+
add (name: string, description: string, ms: number): void {
26+
this.headers.push(`${name};dur=${Math.round(ms)}${description === '' ? '' : `;desc="${description}"`}`)
2927
}
3028
}

packages/verified-fetch/src/verified-fetch.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ export class VerifiedFetch {
234234

235235
if (evt.type === 'helia:routing:find-providers:start') {
236236
routingTimers[evt.detail.routing] = {
237-
start: Date.now(),
237+
start: performance.now(),
238238
found: 0
239239
}
240240
} else if (evt.type === 'helia:routing:find-providers:provider') {
@@ -244,18 +244,18 @@ export class VerifiedFetch {
244244

245245
routingTimers[evt.detail.routing].found++
246246

247-
serverTiming.add(abbreviate('found-provider'), `${abbreviate(evt.detail.routing)},${truncate(evt.detail.provider.id)}`, Date.now() - routingTimers[evt.detail.routing].start)
247+
serverTiming.add(abbreviate('found-provider'), `${abbreviate(evt.detail.routing)},${truncate(evt.detail.provider.id)}`, performance.now() - routingTimers[evt.detail.routing].start)
248248
} else if (evt.type === 'helia:routing:find-providers:end') {
249249
const routing = routingTimers[evt.detail.routing]
250250

251251
if (routing == null) {
252252
return
253253
}
254254

255-
serverTiming.add(abbreviate('find-providers'), `${abbreviate(evt.detail.routing)},${routing.found}`, Date.now() - routing.start)
255+
serverTiming.add(abbreviate('find-providers'), `${abbreviate(evt.detail.routing)},${routing.found}`, performance.now() - routing.start)
256256
} else if (evt.type === 'helia:block-broker:connect') {
257257
connectTimers[`connect-${evt.detail.broker}-${evt.detail.provider}`] = {
258-
start: Date.now(),
258+
start: performance.now(),
259259
transport: ''
260260
}
261261
} else if (evt.type === 'helia:block-broker:connected') {
@@ -265,17 +265,17 @@ export class VerifiedFetch {
265265
return
266266
}
267267

268-
serverTiming.add(abbreviate('connect'), `${abbreviate(evt.detail.broker)},${truncate(evt.detail.provider)},${abbreviateAddress(evt.detail.address)}`, Date.now() - start.start)
268+
serverTiming.add(abbreviate('connect'), `${abbreviate(evt.detail.broker)},${truncate(evt.detail.provider)},${abbreviateAddress(evt.detail.address)}`, performance.now() - start.start)
269269
} else if (evt.type === 'helia:block-broker:request-block') {
270-
blockTimers[`block-${evt.detail.broker}-${evt.detail.cid}-${evt.detail.provider}`] = Date.now()
270+
blockTimers[`block-${evt.detail.broker}-${evt.detail.cid}-${evt.detail.provider}`] = performance.now()
271271
} else if (evt.type === 'helia:block-broker:receive-block') {
272272
const start = blockTimers[`block-${evt.detail.broker}-${evt.detail.cid}-${evt.detail.provider}`]
273273

274274
if (start == null) {
275275
return
276276
}
277277

278-
serverTiming.add(abbreviate('block'), `${abbreviate(evt.detail.broker)},${truncate(evt.detail.provider)},${truncate(evt.detail.cid)}`, Date.now() - start)
278+
serverTiming.add(abbreviate('block'), `${abbreviate(evt.detail.broker)},${truncate(evt.detail.provider)},${truncate(evt.detail.cid)}`, performance.now() - start)
279279
}
280280
}
281281
}

0 commit comments

Comments
 (0)