File tree 7 files changed +116
-1
lines changed
7 files changed +116
-1
lines changed Original file line number Diff line number Diff line change
1
+ ---
2
+ ' sku ' : minor
3
+ ---
4
+
5
+ ` vite ` : Emit start time metric for ` sku start `
Original file line number Diff line number Diff line change 1
1
import { viteService } from '@/services/vite/index.js' ;
2
2
import type { SkuContext } from '@/context/createSkuContext.js' ;
3
+ import { metricsMeasurers } from '@/services/telemetry/metricsMeasurers.js' ;
3
4
4
5
export const viteStartHandler = async ( skuContext : SkuContext ) => {
5
6
await viteService . start ( skuContext ) ;
7
+
8
+ metricsMeasurers . skuStart . mark ( ) ;
6
9
} ;
Original file line number Diff line number Diff line change
1
+ import debug from 'debug' ;
2
+
3
+ const log = debug ( 'sku:metrics' ) ;
4
+
5
+ const skuStartMarkName = 'skuStartComplete' ;
6
+ const skuStart = {
7
+ mark : ( ) => {
8
+ performance . mark ( skuStartMarkName ) ;
9
+ } ,
10
+ measure : ( ) => {
11
+ const result = performance . measure ( 'skuStart' , { } , skuStartMarkName ) ;
12
+
13
+ log ( `Sku dev server start took ${ Math . round ( result . duration ) } ms` ) ;
14
+
15
+ return result ;
16
+ } ,
17
+ } ;
18
+
19
+ const initialPageLoadMarkName = 'initialPageLoadStart' ;
20
+ const initialPageLoad = {
21
+ mark : ( ) => {
22
+ performance . mark ( initialPageLoadMarkName ) ;
23
+ } ,
24
+ isInitialPageLoad : true ,
25
+ measure ( ) {
26
+ this . isInitialPageLoad = false ;
27
+
28
+ const result = performance . measure (
29
+ 'initialPageLoad' ,
30
+ initialPageLoadMarkName ,
31
+ ) ;
32
+
33
+ log ( `Initial page load took ${ Math . round ( result . duration ) } ms` ) ;
34
+
35
+ return result ;
36
+ } ,
37
+ } ;
38
+
39
+ export const metricsMeasurers = {
40
+ skuStart,
41
+ initialPageLoad,
42
+ } ;
Original file line number Diff line number Diff line change @@ -4,6 +4,7 @@ import type { SkuContext } from '@/context/createSkuContext.js';
4
4
5
5
import { createViteConfig } from '../createConfig.js' ;
6
6
import skuViteHMRTelemetryPlugin from '@/services/vite/plugins/skuViteHMRTelemetry.js' ;
7
+ import { skuViteStartTelemetryPlugin } from '../../plugins/skuViteStartTelemetry.js' ;
7
8
8
9
export const createViteServer = async ( skuContext : SkuContext ) => {
9
10
const base = process . env . BASE || '/' ;
@@ -13,6 +14,10 @@ export const createViteServer = async (skuContext: SkuContext) => {
13
14
skuContext,
14
15
plugins : [
15
16
skuViteMiddlewarePlugin ( skuContext ) ,
17
+ skuViteStartTelemetryPlugin ( {
18
+ target : 'node' ,
19
+ type : 'static' ,
20
+ } ) ,
16
21
skuViteHMRTelemetryPlugin ( {
17
22
target : 'node' ,
18
23
type : 'static' ,
Original file line number Diff line number Diff line change @@ -41,8 +41,8 @@ export const viteService = {
41
41
const server = await createViteServerSsr ( {
42
42
skuContext,
43
43
} ) ;
44
+ server . listen ( skuContext . port . server ) ;
44
45
45
- await server . listen ( skuContext . port . server ) ;
46
46
if ( skuContext . sites . length > 1 ) {
47
47
skuContext . sites . forEach ( ( site ) => {
48
48
console . log (
Original file line number Diff line number Diff line change @@ -2,6 +2,7 @@ import type { SkuContext } from '@/context/createSkuContext.js';
2
2
import type { Plugin } from 'vite' ;
3
3
import { createRequire } from 'node:module' ;
4
4
import type { ViteRenderFunction } from '@/types/types.js' ;
5
+ import { metricsMeasurers } from '@/services/telemetry/metricsMeasurers.js' ;
5
6
6
7
const require = createRequire ( import . meta. url ) ;
7
8
@@ -10,6 +11,10 @@ export const skuViteMiddlewarePlugin = (skuContext: SkuContext): Plugin => ({
10
11
configureServer ( server ) {
11
12
return ( ) => {
12
13
server . middlewares . use ( async ( req , res , next ) => {
14
+ if ( metricsMeasurers . initialPageLoad . isInitialPageLoad ) {
15
+ metricsMeasurers . initialPageLoad . mark ( ) ;
16
+ }
17
+
13
18
const host = req . headers . host ;
14
19
const hostname = host ?. split ( ':' ) [ 0 ] ;
15
20
const site =
Original file line number Diff line number Diff line change
1
+ import type { Plugin } from 'vite' ;
2
+ import js from 'dedent' ;
3
+ import provider from '@/services/telemetry/index.js' ;
4
+ import { metricsMeasurers } from '@/services/telemetry/metricsMeasurers.js' ;
5
+
6
+ const initialPageLoadEventName = 'sku:initialPageLoad' as const ;
7
+
8
+ export const skuViteStartTelemetryPlugin = ( {
9
+ target,
10
+ type,
11
+ } : {
12
+ target : string ;
13
+ type : string ;
14
+ } ) : Plugin => ( {
15
+ name : 'vite-plugin-sku-server-middleware' ,
16
+ transformIndexHtml : {
17
+ order : 'pre' ,
18
+ handler : ( ) => [
19
+ {
20
+ tag : 'script' ,
21
+ attrs : {
22
+ type : 'module' ,
23
+ } ,
24
+ children : skuPageLoadTelemetryClient ,
25
+ injectTo : 'head' ,
26
+ } ,
27
+ ] ,
28
+ } ,
29
+ configureServer ( server ) {
30
+ server . ws . on ( initialPageLoadEventName , ( ) => {
31
+ if ( metricsMeasurers . initialPageLoad . isInitialPageLoad ) {
32
+ const { duration : skuStartDuration } =
33
+ metricsMeasurers . skuStart . measure ( ) ;
34
+
35
+ const { duration : initialLoadDuration } =
36
+ metricsMeasurers . initialPageLoad . measure ( ) ;
37
+
38
+ const initialStartTime = skuStartDuration + initialLoadDuration ;
39
+
40
+ provider . timing ( 'start.webpack.initial' , initialStartTime , {
41
+ target,
42
+ type,
43
+ } ) ;
44
+ }
45
+ } ) ;
46
+ } ,
47
+ } ) ;
48
+
49
+ const skuPageLoadTelemetryClient = js /* js */ `
50
+ addEventListener("load", () => {
51
+ if (import.meta.hot) {
52
+ import.meta.hot.send('${ initialPageLoadEventName } ');
53
+ }
54
+ })
55
+ ` ;
You can’t perform that action at this time.
0 commit comments